修改订单返回错误130

时间:2014-12-02 02:33:46

标签: mql4

我正在尝试修改订单,但我保留错误修改订单!,错误#130。我正在使用ECN代理,因此我需要修改订单以设置止损/止盈。 我做错了什么?

int digits = MarketInfo( Symbol(), MODE_DIGITS );
if (      digits == 2 || digits == 3 ) pipdigits = 0.01;
else if ( digits == 4 || digits == 5 ) pipdigits = 0.0001;

selltakeprofit = Ask + ( takeprofit * pipdigits );
sellstoploss   = Ask - ( stoploss   * pipdigits );

ticket = OrderSend( Symbol(), OP_SELL, lotsize, Ask, 100, 0, 0, 0, 0, 0, CLR_NONE );
if ( ticket < 0 )
    {
       Print( "venda Order send failed with error #", GetLastError() );
       Print( "stop loss = ",                         sellstoploss );
     }
else
    {
       Print( "Order send sucesso!!" );
       Print( "Balance = ",                           AccountBalance() );
       Print( "Equity = ",                            AccountEquity() );

       bool res = OrderModify( ticket, 0, sellstoploss, selltakeprofit, 0 );

       if ( res == false )
         {
             Print( "Error modifying order!, error#", GetLastError() );
             Print( "sellstoploss ",                  sellstoploss );
             Print( "selltakeprofit ",                selltakeprofit );
             Print( "StopLevel ",                     StopLevel );
             Print( "Ask ",                           Ask );
          }
      else
        {
             Print( "Order modified successfully" );
         }
     }

5 个答案:

答案 0 :(得分:2)

错误#130是 ERR_INVALID_STOPS

最可能的问题是

a)您输入的止损水平太接近订单开盘价。这取决于

  

MarketInfo( Symbol(), MODE_STOPLEVEL ) // returns a min allowed distance [pts]

否则

b),因为您没有使用NormalizeDouble()将停止损失级别标准化。

请参阅下面的购买订单示例。在您的示例中,即对于卖单,请注意您应该以买价开仓,而不是按照您的要求。另请注意,止损和止盈通常是相对于出价计算的,因为出价是您的图表上显示的内容,不幸的是,您只需要大幅度地消除差价。

只有其他小问题是您没有为OrderModify()中的最后一个参数输入任何颜色。与OrderSend()不同,它们在函数定义中没有默认初始化,因此您应该真正传递它们。

//--- get minimum stop level
   double minstoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL );
   Print( "Minimum Stop Level=", minstoplevel, " points" );
   double price = Ask;
//--- calculated SL and TP prices must be normalized
   double stoploss   = NormalizeDouble( Bid - minstoplevel * Point, Digits );
   double takeprofit = NormalizeDouble( Bid + minstoplevel * Point, Digits );
//--- place market order to buy 1 lot
   int ticket = OrderSend( Symbol(), OP_BUY, 1, price, 3, stoploss, takeprofit, "My order", 16384, 0, clrGreen );

答案 1 :(得分:1)

OrderModify()调用可能会与一个,但两个约束

发生冲突

第一个是一个微不足道的 - 一个人不能让SL / TP比你的经纪人允许通过MODE_STOPLEVEL定义的距离更近。

第二个,一个不太明显的 - 一个不能改变{SL | TP}如果经纪人定义的冻结距离是由相应的XTO价格(一个执行交易操作价格,{ Ask )访问Short.SL&amp; Short.TP | <对于Long.TP&amp; Long.SL}的强> Bid })

  

MarketInfo( Symbol(), MODE_STOPLEVEL ) // returns a min allowed distance [pts]

     

MarketInfo( Symbol(), MODE_FREEZELEVEL ) // returns a freezing distance [pts]

某些ECN / STP帐户类型可能会限制

OrderSend()

在STP / ECN系统上设置的另一个相当常见的条件(由经纪人的内部风险管理政策引入)是,不允许在 OrderSend() 处设置TP / SL,但必须将这些留空并在OrderSend()的肯定确认后,为给定的OrderTicketNumber提交单独的 OrderModify() 指令,以便在事后添加TP和/或SL价格水平(S)

A NormalizeDouble() - 此处不会单独评论,因为MetaQuotes Inc.会将此作为必须做的。


推荐做法

仔细阅读您的经纪人条款&amp;条件并咨询您的客户经理,了解适用于您的交易账户类型的经纪商政策的完整组合。

答案 2 :(得分:1)

当您执行买入交易时,您的价格是 Ask ,您的止损和止盈是指对方交易,​​因为当您关闭时,您将受到<强> Bid 价格。

使用此简单规则,当您购买 stoploss takeprofit 时,将会:

   double stoploss   = NormalizeDouble( Bid - minstoplevel * Point, Digits );
   double takeprofit = NormalizeDouble( Bid + minstoplevel * Point, Digits );

   int    ticket     = OrderSend( Symbol(),
                                  OP_BUY,
                                  lots,
                                  price,
                                  slippage,
                                  stoploss,
                                  takeprofit
                                  );
相反,当你卖出时:

   double stoploss   = NormalizeDouble( Ask + minstoplevel * Point, Digits );    
   double takeprofit = NormalizeDouble( Ask - minstoplevel * Point, Digits );

   int    ticket     = OrderSend( Symbol(),
                                  OP_SELL,
                                  lots,
                                  price,
                                  slippage,
                                  stoploss,
                                  takeprofit
                                  );

答案 3 :(得分:0)

实际上,真正的问题是,尽管买方的新止损价格大于当前止损,但您仍然必须检查新止损价格是否实际上小于当前买入价。如果没有,您将收到该“订单修改130”错误。我希望我有道理。而对卖方则相反。

答案 4 :(得分:-1)

您好,某些ECN经纪商不允许发送带有SL和TP的订单,因此首先发送不带有SL和TP的订单,然后对其进行修改并为其分配SL和TP。