Тестер: Тестер в терминале MetaTrader 4: Это необходимо знать

 

New article Тестер в терминале MetaTrader 4: Это необходимо знать has been published:

Продуманный интерфейс терминала MetaTarder 4 является фасадом, но кроме того терминал имеет в своем составе также тщательно проработанный тестер стратегий. И если достоинства МТ4 как торгового терминала являются очевидными, то оценка возможностей тестера по качественному тестированию стратегий приходит только с опытом. Эта статья показывает достоинства и преимущества тестирования именно в MetaTrader 4.

Да, возможность тестирования есть далеко не в каждой программе для технического анализа(ТА), тем более не в каждом терминале! И даже там, где тестер заявлен и возможность тестирования есть, возможны ошибки или архитектурные ограничения и запреты. Поэтому при разработке тестера для терминала MetaTrader 4 так важно было сразу заложить такие решения на уровне архитектуры, которые не позволяли бы существовать целому классу стратегий, основанных на знании будущего. Есть два пути при тестировании любой стратегии программно:

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


  • подготовить файл, который содержит только смоделированное развитие цены, и подавать на вход тестера изменения цены (ценовые тики) так же, как и в реальной жизни. При этом будущего для тестера нет по определению.

Треугольник "Current Time" обозначает место, где находится тестер в данный момент. В первом случае, существует Прошлое (Last), где тестер уже обработал данные, и Будущее (Future), куда тестеру еще предстоит прийти. И прошлое и будущее уже рассчитаны (индикаторы, цены закрытия, открытия, High и Low), тестер просто проходит по этой последовательности. И если есть лазейка для подглядывания в будущее (явная или ошибочная), то результаты тестирования на таком тестере требуют тщательной проверки. И закрытие известных лазеек не гарантирует, что не найдутся другие обходные пути. Это потенциально постоянная головная боль разработчика тестера и пользователей тестера.

Во втором случае мы имеем только Прошлое (Last), Будущего нет по определению(темный прямоугольник). При таком подходе мы всегда имеем информацию только о прошлом, но не имеем никакой информации о будущем, как и в реальной торговле. С приходом каждого нового тика (изменения цены) в тестере мы перемещаемся в настоящем, треугольник текущего времени смещается вправо на новое известное время и получает новые цены. Каждый новый тик строит Настоящее, увеличивается информация о Прошлом, но по-прежнему впереди темное неизвестное Будущее. Тестер в этом случае не имеет возможности заглянуть в будущее просто по определению, какие бы ошибки не допускал трейдер при написании своей стратегии.

Именно в этом и заключается разница в двух подходах. Первый путь создания тестера дает обманчивую легкость и скорость тестирования, второй дает уверенность в том, что все написанные стратегии будут вести себя в тестере абсолютно так же, как и в режиме торговли реального времени при одинаковых ценовых изменениях. Не случайно, смоделированные для тестера последовательности хранятся в виде файлов, содержащих снимки состояния бара (файлы с расширением fxt), которые можно открыть как и обычный график через меню "Файл" - >> "Открыть автономно".

Author: MetaQuotes Software Corp.

 

Я так понимаю, что все вышеперечисленное касается только тестирования на всех тиках? Ведь при тестировании по контрольным точкам тестер ТОЧНО "подсматривает" в будущее (OHLC текущего бара) и моделирует развитие внутри него бара на основании движения меньших тайфреймов.

 
-dude- писал(а):

Я так понимаю, что все вышеперечисленное касается только тестирования на всех тиках? Ведь при тестировании по контрольным точкам тестер ТОЧНО "подсматривает" в будущее (OHLC текущего бара) и моделирует развитие внутри него бара на основании движения меньших тайфреймов.

Да, речь идет о модели "Все тики". Но и в режиме "Контрольные точки" не происходит подсматривания в будущее. Почитайте статью Strategy Tester: режимы моделирования при тестировании торговых стратегий

Контрольные точки (ближайший меньший таймфрейм)

Метод моделирования контрольных точек предназначен для грубой оценки экспертов, торгующих внутри бара. Для этого метода необходимо наличие исторических данных ближайшего меньшего таймфрейма. В большинстве случаев имеющиеся данные меньшего таймфрейма не полностью покрывают временной диапазон тестируемого таймфрейма. При отсутствии данных меньшего таймфрейма развитие бара генерируется на основе цен закрытия 12 предыдущих баров. То есть, движение внутри бара повторяет движение цены за последние 12 периодов. Это и есть фрактальная интерполяция.

Данный метод генерации кардинально отличается от принятого в предыдущих версиях клиентского терминала волнового метода, который давал строго детерминированное развитие бара. Как только появляются исторические данные меньшего таймфрейма, фрактальная интерполяция применяется уже к этим данным. Однако используется уже не 12, а всего 6 предыдущих баров. Это значит, что воспроизводятся реально существующие цены Open, High, Low, Close плюс ещё две сгенерированных цены. Значение и местоположение этих двух сгенерированных цен зависит от движения цены на 6 предыдущих периодах.

 
Rosh:
-dude- писал(а):

Я так понимаю, что все вышеперечисленное касается только тестирования на всех тиках? Ведь при тестировании по контрольным точкам тестер ТОЧНО "подсматривает" в будущее (OHLC текущего бара) и моделирует развитие внутри него бара на основании движения меньших тайфреймов.

Да, речь идет о модели "Все тики". Но и в режиме "Контрольные точки" не происходит подсматривания в будущее. Почитайте статью Strategy Tester: режимы моделирования при тестировании торговых стратегий

Контрольные точки (ближайший меньший таймфрейм)

Метод моделирования контрольных точек предназначен для грубой оценки экспертов, торгующих внутри бара. Для этого метода необходимо наличие исторических данных ближайшего меньшего таймфрейма. В большинстве случаев имеющиеся данные меньшего таймфрейма не полностью покрывают временной диапазон тестируемого таймфрейма. При отсутствии данных меньшего таймфрейма развитие бара генерируется на основе цен закрытия 12 предыдущих баров. То есть, движение внутри бара повторяет движение цены за последние 12 периодов. Это и есть фрактальная интерполяция.

Данный метод генерации кардинально отличается от принятого в предыдущих версиях клиентского терминала волнового метода, который давал строго детерминированное развитие бара. Как только появляются исторические данные меньшего таймфрейма, фрактальная интерполяция применяется уже к этим данным. Однако используется уже не 12, а всего 6 предыдущих баров. Это значит, что воспроизводятся реально существующие цены Open, High, Low, Close плюс ещё две сгенерированных цены. Значение и местоположение этих двух сгенерированных цен зависит от движения цены на 6 предыдущих периодах.


Понятно, только результаты сильно разные при закрытии ордера по достижению определенной прибыли или убытка (не стоплосс и тейкпрофит). Такое впечатление, что тестер "проскальзывает" на несколько пунктов (иногда на 20 и больше).
 
Не мешало бы добавить что всё вышеперечисленное справедливо только в последней версии MT4 Build 207
 
Valmars:
Не мешало бы добавить что всё вышеперечисленное справедливо только в последней версии MT4 Build 207
Для 207 билда справедливо только одно условие выдачи нулевого бара чужого символа High[0]=Low[0]=Close[0]=Open[0], Volume[0]=1 - тем самым мы закрыли последнюю (если не последнюю, то напишите свои идеи) возможность "заглянуть в будущее".

С каждым билдом мы делаем тестер все лучше и лучше. Осталось добавить моделирование реквотов в тестере торговых стратегий.
 
Вопрос разработчикам. Каким количеством входных данных ограничена работа генетического алгоритма ? И будет ли это ограничение увеличено в дальнейшем ?
 
Renat:
Valmars:
Не мешало бы добавить что всё вышеперечисленное справедливо только в последней версии MT4 Build 207
Для 207 билда справедливо только одно условие выдачи нулевого бара чужого символа High[0]=Low[0]=Close[0]=Open[0], Volume[0]=1 - тем самым мы закрыли последнюю (если не последнюю, то напишите свои идеи) возможность "заглянуть в будущее".

С каждым билдом мы делаем тестер все лучше и лучше. Осталось добавить моделирование реквотов в тестере торговых стратегий.


Ниже приведенный код показывает как тестер можит подглядывать при тестировании все тики. Подсматривание идет с младшего таймфрейма все старшие на тестируемой валютной паре.

//+------------------------------------------------------------------+
//|                                              CheckBigTF_High.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/ru"
 
int myPeriodNumber; 
 
//+------------------------------------------------------------------+
//|  возвращает период в минутах                                     |
//+------------------------------------------------------------------+
int GetPeriod(int Number)
   {
   int res;
//----
   switch(Number)
      {
      case 0: res=PERIOD_M1; break;
      case 1: res=PERIOD_M5; break;
      case 2: res=PERIOD_M15; break;
      case 3: res=PERIOD_M30; break;
      case 4: res=PERIOD_H1; break;
      case 5: res=PERIOD_H4; break;
      case 6: res=PERIOD_D1; break;
      case 7: res=PERIOD_W1; break;
      case 8: res=PERIOD_MN1; break;
      default: res=Period();
      }
//----
   return(res);   
   } 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  for (int i=0;i<9;i++)
   {
   if (GetPeriod(i)==Period()) break;
   }
  myPeriodNumber=i;
  Print("Родной период тестирования ",GetPeriod(myPeriodNumber)," минут");
//----
   return(0);
  }
 
//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2, int Dig,double accuracy)
  {
   if(NormalizeDouble(MathAbs(number1-number2),Dig)>=accuracy) return(true);
   else return(false);
  }
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  string Str;
  
  double myClose=Bid;
  for (int i=myPeriodNumber; i<9; i++)
   {
   if (CompareDoubles(myClose,iHigh(NULL,GetPeriod(i),0),Digits,Point))
      {
      Str = TimeToStr(TimeCurrent()) + ", myHigh = " + DoubleToStr(myClose, Digits)+"  High("+GetPeriod(i)+")="+iHigh(NULL,GetPeriod(i),0);
      Print(Str);
      
      }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
HIDDEN:


Ниже приведенный код показывает как тестер можит подглядывать при тестировании все тики. Подсматривание идет с младшего таймфрейма все старшие на тестируемой валютной паре.

Вам уже указали на некоректность приведенного скрипта в ветке '28 !!! валютных пар, 1 эксперт. Опять грааль, но такого помоему еще никто не показывал. + ДЕМО СЧЕТ'


Yurixx 01.08.2007 12:43

2 HIDDEN

Насколько я понимаю, предложенный Вами тест с использованием слегка модифицированного советника Rosh'а, не вполне корректен. High старшего периода действительно не обязан все время быть равен Bid'у текущего т/ф.

Чтобы показать, что в тестере имеется возможность подсматривать в будущее, достаточно показать, что на начало свечи старшего периода его High больше, а Low - меньше, чем High(Low) этого старшего периода, но рассчитанные с текущего т/ф. А это значит следующее.

Допустим старший т/ф - Н1, а текущий - М1. В советнике должен быть организован контроль минут текущего т/ф и на каждое начало нового часа должны сбрасываться до величины Open первой минуты часа значения переменных H1High и H1Low. В этих переменных руками и потиково формируются High и Low для т/ф Н1. Дальше они, опять же потиково, сравниваются с данными, полученными с т/ф Н1 и, если равенство нарушается, то это и дает возможность подсматривать в будущее.

Такой тест позволит не только доказать возможность использовать данные будущего, но и покажет когда и как они возникают. Лично я полагаю, что High и Low старшего т/ф сразу приобретают свои значения при переходе к новой свече на этом старшем т/ф. То есть, что ситуация вообще разработчиками не предусмотрена. Но вполне может быть, что я ошибаюсь и расхождение со значениями текущего времени возникает где-то в середине времени жизни свечи в результате программного глюка. Тогда этот результат разраболтчикам будет весьма полезен.

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

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

ИМХО - Это мы должны заботиться о том, чтобы не получать глупых или вредных результатов. А разработчики должны заботиться о том, чтобы у нас в работе было побольше позитивных возможностей. Вместо этого, получается, они должны тратить время и силы, чтобы перекрыть нам же (!) негативные возможности. Зачем ? Не пользуйтесь этим и все. Если кодер не понимает, что он пишет, то может быть ему стоит заняться собой, а не валить вину на разработчиков ?


 

Зачем вообще моделировать по тикам?

Достаточно в тестер посылать 4 числа OHLC в соответствии с их временем. То есть вариантов всего 2 : O-H-L-C или O-L-H-C.

Разве в этом случае будет что-то некорректно работать?

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