Возможно ли программно определить, по каким барам идёт тестирование - реальным, OHLC M1 и др.?

 
Возможно ли программно определить, по каким барам идёт тестирование - реальным, OHLC M1 и др.?
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.11.23 00:21

// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам
// Перед использованием должен быть хотя бы один OnTick вызван тестером
bool IsRealTicks( void )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(_Symbol, Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST)));
}


Пример использования

// Советник будет тестироваться только в режиме по реальным тикам
void OnTick()
{
  static bool IsRemove = true;
  
  if (IsRemove)
  {
    IsRemove = MQLInfoInteger(MQL_TESTER) && !IsRealTicks();
    
    if (IsRemove)
    {
      Print("Real ticks mode is needed!");
      
      ExpertRemove();
      
      return;
    }
  }
  
  //........
}
Как это сделать в OnInit (без OnTick) - не знаю.
 

Спасибо большое, заработало.

Что ж, буду проверять в OnTick.

Кстати, не нашёл, как ставить плюс в рейтинг. Или нет здесь?

 
EdgarКстати, не нашёл, как ставить плюс в рейтинг. Или нет здесь?
Нет. Дабы не вводить во искушение 9го смертного греха - "Накрутка рейтинга"
 

Столкнулся с необходимостью отслеживать режим OHLC в индикаторе. Стандартной возможности также не нашел. Сделал через обходной вариант. Первые 2 минуты индикатор по времени прихода котировок пытается определить, подходит ли время под OHLC.

#property copyright   "2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Test"
#property indicator_separate_window

input int Check_minutes=2;   // сколько минут наблюдать за временем тиков

int OnInit()
  {
   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[])
  {
   if(prev_calculated==rates_total)
     {
      static bool OHLC=false;
      static bool Check_OHLC=true;
      if(Check_OHLC)
        {
         static int prev_time=0;
         int real_time=TimeCurrent()%60;
         static int Calk_Minute=0;
         if(real_time==0 || real_time==20 || real_time==40 || real_time==59)
           {
            if(real_time-prev_time==-59) // сменилась минута
               Calk_Minute++;
            if(Calk_Minute==Check_minutes)
              {
               OHLC=true;                // нужное количество минут происходит одно и то же. Скорее всего, это OHLC 
               Print("Это OHLC");
               Check_OHLC=false;
              }
            prev_time=real_time;
           }
         else
           {
            Check_OHLC=false;          // другое количество секунд, это обычный режим тестирования или реальное время
            Print("Другой режим");
           }
        }
     }
   return(rates_total);
  }

 
savinkins:

Столкнулся с необходимостью отслеживать режим OHLC в индикаторе. Стандартной возможности также не нашел. Сделал через обходной вариант. Первые 2 минуты индикатор по времени прихода котировок пытается определить, подходит ли время под OHLC.

Функции обработки событий --> OnCalculate. Как таковое все что нужно можно получить по умолчанию.

Параметры open[], high[], low[] и close[] содержит массивы с ценами открытия, максимальной, минимальной ценами и ценами закрытия текущего таймфрейма. Параметр time[] содержит массив со значениями времени открытия, параметр spread[] – массив, содержащий историю спредов (если спред предусмотрен для данного торгового инструмента). Параметры volume[] и tick_volume[] содержат соответственно историю торгового и тикового объема.

Чтобы определить направление индексации в массивах time[], open[], high[], low[], close[], tick_volume[], volume[] и spread[], необходимо вызывать функцию ArrayGetAsSeries(). Чтобы не зависеть от умолчаний, необходимо безусловно вызывать функцию ArraySetAsSeries() для тех массивов, с которыми предполагается работать.

Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.

Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.

Для этого обычно достаточно вернуть значение параметра rates_total, которое содержит количество баров при текущем вызове функции. Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом.

Примечание: если функция OnCalculate возвращает нулевое значение, то в окне DataWindow клиентского терминала значения индикатора не показываются.

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

 
Konstantin Nikitin:

Функции обработки событий --> OnCalculate. Как таковое все что нужно можно получить по умолчанию.

Это зависит от целей. Мне нужно на начало бара понимать, как он будет отрабатываться - по OHLC или же по обычным тикам. В момент появления бара из файла должна подкачиваться история, и обрабатываться дополнительная информация. И критично, как поведет себя основной график - выдаст 4 показателя со временем 0, 20, 40, 59 секунд или же с нормальной обработкой тиков.