Финансовая лаборатория

Биржевая торговля и торговые роботы


При создании торговых стратегий мы должны входить в рынок либо выходить из позиции используя не только простейшие торговые приказы "по рынку", либо "в момент закрытия", но и более продвинутые торговые ордера, которые выполняются либо не выполняются в зависимости от того, каких уровней достигла цена. В программе Wealth-Lab, как и в реальной торговли такие приказы могут моделировать AtStop и AtLimit ордера.

Приказы 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 размещает, меняет, или же продолжает удерживать ордера на открытие позиции на выбранных Вами барах. В результате отложенные ордера в торговых стратегиях являются стоп и лимитными приказами, которые постоянно повторяются до тех пор, пока:

  1. Приказ исполнится;
  2. Приказ будет логически передвинут;

Другими словами, отложенные (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 года на часовых графиках мы получим довольно красивую картинку эквити.

График капитала для прорывной стратегии

График Equity

Эта картинка свидетельствует о получении прибыли (даже с учетом комиссии). Так что берите на заметку - здесь есть над чем поработать. Можно на этой основе создать полноценную торговую стратегию.

Как: отображать на графике стоп-приказы

Несмотря на то, что предыдущий пример содержит прекрасную демонстрацию отображения на графике стоп ордеров с помощью метода 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()

Когда Вы будете анализировать результаты выполнения кода, наверняка обратите внимание на то, что стоп-приказы отображаются на графике не точно по линии скользящей средней. Это происходит потому, что метод PlotStops() показывает Вам бар и цену на которой стоп (или лимитный) ордер являются активными. Скользящая средняя рассчитывается и отображается на графике на текущем баре, но рассчитанное значение используется в качестве цены стоп-приказа только на следующем баре, т.е. на баре с номером (bar + 1).

Следующий пост расскажет Вам о том, как планировать выходы, зависящие от времени удержания позиции. Не забывайте подписываться на новые посты по RSS.

Комментариев: 2

  1. [...] Использование при программировании торговых стратеги…  Главная  Организация торгового цикла в [...]

Оставить комментарий