Перенос индикатора с MQL4 на MQL5 (на MQL5 гистограмма не отображается) - страница 2

 
Vladimir Karputov:

Потому, что Индикатор в OnCalculate уже передаёт все массивы-таймсерии по текущему символу и таймфрейму.

В индикаторе УЖЕ есть массивы-таймсерии OHLC, volume, tick volume и spread.


При этом помните про индикаторы (порядок индексации) в MQL5: просто распечатайте значение 

Так а в чём моя проблема? Код выше

 
Alexandr Davydovskyi:

Так а в чём моя проблема? Код выше

Как вы можете словами с переводом переменных в числа прочесть эти строки когда в функцию передали 2 или большее значение переменной i

      for_buy = true;
      for(int a = i; for_buy == true; a++)
 

Вот этот код

#property copyright "Alexandr Sokolov"
#property link      "www.facebook.com/thealexandrsokolov"
#property version   "1.00"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_buffers 2
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 clrGreen
#property indicator_label1 "Восходящее движение"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 clrRed
#property indicator_label2 "Нисходящее движение"
#property indicator_plots 2

double Buffer_1[],Buffer_2[];
static bool for_buy=false;
static bool for_sell=false;
//-------------------------------------------------------------------------------------------------
int OnInit()
  {
   SetIndexBuffer(0,Buffer_1,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer_2,INDICATOR_DATA);
   Print("Успешная инициализация");
//-----------------------------------------------------------------
   return(INIT_SUCCEEDED);
  }
//-------------------------------------------------------------------------------------------------
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 limit=rates_total-prev_calculated; if(prev_calculated>0) {limit++;};
   for(int i= 0; i < limit; i++)
     {
      Print("Обход цикла");
     };
//-----------------------------------------------------------------
   return(rates_total);
  }

Что-то выводит на график. Безинформативно, конечно.

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

Добавлено. Проблема в функции Value(int i, int o).

Добавлено 2:

Когда функция доходит до последнего бара, то iClose(Symbol(),PERIOD_CURRENT,a+1) == 0 и iOpen(Symbol(),PERIOD_CURRENT,a+1) == 0. Попадаете в бесконечный цикл, и график вешается. Это же индикатор.

      for(int a = i; for_buy == true; a++)
        {
         if(iClose(Symbol(),PERIOD_CURRENT,a) >= iOpen(Symbol(),PERIOD_CURRENT,a)) {value = iOpen(Symbol(),PERIOD_CURRENT,a);} else {for_buy = false;};
        };
 
Sergey Savinkin:

Вот этот код

Что-то выводит на график. Безинформативно, конечно.

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

Добавлено. Проблема в функции Value(int i, int o).

Добавлено 2:

Когда функция доходит до последнего бара, то iClose(Symbol(),PERIOD_CURRENT,a+1) == 0 и iOpen(Symbol(),PERIOD_CURRENT,a+1) == 0. Попадаете в бесконечный цикл, и график вешается. Это же индикатор.

Честно говоря мало что понял, но то что логика расчёта точно такая же это 100%, но на MQL4 это индикатор работает


У меня в коде нет бесконечных циклов, один ограничен значением limit и два других for_buy и for_sell которые при не совпадении направления цены становятся false


Может дело не в коде а в какой-то существенной разницей между MQL4 и MQL5? Например с чем вы сами на практике сталкивались?

 
Alexandr Davydovskyi:

Честно говоря мало что понял, но то что логика расчёта точно такая же это 100%, но на MQL4 это индикатор работает


У меня в коде нет бесконечных циклов, один ограничен значением limit и два других for_buy и for_sell которые при не совпадении направления цены становятся false


Может дело не в коде а в какой-то существенной разницей между MQL4 и MQL5? Например с чем вы сами на практике сталкивались?

Вот тут есть пример индикатора-гистограммы на mql5
 
Alexey Viktorov:

Как вы можете словами с переводом переменных в числа прочесть эти строки когда в функцию передали 2 или большее значение переменной i

Это в функции Value(), для того чтобы эта функция анализировала предыдущие свечи до которых ещё не дошел тот цикл в котором уже присваиваются значения буфферам. Ни знаю может ли быть в этом ошибка, но на MQL4 это работает

 
Alexandr Davydovskyi:

Это в функции Value(), для того чтобы эта функция анализировала предыдущие свечи до которых ещё не дошел тот цикл в котором уже присваиваются значения буфферам. Ни знаю может ли быть в этом ошибка, но на MQL4 это работает

Этот цикл работает, пока for_buy == true

for(int a = i; for_buy == true; a++)

На последнем баре выполняется нужное условие, значит, цикл выполняется дальше. А дальше значение а становится больше баров на графике. Методы iClose и iOpen   возвращают 0. И условие

iClose(Symbol(),PERIOD_CURRENT,a) >= iOpen(Symbol(),PERIOD_CURRENT,a)

Выполняется всегда. А знчит, цикл повторяется бесконечно.

Попробуйте поставить жесткое условие ">" вместо ">="

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