Время работы и показания индикатора

 

Пишу индикатор.
Как все знаем, индикатор перечитает историю и покажет ранние показатели. Тут все верно.
Вопрос?
Как можно сделать так, что бы индикатор перечитывая историю показал (например стрелки) только в те моменты когда он бы работал.
К примеру я пишу индикатор который будет работать только в Европейскую сессию.

Ок написала, далее я запускаю отдельный скрипт, который считает стрелки и показывает количество верных исходов.
Т.е. считает Винрейт.

Я знаю, что можно для советника и индикатора указать время работы. Но вот вопрос, когда он будет пересчитывать историю его эти временные рамки смогут ограничить?

Может кто-то с подобным сталкивался?


Заранее благодарю всех кто примет участие в обсуждении и сможет уделить время для ответа.

 
Natalya Smirnova:

Пишу индикатор.

Может как то так?

//+------------------------------------------------------------------+
int StartHour = 9;
int StartMin = 0;
int EndHour = 21;
int EndMin = 0;
MqlDateTime dt;
//+------------------------------------------------------------------+
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(i = 0; i < rates_total && !IsStopped(); i++)
     {
      if(чего то там == чему то)
         if(TimeSession(time[i]))
            записываем в буфер стрелку;
         else
            не записываем стрелку в буфер;
     }


   return (rates_total);
  }
//+------------------------------------------------------------------+
bool TimeSession(datetime TimeCur)
  {
//--- время начала сессии
   int StartTime = 3600 * StartHour + 60 * StartMin;
//--- время окончания сессии
   int StopTime = 3600 * EndHour + 60 * EndMin;
//--- текущее время в секундах от начала дня
   TimeCur = TimeCur % 86400;
   if(StopTime < StartTime)
     {
      if(TimeCur >= StartTime || TimeCur < StopTime)      //--- переход через полночь
         return(true);
     }
   else
     {
      if(TimeCur >= StartTime && TimeCur < StopTime)      //--- внутри одного дня
         return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+



Подскажите кто знает где можно посмотреть в каком разделе форума находится тема топикстартера?  В разделе для МТ4 или для МТ5?

 
Aleksandr Slavskii #:

Подскажите кто знает где можно посмотреть в каком разделе форума находится тема топикстартера?  В разделе для МТ4 или для МТ5?

Да такой вопрос относится и решается одинаково и в mql4 и в mql5.

 
Alexey Viktorov #:

Да такой вопрос относится и решается одинаково и в mql4 и в mql5.

Я просто в МТ4 даже не заглядывал, поэтому не в курсе подходит для него какой то код из МТ5 или нет.

А из за того, что не знаю как определить в каком разделе тема, пару раз вставлялся не туда. 

Поэтому спрашиваю.

 
Aleksandr Slavskii #:

Я просто в МТ4 даже не заглядывал, поэтому не в курсе подходит для него какой то код из МТ5 или нет.

А из за того, что не знаю как определить в каком разделе тема, пару раз вставлялся не туда. 

Поэтому спрашиваю.

Можете вставлять всё, кроме торговых функций, вот они разные

 
Vitaly Muzichenko #:

Можете вставлять всё, кроме торговых функций, вот они разные

Спасибо.

 
Vitaly Muzichenko #:

Можете вставлять всё, кроме торговых функций, вот они разные

Знаю, сейчас придут и скажут, что ещё поиск значений в массиве разный. Но это можно сразу подправить под мт4

 
Aleksandr Slavskii #:

Может как то так?



Подскажите кто знает где можно посмотреть в каком разделе форума находится тема топикстартера?  В разделе для МТ4 или для МТ5?

Хочу выразить Вам благодарность, я тоже первым делом так пробовала.
Но данная функция, на истории не работает по-моему. Т.е. я сделала так же (вначале чуть по своему потом Ваш вариант) но на истории показывает все время.
По-моему данная функция будет работать только в режиме реального времени так как я меняю время, а количество стрелок не изменяется (на истории)
Скорее всего данное решение актуально "в живую"


Но все равно спасибо большое за уделенное время!

 
Natalya Smirnova #:

Хочу выразить Вам благодарность, я тоже первым делом так пробовала.
Но данная функция, на истории не работает по-моему. Т.е. я сделала так же (вначале чуть по своему потом Ваш вариант) но на истории показывает все время.
По-моему данная функция будет работать только в режиме реального времени так как я меняю время, а количество стрелок не изменяется (на истории)
Скорее всего данное решение актуально "в живую"


Но все равно спасибо большое за уделенное время!

вы уверены, что в своем примере сравнивали время ИМЕННО сигнального бара, а не текущее время? 

 
Natalya Smirnova #:

По-моему данная функция будет работать только в режиме реального времени так как я меняю время, а количество стрелок не изменяется (на истории)
Скорее всего данное решение актуально "в живую"

Смотрите код своего индикатора, всё прекрасно работает на истории.

Вот скрин с настройками 

int StartHour = 15;

int StartMin = 10;

int EndHour = 16;

int EndMin = 20;

вот с настройками

int StartHour = 15;

int StartMin = 10;

int EndHour = 20;

int EndMin = 20;


Как можно заметить стрелок намного больше.


//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrRed

int StartHour = 15;
int StartMin = 10;
int EndHour = 20;
int EndMin = 20;
MqlDateTime dt;
double Buff[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0, Buff, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_ARROW, 234);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);
   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[])
  {
   int limit;
   if(prev_calculated <= 0)
     {
      limit = 1 ;
      ArrayInitialize(Buff, 0);
     }
   else
      limit = prev_calculated - 1;

   for(int i = 0; i < rates_total && !IsStopped(); i++)
     {
      if(TimeSession(time[i]))
         Buff[i] = high[i];
      else
         Buff[i] = 0;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
bool TimeSession(datetime TimeCur)
  {
//--- время начала сессии
   int StartTime = 3600 * StartHour + 60 * StartMin;
//--- время окончания сессии
   int StopTime = 3600 * EndHour + 60 * EndMin;
//--- текущее время в секундах от начала дня
   TimeCur = TimeCur % 86400;
   if(StopTime < StartTime)
     {
      if(TimeCur >= StartTime || TimeCur < StopTime)      //--- переход через полночь
         return(true);
     }
   else
     {
      if(TimeCur >= StartTime && TimeCur < StopTime)      //--- внутри одного дня
         return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

Смотрите код своего индикатора, всё прекрасно работает на истории.

Вот скрин с настройками 

int StartHour = 15;

int StartMin = 10;

int EndHour = 16;

int EndMin = 20;

вот с настройками

int StartHour = 15;

int StartMin = 10;

int EndHour = 20;

int EndMin = 20;


Как можно заметить стрелок намного больше.


Я нашла свою ошибку.
Спасибо Вам за терпение и понимание!

Код которым Вы дополнили свой второй ответ помог мне.
Спасибо Вам еще раз!

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