我希望我的EA自动修改订单,将StopLoss置于盈利状态,但为什么总是错误?
我已经获得了最低点数,但它没有给我任何运气。
这是vars
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 );
}
答案 0 :(得分:0)
即使(Forex Falcon的IT经理)也应该知道一些事实:
每个MQL4代码都已将若干职责转移给代码设计人员,在任何db.Pool操作之前提交强制性 OrderSelect()
。不是因为OrderModify()
中的db.Pool-SELECT-free操作模式,而是因为你的代码比较了db.Pool-record-values(并且这样的记录必须首先显式地为SELECT-ed)
要监控的值不仅仅是Spread
和StopLevel
。一旦您的代码请求MT4-Server端修改订单,可能存在 Error_130
的第三个原因,幸运的是保留在 FreezeLevel
内区域,由您的经纪人 [条款和条件] 设置。请务必重新阅读它们,因为它们会统治您的所有XTO /非XTO。
最后但并非最不重要的是,您的信念将会破灭,因为StopLevel,FreezeLevel和Spread都不需要保持不变,并且当返回的值应该被理解为值时,Broker和MetaQuotes MQL4文档都会警告情况,但作为一个关于实际没有价值的指示,但是标记浮动(未知)值。
在所有情况下,将实际和请求的新值记录到文件中并检查它们是否符合[条款和条件]中的经纪人发布规则。
如果没有,请与经纪人代表和您当地的FSA当局协调任何此类记录在案的不合规情况。
答案 1 :(得分:0)
您只需检查一下,如果很长时间,您的止损位于OrderOpenPrice()
以下,并计算新止损。但你不知道目前的价格是否远远低于目前的价格。可能的情况是,您关闭订单的当前价格(OrderClosePrice()
,Bid
已久)低于新的止损,在这种情况下无法进行修改。之后,请确保您允许从当前价格到新止损的STOP_LEVEL * Point
距离。