Пользовательские символы. Ошибки, баги, вопросы, предложения. - страница 36

 
Ivan Titov #:

Я добавляю тики только с флагами TICK_FLAG_BUY и  TICK_FLAG_SELL. Они разве имеют отношение к барам?

Использую только Replace-функцию. О ее влиянии на бары и говорили. Add-функция - не знаю поведения.

 

Документация по CustomTicksAdd()

Примечание

Функция CustomTicksAdd работает только для пользовательских символов, открытых в окне MarketWatch (Обзор рынка). Если символ не выбран в MarketWatch, то для вставки тиков необходимо использовать CustomTicksReplace.

Функция CustomTicksAdd позволяет транслировать тики так, как если бы они приходили от сервера брокера. Данные записываются не напрямую в базу тиков, а отправляются в окно "Обзор рынка". И уже из него терминал сохраняет тики в своей базе. При большом объеме данных, передаваемых за один вызов, функция меняет свое поведение для экономии ресурсов. Если передается более 256 тиков, данные делятся на две части. Первая часть (большая) сразу напрямую записывается в базу тиков (как это делает CustomTicksReplace). Вторая часть, состоящая из последних 128 тиков, передается в окно "Обзор рынка" и после этого сохраняется терминалом в базе.

Структура MqlTick имеет два поля со значением времени – time (время тика в секундах) и time_msc (время тика в миллисекундах) – которые ведут отсчет от 01 января 1970 года. Обработка этих полей в добавляемых тиках производится по следующим правилам в указанном порядке:

  1. если значение ticks[k].time_msc!=0, то используем его для заполнения поля ticks[k].time, то есть для тика выставляется время ticks[k].time=ticks[k].time_msc/1000 (деление целочисленное)
  2. если ticks[k].time_msc==0 и ticks[k].time!=0, то время в миллисекундах получается умножением на 1000, то есть  ticks[k].time_msc=ticks[k].time*1000
  3. если ticks[k].time_msc==0 и ticks[k].time==0, то в эти поля записывается текущее время торгового сервера с точностью до миллисекунд на момент вызова функции CustomTicksAdd.

Если значение полей ticks[k].bid, ticks[k].ask, ticks[k].last или ticks[k].volume больше нуля, то в поле ticks[k].flags пишется комбинация соответствующих флагов:

  • TICK_FLAG_BID – тик изменил цену бид
  • TICK_FLAG_ASK  – тик изменил цену аск
  • TICK_FLAG_LAST – тик изменил цену последней сделки
  • TICK_FLAG_VOLUME – тик изменил объем

Если значение какого-то поля меньше или равно нуля, соответствующий ему флаг не записываются в поле ticks[k].flags.

Флаги TICK_FLAG_BUY и TICK_FLAG_SELL в историю пользовательского инструмента не добавляются.

Документация по MQL5: Пользовательские символы / CustomTicksAdd
Документация по MQL5: Пользовательские символы / CustomTicksAdd
  • www.mql5.com
CustomTicksAdd - Пользовательские символы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Читал. По факту единичный тик добавляет, только флаг отбрасывает. Да и ошибка явно не  5310 должна быть.
 
stacksize 1 это один байт или один килобайт или 1 мегабайт ????
 
ruslan #:
stacksize 1 это один байт или один килобайт или 1 мегабайт ????

В байтах. В любом случае, это рекомендация компилятору, которую он "перепишет", если обнаружит потребность в большем размере из-за исходников. Но не более 64Мб.

 

Как в пользовательском символе сделать доступной таблицу всех сделок?


 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы

fxsaber, 2022.11.20 23:44

Создал кастомный символ. В Тестере тики этого символа подаются на OnTick искаженными - маркап на bid/ask, что создает граальную историю по сравнению с реальной.

Тестер берет какие-то скрытые настройки из кастомного символа, которые недоступны через MQL-свойства и json-конфигурацию. Почему свойства кастомного символа не имеют полной прозрачности - отдельный (важный) вопрос.

Баг: Тестер генерирует (по реальным тикам) тики, которые не совпадают с историческими.

Чтобы не нарываться на этот баг, рекомендую не использовать третий параметр CustomSymbolCreate.

bool  CustomSymbolCreate(
   const string     symbol_name,         // имя пользовательского символа
   const string     symbol_path="",      // название группы, в которой будет создан символ
   const string     symbol_origin=NULL   // имя символа, на основе которого будет создан пользовательский символ
   );

Копируйте свойства самостоятельно.

 

Подскажите, в чем может быть проблема по созданию кастом символа.

Задача простая, на основе индикативного инструмента (по которому торговля запрещена) создать кастом-символ, где торговля будет разрешена (для тестера).

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

Тогда я экспортировал бары в CSV-файл из диалога Символы -> Бары -> Экспортировать бары.

Получил CSV-файл с такой структурой:

<DATE> <OPEN> <HIGH> <LOW> <CLOSE> <TICKVOL> <VOL> <SPREAD>
2020.09.23      3322.2  3326.7  3230.9  3236.1  28893   0       1
2020.09.24      3243.3  3277.8  3207.8  3244.8  54595   0       5
2020.09.25      3257.0  3305.8  3216.3  3297.5  37948   0       2
2020.09.28      3306.2  3359.7  3301.7  3351.9  28078   0       6
2020.09.29      3360.2  3372.0  3326.0  3334.0  20813   0       6
...

Затем создал новый кастом-инструмент, в нем в том же диалоге делаю обратную операцию, то есть Импортировать бары.

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

Вероятно, проблема как-то связана с дневным таймфреймом?

UPD: Проверил на H1 - действительно проблема ушла, т.к. в CSV появился столбец <TIME>. В общем - баг.

 
Stanislav Korotky #:

Задача простая, на основе индикативного инструмента (по которому торговля запрещена) создать кастом-символ, где торговля будет разрешена (для тестера).

На всякий случай, если нужно разрешить торговлю в Тестере, то можно обойтись без создания символа. 
 
fxsaber #:
На всякий случай, если нужно разрешить торговлю в Тестере, то можно обойтись без создания символа. 

А куда смотреть?

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