Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

MathTicker - генератор тиков в математическом режиме - библиотека для MetaTrader 5

Просмотров:
539
Рейтинг:
(5)
Опубликован:
Обновлен:
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

!!! Последняя версия файла библиотеки  MathTicker-last.mqh. Ее нужно сохранить вместо \MQL5\Include\Forester\MathTicker.mqh (это старая версия, которую невозможно перезаписать из за нового алгоритма проверки, который не видит библиотеки других авторов, в частности #include <fxsaber\Virtual\Virtual.mqh>).


Альтернатива для библиотеки EAToMath  https://www.mql5.com/ru/code/61283

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

Причина создания: Тестер MQ, записывает файлы с тиковыми данными каждому агенту при каждом запуске оптимизатора. У меня 36 агентов записывают по 10 Гб для одного из инструментов и периода тестирования - итого 360Гб на диске в 480 Гб. Занимает времени этот процесс около 1 часа перед каждой оптимизацией. Обычные SSD имеют ресурс в 500-1000 циклов записи. Перезаписывая 360 Гб каждый раз, ресурс очень быстро исчерпается.

Пример того, как MQ тестер в режиме по реальним тикам загружает SSD:
https://www.mql5.com/ru/forum/497682/page7#comment_58423659

Наконец то дождался остановки 100%-ной записи на SSD для 30 агентов. Для первых 16ти потребовалось 22 минуты. Потом запустил остальные 20 (но 6-ти агентам не хватило места на SSD, 30 только смогли запуститься). Итоговое время на запуск оптимизации 1 час 20 минут.
Вот поймал момент окончания записи


Всего было записано временных файлов в папку тестера на 282 Гб (на 30 агентов в среднем почти по 9,4 Гб):


Данная библиотека записывает только 1 файл и потом все 36 агентов будут читать данные из этого одного файла.

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


SSD не изнашивается.

Это одна из причин написания библиотеки: используем только 1 файл + экономия 1 часа на запись данных каждому агенту.
Плюс ускорение по сравнению с тестером MQ в 5-10 раз и даже с Virtual в режиме по реальным тикам.

Проблему исследовали одновременно с fxsaber (автором EAToMath), каждый со своей версией. Мой код мне более понятен, поэтому использую его.

Для торговых операций используется библиотека MT4Orders https://www.mql5.com/ru/code/16006
Для виртуальной торговли нужно использовать библиотеку Virtual https://www.mql5.com/ru/code/22577
Для просмотра результатов торговли можно использовать MT4Orders QuickReport https://www.mql5.com/ru/code/47816 или Report
Для сжатия тиков TickCompressor https://www.mql5.com/ru/code/66201
Для удаления возможно лишних тиков подключается библиотека  Control_Trade_Sessions https://www.mql5.com/ru/code/48059 например, если котировочная сессия больше торговой. Её можно и удалить, если используются все тики. т.е. сессии совпадают.
Для расчета баров нужен файл Rates.mqh из библиотеки EAToMath  https://www.mql5.com/ru/code/61283 - подключение и использование баров точно такое же как в источнике. Коротко: 
- создание бара #define EATOMATH_RATES _RATES(RatesD1, inPeriod) 
- копирование бара: RatesD1.Copy(NumBar, Rates);


Отличия от EAToMath:

Плюсы:

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

  • данные сжимаются лучше, благодаря другому алгоритму https://www.mql5.com/ru/code/66201. При сохранении только time_msc, ask и bid - до 86% тиков сохраняются как 3 char числа, т.е. 3 байта. Средний размер на тик = 3.266 Байта при сохранении тиковых данных BTCUSDT за 2023 год.
    При сохранении с объемами среднее = 4.835 Байта. И при сохранении полном тике = 8.439 Байта. Ниже будет таблица с результатами теста.
    Дополнительно можно использовать встроенную ZIP архивацию. Размер файлов уменьшается еще в 2 раза. Такой файл занимает 245 Мб, при этом сумма размеров файлов в .tcs за 2023 год занимает 364 Мб, т.е. сжатие в 1,5 раза лучше чем у MQ. А скорость генерации тиков в математическом режиме в ~2 раза выше. См. таблицу ниже.

  • Вариантов сохранения больше:


  • файл можно сохранять как на SSD, так и на RAM диск, сделав ссылку в системе. Файлы могут занимать много места и RAM диска может не хватать, поэтому можно выбрать сохранение на основной диск. Скорость чтения с SSD и с RAM примерно одинаковы, Читал, что SSD кеширует до 5% от полного объема самые часто запрашиваемые данные.
    При чтении есть небольшой износ SSD, т.к. чаще нужно перезаписывать ячейки памяти, чем при хранении без чтения. Точных цифр не знаю, но например 1 перезапись на 10 чтений или на 1000... Но это мало значимо по сравнению с износом диска тестером MQ.

Минусы:

  • Скорость работы для BidAsk варианта незначительно меньше EAToMath. Другие варианты медленнее, т.к. или содержат больше данных или имеют дополнительное ZIP сжатие.

Особенности использования:

В стратегии нельзя использовать стандартные функции Symbol(), Digits() (=4), Point() (=0.0001), т.к. они выдадут дефолтные значения, а не относящиеся к тестируемому символу. Вместо них используйте _Symbol, _Digits, _Point которые переопределены на значения считанные из файла. 


Порядок работы с архивом:

  1. Создать архив со всеми тиками из истории: 
    На вкладке Settings: выбрать режим тестирования по реальным тикам и нужный инструмент. Даты тестирования установить от <= первого тика, до >= последнего тика в имеющейся истории . 
    На вкладке Inputs установить переменные:
    Task установить в один из Save...To_Archive  
    Tick elements to save - выбор составляющих тика для сохранения в файлы и выбор ZIP сжатия.
    Запустить тестер. 
    После этого в папке Common/Files/MathTicker_Archive/--CurrentServerName--/ будет создана папка с именем инструмента в которой сохранятся файлы с тиками для каждого года. Последний год можно по мере необходимости перезаписывать, для этого в датах выбрать только текущий год, чтобы не перезаписывать предыдущие годы.
  2. Тестирование в математическом режиме из сохраненного архива:
    На вкладке Settings: установить режим тестирования в математические расчеты. 
    На вкладке Inputs установить переменные:
    Task в Run_Strategy_From_Archive.
    ServerName - имя сервера. При сохранении тиков будет автоматически создана папка с именем сервера Common/Files/MathTicker_Archive/--CurrentServerName--/, так как на разных серверах тиковые данные отличаются. В папке MathTicker_Archive/ может быть несколько папок от разных серверов.
    Перед запуском тестирования нужно вручную указать имя сервера для считывания тиков. Результаты тестов на разных серверах могут значительно отличаться, например из за проскальзываний.
    Начальный баланс
    Profit type - расчёт в валюте депозита или в пипсах. Расчет в пипсах не будет рассчитывать свопы и комиссии, даже если они указаны (см. ниже).
    Leverage - используется только для расчта свободной маржи.
    Если нужно чтобы виртуальный тестер использовал свопы и комиссии, то их тоже можно установить. Рассчитываться они будут при расчете в валюте депозита. Так как свопы могут меняться каждый день, то и результаты в разные дни тестирования будут отличаться. Виртуальный тестер применяет свопы после окончания тестирования, поэтому может быть скачек на последнем тике из за добавления суммы свопов за весь период тестирования.
    Virtual machines count - количество виртуальных машин. Для большинства случаев нужно 1, для 2 и больше тестирование будут работать медленнее.
    Open report (DLL required) - автоматически откроет в браузере отчет для основного тестера MQ и для всех виртуальных машин. Требуется разрешение dll. Код безопасный - он открытый, можете проверить самостоятельно - там просто открывается броузер с адресом веб-страницы с отчетом для каждой машины. Впрочем смотерть самому необязательно, так как уже много программистов посмотрело его и претензий по безапасности не было.



  3. В группе инпутов MathTicker: if archive selected установить:
    Instrument - в название инструмента (должно совпадать с названием папки, куда были сохранены тики), стартовую и конечную дату теста.

  4. Выбрать параметры своей стратегии.
  5. Запустить тестер. Расчеты производятся по тикам из требуемых годовых файлов. Из за того, что работа идет не с одним файлом, а с несколькими, то это немного медленнее, чем работа с одним файлом т.к. тратится время на открытие и закрытие файлов. Например вместо 1.7 секунды будет 2.7 секунды на генерацию тиков за 3 года.
  6. Сумма тиков полученная экспертом ниже может отличаться на небольшое значение одного первого тика. При тестах на кастоминых символах в режиме реальных тиков первый тик выдает только Ask или Bid (если вы не сохраняли оба). При тесте из архива они оба восстановлены из предыдущих тиков.


Порядок работы с периодом тестирования выбранным при сохранении тиков:

Отличие в том, что сохраняются не архивы по годам, а один большой архив за весь период тестирования. При изменении дат или инструмента нужно создавать новый архив, число перезаписей на SSD возрастет. По этой причине рекомендую использовать работу с архивами по годам.

Порядок работы:

  1. На вкладке Settings: выбрать режим тестирования по реальным тикам и нужный инструмент. Даты тестирования установить от <= первого тика, до >= последнего тика истории на которой вы хотите провести тест или оптимизацию. 
    На вкладке Inputs установить переменные:
    Task установить в один из Save... без суффикса To_Archive  
    Tick elements to save - выбор составляющих тика для сохранения в файлы и выбор ZIP сжатия.
    Запустить тестер. 
    После этого в папке Common/Files/MathTicker_Archive/--CurrentServerName--/ будет создан файл Ticks.bin с тиками за выбранный период. Если до этого там был файл от предыдущего тестирования, то он будет перезаписан.
  2. Тестирование в математическом режиме из сохраненного файла:
    На вкладке Settings: установить режим тестирования в математические расчеты. 
    На вкладке Inputs установить переменные:
    Task в Run_Strategy
    Остальные, как в варианте работы с архивом, кроме выбора инструмента и дат тестирования. Если они установлены - то они не будут применяться.
  3. Запустить тестер. Расчеты производятся по тикам из файла.

Пример простейшего эксперта для оценки скорости работы:

#property tester_no_cache
//#define DISABLE_VIRTUAL // Не создается виртуальное окружение - будет вызана void Strategy(MqlTick &Tick) на каждом тике

#include <Forester\MathTicker.mqh> // подключение торговли в математическом режиме
input group "Strategy"
input int rep=0;//Repeats for optimization
sinput bool AddVolumes=true;
void OnInit(){}

void OnTick(){
   static MqlTick Tick;
   if (SymbolInfoTick(_Symbol, Tick)){
      Strategy(Tick);
   }
}
double Summ = 0;int tk=0;
void Strategy(MqlTick& Tick){ // простейшая стратегия - использована для сравнения скорости чтения с EAToMath  
   Summ += Tick.bid+Tick.ask+(AddVolumes?Tick.volume_real:0.0); tk++;
   //if(tk<100){Print(Tick.time," ",Tick.ask," ",Tick.bid," ",Tick.last," ",Tick.volume_real," ",Tick.flags);}
}

ulong Start_Time  = GetMicrosecondCount();
double OnTester(){
   Print("ticks: ",tk);
   long work_time = (long)(GetMicrosecondCount() - Start_Time)/1000;
   //return(NormalizeDouble(work_time, 1)); // для получения скорости работы и
   return Summ;// для сравнения результатов расчета
}

Можно переключать 1 настройку:

//#define DISABLE_VIRTUAL // Не создается виртуальное окружение - будет вызвана void Strategy(MqlTick &Tick) на каждом тике

При генерации тиков будет выведена статистика о сжатии тиков.
Ниже распечатки статистики, объемов и времени генерации тиков.

-----------
MQ тестер без объемов
pass 1 returned result 4345830621850.311523 in 0:00:08.232

  C ZIP сжатием
AskBid. Размер файла: 225 mb
-------------------- Statistics: --------------------
3 bytes: 86.6%, 62644158 ticks
4 bytes: 0.6%, 412167 ticks
5 bytes: 12.7%, 9185484 ticks
6 bytes: 0.0%, 15274 ticks
11 bytes: 0.1%, 46214 ticks
12 bytes: 0.0%, 1 ticks
24 bytes: 0.0%, 1 ticks
Total: 72303299 ticks, 236108596 bytes.
Average: 3.266 bytes per tick
final balance 0.00 USD

pass 10 returned result 4345830621850.311523 in 0:00:01.485
AskBid_Zipped. Размер файла: 106 mb
-------------------- Statistics: --------------------
3 bytes: 86.6%, 62644158 ticks
4 bytes: 0.6%, 412167 ticks
5 bytes: 12.7%, 9185484 ticks
6 bytes: 0.0%, 15274 ticks
11 bytes: 0.1%, 46214 ticks
12 bytes: 0.0%, 1 ticks
24 bytes: 0.0%, 1 ticks
Total: 72303299 ticks, 236108596 bytes.
Average: 3.266 bytes per tick
UnZipped size:236108596. Zipped size:111720863. ZIP compression: 47.3 %

pass 10 returned result 4345830621850.311523 in 0:00:02.548
Файлы без архивации займут 236 108 596 bytes - около 200 мб - тестирование будет идти быстрее
С архивацией Zipped size: 111 720 863 - около 100 мб, тестирование немного медленнее (на 2-4 секунды за каждый год тестирования), так как будет нужна распаковка.

Размер файлов .tcs за тот же 2023 год:

Все варианты с ZIP, даже полное сохранение тиков - компактнее (от 3,5 до 1,5 раз).


Примеры использования

Один простой пример есть в приложенном файле MathTicker-last.mqh

В нём же закомментирован другой пример простого эксперта для виртуальной торговли и вывода отчетов:

#property tester_no_cache

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
#include <Forester\MathTicker.mqh> // подключение торговли в математическом режиме

input group "Expert settings"
enum VirtTyp {MQ_Tester=0,Virtual1=1,Virtual2=2};
sinput VirtTyp tester1=1;//Tester 1
sinput VirtTyp tester2=2;//Tester 2
input int rep=0;//Repeats for optimization

double balInit=0;

void OnInit(){
   balInit=AccountBalance();
   #ifdef _MathTick_ // запуск с MathTick - он считат параметры символа из файла с тиками. Для тестов в мат режиме
      if(MathTick.isMath){
         if(tester1==0){Alert("   >>>>>>>>>   Virtual tester 1=MQ. In math mode can be used only virtual tester.   <<<<<<<<");ExpertRemove();return;}
         if(tester2==0){Alert("   >>>>>>>>>   Virtual tester 1=MQ. In math mode can be used only virtual tester.   <<<<<<<<");ExpertRemove();return;}
      }
   #endif
}

void OnTick(){
   static MqlTick Tick;
   if (!SymbolInfoTick(_Symbol, Tick)){return;}
   if(Tick.ask==0 || Tick.bid==0){return;}//MQ тестер торгует при сбойном тике, Virtual нет. Запрет и для MQ

   if(isNewHour(Tick.time)){//первый тик каждого часа
      if(GetHour0(Tick.time) % 2==0){// купить по четным часам в тестере 1
         VIRTUAL::SelectByIndex(tester1);//выбрать виртуалку 1
         OrderSend(_Symbol, OP_BUY, 0.01, Tick.ask, 0, Tick.ask - 100 * _Point, Tick.ask + 100 * _Point); 
      }else{//продать по нечетным часам в тестере 2
         VIRTUAL::SelectByIndex(tester2);//выбрать виртуалку 2
         OrderSend(_Symbol, OP_SELL, 0.01, Tick.bid, 0, Tick.bid + 100 * _Point, Tick.bid - 100 * _Point);   
      } 
   }
}

double OnTester(){
  double ret_val=0;
  for (int v = 0 ; v <= VIRTUAL::Total(); v++){
    if(VIRTUAL::SelectByIndex(v)){
      double prib=AccountBalance()-balInit;
      ret_val += prib; //
  }}
  return ret_val;
}

bool isNewHour  (datetime &t){ static int next_h=-1; if(t < next_h){ return false; } else { next_h = (GetHour0(t)+1)*3600;return true;}}
int GetHour0    (datetime &t){return((int)( t / 3600));}//current hour from 1 Jan 1971

Этот пример использует 2 виртуальные машины в которых идет разная торговля. В инпуте Virtual machines count нужно выбрать 2 виртуальные машины.

По четным часам в одном тестере происходит покупка, в другом по нечетным часам продажа.

Сделан сложный пример с 2-мя тестерами, его можно упростить, если нужна работа с одним тестером.

Так же для контроля правильности расчетов можно выбрать тестер MQ и сравнить с результатами виртуальных тестеров. Может не совпадать только комиссия, т.к. разных комиссий придумано много, а в виртуальном тестере запрограммирован только один вариант. У свопов могут быть небольшие отличия для некоторых сделок, так как рассчитываются в конце теста по одинаковой цене, в реальности если было несколько ролловеров, то их цена могла отличаться.


Оптимизация

В математическом режиме тестер MQ в отчете предоставляет только один Custom столбец с результатом расчета, например прибыль. Это крайне мало для анализа результатов и выбора лучшего варианта оптимизации для использования в реальной торговле.

Рекомендую подключать к эксперту оптимизируемому в математическом режиме бесплатную библиотеку:

Код, который записывает графики баланса и эквити и рассчитывает дополнительные критерии оптимизации

Подключается он одной строкой:

#include <Advanced Optimization Report\Advanced Optimization Report Saver.mqh> // https://www.mql5.com/en/code/68706

После оптимизации этот код создаст файл Charts.opt со всеми критериями оптимизации, которые вы получаете при оптимизации не в математическом режиме (8 основных + дополнительные, всего 43). Так же будут расчитаны и сохранены дополнительные 38 кастомных критериев оптимизации (коэффициенты Шарпа, Сортино, мат. ожидание в пипсах, стандартное отклонение, Z-score, Money Compounding, LR Standard error, LR Correlation, R2, Profit Stability, Deviations from Line и другие критерии. Можно добавить самостоятельно запрограммированные критерии). 
И самое главное - будут сохранены графики баланса и эквити для каждого прохода оптимизации. Визуальная оценка графиков очень помогает.

Сохраненный файл можно преобразовать в HTML отчет с помощью утилиты из маркета Advanced Optimization Report

Отчет будет выглядеть так: (тут только первые 3 строки, всего их 6300)


продолжение


продолжение


Полный отчет для этого примера приложен в архиве Advanced_Optimization_Report_Sample.zip.

Видео по использованию отчета:
  

OHLC Candles with Ask and Bid OHLC Candles with Ask and Bid

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

Custom Bollinger Bands Custom Bollinger Bands

Стандартный индикатор Bollinger Bands с добавлением функции усреднения

OHLC Candles with extreme tick price tracking OHLC Candles with extreme tick price tracking

Это свечной график OHLC, который фиксирует максимальную цену покупки и минимальную цену продажи на каждом новом баре.

Manual Backtest Bar Replay Simulator Manual Backtest Bar Replay Simulator

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