ФункцияCustomTicksAddработает только для пользовательских символов, открытых в окне MarketWatch (Обзор рынка). Если символ не выбран в MarketWatch, то для вставки тиков необходимо использоватьCustomTicksReplace.
Функция CustomTicksAdd позволяет транслировать тики так, как если бы они приходили от сервера брокера. Данные записываются не напрямую в базу тиков, а отправляются в окно "Обзор рынка". И уже из него терминал сохраняет тики в своей базе. При большом объеме данных, передаваемых за один вызов, функция меняет свое поведение для экономии ресурсов. Если передается более 256 тиков, данные делятся на две части. Первая часть (большая) сразу напрямую записывается в базу тиков (как это делаетCustomTicksReplace). Вторая часть, состоящая из последних 128 тиков, передается в окно "Обзор рынка" и после этого сохраняется терминалом в базе.
СтруктураMqlTickимеет два поля со значением времени – time (время тика в секундах) и time_msc (время тика в миллисекундах) – которые ведут отсчет от 01 января 1970 года. Обработка этих полей в добавляемых тиках производится по следующим правилам в указанном порядке:
если значение ticks[k].time_msc!=0, то используем его для заполнения поля ticks[k].time, то есть для тика выставляется время ticks[k].time=ticks[k].time_msc/1000 (деление целочисленное)
если ticks[k].time_msc==0 и ticks[k].time!=0, то время в миллисекундах получается умножением на 1000, то есть ticks[k].time_msc=ticks[k].time*1000
если 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 в историю пользовательского инструмента не добавляются.
ruslan #: stacksize 1 это один байт или один килобайт или 1 мегабайт ????
В байтах. В любом случае, это рекомендация компилятору, которую он "перепишет", если обнаружит потребность в большем размере из-за исходников. Но не более 64Мб.
Создал кастомный символ. В Тестере тики этого символа подаются на OnTick искаженными - маркап на bid/ask, что создает граальную историю по сравнению с реальной.
Тестер берет какие-то скрытые настройки из кастомного символа, которые недоступны через MQL-свойства и json-конфигурацию. Почему свойства кастомного символа не имеют полной прозрачности - отдельный (важный) вопрос.
Баг: Тестер генерирует (по реальным тикам) тики, которые не совпадают с историческими.
Чтобы не нарываться на этот баг, рекомендую не использовать третий параметр CustomSymbolCreate.
boolCustomSymbolCreate(
conststring symbol_name, // имя пользовательского символаconststring symbol_path="", // название группы, в которой будет создан символconststring symbol_origin=NULL// имя символа, на основе которого будет создан пользовательский символ
);
Подскажите, в чем может быть проблема по созданию кастом символа.
Задача простая, на основе индикативного инструмента (по которому торговля запрещена) создать кастом-символ, где торговля будет разрешена (для тестера).
Пытался делать через формулу, но почему-то терминал не хочет рассчитывать историю на всю глубину и генерирует только несколько дневных баров, примерно на месяц.
Тогда я экспортировал бары в CSV-файл из диалога Символы -> Бары -> Экспортировать бары.
Затем создал новый кастом-инструмент, в нем в том же диалоге делаю обратную операцию, то есть Импортировать бары.
К сожалению, терминал неправильно считывает колонки из CSV. Клонка тиковый объем всегда заполняется нулями (а без неё вместо нормальных баров формируются урезанные, и все они подсвечены красным цветом). Когда флажок Тиковые объемы включен, значения спреда попадают в колонку Объем, а в колонке спред все нули. Когда флажок отключен, спред располагается в правильной колонке, но обе колонки с объемами и тиковыми и реальными - нулевые (хотя тиковый объем в CSV есть).
Вероятно, проблема как-то связана с дневным таймфреймом?
UPD: Проверил на H1 - действительно проблема ушла, т.к. в CSV появился столбец <TIME>. В общем - баг.
Задача простая, на основе индикативного инструмента (по которому торговля запрещена) создать кастом-символ, где торговля будет разрешена (для тестера).
На всякий случай, если нужно разрешить торговлю в Тестере, то можно обойтись без создания символа.
Я добавляю тики только с флагами TICK_FLAG_BUY и TICK_FLAG_SELL. Они разве имеют отношение к барам?
Использую только Replace-функцию. О ее влиянии на бары и говорили. Add-функция - не знаю поведения.
Документация по CustomTicksAdd()
Примечание
Функция CustomTicksAdd работает только для пользовательских символов, открытых в окне MarketWatch (Обзор рынка). Если символ не выбран в MarketWatch, то для вставки тиков необходимо использовать CustomTicksReplace.
Функция CustomTicksAdd позволяет транслировать тики так, как если бы они приходили от сервера брокера. Данные записываются не напрямую в базу тиков, а отправляются в окно "Обзор рынка". И уже из него терминал сохраняет тики в своей базе. При большом объеме данных, передаваемых за один вызов, функция меняет свое поведение для экономии ресурсов. Если передается более 256 тиков, данные делятся на две части. Первая часть (большая) сразу напрямую записывается в базу тиков (как это делает CustomTicksReplace). Вторая часть, состоящая из последних 128 тиков, передается в окно "Обзор рынка" и после этого сохраняется терминалом в базе.
Структура MqlTick имеет два поля со значением времени – time (время тика в секундах) и time_msc (время тика в миллисекундах) – которые ведут отсчет от 01 января 1970 года. Обработка этих полей в добавляемых тиках производится по следующим правилам в указанном порядке:
Если значение полей ticks[k].bid, ticks[k].ask, ticks[k].last или ticks[k].volume больше нуля, то в поле ticks[k].flags пишется комбинация соответствующих флагов:
Если значение какого-то поля меньше или равно нуля, соответствующий ему флаг не записываются в поле ticks[k].flags.
Флаги TICK_FLAG_BUY и TICK_FLAG_SELL в историю пользовательского инструмента не добавляются.
stacksize 1 это один байт или один килобайт или 1 мегабайт ????
В байтах. В любом случае, это рекомендация компилятору, которую он "перепишет", если обнаружит потребность в большем размере из-за исходников. Но не более 64Мб.
Как в пользовательском символе сделать доступной таблицу всех сделок?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы
fxsaber, 2022.11.20 23:44
Создал кастомный символ. В Тестере тики этого символа подаются на OnTick искаженными - маркап на bid/ask, что создает граальную историю по сравнению с реальной.
Тестер берет какие-то скрытые настройки из кастомного символа, которые недоступны через MQL-свойства и json-конфигурацию. Почему свойства кастомного символа не имеют полной прозрачности - отдельный (важный) вопрос.
Баг: Тестер генерирует (по реальным тикам) тики, которые не совпадают с историческими.
Чтобы не нарываться на этот баг, рекомендую не использовать третий параметр CustomSymbolCreate.
Копируйте свойства самостоятельно.
Подскажите, в чем может быть проблема по созданию кастом символа.
Задача простая, на основе индикативного инструмента (по которому торговля запрещена) создать кастом-символ, где торговля будет разрешена (для тестера).
Пытался делать через формулу, но почему-то терминал не хочет рассчитывать историю на всю глубину и генерирует только несколько дневных баров, примерно на месяц.
Тогда я экспортировал бары в CSV-файл из диалога Символы -> Бары -> Экспортировать бары.
Получил CSV-файл с такой структурой:
Затем создал новый кастом-инструмент, в нем в том же диалоге делаю обратную операцию, то есть Импортировать бары.
К сожалению, терминал неправильно считывает колонки из CSV. Клонка тиковый объем всегда заполняется нулями (а без неё вместо нормальных баров формируются урезанные, и все они подсвечены красным цветом). Когда флажок Тиковые объемы включен, значения спреда попадают в колонку Объем, а в колонке спред все нули. Когда флажок отключен, спред располагается в правильной колонке, но обе колонки с объемами и тиковыми и реальными - нулевые (хотя тиковый объем в CSV есть).
Вероятно, проблема как-то связана с дневным таймфреймом?
UPD: Проверил на H1 - действительно проблема ушла, т.к. в CSV появился столбец <TIME>. В общем - баг.
Задача простая, на основе индикативного инструмента (по которому торговля запрещена) создать кастом-символ, где торговля будет разрешена (для тестера).
На всякий случай, если нужно разрешить торговлю в Тестере, то можно обойтись без создания символа.
А куда смотреть?