Скачать MetaTrader 5

Error Modify: 130 у открытого ордера

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
kolikon
27
kolikon  

Не могу решить проблему с изменением стоп лоса и тейк профита у открытого ордера.
Стоп лосс и тейк профит разные значение и советник не пытается изменить уже существующие значения. И кстати говоря в руную ордер модифицируется нормально.

Синей полоской обозначил какой ордер пытается изменить. Оранжевыми существующие стоп лосс и тейк профит. Стрелкой обозначил текущую цену.


Сам код:

int start() {
double shag = 0.004;

   for (int k=OrdersTotal()-1; k>=0; k--){
      if (OrderSelect(k,SELECT_BY_POS,MODE_TRADES)) {
         if (OrderSymbol() == para){
            //+------------------------------------------------------------------+

            price = NormalizeDouble(OrderOpenPrice(), Digits);
            price_tp = NormalizeDouble(OrderTakeProfit(), Digits);
            price_sl = NormalizeDouble(OrderStopLoss(), Digits);
            double asd = MathAbs(price-price_tp); 
            open_tip = OrderType();

            if (open_tip == 1) {
               if (asd < shag){
                  Print(" Цена ордера: ", price, " Stoploss сменить с ", price_sl, " на ", price+shag, " TakeProfit сменить с ", price_tp, " на ", price-shag);
                  mod_take (OrderTicket(), price, price+shag, price-shag);
               }
            }
         }
      }
   }
}

void mod_take (int t, double cena, double SL, double TP){
   double norm_cena = NormalizeDouble(cena,Digits);
   double norm_SL = NormalizeDouble(SL,Digits);
   double norm_TP = NormalizeDouble(TP,Digits);
   
   OrderModify(t,norm_cena,norm_SL,norm_TP,0, CLR_NONE);
   if (OrderModify(t,norm_cena,norm_SL,norm_TP,0, CLR_NONE) <= 0) Print("Error Modify: ", GetLastError(), ", norm_cena = ", norm_cena, ", norm_SL = ", norm_SL, ", norm_TP = ", norm_TP);
   Sleep(1000*3);
}
Vitalie Postolache
12446
Vitalie Postolache  
OrderModify(t,norm_cena,norm_SL,norm_TP,0, CLR_NONE); //<---  IMHO это лишнее...

   if (OrderModify(t,norm_cena,norm_SL,norm_TP,0, CLR_NONE) <= 0) {Print("Error Modify: ", GetLastError(), ", norm_cena = ", norm_cena, ", norm_SL = ", norm_SL, ", norm_TP = ", norm_TP);
   Sleep(1000*3);} //Если нет необходимости в спячке всякий раз, а только при ошибке, лучше в скобки заключить обе операции за IF...
Vitalie Postolache
12446
Vitalie Postolache  
Два раза нормализовать одно и то же значение, по-моему, тоже нету необходимости.


В чём смысл данной строки: 
            double asd = MathAbs(price-price_tp); ??? Цена открытия не меняется со временем
Может лучше всё же 
            double asd = MathAbs(Bid-price_tp);?

И как данный код будет с покупками обходиться?

kolikon
27
kolikon  
evillive:
Два раза нормализовать одно и то же значение, по-моему, тоже нету необходимости.


И как данный код будет с покупками обходиться?


Смысл строки в том что сравнивает шаг с расстоянием на который выставлен тейк профит. То есть берется цена открытого ордера из нее вычитается тейк профит и сравнивается с шагом. Если меньше то ордер модифицируется изменяя стоп лосс и тейкпрофит. Поэтому данный метод вычитания из Бида не имеет смысла.

Меня волнует всего лишь один вопрос. Почему он не модифицирует ордер?

kolikon
27
kolikon  

Все решил проблему. Оказалось все дело в Тикете. Тикет был не от того ордера.

Выше по коду от функции был перебор ордеров и от него осталось последнее значение OrderTicket()

            if (open_tip == 1) {
               if (функция) == 0){бла бла бла}
               if (asd < shag){
                  Print(OrderTicket(), " Цена ордера: ", price, " Stoploss сменить с ", price_sl, " на ", price+shag, " TakeProfit сменить с ", price_tp, " на ", price-shag);
                  mod_take (ticket, price, price+shag, price-shag);
               }
            }

Пришлось ввести новую переменную ticket и вставить ее вместо OrderTicket() и проблема решилась.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий