Сжатие тиковых данных для хранения в компактном виде до 3,5 раз компактнее, чем .tcs файлы MQ. И для быстрой работы с ними, т.к. на чтение 3 байт тратится меньше времени, чем на 60 байт MqlTick структуры.
Обновлен MathTicker.mqh В файл дополнительно сохраняются параметры для расчета свопов.
С Virtual использовать так: (полный код на странице библиотеки)
#ifdef _MathTick_ // запуск с MathTick - он считат параметры символа из файла с тиками. Для тестов в мат режимеif(MathTick.isMath){ VIRTUAL::CalcSwaps( MathTick.swapShort, MathTick.swapLong, 0, MathTick.swap3days ); }//свопы из файла с тикамиelse{VIRTUAL::CalcSwaps( _Symbol, 0 );}
#else
VIRTUAL::CalcSwaps( _Symbol, 0 );//расчитать свопы - всем сделкам один своп, т.е. если 2+ разных инструмента, то обоим будет своп основного символа#endif
Теперь с учетом свопов и комиссий в валюте депозита (моя доработка Virtual), результаты MQ тестера и виртуального в математическом режиме совпадают с точностью до нескольких центов (разница возможно из за округления)
#property tester_no_cache#define EATOMATH_ADVANCED_SETTINGS // Дополнительные настройки EAToMath.#define EATOMATH_ONLY_SYMBOLINFOTICK // Не создается виртуальное окружение - только SymbolInfoTick// #include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283#ifndef __EATOMATH__
#include <Forester\MathTicker.mqh> // https://www.mql5.com/ru/code/65821#endif // #ifndef __EATOMATH__input group "Strategy"inputint rep=0;//Repeats for optimizationvoidOnTick(){
staticMqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick)){
#ifdef _MathTick_
if(MathTick.SaveTick(Tick)){ return; }//если сохраняем тики, то выход и не торгуем.#endif
Strategy(Tick);
}
}
double gSum = 0;int tk=0;
void Strategy(MqlTick& Tick){ // простейшая стратегия - использована для сравнения скорости чтения с EAToMath
gSum += Tick.bid+Tick.ask; tk++;
}
ulong gStartTime = GetMicrosecondCount();
doubleOnTester(){
#ifdef _MathTick_ // запуск с MathTick - он считает параметры символа из файла с тиками. Для тестов в мат режимеif(MathTick.SaveTicksEnd()){return0;}//закрыть файл после записи тиков и выйтиif(MathTick.ReadSymbolVars()){
MathTick.Ticker();//в режиме мат расчетов подаст все тики в Strategy(MqlTick &Tick).
}
#endif
Print("ticks: ",tk);
long work_time = (long)(GetMicrosecondCount() - gStartTime)/1000;
//return(NormalizeDouble(work_time, 1)); // для получения скорости работы иreturn gSum;// для сравнения результатов расчета
}
с такими настройками (из архива символов).
В логе такое.
1970.01.0100:00:00 >>>>>>>>> Math mode: Run Strategy <<<<<<<<
1970.01.0100:00:00 Year: 2025 - archive not found. Check next!!!!!!!!!!!
1970.01.0100:00:00 Year: 20261970.01.0100:00:00 ReadVars start
1970.01.0100:00:00 XAUUSD.pro 10 TickItems:1 Digits:2 Point:0.01 TickSize:0.01 TickValue:1.0 VolumeStep:0.011970.01.0100:00:00 minFreeze:0 minStop:0 swapShort:26.396 swapLong:-91.392 swap3days:3 TicksPerBlock:30000 nextSize:945481970.01.0100:00:00 Ticker start
1970.01.0100:00:00 ticks: 0
OnTester result 00 : mathematical test passed in0:00:01.0321274 Mb memory used
но в библиотеке напрямую не используется. А используется в вызывающей программе. Добавил сюда, т.к. посчитал это оптимальным вариантом - если используется архив в мат. режиме - значит нужно и начальный баланс иметь.
2) Откзался от считывания свопов из архива. Теперь они вводятcя через sinput. (хотя в архиве они есть - можно читать и от туда - на усмотрение программиста). Так же не используются в библиотеке, добавлены по той же причине, что и начальный баланс.
Но использовать устаревшие свопы нет смысла - они регулярно меняются. Лучше подставлять текущие свопы из спецификации символа. Так тесты в мат. режиме будут очень близки к тестам в тестере от MQ. Разница в сумме свопов будет только при округлении центов.
Не понимаю причины. Альтернативные алгоритмы никак не зависят от размера блока.
Что-то пока считанный массив не совпадает - разбираюсь...
Forester #:Возможно из за множества ArrayResize.
Сделайте ОДИН раз с запасом. Альтернативные варианты ровно так поступают.
Одинаково
Тогда хорошо бы иметь функции MqlTick[]->uchar[]->MqlTick. Подобие которых здесь. ZIP - сомнительная фича.Сделал такие вызовы одной строкой. Подробнее на странице класса https://www.mql5.com/ru/code/66201 примеры в самом низу или в коде скрипта.
Обсуждение компрессора лучше продолжать там.
Обновлен MathTicker.mqh
В файл дополнительно сохраняются параметры для расчета свопов.
С Virtual использовать так: (полный код на странице библиотеки)
Теперь с учетом свопов и комиссий в валюте депозита (моя доработка Virtual), результаты MQ тестера и виртуального в математическом режиме совпадают с точностью до нескольких центов (разница возможно из за округления)
Тестер MQ:
Виртуальный тестер:
Теперь с учетом свопов и комиссий в валюте депозита (моя доработка Virtual)
Вы модифицировали Virtual?
Для себя. Второй раз. Теперь по минимуму. Только для комиссий.
Код тут https://www.mql5.com/ru/forum/356959/page8#comment_58417402
с такими настройками (из архива символов).
В логе такое.
Проблема только с символами из архива.
Запускаю этот советник
с такими настройками (из архива символов).
В логе такое.
Проблема только с символами из архива.
Нужно установить даты на которых надо тестировать и которые записаны в архиве:

У вас с 1970 по 1970
В январе сделал обновление. Только что закачал в кодобазу.
Изменения:
1) Добавлен
но в библиотеке напрямую не используется. А используется в вызывающей программе. Добавил сюда, т.к. посчитал это оптимальным вариантом - если используется архив в мат. режиме - значит нужно и начальный баланс иметь.
2) Откзался от считывания свопов из архива. Теперь они вводятcя через sinput. (хотя в архиве они есть - можно читать и от туда - на усмотрение программиста). Так же не используются в библиотеке, добавлены по той же причине, что и начальный баланс.
Если нужно считать свопы записанные в архиве, то они доступны тут (так было в предыдущей версии). Сейчас закомментированы.
Но использовать устаревшие свопы нет смысла - они регулярно меняются. Лучше подставлять текущие свопы из спецификации символа. Так тесты в мат. режиме будут очень близки к тестам в тестере от MQ. Разница в сумме свопов будет только при округлении центов.