为什么MQL4 OrderModify()在回测时不会修改订单?

时间:2016-04-17 14:08:22

标签: algorithmic-trading mql4 metatrader4 mt4

我尝试 ADD MetaTrader 4 中止损我的公开市场订单当一个仓位获得100点时"到好的" 34;这等于订单开盘价;

OrderStopLoss() == OrderOpenPrice()

但这并没有发生。

我添加了Print()& GetLastError()函数,期刊中没有任何内容,因此它必须是我编码中的内容 - 但看不出会出现什么问题。

好的,这就是我到目前为止,一个用于购买的循环,一个用于销售。我还规范了"双打"因为我被建议做&还宣布了BuyMod& SellMod to" true"在最顶端。这应该确保默认不会使用false。我还认为如果我告诉你我有MetaEditor版本5 build 1241可能会有所帮助:)

以下代码如下:

/*Breakeven Order Modification*/
bool BuyMod               =  true;
bool SellMod              =  true;
                for(int b = OrdersTotal()-1;b>=0;b--)
                {
                if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
                   {
                   double   aBidPrice   =  MarketInfo(Symbol(),MODE_BID);
                   double   anOpenPrice =  OrderOpenPrice();
                   double   aNewTpPrice =  OrderTakeProfit();
                   double   aCurrentSL  =  OrderStopLoss();
                   double   aNewSLPrice =  anOpenPrice;
                   double   pnlPoints   =  (aBidPrice - anOpenPrice)/_Point;
                   double   stopPoints  =  (aBidPrice - aNewSLPrice)/_Point;
                   int      stopLevel   =  int(MarketInfo(Symbol(),MODE_STOPLEVEL));
                   int      aTicket     =  OrderTicket();
                   if(OrderType() == OP_BUY)
                   if(stopPoints >= stopLevel)
                   if(aTicket > 0)
                   if(pnlPoints >= breakeven)
                   if(aNewSLPrice != aCurrentSL)
                      {
                      BuyMod = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(aNewSLPrice,Digits),NormalizeDouble(aNewTpPrice,Digits),0,buycolor);
                      SendMail("Notification of Order Modification for Ticket#"+IntegerToString(OrderTicket(),10),"Good news! Order Ticket#"+IntegerToString(OrderTicket(),10)+"has been changed to breakeven");
                      }
                   }
                }
                for(int s = OrdersTotal()-1; s>=0; s--)
                {
                if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
                   {
                   double   anAskPrice  =  MarketInfo(Symbol(),MODE_ASK);
                   double   anOpenPrice =  OrderOpenPrice();
                   double   aNewTpPrice =  OrderTakeProfit();
                   double   aCurrentSL  =  OrderStopLoss();
                   double   aNewSLPrice =  anOpenPrice;
                   double   pnlPoints   =  (anOpenPrice - anAskPrice)/_Point;
                   double   stopPoints  =  (aNewSLPrice - anAskPrice)/_Point;
                   int      stopLevel   =  int(MarketInfo(Symbol(),MODE_STOPLEVEL));
                   int      aTicket     =  OrderTicket();
                   if(OrderType()== OP_SELL)
                   if(stopPoints >= stopLevel)
                   if(pnlPoints >= breakeven)
                   if(aNewSLPrice != aCurrentSL)
                   if(aTicket > 0)
                      {
                      SellMod = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(aNewSLPrice,Digits),NormalizeDouble(aNewTpPrice,Digits),0,sellcolor);
                      SendMail("Notification of Order Modification for Ticket#"+IntegerToString(OrderTicket(),10),"Good news! Order Ticket#"+IntegerToString(OrderTicket(),10)+"has been changed to breakeven");
                      }
                   }
                }

交易算法交易mql4 metatrader4

shareeditdeleteflag

刚刚编辑

2天前问过

托德吉尔贝 264

您可能想知道,StackOverflow不会提升重复的问题。 (见

3 个答案:

答案 0 :(得分:1)

除满足MQL4语法规则外,还有更多条件:

第一个隐患是数字四舍五入问题。

MetaQuotes,Inc。建议尽可能将浮动值标准化为适当的价格表示。

因此,如果价格进入服务器端指令 { OrderSend(), OrderModify(), ... } ,则始终准备此类aPriceDOMAIN值<通过调用 NormalizeDouble( ... , _Digits ) ,在标准化价格触及任何服务器端指令调用之前。

可能听起来很天真,但这个可以帮助您解决服务器端拒绝问题。

在常规基础上将NormalizeDouble()次来电添加到您的代码中作为救生衣。

第二,即使是更好的隐患也在 STOP_ZONE -s和 FREEZE_ZONE -s < / p>

虽然不能直接看到,但任何经纪人都在各自的条款和条款中设置。条件这些参数。

在实践中,这意味着,如果您指示{ OrderSend() | OrderModify() } 设置 / 移动 aPriceDOMAIN级别设置得太近当前实际 Ask / Bid (违反经纪人禁止的STOP_ZONE

删除/修改已设置且现在已经设置的TP或SL的aPriceDOMAIN级别,在距离实际 FREEZE_ZONE / <的经纪人禁止Ask范围内strong> Bid ,这样的说明将无法成功接受并执行。

因此,除了拨打NormalizeDouble()之外,随着价格的变动,总是等待一段时间。#34;远&#34;足够并定期检查是否违反了禁止的STOP_ + FREEZE_区域,然后在您的指定项目的订单管理部分进行任何修改。

无论如何,欢迎来到MQL4

的狂野世界

Update: 虽然StackOverflow不是Do-a-Homework网站,但我想提出一些解决方案:

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()
                                        }
      }
}

答案 1 :(得分:0)

问题出在您对内置 OrderModify() 功能的调用中。

OrderStopLoss() == OrderModify() 将评估为 false ,从 == 开始评估为0是一个比较运算符。

OrderStopLoss() 是对另一个内置函数(不是变量)的调用,您无法保存任何内容,因此 OrderStopLoss() = 4 也不会工作。

  

来自 MQL4 文档:

bool  OrderModify( int        ticket,      // ticket 
                   double     price,       // price 
                   double     stoploss,    // stop loss 
                   double     takeprofit,  // take profit 
                   datetime   expiration,  // expiration 
                   color      arrow_color  // color 
                   );

如果您的情况如下,假设 ModBuy 已在代码中的某处定义:

ModBuy = OrderModify(  OrderTicket(),      // <-ticket from record OrderSelect()'d
                       OrderOpenPrice(),   // <-price  from current record
                       OrderOpenPrice(),   // <-price  from current record
                       OrderTakeProfit(),  // <-TP     from current record
                       0,                  // ( cannot set P/O expiration for M/O )
                       buycolor            // ( set a color for a GUI marker )
                       );

或者您可以使用任何其他有效值而不是第二个 OrderOpenPrice() 来设置新的止损。

答案 2 :(得分:0)

我真的很抱歉,我是Stackoverflow的新手,这是我现在修改过的代码,基于每个人的评论&amp;推荐

$this->db->like($keyword);