рисуют индикаторы не классы, а сам терминал. Терминалу для этого надо буфер
А что надо для задания буфера?
- пройтись по всем элементам этого масива и записать в них соответствующие данные от индикатор.
То есть вам, для задания своего индикатора через класс, надо создать функцию, которая может возвращать для запрошенного бара его расчитанное значение.
В примерах из стандартной библиотеки - все расчеты выполняют известные функции типа iMA или iADX
но вы должны будете для своих расчетов писать свои. и по этой же логике стандартной библиотеки работать. В результате ваша функция OnCalculate превратится просто в одиочный цикл заполнения буферных лини, вызывая функцию расчета для одного бара из вашего класса.
- www.mql5.com
рисуют индикаторы не классы, а сам терминал. Терминалу для этого надо буфер
А что надо для задания буфера?
- пройтись по всем элементам этого масива и записать в них соответствующие данные от индикатор.
То есть вам, для задания своего индикатора через класс, надо создать функцию, которая может возвращать для запрошенного бара его расчитанное значение.
В примерах из стандартной библиотеки - все расчеты выполняют известные функции типа iMA или iADX
но вы должны будете для своих расчетов писать свои. и по этой же логике стандартной библиотеки работать. В результате ваша функция OnCalculate превратится просто в одиочный цикл заполнения буферных лини, вызывая функцию расчета для одного бара из вашего класса.
ну вот же я вызываю метод класса, который возвращает данные из буфера индикатора в другой буфер:
_myOsMA.GetData(0,50,0,ExtOsMABuffer);
зачем же писать цикл по расчету для каждого бара?
Просто, наверное, есть какой-то нюанс, который не могу уловить :(
Блин, нужен просто маленький пример. В справке по классам вообще примеров нет.
Наверное, разработчики считают, что и так все понятно :)
ну вот же я вызываю метод класса, который возвращает данные из буфера индикатора в другой буфер:
_myOsMA.GetData(0,50,0,ExtOsMABuffer);
зачем же писать цикл по расчету для каждого бара?
Просто, наверное, есть какой-то нюанс, который не могу уловить :(
Блин, нужен просто маленький пример. В справке по классам вообще примеров нет.
Наверное, разработчики считают, что и так все понятно :)
Самый хороший пример - стандартная библиотека.
Идем в каталог \MQL5\Include\Indicators и смотрим что и как.
PS
Даю подсказку, смотреть нужно начиная с файла Indicator.mqh, а затем любой из интересующих Вас файлов: BillWilliams.mqh, Oscilators.mqh, Trend.mqh и Volumes.mqh.
- www.mql5.com
Самый хороший пример - стандартная библиотека.
Идем в каталог \MQL5\Include\Indicators и смотрим что и как.
PS
Даю подсказку, смотреть нужно начиная с файла Indicator.mqh, а затем любой из интересующих Вас файлов: BillWilliams.mqh, Oscilators.mqh, Trend.mqh и Volumes.mqh.
Да смотрел я там, конечно, оттуда и начал!
Это очень пригодится, когда начну писать свои классы, собственно, уже начал. С классами я имел дело в С++.
Меня интересует очень узкий вопрос: Как нарисовать индикатор через классы??
И нужен всего-лишь маааленький пример этого, т.е. как передать подсчитанные в экземпляре класса данные в буфер индикатора для отрисовки!
...
И нужен всего-лишь маааленький пример этого, т.е. как передать подсчитанные в экземпляре класса данные в буфер индикатора для отрисовки!
Ничего особенного не нужно, все как обычно - CopyBuffer()
Можно для примера дать код, как нарисовать индикатор через классы
А у Вас и так всё должно работать
#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);
}
А у Вас и так всё должно работать
Да, Вы правы!
Просто когда я спрашивал, были выходные, не было потока котировок.
В понедельник с утра взглянул на терминал - а все работает! Двинулся дальше.
Я хочу написать класс индикатора, который каким-то рассчитывается в методе 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? В каких-то длл? И как он возвращает свой хендл?
Надеюсь, что понятно спросил. :)
Я хочу написать класс индикатора, который каким-то рассчитывается в методе Create моего класса. Каким образом мне получить хендл моего индикатора?
Поясню.
Если я создаю экземпляр класса CiOsMA и потом на его основе индикатор OsMA,
то хендл индикатора m_handle возвращается в методе Create, но он возвращается вызовом iOsMA(...)
а если у меня в myIndic::Create идут просто мои какие-то вычисления, то как мне получить m_handle моего индикатора?
Я хочу рассчитать все данные здесь же, в классе. Какой смысл заводить класс, чтобы из него все-равно обращаться к сторонней процедуре. Если, конечно, эта процедура не находится в длл-ке.
И где физически находится этот iOsMA? В каких-то длл? И как он возвращает свой хендл?
Надеюсь, что понятно спросил. :)
Хэндл - это просто целое число, номер индикатора в памяти компьютера. Попробуйте передать это число (m_hanlde) и обратиться по нему в другом объекте/классе. Под словом "обратиться" имеются ввиду функции для доступа к индикаторам.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Хочу создать классы своих индикаторов.
Для начала взял класс индикатора 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);
}
Можно для примера дать код, как нарисовать индикатор через классы?
Как рисовать индикаторы обычным способом, хорошо известно, а вот как через классы - что-то туплю :(