Почему OrderModify() возвращает код ошибки 130?

У меня есть код модификации ордера для моих заказов на открытом рынке, который Error 130 в MT4 Журнал, я знаю, что это давняя проблема, и есть несколько источников, на которые я смотрел, как здесь, так и по всей сети - однако, похоже, ничего не работает.

1) у меня есть NormalizeDouble() вылечить все, что имеет двойные функции на MQL4 т.е. цены и т. д. - это для того, чтобы количество цифр после запятой соответствовало паре ее торговли; некоторые из них 3 цифры, другие 5 цифр.

2) pnlPoints & stopPoints рассчитываются с использованием _Period таким образом, количество точек остается неизменным независимо от количества цифр после десятичной точки графика, на котором установлен советник

3) Я знаю о наличии MarketInfo( Symbol(), MODE_STOPLEVEL ) & hasd добавил это к MarketInfo( Symbol(), MODE_SPREAD ) некоторым stoplevel расчет.

4) Я хочу 100 баллов "В деньгах", прежде чем заказ будет изменен на безубыток.

5) Я использую пятизначный брокер, но, как вы знаете, некоторые пары, такие как EURJPY будет иметь три цифры. Это исправлено _Period & NormalizeDouble() Funtions.

                 /*Breakeven Order Modification*/
                 for(int b = OrdersTotal()-1;b>=0;b--)
                 {
                 if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
                    {
                    double   aBidPrice   =  MarketInfo(Symbol(),MODE_BID);
                    double   anOpenPrice =  OrderOpenPrice();
                    double   aNewTpPrice =  OrderTakeProfit();
                    double   aCurrentSL  =  OrderStopLoss();
                    double   aNewSLPrice =  anOpenPrice;
                    double   pnlPoints   =  NormalizeDouble(aBidPrice - anOpenPrice/_Point,Digits);
                    double   stopPoints  =  NormalizeDouble(aBidPrice - aNewSLPrice/_Point,Digits);
                    int      stopLevel   =  int(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD));
                    int      aTicket     =  OrderTicket();
                    if(OrderType() == OP_BUY)
                    if(stopPoints > stopLevel)
                    if(aTicket > 0)
                    if(pnlPoints > breakeven)
                    if(aNewSLPrice == aCurrentSL)continue;
                       {
                       BuyMod = OrderModify(OrderTicket(),NormalizeDouble(anOpenPrice,Digits),NormalizeDouble(aNewSLPrice,Digits),NormalizeDouble(aNewTpPrice,Digits),0,buycolor);
                       SendMail("Notification of Order Modification for Ticket#"+IntegerToString(OrderTicket(),10),"Good news! Order Ticket#"+IntegerToString(OrderTicket(),10)+"has been changed to breakeven");
                       if(BuyMod = false || aTicket == 0)
                          {
                          Print("Order modification for ticket #"+IntegerToString(aTicket,10)+"Error code",GetLastError());
                          }
                       }
                    }
                 }
                 for(int s = OrdersTotal()-1; s>=0; s--)
                    {
                    if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES)==true)
                       {
                       double   anAskPrice  =  MarketInfo(Symbol(),MODE_ASK);
                       double   anOpenPrice =  OrderOpenPrice();
                       double   aNewTpPrice =  OrderTakeProfit();
                       double   aCurrentSL  =  OrderStopLoss();
                       double   aNewSLPrice =  anOpenPrice;
                       double   pnlPoints   =  NormalizeDouble(anOpenPrice - anAskPrice/_Point,Digits);
                       double   stopPoints  =  NormalizeDouble(aNewSLPrice - anAskPrice/_Point,Digits);
                       int      stopLevel   =  int(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD));
                       int      aTicket     =  OrderTicket();
                       if(OrderType()== OP_SELL)
                       if(stopPoints > stopLevel)
                       if(aTicket > 0)
                       if(pnlPoints > breakeven)
                       if(aNewSLPrice == aCurrentSL)continue;
                          {
                          SellMod = OrderModify(OrderTicket(),NormalizeDouble(anOpenPrice,Digits),NormalizeDouble(aNewSLPrice,Digits),NormalizeDouble(aNewTpPrice,Digits),0,sellcolor);
                          SendMail("Notification of Order Modification for Ticket#"+IntegerToString(OrderTicket(),10),"Good news! Order Ticket#"+IntegerToString(OrderTicket(),10)+"has been changed to breakeven");
                          if(SellMod = false || aTicket == 0)
                             {
                             Print("Order modification for ticket #"+IntegerToString(aTicket,10)+"Error code",GetLastError());
                             }
                          }
                       }
                    }

Большое спасибо и привет.

1 ответ

Решение

MQL4 ошибка 130 обозначает ERR_INVALID_STOPS

Итак, следующий лучший шаг - рассмотреть ваш OrderModify() вызовы с добавлением самостоятельной записи фактических значений, которые должны быть помещены в отправленную на стороне сервера инструкцию.

Разработайте функцию-оболочку с точно такой же вызывающей подписью, как в стандартной OrderModify() имеет:

int LogAndSendOrderModify( int      const aTicketNUMBER,
                           double   const anOrderOpenPRICE,
                           double   const aStopLossPRICE,
                           double   const aTakeProfitPRICE,
                           datetime const anExpirationTIME,
                           color    const aMarkerArrowCOLOR
                           ){ ... }

... и включить кусок кода, прямо перед OrderModify(), который точно записывает каждое значение в журнал.

PrintFormat( "[%s]: TKT:[%d]OP:[%15.8f]SL:[%15.8f]TP:[%15.8f]SL_STOPZONE:[%d]TP_STOPZONE:[%d]SL_FREEZEZONE:[T.B.D.]TP_FREEZEZONE:[T.B.D.]",
              __FUNCTION__,
              aTicketNUMBER,
              anOrderOpenPRICE,
              aStopLossPRICE,
              aTakeProfitPRICE,
              (int) ( MathPow( 10, _Digits ) * ( Bid - aStopLossPRICE ) ),
              (int) ( MathPow( 10, _Digits ) * ( aTakeProfitPRICE - Bid ) )
              );

За ??_FREEZEZONE Вы должны предоставить значения аналогично, но с необходимостью вызвать OrderSelect( aTicketNUMBER, ... ) соответственно, прежде чем делать какие-либо запросы в текущее состояние db.Pool записи с { OrderTakeProfit() | OrderStopLoss() }, но принцип очевиден.

Факты имеют значение, и если самооценочные значения соответствуют условиям и условиям брокера и продолжают получать ERR_INVALID_STOPS, попросите своего брокера дать должное объяснение любого наблюдаемого несоблюдения.

Другие вопросы по тегам