Ограничение функционала или глюк тестера?

 
Столкнулся с таким интересным моментом - некорректно работают в тестере программные конструкции, подобные приведенному в пример куску кода (привожу самый примитивный вариант). При запуске подобных конструкций в терминале работают нормально. 
Хотелось бы услышать от знающих людей, в чём причина?  Допускаю три варианта: 1 - ограничение функционала тестера;  2 -  глюк тестера; 3 - делаю чёт не так...
Кусок кода в примере должен показывать значение Ask для первых пяти символов из окна обзора.
int               PRINT;                                             //
string            Sym_Bol;                                           //
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PRINT=1;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   for(int i=0; i<=4; i++)
     {
      Sym_Bol=SymbolName(i,true);
      if(PRINT==1) Print("ASK "+Sym_Bol+" = ",SymbolInfoDouble(Sym_Bol,SYMBOL_ASK));
     }
   PRINT=0;
  }
//+------------------------------------------------------------------+
Вот приблизительно так выглядит результат запуска кода в терминале и в тестере:

Помогите, пожалуйста, разобраться с ситуацией!
 

Вы забыли заявить/выбрать символ: https://www.mql5.com/ru/docs/marketinformation/symbolselect

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

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

Документация по MQL5: Получение рыночной информации / SymbolSelect
Документация по MQL5: Получение рыночной информации / SymbolSelect
  • www.mql5.com
Получение рыночной информации / SymbolSelect - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Renat Fatkhullin:

Вы забыли заявить/выбрать символ: https://www.mql5.com/ru/docs/marketinformation/symbolselect

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

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

Спасибо. Понял. 
 
Renat Fatkhullin:

Вы забыли заявить/выбрать символ: https://www.mql5.com/ru/docs/marketinformation/symbolselect

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

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

С этой ситуацией разобрался, но не успел порадоваться, как снова наметилась проблема. 
Суть в следующем: решил сочинить кусок кода, чтобы в маркетвотче показывались символы, отобранные по некоторым критериям. И первый из критериев отбора - не должно быть ограничений по торговле данным иструментом.
Вот такой фрагмент кода:

