为什么OrderModify()返回代码错误130?

时间:2016-04-27 14:16:54

标签: algorithmic-trading mql4 metatrader4

我的公开市场订单有一个订单修改代码,在Error 130期刊中有 MT4 ,我知道这是一个古老的问题&我看过几个来源,包括这里和整个网络 - 然而,似乎没有任何工作。

1)我有 NormalizeDouble() -cured在MQL4上具有双重功能的所有内容,即价格等 - 这是为了确保小数点后面的位数是与其交易一致;一些是3位数,其他是5位数。

2)pnlPoints& stopPoints使用 _Period 进行计算,因此无论图表中小数点后面的数字位数是多少,点数都是一致的

3)我知道 MarketInfo( Symbol(), MODE_STOPLEVEL ) &已将此添加到 MarketInfo( Symbol(), MODE_SPREAD ) ,将其添加到 stoplevel 计算中。

4)我想要100分"在钱"在订单被修改为盈亏平衡之前。

5)我使用五位数的经纪人,但正如您所知,像 EURJPY 这样的对将有三位数。这可以通过 _Period &更正 NormalizeDouble() 功能。

                 /*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 个答案:

答案 0 :(得分:0)

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, ... ),然后才能将任何请求转换为{{1的当前状态记录db.Pool,但原则很明显。

事实重要,如果自我报告的值符合Broker Terms&条件仍然保持{ OrderTakeProfit() | OrderStopLoss() }向您的经纪人询问是否发现任何违规行为。