1

我正在尝试修改我的市场订单以在头寸上涨 100 点时收支平衡。这也说明了StopLevels我的经纪人大约 20-30 点。它通过“for(){...}循环”功能检查参数

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

当交易达到 100 点利润(加上止损位)时,EA不添加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()
                                                   );
                                     }
   }
4

2 回答 2

0

尝试这个:

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

如果未能设置停止,则检查专家选项卡以获取错误消息。

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

于 2016-05-12T14:51:13.010 回答
0

暂时,
细化代码

添加自调试/跟踪代码

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

当前代码不进入这种自我诊断并且ModSell根本不检查,ModBuy仅在不确定的条件下检查/偶然在将来访问for(){...}代码执行路径之后的某个部分newSL == sl(并且所有上述条件只是也是偶然认识的)


接下来,检查分配的值tp

如上所述,

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

这引入了一个合理的怀疑,即重用this(本质上是不确定的值,没人知道,这OrderSelect()是最后一个设置db.Pool指针来决定的,从db.PoolthisOrderTakeProfit()中意外读取的记录(如果存在任何记录)在db.Pool已经 )内,整个for(){...}遍历db.Pool记录将不满足在下一系列调用中正确设置止盈价格的条件。OrderModify()

这似乎是有效的、符合 Broker 的值的根本原因或未处理异常的来源OrderModify()

于 2016-04-20T12:17:52.340 回答