for(int i=0; i<=SymbolsTotal(false)-1; i++)
     {
      Sym_Bol=SymbolName(i,false);
      if(SymbolInfoInteger(Sym_Bol,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_FULL)
        {
         SymbolSelect(Sym_Bol,true);
         if(PRINT==1) Print("Sym_Bol № "+IntegerToString(i)+"  ",Sym_Bol);
        }
     }
   PRINT=0;

 В терминале работает корректно, сортирует без проблем. Но есть такой торговый инструмент (зачем он нужен непонятно, если торговли по нему нет) XPTUSD. И вот в тестере из-за него происходит остановка тестирования с ошибкой:


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

 

Все верно - вы запросили символ, по которому нет истории и тестер не сможет его моделировать. Это приводит к остановке процесса тестирования.

Зачем вы требуете от тестера моделировать символ, о котором сами не имеете представления?

Кроме того, такой код "показать все торговые инструменты" плох в самом терминале, а в тестере просто неприемлем. Моделировать 70[NNN] инструментов - это только для сурового редкого теста для исследователя, который точно знает что он хочет.

 
Renat Fatkhullin:

Все верно - вы запросили символ, по которому нет истории и тестер не сможет его моделировать. Это приводит к остановке процесса тестирования.

Зачем вы требуете от тестера моделировать символ, о котором сами не имеете представления?

Кроме того, такой код "показать все торговые инструменты" плох в самом терминале, а в тестере просто неприемлем. Моделировать 70[NNN] инструментов - это только для сурового редкого теста для исследователя, который точно знает что он хочет.

В этом и вопрос, как узнать информацию о символе (не визуально в терминале, а советнику автоматически), не вызывая всех этих ненужных процессов? Я не хочу делать никаких операций с этим конкретным символом. И не хочу работать сразу со всеми символами. Я просто хочу выбрать для работы символы удовлетворяющие определённому набору условий и работать впоследствии с выбранными символами (и критерий на разрешение торговли по инструменту - это всего лишь первый этап сортировки, и пример с 70[NNN] инструментами приведен только для иллюстрации). Но для проверки символа на соответствие или несоответствие требуемым условиям нужно как-то получить информацию о нём. И возникающая при этом ошибка не позволяет произвести сортировку. И у другого брокера подобная ситуация может быть уже с другим инструментом и не одним, поэтому просто задать в советнике правило не обращаться к какому-то конкретному символу - не выход из ситуации.
 
Vladimir Suschenko:
В этом и вопрос, как узнать информацию о символе (не визуально в терминале, а советнику автоматически), не вызывая всех этих ненужных процессов? Я не хочу делать никаких операций с этим конкретным символом. И не хочу работать сразу со всеми символами. Я просто хочу выбрать для работы символы удовлетворяющие определённому набору условий и работать впоследствии с выбранными символами.

Командой SymbolSelect вы не "просто хотите выбрать", а прямо приказываете тестеру торговых стратегий заняться моделированием цен этого инструмента. Моделирование даже одного символа - это очень тяжелая работа и для этого обязательно нужна история.

Если вы в тестер загоняете такое количество символов, значит вы вообще не понимаете, что делаете.


Чтобы понять суть процессов, выберите 10 символов через SymbolSelect в тестере на пустом эксперте без логики и запустите визуальный режим. Сразу поймете, о чем я говорю.

 
Renat Fatkhullin:

Командой SymbolSelect вы не "просто хотите выбрать", а прямо приказываете тестеру торговых стратегий заняться моделированием цен этого инструмента. Моделирование даже одного символа - это очень тяжелая работа.

Если вы в тестер загоняете такое количество символов, значит вы вообще не понимаете, что делаете.

тот же кусок кода может выглядеть и так (чтобы не грузить тестер):
if(BEGIN==1)
     {
      for(int i=0; i<=SymbolsTotal(false)-1; i++)
        {
         Sym_Bol=SymbolName(i,false);
         if(SymbolInfoInteger(Sym_Bol,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_FULL)
           {
            SymbolSelect(Sym_Bol,true);
            Print("Sym_Bol № "+IntegerToString(i)+"  ",Sym_Bol);
            SymbolSelect(Sym_Bol,false);
           }
        }
     }
   BEGIN=0;
Скорей всего, не я не понимаю, что делаю, а просто не смог донести понятно Вам, чего хочу добиться и что не получается. Команду SymbolSelect я применяю к инструментам, прошедшим отбор по каким-то критериям (в примере по отсутствию ограничений на торговые операции - if(SymbolInfoInteger(Sym_Bol,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_FULL)) а к инструменту, который таким критериям не соответствует, SymbolSelect  не применяется. То есть, мне нужно из числа инструментов, предоставляемых брокером, выбрать подходящие инструменты и с ними уже выполнять определённые действия. Тем не менее, в тестере происходит попытка синхронизировать данные по символу, который не был выбран командой SymbolSelect, поскольку по этому символу не разрешена торговля. По моей логике и пониманию данный кусок кода должен отработать так:
- При первом запуске (условие BEGIN==1) определяется количество символов, предоставляемых брокером, но не показанными в маркетвотч (SymbolsTotal(false));
- Далее идёт циклический перебор символов с проверкой, разрешена ли торговля по символу (if(SymbolInfoInteger(Sym_Bol,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_FULL));
- Только к символам отвечающим заданному условию, применяется команда SymbolSelect(Sym_Bol,true);
- Чисто для визуализации выводится информация о том инструменте, который отвечает заданным условиям и может использоваться для дальнейшей работы;
- После этого проверенный символ удаляется из маркетвотча;
- BEGIN=0 предотвращает повторение процесса.
И опять возвращаюсь к сути возникающего передо мной вопроса - как отсортировать инструменты, не подходящие для торговли, чтобы не возникала подобная ошибка в тестере?
 
Vladimir Suschenko:
То есть, мне нужно из числа инструментов, предоставляемых брокером, выбрать подходящие инструменты и с ними уже выполнять определённые действия.

Это не нужно делать в тестере.

Запустите на любом графике скрипт, подготавливающий список инструментов, а потом в тестере работайте только с ним. 

 
Andrey Khatimlianskii:

Это не нужно делать в тестере.

Запустите на любом графике скрипт, подготавливающий список инструментов, а потом в тестере работайте только с ним. 

Когда я сказал, что "мне нужно", подразумевал, что хочу реализовать возможность работы в тестере для потенциальных пользователей советника где заложен такой функционал. Я доделываю мультивалютный советник, в нём есть функция автоматического выбора инструментов для торговли по определённым критериям. Главной, и пока похоже не разрешимой проблемой, оказалась невозможность заставить его работать в тестере. Поскольку не известно, к какому брокеру и с каким набором инструментов будет подключаться пользователь, заданный жёстко список инструментов для работы - не вариант.
 
Vladimir Suschenko:
Когда я сказал, что "мне нужно", подразумевал, что хочу реализовать возможность работы в тестере для потенциальных пользователей советника где заложен такой функционал. Я доделываю мультивалютный советник, в нём есть функция автоматического выбора инструментов для торговли по определённым критериям. Главной, и пока похоже не разрешимой проблемой, оказалась невозможность заставить его работать в тестере. Поскольку не известно, к какому брокеру и с каким набором инструментов будет подключаться пользователь, заданный жёстко список инструментов для работы - не вариант.

Сделайте подбор с помощью скрипта или специального режима в самом советнике.

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

После этого файл можно подсунуть тестеру.

Ничего более элегантного в голову не приходит.