Пример
При запуске бэктеста на кроссах тестер тянет за собой не только основной символ, но и вспомогательный, который позволяет конвертировать валюту прибыли основного символа в валюту счета. Вытягивание дополнительного символа, генерирование его тиков и их синхронизация с основным символом отнимают столь драгоценные вычислительные ресурсы (и время) в режимах одиночного прогона и, особенно, Оптимизации. Однако, почти всегда такая точность является излишней. Поэтому хочется обойти эту навязчивость/несовершенство MetaTrader 5 тестера. В MetaTrader 4 это сделать легко - там есть возможность поменять валюту счета прямо в тестере. MetaTrader 5 же лишен такой возможности.
Демонстрационный скрипт показывает попытку обойти данное ограничение тестера - убрать ненужные вычисления. Для этого создается копия символа для бэктеста, но валюта прибыли задается равной валюте счета. Т.е. переконвертация результатов торговли не потребуется. И прибыль, фактически, будет вычисляться в пипсах, что может быть очень наглядно в некоторых ситуациях.
Работает!
И это самый простой способ заставить тестер работать быстрее и логично.
ЗЫ Поторопился. Считает то правильно новый кросс - не конвертирует прибыль. Да вот только зачем-то тянет за собой мажор, когда он нигде не используется
2017.09.04 14:46:43.062 Core 1 EURCHF_custom: generate 975389 ticks in 0:00:00.063, passed to tester 3210 ticks 2017.09.04 14:46:43.062 Core 1 EURUSD: generate 979976 ticks in 0:00:00.062, passed to tester 8696 ticks
Слегка подредактировал код скрипта. В строчках :
const SYMBOL Symb(_Symbol + PostFix); // Создали символ
Symb = _Symbol; // Скопировали с основного символа все свойства и баровую историю - клон
Заменил _Symbol на "SBER".
Запустил скрипт на графике акции VDSB.
После запуска скрипта открылся график SBER_custom, вместо баров SBER бары акции VDSB. Как это не логично. Ожидал увидеть на графике бары SBER.....
Во время выполнения этой строчки Symb = "SBER"; почему то создается объект с значением Name="VDSB" т.е с именем символа на котором запущен скрипт.
К сожалению исправить эту ошибку у меня не получилось. Не могли бы вы исправить код.
К сожалению исправить эту ошибку у меня не получилось. Не могли бы вы исправить код.
Достаточно даже запустить скрипт без изменений на "SBER" Metaquotes-Demo, чтобы увидеть, что получается совсем не то, что ожидаешь.
Выяснил, что CustomRatesReplace работает некорректно для некоторых символов (похоже, для всех не Forex), поэтому разработчикам нужно исправлять ошибку.
Достаточно даже запустить скрипт без изменений на "SBER" Metaquotes-Demo, чтобы увидеть, что получается совсем не то, что ожидаешь.
Выяснил, что CustomRatesReplace работает некорректно для некоторых символов (похоже, для всех не Forex), поэтому разработчикам нужно исправлять ошибку.
Я запускал на реальном счете BCS. Оригинальный скрипт на графике SBER работает. Отркывается график SBER_custom с котировками SBER. Что значит функция CustomRatesReplace работает некорректно ? Если надо могу объяснить как создать реальный счет на BCS с нулевым балансом.
Я запускал на реальном счете BCS. Оригинальный скрипт на графике SBER работает. Отркывается график SBER_custom с котировками SBER. Что значит функция CustomRatesReplace работает некорректно ? Если надо могу объяснить как создать реальный счет на BCS с нулевым балансом.
Спасибо, и у меня баг! В Symbol.mqh строка 126
// return(this.CloneProperties() && (this.CloneHistory() != -1)); // Было return(this.CloneProperties(Symb) && (this.CloneHistory(Symb) != -1)); // Стало
Еще один сценарий использования кастомных символов (не обязательно с помощью этой библиотеки).
Возможно полностью автоматизировать регулярный бэктест советника на свежих исторических данных и передачу результатов теста в боевой советник для синхронизации картины реала с тестером. Это позволяет без написания собственного тестера реализовывать такую торговую логику
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Организация цикла перебора ордеров
zenz, 2017.09.12 17:47
Тоже столкнулся с задачей максимально точного перевода торговой логики эксперта с тестирования на тиках в тестере стратегий (МТ4), на работу его же на реальном счете.
Мои рассуждения:
В тестере эксперт работает не только в идеальных торговых условиях, но, по сути, в другом режиме – в режиме реального времени, т.е. за один тик он там успевает и рассчитать ТС, и отправить ордер, и получить на него ответ, а вот при реальном использовании на торговом счете это уже не так. Получается, что мы имеем как бы два разных робота - один реального времени, другой нет. Отправляем /модифицируем ордер (даже один!) на реальный счет = пинг +время исполнения и т.д. = в лучшем случае 100-500мс, а в это время идут тики и их надо считать – а мы стоим, ждем... а потом вбухиваемся в поток в случайном порядке (куда ушла цена за это время относительно наших тиковых средних х.з. + мы наверняка пропустили несколько самых быстрых, и, как правило, самых важных тиков). Получается, что в итоге от нашей стратегии, которую мы откатали в тестере, может вообще ничего не остаться.
Поэтому, поразмышляв, я пришел к следующему:
- В боевом режиме торговая логика в эксперте отключается, и он работает, по сути, как копировщик.
- Торговая система перенесена в индикатор и команды на открытие и закрытие вырабатывает он, причем он не ждет, когда эти команды выполнит эксперт, а просто выполняет заложенную в него ТС в идеальных условиях, почти как в тестере. Насколько я знаю, индикатор не должен пропускать тики, хотя сомневаюсь, что это возможно технически – но, по крайней мере, он должен их пропускать меньше чем эксперт, у которого эта возможность заложена изначально и описана в документации. + Даже за счет разделения ошибок расчета ТС должно быть меньше т.к. отсутствуют прерывания работы на всякие второстепенные по отношению к логике ТС операции.
Еще одна возможность применения этой схемы:
Берется бесплатная демо-версия советника из Маркета и гонится в тестере по свежим котирам, копир берет данные с результата тестера. Соответственно, платная версия не требуется.
Возможно, нужно запрещать Маркет-советникам бэктест на кастомных символах...
В коде есть вот такая строчка
const int Size = ::CopyRates(Symb, PERIOD_M1, 0, ::Bars(Symb, PERIOD_M1), Rates);
Я ваш скрипт не проверял, но я щас пишу скрипт для массового копирования символов. Функция CopyRates и функция Bars у меня не могу возвратить больше, чем указанно в "Настройки->Графики-> Mакс. бараов в окне" . Так, что у большинства история cкопируется далеко не вся.
Что означают эти двоеточия у вас в коде ?
Я ваш скрипт не проверял, но я щас пишу скрипт для массового копирования символов. Функция CopyRates и функция Bars у меня не могу возвратить больше, чем указанно в "Настройки->Графики-> Mакс. бараов в окне" . Так, что у большинства история cкопируется далеко не вся.
Копирую именно то, что УЖЕ есть на чартах. Иначе долго будет - подкачка.
Что означают эти двоеточия у вас в коде ?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
MQL5 Как узнать закрылась сделка по стоп-лоссу или нет?
fxsaber, 2017.02.14 20:00
Грубо говоря, перед двоеточием указывается имя класса, откуда вызывается соответствующий метод.
Если ничего перед двоеточием не стоит - класс глобальный.
В данном случае все двоеточия можно затереть. А удобно их использовать по той причине, что могут быть одни и те же методы (включая виртуальный) у разных классов. И чтобы не ошибиться, через двоеточие можно четко указать, какой конкретно метод нужно вызвать.
Надо бы добавить что-то типа:
bool Template(const string Symb = NULL) const { return(this.CloneProperties(Symb)); }
А то иногда нужны только свойства, а бары - нет.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Symbol:
Библиотека для работы с обычными и кастомными символами
Содержит некоторый функционал, позволяющий разобраться на начальном этапе, как идет работа с кастомными символами, и предлагает некоторые готовые решения, могущие быть полезными.
Автор: fxsaber