Тупиковый период.

 

Всем привет.

Последнее время многие трейдеры начали писать мультивалютные экспертные системы. Т.е. для работы скажем на EURUSD, используется еще несколько валютных пар для анализа. Многие мне задают вопрос о тестировании и о реальной работе рынка одного и тогоже эксперта. И один из подобных вопросов поставил меня в небольшой тупик. Хотелось бы прояснить этот момент у разработчиков и у людей который в теме что и как.

Итак задачка следующая:
1. Для входа по EURUSD происходит анализ индикаторов по нескольким валютным парам, например по GBPUSD и USDCHF, анализ идет по показаниям индикатора, к примеру по Relative Vigor Index, RVI. Формула для расчета данного индикатора:
RVI = (CLOSE - OPEN) / (HIGH - LOW)

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

Из присланного куска кода видно следующие:

double iEURUSD,iGBPUSD,iUSDCHF;

iEURUSD = iRVI("EURUSD", 0, 10,MODE_MAIN,0);

iGBPUSD = iRVI("GBPUSD", 0, 10,MODE_MAIN,0);

iUSDCHF = iRVI("USDCHF", 0, 10,MODE_MAIN,0);


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

А вот теперь тот подводный камень, на котором спотыкаются все кто пишет подобные эксперты на нулевом баре. Различия в тестере и на реальном рынке.

т.к. тестер не умеет моделировать потиково катеровки других валютных пар, кроме той по которой идет тестирование, мы имеем сильно искаженную картину. А именно:
При работе на реальном рынке поступают тики по всем валютным парам и при запросе значения индикатора с валютной пары GBPUSD и USDCHF расчет идет по имеющимся катеровкам запрашиваемого таймфрейма.

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

Про тупик:
Из моих рассуждений и догадок имеем следующею картину, что при работе на нулевом баре расчет индикатора происходит по уже известным ценам CLOSE, OPEN, HIGH, LOW которые хранятся в базе истории терминала. Или все-таки расчет идет только по OPEN свечки, когда все значения CLOSE, OPEN, HIGH, LOW = одному значению, или все-таки идет подсматривание в будущее? Я специально привел пример именно индикатора Relative Vigor Index, RVI, т.к. в его формуле есть все нужные нам значения.

На данный момент я посоветывал человеку сделать следующее:

double iEURUSD,iGBPUSD,iUSDCHF;

iEURUSD = iRVI("EURUSD", 0, 10,MODE_MAIN,0);

iGBPUSD = iRVI("GBPUSD", 0, 10,MODE_MAIN,1);

iUSDCHF = iRVI("USDCHF", 0, 10,MODE_MAIN,1);

Т.е. при анализе евры использовать нулевой бар, а по остальным валютным парам прошлый бар.

В этом случае результаты тестирования и реального рынка будут ли максимально совпадать?

 

Именно так. Так как "чужие" инструменты не моделируются при тестировании.

 
Так будет же сдвиг значения индикатора на один бар из-за того что по евре берем текущий бар.
Тут надо или везде брать прошлый бар, или попытаться промоделировать все 3 пары одновременно, эта тема недавно проскакивала и вроде бы задача была успешно решена, кажись Xeon в курсе
  
 
stringo:

Именно так. Так как "чужие" инструменты не моделируются при тестировании.


А если оставить анализ на нулевом баре, тогда происходит подсматиривание в будущее или нет.
Как в этом случае.
 
HIDDEN:
stringo:

Именно так. Так как "чужие" инструменты не моделируются при тестировании.


А если оставить анализ на нулевом баре, тогда происходит подсматиривание в будущее или нет.
Да, происходит подсматривание в будущее, т.к. бар фактически ещё не закрылся, а советнику уже даётся его CLOSE.
 

Кому интересно, погоняйте этого советника в тестере в режиме визуализации, например на EURUSD H1 и увидите какие значения берутся с нулевого бара чифа.

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  string st="iOpen()="+DoubleToStr(iOpen("USDCHF", 0, 0), 4)+"\n"+
            "iHigh()="+DoubleToStr(iHigh("USDCHF", 0, 0), 4)+"\n"+
            "iLow()="+DoubleToStr(iLow("USDCHF", 0, 0), 4)+"\n"+
            "iClose()="+DoubleToStr(iClose("USDCHF", 0, 0), 4)+"\n"+
            "";
  Comment(st);
}
//+------------------------------------------------------------------+
Причина обращения: