Мультивалютный тестинг

 

Всем привет!

Подскажите новичку в чем проблема!

Пытаюсь одолеть мультивалютный тестинг, но ничего не получается уже в самом начале. Следующий код:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
   for(int i=0;i<SymbolsTotal(false);i++)
   {
   SymbolSelect(name,true);
   }
      
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  for(int i=0;i<SymbolsTotal(false);i++)
   {
   MqlTick last_tick;
   if(SymbolInfoTick(SymbolName(i,false),last_tick))
     {
      Print(last_tick.time,": Bid = ",last_tick.bid,
            " Ask = ",last_tick.ask,"  Volume = ",last_tick.volume," Symbol = ",SymbolName(i,false));
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
   }
   
  }
//+------------------------------------------------------------------+

 Приводит к следующему результату в режиме тестирования:

Ошибки тестирования 

 Вопрос, собственно , почему? Хотя тут: https://www.mql5.com/ru/articles/239 сказано, что при первом же обращении история загрузится и начнется моделирование тиков по выбранному алгоритму. В терминале все работает, а в тестере нет, почему?

 
kirdk:

 Вопрос, собственно , почему? Хотя тут: https://www.mql5.com/ru/articles/239 сказано, что при первом же обращении история загрузится и начнется моделирование тиков по выбранному алгоритму. В терминале все работает, а в тестере нет, почему?

В статье что-нибудь говорится о том, что история загружается сразу для всех символов?
 
Yedelkin:
В статье что-нибудь говорится о том, что история загружается сразу для всех символов?

А причем здесь "все"? В статье говорится "Кроме того, можно явно запросить историю для нужных символов с помощью вызова функции SymbolSelect() в обработчике OnInit()", что я и делаю... 

for(int i=0;i<SymbolsTotal(false);i++)
   {
   string name = SymbolName(i,false);
   SymbolSelect(name,true);
   }
 
kirdk:

А причем здесь "все"?

При том, что первоначально Вы сослались только на то, что в статье "...сказано, что при первом же обращении история загрузится и начнется моделирование тиков по выбранному алгоритму". Уточняющий вопрос ещё никому не повредил.

kirdk:

В статье говорится "Кроме того, можно явно запросить историю для нужных символов с помощью вызова функции SymbolSelect() в обработчике OnInit()", что я и делаю... 

 В первоначально выложенном коде

int OnInit()
  {
//--- create timer
   EventSetTimer(60);
   for(int i=0;i<SymbolsTotal(false);i++)
   {
   SymbolSelect(name,true);
   }
непонятно, что за переменную name использует SymbolSelect(). Поэтому Вы делали не совсем то, о чём написали во втором сообщении :)
 
Yedelkin:

При том, что первоначально Вы сослались только на то, что в статье "...сказано, что при первом же обращении история загрузится и начнется моделирование тиков по выбранному алгоритму". Уточняющий вопрос ещё никому не повредил.

 В первоначально выложенном коде

непонятно, что за переменную name использует SymbolSelect(). Поэтому Вы делали не совсем то, о чём написали во втором сообщении :)

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

string name = SymbolName(i,false);

 Именно эта переменная и используется в выборе инструментов:

SymbolSelect(name,true);

 Однако, почему-то не работает...  В статье, также говорится что в окне тестера вроде как в обзоре рынка должны появляться котировки, однако и этого у меня не происходит...


Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
  • www.mql5.com
Получение рыночной информации / SymbolIsSynchronized - Документация по MQL5
 

ОК. У себя пока запустить не могу - тестеры заняты.

 

Запустил - результаты аналогичные. При этом никакой новой истории не закачивается, а история по имеющимся инструментам не используется. Если интересно, посмотрите поиском по форуму проблемы, связанные с функцией SymbolInfoTick() в тестере. Может, там уже есть решение.

 
Yedelkin:

Запустил - результаты аналогичные. При этом никакой новой истории не закачивается, а история по имеющимся инструментам не используется. Если интересно, посмотрите поиском по форуму проблемы, связанные с функцией SymbolInfoTick() в тестере. Может, там уже есть решение.

Искал, не нашел. Может кто из админов носом ткнет?
 
А в указанном диапазоне тестирования в терминале история есть по всем инструментам?
 
alexvd:
А в указанном диапазоне тестирования в терминале история есть по всем инструментам?

Нет, не по всем: "При этом никакой новой истории не закачивается, а история по имеющимся инструментам не используется"

 

 

По поводу данного вопроса.

1. Разработчикам - С каких пор пор использование SymbolName(i,false) формирует MarketWatch? Когда-то уже ругался по этому поводу, придется снова!!!

С какого это паровоза тестер решил что при обращении SymbolName нужно символ выставлять в обзор? Я еще вообще-то не решил хочу или нет данный символ выставить в обзор.

Также и многие другие функции с инфой по символу по идеи не должны добавлять символ в обзор (для начала нужно определиться что за символ и нужен ли он мне).

Как минимум использование SymbolName обзор рынка (MarketWatch) затрагивать не должно.

Результат можно на скрине выше посмотреть.

2. По поводу SymbolSelect

//Так работает

SymbolSelect("EURUSD",true);
SymbolSelect("GBPUSD",true);

//Так нет (верней сиволы в обзор попадают, а вот цены и другая инфа нет).
//Такое впечатление что SymbolName добавляет символ в список, а выбор после этого не происходит

  for(int i=0;i<SymbolsTotal(false);i++)
  {
  name = SymbolName(i,false);
  SymbolSelect(name,true);
  }

3. По поводу примера - Блок инициализации

На мой взгляд если тчоно известно какие символы нужны легче из файла или масиива сформировать список. Блок инициализации на первый взгляд должен выглядеть так

int OnInit()
{
//+------------------------------------------------------------------+
string name = "";
//+------------------------------------------------------------------+

//Select
  for(int i=0;i<SymbolsTotal(false);i++)
  {
  name = SymbolName(i,false);
  //Тут можно проверку сделать дополнительную
  SymbolSelect(name,true);
  }

//Сreate timer
EventSetTimer(60);
    
//+------------------------------------------------------------------+
return(0);
//+------------------------------------------------------------------+
}

4. По поводу примера - таймер

Зачем обрабатывать символы которые не выбраны в MarketWatch? немного переделанный пример обработчика таймера выглядит так (можно добавить дополнительных проверок).

void OnTimer()
{
//+------------------------------------------------------------------+
string name = ""; //Переменную можно вывести на уровень модуля, чтобы была доступна везде.
//+------------------------------------------------------------------+
  for(int i=0;i<SymbolsTotal(true);i++)
  {
  name = SymbolName(i,true);
  
    if(SymbolInfoTick(name,last_tick))
    {
    Print("Symbol ",name," - ",last_tick.time,": Bid = ",last_tick.bid,
    " Ask = ",last_tick.ask,"  Volume = ",last_tick.volume," Symbol = ",SymbolName(i,false));
    }
    else Print("SymbolInfoTick() failed, error = ",GetLastError());
   
   }
//+------------------------------------------------------------------+   
}
Причина обращения: