如果止损不为0,ExpertMACD会提高[无效止损]

时间:2017-10-31 19:21:04

标签: mql5

请考虑我刚开始使用MQL5。

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

一切正常,直到2017年7月的数据,之后顾问不再发展,它反复进行0次交易(截图)。在回溯测试的情况下也是如此,2017年7月的数据没有进行任何交易。

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

你能解释一下发生了什么吗?为什么从事整个历史工作的顾问将从2017年7月起停止工作? (我检查了勾选数据,看起来都很好) 为什么取消止损会让它再次进行交易?

enter image description here

P.S。

我注意到顾问在(突然)BTCUSD的传播从2变为13000(是的,没有逗号)时崩溃了,这当然是弄乱了顾问,而且一般来说,并没有这样做。有道理。怎么可能?在这种情况下我该怎么办?我检查了其他经纪人,他们都显示2017年7月出现的差价相同的增长。

深入Alpari网站,我发现the average spread value for BTCUSD确实很高。再次,这怎么可能?为什么会这样呢? (Maybe related to the fork?对我来说毫无意义)

最后,在这种情况下,您如何修改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的客户服务人员回答说:

  

Spread在我们网站的规范中正确显示。点数后面的3位数指定了点差。买卖价差约19美元。

因此,19094年的传播实际上是19.094。

2 个答案:

答案 0 :(得分:2)

尝试调试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
              );

答案 1 :(得分:2)

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
                            )
      ){ ... }