Получение данных от тех индикаторов с большим периодом

 

Заметил, что возникают проблемы с получением данных для iMA когда стоит период в 365 (например). В тестере для текущего бара данных просто нет (ошибка 4806). Тогда как в дебаггере все доступно. И это не зависит от периода для тестирования. Набросал код для проверки:

int IndicatorHandlers[365];

int OnInit()
{
        int nof, handler, errorCode;
        
        nof = ArraySize( IndicatorHandlers );
        errorCode = ERR_SUCCESS;
        
        for( int i = 0; i < nof; i++ )
        {
                handler = iMA( Symbol(), Period(), i + 1, 0, MODE_EMA, PRICE_OPEN );
                if ( handler == -1 )
                {
                        errorCode = GetLastError();
                        ResetLastError();
                        break;
                } // if
                
                IndicatorHandlers[i] = handler;
                
        } // for i
        
        return( errorCode );
} // OnInit

void OnDeinit( const int reason )
{
        PrintFormat( "Info> Shutdown, reason: %i", reason );
} // OnDeinit

void OnTick()
{
        static bool IsFirstTick = true;
        int nof, errorCode, result;
        double buffer[];
        
        if ( IsFirstTick == false )
                return;
        
        IsFirstTick = false;
        errorCode = ERR_SUCCESS;
        nof = ArraySize( IndicatorHandlers );
        
        for( int i = 0; i < nof; i++ )
        {
                result = CopyBuffer( IndicatorHandlers[i], 0, 0, 1, buffer );
                PrintFormat( "Ma Period: %i, Handler: %i, result: %i, value: %g, error code: %i", i, IndicatorHandlers[i], result, buffer[0], GetLastError() );
                ResetLastError();
                ArrayInitialize( buffer, 0.0 );
        } // for i
        
        return;
} // OnTick

В результате получаем вот такие результаты: 

2012.04.24 21:09:59     Core 1  2011.01.03 00:00:00   Ma Period: 265, Handler: 275, result: -1, value: 0, error code: 4806
2012.04.24 21:09:59     Core 1  2011.01.03 00:00:00   Ma Period: 264, Handler: 274, result: -1, value: 0, error code: 4806
2012.04.24 21:09:59     Core 1  2011.01.03 00:00:00   Ma Period: 263, Handler: 273, result: -1, value: 0, error code: 4806
2012.04.24 21:09:59     Core 1  2011.01.03 00:00:00   Ma Period: 262, Handler: 272, result: -1, value: 0, error code: 4806
2012.04.24 21:09:59     Core 1  2011.01.03 00:00:00   Ma Period: 261, Handler: 271, result: -1, value: 0, error code: 4806
2012.04.24 21:09:59     Core 1  2011.01.03 00:00:00   Ma Period: 260, Handler: 270, result: 1, value: 86.7368, error code: 0
2012.04.24 21:09:59     Core 1  2011.01.03 00:00:00   Ma Period: 259, Handler: 269, result: 1, value: 86.7235, error code: 0
2012.04.24 21:09:59     Core 1  2011.01.03 00:00:00   Ma Period: 258, Handler: 268, result: 1, value: 86.7101, error code: 0
2012.04.24 21:09:59     Core 1  2011.01.03 00:00:00   Ma Period: 257, Handler: 267, result: 1, value: 86.6967, error code: 0

т.е. для периода больше 260 дней данных просто нет, хотя в тестере выбран период с 2011.01.01 до текущего дня (2012.04.24). Символ для тестирования USDCHF. Практически та же картина для остальных символов.

Подскажите как перевести данное обстоятельство в контролируемый процесс? Понятно что проблема в истории, пытался удалять каталог history\ в tester\ ... ничего не изменилось. В логах тоже нет никаких ошибок о недоступности всех данных (тестирование идет полным ходом с заявленной даты).

В идеале мне надо данные с периодом в 365. И вообще как сейчас контролировать историю в 5 терминале?

 
Никто не использует такие периоды?
 

Никому не знакома проблема...

//+------------------------------------------------------------------+
//|                                                      MA_Tester   |
//|                                          Copyright 2012, Karlson |
//+------------------------------------------------------------------+
input int MA=1000;
int ma_h=0;
double ma[];
//+------------------------------------------------------------------+
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{  
   ma_h=iMA(_Symbol,_Period,MA,0,MODE_SMA,PRICE_CLOSE);
   
   if(ma_h<0) { Print("ОШибка создания хендла.");}
   
   ArrayInitialize(ma,0.0);
   
   if(GetLastError()>0) {Print("Ошибка ",GetLastError());return(-1);}
   
   return(0);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  { ResetLastError();
  
    int copy=CopyBuffer(ma_h,0,0,2,ma);ArraySetAsSeries(ma,true);
    
    if  (copy<0) {Print("Скопировано = ",copy);}
      
      else  {Print("Скопировано = ",copy,
                   "     MA[0]=",DoubleToString(ma[0],_Digits),
                   "     MA[1]=",DoubleToString(ma[1],_Digits));return;}
      
    if(GetLastError()>0) {Print("Ошибка ",GetLastError());}
  }  
//+------------------------------------------------------------------+

 

 
Karlson:

Никому не знакома проблема...   

А в OnInit  Вы что именно собирались проверить на наличие ошибки? Почему отсутствует ResetLastError()?
 
Yedelkin:
А в OnInit  Вы что именно собирались проверить на наличие ошибки? Почему отсутствует ResetLastError()?

Это пример того ,что все работает.Лично использую до 4000 период.

Что касается последней проверки..Это упрощенно ведь.Данная проверка у меня в конце любого блока практически. 

 
Karlson:

Это пример того ,что все работает.Лично использую до 4000 период.

Что касается последней проверки..Это упрощенно ведь.Данная проверка у меня в конце любого блока практически.   

Блин, я подумал, что фразой "Никому не знакома проблема..." Вы вопрос задаёте. А это совсем из другой песни слова :)
 
Yedelkin:
Блин, я подумал, что фразой "Никому не знакома проблема..." Вы вопрос задаёте. А это совсем из другой песни слова :)
После первого поста у меня вкрадывались подозрения,что не совсем корректно написал.. ))) но пустил по ветру )))
 
Karlson:
После первого поста у меня вкрадывались подозрения,что не совсем корректно написал.. ))) но пустил по ветру )))

Результат работы вашего скрипта:

2012.04.30 01:51:34     Core 1  2012.01.02 22:48:34   Ошибка 4806
2012.04.30 01:51:34     Core 1  2012.01.02 22:48:34   Скопировано = -1
2012.04.30 01:51:34     Core 1  2012.01.02 22:48:31   Ошибка 4806
2012.04.30 01:51:34     Core 1  2012.01.02 22:48:31   Скопировано = -1
2012.04.30 01:51:34     Core 1  2012.01.02 22:48:28   Ошибка 4806
2012.04.30 01:51:34     Core 1  2012.01.02 22:48:28   Скопировано = -1
2012.04.30 01:51:34     Core 1  2012.01.02 22:48:25   Ошибка 4806
2012.04.30 01:51:34     Core 1  2012.01.02 22:48:25   Скопировано = -1
2012.04.30 01:51:33     Tester  quality of analyzed history is 100%
2012.04.30 01:51:33     Core 1  EURUSD: history synchronization completed [7 Kb]
2012.04.30 01:51:33     Core 1  EURUSD: history for 2012 year synchronized

Не заметно, что "все работает".

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

 

Во первых не скрипт,а в варианте советника.

Отсюда,что работать будет ,когда пойдут тики.

Во вторых вот что у меня:

В третьих можете проверить данные и историю:

https://www.mql5.com/ru/docs/series/timeseries_access

https://www.mql5.com/ru/docs/series/bars

https://www.mql5.com/ru/docs/series/seriesinfointeger 

 

 

Ну вот когда "это" будет хоть как-то оперировать со сделками, тогда и назовем ваш код советником, но если вам принципиально, то пусть будет по вашему.

Во вторых, я в первом посте написал, что проблема именно в тестере.

В третьих, я же сам и написал что проблема в истории. Функции определения состояния истории (аля SeriesInfoInteger) покажет мне информацию которую я и так знаю.

В тестере:

2012.05.02 21:54:51     Core 1  2012.01.02 00:00:00   Bars in history: 261, is synсronized: 1

 В режиме реальной торговли:

2012.05.02 21:55:25     issue (EURUSD,D1)       Bars in history: 10632, is synсronized: 1

Код:

PrintFormat( "Bars in history: %i, is synсronized: %i", SeriesInfoInteger( Symbol(), Period(), SERIES_BARS_COUNT ), SeriesInfoInteger( Symbol(), Period(), SERIES_SYNCRONIZED) );

 Финальный вопрос состоял в том, как сейчас контролировать историю в Терминале (аля History Center для 4-ки), где можно было бы видеть что есть и докачать, если необходимо? 

 

Гут ,добавим сделки.Хотя ,если есть обработчик OnTIck,то вариантов нет что это.

У меня все работает. Выдаст ошибку пишите.

Файлы:
MA_Tester.mq5  3 kb