Мой советник имеет стратегию только для открытых цен, и я хотел придерживаться ее, чтобы сэкономить время во время бэктестинга (очевидно).
Решение, которое я придумал, заключается в следующем:
используйте наиболее активную пару в течение основного торгового периода вашего советника в качестве "драйвера" (график, который производит тики).
в каждом onTick() проверяйте, вошел ли ваш драйвер в новый бар.
если нового бара нет, подождите еще немного
если есть новый бар, распространите сообщение OnTick() среди ваших отдельных трейдеров (каждый трейдер отвечает за одну валютную пару)
в трейдере проверьте, равно ли последнее время валютной пары трейдера "времени нового бара" из драйвера
если да, то можно продолжать работу в обычном режиме
если нет, вы должны рассматривать цену закрытия текущего бара как цену открытия, которую вы ищете, и если вы ищете информацию из предыдущих баров, учитывайте эту ситуацию "смещения на один".
Я вырежу и вставлю важные части кода из моего советника ниже здесь. Надеюсь, это будет вам полезно!
Ура!
// this is from the Trader base class// manage a new tick and predetermines whether a new bar hast startedvirtualvoid onTick() {
MqlRates rates[1];
// check the rates of the tick stream we're attached to (_Symbol!!!)if (CopyRates(_Symbol, _period, 0, 1, rates) != 1) {
Print("CopyRates of ", _Symbol, " failed");
return;
}
if (_newBar = (rates[0].time != _currBarTime)) {
_prevBarTime = _currBarTime; // remember the previous bar time
_currBarTime = rates[0].time; // remember the current bar time
}
}
// this is the actual trader for a specific currency pair// checks whether a new trade (closing or opening) is to be performedvoid checkForTrade(void) {
MqlRates rates[3];
if (CopyRates(_symbol, _period, 0, 3, rates) != 3) {
Print("CopyRates of ", _symbol, " failed");
return;
}
bool inSameBar = (rates[2].time == _currBarTime); // _currBarTime determined in OnTick()!double sBuf[3]; // signal buffer! 2: current bar, 1: previous bar, 0: current - 2 if (CopyBuffer(_ind, SIGNAL3, 0, 3, sBuf) != 3) {
Print("copy signal from indicator failed, no data");
return;
}
// first close exiting ordersdouble v0 = inSameBar ? sBuf[0] : sBuf[1]; // determine the actual 'previous' bardouble v1 = inSameBar ? sBuf[1] : sBuf[2]; // determine the actual 'current' barif (_volume > 0) {
if (crossesZeroDownwards(v0, v1)) { // cross down?
setReqVolume(0); // close this order
tradeCloses = true;
}
} elseif (_volume < 0) {
if (crossesZeroUpwards(v0, v1)) { // cross up?
setReqVolume(0); // close this order
tradeCloses = true;
}
}
...
Только что сам столкнулся с этой проблемой. Вы уже догадались, пытаюсь перейти с JForex на MQL5! Я уже начинаю жалеть, что не потрудился, хотя, полагаю, продление срока помогает :)
Похоже, что MetaQuotes до сих пор не исправила это.
MT5 forex, похоже, не поддерживает DOM.
isNewBar мне не поможет.
Такое положение дел кажется нелепым.
Кто-нибудь знает, изменилось ли что-нибудь в MT5 относительно этой проблемы?
Кто-нибудь знает решение, которое работает для мультивалютной стратегии, которая ожидает, что ей будут скармливать тики?
Только что сам столкнулся с этой проблемой. Вы уже догадались, пытаюсь перейти с JForex на MQL5! Я уже начинаю жалеть, что не потрудился, хотя, полагаю, продление срока помогает :)
Похоже, что MetaQuotes до сих пор не исправила это.
MT5 forex, похоже, не поддерживает DOM.
isNewBar мне не поможет.
Такое положение дел кажется нелепым.
Кто-нибудь знает, изменилось ли что-нибудь в MT5 относительно этой проблемы?
Кто-нибудь знает решение, которое работает для мультивалютной стратегии, которая ожидает, что ей будут скармливать тики?
Ваш в разочаровании,
Джим
Попробуйте использовать OnTimer() с 1-секундным таймером вместо OnTick().
enivid: Попробуйте использовать OnTimer() с 1-секундным таймером вместо OnTick().
TradingGurus:
Однако проведение мультивалютных бэктестов на разных парах все равно дает немного разные результаты.
Джим, я использую решение OnTimer с 1 секундой в своем советнике для конкурсного портфеля. Если ваша стратегия полагается на каждый тик, то да, вы получите разные результаты при использовании OnTimer и OnTick на одной валюте, поскольку возможно более одного тика в секунду. Я обнаружил, что обычно наибольшая разница возникает, когда "недостающий" тик создает новый максимум или минимум бара. Вы можете проверить максимум/минимум предыдущего бара и максимум/минимум текущего бара на наличие изменений и вставить их как "отсутствующий тик", когда они происходят, если, конечно, текущий тик не создал новый максимум/минимум бара.
Также помните, что MetaTrader Strategy Tester моделирует только тиковые данные. В зависимости от того, насколько чувствительна ваша стратегия к тиковому движению, эта симуляция может оказать значительное влияние на обратное тестирование по сравнению с прямым тестированием.
Если ваша стратегия полагается на каждый тик, то да, вы получите разные результаты при использовании OnTimer и OnTick на одной валюте, поскольку возможно более одного тика в секунду.
- Патрик
Это не совсем то, что я имел в виду. Наш (пока только потенциальный!) конкурсный советник торгует всеми 12 парами. Используя только OnTimer(), я получаю разные результаты бэктестов, если в тестере стратегий выбираю GBP/USD, а не EUR/USD, например.
Я слишком хорошо знаком с ограничениями MT4 при бэктестинге с использованием симулированных тиков. К сожалению, похоже, что MT5 не намного лучше!
Наконец-то мы представили наш советник, когда до окончания срока оставалось около 5 минут.
За плечами один бэктест, и никакой оптимизации.
Кто-нибудь может сказать мне, есть ли у него шанс быть одобренным?
Если да, то будет ли нам разрешено возиться с настройками входа в течение следующей недели или нет?
Джим
Удачи, Джим!
Если ваш советник правильно оттестирован в период с 2010.01.01 по 2010.08.01 без каких-либо ошибок(торговые ошибки и т.д.) и приносит прибыль, то вы, скорее всего, получите одобрение, при условии, что ваша личная информация также верна. Однако с этого момента вы не сможете ничего изменить, включая настройки (входные параметры).
Я хотел опубликовать это в то время, но оно ужасно выглядело на первой странице:
Привет, ребята и девчонки,
Я тоже столкнулся с этой проблемой некоторое время назад, и мы обсуждали ее здесь: https://www.mql5.com/en/forum/1642.
Мой советник имеет стратегию только для открытых цен, и я хотел придерживаться ее, чтобы сэкономить время во время бэктестинга (очевидно).
Решение, которое я придумал, заключается в следующем:
Я вырежу и вставлю важные части кода из моего советника ниже здесь. Надеюсь, это будет вам полезно!
Ура!
Только что сам столкнулся с этой проблемой. Вы уже догадались, пытаюсь перейти с JForex на MQL5! Я уже начинаю жалеть, что не потрудился, хотя, полагаю, продление срока помогает :)
Похоже, что MetaQuotes до сих пор не исправила это.
MT5 forex, похоже, не поддерживает DOM.
isNewBar мне не поможет.
Такое положение дел кажется нелепым.
Кто-нибудь знает, изменилось ли что-нибудь в MT5 относительно этой проблемы?
Кто-нибудь знает решение, которое работает для мультивалютной стратегии, которая ожидает, что ей будут скармливать тики?
Ваш в разочаровании,
Джим
Только что сам столкнулся с этой проблемой. Вы уже догадались, пытаюсь перейти с JForex на MQL5! Я уже начинаю жалеть, что не потрудился, хотя, полагаю, продление срока помогает :)
Похоже, что MetaQuotes до сих пор не исправила это.
MT5 forex, похоже, не поддерживает DOM.
isNewBar мне не поможет.
Такое положение дел кажется нелепым.
Кто-нибудь знает, изменилось ли что-нибудь в MT5 относительно этой проблемы?
Кто-нибудь знает решение, которое работает для мультивалютной стратегии, которая ожидает, что ей будут скармливать тики?
Ваш в разочаровании,
Джим
Привет, Энивид,
Попробуйте использовать OnTimer() с 1-секундным таймером вместо OnTick().
Спасибо за предложение. Ваше решение работает гораздо лучше, чем любое другое, которое я пробовал, конечно, для наших требований.
Однако при проведении мультивалютных бэктестов на разных парах все равно получаются немного разные результаты.
Это не внушает особого доверия!
Теперь я пойду сжигать больше масла в полночь!
Будьте здоровы,
Джим
Попробуйте использовать OnTimer() с 1-секундным таймером вместо OnTick().
TradingGurus:
Однако проведение мультивалютных бэктестов на разных парах все равно дает немного разные результаты.
Джим, я использую решение OnTimer с 1 секундой в своем советнике для конкурсного портфеля. Если ваша стратегия полагается на каждый тик, то да, вы получите разные результаты при использовании OnTimer и OnTick на одной валюте, поскольку возможно более одного тика в секунду. Я обнаружил, что обычно наибольшая разница возникает, когда "недостающий" тик создает новый максимум или минимум бара. Вы можете проверить максимум/минимум предыдущего бара и максимум/минимум текущего бара на наличие изменений и вставить их как "отсутствующий тик", когда они происходят, если, конечно, текущий тик не создал новый максимум/минимум бара.
Также помните, что MetaTrader Strategy Tester моделирует только тиковые данные. В зависимости от того, насколько чувствительна ваша стратегия к тиковому движению, эта симуляция может оказать значительное влияние на обратное тестирование по сравнению с прямым тестированием.
- Патрик
Если ваша стратегия полагается на каждый тик, то да, вы получите разные результаты при использовании OnTimer и OnTick на одной валюте, поскольку возможно более одного тика в секунду.
- Патрик
Это не совсем то, что я имел в виду. Наш (пока только потенциальный!) конкурсный советник торгует всеми 12 парами. Используя только OnTimer(), я получаю разные результаты бэктестов, если в тестере стратегий выбираю GBP/USD, а не EUR/USD, например.
Я слишком хорошо знаком с ограничениями MT4 при бэктестинге с использованием симулированных тиков. К сожалению, похоже, что MT5 не намного лучше!
Джим
Мы очень хотели перевести все это на тики по историческим причинам, но мы сдались. Просто не можем добиться последовательности.
Мы решили попробовать, и теперь работаем с минутными барами с помощью OnTimer() и isNewBar().
Наконец-то все стало выглядеть хоть немного разумно, а до дедлайна чемпионата еще 4 часа :)
ДжимНаконец-то мы представили наш советник, когда до окончания срока оставалось около 5 минут.
За плечами один бэктест, и никакой оптимизации.
Кто-нибудь может сказать мне, есть ли у него шанс быть одобренным?
Если да, то будет ли нам разрешено возиться с настройками входа в течение следующей недели или нет?
Джим
Наконец-то мы представили наш советник, когда до окончания срока оставалось около 5 минут.
За плечами один бэктест, и никакой оптимизации.
Кто-нибудь может сказать мне, есть ли у него шанс быть одобренным?
Если да, то будет ли нам разрешено возиться с настройками входа в течение следующей недели или нет?
Джим
Удачи, Джим!
Если ваш советник правильно оттестирован в период с 2010.01.01 по 2010.08.01 без каких-либо ошибок(торговые ошибки и т.д.) и приносит прибыль, то вы, скорее всего, получите одобрение, при условии, что ваша личная информация также верна. Однако с этого момента вы не сможете ничего изменить, включая настройки (входные параметры).
Надеюсь увидеть вашего бота в действии!
- Патрик