Скачать MetaTrader 5

GlobalVariable

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Николай
2224
Николай  

Интересует работа функций управления глобальными переменными терминала в тестере !!!

По началу все работало. Сейчас отклики функций сообщают, что все отлично, а в списке по F3  ничего не происходит.

Например следующий код.

string   sSmbl   =  "EURUSD";
string   iStrtBlnc;
string   sgeblnc = "G_Balans_"+ sSmbl;
int      iEqvt   = 5000;

int iGVS = GlobalVariableSet(sgeblnc,iEqvt);
Print(iGVS,"   ",GetLastError());

 сообщает об успешности выполнения, а окно с глобальными переменными остается пустым.

При навешивании на чарт, все работает.

Изменились правила игры или что-то не так ? 

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
MetaQuotes
Админ
25053
Renat Fatkhullin  
У каждого тестер-агента свои копия глобальных переменных, которая никак не связана с клиентским терминалом.
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
Николай
2224
Николай  
Renat:
У каждого тестер-агента свои копия глобальных переменных, которая никак не связана с клиентским терминалом.

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

В особенности это касается таких моментов, которые отличаются от MQL4.

Дополнительно в описаниях функций хочется видеть особенности их поведения в тестере.

Например в  MQL4

datetime TimeCurrent( ) 
Возвращает последнее известное время сервера (время прихода последней котировки) в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Замечание: при тестировании последнее известное время сервера моделируется. 
Пример:
  if(TimeCurrent()-OrderOpenTime()<360) return(0);

 

А в MQL5

TimeCurrent

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это – время прихода последней котировки по любому символу, доступного в окне "Обзор рынка", то самое время, которое показано в заголовке этого окна. Значение времени формируется на торговом сервере и не зависит от настроек времени на компьютере пользователя. Существует 2 варианта функции.

Вызов без параметров

datetime  TimeCurrent();


Вызов с параметром типа MqlDateTime

datetime  TimeCurrent(
   MqlDateTime&  dt_struct      // переменная типа структуры
   );


Параметры

dt_struct

[out]  Переменная типа структуры MqlDateTime.

Возвращаемое значение

Значение типа datetime

Примечание

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

 

Про поведение в тестере ничего.  Познавать приходится импирически.

Спасибо. 

Николай
2224
Николай  

Вот еще

SymbolsTotal

Возвращает количество доступных (выбранных в MarketWatch или всех) символов.

int  SymbolsTotal(
   bool  selected      // true – только символы в MarketWatch
   );


Параметры

selected

[in]  Режим запроса. Может принимать значения true или false.

Возвращаемое значение

Если параметр selected равно true, то возвращается количество выбранных в MarketWatch символов. Если значение false, то возвращается общее количество всех символов.

 

В тестере всегда возвращает либо 1 либо 49.

Может я не туда смотрю и не там читаю?  

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе - Документация по MQL5
Sergey Gritsay
6562
Sergey Gritsay  
SHOOTER777:

Вот еще

 

В тестере всегда возвращает либо 1 либо 49.

Может я не туда смотрю и не там читаю?  

интересно, а сколько он вам должен символов возвращать если их постоянное количество
Николай
2224
Николай  
sergey1294:
интересно, а сколько он вам должен символов возвращать если их постоянное количество

Ровно столько, сколько я выберу в окне обзор рынка

Если параметр selected равно true, то возвращается количество выбранных в MarketWatch символов

 

Sergey Gritsay
6562
Sergey Gritsay  
SHOOTER777:

Ровно столько, сколько я выберу в окне обзор рынка

 

 выберите в тестере режим Все символы, выбранные в окне "Обзор рынка" и будет вам счастье 
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе - Документация по MQL5
Vladimir Batrudinov
4930
Vladimir Batrudinov  
SHOOTER777:

Вот еще

 

В тестере всегда возвращает либо 1 либо 49.

Может я не туда смотрю и не там читаю?  

sergey1294:
 выберите в тестере режим Все символы, выбранные в окне "Обзор рынка" и будет вам счастье 

Обзор рынка терминала (MarketWatch) не имеет никогоко отношения к тестеру стратегий при работе с функцией SymbolsTotal и подобными!

Тут дело такое - Если идет тестирование, то активным становится только тот символ на который был настроен тестер стратегий (если идет оптимизация по всем символам, то тут просто символ будет изменяться, на основании списка который активен в ОБЗОРЕ РЫНКА терминала). В этом случае возвращается 1. Следовательно  все данные подгружаются только по этому символу.

Если при этом SymbolsTotal вызвана с параметром FALSE вернется, как и положено, количество символов торгуемых в конкретном ДЦ (в нашем случае 49).

Чтобы корректно начать торговать в мультивалютном режиме, необходимо в блоке инициализации узнать полное число символов, а потом в цикле определить какой символ сделать доступным в MarketWatch тестера.

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

PS

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

Slava
Модератор
6918
Slava  
SHOOTER777:

Вот еще

 

В тестере всегда возвращает либо 1 либо 49.

Может я не туда смотрю и не там читаю?  

В тестерном обзоре рынка изначально выбран всегда один символ. Доступны только те символы, которые выбраны в обзоре рынка клиентского терминала (у Вас их, видимо, 49). Из числа этих 48 (49-1) Вы можете ещё выбрать символы в тестерный Обзор рынка. Из тестера Вы можете обращаться к любому из этих 48 символов - соответствующие данные в тестер будут подгружаться автоматически.
Николай
2224
Николай  

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

На демке все работает нормально и выглядит это примерно так см. в левом углу

 

 

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

Вот участок кода

 

//+------------------------------------------------------------------+
int cObjectDL::iSmblsIndx(string& sSmblNm) // определение имеющихся и подготовка новых инструментов
  {int ii; bool bfls=false;
     iSmblsTtlT=SymbolsTotal(true);// только символы в MarketWatch всего
   for(ii=0; ii<iSmblsTtlT; ii++)  // пробегаемся по всем символам в MarketWatch
     {if(sSmblNm==sArSmbls[ii])    // сравниваем по порядку все с переданым
        {bfls=true;break;}}        // если он есть в списке, то прерываем цикл
        if(bfls) return(ii);       // и выходим со значением номера в списке
        if(iSmblsTtl>=iSmblsTtlT)  // если кол-во символов превысит из MarketWatch
        return(-1);                // то выйдем с ошибкой
                                   // если символа нет в списке, то добавим его
   ii=iSmblsTtl;                   // присваиваем индексу новое последнее значение
   iSmblsTtl++;                    // а общее количество инструментов увеличивается
   sArSmbls[ii]=sSmblNm;           // вносим в массив новое имя инструмента
   for(int ik=0;ik<=7-1;ik++)      // и обнуляем все его количественные значения 
   {dArItgDt[ii][ik]=0;}
return(ii); }                      // и выходим со значением нового номера в списке
//+------------------------------------------------------------------+

 

 

Если поставить false, то все работает, тестируется, но медленнее, да и не оптимально это.

Пока нет визуального режима при тестировании, это не проблема, просто работа этого блока при инициализации отключается, он в тестере нужен мне был только для отладки через PRINT )))

Остается дебагер и визуальный режим. Как обойти данный момент тестера?

Можно наверное два варианта кода сделать и выбирать в зависимости от  MQL5InfoInteger.

Есть у кого какие идеи. 

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий