为什么我的EA没有将我的职位转移到盈亏平衡?

时间:2016-04-20 11:12:33

标签: trading algorithmic-trading mql4 mt4

我正在尝试修改我的市场订单,以便在仓位获得100点差价时平仓。对于我的经纪人来说,这也是StopLevels约为20-30点。它通过“for(){...}循环”功能

检查参数

MagicNumber是其所在图表的时间范围编号(即 240 = 4H, 60 = 1H )我没有设定TakeProfit价格& 最初没有StopLoss价格。

EA 在交易达到100点利润(加上行程水平)时,并未将SL添加为等于开盘价。利润点达到130多点。

我的代码位于 OP_SELL 订单的下方 - 任何帮助都将不胜感激。此致,托德

/*Global Declarations*/
double   pnlPoints;
double   price, sl, tp;
double   point;
int      stopLevel;
int      breakeven;
double   newSL; 

/*Local  Declaratons*/
pnlPoints            =  0;
point                =       MarketInfo( Symbol(), MODE_POINT );
stopLevel            =  int( MarketInfo( Symbol(), MODE_STOPLEVEL )
                           + MarketInfo( Symbol(), MODE_SPREAD )
                             );
sl                   =  NormalizeDouble( OrderStopLoss(), Digits );
tp                   =  OrderTakeProfit();
breakeven            =  100;


   for( int s = OrdersTotal() - 1; s >= 0; s-- )
   {    if ( (  OrderSelect( s, SELECT_BY_POS, MODE_TRADES ) ) == true )
                price = MarketInfo( Symbol(), MODE_ASK );

        newSL     =  NormalizeDouble( OrderOpenPrice(), Digits );
        pnlPoints = ( OrderOpenPrice() - price ) / point;

        if (                          OP_SELL   == OrderType()               )
              if (                    Period()  == OrderMagicNumber()        )
                    if (              stopLevel <  ( newSL - price ) / point )
                          if (        breakeven <  pnlPoints                 )
                                if (  newSL     != sl                        )

                                      ModSell = OrderModify( OrderTicket(),
                                                             OrderOpenPrice(),
                                                             newSL,
                                                             tp,
                                                             buycolor
                                                             );
                                else if (  ModBuy == false )
                                     {     Print( "OrderModify failed with error #",
                                                   GetLastError()
                                                   );
                                     }
   }

2 个答案:

答案 0 :(得分:0)

目前,细化代码
加上自我调整/跟踪代码

OrderModify() 后,使用自我调试/日记Print( StringFormat( ... ) )来记录实际OrderModify()调用中使用的所有指示值以及远程执行( {server-side | StrategyTester})报告了问题。

当前代码未进入此类自我诊断,并且根本未检查 ModSell ,仅在不确定时检查 ModBuy 在{strong> for(){...} 之后newSL == sl代码执行路径访问某个部分的条件/巧合(以及所有上述条件也偶然得到满足)< / p>

接下来,检查指定的值tp

如上所述,

/*Local  Declarations*/
...
tp                   =  OrderTakeProfit();

引入合理怀疑重新使用固有不确定值,因为没人知道, OrderSelect() 是设置 db.Pool 指针的最后一个,决定来自db.PoolOrderTakeProfit() db.Pool的记录意外阅读(如果for(){...}已经存在任何记录)在整个db.Pool遍历OrderModify()记录将无法满足正确设置的条件在下一系列OrderModify()来电中获取优惠价格。

这似乎是有效的,符合Broker的{{1}}值的未处理例外的根本原因或来源。

答案 1 :(得分:0)

试试这个:

if (newSL != sl ) {
    ModSell = OrderModify( OrderTicket(),
                           OrderOpenPrice(),
                           OrderOpenPrice(),
                           0,
                           OrderExpiration(),
                           clrRed
                          );
    if(ModBuy == false )
        Print( "OrderModify failed with error #", GetLastError());
}

如果无法设置停止,请检查专家标签是否有错误消息。

此外,您需要注意只有在正确的图表时间范围内才会发生StopLoss;否则,它甚至不会进入if语句。