MQL4:OrderModify() 总是得到 130 响应
MQL4: OrderModify() always gets 130 response
我想让我的EA自动修改订单,在盈利状态设置一次止损,但为什么总是报错?
我也已经达到了最低点数,但它并没有给我任何运气。
这是变量
double _stopLevelTimes = 1.5;
int StopLevel = (int) ( miStopLevel + miSpread );
我想要的是使止损水平比最小止损点水平高 1.5 倍,我也已经添加了点差。
这些变量是从代理自动填充的。
if ( OrderType() == 0
&& OrderOpenPrice() > OrderStopLoss()
){
_stopLoss = NormalizeDouble( OrderOpenPrice()
+ ( Point() * ( StopLevel
* _stopLevelTimes
)
),
miDigits
);
_clr = clrBlue;
RefreshRates();
modified = OrderModify( OrderTicket(),
OrderOpenPrice(),
_stopLoss,
OrderTakeProfit(), 0, _clr );
}
else
if ( OrderType() == 1
&& OrderOpenPrice() < OrderStopLoss()
){
_stopLoss = NormalizeDouble( OrderOpenPrice()
- ( Point() * ( StopLevel
* _stopLevelTimes
)
),
miDigits
);
_clr = clrRed;
RefreshRates();
modified = OrderModify( OrderTicket(),
OrderOpenPrice(),
_stopLoss,
OrderTakeProfit(), 0, _clr );
}
即使 (Forex Falcon 的 IT 经理) 也应该知道一些确凿的事实:
每个 MQL4 代码都将一些责任转移给代码设计者,在任何 db.Pool 操作之前提交强制性的 OrderSelect()
。不是因为 OrderModify()
中的 db.Pool-SELECT-free 操作模式,而是因为您的代码比较 db.Pool-record-values(并且此类记录必须首先明确SELECT-ed )
有更多的值需要监控,而不仅仅是 Spread
和 StopLevel
。 Error_130
可能还有第三个原因,一旦您的代码请求 MT4 服务器端修改订单,幸运的是它保留在 [=15= 中] 区域,由您的经纪人[条款和条件]设置。请务必重新阅读它们,因为它们统治着你所有的 XTO/non-XTO.
最后但并非最不重要的一点是,您的信念将会破灭,因为 StopLevel、FreezeLevel 和 Spread 都不需要保持不变,并且 Brokers 和 MetaQuotes MQL4 文档都警告了应该理解返回值的情况不是作为一个值,而是作为一个指示实际上没有一个值可以使用,而是标记 浮动(未知)值.
最好的下一步?
在所有情况下,将实际值和请求的新值记录到一个文件中,并检查这些值是否符合经纪人在[条款和条件]中发布的规则。
如果不是,请与经纪人代表和您当地的 FSA 当局核对任何此类记录在案的不合规情况。
您只需检查在做多的情况下,您的止损低于 OrderOpenPrice()
,并计算新的止损。但你不知道现在的价格是否离现在的价格足够远。可能是您当前关闭订单的价格(OrderClosePrice()
,Bid
多头)低于新止损,在这种情况下无法修改。之后,确保您允许 STOP_LEVEL * Point
从当前价格到新止损的距离。
我想让我的EA自动修改订单,在盈利状态设置一次止损,但为什么总是报错?
我也已经达到了最低点数,但它并没有给我任何运气。
这是变量
double _stopLevelTimes = 1.5;
int StopLevel = (int) ( miStopLevel + miSpread );
我想要的是使止损水平比最小止损点水平高 1.5 倍,我也已经添加了点差。
这些变量是从代理自动填充的。
if ( OrderType() == 0
&& OrderOpenPrice() > OrderStopLoss()
){
_stopLoss = NormalizeDouble( OrderOpenPrice()
+ ( Point() * ( StopLevel
* _stopLevelTimes
)
),
miDigits
);
_clr = clrBlue;
RefreshRates();
modified = OrderModify( OrderTicket(),
OrderOpenPrice(),
_stopLoss,
OrderTakeProfit(), 0, _clr );
}
else
if ( OrderType() == 1
&& OrderOpenPrice() < OrderStopLoss()
){
_stopLoss = NormalizeDouble( OrderOpenPrice()
- ( Point() * ( StopLevel
* _stopLevelTimes
)
),
miDigits
);
_clr = clrRed;
RefreshRates();
modified = OrderModify( OrderTicket(),
OrderOpenPrice(),
_stopLoss,
OrderTakeProfit(), 0, _clr );
}
即使 (Forex Falcon 的 IT 经理) 也应该知道一些确凿的事实:
每个 MQL4 代码都将一些责任转移给代码设计者,在任何 db.Pool 操作之前提交强制性的
OrderSelect()
。不是因为OrderModify()
中的 db.Pool-SELECT-free 操作模式,而是因为您的代码比较 db.Pool-record-values(并且此类记录必须首先明确SELECT-ed )有更多的值需要监控,而不仅仅是
Spread
和StopLevel
。Error_130
可能还有第三个原因,一旦您的代码请求 MT4 服务器端修改订单,幸运的是它保留在 [=15= 中] 区域,由您的经纪人[条款和条件]设置。请务必重新阅读它们,因为它们统治着你所有的 XTO/non-XTO.最后但并非最不重要的一点是,您的信念将会破灭,因为 StopLevel、FreezeLevel 和 Spread 都不需要保持不变,并且 Brokers 和 MetaQuotes MQL4 文档都警告了应该理解返回值的情况不是作为一个值,而是作为一个指示实际上没有一个值可以使用,而是标记 浮动(未知)值.
最好的下一步?
在所有情况下,将实际值和请求的新值记录到一个文件中,并检查这些值是否符合经纪人在[条款和条件]中发布的规则。
如果不是,请与经纪人代表和您当地的 FSA 当局核对任何此类记录在案的不合规情况。
您只需检查在做多的情况下,您的止损低于 OrderOpenPrice()
,并计算新的止损。但你不知道现在的价格是否离现在的价格足够远。可能是您当前关闭订单的价格(OrderClosePrice()
,Bid
多头)低于新止损,在这种情况下无法修改。之后,确保您允许 STOP_LEVEL * Point
从当前价格到新止损的距离。