Начал разбираться с подстановкой своего файла в тестер. В итоге споткнулся о следующее:
stringo:
Формат FXT известен.
Нашел документацию по формату в справке терминала (Клиентский терминал - Автотрейдинг - Тестирование стратегий - Файлы истории FXT). Прочитал файл в этом формате. По полученным данным видно, что данные не соответствуют заявленному формату.
Стал искать на форуме подобную информацию. Нашел такой формат - https://www.mql5.com/ru/forum/112702. Он оказался намного ближе к нужному, но все равно во многих местах не соответствовал действительности. После неоднократного применения метода научного тыка (эмпирический способ познания ;) ) пришел к следующим структурам:
struct TestHistoryHeader
{
intversion; // 405charcopyright[64]; // copyrightchardescription[128]; // server namechar symbol[12];
int period;
int model; // for what modeling type was the ticks sequence generatedint bars; // amount of bars in historyint fromdate;
int todate;
double modelquality; // modeling qualityint unknown;
//---- general parameterschar currency[12]; // currency baseint spread;
int digits;
int unknown1;
double point;
int lot_min; // minimum lot sizeint lot_max; // maximum lot sizeint lot_step;
int stops_level; // stops level valueint gtc_pendings; // instruction to close pending orders at the end of day//---- profit calculation parametersint unknown2;
double contract_size; // contract sizedouble tick_value; // value of one tickdouble tick_size; // size of one tickint profit_mode; // profit calculation mode { PROFIT_CALC_FOREX, PROFIT_CALC_CFD, PROFIT_CALC_FUTURES }//---- swap calculationint swap_enable; // enable swapint swap_type; // type of swap { SWAP_BY_POINTS, SWAP_BY_DOLLARS, SWAP_BY_INTEREST }int unknown3;
double swap_long;
double swap_short; // swap overnight valueint swap_rollover3days; // three-days swap rollover//---- margin calculationint leverage; // leverageint free_margin_mode; // free margin calculation mode { MARGIN_DONT_USE, MARGIN_USE_ALL, MARGIN_USE_PROFIT, MARGIN_USE_LOSS }int margin_mode; // margin calculation mode { MARGIN_CALC_FOREX,MARGIN_CALC_CFD,MARGIN_CALC_FUTURES,MARGIN_CALC_CFDINDEX };int margin_stopout; // margin stopout levelint margin_stopout_mode;// stop out check mode { MARGIN_TYPE_PERCENT, MARGIN_TYPE_CURRENCY }double margin_initial; // margin requirementsdouble margin_maintenance; // margin maintenance requirementsdouble margin_hedged; // margin requirements for hedged positionsdouble margin_divider; // margin dividerchar margin_currency[12];// margin currency//---- commission calculationdouble comm_base; // basic commissionint comm_type; // basic commission type { COMM_TYPE_MONEY, COMM_TYPE_PIPS, COMM_TYPE_PERCENT }int comm_lots; // commission per lot or per deal { COMMISSION_PER_LOT, COMMISSION_PER_DEAL }//---- for internal useint from_bar; // fromdate bar numberint to_bar; // todate bar numberint start_period[6]; // number of bar at which the smaller period modeling startedint set_from; // begin date from tester settingsint set_to; // end date from tester settings//----int unknown4;
int freeze_level; // order's freeze level in pointsint generating_errors;
//----int reserved[60];
};
и
struct TestHistory
{
datetime otm; // время бараdouble open; // значения OHLCVdouble low;
double high;
double close;
long volume;
int ctm; // текущее рабочее время внутри бараint flag; // флаг запуска эксперта (0-бар модифицируем, а эксперта не запускаем)
};
В глаза бросается тот факт, что работа со временем ведется в обоих форматах: нового и старого MQL4. Так, члены fromdate и todate структуры TestHistoryHeader, а также ctm структуры TestHistory используют старый (4-хбайтный) формат даты/времени, а вот член otm структуры TestHistory пишется в новом (8-и байтном) формате даты/времени.
Ну и, опять же, непонятно, правильно ли подобраны члены типа unknown. Да и что они значат, тоже интересно.
Первый раз решил посмотреть подробно, что же это за FXT. И что обозначает "100%-е моделирование". Достаточно просто посмотреть этот код, чтобы понять, что никакого точного тестирования при генерации FXT из реальной тиковой истории быть не может по определению. Я был уверен по своей наивности, что в FXT каждый тик представляет пару значений: Bid и Ask. А оказалось, только Bid.
Досконально проверил TDS — полное потиковое совпадение Bid и Ask! Автор Birt — молодец, отличная хак-доработка MT4-тестера! В FXT в качестве цены тика записывается только Bid, зато его спред пишется в поле Volume. За счет взлома MT4 получается добиться, чтобы MT4-тестер вычислял на каждом тике Ask, как Bid + Volume (в этом вся фишка).
Продукт по итогу платный, правда. Но такая работа, проделаная автором за Metaquotes, на одном энтузиазме держаться не может. С учетом еще дополнительных возможностей по регулированию качества исполнения отложенных ордеров... MT5-тестер на моновалютке по всем показателям значительно уступает - 100%.
После неоднократного применения метода научного тыка (эмпирический способ познания ;) ) пришел к следующим структурам:
Уточнение структур:
struct TestHistoryHeader
{
intversion; // 405charcopyright[64]; // copyrightchardescription[128]; // server name// 196char symbol[12];
int period;
int model; // for what modeling type was the ticks sequence generatedint bars; // amount of bars in historyint fromdate;
int todate;
int totalTicks;
double modelquality; // modeling quality// 240//---- general parameterschar currency[12]; // currency baseint spread;
int digits;
int unknown1;
double point;
int lot_min; // minimum lot sizeint lot_max; // maximum lot sizeint lot_step;
int stops_level; // stops level valueint gtc_pendings; // instruction to close pending orders at the end of day// 292//---- profit calculation parametersint unknown2;
double contract_size; // contract sizedouble tick_value; // value of one tickdouble tick_size; // size of one tickint profit_mode; // profit calculation mode { PROFIT_CALC_FOREX, PROFIT_CALC_CFD, PROFIT_CALC_FUTURES }// 324 //---- swap calculationint swap_enable; // enable swapint swap_type; // type of swap { SWAP_BY_POINTS, SWAP_BY_DOLLARS, SWAP_BY_INTEREST }int unknown3;
double swap_long;
double swap_short; // swap overnight valueint swap_rollover3days; // three-days swap rollover// 356 //---- margin calculationint leverage; // leverageint free_margin_mode; // free margin calculation mode { MARGIN_DONT_USE, MARGIN_USE_ALL, MARGIN_USE_PROFIT, MARGIN_USE_LOSS }int margin_mode; // margin calculation mode { MARGIN_CALC_FOREX,MARGIN_CALC_CFD,MARGIN_CALC_FUTURES,MARGIN_CALC_CFDINDEX };int margin_stopout; // margin stopout levelint margin_stopout_mode;// stop out check mode { MARGIN_TYPE_PERCENT, MARGIN_TYPE_CURRENCY }double margin_initial; // margin requirementsdouble margin_maintenance; // margin maintenance requirementsdouble margin_hedged; // margin requirements for hedged positionsdouble margin_divider; // margin dividerchar margin_currency[12];// margin currency// 420 //---- commission calculationdouble comm_base; // basic commissionint comm_type; // basic commission type { COMM_TYPE_MONEY, COMM_TYPE_PIPS, COMM_TYPE_PERCENT }int comm_lots; // commission per lot or per deal { COMMISSION_PER_LOT, COMMISSION_PER_DEAL }// 436 //---- for internal useint from_bar; // fromdate bar numberint to_bar; // todate bar numberint start_period[6]; // number of bar at which the smaller period modeling startedint set_from; // begin date from tester settingsint set_to; // end date from tester settings// 476//----int end_of_test;
int freeze_level; // order's freeze level in pointsint generating_errors;
// 488 //----int reserved[60];
};
и
struct TestHistory
{
datetime otm; // время бараdouble open; // значения OHLCVdouble high;
double low;
double close;
long volume;
int ctm; // текущее рабочее время внутри бараint flag; // флаг запуска эксперта (0-бар модифицируем, а эксперта не запускаем)
};
Наиболее критическое уточнение - по структуре TestHistory. Во всех источниках после члена open следует член low. Хотя на самом деле после open должен идти high, о чем однозначно свидетельствует комментарий. Этот момент очень долго вычислялся, тестер упорно писал: "invalid fxt file"))
В результате поднятой темы удалось создать скрипт, конвертирующий тиковую историю в формат FXT и подставляющий полученный файл в папку тестера стратегий. Скрипт поставляется с исходным кодом здесь.
Scriptong: В результате поднятой темы удалось создать скрипт, конвертирующий тиковую историю в формат FXT и подставляющий полученный файл в папку тестера стратегий. Скрипт поставляется с исходным кодом
Перенесите, пожалуйста, код скрипта в Code Base или в Маркет.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Да, верно.
Что еще я не учел в этом опыте?
Атрибут read only.
Атрибут read only.
Да, спасибо большое. Выше написал, что думал, будто за него сам тестер отвечает. А оказалось нужно устанавливать самому.
Начал разбираться с подстановкой своего файла в тестер. В итоге споткнулся о следующее:
Формат FXT известен.
Нашел документацию по формату в справке терминала (Клиентский терминал - Автотрейдинг - Тестирование стратегий - Файлы истории FXT). Прочитал файл в этом формате. По полученным данным видно, что данные не соответствуют заявленному формату.
Стал искать на форуме подобную информацию. Нашел такой формат - https://www.mql5.com/ru/forum/112702. Он оказался намного ближе к нужному, но все равно во многих местах не соответствовал действительности. После неоднократного применения метода научного тыка (эмпирический способ познания ;) ) пришел к следующим структурам:
и
В глаза бросается тот факт, что работа со временем ведется в обоих форматах: нового и старого MQL4. Так, члены fromdate и todate структуры TestHistoryHeader, а также ctm структуры TestHistory используют старый (4-хбайтный) формат даты/времени, а вот член otm структуры TestHistory пишется в новом (8-и байтном) формате даты/времени.
Ну и, опять же, непонятно, правильно ли подобраны члены типа unknown. Да и что они значат, тоже интересно.
Первый раз решил посмотреть подробно, что же это за FXT. И что обозначает "100%-е моделирование". Достаточно просто посмотреть этот код, чтобы понять, что никакого точного тестирования при генерации FXT из реальной тиковой истории быть не может по определению. Я был уверен по своей наивности, что в FXT каждый тик представляет пару значений: Bid и Ask. А оказалось, только Bid.
Досконально проверил TDS — полное потиковое совпадение Bid и Ask! Автор Birt — молодец, отличная хак-доработка MT4-тестера! В FXT в качестве цены тика записывается только Bid, зато его спред пишется в поле Volume. За счет взлома MT4 получается добиться, чтобы MT4-тестер вычислял на каждом тике Ask, как Bid + Volume (в этом вся фишка).
Продукт по итогу платный, правда. Но такая работа, проделаная автором за Metaquotes, на одном энтузиазме держаться не может. С учетом еще дополнительных возможностей по регулированию качества исполнения отложенных ордеров... MT5-тестер на моновалютке по всем показателям значительно уступает - 100%.
После неоднократного применения метода научного тыка (эмпирический способ познания ;) ) пришел к следующим структурам:
Уточнение структур:
и
Наиболее критическое уточнение - по структуре TestHistory. Во всех источниках после члена open следует член low. Хотя на самом деле после open должен идти high, о чем однозначно свидетельствует комментарий. Этот момент очень долго вычислялся, тестер упорно писал: "invalid fxt file"))
В результате поднятой темы удалось создать скрипт, конвертирующий тиковую историю в формат FXT и подставляющий полученный файл в папку тестера стратегий. Скрипт поставляется с исходным кодом
Перенесите, пожалуйста, код скрипта в Code Base или в Маркет.
Да, действительно, не подумал. Сейчас оформлю.