Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
В Маркете более 400 индикаторов. Попробуй любой из них!
Ivan Molchanov
193
Ivan Molchanov 2014.03.27 10:47 

Друзья, кому не сложно - гляньте, пожалуйста, почему не работает индикатор?

Описание: если тело свечи в 2 или более раз меньшк полного размера свечи, то посередине тела свечи надо поставить точку.

Вот родил такое чудо:

#property indicator_chart_window    // Индик. рисуется в основном окне
#property indicator_buffers 1       // Количество буферов
#property indicator_color1 Gold     // Цвет первой линии

double Buf_0[];
double razmer; 
double sv; 
double telo;  
double raz;  
double znach; 
int u;      // Открытие индикаторных массивов
//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
//--------------------------------------------------------------------
   
   SetIndexBuffer(0,Buf_0);         // Назначение массива буферу
   SetIndexStyle (0,DRAW_ARROW,0,3);  // Стиль линии
   SetIndexArrow(0,159);               

//--------------------------------------------------------------------
   return;                          // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
int start()                         // Специальная функция start()
  {
                   // Количество просчитанных баров 
//--------------------------------------------------------------------
     
      u=iBars(NULL,0)-1;           // Индекс первого непосчитанного
   while(u>=0)                      // Цикл по непосчитанным барам
     {
      razmer=High[u]-Low[u];
      if (Open[u]>=Close[u])   sv=2;
      if (Open[u]<Close[u])    sv=1;
      
      if (sv==1) telo=Close[u]-Open[u];
      if (sv==2) telo=Open[u]-Close[u];
      
      if (sv==1) znach=Close[u]-((Close[u]-Open[u])/2);
      if (sv==2) znach=Open[u]-((Open[u]-Close[u])/2);

      
      raz=razmer/telo;
      
      if (raz>2) Buf_0[u]=znach;

   
                                   
      u--;                          // Расчёт индекса следующего бара
     }
//--------------------------------------------------------------------
   return;                          // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------

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

Почему так? Что поправить?

Знаний маловато, буду благодарен за более подробные ответы.

Sergey Eremin
4190
Sergey Eremin 2014.03.27 13:14  

Добрый день!

Полагаю, что проблема в том, что переменная telo может иметь значение "0". А делить на ноль - не хорошо :)

Попробуйте примерно так:

#property indicator_chart_window    // Индик. рисуется в основном окне
#property indicator_buffers 1       // Количество буферов
#property indicator_color1 Gold     // Цвет первой линии

double Buf_0[];
double razmer; 
double sv; 
double telo;  
double raz;  
double znach; 
int u;      // Открытие индикаторных массивов
//--------------------------------------------------------------------
int init()                          // Специальная функция init()
  {
//--------------------------------------------------------------------
   
   SetIndexBuffer(0,Buf_0);         // Назначение массива буферу
   SetIndexStyle (0,DRAW_ARROW,0,3);  // Стиль линии
   SetIndexArrow(0,159);               

//--------------------------------------------------------------------
   return 0;                          // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
int start()                         // Специальная функция start()
  {
                   // Количество просчитанных баров 
//--------------------------------------------------------------------
     
      u=Bars-1;           // Индекс первого непосчитанного
   while(u>=0)                      // Цикл по непосчитанным барам
     {
      razmer=High[u]-Low[u];
      if (Open[u]>=Close[u])   sv=2;
      if (Open[u]<Close[u])    sv=1;
      
      if (sv==1) telo=Close[u]-Open[u];
      if (sv==2) telo=Open[u]-Close[u];
      
      if (sv==1) znach=Close[u]-((Close[u]-Open[u])/2);
      if (sv==2) znach=Open[u]-((Open[u]-Close[u])/2);

      
      raz=razmer/(telo == 0 ? Point : telo);
      
      if (raz>2) Buf_0[u]=znach;

   
                                   
      u--;                          // Расчёт индекса следующего бара
     }
//--------------------------------------------------------------------
   return 0;                          // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------

Где в "(telo == 0 ? Point : telo)" означает "если telo равно нулю, то используем Point, иначе telo".

Вместо Point по смыслу вероятно корректней будет единицу использовать, но это Вам виднее. Главное - не допускать деления на ноль.

Ivan Molchanov
193
Ivan Molchanov 2014.03.27 14:31  

ENSED Спасибо большое! Все гениальное просто! Действительно дело в этом нуле. Поменял операцию с деления на умножение и все заработало.

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий