4

请考虑我刚刚开始使用 MQL5。

只是为了学习,我在 Alpari-MT5-Demo 账户的 BTCUSD H1 货币对上运行了 ExpertMACD 上的 MT5 EA 优化(预装在 MT5 中)。

一切正常,直到 2017 年 7 月的数据,此后顾问不再发展,它一遍又一遍地进行 0 次交易(屏幕截图)。在回测的情况下也是如此,从 2017 年 7 月的数据来看,它没有进行任何交易。

在测试日志中,出现错误[invalid stops]。如果我从要优化的输入中取消选择止损水平并将默认值设置为 0,那么一切都会再次运行,尽管不再使用止损。

你能解释一下发生了什么吗?为什么一个在整个历史上工作的顾问从 2017 年 7 月起停止工作?(我检查了分时数据,一切正常) 为什么取消止损会使其再次进行交易?

在此处输入图像描述

附言

我注意到,当 BTCUSD 的价差(突然)从 2 变为 13000(是的,没有逗号)时,顾问崩溃了,这当然会弄乱顾问,而且通常没有意义。这怎么可能?在这种情况下我该怎么办?我检查了其他经纪人,他们都显示 2017 年 7 月某处出现的点差增加相同。

深入了解 Alpari 网站,我发现BTCUSD 的平均点差值确实很高。再说一次,这怎么可能?为什么会这样?(也许与叉子有关?这对我来说毫无意义)

最后,在这种情况下,您将如何修改 ExpertMACD 以正确下单,包括合理的止损?

ExpertMACD的代码如下:

//+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
#include <Expert\Signal\SignalMACD.mqh>
#include <Expert\Trailing\TrailingNone.mqh>
#include <Expert\Money\MoneyNone.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string Inp_Expert_Title            ="ExpertMACD";
int          Expert_MagicNumber          =10981;
bool         Expert_EveryTick            =false;
//--- inputs for signal
input int    Inp_Signal_MACD_PeriodFast  =12;
input int    Inp_Signal_MACD_PeriodSlow  =24;
input int    Inp_Signal_MACD_PeriodSignal=9;
input int    Inp_Signal_MACD_TakeProfit  =50;
input int    Inp_Signal_MACD_StopLoss    =20;
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }
//--- Creation of signal object
   CSignalMACD *signal=new CSignalMACD;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//--- Add signal to expert (will be deleted automatically))
   if(!ExtExpert.InitSignal(signal))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing signal");
      ExtExpert.Deinit();
      return(-3);
     }
//--- Set signal parameters
   signal.PeriodFast(Inp_Signal_MACD_PeriodFast);
   signal.PeriodSlow(Inp_Signal_MACD_PeriodSlow);
   signal.PeriodSignal(Inp_Signal_MACD_PeriodSignal);
   signal.TakeLevel(Inp_Signal_MACD_TakeProfit);
   signal.StopLevel(Inp_Signal_MACD_StopLoss);
//--- Check signal parameters
   if(!signal.ValidationSettings())
     {
      //--- failed
      printf(__FUNCTION__+": error signal parameters");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Creation of trailing object
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Set trailing parameters
//--- Check trailing parameters
   if(!trailing.ValidationSettings())
     {
      //--- failed
      printf(__FUNCTION__+": error trailing parameters");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Creation of money object
   CMoneyNone *money=new CMoneyNone;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-8);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-9);
     }
//--- Set money parameters
//--- Check money parameters
   if(!money.ValidationSettings())
     {
      //--- failed
      printf(__FUNCTION__+": error money parameters");
      ExtExpert.Deinit();
      return(-10);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-11);
     }
//--- succeed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| Function-event handler "tick"                                    |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| Function-event handler "trade"                                   |
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| Function-event handler "timer"                                   |
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

更新

过了一会,Alpari的客服回答:

点差在我们网站的规范中正确显示。点差由点后的 3 位数字指定。买入价和卖出价之间的差价约为 19 美元。

因此,19094 的价差实际上是 19.094。

4

2 回答 2

3

CSampleExpert::LongOpened()函数内部,您可以添加一个块以在传播较大的情况下忽略条目:

double spread = m_symbol.Ask()
              - m_symbol.Bid();            // Spread(); is int, not double

if (  spread >  InpMaxSpread * m_adjusted_point ){
      printf( "%i - spread %.5f is too high!", __LINE__, spread );
      return;
}

和一样ShortOpened()。也不要忘记添加InpMaxSpread到输入中。

至于关于止损的问题——这取决于你的需要,代码中有一个使用止盈的例子。

double stoploss = m_symbol.Bid() - InpStopLoss * m_adjusted_point;

if (  m_trade.PositionOpen( m_symbol,
                            ORDER_TYPE_BUY,
                            InpLots,
                            price,
                            stoploss,
                            tp
                            )
      ){ ... }
于 2017-11-04T18:43:22.303 回答
3

尝试调试 EA。

您的日志将有助于理解问题,也许就是这样stop_loss_in_pips = 0suggested_stoploss = OrderOpenPrice() - stop_loss_in_pips * pip_Size = OrderOpenPrice()离市场太近了

PrintFormat( "%i %s %s - stoploss price before sending an order at %.5f is %.5f",
              __LINE__,
              __FUNCSIG__,
              __FILE__,
              orderSendPrice,
              orderStopLossPrice
              );
于 2017-11-01T13:14:24.337 回答