Не могу найти ошибку

 

Добрый день , взялся представить в виде линии график крестики нолики ,  с разворотом "points" , то есть отображение будет в виде линии (на каги похоже) , а принцип разворота тот же что и в крестах нолях. 

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

мой первый индикатор ... , укажите пожалуйста на косяк ,Спасибо 

Компилятор ошибок не выдает 

//+------------------------------------------------------------------+
//|                                                   SWING_LINE.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Swing_Line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input double    points=0.0050;
input double    begin_price_level=1.1250;
//--- indicator buffers
double         Swing_LineBuffer[] , delta_up [] ,delta_down[] ,kup [] ,kdown [] ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Swing_LineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,kup,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,kdown,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,delta_up,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,delta_down,INDICATOR_CALCULATIONS);
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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  bar ; 
   Swing_LineBuffer [0] = begin_price_level ;
   for(bar = 1; bar < rates_total; bar++) 
   {delta_up[bar] = high[bar]- Swing_LineBuffer [bar -1];
   kup[bar] = floor(delta_up[bar] / points);
   delta_down[bar] = Swing_LineBuffer [bar -1]-low[bar];
   kdown[bar] =floor(delta_down[bar] / points) ;   
   if (kup[bar] >=1) Swing_LineBuffer[bar] = Swing_LineBuffer[bar-1] + (kup[bar]*points) ;
   if (kdown[bar] >=1) Swing_LineBuffer [bar] = Swing_LineBuffer[bar-1] - (kdown[bar]*points) ;
   else  Swing_LineBuffer[bar] = Swing_LineBuffer[bar-1] ;
  
      }
       
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
LookingFor:

Добрый день , взялся представить в виде линии график крестики нолики ,  с разворотом "points" , то есть отображение будет в виде линии (на каги похоже) , а принцип разворота тот же что и в крестах нолях. 

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

мой первый индикатор ... , укажите пожалуйста на косяк ,Спасибо 


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

Вставить код через кнопку SRC - пожелание из области фантастики (кстати, г-да веб-"мастера", вы когда сделаете подсветку и оформление кода не через зад ?)

Ну и конечно стоит поместить скриншот той фигни которая вышла..

иначе разгадывать ребус - совсем лень, причём не только мне но и очень многим..это надо понять задачу (её по традиции пишут в шапке кода), взять ваш код, затащить к себе, оформить и заодно разобрать найдя ошибки

 

Комменты добавил внутрь файла 

Файлы:
 
LookingFor:

Комменты добавил внутрь файла 

ещё скриншот того что получилось и рисунок того, что должно было по задумке быть (прямо в терминале MT его примитивами)

 

Добрый день 

должно быть вот так , как в КАГИ , взял чужой рисунок


 А выходит вот так вот , и не на всех таймфреймах еще 




 
LookingFor:

Добрый день 

должно быть вот так , как в КАГИ , взял чужой рисунок


 А выходит вот так вот , и не на всех таймфреймах еще 




обратите внимание, что вниз вы считаете почти правильно. А вот вверх - вообще никак :-) То есть результат расчёта вверх kup[] вы просто перезаписываете следующим за ним блоком kdown[].

у вас там либо "else" между ними нехватает, либо надо передумывать всю логику

PS. Ровные вертикальные отрезки через индикаторный буфер LINE или SECTION не сделать.

 

Максим спасибо  ,Вы мне очень помогли , я еще раз все проверю , озадачили Вы меня своим "почти правильно" , про подсчеты .

Я вставил else , по Вашей рекомендации , но зачем я это сделал , я не понял !!! тк по моей логике , я понимаю этот язык что выражение выполняется при исполнении условия , а у меня стоит оператор if , причем на каждое условие , то есть почему подсчет вниз забивал подсчет наверх я не догоняю , тк одновременно условия НЕ ИСПОЛНЯЛИСЬ , наверное нужно еще что то  мне изучить ...

В любом случае кресты на нолях получились цифровыми , кому нужно можно пользоваться .

Еще раз Спасибо !


//+------------------------------------------------------------------+
//|                                                   SWING_LINE.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Swing_Line"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input double    points=0.0050;
input double    begin_price_level=1.1250;
//--- indicator buffers
double         Swing_LineBuffer[] , delta_up [] ,delta_down[] ,kup [] ,kdown [] ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Swing_LineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,kup,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,kdown,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,delta_up,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,delta_down,INDICATOR_CALCULATIONS);
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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  bar ; 
   // начальный уровень цены от которой идет отсчет , уровень на нулевом баре
   Swing_LineBuffer [0] = begin_price_level ;
   //поехали считать слева направо
   for(bar = 1; bar < rates_total; bar++) 
   //Высчитаем сколько на баре цена ушла вверх от заданного уровня  предидущего бара
   {delta_up[bar] = high[bar]- Swing_LineBuffer [bar -1];
   //найдем кратность прохода цены поинтам заданным , если цена не прошла кратно одному блоку размером в points то сбросится переменная до ноля
   kup[bar] = floor(delta_up[bar] / points);
   //Высчитаем сколько на баре цена ушла вниз от заданного уровня  предидущего бара
   delta_down[bar] = Swing_LineBuffer [bar -1]-low[bar];
   //найдем кратность прохода цены поинтам заданным , если цена не прошла кратно одному блоку размером в points то сбросится до  ноля
   kdown[bar] =floor(delta_down[bar] / points) ;  
    // если есть движение вверх кратное одному блоку points тогда , рисуем новый уровень индикатора наверх
   if (kup[bar] >=1) Swing_LineBuffer[bar] = Swing_LineBuffer[bar-1] + (kup[bar]*points) ;
   // нет движения кратного блоку points тогда индикатор на прежнем уровне 
   
   //если есть движение вниз кратное одному блоку points тогда , рисуем новый уровень индикатора вниз
   else   if (kdown[bar] >=1) Swing_LineBuffer [bar] = Swing_LineBuffer[bar-1] - (kdown[bar]*points) ;
   // нет движения кратного блоку points тогда индикатор на прежнем уровне 
   else  Swing_LineBuffer[bar] = Swing_LineBuffer[bar-1] ;
  
      }
       
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Причина обращения: