我正在尝试修改订单,但我保留错误修改订单!,错误#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" );
}
}
答案 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
})
某些ECN / STP帐户类型可能会限制
MarketInfo( Symbol(), MODE_STOPLEVEL ) // returns a min allowed distance [pts]
MarketInfo( Symbol(), MODE_FREEZELEVEL ) // returns a freezing distance [pts]
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。