Ваши вопросы по языку MQL4

STARGAZER

Новичок форума
Когда оно ровно? С нчала кода? После того как оно ровно стало, кучу раз ордера могли закрытся. Нужно пересчитывать непосредственно перед использыванием.

Именно в этом и была ошибка вот тут:

if(DrawdownPercent>DepoProcent)//Если просадка достигла заданной
{
int CloseTotal=total;
int CloseTotal=count();//нужно так
for(int p=CloseTotal-1; p>=0; p--)
{
if(OrderSelect(p,SELECT_BY_POS))

{ //Закрываем все ордера
if(OrderType()==OP_BUY)OrderClose(OrderTicket(), OrderLots(), Bid, 3, Red);
if(OrderType()==OP_SELL)OrderClose(OrderTicket(), OrderLots(), Ask, 3, Red);
}
}
}
 

ivansss

Новичок форума
Подскажите пожалуйста, как можно реализовать следующую задумку:
Я высчитываю длину волны по зигзагу в пунктах.Хочу полученное значение записывать в первую ячейку массива, при получении нового значения производить сдвиг предыдущего значения, а в первую записать новое??:please::please::please:

Хотел через цикл в каждую ячейку записывать новое значение, только вот получается это все в обратном порядке.
 
Последнее редактирование:

eevviill2

Местный знаток
Подскажите пожалуйста, как можно реализовать следующую задумку:
Я высчитываю длину волны по зигзагу в пунктах.Хочу полученное значение записывать в первую ячейку массива, при получении нового значения производить сдвиг предыдущего значения, а в первую записать новое??:please::please::please:

Хотел через цикл в каждую ячейку записывать новое значение, только вот получается это все в обратном порядке.
Назад
PHP:
ArrayCopy(buf,buf,0,1);
Вперёд
PHP:
ArrayCopy(buf,buf,1,0);
 

vladradon

Программист
Я высчитываю длину волны по зигзагу в пунктах.Хочу полученное значение записывать в первую ячейку массива, при получении нового значения производить сдвиг предыдущего значения, а в первую записать новое??
Тут вопрос сразу: какой лимит по количеству данных в массиве - если безлимитник, то нужно будет при записи нового значения увеличивать размер массива. Если массив лимитированный, то просто при поступлении нового значения, в цикле меняем последнее значение на предпоследнее, естественно, теряя последнее на текущий момент, значение.
 

Rennela

Новичок форума
Такой цикл будет покрасивей читаться
Код:
[COLOR=#000000][COLOR=#007700] int R = 0;
  for([/COLOR][COLOR=#0000BB]int i[/COLOR][COLOR=#007700] =[/COLOR][COLOR=#0000BB] OrdersTotal[/COLOR][COLOR=#007700](); [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]>=[/COLOR][COLOR=#0000BB] 0[/COLOR][COLOR=#007700]; --[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700]) 
    { 
    if([/COLOR][COLOR=#0000BB]OrderSelect[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB] SELECT_BY_POS[/COLOR][COLOR=#007700][/COLOR][COLOR=#0000BB][/COLOR][COLOR=#007700]) && [/COLOR][/COLOR][COLOR=#000000][COLOR=#007700][COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]OrderType[/COLOR][COLOR=#007700]() < [/COLOR][COLOR=#0000BB]OP_[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000BB]BUYLIMIT[/COLOR][COLOR=#007700][/COLOR][/COLOR][/COLOR][COLOR=#007700]) [/COLOR][COLOR=#007700]
      [/COLOR][/COLOR][COLOR=#000000][COLOR=#0000BB]R+[/COLOR][COLOR=#0000BB][/COLOR][COLOR=#007700]+[/COLOR][COLOR=#0000BB][/COLOR][COLOR=#007700];
    }
 [/COLOR][/COLOR]
Покрасивей-в смысле без ошибок?
 

AlexeyVik

Программист mql4 mql5
Покрасивей-в смысле без ошибок?
И без ошибки в том числе.
OrdersTotal() возвращает количество ордеров, но нумерация их идёт от нуля до OrdersTotal()-1 соответственно при первой итерации цикла в новой редакции mql4 в твоём цикле будет ошибка.
А об операциях инкремента\декремента можно почитать здесь -http://cppstudio.com/post/282/
 

vladradon

Программист
OrdersTotal() возвращает количество ордеров, но нумерация их идёт от нуля до OrdersTotal()-1 соответственно при первой итерации цикла в новой редакции mql4 в твоём цикле будет ошибка.
Это во всех редакциях в обоих языках во всех вариациях, функция OrdersTotal() работает одинаково. Точнее, в 4-м языке и до и после слияния с 5-ым.
В любом случае для 4-ки выборка ордера происходит по счету (OrderSelect(..)), символу, магику и комментарию, если уж настолько важна точность выборки.
Не стоит забывать, что функция OrdersTotal() возвращает суммарное на текущий момент количество ордеров по текущему счету без фильтров (мной написанных выше).
 
Последнее редактирование:

ivansss

Новичок форума
Это во всех редакциях в обоих языках во всех вариациях, функция OrdersTotal() работает одинаково. Точнее, в 4-м языке и до и после слияния с 5-ым.
В любом случае для 4-ки выборка ордера происходит по счету (OrderSelect(..)), символу, магику и комментарию, если уж настолько важна точность выборки.
Не стоит забывать, что функция OrdersTotal() возвращает суммарное на текущий момент количество ордеров по текущему счету без фильтров (мной написанных выше).


Вот что у меня получилось, накалякать, естественно не работает, понимание массивов выше моего разума:facepalm:

double widgt[];
ArrayRange(widgt,20);

li_9 = GetExtremumZZPrice(1);
li_8 = GetExtremumZZPrice(2);
if(li_9 > li_8){ li_7 = NormalizeDouble(li_9-li_8,Digits);}
if(li_9 < li_8){ li_7 = NormalizeDouble(li_8-li_9,Digits);}

for(int i=0; i<=20; )
{if (widgt !=li_7)
{widgt =li_7 ;
i++;}
ArrayCopy(widgt,widgt,0,1);}
Comment(widgt[0]);


Как мне это довести до ума, подскажите:please:
 

vladradon

Программист
Вот что у меня получилось, накалякать, естественно не работает, понимание массивов выше моего разума:facepalm:

double widgt[];
ArrayRange(widgt,20);

li_9 = GetExtremumZZPrice(1);
li_8 = GetExtremumZZPrice(2);
if(li_9 > li_8){ li_7 = NormalizeDouble(li_9-li_8,Digits);}
if(li_9 < li_8){ li_7 = NormalizeDouble(li_8-li_9,Digits);}

for(int i=0; i<=20; )
{if (widgt !=li_7)
{widgt =li_7 ;
i++;}
ArrayCopy(widgt,widgt,0,1);}
Comment(widgt[0]);


Как мне это довести до ума, подскажите:please:


Я же не могу по куску кода сделать вывод и резюмировать весь код... Мне нужно, как минимум, знать к какому результату нужнно придти. Звякни мне в скайп - что-нибудь придумаем.)))
 

_SERG_

Активный участник
Вот что у меня получилось, накалякать, естественно не работает, понимание массивов выше моего разума:facepalm:

double widgt[];
ArrayRange(widgt,20);

li_9 = GetExtremumZZPrice(1);
li_8 = GetExtremumZZPrice(2);
if(li_9 > li_8){ li_7 = NormalizeDouble(li_9-li_8,Digits);}
if(li_9 < li_8){ li_7 = NormalizeDouble(li_8-li_9,Digits);}

for(int i=0; i<=20; ){
if (widgt !=li_7)
{widgt =li_7 ;
i++;}
ArrayCopy(widgt,widgt,0,1);}
Comment(widgt[0]);


Как мне это довести до ума, подскажите:please:

Даааа! Были писатели, а теперь калякеры!:laugh::laugh:
Код:
double widgt[];  [COLOR=Red]- тут размерчик не лишне былобы обозначить.[/COLOR]
ArrayRange(widgt,20); [COLOR=Red]- Тут с измерением разобраться, в хэлпе, как минимум.[/COLOR]
li_9 = GetExtremumZZPrice(1); [COLOR=Red] -- функция на твоей совести.[/COLOR]
li_8 = GetExtremumZZPrice(2);
  Как переменные, 

if(li_9 > li_8){ li_7 = NormalizeDouble(li_9-li_8,Digits);}          
if(li_9 < li_8){ li_7 = NormalizeDouble(li_8-li_9,Digits);}
for(int i=0; i<=20;[COLOR=Red] i++)[/COLOR]{ [COLOR=Red]-- Надобы как-то значения перебирать.[/COLOR]
  if (widgt[i] !=[COLOR=Red]=[/COLOR]li_7){ [COLOR=Red]-- условие аще то.
      // если элемент массива == значению переменной
[/COLOR]     widgt[i] =li_7 ; [COLOR=Red]// Этому элементу массива присвоить значение перемкнной[/COLOR]
    // i++; [COLOR=Red]// Это не обязательно если фор сразу написать. Хотя на любителя.[/COLOR]
  }
           ArrayCopy(widgt,widgt,0,1); [COLOR=Red]-- HELP!!!Почитай, там про источник, приемник ( source, destination)[/COLOR]
}
       Comment(widgt[0]);
Надобы ещё немного читакером заделатся. :laugh::laugh::laugh:
И внимательно - внимакером.

Если твоя жадность, и трудолюбие, поборет твою лень, тогда и результат появиться. А пока, поле не паханное перед тобой.:facepalm:

А для понимания массивов, берёшь лист в клеточку, слева пишешь:
например double ARR[3][12] - двухмерный массив, справа - рисуешь прямоугольник три клеточки, на 12, пишешь номера строк и столбцов от левого верхнего угла в право - столбцы, начиная с ноля, а вниз - строки, тоже с ноля.

Ну а дальше по алгоритму, в ячейки калякакешь данные, ну а потом их анализируешь и .т.д. Ток с точки зрения имеющихся у советника данных, а не того, что ты себе придумал.
Если тебе удастся что то записать, значит есть надежда, если интересует быстрый результат, закажи тому кто этим занимается профессионально.
Хотя подрядчик попросит довести до него твою стратегию, а её по ходу нет.
Почему такой вывод? С декомпилом работаешь.
Ответ на риторический вопрос:"Что делать?" находиться в тексте выше.
 
Последнее редактирование:

ivansss

Новичок форума
Если твоя жадность, и трудолюбие, поборет твою лень, тогда и результат появиться. А пока, поле не паханное перед тобой.
Я всегда рад критике и буду стараться повысить свой уровень

Хотя подрядчик попросит довести до него твою стратегию, а её по ходу нет.
Почему такой вывод? С декомпилом работаешь.

Тут я так и не понял насчет декомпила. ТС у меня отличная и проверенная временем, показывать ТС я конечно же не буду)
Естественно проблемы психологии рано или поздно дают о себе знать. Советник должен решить эту проблему.
 

_SERG_

Активный участник
Я всегда рад критике и буду стараться повысить свой уровень



Тут я так и не понял насчет декомпила. ТС у меня отличная и проверенная временем, показывать ТС я конечно же не буду)
Естественно проблемы психологии рано или поздно дают о себе знать. Советник должен решить эту проблему.

Декомпил - это декомпилированный код советника, и он не передаёт истинного слысл логики стратегии, которую афффтор закладывал в код.

Показывать не надо, тогда учи язык сам. Наслаждайся.:laugh:
К советникам обращаются те, кто понял, что психология им мешает.
Так шо добро пожаловать в писатели, greedy. :laugh::laugh::laugh:
 

Rennela

Новичок форума
Подскажите,существует ли возможность присвоить открытому ордеру MagicNumber,без переоткрытия? Советник закрывает встречные ордера с магиком, в результате получается новый ордер без магика и советник его не видит. При OrderCloseBy я так понял задать не удастся.
 

vladradon

Программист
Сообщение от ivansss
Я отправил тебе контакт в личке, хоть не раз, в том числе на этом форуме, писал. что мой ник всегда одинаковый уже больше 20 лет.))) Удивить меня или Сержа алгоритмом - все равно, что пугать ежика г.. з..))) Поэтому, если нужна помощь, то будьте гоовы к сотрудничеству. а не шифруйтесь, считая что здесь помогают дилетанты...
 

Rennela

Новичок форума
Подскажите,существует ли возможность присвоить открытому ордеру MagicNumber,без переоткрытия? Советник закрывает встречные ордера с магиком, в результате получается новый ордер без магика и советник его не видит. При OrderCloseBy я так понял задать не удастся.

Нашел ошибку, magic сохраняется.
 

vladradon

Программист
Подскажите,существует ли возможность присвоить открытому ордеру MagicNumber,без переоткрытия? Советник закрывает встречные ордера с магиком, в результате получается новый ордер без магика и советник его не видит. При OrderCloseBy я так понял задать не удастся.
Нет, магик присваивается при открытии ордера или выставлении отложенного. Если используется функция OrderCloseBy, то при разности в лотах, формируется новый разностный ордер, который имеет новый тикет и тот магик, который указываем в коде. Это, как говорится, в двух словах.))
 

vladradon

Программист
Если не секрет, как вы определяете что это код декомпилятора? Объясните,если не сложно.Учусь,интересно.
Хоть и не ко мне вопрос, но в декомпиле все переменные имеют имена, комбинированные из сочетания латинских символов и цифр без какого-либо логичного формирования имени - тупо формирование имени переменной случайным способом из символов и цифр.
 
Верх