Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления - страница 31

 
fxsaber #:

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

И это не поможет. Если только не ставить индикатор-тикер на кросс-курс из валюты профита в валюту счета дополнительно ко всем инструментам. Т.е. трогуете по 2 инстр, и может понадобитья еще до 2х тикеров на кроссы.
 
Forester #:
И это не поможет. Если только не ставить индикатор-тикер на кросс-курс из валюты профита в валюту счета дополнительно ко всем инструментам. Т.е. трогуете по 2 инстр, и может понадобитья еще до 2х тикеров на кроссы.

Такие решения еще можно оправдать для одиночных проходов (и то не всех), но точно не для оптимизации.

 
Alain Verleyen #:

Вам необходимо обновить свой код. Препроцессор теперь будет работать больше как C++: https://gcc.gnu.org/onlinedocs/cppinternals/Macro-Expansion.html.

Ок. Спасибо.

Тем не менее вопрос  по двум оставшимся конструкциям остается, мало этого добавляется еще один:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#property script_show_inputs

#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()
  {
   
  }
 

Похожая проблема уже описывалась 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));
}
void OnInit(){Print("Init");tst();}
void OnDeinit(const int reason){Print("Deinit");tst();}

void OnTick(){
   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() показывает правильную цену для тика в тот же самый момент времени:

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.

Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике - В мт4 работает полноценно, но в MQL5 это не работает. Вызов конструктора класса по-умолчанию из параметрического конструктора вызывает деструктор
Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике - В мт4 работает полноценно, но в MQL5 это не работает. Вызов конструктора класса по-умолчанию из параметрического конструктора вызывает деструктор
  • 2021.02.13
  • www.mql5.com
Мы хотим видеть описание в поле данных, которое появляется. мы НЕ хотим видеть описание в виде текста в каждом отдельном объекте. Есть какие-то запреты на использование такой конструкции или это бага компилятора. похоже на недокументированную особенность платформы
Файлы:
GBPCHF.zip  12348 kb
 
b4092, отсутствует ошибка компиляции.
void f( const int& ) {}

void OnStart()
{
  f(0); // OK.
}
 
elavr # :
#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 текст должен быть строкой, а не идентификатором.

 #define TO_STRING(x)     #x
 #define DEFINES_GROUP_NAME(text) input group TO_STRING(text) 
 
Alain Verleyen #:
Потому что для GROUP текст должен быть строкой, а не идентификатором.

Да, спасибо, тупанул . )))

 
fxsaber #:
b4092, отсутствует ошибка компиляции.

А почему должна быть ошибка? Раньше в MQL так нельзя было - сейчас можно. Это шаг вперед, а не назад

 
A100 #:

А почему должна быть ошибка? Раньше в MQL так нельзя было - сейчас можно. Это шаг вперед, а не назад

Пустой разговор.

Причина обращения: