Как отобразить пользовательский индикатор на графике тестера стратегий

 

Как отобразить пользовательский индикатор на графике тестера стратегий который открывается в конце тестирования или в визуализаторе?

Мастером создаю эксперт по сигналам встроенного Moving Average - после тестирования на графике рисуется индикатор, делаю тоже самое со своим индикатором - он не рисуется (причем его даже нет в списке индикаторов графика).

Если просто перетащить мой индикатор на график - он нормально работает (то есть он рабочий). Модуль сигналов сделал по образцу SignalMA.mqh , сгенерировал советник - он компилируется без ошибок и при тестировании не выдает никаких ошибок.

Для контроля правильности установки ордеров советником очень желательно видеть индикатор (причем в том виде который использовался советником, при наложении - индикатор считается заново - другие показания)

Можно ли это реализовать методом AddToChart ? (вычитал в справке), если да то приведите пожалуйста пример как это делается.



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

Там бы надо добавить описание взаимодействия модулей для мастера, а то без статей не напишешь даже модуля сигналов (да и то статья устарела).

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • 2009.11.23
  • Андрей
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
 
Lyuk:

Как отобразить пользовательский индикатор на графике тестера стратегий который открывается в конце тестирования или в визуализаторе?


Вот тут мне отвечали на вопрос про визуализатор - https://www.mql5.com/ru/forum/4000/page4#comment_81320.
Визуализация тестирования (вопросы, пожелания, баги)
Визуализация тестирования (вопросы, пожелания, баги)
  • www.mql5.com
Объекты и индикаторы (как и раньше)2.
 

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

Разобрался с методом AddToChart - к сожалению он существует только в справке, в коде класса он не реализован, видимо предлагается написать его самим, но в справке не слова об этом.

Чтобы нарисовать индикатор без пересчета думаю надо скопировать и записать его буфер, а после прогона эксперта в тестере по этим данным его нарисовать. Осталось придумать как это реализовать.

 
Lyuk:

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

Конечно, пересчитывается - вам же нужен посчитанный индюк, а не пустое окошко. В общем, я не вижу здесь разницы в поведении МТ4 (с индюком, построенным "как-бы" из эксперта) и МТ5 с настроенным шаблоном.
 
Lyuk:

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

Те кто программируют на паскале или C++ просто не понимают как тут все слооооожноооо..... я например :) Ацкий взрыв мозга. Нельзя сделать даже так:

MqlParam params[2][4], param[4];
param=params[2];//invalid array access - бред!

ArrayCopy тоже не годиться. Реализация массивов в MQL просто убога. Куча дополнительных классов которые прыгают с бубном вокруг массивов добавляя им стандартных возможностей. Код становится плохо читаемым + груда лишних операций.

TO All: Можно установить классу свойство в качестве массива? как обращаться к его элементам?

 
Bonifacy:

...

TO All: Можно установить классу свойство в качестве массива? как обращаться к его элементам?

Это как?

Может быть переменная разделе public, она будет видна в списке, можно будет с ней работать. Раз перменная, значит и массив может быть.

 
Integer:

Это как?

Может быть переменная разделе public, она будет видна в списке, можно будет с ней работать. Раз перменная, значит и массив может быть.

В нормальном ООП так и есть, но не тут. Я так и не разобрался как сделать свойство класса из массива. Напишите пару строк кода если это возможно реализовать.
 
Bonifacy:

Те кто программируют на паскале или C++ просто не понимают как тут все слооооожноооо..... я например :) Ацкий взрыв мозга. Нельзя сделать даже так:

param=params[2];//invalid array access - бред!

знаток с++?  и где в нем так можно сделать?

в с++ на ваше предложение будет ошибка изменения левосторонним оператором.


TO All: Можно установить классу свойство в качестве массива?

(с) Ацкий взрыв мозга

вам это ?

class  A
{
   int arr[]; // свойство класса в качестве массива
}
 
sergeev:

знаток с++?  и где в нем так можно сделать?

в с++ на ваше предложение будет ошибка изменения левосторонним оператором.


(с) Ацкий взрыв мозга

вам это ?

Нет дельфи, на паскале так можно сделать. На си утверждать не буду.

То, что в класс вставить переменную массива можно - это ясно, но как к ней обращаться через Public свойства?

Вроде простая задача на пять строк максимум: создать 4 индикатора (SMA) и бросить их на график, красиво разукрасить.

Логично было бы использовать класс стандартной библиотеки CIndicators... думаю напишу такой код: 

CIndicators Indicators;
MqlParam params[4][4];
//--тут заполнение массива параметров
//....
//--заполнили

for(i=0;i<4;i++)
{
  Indicators.Create(_Symbol, _Period, IND_MA, 4, params[i]);//компилятор выдаст ошибку invalid array access, да и фиг с ним обойдемся без нормального 
                                                             //цикла напишем километр кода.
};
//--пытаемся обратиться к каждому индикатору опять же:
for(i=0;i<4;i++)
  Indicators.At(i).AddToChart(0, 0);//Стоп! At вернет указатель на CObject! Нужно привести его к типу. А как, а никто не знает даже справочник :) 
                           //Не говоря уже о том, как корректно определить тип объекта в данном случае получится (CiMA), но в общем случае это не всегда известно.
//--
 
Bonifacy:

Нет дельфи, на паскале так можно сделать. На си утверждать не буду.

То, что в класс вставить переменную массива можно - это ясно, но как к ней обращаться через Public свойства?

Вроде простая задача на пять строк максимум: создать 4 индикатора (SMA) и бросить их на график, красиво разукрасить.

Логично было бы использовать класс стандартной библиотеки CIndicators... думаю напишу такой код: 

class  A
{
   private:   
   public:
   int a2[]; 
};

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
   
   A a;
   
   a.a2... 

   
  }
Обращаться как обычно - написать "a", поставить точку, откроется список.
 
Integer:
Обращаться как обычно - написать "a", поставить точку, откроется список.
:) это понятно, но я говорю про класс CIndicator, который является наследником CArrayObj (глянте его реализацию). И обратится к массиву напрямую нельзя, т.к. он объявлен в секции Private. Чтение только используя функцию At, а запись Insert. At выдаст указатель на CObject, но не на CIndicator или его потомка. Необходимо приведение типов