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

 

Здравствуйте. Пишу уже не первый раз.

При использовании CopyTicks быстро съедается оперативная память. При попытке запросить историю для накопления в файлах .tkc, например, по всем опционам текущей серии только лишь одной underlying акции за один день (в примере это пара сотен тикеров и всего лишь пара сотен тысяч тиков) съедается 3 ГБ памяти, брокер Финам (зарубежная дочка). Пока я копировал пример из прошлого поста об этой ошибке, я забыл выставить новую дату для закачки тиков по новой серии опционов, т.е. качается по 0 тиков, но память всё равно съедается. В скрипте стоит фильтр на сегодняшнюю дату истории и на тикеры " 220509", это внутринедельные опционы, такие бывают только на SPY, см. лог. Пятничных, а тем более месячных тикеров в десятки раз больше, память засоряется моментально. Аналогично всё происходит при вызове copy_ticks из Питона. В примере с опционами SPY я запустил скрипт 2 раза, затем перезагрузил терминал и запустил скрипт ещё раз. 

Другой пример, старый, - копирование тиков форекс с сервера mt5-demo, там ситуация ещё относительно терпимая, но память всё равно засоряется.

Билды 3280 (Финам, тики на опционы SPY, имя скрипта и логов оканчивается на *_SPY) или 3285 (mt5-demo, тики на форекс, имя скрипта и логов - *_mt5_demo).

Прошлый пост

https://www.mql5.com/ru/forum/388631/page14#comment_27885366

Новая версия платформы MetaTrader 5 build 3210: изменен алгоритм расчета Sharpe Ratio и добавлено управление минимальным/максимальным значением индикатора
Новая версия платформы MetaTrader 5 build 3210: изменен алгоритм расчета Sharpe Ratio и добавлено управление минимальным/максимальным значением индикатора
  • 2022.02.22
  • www.mql5.com
В пятницу 11 февраля 2022 года будет выпущена обновленная версия платформы MetaTrader 5...
 

Также добавьте, пожалуйста, возможность отслеживать тики других инструментов, а не только того, на котором запущен эксперт. Сейчас есть только событие OnTick(), а нужно что-то вроде

void OnTick(const string&  symbol)

Я знаю, что можно следить за стаканами с OnBookEvent, но по нужным мне инструментам (опционы) брокер просто не даёт такой фид - стакан пустой и через MQL5, и в терминале, а тики (bid/ask) есть. Открывать кучу графиков и вешать на каждый из них свой эксперт - плохой вариант. Предлагали кустарное решение с iCustom - тоже, считаю, плохой, лучше нативная поддержка. Об этом тоже писал в теме билда 3210.

 
xfo #:
void OnTick(const string&  symbol)

+1

 
xfo #:

Также добавьте, пожалуйста, возможность отслеживать тики других инструментов, а не только того, на котором запущен эксперт. Сейчас есть только событие OnTick(), а нужно что-то вроде

Я знаю, что можно следить за стаканами с OnBookEvent, но по нужным мне инструментам (опционы) брокер просто не даёт такой фид - стакан пустой и через MQL5, и в терминале, а тики (bid/ask) есть. Открывать кучу графиков и вешать на каждый из них свой эксперт - плохой вариант. Предлагали кустарное решение с iCustom - тоже, считаю, плохой, лучше нативная поддержка. Об этом тоже писал в теме билда 3210.

OnTimer()
https://www.mql5.com/ru/docs/runtime/testing

Функция OnTimer() в тестере #

Мультивалютное тестирование #

адаптируйте и всё получится.

Документация по MQL5: Программы MQL5 / Тестирование торговых стратегий
Документация по MQL5: Программы MQL5 / Тестирование торговых стратегий
  • www.mql5.com
Тестирование торговых стратегий - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
xfo #:
void OnTick(const string&  symbol)

Согласен. ++

Столкнулся с неудобством, когда в мультивалютном эксперте потребовалось поймать первый тик нового бара. Когда ловится первый тик нового бара на текущим символе, на некоторых других новый бар ещё не открылся. Приходится проверять, есть ли новый бар для каждого символа. В советнике, который выложил на мониторинг, я конечно решил этот вопрос другим путём. Но при расчёте, например, корреляции, такие тики где разные последние бары приходится просто игнорировать, так как происходит смещение последовательности баров.

 
fxsaber #:
Полностью понятны сообщения компилятора, но все же есть ощущение неодинакового применения некоторых шаблонных конструкций.

В случае, когда функция возвращает структуру - функция вовзвращает ссылку, вот так выглядит псевдо код вызова f(g()) для MqlTick

//--- объявление g
MqlTick &g<MqlTick>(MqlTick &implicit_ret_object);

//--- вызов f(g())
MqlTick implicit_object;
g<MqlTick>(implicit_object);
f(implicit_object);


В случае g<int> нет неявного объекта(памяти), только значение, а для ссылки нужна память

Здесь требуется доработка MQL, варианты:

  1. "расслабить" ссылки - разрешить передачу значений по ссылке

    в этом случае будет не всё так однозначно с перегрузками
    • void f(int &);
    • void f(int);

  2. добавить не строгую  ссылку  "ссылка на объект или значение", например вместо символа & использовать %

    в этом случае, функции ниже будут идентичными - компилятор будет ругаться
    • void f(int %);
    • void f(int);

    использовать % будет разумно только в шаблонах
 
Ilyas #:

В случае, когда функция возвращает структуру - функция вовзвращает ссылку, вот так выглядит псевдо код вызова f(g()) для MqlTick


В случае g<int> нет неявного объекта(памяти), только значение, а для ссылки нужна память

Здесь требуется доработка MQL, варианты:

  1. "расслабить" ссылки - разрешить передачу значений по ссылке

    в этом случае будет не всё так однозначно с перегрузками
    • void f(int &);
    • void f(int);

  2. добавить не строгую  ссылку  "ссылка на объект или значение", например вместо символа & использовать %

    в этом случае, функции ниже будут идентичными - компилятор будет ругаться
    • void f(int %);
    • void f(int);

    использовать % будет разумно только в шаблонах

Я слабо компетентен в данном вопросе. Второй вариант видится лучше первого.

 
Ilyas #:

В случае, когда функция возвращает структуру - функция вовзвращает ссылку, вот так выглядит псевдо код вызова f(g()) для MqlTick


В случае g<int> нет неявного объекта(памяти), только значение, а для ссылки нужна память

Здесь требуется доработка MQL, варианты:

  1. "расслабить" ссылки - разрешить передачу значений по ссылке

    в этом случае будет не всё так однозначно с перегрузками
    • void f(int &);
    • void f(int);

  2. добавить не строгую  ссылку  "ссылка на объект или значение", например вместо символа & использовать %

    в этом случае, функции ниже будут идентичными - компилятор будет ругаться
    • void f(int %);
    • void f(int);

    использовать % будет разумно только в шаблонах

Разрешите передавать значение по константной ссылке, как в C++.

И когда функция возвращает структуру, она должна возвращать структуру, а не ссылку. С вызовом конструктора копирования, конечно.

Лучше разрешите возвращать ссылку явно. Пусть даже её нельзя сохранять в переменную, это сильно увеличит возможности языка.


 
Koldun Zloy #:


  1. Разрешите передавать значение по константной ссылке, как в C++.
  2. И когда функция возвращает структуру, она должна возвращать структуру, а не ссылку. С вызовом конструктора копирования, конечно.
  3. Лучше разрешите возвращать ссылку явно. Пусть даже её нельзя сохранять в переменную, это сильно увеличит возможности языка.
  1. согласен, добавим (приоритет низкий)

  2. ваше предложение звучит как признание в некомпетентности (как программы выполняются на CPU)
    что Вы вкладываете в понятие "должна возвращать структуру, а не ссылку", возвращать через регистры CPU что ли?

  3. работаем над этим
 
Ilyas #:
  1. согласен, добавим (приоритет низкий)

  2. ваше предложение звучит как признание в некомпетентности (как программы выполняются на CPU)
    что Вы вкладываете в понятие "должна возвращать структуру, а не ссылку", возвращать через регистры CPU что ли?

  3. работаем над этим

Я ничего не говорил о том как это передаётся внутри.

В приведённом выше коде:

  f( g< MqlTick >() ); // OK
  f( g< int >() );     // 'g<int>' - parameter passed as reference, variable expected

ошибка должна быть в обоих случаях, так как для программиста MQL они равны.

И я против использования '%'.

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