Библиотеки: Symbol

 

Symbol:

Библиотека для работы с обычными и кастомными символами

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

Автор: fxsaber

 

Пример

При запуске бэктеста на кроссах тестер тянет за собой не только основной символ, но и вспомогательный, который позволяет конвертировать валюту прибыли основного символа в валюту счета. Вытягивание дополнительного символа, генерирование его тиков и их синхронизация с основным символом отнимают столь драгоценные вычислительные ресурсы (и время) в режимах одиночного прогона и, особенно, Оптимизации. Однако, почти всегда такая точность является излишней. Поэтому хочется обойти эту навязчивость/несовершенство 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" т.е с именем символа на котором запущен скрипт.


К сожалению исправить эту ошибку у меня не получилось. Не могли бы вы исправить код.

 
pivomoe:

К сожалению исправить эту ошибку у меня не получилось. Не могли бы вы исправить код.

Достаточно даже запустить скрипт без изменений на "SBER" Metaquotes-Demo, чтобы увидеть, что получается совсем не то, что ожидаешь.

Выяснил, что CustomRatesReplace работает некорректно для некоторых символов (похоже, для всех не Forex), поэтому разработчикам нужно исправлять ошибку.

 
fxsaber:

Достаточно даже запустить скрипт без изменений на "SBER" Metaquotes-Demo, чтобы увидеть, что получается совсем не то, что ожидаешь.

Выяснил, что CustomRatesReplace работает некорректно для некоторых символов (похоже, для всех не Forex), поэтому разработчикам нужно исправлять ошибку.


Я запускал на реальном счете BCS. Оригинальный скрипт на графике SBER работает. Отркывается график SBER_custom с котировками SBER. Что значит функция CustomRatesReplace работает некорректно ? Если надо могу объяснить как создать реальный счет на BCS с нулевым балансом.

 
pivomoe:

Я запускал на реальном счете 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мс, а в это время идут тики и их надо считать – а мы стоим, ждем... а потом вбухиваемся в поток в случайном порядке (куда ушла цена за это время относительно наших тиковых средних  х.з.  + мы наверняка пропустили несколько самых быстрых, и, как правило, самых важных тиков).  Получается, что в итоге от нашей стратегии, которую мы откатали в тестере, может вообще ничего не остаться.

Поэтому, поразмышляв, я пришел к следующему:

  1.  В боевом режиме торговая логика в эксперте отключается, и он работает, по сути, как копировщик.
  2. Торговая система перенесена в индикатор и команды на открытие и закрытие вырабатывает он, причем он не ждет, когда эти команды выполнит эксперт, а просто выполняет  заложенную в него ТС в идеальных  условиях, почти как в тестере. Насколько я знаю, индикатор не должен пропускать тики, хотя сомневаюсь, что это возможно технически – но, по крайней мере, он должен их пропускать меньше чем эксперт, у которого эта возможность заложена изначально и описана в документации. + Даже за счет разделения ошибок расчета ТС должно быть меньше т.к. отсутствуют прерывания работы на всякие второстепенные по отношению к логике ТС операции.

Еще одна возможность применения этой схемы:

Берется бесплатная демо-версия советника из Маркета и гонится в тестере по свежим котирам, копир берет данные с результата тестера. Соответственно, платная версия не требуется.


Возможно, нужно запрещать Маркет-советникам бэктест на кастомных символах...

 

В коде есть вот такая строчка

const int Size = ::CopyRates(Symb, PERIOD_M1, 0, ::Bars(Symb, PERIOD_M1), Rates);

 

Я ваш скрипт не проверял, но я щас пишу скрипт для массового копирования символов. Функция CopyRates  и функция Bars у меня не могу возвратить больше, чем указанно в "Настройки->Графики-> Mакс. бараов в окне" .  Так, что у большинства история cкопируется далеко не вся.

Что означают эти двоеточия у вас в коде ?

 
pivomoe:

Я ваш скрипт не проверял, но я щас пишу скрипт для массового копирования символов. Функция CopyRates  и функция Bars у меня не могу возвратить больше, чем указанно в "Настройки->Графики-> Mакс. бараов в окне" .  Так, что у большинства история cкопируется далеко не вся.

Копирую именно то, что УЖЕ есть на чартах. Иначе долго будет - подкачка.

Что означают эти двоеточия у вас в коде ?

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

MQL5 Как узнать закрылась сделка по стоп-лоссу или нет?

fxsaber, 2017.02.14 20:00

Грубо говоря, перед двоеточием указывается имя класса, откуда вызывается соответствующий метод.

Если ничего перед двоеточием не стоит - класс глобальный.

 

В данном случае все двоеточия можно затереть. А удобно их использовать по той причине, что могут быть одни и те же методы (включая виртуальный) у разных классов. И чтобы не ошибиться, через двоеточие можно четко указать, какой конкретно метод нужно вызвать.

 

Надо бы добавить что-то типа:

  bool Template(const string Symb = NULL) const
  {
    return(this.CloneProperties(Symb));
  }

А то иногда нужны только свойства, а бары - нет.

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