Amibroker: несколько способов сварить странную систему и еще один рецепт

Weird Systems Cookbook

Адептам for-loop тестирования посвящается :)

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

1. Системы входящие лимитными ордерами
Самая любимая тема. Идея проста как 2 пальца, берем некое среднее, откладываем от него вверх и вниз какой-то канал. Продаем когда цена (High) выше, по цене канала, и покупаем когда цена (Low) ниже нижней границы. Классический пример BollingerBands. В реале предполагается, что эта система работает лимитниками. Амиброкер эту стратегию прекрасно может оттестировать.

Но в риал-тайме вы никогда не получите сделки 1 в 1 с моделью, по следующим причинам:
– Нет гарантий исполнения лимитов (Амиброкер будет считать что 100% сделок исполнены)
– Вам на 100% будут наливать в худших сценариях, и часть самых нажористых сделок будет уходить
– Что делать если волатильность свечи такая, что H и L коснулись обеих границ канала?

2. Система торгующая на одном и том же баре
Что может быть проще: вошли по Open свечи, вышли по Close. Aх да, стопы не забудьте, на выходе грояль.
Один вопрос: а что первое срабатывает у этой weird системы стоп или профит? Ами не знает, я тоже :)

3. Система электросенс
Мои самые любимые грояли. Когда-то я входил на отрытии свечи, если RSI(20) превышал что-то. Все было хорошо, и миллиардный профит, и мечты о машине, квартире, и острове. Кроме риал тайма 😀 Только тогда мне было невдомек, что все встроенные индикаторы Ami используют Close для расчетов, тот самый Close который должен появиться после того самого Open на котором я открыл трейд.

Вы уже поняли, что векторные ништяки языка имеют в себе некоторые подводные камни – это издержки подхода. Есть event модель тестера, но там другие косяки, скорость тестирования на пару порядков ниже, и объем кода в 3-5 раз выше.

Anti-weird trading system

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

  1. Самое главное: Входите в сделку только по Close, весь анализ стройте на основе Close – это избавит от заглядывания в будущее, в том числе скрытого как у “системы электросенс” и тестер станет прямым! Это относится только к цене входа, конечно же, OHLCV – можно использовать в анализе, а не только Close
  2. Избегайте торговать на одном баре
  3. Избегайте ставить близкие стопы/тейки, Ами не знает что у свечи было первым High или Low. Иначе перейдите на более мелкий фрейм, вплоть до тиков.

Все вместе это выливается в следующий шаблон кода:

//
// Author: ubertrader
// 24.09.2012
// </code>

// П.1: Запретить выход на том же баре что и вход
//
SetOption( "AllowSameBarExit", False);
//
// Если вы входите по Close, эту опцию нужно ставить False,
// иначе если H или L удовлетворяют условию стопа, он у вас сработает.
// Это заглядывание в прошлое - другой тип weird систем :)
//
SetOption( "ActivateStopsImmediately", False);

//
// Обратный сигнал активирует выход из открытой позиции
// ЗАПРЕЩЕНО! В моей парадигме - это так.
SetOption( "ReverseSignalForcesExit", False);

//
// Отключает задержки входа выхода
// В нашем случае они не нужны
SetTradeDelays(0,0,0,0);

//
// Сбрасываем настройки всех стопов, которые установлены в свойствах тестера.
// Стопы/Тейки/трейлинги - делаем все в коде, ставить их через GUI идиотизм 1999 года выпуска!
ApplyStop(stopTypeLoss, stopModeDisable, 1);
ApplyStop(stopTypeNBar, stopModeDisable, 1);
ApplyStop(stopTypeTrailing, stopModeDisable, 1);
ApplyStop(stopTypeProfit, stopModeDisable, 1);

//
// SAMPLE NON-WEIRD SYSTEM CODE
// Пусть это будет RSI

Buy = RSI(30) &gt; 70; //Покупаем когда RSI выше 70
Sell = C &lt; MA(C, 20); //Продаем когда цена ниже средней

Short = Cover = 0; //нэту шортов
//BuyPrice = SellPrice = Close; // -- это по умолчанию задается в настройках как Close и желательно ничего не менять

//
// Правила в том виде как они записаны, генерируют десятки или даже сотни повторяющихся
// на каждом баре сигналов. Тестер конечно приведет это в норму, но я привык к тому,
// чтобы мои сигналы на графике совпадали с тестером 1 в 1
// Equity(1, 0) - расставляет все сигналы точно также как это делал бы тестер
// Более того эта функция считает стопы и их цену - все это можно вывести на график.
Equity(1, 0);

//
// Финт ушами!
// Эквивалентно Buy at next bar Open
// Да, посчитали по Close и в самом конце перенесли на Open!
// Это позволит нормально торговать эту систему в RT.
//
Short=Ref(Short,-1);
Cover=Ref(Cover,-1);
Buy=Ref(Buy,-1);
Sell=Ref(Sell,-1);
BuyPrice= O;
SellPrice = O;
ShortPrice= O;
CoverPrice = O;

//
// И последнее стопы!
// Стопы только после того как перенесли все на Open, иначе будут считаться неправильно!
//
ApplyStop(stopTypeNBar, stopModeBars, 90); // Этот стоп можно использовать и до "финта ушами"
ApplyStop(stopTypeProfit, stopModePoint, 1000, 1);
ApplyStop(stopTypeLoss, stopModePoint, 500, 1);

//Чтобы на графике отразились и стопы!
Equity(1,0);

//
// Последнее рисуем цену и стрелочки входов/выходов
// Аргумент "-8" в PlotShapes() для того чтобы стрелка четко указывала на уровень (это смещение в пикселях)
Plot(Close,"",colorBlack,styleCandle);

PlotShapes((Buy > 0) * shapeUpArrow, colorGreen, 0, BuyPrice, -8);
PlotShapes((Sell > 0) * shapeDownArrow, colorRed, 0, SellPrice, -8);
PlotShapes((Cover > 0) * shapeHollowUpArrow, colorGreen, 0, CoverPrice, -8);
PlotShapes((Short > 0) * shapeHollowDownArrow, colorRed, 0, ShortPrice, -8);
  • reply Евгений ,

    Добрый день!
    Пост очень помог вообще в понимании как и зачем строится код.
    Единственный вопрос – Тестер АФЛ не воспринимает данную строчку
    PlotShapes((Buy > 0) * shapeUpArrow, colorGreen, 0, BuyPrice, -8);
    Ругается на данный символ – &gt
    В итоге стрелочки входов и выходов не отображаются.
    Голову сломал в чем синтаксическая ошибка…
    Буду благодарен если подскажите.
    Спасибо

    • reply ubertrader ,

      Извиняюсь за долгий ответ, > – это знак “>” в HTML кодировке, это ошибка движка блога, или случилось из-за переноса поста.

    • reply Евгений ,

      Скорее даже не на символ, а на точку с запятой ;
      Говорит что не обоснованно.

      Leave a comment