2

我正在尝试修改订单,但我一直在修改订单时出错!,错误#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" );
         }
     }
4

5 回答 5

3

OrderModify()call 可能与不是一个,而是两个约束发生冲突

第一个是微不足道的——不能通过 MODE_STOPLEVEL定义的距离将 SL/TP 设置得比您的经纪人允许的更近。

第二,作为一个不太显眼的人——一个人不能改变{ SL | TP } 如果经纪商定义的冻结距离被相应的 XTO 价格访问(执行交易操作价格,为 { Askfor Short.SL & Short.TP | Bidfor Long.TP & Long.SL })

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

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

OrderSend()可能受限于某些 ECN/STP 账户类型

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

此处未单独评论“NormalizeDouble()无论何时何地”的做法,因为 MetaQuotes Inc. 将其作为必须做的事情发布。


推荐的做法

仔细查看您的经纪商的条款和条件,并向您的客户经理咨询适用于您的交易账户类型的经纪商政策的完整组合。

于 2014-12-13T18:55:51.187 回答
2

错误 #130 是ERR_INVALID_STOPS.

最可能的问题是

a)您输入的止损水平太接近订单开仓价。这是由

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

别的

b)因为您没有使用 标准化止损水平NormalizeDouble()

请参阅下面的购买订单示例。在您的示例中,即对于卖出订单,请注意您应该以买入价开单,而不是像您一样要询价。另请注意,止损和止盈通常是相对于买入价计算的,因为买入价是图表上显示的,不幸的是,您只需要从容应对点差损失。

唯一的其他小问题是您在OrderModify(). 与 in 不同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 );
于 2014-12-03T08:43:06.487 回答
1

当您执行买入交易时,您的价格是Ask,您的止损和止盈参考相反的交易,因为您在平仓时受制于Bid价格。

使用这个简单的规则,当您购买时,您stoplosstakeprofit

   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
                                  );
于 2016-11-25T11:58:41.450 回答
0

您好,有些 ECN 经纪商不允许发送带有 SL 和 TP 的订单,所以首先发送没有 SL 和 TP 的订单,然后修改它并指定 SL 和 TP。

于 2018-07-23T12:15:32.647 回答
0

实际上真正的问题是您的新止损价格虽然对于买方来说大于当前止损,但您仍然需要检查您的新止损实际上是否小于当前买入价。如果不是,您将收到 Order Modify 130 错误。我希望我说得通。卖方则相反。

于 2020-06-29T03:57:08.687 回答