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

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

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


Вот так выглядит инициализация и #property на MQL4


А так на MQL5


И в итоге


Подскажите пожалуйста в чём проблема. В формулах расчёта значений индикатора точно нет ошибок, там единственная разница была только в функциях Open[i], Close[i] и iOpen(Symbol(),PERIOD_CURRENT,i), iClose(Symbol(),PERIOD_CURRENT,i), а весь остальной код фактически был скопирован и уже ни однократно проверен

Vladimir Karputov
Модератор
182930
Vladimir Karputov  

Неа, никто не будет вникать в код который выложили В ВИДЕ  КАРТИНКИ :)


Вам нужно ставить код нужно правильно в сообщение на форуме.

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

Вставка исходного кода в сообщение

Исходный код, вставленный таким образом, будет красиво отформатирован моноширинным шрифтом, удобным для восприятия подобного рода информации.

Исходный код в тексте сообщения

Не рекомендуется выделять код полужирным шрифтом, чтобы выделить как-то по смыслу определенные куски. Дело в том, что в разных операционных системах и браузерах моноширинные шрифты отображаются по-разному. Например, в Windows Vista используется моноширинный шрифт Consolas, у которого полужирное начертание для 10 размера практически не отличимо от обычного.

Alexandr Sokolov
483
Alexandr Sokolov  
Vladimir Karputov:

Неа, никто не будет вникать в код который выложили В ВИДЕ  КАРТИНКИ :)


Вам нужно ставить код нужно правильно в сообщение на форуме.

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


Исходный код, вставленный таким образом, будет красиво отформатирован моноширинным шрифтом, удобным для восприятия подобного рода информации.


Не рекомендуется выделять код полужирным шрифтом, чтобы выделить как-то по смыслу определенные куски. Дело в том, что в разных операционных системах и браузерах моноширинные шрифты отображаются по-разному. Например, в Windows Vista используется моноширинный шрифт Consolas, у которого полужирное начертание для 10 размера практически не отличимо от обычного.

Не знал, но как есть так так есть, в будущем учту. Чё-то по существу можете подсказать?

Vladimir Karputov
Модератор
182930
Vladimir Karputov  
Alexandr Davydovskyi:

Не знал, но как есть так так есть, в будущем учту. Чё-то по существу можете подсказать?

Извините, по картинкам информацию не воспринимаю.

Sergey Savinkin
2099
Sergey Savinkin  
Alexandr Davydovskyi:

Не знал, но как есть так так есть, в будущем учту. Чё-то по существу можете подсказать?

А где у Вас #property indicator_plots ?

Vladimir Karputov
Модератор
182930
Vladimir Karputov  
Alexandr Davydovskyi:

***

там единственная разница была только в функциях Open[i], Close[i] и iOpen(Symbol(),PERIOD_CURRENT,i), iClose(Symbol(),PERIOD_CURRENT,i), а весь остальной код фактически был скопирован и уже ни однократно проверен

Данный подход в индикаторах использовать не стоит. Индикатор в OnCalculate уже передаёт все массивы-таймсерии по текущему символу и таймфрейму. 

Что именно делает Вам индикатор?

Alexandr Sokolov
483
Alexandr Sokolov  
Sergey Savinkin:

А где у Вас #property indicator_plots ?

Добавил, но ничего не изменилось

Alexandr Sokolov
483
Alexandr Sokolov  
Vladimir Karputov:

Данный подход в индикаторах использовать не стоит. Индикатор в OnCalculate уже передаёт все массивы-таймсерии по текущему символу и таймфрейму. 

Что именно делает Вам индикатор?

#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);
  //-----------------------------------------------------------------
   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++)
     {
      if(iClose(Symbol(),PERIOD_CURRENT,i) >= iOpen(Symbol(),PERIOD_CURRENT,i)) {Buffer_1[i] = iClose(Symbol(),PERIOD_CURRENT,i) - Value(i,0);} else {Buffer_1[i] = 0;};
      if(iOpen(Symbol(),PERIOD_CURRENT,i) > iClose(Symbol(),PERIOD_CURRENT,i)) {Buffer_2[i] = Value(i,1) - iClose(Symbol(),PERIOD_CURRENT,i);} else {Buffer_2[i] = 0;};
     };
  //-----------------------------------------------------------------
   return(rates_total);
  }
//-------------------------------------------------------------------------------------------------
double Value(int i, int o)
  {
   double value = 0.0;
   if(iClose(Symbol(),PERIOD_CURRENT,i) >= iOpen(Symbol(),PERIOD_CURRENT,i) && o == 0)
     {
      for_buy = true;
      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;};
        };
     };
   if(iOpen(Symbol(),PERIOD_CURRENT,i) > iClose(Symbol(),PERIOD_CURRENT,i) && o == 1)
     {
      for_sell = true;
      for(int b = i; for_sell == true; b++)
        {
         if(iOpen(Symbol(),PERIOD_CURRENT,b) > iClose(Symbol(),PERIOD_CURRENT,b)) {value = iOpen(Symbol(),PERIOD_CURRENT,b);} else {for_sell = false;};
        };
     };
  //-----------------------------------------------------------------
   return(value);
  }
Alexandr Sokolov
483
Alexandr Sokolov  
Vladimir Karputov:

Данный подход в индикаторах использовать не стоит. Индикатор в OnCalculate уже передаёт все массивы-таймсерии по текущему символу и таймфрейму. 

Что именно делает Вам индикатор?

Показывает разницу между ценой открытия и закрытия одинаковых свечей


Например есть 3 растущие свечи подряд, индикатор покажет разницу между ценой закрытия действующей свечи и ценой открытия 3 (или в коде 2) свечи

Alexandr Sokolov
483
Alexandr Sokolov  
Vladimir Karputov:

Данный подход в индикаторах использовать не стоит. Индикатор в OnCalculate уже передаёт все массивы-таймсерии по текущему символу и таймфрейму. 

Что именно делает Вам индикатор?

А почему не стоит?

Vladimir Karputov
Модератор
182930
Vladimir Karputov  
Alexandr Davydovskyi:

А почему не стоит?

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

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


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

Print("time[0]=",time[0],", time[rates_tota-1]=",time[rates_tota-1]);
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий