При создании торговых стратегий мы должны входить в рынок либо выходить из позиции используя не только простейшие торговые приказы "по рынку", либо "в момент закрытия", но и более продвинутые торговые ордера, которые выполняются либо не выполняются в зависимости от того, каких уровней достигла цена. В программе 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()
Когда Вы будете анализировать результаты выполнения кода, наверняка обратите внимание на то, что стоп-приказы отображаются на графике не точно по линии скользящей средней. Это происходит потому, что метод PlotStops() показывает Вам бар и цену на которой стоп (или лимитный) ордер являются активными. Скользящая средняя рассчитывается и отображается на графике на текущем баре, но рассчитанное значение используется в качестве цены стоп-приказа только на следующем баре, т.е. на баре с номером (bar + 1).
Следующий пост расскажет Вам о том, как планировать выходы, зависящие от времени удержания позиции. Не забывайте подписываться на новые посты по RSS.







Новые посты по Email
Новые посты по RSS
Комментарии по RSS
Следим на Twitter
[...] 68. Как разместить лимитный или стоп приказ на покупку при… [...]
[...] Использование при программировании торговых стратеги… Главная Организация торгового цикла в [...]