Учусь писать в MetaEditor

 

Хочу научиться писать советников в MetaEditor.

Для практики решил сваять простого советника на основе одного индикатора.

Индикатор АС  Сигналы которые он транслирует в советник описаны здесь

Берем для примера сигнал "Значение индикатора ниже 0 и оно растет на анализируемом баре и двух предыдущих.

Сигнал АС на покупку 

 

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

Так оно и должно быть на самом деле! 

При тестировании - у меня сделки происходят на предыдущем баре, а то и раньше, в тот момент когда сигнал ещё не сформировался.

Ниже на рисунке красным значком отмечена сделка которой нет описания в Сигналах индикатора Accelerator Oscillator и вообще это не сигнал АС. 

Если даже предположить что советник дает сигнал на покупку по текущему бару, что тоже неправильно, то, нет такого сигнала "Два растущих столбца АС ниже нулевой отметки"

 

Тестирование Эксперта 

 

Помогите разобраться в чем причина! 

 

Ещё вопрос.

Какими теоретически должны быть значения параметров

Signal_ThresholdOpen и Signal_ThresholdClose если в голосовании принимает участие один индикатор. Вес его у меня задан как 1.0

Оптимизацией я подобрал 60 и 13, хотя там получается довольно широкий диапазон параметров с одним и тем же выхлопом по балансу.

Можно ли считать эти параметры корректными при наличии одного индикатора у советника?

Можно ли считать эти параметры корректными при наличии ситуации описанной в первом посте ветки? 

 

 
IvanIvanov:

Ещё вопрос.

Какими теоретически должны быть значения параметров

Signal_ThresholdOpen и Signal_ThresholdClose если в голосовании принимает участие один индикатор. Вес его у меня задан как 1.0

Оптимизацией я подобрал 60 и 13, хотя там получается довольно широкий диапазон параметров с одним и тем же выхлопом по балансу.

Можно ли считать эти параметры корректными при наличии одного индикатора у советника?

Можно ли считать эти параметры корректными при наличии ситуации описанной в первом посте ветки? 

 

Свой исходник приложите пожалуйста.
 
uncleVic:
Свой исходник приложите пожалуйста.

Прилагаю исходник

Предполагаю что произошла путаница,

Мне необходимо применить сигналы АС по Уильямсу(В МТ5 они даже выделены как Индикаторы Уильямса), но по Уильямсу - нет такого сигнала "Изменение цвета индикатором" 

Всего у него три сигнала на покупку и три на продажу - они зеркальны

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

Внимание! Рассмотрение данного кода потеряло свою актуальность в связи с вскрывшимися обстоятельствами по формированию сигналов АС, смотри посты ниже. 

//+------------------------------------------------------------------+
//|                                                         AACC.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalAC.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedMargin.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string Expert_Title           ="AACC"; // Document name
ulong        Expert_MagicNumber     =92;     //
bool         Expert_EveryTick       =false;  //
//--- inputs for main signal
input int    Signal_ThresholdOpen   =60;     // Signal threshold value to open [0...100]
input int    Signal_ThresholdClose  =13;     // Signal threshold value to close [0...100]
input double Signal_PriceLevel      =0.0;    // Price level to execute a deal
input double Signal_StopLevel       =0.0;   // Stop Loss level (in points)
input double Signal_TakeLevel       =0.0;   // Take Profit level (in points)
input int    Signal_Expiration      =48;      // Expiration of pending orders (in bars)
input double Signal_AC_Weight       =1.0;    // Accelerator Oscillator M30 Weight [0...1.0]
//--- inputs for money
input double Money_FixMargin_Percent=10.0;   // Percentage of margin
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),PERIOD_M30,Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }
//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalAC
   CSignalAC *filter0=new CSignalAC;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.Period(PERIOD_M30);
   filter0.Weight(Signal_AC_Weight);
//--- Creation of trailing object
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Set trailing parameters
//--- Creation of money object
   CMoneyFixedMargin *money=new CMoneyFixedMargin;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Set money parameters
   money.Percent(Money_FixMargin_Percent);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(-8);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-9);
     }
//--- ok
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+


 

Основной вопрос: "Возможна ли коррекция работы индикаторов на уровне разработчиков, чтобы они были скорректированы в самом терминале по умолчанию или придется городить собственные индикаторы по Уильямсу?" Поскольку в том виде как они заложены сейчас в терминале, мягко выражаясь - они не совсем адекватны! Как минимум АС - остальные буду смотреть по мере. Мой интерес в этом - торгую по Уильямсу, создаю экперта по Уильямсу. 

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

Описание сигналов АС по Уильямсу.

Сигнал первый "Три последовательных бара"

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

Отсюда Второй вопрос: Правильно ли я понимаю, что, если сигналов в модуле три,  то если двум сигналам задать вес 0, а одному 100 - то будет отрабатывать только тот который со значением 100? Так можно было бы отследить работу каждого сигнала...

Например в моем случае

void CSignalAC::CSignalAC()
  {
//--- setting default "weights" of the market models
   m_pattern_0=90;           // model 0 
   m_pattern_1=50;           // model 1 
   m_pattern_2=30;           // model 2 
  }

  Если 

m_pattern_0=0;

m_pattern_1=0;

m_pattern_2=100; 

 То в эксперте будет отрабатываться только паттерн 2?


 

ОПИСАНИЕ СИГНАЛОВ АС ПО УИЛЬЯМСУ 

"Три последовательных бара"


I Сигнал на покупку "Три последовательных бара"

Общее описание

Первое - Индикатор находится ниже своей нулевой линии

Второе - Имеем три подряд столбца зеленого цвета. Столбец отмеченный красным крестиком, по определению, будет красного цвета.

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

 Сигнал АС Три последовательных бара на покупку

 

II Сигнал на продажу "Три последовательных бара"

Общее описание

Первое - Индикатор находится выше своей нулевой линии

Второе - Имеем три подряд столбца красного цвета. Столбец отмеченный красным крестиком, по определению, будет зеленого цвета.

Третье - Сигнал инициируется после завершения бара соответствующего столбику три. Бар на котором совершается сделка вниз отмечен на графике, это следующий бар таймфрейма после бара соответствующего столбику три индикатора.

Сигнал АС на продажу Три последовательных столбца 

 



"Два последовательных бара" 

 

I Сигнал на покупку "Два последовательных бара"

Общее описание

Первое - Индикатор находится выше своей нулевой линии

Второе - Имеем два подряд столбца зеленого цвета. Столбец отмеченный красным крестиком, по определению, будет красного цвета.

Третье - Сигнал инициируется после завершения бара соответствующего столбику два. Бар на котором необходимо совершить покупку отмечен на рисунке.

Сигнал АС на покупку Два последовательных бара 

 

 II Сигнал на продажу "Два последовательных бара"

Общее описание

Первое - Индикатор находится ниже своей нулевой линии

Второе - Имеем два подряд столбца красного цвета цвета. Столбец отмеченный красным крестиком, по определению, будет зеленого цвета.

Третье - Сигнал инициируется после завершения бара соответствующего столбику два. Бар на котором необходимо совершить продажу отмечен на рисунке.

Сигнал АС на продажу Два последовательных бара 

 


 

"Пересечение нулевой линии"

Описания этого сигнала нет в Описании АС на 18.08.2011 

I Сигнал на покупку "Пересечение нулевой линии"

Общее описание

Первое - Первый бар обязательно красный, (Локальный минимум на АС) 

Второе - Второй бар находится ниже нулевой линии индикатора и он выше первого бара, этот бар зеленый.

Третье - Третий бар находится выше нулевой линии индикатора, соответственно выше двух предыдущих и соответственно он зеленый. 

Четвертое - Сигнал инициируется после завершения бара соответствующего столбику три. Бар на котором необходимо совершить покупку отмечен на рисунке. 

Сигнал АС на покупку Пересечение нулевой линии

II Сигнал на продажу "Пересечение нулевой линии"

Общее описание

Первое - Первый бар обязательно зеленый, (Локальный максимум на АС) 

Второе - Второй бар находится выше нулевой линии индикатора и он ниже первого бара, этот бар красный.

Третье - Третий бар находится ниже нулевой линии индикатора, соответственно ниже двух предыдущих и соответственно он красный. 

Четвертое - Сигнал инициируется после завершения бара соответствующего столбику три. Бар на котором необходимо совершить покупку отмечен на рисунке. 

 

Сигнал АС на продажу Пересечение нулевой линии 

 

Собственно вот это все, три сигнала АС по Уильямсу, покупка и продажа это зеркальные сигналы, итого шесть вариантов.

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

 

 
IvanIvanov:

Основной вопрос: "Возможна ли коррекция работы индикаторов на уровне разработчиков, чтобы они были скорректированы в самом терминале по умолчанию или придется городить собственные индикаторы по Уильямсу?" Поскольку в том виде как они заложены сейчас в терминале, мягко выражаясь - они не совсем адекватны! Как минимум АС - остальные буду смотреть по мере. Мой интерес в этом - торгую по Уильямсу, создаю экперта по Уильямсу. 

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


Коррекция на уровне разработчиков не нужна (по крайней мера в свете Ваших пожеланий). В сигнале есть настройки "значимости" каждой модели:

   //--- methods of adjusting "weights" of market models
   void              Pattern_0(int value)        { m_pattern_0=value;         }
   void              Pattern_1(int value)        { m_pattern_1=value;         }
   void              Pattern_2(int value)        { m_pattern_2=value;         }

(где value число от 0 до 100) и настройка использования моделей:

   void              PatternsUsage(int value)                                 { m_patterns_usage=value;   }

(где value битовая карта используемых моделей). Т.к. в рассматриваемом сигнале три модели, используются три младших бита карты (т.е. диапазон значений от 0 до 7).

 valueМодель 2
Модель 1
 Модель 0
0
не используется
не используетсяне используется
1
не используетсяне используетсяиспользуется
2
не используетсяиспользуетсяне используется
3
не используетсяиспользуетсяиспользуется
4
используетсяне используетсяне используется
5
используетсяне используетсяиспользуется
6
используетсяиспользуетсяне используется
7
используетсяиспользуетсяиспользуется
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
uncleVic:

Коррекция на уровне разработчиков не нужна (по крайней мера в свете Ваших пожеланий). В сигнале есть настройки "значимости" каждой модели:

(где value число от 0 до 100) и настройка использования моделей:

(где value битовая карта используемых моделей). Т.к. в рассматриваемом сигнале три модели, используются три младших бита карты (т.е. диапазон значений от 0 до 7).

 valueМодель 2
Модель 1
 Модель 0
0
не используется
не используетсяне используется
1
не используетсяне используетсяиспользуется
2
не используетсяиспользуетсяне используется
3
не используетсяиспользуетсяиспользуется
4
используетсяне используетсяне используется
5
используетсяне используетсяиспользуется
6
используетсяиспользуетсяне используется
7
используетсяиспользуетсяиспользуется


Вопрос первый, что мне с этой картой делать, в смысле куда чего и с какой целью подставлять?

Мммм с картой вроде разобрался, если я подставляю "6"  то Модель2 используется, Модель1 используется, Модель 0 не используется

Вопрос второй, как быть с моделью(четвертой) отсутствующей в списке моделей индикатора АС?

И не нашел строчки PatternsUsage в SignalAC.mqh 

 
IvanIvanov:

Вопрос первый, что мне с этой картой делать, в смысле куда чего и с какой целью подставлять?

Мммм с картой вроде разобрался, если я подставляю "6"  то Модель2 используется, Модель1 используется, Модель 0 не используется

Вопрос второй, как быть с моделью(четвертой) отсутствующей в списке моделей индикатора АС?

И не нашел строчки PatternsUsage в SignalAC.mqh 

 PatternsUsage в ExpertSignal.mqh (т.е. унаследован от CExpertSignal)

По поводу Модели3, Модели4 и т.д. Устал объяснять про битовые карты, соответствия номеров моделей и битов. Как только появится время пропишу во всех сигналах макроопределения.

Пока так: определившись со значением value для первых трёх моделей (0..2), прибавьте 8 для использования Модели3, 16 для Модели4 и т.д (+(2) в степени <номер модели>).

 

Случайно наткнулся на описание PatternsUsage - спасибо, до этого искал что это в документации - ничего внятного не нашел. Можно же описать нормально, а не как в доках -

"Устанавливает значение параметра "PatternsUsage""

Перевести битовую карту из двоичной системы в десятичную можно просто и легко с помощью стандартного Windows калькулятора в инженерном режиме например нужно использовать две модели (кроме pattern_0) - выбираем в калькуляторе "Bin", набираем "110", выбираем "Dec", полученое число "6" подставляем в PatternsUsage. Тут правда тоже заморочка не отраженная в документации но видимо очевидная для профессиональных программистов - нумерация бит идёт справа налево, а не как удобно (интуитивно) "простым смертным" слева направо.

 

 

Правильно ли я понял, что проблема заключается в следующем:

с одной стороны, начинашкам предлагают что-то типа "Мастера, создающего советник в MQL5",

а с другой стороны - некие "битово-побитовые карты", абсолютно непонятные тем же начинашкам?

- Если так, то налицо стратегическая недоработка "Мастера ML5". И об этом уже, вроде, говорилось.

 
Yedelkin:

- Если так, то налицо стратегическая недоработка "Мастера ML5". И об этом уже, вроде, говорилось.

Имхо. Стратегической недоработки нет. Просто начинающим хочется более тонких настроек. В коде, который использует Мастер, они заложены, но пока не выпущены для использования широкой публикой. A uncleVic  , добрая душа, пытается просветить страждущих.
Причина обращения: