Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 608

 
for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к Метке 1
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }}
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

Первая проблема  Lots/Prikup - Dplus это необходимо нормализовать почитайте про это внимательно, если переменные типа double то вы с удивлением заметите что 4/2 выдаёт не ожидаемое 2 а 1.9999999999 видимо вы с этой проблемой ещё не сталкивались 

Таким образом если у вас if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) будет ложным, а я с большой долей вероятности могу сказать что оно ложно, то даже если у вас cnt_OO больше 1 вы гарантированно придёт на блок после Метка 1.  Так что все работает у вас без ошибок проблема в логике обработки данных. 

Вторая проблема вы гарантированно обрабатываете исключительно последний в списке ордер зачем тогда было городить цикл for?

Если вы это делаете исключительно для тестера то выбрав последний из списка ордер вы действительно получите нужный ордер и то не всегда. На реальном рынке да ещё если запущено несколько советников вы гарантированно получите совсем не то что ожидаете а цикл у вас гарантированно после первого прохода прерывается по команде break

 
Vitaly Gorbunov:

Первая проблема  Lots/Prikup - Dplus это необходимо нормализовать почитайте про это внимательно, если переменные типа double то вы с удивлением заметите что 4/2 выдаёт не ожидаемое 2 а 1.9999999999 видимо вы с этой проблемой ещё не сталкивались 

Таким образом если у вас if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) будет ложным, а я с большой долей вероятности могу сказать что оно ложно, то даже если у вас cnt_OO больше 1 вы гарантированно придёт на блок после Метка 1.  Так что все работает у вас без ошибок проблема в логике обработки данных. 

Вторая проблема вы гарантированно обрабатываете исключительно последний в списке ордер зачем тогда было городить цикл for?

Если вы это делаете исключительно для тестера то выбрав последний из списка ордер вы действительно получите нужный ордер и то не всегда. На реальном рынке да ещё если запущено несколько советников вы гарантированно получите совсем не то что ожидаете а цикл у вас гарантированно после первого прохода прерывается по команде 

Vitaly Gorbunov:

Первая проблема  Lots/Prikup - Dplus это необходимо нормализовать почитайте про это внимательно, если переменные типа double то вы с удивлением заметите что 4/2 выдаёт не ожидаемое 2 а 1.9999999999 видимо вы с этой проблемой ещё не сталкивались 

Таким образом если у вас if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) будет ложным, а я с большой долей вероятности могу сказать что оно ложно, то даже если у вас cnt_OO больше 1 вы гарантированно придёт на блок после Метка 1.  Так что все работает у вас без ошибок проблема в логике обработки данных. 

Вторая проблема вы гарантированно обрабатываете исключительно последний в списке ордер зачем тогда было городить цикл for?

Если вы это делаете исключительно для тестера то выбрав последний из списка ордер вы действительно получите нужный ордер и то не всегда. На реальном рынке да ещё если запущено несколько советников вы гарантированно получите совсем не то что ожидаете а цикл у вас гарантированно после первого прохода прерывается по команде break

насчет нормализации - спасибо, я не заметил что ее нет. Глаз просто замылился.

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

 Насчет функций Onlinit и OnDeinit надо разобраться как следует. Необходимость их очевидна.

 

В данной реализации цикл не получается. Я прогнал ваш код в различных вариантах всегда один проход. 

И теперь понятно где вы ошиблись!

for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к команде continue
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }

        continue; //Вернёмся в цикл за следующим ордером если предыдущий не прошёл проверку
       }
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

Максимально всё прокомментировал! Пробуйте!

 
Vitaly Gorbunov:

В данной реализации цикл не получается. Я прогнал ваш код в различных вариантах всегда один проход. 

И теперь понятно где вы ошиблись!

Максимально всё прокомментировал! Пробуйте!

Спасибо, я понял. Здесь происходит обход ошибки связанной с отсутствием нормализации. При более тщательной проработке алгоритма восстановления Условие  &&(OrderLots() <= Lots/Prikup - Dplus) оказалось не нужно.

Спасибо всем за добрые советы 



вот результат тестирования. На реале примерно тоже, даже лучше. Заранее предупреждаю - это не мартингейл. Это еще хуже чем вам кажется :=). Просадка 1.3% прибыль 507$

 
Хороший результат! Будут ещё проблемы обращайтесь, только вот очень сложно из вас тянуть нужную информацию для выявления проблемы. Если хотите можете добавить в друзья что бы не потеряться.
 
Vitaly Muzichenko:

Если получится, и не жалко поделится результатом - напишите решение задачи

Не получилось (я использовал библиотеку php openssl). Решил задачу по-другому.

 
Juer:

Не получилось (я использовал библиотеку php openssl). Решил задачу по-другому.

То есть, у вас по итогу получилось зашифровать в МТ, а расшифровать в .php ? Какой способ использовали?

 
Vitaly Muzichenko:

То есть, у вас по итогу получилось зашифровать в МТ, а расшифровать в .php ? Какой способ использовали?

Нет, я же пишу не получилось. Забил я на это дело. Для моей задачи достаточно хэша было. Я отправлял и получал хэш и обратно еще другой хэш в качестве подтверждения.

Так и не получилось расшифровать в PHP. Было бы неплохо если б кто-то смог этот вопрос серьезно осветить. Может быть разработчики или вроде того.

 
Juer:

Нет, я же пишу не получилось. Забил я на это дело. Для моей задачи достаточно хэша было. Я отправлял и получал хэш и обратно еще другой хэш в качестве подтверждения.

Так и не получилось расшифровать в PHP. Было бы неплохо если б кто-то смог этот вопрос серьезно осветить. Может быть разработчики или вроде того.

Напишите свою функцию шифрования на пыхе, и перенесите её на mq. Так точно не расшифруют, и будет работать на 100% при любом раскладе.

 
Vitaly Muzichenko:

Если получится, и не жалко поделится результатом - напишите решение задачи

гуглить "PKCS#7 padding format"

Причина обращения: