Обсуждение статьи "Основы тестирования в MetaTrader 5" - страница 3

 
sergeev:
да
 Спасибо! Вот это новость!
 
Yedelkin:
 Спасибо! Вот это новость!

ничего удивительного в этом нет.

наличие экспертов на чарте не мешает ведь индикаторам расчитываться :)

просто наверно имеется ввиду, что событие прихода тика генерируется уже после обсчета индикаторов.

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


 
sergeev:

Но если у вас события не обрабатывается, то обсчет индикаторов все равно произведётся.  

 Да, но расчёт индикаторов будет в моём случае синхронизирован с приходом тиков по чужому символу (символу, к которому прикрёплён сам эксперт). Вот это вот стало неожиданностью.
 
Yedelkin:
 Да, но расчёт индикаторов будет в моём случае синхронизирован с приходом тиков по чужому символу (символу, к которому прикрёплён сам эксперт). Вот это вот стало неожиданностью.

дело в том, что если мы ведем речь про тестер, то чартовые события от объектов... а такие там есть?

по-моему месяц назад еще не было, может что поменялось, чего я не видел?

поэтому эксперт только на чартовых событиях в тестере работать не будет. так как событий нет. да и размера чарта тоже :) попробуйте в тестере получить ChartGetXXX .  везде нули возвращает.

 
sergeev:

дело в том, что если мы ведем речь про тестер, то чартовые события от объектов... а такие там есть?

по-моему месяц назад еще не было, может что поменялось, чего я не видел?

поэтому эксперт только на чартовых событиях в тестере работать не будет. так как событий нет. да и размера чарта тоже :) попробуйте в тестере получить ChartGetXXX .  везде нули возвращает.

 Нет, чартовых событий от объектов нет. Индикаторы просто периодически отсылают те или иные рассчитанные значения с помощью пользовательских событий  (идею когда-то Lizar подсказал). Сама по себе эта задумка в тестере  работает.
 
Yedelkin:
Сама по себе эта задумка в тестере  работает.

Если все работает, то в чем тогда проблема у вас в коде?

OnCalculation далеко находится, чтоб проверку сделать?

 
sergeev:

Если все работает, то в чем тогда проблема у вас в коде?

 Да нет проблем в коде. Вы подтвердили моё предположение, что в описанном выше случае индикаторы пересчитываются  в тестере  с частотой тиков чужого символа. Это значит, что индикаторы пересчитываются не с той частотой, которую  генерировал бы тестер при нахождении каждого индикатора на "своём" символе. Ну что ж, что тут проверять, придётся приспосабливаться. Если, конечно, Ваше подтверждение - правильное :)
 
Yedelkin:
 Да нет проблем в коде. Вы подтвердили моё предположение, что в описанном выше случае индикаторы пересчитываются  в тестере  с частотой тиков чужого символа. Это значит, что индикаторы пересчитываются не с той частотой, которую  генерировал бы тестер при нахождении каждого индикатора на "своём" символе. Ну что ж, что тут проверять, придётся приспосабливаться. Если, конечно, Ваше подтверждение - правильное :)
доверяй - но проверяй :)
 

Выдержка из статьи:

Обработка событий в тестере

Наличие обработчика OnTick() в эксперте не является обязательным для того, чтобы его можно было подвергнуть проверке на исторических данных в тестере терминала MetaTrader 5. Достаточно того, чтобы в советнике была хотя бы одна функция-обработчик из перечисленных:

    OnTick() - обработчик события прихода нового тика;
    OnTrade() - обработчик торгового события;
    OnTimer() - обработчик события прихода сигнала от таймера;
    OnChartEvent() - обработчик пользовательских событий...


Уважаемые разработчики, просьба прокомментировать, а что с функцией OnTradeTransaction() ?

Есть ли в планах решение по её нормальной работе в Тестере?

 

По поводу раздела "Синхронизация баров при тестировании в режиме "Только цены открытия""

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

А если советник использует данные из SymbolInfoDouble(simbol,SYMBOL_BID) и SymbolInfoDouble(simbol,SYMBOL_ASK) - то можно не усложнять код и ресурсоемкость эксперта.

В данном варианте работы, если новый бар по другому символу не появился, то SymbolInfoDouble(simbol,SYMBOL_BID) вернет последнюю известную цену, т.е. цену Close предыдущего бара. А цена Close предудущего бара от цены Open нового бара отличается на движение цены за 1 тик (между последним тиком предыдущего бара и первым тиком нового бара). Т.е. этой разницей можно пренебречь.

Это можно проверить, вставив строку

Print(_Symbol," = ",SymbolInfoDouble(_Symbol,SYMBOL_BID),"  ",other_symbol," = ",SymbolInfoDouble(other_symbol,SYMBOL_BID));

до и после цикла синхронизации.
Вот пример лога:

2016.09.01 12:31:00   На символе EURUSD открылся новый бар в 2016.09.01 12:31
2016.09.01 12:31:00   EURUSD = 1.11389  USDJPY = 103.534
2016.09.01 12:31:00   Подождем 5 секунд..
2016.09.01 12:31:05   Время открытия последнего бара на своем символе EURUSD: 2016.09.01 12:31
2016.09.01 12:31:05   Время открытия последнего бара на символе USDJPY: 2016.09.01 12:31
2016.09.01 12:31:05   Бары синхронизировались в 2016.09.01 12:31:05
2016.09.01 12:31:05   EURUSD = 1.11389  USDJPY = 103.532

Отличие для USDJPY = 2 пт. Где 103.534 - соответствует цене Close USDJPY предыдущего бара. После цикла синхронизации получили 103.532, которая равна Open нового бара.