При создании торговых стратегий мы должны входить в рынок либо выходить из позиции используя не только простейшие торговые приказы "по рынку", либо "в момент закрытия", но и более продвинутые торговые ордера, которые выполняются либо не выполняются в зависимости от того, каких уровней достигла цена. В программе Wealth-Lab, как и в реальной торговли такие приказы могут моделировать AtStop и AtLimit ордера.
Подумайте о том, как происходит процесс размещения стоп и лимитных ордеров когда Вы торгуете на реальном счете. После того, как произошло обновление данных на Ваших графиках, Вы определяете ту цену, по которой Вы захотите войти в позицию. И только после этого, на следующем баре Вы отдадите приказ о размещении ордеров на рынке.
Когда Вы программируете стратегии в программе Wealth-Lab процесс размещения ордеров протекает точно также, как и в реальной жизни:
- получаем данные на текущем баре;
- рассчитываем цены стоп и лимитных ордеров;
- размещаем соответствующие ордера на следующем баре, который по отношению к текущему бару имеет номер (bar + 1)
Как: разместить лимитный или стоп приказ на покупку при программировании стратегий в Wealth-Lab
Для того, чтобы смоделировать стоп или лимитные приказы на покупку, используйте специальные методы BuyAtStop() и BuyAtLimit(). Аналогично Вы сможете размещать такие же ордера для моделирования процесса закрытия длинной позиции, короткой продажи или выхода из короткой позиции.
Точно также, как это происходит и в реальной торговле, существует вероятность того, что эти ордера могут вообще не исполнится на указанном баре. Поэтому методы BuyAt и ShortAt возвращают одно из двух значений:
- Position (ссылку на позицию) - извещая нас о том, что ордер был исполнен и у нас появилась новая позиция
- null - который показывает нам, что сделка по данному ордеру не состоялась.
Следует отметить, что методы SellAt и CoverAt возвращают значения булева типа, которые отвечают на вопрос - "удалось ли закрыть позицию?":
- true - если удалось закрыть позицию
- false - если позицию закрыть не удалось.
Если возвратиться немного назад - к примеру, который тестирует является ли позиция открытой, при описании правил входа в позицию используется приказ BuyAtLimit(), который располагается на следующем баре с номером (bar + 1). Однако такой приказ размещается только в том случае, если цена закрытия пересекает снизу вверх скользящую среднюю по ценам закрытия.
Конечно же, в данной стратегии можно было бы использовать приказ BuyAtMarket() для гарантированного входа в позицию после того, как произойдет пересечения цены закрытия и скользящей средней. Однако лимитный ордер точно указывает максимальную цену, которую Вы готовы заплатить. Эта цена определяется ценой закрытия текущего бара.
Пример (как выполнить пример приведенного кода)...
else { if( CrossOver(bar, Close, SMA.Series(Close, Period)) ) BuyAtLimit(bar + 1, Close[bar]); }
Как: создать отложенные (GTC) ордера (приказы, действующие до отмены) при моделировании торговли в Велс Лаб
В реальности отложенные ордера создаются путем программного манипулирования стоп и лимитными ордерами. Wealth-Lab размещает, меняет, или же продолжает удерживать ордера на открытие позиции на выбранных Вами барах. В результате отложенные ордера в торговых стратегиях являются стоп и лимитными приказами, которые постоянно повторяются до тех пор, пока:
- Приказ исполнится;
- Приказ будет логически передвинут;
Другими словами, отложенные (GTC) ордера отменяются без вызова торгового сигнала.
Следующий пример является упрощенной версией стратегии прорыва канала Ван Тарпа. Вместо того, чтобы отображать на графике ряды данных с уровнями прорыва, здесь используется метод PlotStops(). Этот метод позволяет нам визуально идентифицировать те бары, где ордера размещаются, перемещаются или отменяются.
Пример (как выполнить пример приведенного кода)...
/*Упрощенная стратегия прорыва уровней ВанТарпа*/ protected override void Execute() { int longPer = 55; int shortPer = 21; DataSeries H55 = Highest.Series(High, longPer); DataSeries L55 = Lowest.Series(Low, longPer); DataSeries H21 = Highest.Series(High, shortPer); DataSeries L21 = Lowest.Series(Low, shortPer); PlotStops(); for (int bar = longPer; bar < Bars.Count; bar++) { if (IsLastPositionActive) { Position Pos = LastPosition; if (Pos.PositionType == PositionType.Long) SellAtStop(bar + 1, LastPosition, L21[bar]); else CoverAtStop(bar + 1, LastPosition, H21[bar]); } else { RiskStopLevel = L21[bar]; if (BuyAtStop(bar + 1, H55[bar]) == null) { RiskStopLevel = H21[bar]; ShortAtStop(bar + 1, L55[bar]); } } } }
Как Вы видите, этот код является полноценной торговой системой, правда здесь пока не используется оптимизация и все предельно просто. В результате выполнения этой торговой системы мы увидим на графике такую картину:
Обратите внимание на то, как работает метод PlotStops(). Там, где позиции не существует - стоп-приказы отображаются и сверху и снизу от текущей цены. Где есть позиция, там стоп приказ отображается только с одной стороны, выполняя функцию ограничения убытков.
Несмотря на то, что эта система разработана достаточно давно, для американского рынка акций и вообще не оптимизировалась, как ни странно, применяя ее к акциям Газпрома и проводя тест за последние 3 года на часовых графиках мы получим довольно красивую картинку эквити.
Эта картинка свидетельствует о получении прибыли (даже с учетом комиссии). Так что берите на заметку - здесь есть над чем поработать. Можно на этой основе создать полноценную торговую стратегию.
Как: отображать на графике стоп-приказы
Несмотря на то, что предыдущий пример содержит прекрасную демонстрацию отображения на графике стоп ордеров с помощью метода PlotStops(), давайте взглянем на это еще раз с другой стороны. Рассмотрим как можно использовать SMA (простую скользящую среднюю) для того, чтобы устанавливать стоп-приказы.
Пример (как выполнить пример приведенного кода)...
protected override void Execute() { const int Period = 14; PlotSeries(PricePane, SMA.Series(Close, Period), Color.Blue, LineStyle.Solid, 1); PlotStops(); for(int bar = Period; bar < Bars.Count; bar++) { if (IsLastPositionActive) { SellAtStop(bar + 1, LastPosition, SMA.Series(Close, Period)[bar]); } else { if( CrossOver(bar, Close, SMA.Series(Close, Period)) ) BuyAtLimit(bar + 1, Close[bar]); } } }
В результате выполнения примера Вы увидите такой график:
Когда Вы будете анализировать результаты выполнения кода, наверняка обратите внимание на то, что стоп-приказы отображаются на графике не точно по линии скользящей средней. Это происходит потому, что метод PlotStops() показывает Вам бар и цену на которой стоп (или лимитный) ордер являются активными. Скользящая средняя рассчитывается и отображается на графике на текущем баре, но рассчитанное значение используется в качестве цены стоп-приказа только на следующем баре, т.е. на баре с номером (bar + 1).
Следующий пост расскажет Вам о том, как планировать выходы, зависящие от времени удержания позиции. Не забывайте подписываться на новые посты по RSS.
[...] 68. Как разместить лимитный или стоп приказ на покупку при… [...]
[...] Использование при программировании торговых стратеги… Главная Организация торгового цикла в [...]