Что меняет режим тестера "только цены открытия"?

 

Собственно, для советника работающего по onTick, в режиме "Только цены открытия" при тестировании все вычисления индикаторов и вызов функции OnTick() в экспертах происходит только один раз на бар.

А что меняет режим тестера "Только цены открытия" для советника который работает по onTimer?

У меня, для советника, который работает по onTimer, этот режим тестера дает очень нехилый грааль, в том числе и в стресс-режиме тестирования.

Выдержка из справки:

"В данном режиме также происходит генерация цен OHLC минутных баров, однако эксперт запускается только в начале бара (по цене Open). Генерация остальных цен необходима для корректной отработки торговых операций. Например, для закрытия позиции по Стоп Лосс или Тейк Профит или для срабатывания отложенных ордеров."

Т.е. если я правильно понял, генерируются только тики OHLC и bid меняет (в лучшем случае) в течении минуты значение 4 раза.

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

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

Получается, это опасный режим, для оценки советников (и душевного равновесия). И если в 4-ке он был грубым и граалей не давал, то в 5-ке - пожалуйста.

 
Vigor:

Собственно, для советника работающего по onTick, в режиме "Только цены открытия" при тестировании все вычисления индикаторов и вызов функции OnTick() в экспертах происходит только один раз на бар.

А что меняет режим тестера "Только цены открытия" для советника который работает по onTimer?

У меня, для советника, который работает по onTimer, этот режим тестера дает очень нехилый грааль, в том числе и в стресс-режиме тестирования.

Выдержка из справки:

"В данном режиме также происходит генерация цен OHLC минутных баров, однако эксперт запускается только в начале бара (по цене Open). Генерация остальных цен необходима для корректной отработки торговых операций. Например, для закрытия позиции по Стоп Лосс или Тейк Профит или для срабатывания отложенных ордеров."

Т.е. если я правильно понял, генерируются только тики OHLC и bid меняет (в лучшем случае) в течении минуты значение 4 раза.

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

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

Получается, это опасный режим, для оценки советников (и душевного равновесия). И если в 4-ке он был грубым и граалей не давал, то в 5-ке - пожалуйста.


Так если логика onTick полностью или частично дублируется в onTimer и следует ожидать подобных проблем.

Другое дело что в таком случае внутри самого советника следует отлавливать момент возникновения нового бара (как вариант - не дублировать логику).

 
Interesting:

Так если логика onTick полностью или частично дублируется в onTimer и следует ожидать подобных проблем.

Другое дело что в таком случае внутри самого советника следует отлавливать момент возникновения нового бара (как вариант - не дублировать логику).

onTick вообще нет. Да и зачем вылавливать новый бар для onTimer, если можно, при желании поставить каждые 60 сек считыватьзначение bid?
Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 

Резюме. В режимах "Только цены открытия" и OHLC очень легко сделать тестерный грааль, на основе советника который по OnTimer пашет.

Открывается по High/Low тикам минутного бара и закрывается соответствующе

Поэтому к картинкам "посмотрите мой грааль" следует еще и уточнять какой режим тестирования и не onTimer ли в советнике.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5
 
Vigor:

Резюме. В режимах "Только цены открытия" и OHLC очень легко сделать тестерный грааль, на основе советника который по OnTimer пашет.

Открывается по High/Low тикам минутного бара и закрывается соответствующе

Поэтому к картинкам "посмотрите мой грааль" следует еще и уточнять какой режим тестирования и не onTimer ли в советнике.

Вы лучше приложите пример (можно упрощенный) своего эксперта.

Иначе обсуждение идет без фактического материала.

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

 

У меня уже неплохой опыт работы мультивалютника только через OnTimer (без OnTick). Например, если проводить тестирование/оптимизацию в режме ONLC на M1, а затем сравнить те же данные, но в режиме "Все тики", то результат будет довольно близким (таймер либо 1 мин, либо 5 сек). Главное, я так понимаю, чтобы режим "Все тики" Тестера был как можно ближе к работе советника в OnLine - режиме. Использовать же режим "По барам" в таких советниках, видимо не корректно, ведь мы же можем иметь свои тики через OnTimer, причём гораздо удобнее чем ловить новый бар.

Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
Renat:
Приложите лучше MQ5 код - пока каждый не сможет сам прогнать и проверить, конструктивного обсуждения не получится.

Хорошо. Специально выделил эту особенность в чистом виде. "Это" - тестерный грааль для режимов "по ценам открытия" и "OHLC на M1"

//+------------------------------------------------------------------+
//|                                                       grr-al.mq5 |
//|                                                     Igor Volodin |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Igor Volodin"
#property version   "1.00"
#property link      "http://www.mql5.com"
//+------------------------------------------------------------------+
#define MAGIC_NUMBER 12937
#define DEV 20
#define RISK 0
#define BASELOT 0.1
#define SL 100
#define TP 700
#define DELTA 30
//+------------------------------------------------------------------+
int OnInit() {
   EventSetTimer(1); 
   return(0);
}
void OnDeinit(const int reason) {
   EventKillTimer();
}
void OnTimer() {
   MqlTick tick;
        MqlTradeRequest request;
        MqlTradeResult tradeResult;
        MqlTradeCheckResult checkResult;
        static double oldtick = 0.0;
        static double a1 = 0;
        double point = SymbolInfoDouble(Symbol(),SYMBOL_POINT);
        static bool br=false;
        if (SymbolInfoTick(Symbol(),tick)) {
                datetime lastbar = SeriesInfoInteger(Symbol(),0,SERIES_LASTBAR_DATE);
                if (tick.bid != oldtick) {
                        oldtick = tick.bid;
                        if (isNewBar()) { a1 = tick.bid; br = false; } 
                        else {
                                if (!br) {
                                        if (tick.bid-a1 > DELTA*point ) {
                                                br=true;
                                                request.price = tick.bid;
                                                request.sl = tick.ask+SL*point;
                                                request.tp = tick.bid-TP*point;
                                                request.type = ORDER_TYPE_SELL;
                                        } else if (a1-tick.bid > DELTA*point ){
                                                br=true;
                                                request.price = tick.ask;
                                                request.sl = tick.bid-SL*point;
                                                request.tp = tick.ask+TP*point;
                                                request.type = ORDER_TYPE_BUY;
                                        }
                                        if (br) {
                                                request.action       = TRADE_ACTION_DEAL;
                                                request.symbol       = Symbol();
                                                request.volume       = getLot();
                                                request.deviation    = DEV;
                                                request.type_filling = ORDER_FILLING_AON;
                                                request.type_time    = ORDER_TIME_GTC;
                                                request.comment      = "";
                                                request.magic        = MAGIC_NUMBER;
                                                if(OrderCheck(request,checkResult) ) {
                                                        OrderSend(request, tradeResult);
                                                } else {
                                                        Print("Error: ", checkResult.retcode);
                                                }
                                        }
                                }
                        }       
                }
        }
        
  }
//+------------------------------------------------------------------+
bool isNewBar() {
                static datetime lastTime=0;
                datetime lastbarTime = SeriesInfoInteger(Symbol(),0,SERIES_LASTBAR_DATE);
                if (lastTime==0) {
                        lastTime=lastbarTime;
                        return(false);
                }
           if(lastTime != lastbarTime) {
              lastTime=lastbarTime;
              return(true);
                }
                return (false);
}

double getLot() {
   if (RISK == 0) return(BASELOT);
        double required;
        if (RISK == 0) return(BASELOT);
        double max_lot = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
        OrderCalcMargin(ORDER_TYPE_BUY, Symbol(), 1, SymbolInfoDouble(Symbol(), SYMBOL_ASK), required);
        double maximal_lot = (AccountInfoDouble(ACCOUNT_FREEMARGIN)*0.9/required);
        double lot = maximal_lot*RISK;
        lot = MathMin(lot, max_lot);
        return (NormalizeDouble(lot,2));
}
//+------------------------------------------------------------------+  
Erm955:

Использовать же режим "По барам" в таких советниках, видимо не корректно.

Да, неккоректно. Почему - я описал выше. Корректно, если только советник на onTimer'e сам работает только по открытию бара. И проводить оптимизацию для режима "по ценам открытия" для (onTimer)мультивалютников нужно только в режиме "каждый" тик. Медленно, но что делать... Иначе рискуем быть обманутыми. И для  "граалей" тест только по "каждый тик", т.к. можем получить такое:


с фикс лотом 0.1:



 
Спасибо за пример, будем проверять.

 
Vigor:

Хорошо. Специально выделил эту особенность в чистом виде. "Это" - тестерный грааль для режимов "по ценам открытия" и "OHLC на M1"

Да, неккоректно. Почему - я описал выше. Корректно, если только советник на onTimer'e сам работает только по открытию бара. И проводить оптимизацию для режима "по ценам открытия" для (onTimer)мультивалютников нужно только в режиме "каждый" тик. Медленно, но что делать... Иначе рискуем быть обманутыми. И для  "граалей" тест только по "каждый тик", т.к. можем получить такое:


с фикс лотом 0.1:



 Очень хорошо, что тема заинтересовала разработчиков. Потому как адекватность работы  OnTimer-советников в тестере и OnLine-режиме пока не вызывает уверенности. У меня совпадение результатов в Тестере в режиме "ONLC M1"  режиме "Каждый тик", видимо, связано с особенностью самого советника: советник использует большие таймфреймы. Но с другой стороны проводить тестирование/оптимизацию в режиме "Все тики" раз в 10 медленнее, чем в режиме "ONLC M1". Посему пришлось выбрать компромисный вариант: оптимизацию проводить по минуткам, а фарвард-тест по тикам.
Причина обращения: