Здравствуйте! Важен сам принцип, что и где менять чтобы он стал мультитаймфреймовым, к сожалению на сайте не нашел статьи как писать мультитаймфреймовые индикаторы.
Привожу наброски простого индикатора, где при изменении множителя таймфрейма Faktor - должны отображаться стрелки обозначающиее пересечении сигнальной линии МАКД и 0, на соответствующем множителю таймфрейме.
Стрелки отображаются, но почему то со смещением... Прошу Вашей помощи!
//| Proba4.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Label1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- input parameters
input int Faktor=1; //Множитель ТФ
//--- indicator buffers
double Label1Buffer[];
//-- служебные массивы
double SignalBuffer[];
int Handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,233);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//AO_Handle=iCustom(NULL,0,"AO_Zotik",Faktor);
Handle=iMACD(NULL,0,12*Faktor,26*Faktor,9*Faktor,PRICE_CLOSE);
Print(BarsCalculated(Handle));
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
int to_copy,limit;
if(prev_calculated==0)
{
limit=1;
to_copy=rates_total-1;
if(CopyBuffer(Handle,1,0,rates_total,SignalBuffer)<=0)
{
Print("Getting MACD is failed! Error",GetLastError());
return(0);
}
}
else
{
limit=prev_calculated-1;
to_copy=rates_total-1;
if(CopyBuffer(Handle,1,0,rates_total,SignalBuffer)<=0)
{
Print("Getting MACD is failed! Error",GetLastError());
return(0);
}
}
for(int i=limit; i<to_copy;i++)
if(SignalBuffer[i-1] < 0 && SignalBuffer[i] > 0)
Label1Buffer[i]=high[i];//пересечение на графике
else
Label1Buffer[i]=EMPTY_VALUE; //пустое значение
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Сделай так:
input ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT; //Периоды графиков
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
...
Handle=iMACD(NULL,timeframe,12*Faktor,26*Faktor,9*Faktor,PRICE_CLOSE);
Но имей ввиду, что глубина массивов у таймфремов разная, соответственно рано или поздно ты получишь ошибку при копировании CopyBuffer.
Сделай так:
input ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT; //Периоды графиков
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
...
Handle=iMACD(NULL,timeframe,12*Faktor,26*Faktor,9*Faktor,PRICE_CLOSE);
Но имей ввиду, что глубина массивов у таймфремов разная, соответственно рано или поздно ты получишь ошибку при копировании CopyBuffer.
Спасибо за ответ! Но все равно идет смещение. На рисунке вертикальная линия показывает пересечение на старшем ТФ - и тут видно смещение где-то 4-7 баров, почему так получается?
Спасибо за ответ! Но все равно идет смещение. На рисунке вертикальная линия показывает пересечение на старшем ТФ - и тут видно смещение где-то 4-7 баров, почему так получается?
Ну а как вы хотели???
Вы же данные берете из другого таймфрема, плюс у вас множитель по фракталу, в итоге на текущем графике этот индюк показывает вам данные с другого таймфрема, и такими линиями что вы рисуете вы никогда не найдете общую точку, ее надо высчитывать в индикаторе и рисовать в нем, тогда хотя бы вы будите понимать, что вам дал ваш индикатор.
А вообще, есть 2 момента:
1. Отлично что вы хотите это понять.
2. Плохо, что без базы.
Вам надо просто начать программировать простейшие индикаторы, мультифреймовые/мультивалютные, это следующий шаг.
Ну самый простой вариант, просто заказать то что вам нужно у фрилансеров.
Ну а как вы хотели???
Вы же данные берете из другого таймфрема, плюс у вас множитель по фракталу, в итоге на текущем графике этот индюк показывает вам данные с другого таймфрема, и такими линиями что вы рисуете вы никогда не найдете общую точку, ее надо высчитывать в индикаторе и рисовать в нем, тогда хотя бы вы будите понимать, что вам дал ваш индикатор.
А вообще, есть 2 момента:
1. Отлично что вы хотите это понять.
2. Плохо, что без базы.
Вам надо просто начать программировать простейшие индикаторы, мультифреймовые/мультивалютные, это следующий шаг.
Ну самый простой вариант, просто заказать то что вам нужно у фрилансеров.
Вы написали - "Сделай так", я сделал и ничего не получилось, потом Вы пишите - "а что вы хотели?", не хочу показаться глупым но что то с логикой тут не так))))
У вас все так с логикой, просто вы не понимаете, чего хотите от своих действий.
Вы хотели получить мультитаймфреймовый индикатор, болванку что вы предоставили на все 100% подходила, но вы так и не поняли, что получите на выходе.
А получили вы следующее, диаграмму машки относительно выбранного таймфрейма + множитель и конечно же результат никак не привязан к временным зонам текущей чарта, вот почему ваши вертикальные линии не дают "желаемого" результата.
Вы пробовали менять период времени в индикаторе, показания индикатора меняются? Если да, то вы написали то самое что хотели, а вот для каких целей и как им пользоваться, вам придется придумать. Ниже пример мультитаймфреймового индикатор, стоит он на М1, а отражает ситуацию на М15 и Н1, если вы проведете вертикальную линию на основном графике, она никакой пользы вам не даст, так как индикаторы имеют смещение по времени. Я надеюсь, вы поняли в чем проблема(а точнее ее отсутствие) в вашем индикаторе.
Вы пробовали менять период времени в индикаторе, показания индикатора меняются? Если да, то вы написали то самое что хотели, а вот для каких целей и как им пользоваться, вам придется придумать.
Просто поймите, я хочу разобраться раз и навсегда!
Я хочу видеть пересечения 0 и сигнальной линии индикатора макд на текущем Тф к примеру на м1 а пересечения соответствовали старшему Тф к примеру м5, как это сделать???
Видеть....
Вы ее видите, но Вас это не устраивает :). Смотрите к примеру на графике М1 машка пересекает нулевую линию на 100 баре, эта же машка но М5 пересекает нулевую линию на 20 баре, так вот ваш индикатор покажет это пересечение на 20 баре но на текущем М1, поняли?
Видеть....
Вы ее видите, но Вас это не устраивает :). Смотрите к примеру на графике М1 машка пересекает нулевую линию на 100 баре, эта же машка но М5 пересекает нулевую линию на 20 баре, так вот ваш индикатор покажет это пересечение на 20 баре но на текущем М1, поняли?
Как это сделать.... А вот тут надо думать как, вот почему я писал выше, что вы до конца не поняли цель вашего индикатора.
Индикатор в текущем виде может выступать в роли визуального подтверждения событий на более старшем таймфрейме.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте! Важен сам принцип, что и где менять чтобы он стал мультитаймфреймовым, к сожалению на сайте не нашел статьи как писать мультитаймфреймовые индикаторы.
Привожу наброски простого индикатора, где при изменении множителя таймфрейма Faktor - должны отображаться стрелки обозначающиее пересечении сигнальной линии МАКД и 0, на соответствующем множителю таймфрейме.
Стрелки отображаются, но почему то со смещением... Прошу Вашей помощи!
//| Proba4.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Label1
#property indicator_label1 "Label1"
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- input parameters
input int Faktor=1; //Множитель ТФ
//--- indicator buffers
double Label1Buffer[];
//-- служебные массивы
double SignalBuffer[];
int Handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
PlotIndexSetInteger(0,PLOT_ARROW,233);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//AO_Handle=iCustom(NULL,0,"AO_Zotik",Faktor);
Handle=iMACD(NULL,0,12*Faktor,26*Faktor,9*Faktor,PRICE_CLOSE);
Print(BarsCalculated(Handle));
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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[])
{
//---
int to_copy,limit;
if(prev_calculated==0)
{
limit=1;
to_copy=rates_total-1;
if(CopyBuffer(Handle,1,0,rates_total,SignalBuffer)<=0)
{
Print("Getting MACD is failed! Error",GetLastError());
return(0);
}
}
else
{
limit=prev_calculated-1;
to_copy=rates_total-1;
if(CopyBuffer(Handle,1,0,rates_total,SignalBuffer)<=0)
{
Print("Getting MACD is failed! Error",GetLastError());
return(0);
}
}
for(int i=limit; i<to_copy;i++)
if(SignalBuffer[i-1] < 0 && SignalBuffer[i] > 0)
Label1Buffer[i]=high[i];//пересечение на графике
else
Label1Buffer[i]=EMPTY_VALUE; //пустое значение
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+