Обсуждение статьи "Как написать модуль торговых сигналов для Мастера MQL5"

 

Опубликована статья Как написать модуль торговых сигналов для Мастера MQL5:

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

Рисунок 1. Структура базового класса CExpert

Автор: MetaQuotes

 
Господа Товарищи! Прочитал статью! Сделал все как в ней написано, ну думаю сейчас попаду в рай. Ан нет -  Мастер МКЛ 5 моего файла с сигналами не увидел. Я еще раз все проверил, все заново сделал, еще раз проверил, но сигнала в мастере создания советников не видно.  Прикладываю свой файл который я создал в соответствии с рекомендациями в статье. Помогите разобраться что я сделал не так или наоборот автор статьи чего-то важное не дописал, из-за чего и не срастается никак. Короче помогите чем можете.
Файлы:
 
Tincup:
Господа Товарищи! Прочитал статью! Сделал все как в ней написано, ну думаю сейчас попаду в рай. Ан нет -  Мастер МКЛ 5 моего файла с сигналами не увидел. Я еще раз все проверил, все заново сделал, еще раз проверил, но сигнала в мастере создания советников не видно.  Прикладываю свой файл который я создал в соответствии с рекомендациями в статье. Помогите разобраться что я сделал не так или наоборот автор статьи чего-то важное не дописал, из-за чего и не срастается никак. Короче помогите чем можете.


Описатель класса - важная часть исходного текста.

В Вашем описателе две явные ошибки. Одна из них не даёт обнаружить сигнал, т.к. указан несуществующий ENUM. Вторая создаст проблемы при компиляции (неверно указано имя параметра).

Ещё одна тонкость. Перед ключевым словом, в каждой строке описателя должен быть только один пробел. (я думаю в будущем это ограничение будет снято, а пока так)

// wizard description start
//+---------------------------------------------------------------------------+
//| Description of the class                                                |
//| Title=Сигнал пересечению ценой скользящей средней                     |
//| Type=Signal                                                             |
//| Name=Sample                                                             |
//| Class=CSampleSignal                                                     |
//| Page=                                                                   |
//| Parameter=PeriodMA,int,12                                                |
//| Parameter=ShiftMA,int,0                                                  | было SniftMA
//| Parameter=MethodMA,ENUM_MA_METHOD,MODE_EMA                               |
//| Parameter=AppliedMA,ENUM_APPLIED_PRICE,PRICE_CLOSE                      | было ENUM_MA_APLLIED_PRICE
//| Parameter=Limit,double,0.0                                               |
//| Parameter=StopLoss,double,50.0                                           |
//| Parameter=TakeProfit,double,50.0                                         |
//| Parameter=Expiration,int,10                                              |
//+---------------------------------------------------------------------------+
// wizard description end


Далее по тексту.

Отсутствие конструктора - это плохо. Вы должны инициализировать члены-данные значениями по-умолчанию. Ведь в общем случае, метод установки какого-либо параметра может и не вызываться.

И последнее, неверно описаны методы

   void     LimitMA (int value)                    {m_limit=value;}
   void     StopLoss (int value)                   {m_stop_loss=value;}
   void     TakeProfit (int value)                 {m_take_profit=value;}

нужно

   void     LimitMA (double value)                    {m_limit=value;}
   void     StopLoss (double value)                   {m_stop_loss=value;}
   void     TakeProfit (double value)                 {m_take_profit=value;}



 

Конечно большое спасибо за ответ. Все исправил все получилось.

Но при компиляции уже самого эксперта он мне выдал ошибку, которую я бы сам не нашел нашел её компилятор. Вы кстати когда мне отвечали видимо сами для себя незаметно её исправили, но в первоначальном тексте статьи она есть. 

в статье

  void               Limit(double value)                 { m_limit=value;                  }

в ответе на мою просьбу о помощи

  void               LimitМА(double value)                 { m_limit=value;}

отсутствие МА в файле сигнала при компиляции уже самого эксперта после его удачной генерации выдает следующую ошибку 

'Limit' - member function is not defined    123456.mq5    77    11
1 error(s), 0 warning(s)        2    1

следуя в моем по крайней мере случае в строку 77 видим

   signal.Limit(Inp_Signal_Sample_Limit);

вставляем МА после слова Limit

ошибка в тексте эксперта исчезает.

Если я не прав то извините. Я не профессионал.  

 
Да и соответственно в описателе тоже должно стоять не Limit, а LimitМА

 

И еще: вот эту ошибку выдает несмотря ни на что:

'--' - l-value required    1234.mq5    31    57

'--' - l-value required    1234.mq5    31    59
'--' - l-value required    1234.mq5    31    61
'--' - l-value required    1234.mq5    31    63
'--' - l-value required    1234.mq5    31    65
'--' - l-value required    1234.mq5    31    67
'--' - l-value required    1234.mq5    31    69
'--' - l-value required    1234.mq5    31    71
'--' - l-value required    1234.mq5    31    73
'--' - l-value required    1234.mq5    31    75
'--' - l-value required    1234.mq5    31    77
'--' - l-value required    1234.mq5    31    79
'--' - l-value required    1234.mq5    31    81
'--' - l-value required    1234.mq5    31    83
'--' - l-value required    1234.mq5    31    85
'--' - l-value required    1234.mq5    31    87
'--' - l-value required    1234.mq5    31    89
'--' - l-value required    1234.mq5    31    91
'--' - l-value required    1234.mq5    31    93
'--' - l-value required    1234.mq5    31    95
'--' - l-value required    1234.mq5    31    97
'--' - l-value required    1234.mq5    31    99
'--' - l-value required    1234.mq5    31    101
'--' - l-value required    1234.mq5    31    103
'--' - l-value required    1234.mq5    31    105
'--' - l-value required    1234.mq5    31    107
'--' - l-value required    1234.mq5    31    109
'--' - l-value required    1234.mq5    31    111
'--' - l-value required    1234.mq5    31    113
'--' - l-value required    1234.mq5    31    115
'-' - operand expected    1234.mq5    31    117
'Inp_Signal_Sample_Expiration' - undeclared identifier    1234.mq5    77    22
32 error(s), 0 warning(s)        33    1

заходим в 31 строку советника видим следующее

input double             Inp_Signal_Sample_StopLoss  =50.0;
input double             Inp_Signal_Sample_TakeProfit=50.0;
input int                Inp_Signal_Sample_Expiration=10-------------------------------------------------------------;
//--- inputs for money
input double             Inp_Money_FixLot_Percent    =10.0;

input double             Inp_Money_FixLot_Lots       =0.1;

Убираем хвост в виде пунктирной линии идущей от 10 и все ошибки исчезают.

эксперт готов к работе и оптимизации.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 
Tincup:
Да и соответственно в описателе тоже должно стоять не Limit, а LimitМА

Да, LimitМА я просмотрел.

Вообще, на будущее... При создании описателя класса, активнее пользуйтесь копипастом, т.к. компилятор не проверяет коментарии (из которых состоит описатель), а совпадение имён методов и имён параметров описателя важно. Это "вылезает" только при компиляции эксперта и вызывает отрицательные эмоции. Хотя, как видите, тоже ни чего смертельного.

 
Tincup:

И еще: вот эту ошибку выдает несмотря ни на что:

'--' - l-value required    1234.mq5    31    57

Эта ошибка возникает из-за длины строки описателя класса. После праздников будем разбираться.
Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 

Доброго времени суток!

  1. В прикрепленном к статье файле опечатка, если я ничего не путаю! В описании функции CheckOpenLong в строках для рассчета переменных sl и tp нужно поменять знаки на противоположные.
  2. Изменил фунцкию CheckOpenLong следующим образом:
    bool CSampleSignal::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
      {
    
       Print("Close(0)=",DoubleToString(Close(0),5)," Close(1)=",DoubleToString(Close(1),5));
       Print("Open(0)=",DoubleToString(Open(0),5)," Open(1)=",DoubleToString(Open(1),5));
       Print("MA(0)=",DoubleToString(MA(0),5)," MA(1)=",DoubleToString(MA(1),5));
    
       return(false);
       
      }
    т.е. она должна просто выводить в журнал значиния Close, Open и MA за последний и предыдущий бар. Так вот если значние советника EveryTick равно  false, то всё работает как надо, если же true - вместо значений выводятся нули! Подскажите в чем дело? Что я делаю не так???

Спасибо! 

 

 
lVlaxim:

Доброго времени суток!

  1. В прикрепленном к статье файле опечатка, если я ничего не путаю! В описании функции CheckOpenLong в строках для рассчета переменных sl и tp нужно поменять знаки на противоположные.
  2. Изменил фунцкию CheckOpenLong следующим образом:т.е. она должна просто выводить в журнал значиния Close, Open и MA за последний и предыдущий бар. Так вот если значние советника EveryTick равно  false, то всё работает как надо, если же true - вместо значений выводятся нули! Подскажите в чем дело? Что я делаю не так???

Спасибо! 

 

По п.1, спасибо за найденную ошибку. Будет исправлено.

По п.2, была небольшая несогласованность с MQL5, исправлено. Должно появиться в ближайшей сборке.

 
Скажите пожалуйста а зачем нужен основной класс CExpertSignal? Ну предположим засуну я в него коллекцию индикаторов, но на каком алгоритме он будет принимать решение об открытии сделки? Если всё делают его потомки, то зачем делать их (потомков) его потомками? Почему их нельзя сделать базовыми классами?
Причина обращения: