Простой индикатор сделать мультитаймфреймовым

 

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

Привожу наброски простого индикатора, где при изменении множителя таймфрейма 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);
  }
//+------------------------------------------------------------------+
 
Tango_X:

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

Привожу наброски простого индикатора, где при изменении множителя таймфрейма 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 int      Faktor=1; //Множитель ТФ
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.
 

 
Farkhat Guzairov:

Сделай так:

input int      Faktor=1; //Множитель ТФ
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 баров, почему так получается?


 
Tango_X:

Спасибо за ответ! Но все равно идет смещение. На рисунке вертикальная линия показывает пересечение на старшем ТФ - и тут видно смещение где-то 4-7 баров, почему так получается?


Ну а как вы хотели???

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

А вообще, есть 2 момента:

1. Отлично что вы хотите это понять.

2. Плохо, что без базы.

Вам надо просто начать программировать простейшие индикаторы, мультифреймовые/мультивалютные, это следующий шаг.

Ну самый простой вариант, просто заказать то что вам нужно у фрилансеров. 

 
Farkhat Guzairov:

Ну а как вы хотели???

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

А вообще, есть 2 момента:

1. Отлично что вы хотите это понять.

2. Плохо, что без базы.

Вам надо просто начать программировать простейшие индикаторы, мультифреймовые/мультивалютные, это следующий шаг.

Ну самый простой вариант, просто заказать то что вам нужно у фрилансеров. 

Вы написали - "Сделай так", я сделал и ничего не получилось, потом Вы пишите - "а что вы хотели?", не хочу показаться глупым но что то с логикой тут не так))))
 
Tango_X:
Вы написали - "Сделай так", я сделал и ничего не получилось, потом Вы пишите - "а что вы хотели?", не хочу показаться глупым но что то с логикой тут не так))))

У вас все так с логикой, просто вы не понимаете, чего хотите от своих действий.

Вы хотели получить мультитаймфреймовый индикатор, болванку что вы предоставили на все 100% подходила, но вы так и не поняли, что получите на выходе.

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

 

Вы пробовали менять период времени в индикаторе, показания индикатора меняются? Если да, то вы написали то самое что хотели, а вот для каких целей и как им пользоваться, вам придется придумать. Ниже пример мультитаймфреймового индикатор,  стоит он на М1, а отражает ситуацию на М15 и Н1, если вы проведете вертикальную линию на основном графике, она никакой пользы вам не даст, так как индикаторы имеют смещение по времени. Я надеюсь, вы поняли в чем проблема(а точнее ее отсутствие) в вашем индикаторе.

 

 
Farkhat Guzairov:
Вы пробовали менять период времени в индикаторе, показания индикатора меняются? Если да, то вы написали то самое что хотели, а вот для каких целей и как им пользоваться, вам придется придумать.
Я хочу видеть пересечения 0 и сигнальной линии индикатора макд на текущем Тф к примеру на м1 а пересечения соответствовали старшему Тф к примеру м5, как это сделать??? Проблема в смещении. Где почитать или может объясните принцип?
Просто поймите, я хочу разобраться раз и навсегда!
 
Tango_X:
Я хочу видеть пересечения 0 и сигнальной линии индикатора макд на текущем Тф к примеру на м1 а пересечения соответствовали старшему Тф к примеру м5, как это сделать???

 Видеть....

Вы ее видите, но Вас это не устраивает :). Смотрите к примеру на графике М1 машка пересекает нулевую линию на 100 баре, эта же машка но М5 пересекает нулевую линию на 20 баре, так вот ваш индикатор покажет это пересечение на 20 баре но на текущем М1, поняли?

 
Farkhat Guzairov:

 Видеть....

Вы ее видите, но Вас это не устраивает :). Смотрите к примеру на графике М1 машка пересекает нулевую линию на 100 баре, эта же машка но М5 пересекает нулевую линию на 20 баре, так вот ваш индикатор покажет это пересечение на 20 баре но на текущем М1, поняли?

Я сейчас с телефона, доберусь до компьютера попробую разобраться в Ваших словах. Спасибо!
 

Как это сделать.... А вот тут надо думать как, вот почему я писал выше, что вы до конца не поняли цель вашего индикатора.

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