Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2276

 

Подскажите, почему не работает этот код в МТ5? В мт4 все гуд

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Ration
#property indicator_label1  "Ration"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         RationBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, RationBuffer, INDICATOR_DATA);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   for(int i = 5; i > 0; i--)
     {
      double countCurrent = iClose(_Symbol, PERIOD_CURRENT, i) / iClose(_Symbol, PERIOD_CURRENT, i);
      RationBuffer[i] = NormalizeDouble(countCurrent, 2);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


 
Nikita Chernyshov #:

Подскажите, почему не работает этот код в МТ5? В мт4 все гуд


А что Вы получаете из iClose(), и что получаете делением полученного значения самого на себя? И почему бы не использовать предопределённый массив close[] для такого случая?

 
Artyom Trishkin #:

А что Вы получаете из iClose(), и что получаете делением полученного значения самого на себя? И почему бы не использовать предопределённый массив close[] для такого случая?

Я не силен в MQL5, но так работает

   int limit=rates_total-prev_calculated-1;
   for(int i = limit; i > 0; i--)
     {
      double countCurrent = iClose(_Symbol, PERIOD_CURRENT, i) / iClose(_Symbol, PERIOD_CURRENT, i);
      RationBuffer[i] = NormalizeDouble(countCurrent, 2);
     }

а если limit=5, то не работает.

Может кто-то объяснить почему? Пожалуйста.

 

Наверное так правильно будет

   for(int i = 5; i < rates_total; i++)
     {
      double countCurrent = iClose(_Symbol, PERIOD_CURRENT, i) / iClose(_Symbol, PERIOD_CURRENT, i);
      RationBuffer[i] = NormalizeDouble(countCurrent, 2);
     }
 
Tretyakov Rostyslav #:

Я не силен в MQL5, но так работает

а если limit=5, то не работает.

Может кто-то объяснить почему? Пожалуйста.

По той причине, что индикация баров в mt5 слева направо, то получается самый старый бар во время запуска, всегда будет иметь индекс 0. Следовательно надо писать 

   int limit = prev_calculated == 0 ? 5 : rates_total-prev_calculated-1;

Если это первый запуск, то посчитанных баров ноль и начнём считать с пятого бара. Иначе будем пересчитывать только последний бар.

Тогда цикл надо строить с увеличением индекса

for(int i = limit; i > rates_total; i++)
 
Alexey Viktorov #:

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

Спасибо.

Alexey Viktorov #:

Тогда цикл надо строить с увеличением индекса

for(int i = limit; i > rates_total; i++)

Наверное < ?

 

подскажите как лучше в индикаторе указать начало работы, например что-бы он начинал работу например с месяц назад, а остальное просто пропускал

пока вижу расчетную часть поставить после проверки datetime

 
Nikita Chernyshov #:

Подскажите, почему не работает этот код в МТ5? В мт4 все гуд


да чутка упростил код, но опечатался) допустим, я там делю цену закрытия на цену открытия, а вместо _Symbol могут быть другие активы.

Но вот это все равно не работает. В чем беда?

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Ration
#property indicator_label1  "Ration"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         RationBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, RationBuffer, INDICATOR_DATA);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   for(int i = 5; i >= 0; i--)
     {
      double countCurrent = iClose(_Symbol, PERIOD_CURRENT, i) / iOpen(_Symbol, PERIOD_CURRENT, i);
      RationBuffer[i] = NormalizeDouble(countCurrent, 2);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Tretyakov Rostyslav #:

Спасибо.

Наверное < ?

Ну конечно…

 

коллеги - читаю статью работы со временем

https://www.mql5.com/ru/articles/599

пока не понятно- помогите - как программно (как то возможно через ф-ию)

Компоненты даты и времени

Чтобы узнать значения отдельных составляющих даты и времени (год, месяц, дата и т.д.) используется функция TimeToStruct() и структура MqlDateTime. В функцию по ссылке передается структура, после выполнения функции структура будет заполнена значениями компонентов переданной ей даты:

datetime    tm=TimeCurrent();
MqlDateTime stm;
TimeToStruct(tm,stm);
//--- вывод компонентов даты
Alert("Год: "        +(string)stm.year);
Alert("Месяц: "      +(string)stm.mon);
Alert("Число: "      +(string)stm.day);
Alert("Час: "        +(string)stm.hour);
Alert("Минута: "     +(string)stm.min);
Alert("Секунда: "    +(string)stm.sec);
Alert("День недели: "+(string)stm.day_of_week);
Alert("День года: "  +(string)stm.day_of_year);

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

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[])
  {
//---
  MqlDateTime stm;
  datetime tm=TimeCurrent(stm);
//-------------------------------
...
 1.     if(time[i]>=D'2022.01.01' && time[i]<=D'2022.12.31') 

...
2.       if(time[i]<=D'2022.09.26')
...


в общем надо программно выйти на начало и конец прошлого года - от текущего - это вставка в 1. условие и

текущую дату прошлого года, только - это вставка чтобы была во второе условие... 2.

для выполнения условий if...

Основы программирования на MQL5 - Время
Основы программирования на MQL5 - Время
  • www.mql5.com
В статье рассматриваются стандартные функции MQL5 для работы со временем, приемы программирования и практически полезные функции для работы со временем, которые необходимы при создании экспертов и индикаторов. Значительное внимание уделено общей теории времяисчисления. В первую очередь статья должна быть интересна новичкам, приступившим к изучению программирования на MQL5.