Цветная мультитаймфремная MA

 

Проблему реализации данного индикатора выкладывал ранее в теме для новичков, но ответа так и не нашел.

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

Если текущее значение выше предыдущего - цвет зеленый, если ниже - красный, в другом случае - желтый. На текущем ТФ выглядеть все это должно

примерно так:

Код индикатора:

//+------------------------------------------------------------------+
//|                                                      MA-MTFC.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
//+------------------------------------------------------------------+
extern int MA_TF=1440;
extern int MA_Period=89;
extern int MA_Shift=0;
extern int MA_Method=2;
extern int MA_AP=0;
//+------------------------------------------------------------------+
double Buffer_Yellow[];
double Buffer_Lime[];
double Buffer_Red[];

string Symb;
double MA;

int init()
  {
   Symb=Symbol();
   //---
   if (MA_TF != 1)
    if (MA_TF != 5)
     if (MA_TF != 15)
      if (MA_TF != 30)
       if (MA_TF != 60)
        if (MA_TF != 240)
         if (MA_TF != 1440)
          if (MA_TF != 10080)
           if (MA_TF != 43200)
            if (MA_TF != 0)
             return;
   //---
   SetIndexBuffer(0,Buffer_Yellow);
   SetIndexBuffer(1,Buffer_Lime);
   SetIndexBuffer(2,Buffer_Red);
   //---
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   //---
   return(0);
  }

int deinit()
  {

   return(0);
  }

int start()
  {
   double MA;
   int counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars-1;
   if (limit>1) 
      limit=Bars-1;
      
   for(int i=limit-1;i>=0;i--)
    {
      int pos=iBarShift(NULL, MA_TF, Time[i]);
      MA=iMA(Symb,MA_TF,MA_Period,MA_Shift,MA_Method,MA_AP,pos);
      
      Buffer_Yellow[i]=MA;
      Buffer_Lime[i]=MA;
      Buffer_Red[i]=MA;
      
      if(Buffer_Yellow[i]>Buffer_Yellow[i+1])
       {
         Buffer_Red[i]=EMPTY_VALUE;
       }
      else if(Buffer_Yellow[i]<Buffer_Yellow[i+1])
       {
         Buffer_Lime[i]=EMPTY_VALUE;
       }
      else
       {
        Buffer_Red[i]=EMPTY_VALUE;
        Buffer_Lime[i]=EMPTY_VALUE; 
       }
      
    }

   return(0);
  }

Однако на нижних таймфремах данная МА выглядит вот так:

Как я полагаю, проблема заключается в следующей строчке:

if(Buffer_Yellow[i]>Buffer_Yellow[i+1])

На старших ТФ один бар в своем временном диапазоне имеет несколько баров с младшего, по-этому ему незачем анализировать младший, т.к. его цветовое обозначение и есть сглаженное обозначение младшего.

Другой вопрос когда ТФ МА выше, чем текущий ТФ. На протяжении нескольких баров значение МА на нижних ТФ одинаково, что соответствует одному значению на старшем ТФ, по-этому в данном случае условие [i+1] не корректно. В данном случае следует рассмотреть три варианта:

1) Period()==MA_TF;

2) Period()>MA_TF;

3) Period()<MA_TF.

С первыми двумя все очевидно. Но как лучше реализовать третий вариант?

//+------------------------------------------------------------------+
//|                                                      MA-MTFC.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
//+------------------------------------------------------------------+
extern int MA_TF=1440;
extern int MA_Period=89;
extern int MA_Shift=0;
extern int MA_Method=2;
extern int MA_AP=0;
//+------------------------------------------------------------------+
double Buffer_Yellow[];
double Buffer_Lime[];
double Buffer_Red[];


string Symb;
double MA;

int init()
  {
   Symb=Symbol();
   //---
   if (MA_TF != 1)
    if (MA_TF != 5)
     if (MA_TF != 15)
      if (MA_TF != 30)
       if (MA_TF != 60)
        if (MA_TF != 240)
         if (MA_TF != 1440)
          if (MA_TF != 10080)
           if (MA_TF != 43200)
            if (MA_TF != 0)
             return;
   //---
   SetIndexBuffer(0,Buffer_Yellow);
   SetIndexBuffer(1,Buffer_Lime);
   SetIndexBuffer(2,Buffer_Red);
   //---
   SetIndexStyle(0,DRAW_LINE,EMPTY,2);
   SetIndexStyle(1,DRAW_LINE,EMPTY,2);
   SetIndexStyle(2,DRAW_LINE,EMPTY,2);
   //---
   return(0);
  }

int deinit()
  {

   return(0);
  }

int start()
  {
   int pos;
   int counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars-1;
   if (limit>1) 
      limit=Bars-1;
      
   for(int i=limit-1;i>=0;i--)
    {
      if(Period()==MA_TF)
       {
         MA=iMA(Symb,MA_TF,MA_Period,MA_Shift,MA_Method,MA_AP,i);
         
         Buffer_Yellow[i]=MA;
         Buffer_Lime[i]=MA;
         Buffer_Red[i]=MA;
         
         if(Buffer_Yellow[i]>Buffer_Yellow[i+1])
          {
            Buffer_Red[i]=EMPTY_VALUE;
          }
         else if(Buffer_Yellow[i]<Buffer_Yellow[i+1])
          {
            Buffer_Lime[i]=EMPTY_VALUE;
          }
         else
          {
            Buffer_Red[i]=EMPTY_VALUE;
            Buffer_Lime[i]=EMPTY_VALUE;
          }        
       }
       
      if(Period()>MA_TF)
       {
         pos=iBarShift(NULL, MA_TF, Time[i]);
         MA=iMA(Symb,MA_TF,MA_Period,MA_Shift,MA_Method,MA_AP,pos);

         Buffer_Yellow[i]=MA;
         Buffer_Lime[i]=MA;
         Buffer_Red[i]=MA;
         
         if(Buffer_Yellow[i]>Buffer_Yellow[i+1])
          {
            Buffer_Red[i]=EMPTY_VALUE;
          }
         else if(Buffer_Yellow[i]<Buffer_Yellow[i+1])
          {
            Buffer_Lime[i]=EMPTY_VALUE;
          }
         else
          {
            Buffer_Red[i]=EMPTY_VALUE;
            Buffer_Lime[i]=EMPTY_VALUE;
          }                 
       }
      if(Period()<MA_TF)
       {
         ??????????????????????????        
       }    
    }

   return(0);
  }
 
Зачем делать запрос со старшего таймфрейма, если можно сделать запрос с текущего? Скользящая с периодом 24 на таймфрейме Н1 покажет среднесуточное положение цены за последние 24 часа. Та же самая скользящая на М30 будет иметь период = 24*2=48. На М15 эта же скользащая будет иметь период = 24*4=96 (или 48*2=96). Смысл запрашивать даные с другого таймфрейма?
 

Я думал над этим, что бы таким образом сгладить МА. Это куда рациональней, но все-таки по факту мы можем иметь уже другое ценовое значение МА на нижнем ТФ, отличное от верхнего до закрытия.

И с другой стороны, интересует именно техническая возможность реализовать данную идею, беря данные со старшего ТФ.

 
silhouette:

Я думал над этим, что бы таким образом сгладить МА. Это куда рациональней, но все-таки по факту мы можем иметь уже другое ценовое значение МА на нижнем ТФ, отличное от верхнего до закрытия.

Да откуда ж ему взяться-то, другому ценовому значению?
 

Старшая свеча содержит в себе несколько младших. На одном промежутке времени МА имеет одно единое ценовое значение, а если детализировать, то оно сгладится.

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

На рис. одна и та же МА с периодом 34 на d1 и 204 на h4

 
drknn:
Зачем делать запрос со старшего таймфрейма, если можно сделать запрос с текущего? Скользящая с периодом 24 на таймфрейме Н1 покажет среднесуточное положение цены за последние 24 часа. Та же самая скользящая на М30 будет иметь период = 24*2=48. На М15 эта же скользащая будет иметь период = 24*4=96 (или 48*2=96). Смысл запрашивать даные с другого таймфрейма?

Вовсе не факт. В часовом баре не обязательно будет 60 минутных свечей. Может быть и 56, и 50. Даже 30 бывает (ночь, низколиквидный символ).

Приведенный вариант - это грубое приближение. Если же нужен точный расчет, то лучше брать данные с оригинального таймфрейма.

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

Запрограммировал сегодня метод, предложенный ув. drknn.

Помимо раннее описанной погрешность до 20 пунктов, обнаружил еще один подводный камень, о котором ранее не подумал.

Если МА на старшем ТФ - тяжелая, то на нижнем в истории баров не напасешься, что бы ее высчитать. На рис. 89-дневная МА.

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

 
x4x:
Надеюсь буду полезен. Попробуйте соединить ступеньки не так а по их углам. То есть если вы будете делать далее расчеты от машек разных тф то по факту для анализа правильнее наверное брать эти расчмитанные через Теорему Пифагора диагональные значения, возможно в них смысла больше в смысле выявления общей динамики процесса, которая может скрываться не в одном тф а сидеть сразу в нескольких, а чтобы их можно было совместить то ступеньки будут мешать Имхо.
Спасибо, но проблема в том, что по ТП можно высчитать длину только в пикселях, а мне нужно решить как-то эту проблему со сдвигом в барах. Хотя идея сгладить математически думаю вовсе не плоха, но если ориентироваться на сигналы, то идея со ступеньками лучше, так как будет отображать действительную картину на старшем ТФ, не будет опережать, а соответственно ложно сигналить.
 
silhouette:
Спасибо, но проблема в том, что по ТП можно высчитать длину только в пикселях, а мне нужно решить как-то эту проблему со сдвигом в барах. Хотя идея сгладить математически думаю вовсе не плоха, но если ориентироваться на сигналы, то идея со ступеньками лучше, так как будет отображать действительную картину на старшем ТФ, не будет опережать, а соответственно ложно сигналить.


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