Ошибки модификации ордеров

 

Помогите пожалуйста начинающему, соратники!

Написал своего первого советника, но при работе всё время возвращает ошибку OrderModifi error 1. Я понимаю, что эта ошибка связана с попыткой установки неправильного стоп-лосс для ордера. Но моего разумения не хватает, чтобы её устранить. Посмотрите пожалуйста код, как его нужно изменить?

Идея такова: проверяется, есть ли открытые ордера. Если есть ордер (например, BUY), проверяется наличие профита и наличие сигнала на закрытие. Если условия выполнены - ордер закрывается с профитом. Если профита и/или сигнала на закрытие нет, выполняется модификация ордера - стоп переносится (расчет стопа в коде)

//---------------- РАССЧИТЫВАЕМ СТОП-ЛОСС ДЛЯ ПОЗИЦИИ -------------

SL_BUY=iMA(NULL,TFforMA,Period_MA,0,1,3,1);

SL_SELL=iMA(NULL,TFforMA,Period_MA,0,1,2,1);

//Print("стоп для BUY=",SL_BUY,"  стоп для SELL=",SL_SELL);

//-------------- ПРОВЕРЯЕМ НАЛИЧИЕ ОТКРЫТЫХ ОРДЕРОВ И ЗАКРЫВАЕМ/МОДИФИЦИРУЕМ--------------
   int total = OrdersTotal();
   for (int i = 0; i < total; i++) 
   {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn) 
         {
             if(OrderType()==OP_BUY && OrderProfit()>0 && Close[1]<Minimum() && Supervisor()<0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                 return(0);
                }
                    if(OrderType()==OP_BUY) 
                        {  
                         OrderModify(OrderTicket(),OrderOpenPrice(),SL_BUY,OrderTakeProfit(),0,Blue);
                         return(0);
                        }
                             if(OrderType()==OP_SELL && OrderProfit()>0 && Close[1]>Maximum() && Supervisor()>0)
                               {
                                OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
                                return(0);
                               }
                                  if(OrderType()==OP_SELL && OrderStopLoss()>SL_SELL && OrderStopLoss()!=SL_SELL)      // короткая открытая позиция
                                    {
                                       OrderModify(OrderTicket(),OrderOpenPrice(),SL_SELL,OrderTakeProfit(),0,Red);
                                    } 
       
                                    return(0);
           } 
   }
 

А почему вы думаете, что ошибка имеено здесь. в модификации ?

А может она, - при открытии позиций появляется?

И ещё. Возможно стоп переносится на расстояние, кот. меньше разрешенного правилами ДЦ

 
rid >>:

А почему вы думаете, что ошибка имеено здесь. в модификации ?

А может она, - при открытии позиций появляется?

И ещё. Возможно стоп переносится на расстояние, кот. меньше разрешенного правилами ДЦ

1. У меня дальше условие стоит, что если есть открытый ордер, то позиции не открываются. Т.е. я склонен считать, что эта ошибка (OrderModifi error 1) появляется здесь. И как мне кажется, она может появиться потому, что после модификации ордера BUY продолжает выполняться код и делается попытка модифицировать этот же ордер стопом для SELL .... Вот только никак не могу понять, правильно ли я использовал if-else

2. По поводу стопа возможно вы и правы... Как можно подстраховаться? Код не подскажете?

 
Вот ты селл-ордера проверяешь на равенство предыдущему стопу, а бай-ордера - нет. Ошибка здесь.
 
Roger >>:
Вот ты селл-ордера проверяешь на равенство предыдущему стопу, а бай-ордера - нет. Ошибка здесь.

блин, забыл вписать условие... но дело не в этом, просто я пытался изменить немного здесь и забыл вернуть условия

 
matu1 >>:

блин, забыл вписать условие... но дело не в этом, просто я пытался изменить немного здесь и забыл вернуть условия


Ну что ж, давайте рассмотрим Ваше условие, на основании которого Вы принимаете решение о модификации ордера:


if(OrderType()==OP_SELL && OrderStopLoss()>SL_SELL && OrderStopLoss()!=SL_SELL)

OrderStopLoss() != SL_SELL здесь абсолютно лишнее, т.к. исключается OrderStopLoss() > SL_SELL, а вот проверки на то, не ушло ли значение стопа ниже значения открытия ордера нет, что и м.б. причиной ошибки в данном случае.
 
sandro78 писал(а) >>

Ну что ж, давайте рассмотрим Ваше условие, на основании которого Вы принимаете решение о модификации ордера:



OrderStopLoss() != SL_SELL здесь абсолютно лишнее, т.к. исключается OrderStopLoss() > SL_SELL, а вот проверки на то, не ушло ли значение стопа ниже значения открытия ордера нет, что и м.б. причиной ошибки в данном случае.

Спасибо за ответ!

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

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