Ошибка модификации ордера при реализации Trailing Stop

 

Товарищи, возникла проблема с реализацией алгоритма Trailing Stop в советнике, а именно ошибка модификации ордера 130

Ордер выбирается по Мэджику и тикету (хранятся экстерном и меняются при открытии нового ордера того же типа)

На историческом тесте с часовыми барами по всем тикам на демо-счёте стандарт участвуют только ордера продажи, алгоритм срабатывает при разнице цены
Bid с SL в 0,0050 (пара EUR/USD) и опускает её на 0,0010 от OrderStopLoss, все данные прошли NormalizeDouble(что-нибудь,Digits), RefreshRates не использовал, так как новый SL рассчитывается от старого, а не от актуальной цены (компиляция 400ms, значения не должны измениться), плюс здесь разница в 40 пунктов с Ask’ом, новый стоп  блокироваться по логике вещей не должен, но почему-то он сбоит, я фактически новичок, могу не понимать каких-то неочевидных вещей, так что мне ничего не остаётся кроме как обратиться за помощью к более опытным трейдерам (это крик о помощи)

P.S. – ещё больше меня удивил журнал, где некоторые ордера иногда всё-таки модифицируются, и так ордеру присвоилось значение TP=0, хотя при модификации он перенимает OrderProfit с выбранного ордера



extern int m=0;
extern int T;

...

double TS = NormalizeDouble(Ask+0.0040,Digits); //_____________________TrailingStop
bool I = false; 

   if (OrdersTotal()>0) {  //__________________________________________Советник запускается в соло
      for(int i=0; I==false; i++)
      {
         OrderSelect(i,SELECT_BY_TICKET);
         if (OrderMagicNumber()==m&&OrderTicket()==T)
         {
            I=true;
            }
      }
            
         if (NormalizeDouble(OrderStopLoss(),Digits)>TS&&I==true) { 
            double tp = NormalizeDouble(OrderProfit(),Digits);
            int ti = OrderTicket();
            double Op = NormalizeDouble(OrderOpenPrice(),Digits);
            double sl = NormalizeDouble(OrderStopLoss()-0.0010,Digits);
            Print(TS); 
            Print(sl);
            Print(Op);
            bool M=OrderModify(ti,Op,sl,tp,0);
               
            if(!M) 
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else 
               Print("Еееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееть!!!!!!.");
               }
       
    }

if (OrdersTotal()==0) //____________________________________________________________Новая сделка не открывается, пока не закроется старая

...

if (условие) {
         m=m+1; //__________________________________________________________________Magic
         T=OrderSend(NULL, OP_SELL, L, Bid, 5, SL, TP, NULL, m, 0);
}

}
}
 
Дмитрий Гиль:

Товарищи, возникла проблема с реализацией алгоритма Trailing Stop в советнике, а именно ошибка модификации ордера 130

Ордер выбирается по Мэджику и тикету (хранятся экстерном и меняются при открытии нового ордера того же типа)

На историческом тесте с часовыми барами по всем тикам на демо-счёте стандарт участвуют только ордера продажи, алгоритм срабатывает при разнице цены
Bid с SL в 0,0050 (пара EUR/USD) и опускает её на 0,0010 от OrderStopLoss, все данные прошли NormalizeDouble(что-нибудь,Digits), RefreshRates не использовал, так как новый SL рассчитывается от старого, а не от актуальной цены (компиляция 400ms, значения не должны измениться), плюс здесь разница в 40 пунктов с Ask’ом, новый стоп  блокироваться по логике вещей не должен, но почему-то он сбоит, я фактически новичок, могу не понимать каких-то неочевидных вещей, так что мне ничего не остаётся кроме как обратиться за помощью к более опытным трейдерам (это крик о помощи)

P.S. – ещё больше меня удивил журнал, где некоторые ордера иногда всё-таки модифицируются, и так ордеру присвоилось значение TP=0, хотя при модификации он перенимает OrderProfit с выбранного ордера

  

OrderProfit();  //Возвращает значение чистой прибыли выбранного ордера.
 
Дмитрий Гиль:


Во-первых вставьте код как положено, используя кнопку Код. Во-вторых не стоит тратить время, чтобы изобретать велосипед. Есть готовые функции. Например: ветка "Полезные функции KimIV." Или на его сайте.

 
у автора прекрасно всё - особенно порадовал цикл фор (копаем отсюда и до обеда) да ещё и выборка по тикету, про остальное можно не говорить, это слишком уродливая недофункция, пристрелите её чтоб не мучалась
 
Aleksey Semenov:
у автора прекрасно всё - особенно порадовал цикл фор (копаем отсюда и до обеда) да ещё и выборка по тикету, про остальное можно не говорить, это слишком уродливая недофункция, пристрелите её чтоб не мучалась

Да, там много чего не так, поэтому я и посоветовал ему учиться на примерах функций KimIV. Там легче ориентироваться, т.к. в заголовках функций есть комметарии, что облегчает понимание.

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