Чудо эксперт

 
Экспериментировал тут на досуге с экспертом.
Хочу поделиться результатами.
Оптимизация под GBPUSD15. Чудо эксперт покупает на L + спред, продает на H – спред.
За базу взят пример эксперта Moving Average. У кого ни будь, есть мысли по этому поводу.


//+------------------------------------------------------------------+
//|                                                          222.mq4 |
//|                                                    Olek 
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#define MAGICMA  20050610

extern double Lots               = 1;
extern double MovingPeriod       = 40;
extern int    n                  = 55;
//+------------------------------------------------------------------+
//| Подсчитаем количество открытых позиций                           |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- вернем количество ордеров
   if(buys>0) return(buys);
   else       return(-sells);
  }

//+------------------------------------------------------------------+
//| Проверка возможности открыться                                   |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;

//---- возьмем текущую сглаженную
   ma=iMA(NULL,0,MovingPeriod,0,MODE_SMA,PRICE_CLOSE,1);
//---- открываемся вниз?
   if(Close[1]< (ma - n*Point))  
     {
      res=OrderSend(Symbol(),OP_SELL,1,Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- открываемся вниз?
   if(Close[1]> (ma + n*Point))  
     {
      res=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }

//+------------------------------------------------------------------+
//| Проверка на необходимость закрытия                               |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;

//---- возьмем текущую сглаженную
   ma=iMA(NULL,0,MovingPeriod,0,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- проверим типы
      if(OrderType()==OP_BUY)
        {
         if(Close[1]< (ma - n*Point))  OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
        if(Close[1]> (ma + n*Point))  OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Стартовая функция                                                |
//+------------------------------------------------------------------+
void start()
  {
//---- бары то хоть есть?
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- подсчитаем количество открытых ордеров по этому инструменту
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
 
Все очень просто - тестирование проводилось в режиме "по ценам открытия".
Позиции открывались-закрывались на начале формирования свечи.
И временами это давало проведение операции вблизи экстремумов в точках open_price или open_price+spread.

Вот результаты тестов:



Если же запустить потиковый тест с использованием меньших таймфреймов, то открытие-закрытие мало попадает в экстремумы Low и High, а все внутри баров. Да и результаты теста чуть другие:
 
Вот мои результаты теста:


Символ GBPUSD (Great Britain Pound vs US Dollar)
Период 15 Минут (M15) 2003.09.08 01:00 - 2005.07.22 22:45
Модель Все тики (на основе всех наименьших доступных периодов с фрактальной интерполяцией каждого тика)
Баров в истории 46434 Смоделировано тиков 2951632 Качество моделирования 63.18%

Начальный депозит 10000.00
Общая прибыль 109191.60 Общий убыток -68103.70 Чистая прибыль 41087.90
Показатель прибыльности 1.60 Матожидание выигрыша 185.08
Абсолютная просадка 0.00 Максимальная просадка (%) 8394.40 (17.4%)

Всего сделок 222 Короткие позиции (% выигравших) 111 (39.64%) Длинные позиции (% выигравших) 111 (42.34%)
Прибыльные сделки (% от всех) 91 (40.99%) Убыточные сделки (% от всех) 131 (59.01%)
Самая большая прибыльная сделка 5323.50 убыточная сделка -1893.50
Средняя прибыльная сделка 1199.91 убыточная сделка -519.88
Максимальное количество непрерывных выигрышей (прибыль) 6 (10020.50) непрерывных проигрышей (убыток) 11 (-5672.10)
Максимальная непрерывная прибыль (число выигрышей) 10020.50 (6) непрерывный убыток (число проигрышей) -5672.10 (11)
Средний непрерывный выигрыш 2 непрерывный проигрыш 3

История минуток с июня 2004. Да, где есть минутки вход более реальный.

Но если тестировать по КОНТРОЛЬНЫМ ТОЧКАМ, Просто сказка получается.

Символ GBPUSD (Great Britain Pound vs US Dollar)
Период 15 Минут (M15) 2003.09.08 01:00 - 2005.07.22 08:45
Модель Контрольные точки (используется ближайший таймфрейм + фрактальная интерполяция)
Баров в истории 46378 Смоделировано тиков 515553 Качество моделирования 29.39%

Начальный депозит 10000.00
Общая прибыль 111903.40 Общий убыток -62793.50 Чистая прибыль 49109.90
Показатель прибыльности 1.78 Матожидание выигрыша 222.22
Абсолютная просадка 0.00 Максимальная просадка (%) 5651.10 (11.4%)

Всего сделок 221 Короткие позиции (% выигравших) 110 (40.00%) Длинные позиции (% выигравших) 111 (45.95%)
Прибыльные сделки (% от всех) 95 (42.99%) Убыточные сделки (% от всех) 126 (57.01%)
Самая большая прибыльная сделка 5323.50 убыточная сделка -1795.50
Средняя прибыльная сделка 1177.93 убыточная сделка -498.36
Максимальное количество непрерывных выигрышей (прибыль) 6 (9992.50) непрерывных проигрышей (убыток) 9 (-4498.20)
Максимальная непрерывная прибыль (число выигрышей) 9992.50 (6) непрерывный убыток (число проигрышей) -4498.20 (9)
Средний непрерывный выигрыш 2 непрерывный проигрыш 3


Еще раз хочу повториться.
Сделайте, еще модель для тестирования по OLHC как в "тройке"
Для данных стратегий будет в самый раз.
Это не единственный эксперт, который на «контрольных точках» хочет сделать меня миллиардером. Зачем нужен не рабочий метод моделирования?
 
Вы еще раз подтверждаете тезис - "качество напрямую зависит от наличия данных более мелких фреймов".

А любые попытки что-либо смоделировать без более мелких данных _всегда_ приведут к неправдоподобных результатам.
Практически имеет смысл использовать 2 варианта тестов - полный потиковый и по открытию бара.

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

2) Если эксперт торгует внутри баров, то выбор один - потиковый тест, для которого нужны данные более мелких фреймов.

Это не единственный эксперт, который на «контрольных точках» хочет сделать меня миллиардером. Зачем нужен не рабочий метод моделирования?


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

Сделайте, еще модель для тестирования по OLHC как в "тройке"


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

Я бы рекомендовал всем, кто занимается тестированием, запомнить "для тестов нужны данные более мелких периодов" и не пытаться придумывать новые режимы, для которых не нужны промежуточные данные. Нужно четко понимать границы применимости каждого типа тестирования. Мы уже 4 года занимаемся разработкой тестеров (начиная с терминала MetaQuotes), перепробовали массу вариантов и пришли к нынешним моделям.
 
Спасибо за разъяснение. Есть предложение. При тестировании по контрольным точкам, в случае, когда отсутствует ближайший таймфрейм, грузить следующий таймфрейм. Минутки достать легко. И 15 минут достать не сложно. Допустим моделирование на часовках, 30 минуток не хватает, остаток грузим то, что есть, допустим, это 15 минут. Частично проблема бы решилась.
Ну а если нет истории, выводить предупреждение типа «губу не раскатывай».
 
Или даже так. Пусть пользователь сам выбирает таймфрейм для моделирования.
Тестирование идет на часовках . Я знаю что у меня есть история 15 мин и 1 мин.
30 минут явно для моделирования не подойдут, а 1 минутки слишком долго. Для моделирования мы выбираем 15 минутки. Потом после оптимизации проверяем на минутках.
 
Допустим моделирование на часовках, 30 минуток не хватает, остаток грузим то, что есть, допустим, это 15 минут.

Используйте полный режим потикового тестирования - там грузится все что найдется до упора. Нет нужного периода - берется следующий.

Ну а если нет истории, выводить предупреждение типа «губу не раскатывай».

Уже 2 параметра добавили: процентажный "Качество тестирования" и визуальный показатель наличия и использования более мелких таймфреймов для моделирования тиков внутри баров. Может еще окошко выдавать с текстом "Данных недостаточно - Вы не докачали данных. Нажмите "Yes" в качестве подтверждения что Вы понимаете, что делаете!" ?
 

Используйте полный режим потикового тестирования - там грузится все что найдется до упора. Нет нужного периода - берется следующий.


При использовании потикового тестирования на MetaQuotes Demo EURUSD H1 (период 2005.01.01-2005.07.01 т.е. за полугодие) M5 бары загружаются до 2005.05.03, M1 - до 2005.07.05. дальше заргузка не идет. Т.е даже за это полугодие не грузятся ни минутки ни пятиминутки. Качество тестирования в отчете - 50%. Получается, что только через ручной импорт котировок можно загрузить минутки хотя бы за полгода?


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

Тестирование по контрольным точкам:
Symbol	EURUSD (Euro vs US Dollar)
Period	1 Hour (H1) 2005.01.03 00:00 - 2005.07.01 00:00
Model	Control points (based on the nearest less timeframe with fractal interpolation of 12 control points)
Bars in test	16393	Ticks modelled	49944	Modelling quality	50.00%
Initial deposit	1000.00				
Gross profit	1030.15	Gross loss	-408.05	Total net profit	622.10
Profit factor	2.52	Expected payoff	44.44		
Absolute drawdown	0.00	Maximal drawdown (%)	235.65 (13.0%)		
Total trades	14	Short positions (won %)	12 (75.00%)	Long positions (won %)	2 (50.00%)
	Profit trades (% of total)	10 (71.43%)	Loss trades (% of total)	4 (28.57%)
Largest	profit trade	294.10	loss trade	-124.25
Average	profit trade	103.02	loss trade	-102.01



Тестирование по тикам:

Symbol	EURUSD (Euro vs US Dollar)
Period	1 Hour (H1) 2005.01.03 00:00 - 2005.07.01 00:00
Model	Every tick (based on all available least timeframes with fractal interpolation of every tick)
Bars in test	16393	Ticks modelled	997053	Modelling quality	50.00%
Initial deposit	1000.00				
Gross profit	1003.15	Gross loss	-419.05	Total net profit	584.10
Profit factor	2.39	Expected payoff	41.72		
Absolute drawdown	0.00	Maximal drawdown (%)	235.65 (13.3%)		
Total trades	14	Short positions (won %)	12 (75.00%)	Long positions (won %)	2 (50.00%)
	Profit trades (% of total)	10 (71.43%)	Loss trades (% of total)	4 (28.57%)
Largest	profit trade	294.10	loss trade	-124.25
Average	profit trade	100.32	loss trade	-104.76



Значит ли это, что для моего эксперта и тестирвоание по контрьным точкам подходит, или другими словами каковы критерии "толстокожести" эксперта, о которой Вы Ренат ранее писали?

Так же в обоих случаях Modelling quality == 50%, как это понимать ведь тиков во втором случае сгенерировано в 20 раз больше?

 
Вручную проимпортировал минутки из DataBank Alpari. Теперь в тестируемом периоде (2005.01.03 00:00 - 2005.07.01 00:00) у меня есть все данные по M1, M15, M30, H1, по M5 - данные с мая 2005. Перегенерировал файл и Modelling quality стало равно 89.99%, в связи с чем вопросы:
1. Почему 89.99% а не 100%, ведь у меня есть все данные самого младшего периода?
2. Чем больше я импортировал минуток, тем меньше становился файл M1_EURUSD.hst (с 50 Mb до 37 Mb размер упал). Такое поведение корректно?
3. Когда я загрузил все M1 за 2005 год у меня в History оказалось 173908 баров. В настройках терминала я видел макс ограничение на кол-во баров 250-тыс, т.е. даже за год историю M1 нельзя загрузить (за год будет около 300 тыс M1 баров)?
4. Влияет ли то, что у меня не все M5 бары, НО ВСЕ M1 на качество моделирования?
 
1. Почему 89.99% а не 100%, ведь у меня есть все данные самого младшего периода?


для тестирования по тикам 90% это максимум.

3. Когда я загрузил все M1 за 2005 год у меня в History оказалось 173908 баров. В настройках терминала я видел макс ограничение на кол-во баров 250-тыс, т.е. даже за год историю M1 нельзя загрузить (за год будет около 300 тыс M1 баров)?


надо указать вручную, например: баров в истории 999999
баров в окне 999999 // если видимость меньше чем история, котировки в расчетах не участвуют.(???????)


4. Влияет ли то, что у меня не все M5 бары, НО ВСЕ M1 на качество моделирования?



для точного тестирования нужны минутки, если они есть за нужный период, другие не важны.
 
Можно сделать состояние, если не на рынке. То на распространении экспертов точно.


Символ USDCHF (US Dollar vs Swiss Franc)
Период 1 Минута (M1) 2004.06.16 13:12 - 2005.07.26 09:19
Модель Все тики (на основе всех наименьших доступных периодов с фрактальной интерполяцией каждого тика)
Баров в истории 363714 Смоделировано тиков 2321757 Качество моделирования 25.00%

Начальный депозит 10000.00
Общая прибыль 43217.47 Общий убыток -24481.56 Чистая прибыль 18735.91
Показатель прибыльности 1.77 Матожидание выигрыша 115.65
Абсолютная просадка 0.00 Максимальная просадка (%) 1610.93 (5.5%)

Всего сделок 162 Короткие позиции (% выигравших) 74 (66.22%) Длинные позиции (% выигравших) 88 (61.36%)
Прибыльные сделки (% от всех) 103 (63.58%) Убыточные сделки (% от всех) 59 (36.42%)
Самая большая прибыльная сделка 447.56 убыточная сделка -446.42
Средняя прибыльная сделка 419.59 убыточная сделка -414.94
Максимальное количество непрерывных выигрышей (прибыль) 5 (2221.09) непрерывных проигрышей (убыток) 3 (-1287.09)
Максимальная непрерывная прибыль (число выигрышей) 2221.09 (5) непрерывный убыток (число проигрышей) -1287.09 (3)
Средний непрерывный выигрыш 2 непрерывный проигрыш 1


Теперь заглянем в журнал



13:38:11 2005.05.20 14:47 1 мин USDCHF,M1: invalid price 1.23015002 for OrderSend function
13:38:11 2005.05.20 14:47 1 мин USDCHF,M1: Error opening BUY order : 4107
13:38:11 2005.05.20 14:47 1 мин USDCHF,M1: open #133 buy 1.00 USDCHF at 1.2297 sl: 1.2246 tp: 1.2348 ok
13:38:11 2005.05.20 14:47 1 мин USDCHF,M1: BUY order opened : 1.2297
13:38:12 2005.05.20 16:06 Tester: take profit #133 at 1.2348 (1.2349 / 1.2354)
13:38:14 2005.05.31 03:27 1 мин USDCHF,M1: invalid price 1.24655000 for OrderSend function
13:38:14 2005.05.31 03:27 1 мин USDCHF,M1: Error opening BUY order : 4107
13:38:14 2005.05.31 03:27 1 мин USDCHF,M1: open #134 buy 1.00 USDCHF at 1.2461 sl: 1.2410 tp: 1.2512 ok
13:38:14 2005.05.31 03:27 1 мин USDCHF,M1: BUY order opened : 1.2461
13:38:15 2005.06.01 12:34 Tester: take profit #134 at 1.2512 (1.2513 / 1.2518)
13:38:18 2005.06.08 18:45 1 мин USDCHF,M1: invalid price 1.25114993 for OrderSend function
13:38:18 2005.06.08 18:45 1 мин USDCHF,M1: Error opening BUY order : 4107
13:38:18 2005.06.08 18:45 1 мин USDCHF,M1: open #135 buy 1.00 USDCHF at 1.2501 sl: 1.2450 tp: 1.2552 ok
13:38:18 2005.06.08 18:45 1 мин USDCHF,M1: BUY order opened : 1.2501
13:38:18 2005.06.08 19:29 Tester: take profit #135 at 1.2552 (1.2555 / 1.2560)
13:38:18 2005.06.08 19:29 1 мин USDCHF,M1: open #136 buy 1.00 USDCHF at 1.2560 sl: 1.2509 tp: 1.2611 ok
13:38:18 2005.06.08 19:29 1 мин USDCHF,M1: BUY order opened : 1.256
13:38:19 2005.06.10 15:43 Tester: take profit #136 at 1.2611 (1.2612 / 1.2617)
13:38:19 2005.06.10 15:47 1 мин USDCHF,M1: invalid price 1.26235000 for OrderSend function
13:38:19 2005.06.10 15:47 1 мин USDCHF,M1: Error opening BUY order : 4107
13:38:19 2005.06.10 15:47 1 мин USDCHF,M1: open #137 buy 1.00 USDCHF at 1.2618 sl: 1.2567 tp: 1.2669 ok
13:38:19 2005.06.10 15:47 1 мин USDCHF,M1: BUY order opened : 1.2618
13:38:19 2005.06.10 16:47 Tester: take profit #137 at 1.2669 (1.2669 / 1.2674)
13:38:20 2005.06.13 11:38 1 мин USDCHF,M1: invalid price 1.27705005 for OrderSend function
13:38:20 2005.06.13 11:38 1 мин USDCHF,M1: Error opening BUY order : 4107
13:38:20 2005.06.13 11:38 1 мин USDCHF,M1: open #138 buy 1.00 USDCHF at 1.2773 sl: 1.2722 tp: 1.2824 ok
13:38:20 2005.06.13 11:38 1 мин USDCHF,M1: BUY order opened : 1.2773
13:38:20 2005.06.14 15:18 1 мин USDCHF,M1: invalid price 1.27514998 for OrderSend function
13:38:20 2005.06.14 15:18 1 мин USDCHF,M1: Error opening BUY order : 4107
13:38:20 2005.06.14 15:18 1 мин USDCHF,M1: open #139 buy 1.00 USDCHF at 1.2745 sl: 1.2694 tp: 1.2796 ok

13:38:21 2005.06.15 15:47 1 мин USDCHF,M1: invalid price 1.27195001 for OrderSend function
13:38:21 2005.06.15 15:47 1 мин USDCHF,M1: Error opening SELL order : 4107
13:38:21 2005.06.15 15:47 1 мин USDCHF,M1: open #140 sell 1.00 USDCHF at 1.2725 sl: 1.2776 tp: 1.2674 ok

Что мы видим? Сплошные invalid price. Потом ордер открывается, но уже по самой лучшей цене на баре.
На вопрос как появляются такие ошибки, к сожалению ответа никто не дал. Понятно, что тестер тут не причем, он просто не входит по некорректной цене. Эксперт тоже 100% рабочий. Котировки из базы Альпари, поэтому свалим на них.
Но, я не как не могу понять, почему вход по лучшей цене? Не по худшей, или плюс один тик, ведь моделирование по тиковое.

Теперь попытаемся убрать причину ошибки.
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,4)..............
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,4)............


Символ USDCHF (US Dollar vs Swiss Franc)
Период 1 Минута (M1) 2004.06.16 13:12 - 2005.07.26 09:19
Модель Все тики (на основе всех наименьших доступных периодов с фрактальной интерполяцией каждого тика)
Баров в истории 363714 Смоделировано тиков 2321757 Качество моделирования 25.00%

Начальный депозит 10000.00
Общая прибыль 37788.77 Общий убыток -28998.35 Чистая прибыль 8790.42
Показатель прибыльности 1.30 Матожидание выигрыша 54.94
Абсолютная просадка 0.00 Максимальная просадка (%) 3662.62 (16.9%)

Всего сделок 160 Короткие позиции (% выигравших) 73 (61.64%) Длинные позиции (% выигравших) 87 (51.72%)
Прибыльные сделки (% от всех) 90 (56.25%) Убыточные сделки (% от всех) 70 (43.75%)
Самая большая прибыльная сделка 452.39 убыточная сделка -446.04
Средняя прибыльная сделка 419.88 убыточная сделка -414.26
Максимальное количество непрерывных выигрышей (прибыль) 6 (2591.10) непрерывных проигрышей (убыток) 5 (-2129.57)
Максимальная непрерывная прибыль (число выигрышей) 2591.10 (6) непрерывный убыток (число проигрышей) -2129.57 (5)
Средний непрерывный выигрыш 2 непрерывный проигрыш 2

Ошибок в журнале нет, результат намного поскромнее.
ПОЧЕМУ ПО ЛУЧШЕЙ ЦЕНЕ??????????????????????????????
Причина обращения: