Мастер Metatrader 5 не может распознать мой пользовательский модуль торговых сигналов

Я пишу этот вопрос, потому что знаю ответ, и никто не писал об этом раньше.

Проблема заключалась в реализации пользовательского модуля торговых сигналов на основе пользовательского индикатора в Metatrader 5.

Это было описание волшебника. Список параметров должен быть строго описан с помощью Parameter=<name of the getter method>,<type>,<default value>,<description>. Описание можно опустить.

// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=KeltnerChannelSignal                                       |
//| Type=SignalAdvanced                                              |
//| Name=KeltnerChannel                                              |
//| Class=CKeltnerChannelSignal                                      |
//| Page=                                                            |
//| Parameter=Timeframe,int,12,PERIOD_CURRENT,Timeframe              |
//| Parameter=MAPeriod,int,20,MA period                              |
//| Parameter=MAMethod,enMaModes,ma_Simple,MA smoothing method       |
//| Parameter=MAVisible,enMaVisble,mv_Visible, MA visible?           |
//| Parameter=PriceType,enPrices,pr_typical,Price type               |
//| Parameter=ColorSlopeUp,color,clrGold,Color for slope up          |
//| Parameter=ColorSlopeDown,color,clrGold,Color for slope down      |
//| Parameter=ATRPeriod,int,20                                       |
//| Parameter=ATRMultiplier,double,2.0                               |
//| Parameter=ATRMode,enAtrMode,atr_Rng                              |
//| Parameter=ViewBars,enCandleMode,cm_None                          |
//| Parameter=Interpolate,bool,true                                  |
//+------------------------------------------------------------------+
// wizard description end

Проблема заключалась в том, что мастер не распознает ни один формальный модуль торговых сигналов, который имеет один или несколько настраиваемых параметров перечисления.


person Marco Consiglio    schedule 18.11.2019    source источник


Ответы (1)


Решение, которое я предлагаю, состоит в том, чтобы привести все пользовательские перечисления к типу int, а затем преобразовать их обратно к исходному типу перечисления.

Вот решение:

// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=KeltnerChannelSignal                                       |
//| Type=SignalAdvanced                                              |
//| Name=KeltnerChannel                                              |
//| ShortName=KeltnerChannel                                         |
//| Class=CKeltnerChannelSignal                                      |
//| Page=signal_envelopes                                            |
//| Parameter=Timeframe,int,12,PERIOD_CURRENT,Timeframe              |
//| Parameter=MAPeriod,int,20,MA period                              |
//| Parameter=MAMethod,int,0,MA smoothing method                     |
//| Parameter=MAVisible,int,0,MA visible?                            |
//| Parameter=PriceType,int,6,Price type                             |
//| Parameter=ColorSlopeUp,color,clrGold,Color for slope up          |
//| Parameter=ColorSlopeDown,color,clrGold,Color for slope down      |
//| Parameter=ATRPeriod,int,20,ATR period                            |
//| Parameter=ATRMultiplier,double,2.0,ATR multiplier                |
//| Parameter=ATRMode,int,0,ATR mode                                 |
//| Parameter=ViewBars,int,0,View bars as:                           |
//| Parameter=Interpolate,bool,true,Interpolate data?                |
//+------------------------------------------------------------------+
// wizard description end

Приведите все параметры типа перечисления к int.

//+------------------------------------------------------------------+
//| Prepare the Keltner Channel parameters array                     |
//+------------------------------------------------------------------+
void CKeltnerChannelSignal::PrepareParameters()
{
   ArrayResize(KeltnerChannelParameters, 13);
   KeltnerChannelParameters[0].type = TYPE_STRING;
   KeltnerChannelParameters[0].string_value = KeltnerChannelFile;
   //1  Time frame
   KeltnerChannelParameters[1].type = TYPE_INT;
   KeltnerChannelParameters[1].integer_value = (int)m_timeframe;

   //2  Moving average period
   KeltnerChannelParameters[2].type = TYPE_INT;
   KeltnerChannelParameters[2].integer_value = m_ma_period;

   //3  Moving average type
   KeltnerChannelParameters[3].type = TYPE_INT;
   KeltnerChannelParameters[3].integer_value = (int)m_ma_method;

   //4  Midlle line visible?
   KeltnerChannelParameters[4].type = TYPE_INT;
   KeltnerChannelParameters[4].integer_value = (int)m_ma_visible;

   //5  Moving average price type
   KeltnerChannelParameters[5].type = TYPE_INT;
   KeltnerChannelParameters[5].integer_value = (int)m_price_type;

   //6  Color for slope up
   KeltnerChannelParameters[6].type = TYPE_INT;
   KeltnerChannelParameters[6].integer_value = (int)m_color_slope_up;

   //7  Color for slope down 
   KeltnerChannelParameters[7].type = TYPE_INT;
   KeltnerChannelParameters[7].integer_value = (int)m_color_slope_down;

   //8  Range period
   KeltnerChannelParameters[8].type = TYPE_INT;
   KeltnerChannelParameters[8].integer_value = m_atr_period;

   //9  Range multiplier
   KeltnerChannelParameters[9].type = TYPE_DOUBLE;
   KeltnerChannelParameters[9].double_value = m_atr_multiplier;

   //10 Range calculating mode
   KeltnerChannelParameters[10].type = TYPE_INT;
   KeltnerChannelParameters[10].integer_value = (int)m_atr_mode;

   //11 View bars as:
   KeltnerChannelParameters[11].type = TYPE_INT;
   KeltnerChannelParameters[11].integer_value = (int)m_view_bars;

   //12 Interpolate mtf data
   KeltnerChannelParameters[12].type = TYPE_BOOL;
   KeltnerChannelParameters[12].integer_value = m_interpolate;
}

Теперь мастер распознает модуль торговых сигналов, и я могу сгенерировать советник на основе этого модуля.

Наконец, вернитесь к правильному типу перечисления в сгенерированном эксперте, как в этом коде:

//--- Set filter parameters
   filter0.Timeframe((ENUM_TIMEFRAMES)Signal_KeltnerChannel_Timeframe);
   filter0.MAPeriod(Signal_KeltnerChannel_MAPeriod);
   filter0.MAMethod((enMaModes)Signal_KeltnerChannel_MAMethod);
   filter0.MAVisible((enMaVisble)Signal_KeltnerChannel_MAVisible);
   filter0.PriceType((enPrices)Signal_KeltnerChannel_PriceType);
   filter0.ColorSlopeUp(Signal_KeltnerChannel_ColorSlopeUp);
   filter0.ColorSlopeDown(Signal_KeltnerChannel_ColorSlopeDown);
   filter0.ATRPeriod(Signal_KeltnerChannel_ATRPeriod);
   filter0.ATRMultiplier(Signal_KeltnerChannel_ATRMultiplier);
   filter0.ATRMode((enAtrMode)Signal_KeltnerChannel_ATRMode);
   filter0.ViewBars((enCandleMode)Signal_KeltnerChannel_ViewBars);
   filter0.Interpolate(Signal_KeltnerChannel_Interpolate);
   filter0.Weight(Signal_KeltnerChannel_Weight);
person Marco Consiglio    schedule 18.11.2019
comment
Подробнее об этой проблеме можно прочитать на форуме mql5. - person Marco Consiglio; 18.11.2019