Заставить тестер работать не фактической истории тиков, а по цене закрытия свечи - страница 2

 
Roman Shiredchenko #:
правильная постановка вопроса: Заставить тестер работать не фактической истории тиков, а по цене ОТКРЫТИЯ свечи.

Спасибо за статью.

Да, режим моделирования по цене открытия - практически решение вопроса. Однако и в нём есть момент. Сделки всё равно идут не по цене открытия. МТ5 всё равно рисует какие-то ближайшие аск и бид, которые отличаются от цены закрытия прошлого бара на 1 минимальный тик. И в зависимости от направления сделки исполняет её либо по биду, либо по аску. Т.е. цена сделки может отличаться от цены открытия свечи. Но это отличие минимально.

 
помню метод по контрольным точкам OHLC - показывал лютую граальность из-за особенностей моделирования контрольных точек - там если после открытия нарисовался хай свечи - то следующий тик будет лоу свечи и наоборот, поэтому этот метод буквально видел будущее, не знаю почему его всё ещё не убрали из тестера
 
Anton Polkovnikov #:

Спасибо за статью.

Да, режим моделирования по цене открытия - практически решение вопроса. Однако и в нём есть момент. Сделки всё равно идут не по цене открытия. МТ5 всё равно рисует какие-то ближайшие аск и бид, которые отличаются от цены закрытия прошлого бара на 1 минимальный тик. И в зависимости от направления сделки исполняет её либо по биду, либо по аску. Т.е. цена сделки может отличаться от цены открытия свечи. Но это отличие минимально.

ок что разобрались. Тестирование по OHLC на М1 и данные точные будут.

 
Roman Shiredchenko #:

ок что разобрались. Тестирование по OHLC на М1 и данные точные будут.

Ну не совсем разобрались. Сделки все равно проходят не по цене закрытия или открытия. К примеру, в режиме OHLC. А по аскам и бидам, которые непонятно как строит сам МТ.
 
Anton Polkovnikov #:
Ну не совсем разобрались. Сделки все равно проходят не по цене закрытия или открытия. К примеру, в режиме OHLC. А по аскам и бидам, которые непонятно как строит сам МТ.

делайте в робота функцию работы по ценам открытия нового бара тут в каждой почти статье с роботом она используется новый бар NewBars()  и тестируйте по модели по ценам открытия - всё там совпадает ок и биды и цены открытия и аски - всё на своих местах.

Ставите там таймфрейм явно М1 и тестируете на М1 

https://www.mql5.com/ru/articles/159

вот пример запроса    

вот еще в статье ок приводится пример использования новой свечи.

Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
Ещё - в тестере нет контроля цен закрытия свечи - только цены открытия. Примите это к сведению как должное. И робота можно сделать по цене открытия свечи. По шагам тестироване запусте и разберётесь с вопросом. F12 или иное по свечам тест листайте медленно и всё поймёте. F12 после запуска теста в реж визуализации - по-барный проход периода теста.
 
Roman Shiredchenko #:
Ещё - в тестере нет контроля цен закрытия свечи - только цены открытия. Примите это к сведению как должное. И робота можно сделать по цене открытия свечи. По шагам тестироване запусте и разберётесь с вопросом. F12 или иное по свечам тест листайте медленно и всё поймёте. F12 после запуска теста в реж визуализации - по-барный проход периода теста.

в советнике вмонтируйте ...

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

   static datetime Old_Time;
   datetime New_Time[1];
   bool IsNewBar=false;

//--- копируем время текущего бара в элемент New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);

//--- ok, успешно скопировано
   if(copied>0)
     {
      if(Old_Time!=New_Time[0]) // если старое время не равно
        {
         //--- новый бар
         IsNewBar=true;
         if(MQLInfoInteger(MQL_DEBUG))
            Print("New Bar",New_Time[0],"Old Bar",Old_Time);
         //--- сохраняем время бара
         Old_Time=New_Time[0];
        }
     }
   else
     {
      Alert("Time copy error, error number =",GetLastError());
      ResetLastError();
      return;
     }

//--- советник должен проверять условия совершения новой торговой операции только при новом баре
   if(IsNewBar==false)
     {
      return;
     }
//---
//--- имеем ли мы достаточное количество баров на графике для работы
   int Mybars=Bars(_Symbol,_Period);
   if(Mybars<60) // если общее количество баров меньше 60
     {
      Print("Failed to get number of bars for ",_Symbol);
      return;
     }
//---