Бэктестирование мультивалютного советника - страница 3

 

Я хотел опубликовать это в то время, но оно ужасно выглядело на первой странице:

Логика портфельного эксперта

 

Привет, ребята и девчонки,

Я тоже столкнулся с этой проблемой некоторое время назад, и мы обсуждали ее здесь: https://www.mql5.com/en/forum/1642.

Мой советник имеет стратегию только для открытых цен, и я хотел придерживаться ее, чтобы сэкономить время во время бэктестинга (очевидно).

Решение, которое я придумал, заключается в следующем:

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

Я вырежу и вставлю важные части кода из моего советника ниже здесь. Надеюсь, это будет вам полезно!

Ура!


// this is from the Trader base class

    // manage a new tick and predetermines whether a new bar hast started
    virtual void 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 performed
    void 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 orders
        double v0 = inSameBar ? sBuf[0] : sBuf[1];  // determine the actual 'previous' bar
        double v1 = inSameBar ? sBuf[1] : sBuf[2];  // determine the actual 'current' bar
        
        if (_volume > 0) {
            if (crossesZeroDownwards(v0, v1)) {  // cross down?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        } else if (_volume < 0) {
            if (crossesZeroUpwards(v0, v1)) {  // cross up?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        }

        ...
Tick generation - Open bar only
  • www.mql5.com
The whole list printed shows also many discrepancies in times.
 

Только что сам столкнулся с этой проблемой. Вы уже догадались, пытаюсь перейти с JForex на MQL5! Я уже начинаю жалеть, что не потрудился, хотя, полагаю, продление срока помогает :)

Похоже, что MetaQuotes до сих пор не исправила это.

MT5 forex, похоже, не поддерживает DOM.

isNewBar мне не поможет.

Такое положение дел кажется нелепым.

Кто-нибудь знает, изменилось ли что-нибудь в MT5 относительно этой проблемы?

Кто-нибудь знает решение, которое работает для мультивалютной стратегии, которая ожидает, что ей будут скармливать тики?

Ваш в разочаровании,

Джим

 
TradingGurus:

Только что сам столкнулся с этой проблемой. Вы уже догадались, пытаюсь перейти с JForex на MQL5! Я уже начинаю жалеть, что не потрудился, хотя, полагаю, продление срока помогает :)

Похоже, что MetaQuotes до сих пор не исправила это.

MT5 forex, похоже, не поддерживает DOM.

isNewBar мне не поможет.

Такое положение дел кажется нелепым.

Кто-нибудь знает, изменилось ли что-нибудь в MT5 относительно этой проблемы?

Кто-нибудь знает решение, которое работает для мультивалютной стратегии, которая ожидает, что ей будут скармливать тики?

Ваш в разочаровании,

Джим


Попробуйте использовать OnTimer() с 1-секундным таймером вместо OnTick().
 

Привет, Энивид,

enivid:
Попробуйте использовать OnTimer() с 1-секундным таймером вместо OnTick().

Спасибо за предложение. Ваше решение работает гораздо лучше, чем любое другое, которое я пробовал, конечно, для наших требований.

Однако при проведении мультивалютных бэктестов на разных парах все равно получаются немного разные результаты.

Это не внушает особого доверия!

Теперь я пойду сжигать больше масла в полночь!

Будьте здоровы,

Джим

 
enivid:
Попробуйте использовать OnTimer() с 1-секундным таймером вместо OnTick().

TradingGurus:

Однако проведение мультивалютных бэктестов на разных парах все равно дает немного разные результаты.

Джим, я использую решение OnTimer с 1 секундой в своем советнике для конкурсного портфеля. Если ваша стратегия полагается на каждый тик, то да, вы получите разные результаты при использовании OnTimer и OnTick на одной валюте, поскольку возможно более одного тика в секунду. Я обнаружил, что обычно наибольшая разница возникает, когда "недостающий" тик создает новый максимум или минимум бара. Вы можете проверить максимум/минимум предыдущего бара и максимум/минимум текущего бара на наличие изменений и вставить их как "отсутствующий тик", когда они происходят, если, конечно, текущий тик не создал новый максимум/минимум бара.

Также помните, что MetaTrader Strategy Tester моделирует только тиковые данные. В зависимости от того, насколько чувствительна ваша стратегия к тиковому движению, эта симуляция может оказать значительное влияние на обратное тестирование по сравнению с прямым тестированием.

- Патрик

 
Привет Патрик,
Pix:

Если ваша стратегия полагается на каждый тик, то да, вы получите разные результаты при использовании OnTimer и OnTick на одной валюте, поскольку возможно более одного тика в секунду.

- Патрик


Это не совсем то, что я имел в виду. Наш (пока только потенциальный!) конкурсный советник торгует всеми 12 парами. Используя только OnTimer(), я получаю разные результаты бэктестов, если в тестере стратегий выбираю GBP/USD, а не EUR/USD, например.

Я слишком хорошо знаком с ограничениями MT4 при бэктестинге с использованием симулированных тиков. К сожалению, похоже, что MT5 не намного лучше!

Джим

 

Мы очень хотели перевести все это на тики по историческим причинам, но мы сдались. Просто не можем добиться последовательности.

Мы решили попробовать, и теперь работаем с минутными барами с помощью OnTimer() и isNewBar().

Наконец-то все стало выглядеть хоть немного разумно, а до дедлайна чемпионата еще 4 часа :)

Джим
 

Наконец-то мы представили наш советник, когда до окончания срока оставалось около 5 минут.

За плечами один бэктест, и никакой оптимизации.

Кто-нибудь может сказать мне, есть ли у него шанс быть одобренным?

Если да, то будет ли нам разрешено возиться с настройками входа в течение следующей недели или нет?

Джим

 
TradingGurus:

Наконец-то мы представили наш советник, когда до окончания срока оставалось около 5 минут.

За плечами один бэктест, и никакой оптимизации.

Кто-нибудь может сказать мне, есть ли у него шанс быть одобренным?

Если да, то будет ли нам разрешено возиться с настройками входа в течение следующей недели или нет?

Джим

Удачи, Джим!

Если ваш советник правильно оттестирован в период с 2010.01.01 по 2010.08.01 без каких-либо ошибок(торговые ошибки и т.д.) и приносит прибыль, то вы, скорее всего, получите одобрение, при условии, что ваша личная информация также верна. Однако с этого момента вы не сможете ничего изменить, включая настройки (входные параметры).

Надеюсь увидеть вашего бота в действии!

- Патрик