Показания индикатора MACD

 

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

.

 
Dmitry Fedoseev:
Арифметическая операция сложение

Извините, недопонял. Вообще не могу догнать, как вычленить счет столбцов. Подскажите, пожалуйста, поподробнее.
 
profitnik:

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

.


Такой функции нет. Если вам надо автоматически считать кол-во баров, то надо писать самому. Или просто глазками посчитайте.

Алгоритм такой:

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

2. Далее циклично от N до максимального количества баров на графике увеличиваем его значение на 1, то есть смещаемся влево по графику и проверяем было ли пересечение с нулем.

3. Если пересечения не было увеличиваем счетчик кол-во баров на единицу, назовем его count.

4. Если пересечение было, завершаем цикл и получаем результат. Количество баров будет count.

 
profitnik:

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


Начните что-то делать. Значение имеет где вы это делаете. Если в советнике, то надо в цикле идти по истории и считать бары. Поскольку это действие затратное, его надо делать только когда выполнились предварительные условия.

Если в индикаторе, то желательно сделать дополнительный буфер, при выполнении одно условия обнулять его, затем, на каждом баре прибавлять к нему 1. Нет волшебной функции и даже волшебного алгоритма нет.

 

Данную проблемы решил посредством добавление графических элементов в работу советника. Советник рисует вертикальную линию на первом столбце при пересечение уровня 0 главным буфером, вторую вертикальную линию рисует на том столбце, на котором сигнальный буфер пересек линию 0. После появления второй линии - считает количество баров между линиями, включая выделенные бары. При появление обратного сигнала - рисует все по новой. Функция CountBar(); выдает количество баров.

extern string time="Рабочий тайм-фрейм"; 

enum tf 

  {

   M1=0,       // Минутный

   M5=1,       // Пятиминутный

   M15=2,      // Пятнадцатиминутный

   M30=3,      // Получасовой

   H1=4,       // Часовой

   H4=5,       //Четырехчасовой

   W1=6,       // Недельный

   MN=7,       // Месячный

  };

input tf TimeFrame=H1;

//+------------------------------------------------------------------+

void OnTick()

  {

 CountBar();

   

     if(MACD0>0)

    {

      ObjectDelete("Line3");

      ObjectDelete("Line4");

    }

    if(MACD0<0)

    {

      ObjectDelete("Line");

      ObjectDelete("Line2");

    }

}


//+------------------------------------------------------------------+

// Счетчик баров MACD

//+------------------------------------------------------------------+

double CountBar()

{

  double t5 = 0;

  double bar=0;

  double MACD0 = iMACD (Symbol(),0,FastMACD,SlowMACD,SignalMASD,0,0,1);

  double MACD1 = iMACD (Symbol(),0,FastMACD,SlowMACD,SignalMASD,0,1,1);

  

  if(MACD0>0)

    {

    if(ObjectCreate("Line",OBJ_VLINE,0,Time[1],High[0])) sig=0;

    }

        

    

  if(MACD0>0 && MACD1 >0)

    {

     ObjectCreate("Line2",OBJ_VLINE,0,Time[1],High[0]);

    }

    

  if(MACD0<0)

    {

    if(ObjectCreate("Line3",OBJ_VLINE,0,Time[1],High[0])) sig = 1;

    }

        

    

  if(MACD0<0 && MACD1 <0)

    {

     ObjectCreate("Line4",OBJ_VLINE,0,Time[1],High[0]);

    }

    

  double t = ObjectGet("Line",0);

  double t2 = ObjectGet("Line2",0);

  double t3 = ObjectGet("Line3",0);

  double t4 = ObjectGet("Line4",0);

  if(MACD0>0)

    {

     t5 = t2-t;

    }

  if(MACD0<0)

    {

   t5 = t4-t3;

    }

 if(TimeFrame == 0) bar = t5/60+1; 

 if(TimeFrame == 1) bar = t5/300+1;

 if(TimeFrame == 2) bar = t5/900+1;

 if(TimeFrame == 3) bar = t5/1800+1;

 if(TimeFrame == 4) bar = t5/3600+1; 

 if(TimeFrame == 5) bar = t5/14400+1;

 if(TimeFrame == 6) bar = t5/432000+1;

 if(TimeFrame == 7) bar = t5/2592000+1;

  

  return(bar);

}

Причина обращения: