Как нарисовать индикатор через классы?

 

Хочу создать классы своих индикаторов.

Для начала взял класс индикатора OsMA и попытался нарисовать его, но ничего не получилось :(

#include <Indicators\Oscilators.mqh>

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 Aqua
#property indicator_width1 1

double ExtOsMABuffer[];

CiOsMA _myOsMA;

//-------------------------------------------------------------------------------------------------
void OnInit() {
    _myOsMA.Create(Symbol(),Period(),12,26,9,PRICE_CLOSE);
    _myOsMA.BuffSize(100);
    _myOsMA.Refresh(-1);


    SetIndexBuffer(0,ExtOsMABuffer,INDICATOR_DATA);

    _myOsMA.GetData(0,50,0,ExtOsMABuffer);

}

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

Как рисовать индикаторы обычным способом, хорошо известно, а вот как через классы - что-то туплю :(

 

рисуют индикаторы не классы, а сам терминал. Терминалу для этого надо буфер

А что надо для задания буфера?

- пройтись по всем элементам этого масива и записать в них соответствующие данные от индикатор.

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

В примерах из стандартной библиотеки - все расчеты выполняют известные функции типа iMA или iADX

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

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 
sergeev:

рисуют индикаторы не классы, а сам терминал. Терминалу для этого надо буфер

А что надо для задания буфера?

- пройтись по всем элементам этого масива и записать в них соответствующие данные от индикатор.

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

В примерах из стандартной библиотеки - все расчеты выполняют известные функции типа iMA или iADX

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


ну вот же я вызываю метод класса, который возвращает данные из буфера индикатора в другой буфер:

_myOsMA.GetData(0,50,0,ExtOsMABuffer);

зачем же писать цикл по расчету для каждого бара?

Просто, наверное, есть какой-то нюанс, который не могу уловить :(

Блин, нужен просто маленький пример. В справке по классам вообще примеров нет.

Наверное, разработчики считают, что и так все понятно :)

 
falkov:

ну вот же я вызываю метод класса, который возвращает данные из буфера индикатора в другой буфер:

_myOsMA.GetData(0,50,0,ExtOsMABuffer);

зачем же писать цикл по расчету для каждого бара?

Просто, наверное, есть какой-то нюанс, который не могу уловить :(

Блин, нужен просто маленький пример. В справке по классам вообще примеров нет.

Наверное, разработчики считают, что и так все понятно :)

Самый хороший пример - стандартная библиотека.

Идем в каталог \MQL5\Include\Indicators и смотрим что и как.

PS

Даю подсказку, смотреть нужно начиная с файла Indicator.mqh, а затем любой из интересующих Вас файлов: BillWilliams.mqh, Oscilators.mqh, Trend.mqh и Volumes.mqh.

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 
Interesting:

Самый хороший пример - стандартная библиотека.

Идем в каталог \MQL5\Include\Indicators и смотрим что и как.

PS

Даю подсказку, смотреть нужно начиная с файла Indicator.mqh, а затем любой из интересующих Вас файлов: BillWilliams.mqh, Oscilators.mqh, Trend.mqh и Volumes.mqh.

Да смотрел я там, конечно, оттуда и начал!

Это очень пригодится, когда начну писать свои классы, собственно, уже начал. С классами я имел дело в С++.

Меня интересует очень узкий вопрос: Как нарисовать индикатор через классы??

И нужен всего-лишь маааленький пример этого, т.е. как передать подсчитанные в экземпляре класса данные в буфер индикатора для отрисовки!


 
falkov:

...

И нужен всего-лишь маааленький пример этого, т.е. как передать подсчитанные в экземпляре класса данные в буфер индикатора для отрисовки!


Ничего особенного не нужно, все как обычно - CopyBuffer()

 
falkov:

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

А у Вас и так всё должно работать

#property indicator_chart_window
#include <Indicators\Oscilators.mqh>

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 Aqua
#property indicator_width1 1

double ExtOsMABuffer[];

CiOsMA _myOsMA;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
    _myOsMA.Create(Symbol(),Period(),12,26,9,PRICE_CLOSE);
    _myOsMA.BuffSize(100);
    _myOsMA.Refresh(-1);
    SetIndexBuffer(0,ExtOsMABuffer,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//---
    _myOsMA.GetData(0,50,0,ExtOsMABuffer);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

 

 
DC2008:

А у Вас и так всё должно работать

 

Да, Вы правы!

Просто когда я спрашивал, были выходные, не было потока котировок.

В понедельник с утра взглянул на терминал - а все работает! Двинулся дальше.

 

Я хочу написать класс индикатора, который каким-то рассчитывается в методе Create моего класса. Каким образом мне получить хендл моего индикатора?

Поясню.

Если я создаю экземпляр класса CiOsMA и потом на его основе индикатор OsMA:

CiOsMA _myOsMA;

void OnInit() {
    SetIndexBuffer(0,_adblOsMA,INDICATOR_DATA);
    ArraySetAsSeries(_adblOsMA,true);
    _myOsMA.Create(Symbol(),Period(),12,26,9,PRICE_CLOSE);

...

}

то хендл индикатора m_handle возвращается в методе Create:

bool CiOsMA::Create(string symbol,ENUM_TIMEFRAMES period,int fast_ema_period,int slow_ema_period,int signal_period,int applied) {
   m_handle=iOsMA(symbol,period,fast_ema_period,slow_ema_period,signal_period,applied);
   ...
}

но он возвращается вызовом iOsMA(...)

а если у меня в myIndic::Create идут просто мои какие-то вычисления, то как мне получить m_handle моего индикатора?

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

И где физически находится этот iOsMA? В каких-то длл? И как он возвращает свой хендл?

Надеюсь, что понятно спросил. :)


 
falkov:

Я хочу написать класс индикатора, который каким-то рассчитывается в методе Create моего класса. Каким образом мне получить хендл моего индикатора?

Поясню.

Если я создаю экземпляр класса CiOsMA и потом на его основе индикатор OsMA,

то хендл индикатора m_handle возвращается в методе Create, но он возвращается вызовом iOsMA(...)

а если у меня в myIndic::Create идут просто мои какие-то вычисления, то как мне получить m_handle моего индикатора?

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

И где физически находится этот iOsMA? В каких-то длл? И как он возвращает свой хендл?

Надеюсь, что понятно спросил. :)



Хэндл - это просто целое число, номер индикатора в памяти компьютера. Попробуйте передать это число (m_hanlde) и обратиться по  нему в другом объекте/классе. Под словом "обратиться" имеются ввиду функции для доступа к индикаторам.
Причина обращения: