除了遇见一个MQL4
语法规则,
还有更多条件:
第一个隐患是数字舍入问题。
MetaQuotes, Inc. 建议尽可能将浮动值标准化为适当的价格表示形式。
Thus,
价格进入服务器端指令的任何地方{ OrderSend(), OrderModify(), ... }
一个人应该always准备这样的aPriceDOMAIN
value
通过致电NormalizeDouble( ... , _Digits )
,在标准化价格到达任何服务器端指令调用之前。
可能听起来很天真,但是this避免服务器端拒绝的问题。
Add NormalizeDouble()
定期调用您的代码作为您的救生衣。
第二个,甚至更好的隐患就在 STOP_ZONE
-s and FREEZE_ZONE
-s
虽然不直接可见,但任何 Broker 集都位于各自的条款及条件这些参数。
在实践中,
这意味着,如果您指示{ OrderSend() | OrderModify() }
to set / move aPriceDOMAIN
设置的级别与当前实际值太接近Ask
/Bid
(违反经纪人禁止STOP_ZONE
)
or
删除/修改aPriceDOMAIN
止盈或止损水平,已设置且目前处于经纪商禁止的范围内FREEZE_ZONE
与实际的距离Ask
/Bid
,
该指示将不会被成功接受及执行。
所以除了打电话给NormalizeDouble()
,当价格移动得足够“远”时,请务必等待一段时间,并定期检查是否违反禁止规定STOP_
+ FREEZE_
在对算法交易项目的订单管理部分进行任何修改之前先进行区域调整。
Anyway, 欢迎来到狂野世界MQL4
Update:
虽然 StackOverflow 不是一个做家庭作业的网站,但让我为解决方案提出一些方向:
for ( int b = OrdersTotal() - 1; b >= 0; b-- ) // ________________________ // I AM NOT A FAN OF db.Pool-looping, but will keep original approach for context purposes
{ if ( ( OrderSelect( b, SELECT_BY_POS, MODE_TRADES ) ) == true )
{ // YES, HAVE TO OPEN A CODE-BLOCK FOR if()-POSITIVE CASE:
// ------------------------------------------------------
double aBidPRICE = MarketInfo( Symbol(), MODE_BID ); // .UPD
double anOpenPRICE = OrderOpenPrice(); // .SET FROM a db.Pool Current Record
double aNewTpPRICE = OrderTakeProfit(); // .SET FROM a db.Pool Current Record
double aCurrentSlPRICE = OrderStopLoss(); // .SET FROM a db.Pool Current Record
double aNewSlPRICE = anOpenPRICE; // .SET
double pnlPOINTs = ( aBidPRICE - anOpenPRICE )/_Point; // .SET
double stopPOINTs = ( aBidPRICE - aNewSlPRICE )/_Point; // .SET
// ------------------------------------------------------------ // .TEST
if ( OP_BUY == OrderType() )
if ( Period() == OrderMagicNumber() )
if ( stopPOINTa > stopLevel )
if ( pnlPOINTs >= breakeven )
if ( aNewSlPRICE != aCurrentSlPRICE )
{ // YES, HAVE TO OPEN A BLOCK {...}-CODE-BLOCK FOR THE if()if()if()if()-chain's-POSITIVE CASE:
// -------------------------------------------------------------------------------------------
int aBuyMOD = OrderModify( OrderTicket(),
OrderOpenPrice(),
NormalizeDouble( aNewSlPRICE, Digits ),
NormalizeDouble( aNewTpPRICE, Digits ),
0,
buycolor
);
switch( aBuyMOD )
{ case ( NULL ): { ...; break; } // FAIL ( ANALYSE ERROR )
default: { ...; break; } // PASS OrderModify()
}
}
}