Ошибка автоматической валидации. Индикатор на тиках

 

Сделали мы динамический РОС. Работает он путем запроса тиковых данных - истории запрашивает, считает, реал, соответственно, дальше получает тики. Берем либо торговые (Volume, Ticks), либо неторговые - bid/ask. Все прекрасно работает. Однако при попытки загрузить индикатор на Маркет валидатор дает ошибку - час думает/соображает, в итоге пишет, что слишком долго, падите прочь. У меня есть мысли - валидатор пытается прогнать индюк на валютах либо крипте, но поскольку индюк работает с тиками, то на таких инструментах брокер нужные тики не поставляет, и поэтому индикатор просто не просчитывается.


Как мне победить это дело?


Картинку подгрузил - это работа индикатора на РТС. И те тики, которые он использует - на валютах и крипте подобные данные не поставляются брокером.

Файлы:
poc007.png  222 kb
 
Тики индикатор закачивает через CopyRange?
 
Anton Polkovnikov:

Сделали мы динамический РОС. Работает он путем запроса тиковых данных - истории запрашивает, считает, реал, соответственно, дальше получает тики. Берем либо торговые (Volume, Ticks), либо неторговые - bid/ask. Все прекрасно работает. Однако при попытки загрузить индикатор на Маркет валидатор дает ошибку - час думает/соображает, в итоге пишет, что слишком долго, падите прочь. У меня есть мысли - валидатор пытается прогнать индюк на валютах либо крипте, но поскольку индюк работает с тиками, то на таких инструментах брокер нужные тики не поставляет, и поэтому индикатор просто не просчитывается.


Как мне победить это дело?


Картинку подгрузил - это работа индикатора на РТС. И те тики, которые он использует - на валютах и крипте подобные данные не поставляются брокером.

если

MQL_TESTER

Признак работы запущенной программы в тестере


то ...

удачи!

 
Индикатор тики закачивает через CopyTicks

Про 

MQL_TESTER

 вообще не понятно. Не знаю, что это. Индикатор в принципе не предназначен для использования в тестере, поскольку требует ручного управления - указание точки старта

 
Anton Polkovnikov:
Индикатор тики закачивает через CopyTicks

Про 

MQL_TESTER


 вообще не понятно. Не знаю, что это. Индикатор в принципе не предназначен для использования в тестере, поскольку требует ручного управления - указание точки старта

а валидация это и есть тестирование

потому и глухо

переключите тестер на тестирование индикатора и надеюсь что Вам все таки удастся понять в чем проблема

 
Запустил в тестере. Отрисовался. На РИ
Файлы:
poc008.png  224 kb
 
Anton Polkovnikov:
Индикатор тики закачивает через CopyTicks

Покажите эту часть кода. Какая перегрузка функции используется?

 
Вот в тестере на EURUSD прогнал в какой-то кухне. Понятно, сам индикатор отрисовала неправильно, поскольку нет тиковых данных у брокера, но тем не менее ошибок не выдала
Файлы:
poc009.png  175 kb
 
Ihor Herasko:

Покажите эту часть кода. Какая перегрузка функции используется?

//+------------------------------------------------------------------+
void GetTicks( bool current )
//+------------------------------------------------------------------+
{
   MqlTick tick_array[];

   if( CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,last_msc,INT_MAX ) > 0 )
   {
      last_msc = tick_array[ArraySize(tick_array)-1].time_msc;                // время (мкс) последнего тика
      
      for(int i=0; i<ArraySize(tick_array)-1; i++)
      {
         if( tick_array[i].time_msc == last_msc ) break;                      // последние тики не обрабатываем

         if( tick_array[i].time > time[ lastBar ] )
         {
            last_msc = tick_array[i].time_msc;         
            break;
         }
            
         if( !current )
         {
            datetime tickTime = tick_array[i].time;                              // время (с) текущего тика
            tickTime = (datetime)(tickTime - fmod( tickTime, PeriodSeconds() ) );  
            if( tickTime > currentTime )                                         // время (с) текущего тика > времени текущего бара
            {
               CalculatePOC( currentBar );                                       // расчет РОС   
               currentBar++;
               currentTime = (datetime)Ti[currentBar];
            }
         }

                 if( tick_array[i].flags == 2 || tick_array[i].flags == 6 ) ProcessTick( tick_array[i].bid, 1);
         
      }            

      if( current ) CalculatePOC( lastBar );                                       // расчет РОС   

   }
   
}


//+------------------------------------------------------------------+
 
Anton Polkovnikov:

я бы например тут

for(int i=0; i<ArraySize(tick_array)-1; i++)

вместо

ArraySize(tick_array)-1

задал заранее посчитанное число, равное ArraySize(...)-1

либо например 1000

будет работать шустрее

разберитесь с MQL_TESTER

если ...  MQL_TESTER, то тиков 1000

 

Вот так:

if( CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,last_msc,INT_MAX ) > 0 )

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

Поэтому логику запроса нужно переделать, строго контролируя количество тиков, которые запрашиваются. Вместо INT_MAX нужно поставить какое-то небольшое значение. У себя я, к примеру, использовал 10000. После получения этой порции тиков следует запомнить время последнего полученного тика и прервать загрузку до следующего тика. На следующем тике повторить загрузку с новой даты. И так до тех пор, пока не будут получены все необходимые тики.