Не понимаю авторов мультивалютных советников, не использующих мультивалютный OnTick, который обеспечивает совпадение результатов, вне зависимости от выбранного _Symbol.
И это не поможет. Если только не ставить индикатор-тикер на кросс-курс из валюты профита в валюту счета дополнительно ко всем инструментам. Т.е. трогуете по 2 инстр, и может понадобитья еще до 2х тикеров на кроссы.
Forester #: И это не поможет. Если только не ставить индикатор-тикер на кросс-курс из валюты профита в валюту счета дополнительно ко всем инструментам. Т.е. трогуете по 2 инстр, и может понадобитья еще до 2х тикеров на кроссы.
Такие решения еще можно оправдать для одиночных проходов (и то не всех), но точно не для оптимизации.
Похожая проблема уже описывалась https://www.mql5.com/ru/forum/360210/page41#comment_20741563
Проблема с символом GBPCHF на ДЦ Alp...ry. Если тестируем по нему же (GBPCHF), то ошибок нет. Если тест по любому другому инструменту, то то возникает сообщение "old tick GBPCHF" проблема которая обсуждается периодически на форуме более 10 лет, судя по поиску. Видимо так и не решена. После возникновения old tick запрос к SymbolInfoTick() получает bid = 0; нарушая работу с этим тиком.
Проверочный эксперт:
void tst(){
MqlTick Ticks[];
CopyTicksRange("GBPCHF", Ticks, COPY_TICKS_INFO, D'2023.05.30 00:15:00' * 1000, D'2023.05.30 00:16:00' * 1000);
ArrayPrint(Ticks);
Print(AccountInfoString(ACCOUNT_SERVER));
}
voidOnInit(){Print("Init");tst();}
voidOnDeinit(constint reason){Print("Deinit");tst();}
voidOnTick(){
MqlTick Tick;
ResetLastError();
if( SymbolInfoTick("GBPCHF",Tick)){
if( TimeSec(TimeCurrent()) < 993 ){Print("ask=",Tick.ask, " bid=",Tick.bid," time=",Tick.time, " ",Tick.time_msc%1000, (Tick.ask==0.0 || Tick.bid==0.0 ? " Error <<<<<<<<<":""));}
} else {Print("SymbolInfoTick() failed, error = ",GetLastError());}
}
int TimeSec ( datetime time ){return((int)( time % 86400));}//current second in day. 86400 sec in day
Запускаю на GBPUSD аккаунт GBP. Старт теста с 2023.05.30 по 2023.06.03
Результат работы:
Печатаются результаты от SymbolInfoTick( GBPCHF,...)
Для первых 3х тиков цена правильная bid = 1.11478, но время тика неправильное time=2023.05.30 00:15:30 0 - не было тика в это время (см. экспорт ниже), видимо смоделировали искусственный тик, назвали его old tick, и вывели сообщение.
Затем 3 тика с bid=0 на момент 00:15:58 707. Но не взяли цену от смоделированного тика с правильным временем, а установили в 0 (как будто бидов вообще не найдено) - возможно в этом проблема!Берите цену от этого искусственного old tick, если других bid-ов не нашлось, 0 выдавать не нужно, т.к. иногда нужно делить на цену, т.е. будет деление на 0.
Запрос (в конце теста за этот 1 день) через CopyTicksRange вернет тоже bid=0 на этот тик датированный 00:15:58 707. Если запустить тест не на 1 день, а на несколько, то запрос через CopyTicksRange вернет правильную цену на этот тик датированный 00:15:58 707, но SymbolInfoTick( GBPCHF,...) по прежнему будет возвращать bid=0
Экспорт тиков из терминала:
"<DATE><TIME><BID><ASK><LAST><VOLUME><FLAGS>"
"2023.05.29 23:54:40.579 1.11727 2"
"2023.05.29 23:54:44.613 1.11726 2"
Новый день и пауза в 20 мин на ролловер ------------------
"2023.05.30 00:15:03.675 1.11478 1.11849 6"
"2023.05.30 00:15:16.345 1.11853 4"
"2023.05.30 00:15:58.689 1.11854 4"
"2023.05.30 00:15:58.707 1.11853 4"
"2023.05.30 00:15:58.707 1.11854 4"
"2023.05.30 00:16:29.411 1.11544 1.11764 6"
"2023.05.30 00:16:41.232 1.11529 1.11807 6"
Ошибки по old tick появились на первых 2х тиках инструмента за этот день. Тики с ценой есть, почему же возник old tick? Может что-то с последними тиками прошлого дня? Вывел пару последних через экспорт. Или из за того, что был ролловер и не было тиков 20 минут. После этих 2х тиков новых bid не было и должен был взяться последний известный bid. Но видимо тестер не смог вычислить правильный бид для тика в 00:15:58.707 и установил его в 0. Мог бы взять с смоделированного с неправильным временем time=2023.05.30 00:15:30 0
-------------------------------------------
Если начать тест с 2023.05.29 то ошибок с bid=0 не возникает. SymbolInfoTick() показывает правильную цену для тика в тот же самый момент времени:
Т.е. проблема возникает в некоторые дни, в этом случайно обнаруженном примере возникает при запуске 30 мая, а при запуске 29 мая не возникает.
Bases и History для GBPCHF удалял, новые скачались, ошибка осталась. Думаю можно воспроизвести её на любом компьютре. Архивы с тиками за май и июнь прикрепил в zip-ах на случай если понадобятся.
Мы хотим видеть описание в поле данных, которое появляется. мы НЕ хотим видеть описание в виде текста в каждом отдельном объекте. Есть какие-то запреты на использование такой конструкции или это бага компилятора. похоже на недокументированную особенность платформы
Не понимаю авторов мультивалютных советников, не использующих мультивалютный OnTick, который обеспечивает совпадение результатов, вне зависимости от выбранного _Symbol.
И это не поможет. Если только не ставить индикатор-тикер на кросс-курс из валюты профита в валюту счета дополнительно ко всем инструментам. Т.е. трогуете по 2 инстр, и может понадобитья еще до 2х тикеров на кроссы.
Такие решения еще можно оправдать для одиночных проходов (и то не всех), но точно не для оптимизации.
Вам необходимо обновить свой код. Препроцессор теперь будет работать больше как C++: https://gcc.gnu.org/onlinedocs/cppinternals/Macro-Expansion.html.
Ок. Спасибо.
Тем не менее вопрос по двум оставшимся конструкциям остается, мало этого добавляется еще один:
Похожая проблема уже описывалась https://www.mql5.com/ru/forum/360210/page41#comment_20741563
Проблема с символом GBPCHF на ДЦ Alp...ry.
Если тестируем по нему же (GBPCHF), то ошибок нет.
Если тест по любому другому инструменту, то то возникает сообщение "old tick GBPCHF" проблема которая обсуждается периодически на форуме более 10 лет, судя по поиску. Видимо так и не решена.
После возникновения old tick запрос к SymbolInfoTick() получает bid = 0; нарушая работу с этим тиком.
Проверочный эксперт:
Запускаю на GBPUSD аккаунт GBP. Старт теста с 2023.05.30 по 2023.06.03


Результат работы:
Печатаются результаты от SymbolInfoTick( GBPCHF,...)
Для первых 3х тиков цена правильная bid = 1.11478, но время тика неправильное time=2023.05.30 00:15:30 0 - не было тика в это время (см. экспорт ниже), видимо смоделировали искусственный тик, назвали его old tick, и вывели сообщение.
Затем 3 тика с bid=0 на момент 00:15:58 707. Но не взяли цену от смоделированного тика с правильным временем, а установили в 0 (как будто бидов вообще не найдено) - возможно в этом проблема! Берите цену от этого искусственного old tick, если других bid-ов не нашлось, 0 выдавать не нужно, т.к. иногда нужно делить на цену, т.е. будет деление на 0.
Запрос (в конце теста за этот 1 день) через CopyTicksRange вернет тоже bid=0 на этот тик датированный 00:15:58 707. Если запустить тест не на 1 день, а на несколько, то запрос через CopyTicksRange вернет правильную цену на этот тик датированный 00:15:58 707, но SymbolInfoTick( GBPCHF,...) по прежнему будет возвращать bid=0
Экспорт тиков из терминала:
Ошибки по old tick появились на первых 2х тиках инструмента за этот день. Тики с ценой есть, почему же возник old tick? Может что-то с последними тиками прошлого дня? Вывел пару последних через экспорт. Или из за того, что был ролловер и не было тиков 20 минут.
-------------------------------------------После этих 2х тиков новых bid не было и должен был взяться последний известный bid. Но видимо тестер не смог вычислить правильный бид для тика в 00:15:58.707 и установил его в 0. Мог бы взять с смоделированного с неправильным временем time=2023.05.30 00:15:30 0
Если начать тест с 2023.05.29 то ошибок с bid=0 не возникает. SymbolInfoTick() показывает правильную цену для тика в тот же самый момент времени:
2023.05.30 00:16:03 ask=1.11854 bid=1.11478 time=2023.05.30 00:15:58 707
Т.е. проблема возникает в некоторые дни, в этом случайно обнаруженном примере возникает при запуске 30 мая, а при запуске 29 мая не возникает.
Bases и History для GBPCHF удалял, новые скачались, ошибка осталась. Думаю можно воспроизвести её на любом компьютре. Архивы с тиками за май и июнь прикрепил в zip-ах на случай если понадобятся.
Жаль, что разработчики сейчас не такие общительные, как раньше по той же проблеме https://www.mql5.com/ru/forum/160552#comment_3823239 Видимо решили вопрос, но не окончательно.
Надеюсь этот анализ поможет разработчикам решить многолетнюю проблему с old tick и bid=0.
#define DEFINES_PARAM_NAME(text) input string text #define PARAM(number) DEFINES_PARAM_NAME( "Параметр" ##number) #define DEFINES_GROUP_NAME(text) input group text #define GROUPP(number) DEFINES_GROUP_NAME( "Группа" ##number) PARAM( 1 ); // Компилится и работает PARAM( 2 ); PARAM( 3 ); GROUPP( 1 ); // Ошибка копиляции GROUPP( 2 ); GROUPP( 3 ); void OnStart () { }
Потому что для GROUP текст должен быть строкой, а не идентификатором.
Потому что для GROUP текст должен быть строкой, а не идентификатором.
Да, спасибо, тупанул . )))
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Общайтесь с разработчиками через Сервисдеск!
Alexandr Gavrilin, 2023.12.12 06:39
MT5 build 4090
При перетаскивании индикатора на график, открывается индикатор который находиться в списке выше!!!!
b4092, отсутствует ошибка компиляции.
А почему должна быть ошибка? Раньше в MQL так нельзя было - сейчас можно. Это шаг вперед, а не назад
А почему должна быть ошибка? Раньше в MQL так нельзя было - сейчас можно. Это шаг вперед, а не назад
Пустой разговор.