SetCommissionAndSpread - любые комиссия и спред, даже отрицательные - страница 3

 
Scriptong:

Да, верно.


Что еще я не учел в этом опыте? 



Атрибут read only.
 
stringo:

Атрибут read only.

Да, спасибо большое. Выше написал, что думал, будто за него сам тестер отвечает. А оказалось нужно устанавливать самому.
 

Начал разбираться с подстановкой своего файла в тестер. В итоге споткнулся о следующее:

stringo:

 Формат FXT известен. 

 Нашел документацию по формату в справке терминала (Клиентский терминал - Автотрейдинг - Тестирование стратегий - Файлы истории FXT). Прочитал файл в этом формате. По полученным данным видно, что данные не соответствуют заявленному формату.

Стал искать на форуме подобную информацию. Нашел такой формат - https://www.mql5.com/ru/forum/112702. Он оказался намного ближе к нужному, но все равно во многих местах не соответствовал действительности. После неоднократного применения метода научного тыка (эмпирический способ познания ;) ) пришел к следующим структурам:

struct TestHistoryHeader
  {
   int               version;            // 405
   char              copyright[64];      // copyright
   char              description[128];   // server name

   char              symbol[12];         
   int               period;
   int               model;              // for what modeling type was the ticks sequence generated
   int               bars;               // amount of bars in history
   int               fromdate;
   int               todate;
   double            modelquality;       // modeling quality
   int               unknown;

   //---- general parameters
   char              currency[12];       // currency base
   int               spread;
   int               digits;
   int               unknown1;
   double            point;
   int               lot_min;            // minimum lot size
   int               lot_max;            // maximum lot size
   int               lot_step;
   int               stops_level;        // stops level value
   int               gtc_pendings;       // instruction to close pending orders at the end of day
   
   //---- profit calculation parameters
   int               unknown2;
   double            contract_size;      // contract size
   double            tick_value;         // value of one tick
   double            tick_size;          // size of one tick
   int               profit_mode;        // profit calculation mode        { PROFIT_CALC_FOREX, PROFIT_CALC_CFD, PROFIT_CALC_FUTURES }
   
   //---- swap calculation
   int               swap_enable;        // enable swap
   int               swap_type;          // type of swap                   { SWAP_BY_POINTS, SWAP_BY_DOLLARS, SWAP_BY_INTEREST }
   int               unknown3;
   double            swap_long;
   double            swap_short;         // swap overnight value
   int               swap_rollover3days; // three-days swap rollover
   
   //---- margin calculation
   int               leverage;           // leverage
   int               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 level
   int               margin_stopout_mode;// stop out check mode            { MARGIN_TYPE_PERCENT, MARGIN_TYPE_CURRENCY }
   double            margin_initial;     // margin requirements
   double            margin_maintenance; // margin maintenance requirements
   double            margin_hedged;      // margin requirements for hedged positions
   double            margin_divider;     // margin divider
   char              margin_currency[12];// margin currency
   //---- commission calculation
   double            comm_base;          // basic commission
   int               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 use
   int               from_bar;           // fromdate bar number
   int               to_bar;             // todate bar number
   int               start_period[6];    // number of bar at which the smaller period modeling started
   int               set_from;           // begin date from tester settings
   int               set_to;             // end date from tester settings
   //----
   int               unknown4;
   int               freeze_level;       // order's freeze level in points
   int               generating_errors;  
   //----
   int               reserved[60];
  };
 

 и 

struct TestHistory
  {
   datetime          otm;                // время бара
   double            open;               // значения OHLCV
   double            low;
   double            high;
   double            close;
   long              volume;
   int               ctm;                // текущее рабочее время внутри бара
   int               flag;               // флаг запуска эксперта (0-бар модифицируем, а эксперта не запускаем)
  };

 В глаза бросается тот факт, что работа со временем ведется в обоих форматах: нового и старого MQL4. Так, члены fromdate и todate структуры TestHistoryHeader, а также ctm структуры TestHistory используют старый (4-хбайтный) формат даты/времени, а вот член otm структуры TestHistory пишется в новом (8-и байтном) формате даты/времени.

Ну и, опять же, непонятно, правильно ли подобраны члены типа unknown. Да и что они значат, тоже интересно. 

 
ide92993:

Первый раз решил посмотреть подробно, что же это за FXT. И что обозначает "100%-е моделирование". Достаточно просто посмотреть этот код, чтобы понять, что никакого точного тестирования при генерации FXT из реальной тиковой истории быть не может по определению. Я был уверен по своей наивности, что в FXT каждый тик представляет пару значений: Bid и Ask. А оказалось, только Bid.

Досконально проверил TDS — полное потиковое совпадение Bid и Ask! Автор Birt — молодец, отличная хак-доработка MT4-тестера! В FXT в качестве цены тика записывается только Bid, зато его спред пишется в поле Volume. За счет взлома MT4 получается добиться, чтобы MT4-тестер вычислял на каждом тике Ask, как Bid + Volume (в этом вся фишка).

 

Продукт по итогу платный, правда. Но такая работа, проделаная автором за Metaquotes, на одном энтузиазме держаться не может. С учетом еще дополнительных возможностей по регулированию качества исполнения отложенных ордеров... MT5-тестер на моновалютке по всем показателям значительно уступает - 100%.

 

 
Scriptong:

После неоднократного применения метода научного тыка (эмпирический способ познания ;) ) пришел к следующим структурам:

Уточнение структур:

struct TestHistoryHeader
{
   int               version;            // 405
   char              copyright[64];      // copyright
   char              description[128];   // server name
// 196
   char              symbol[12];         
   int               period;
   int               model;              // for what modeling type was the ticks sequence generated
   int               bars;               // amount of bars in history
   int               fromdate;
   int               todate;
   int               totalTicks;
   double            modelquality;       // modeling quality
// 240
   //---- general parameters
   char              currency[12];       // currency base
   int               spread;
   int               digits;
   int               unknown1;
   double            point;
   int               lot_min;            // minimum lot size
   int               lot_max;            // maximum lot size
   int               lot_step;
   int               stops_level;        // stops level value
   int               gtc_pendings;       // instruction to close pending orders at the end of day
// 292
   //---- profit calculation parameters
   int               unknown2;
   double            contract_size;      // contract size
   double            tick_value;         // value of one tick
   double            tick_size;          // size of one tick
   int               profit_mode;        // profit calculation mode        { PROFIT_CALC_FOREX, PROFIT_CALC_CFD, PROFIT_CALC_FUTURES }
// 324 
   //---- swap calculation
   int               swap_enable;        // enable swap
   int               swap_type;          // type of swap                   { SWAP_BY_POINTS, SWAP_BY_DOLLARS, SWAP_BY_INTEREST }
   int               unknown3;
   double            swap_long;
   double            swap_short;         // swap overnight value
   int               swap_rollover3days; // three-days swap rollover
// 356   
   //---- margin calculation
   int               leverage;           // leverage
   int               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 level
   int               margin_stopout_mode;// stop out check mode            { MARGIN_TYPE_PERCENT, MARGIN_TYPE_CURRENCY }
   double            margin_initial;     // margin requirements
   double            margin_maintenance; // margin maintenance requirements
   double            margin_hedged;      // margin requirements for hedged positions
   double            margin_divider;     // margin divider
   char              margin_currency[12];// margin currency
// 420   
   //---- commission calculation
   double            comm_base;          // basic commission
   int               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 use
   int               from_bar;           // fromdate bar number
   int               to_bar;             // todate bar number
   int               start_period[6];    // number of bar at which the smaller period modeling started
   int               set_from;           // begin date from tester settings
   int               set_to;             // end date from tester settings
// 476
   //----
   int               end_of_test;
   int               freeze_level;       // order's freeze level in points
   int               generating_errors;  
// 488   
   //----
   int               reserved[60];
};

 и

struct TestHistory
{
   datetime          otm;                // время бара
   double            open;               // значения OHLCV
   double            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 или в Маркет.
 
barabashkakvn:
Перенесите, пожалуйста, код скрипта в Code Base или в Маркет.

Да, действительно, не подумал. Сейчас оформлю.
Причина обращения: