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

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

Торговая стратегия предназначена для того, чтобы генерировать торговые сигналы. Если сначала эти торговые сигналы мы используем для тестирования торговой стратегии и подбора оптимальных параметров, то когда стратегия уже "заточена" нужным образом - приходит пора использовать сигналы этой стратегии в реальной торговле.

Программа Wealth-Lab поможет нам и в этом. Она вовремя сообщит нам о том, что пришло время отдавать приказ брокеру. Такие информационные сообщения называются алертами. Именно об алертах сегодня и пойдет речь.

Алерты

Торговые сигналы можно использовать двумя способами:

  1. Для создания теоретических трейдов для бектестинга
  2. Для генерации алертов чтобы отдавать торговые приказы. Эти приказы должны размещаться на баре идущем сразу же за последним баром графика.

Алерты это то, что делает возможным для Вас торговлю Вашей стратегии в реальной жизни.
Алерты являются приказами, которые Вы размещаете на ближайшем баре после их появления (это споаведливо для любых таймфреймов - для интрадея, дневок, неделек и т.п.).

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

С другой стороны, если Вы торгуете интрадей, то Вы должны будете отдать приказ немедленно - сразу же после получения алерта.

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

Во время последней итерации в торговом цикле, когда номер текущего бара равен (Bars.Count - 1) такой торговый сигнал, как BuyAtMarket (bar + 1) обязательно создаст новый алерт, поскольку номер бара, который передается в данный торговый сигнал больше чем самый последний бар графика с номером (Bars.Count - 1).

Внимание!
Никогда не передавайте в торговый сигнал номер бара (bar + n) в том случае, если n > 1. НИКОГДА!
В торговые сигналы всегда нужно передавать только номер (bar + 1). Здесь может быть только одно небольшое исключение - когда сделка может быть совершена та текущем баре - при использовании торгового приказа AtClose. Для дополнительной информации смотрите "Алерты для приказов AtClose"

Мы уже использовали алерты для создания скрининговой системы. Для получения большего количества примеров - внимательно просмотрите некоторые из стратегий, которые предустановлены в программе Wealth-Lab.

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

Как: сохранить алерты стратегии в файл

Хоть большинство стратегий в основном генерируют только один алерт на один финансовый инструмент при использовании однопозиционную логику, полезно знать, что Wealth-Lab дает возможность работать с массивом алертов. Внутри этого массива алертов Вы можете создать цикл, пробежавшись по всем алертам, которые генерируются стратегией.

Приведенный в примере метод SaveAlerts() может быть повторно использован Вами для сохранения алертов в текстовый файл, находящийся в указанном месте на диске.

Пример (как выполнить пример приведенного кода)...


/* Должен использоваться в режиме "Raw Profit" для создания алерта для соответствующих финансовых инструментов (размер) */

//создаем метод, позволяющий сохранять алерты в файл (как аргумент метода - путь куда нужно записать данный файл).
public void SaveAlerts(string path)
{
   string dateFormat = "yyyyMMdd";

   if (Bars.IsIntraday) dateFormat = "yyyyMMdd HHmm";
   if( Alerts.Count > 0 ) //если существует хотя бы один алерт
   {
      for( int i = 0; i < Alerts.Count; i++ ) //пробегаемся по всей коллекции алертов

      {
         Alert a = Alerts[i];  //присваиваем ссылку на алерт переменной "а"

         string s = a.AlertDate.ToString(dateFormat); //присваиваем текстовой переменной "s" значение даты алерта в нужном формает

         s = s + ";" + a.AlertType.ToString(); //добавляем в конец предыдущей записи тип алерта
         s = s + ";" + a.Shares.ToString();  // добавляем в конец количество лотов (всегда равен единице в режиме "Portfolio Simulation")
         s = s + ";" + a.Symbol; //добавляем в конец тикер
         s = s + ";" + a.OrderType.ToString(); //добавляем в конец тип торгового приказа

         if (a.OrderType == OrderType.Limit || a.OrderType == OrderType.Stop) //если это стоп-ордер или лимит-ордер - добавляем цену приказа
            s = s + ";" + a.Price.ToString();
         else //если не стоп и не лимит ордер, то добавляем базовую цену
            s = s + ";" + a.BasisPrice.ToString();
         s = s + ";" + a.SignalName + "\n"; //добавляем в конец имя сигнала.

         System.IO.TextWriter tw = new System.IO.StreamWriter(path, true); //показываем, куда записывать файл
         tw.Write(s); //записываем файл
         tw.Close();  //закрываем сущность, которая записывает файл
      }
   }
}

protected override void Execute()

{

   // Генерируем 5 алертов, каждый на 1% ниже чем предыдущий.

   int bar = Bars.Count - 1;
   int pct = 99;

   for(int numAlerts = 1; numAlerts <= 5; numAlerts++)

      BuyAtLimit(bar + 1, Close[bar] * (pct - numAlerts)/100, numAlerts.ToString());

   // Вызываем метод SaveAlerts() после главного торгового цикла

   SaveAlerts(@"C:\Alerts.txt"); //показываем в качестве аргумента путь, куда текст должен быть записан (имя файла)

Как: создать алерт для торгового сигнала AtClose

Стратегии, использующие приказы AtClose обычно намереваются открыть либо закрыть позицию по цене закрытия текущего бра, т.е. сразу после обработки. В результате, Вы обычно передаете торговому сигналу AtClose не бар с номером (bar + 1), как это делается во всех прочих случаях, а текущий бар с номером (bar). Поэтому Велс Лаб не в состоянии сообщить Вам о необходимости разместить торговый приказ, т.е. не в состоянии сгенерировать алерт.

Теоретически Wealth-Lab без проблем может совершить сделку, однако на практике совершенно невозможно обработать данные текущего бара, который только находится в процессе формирования и сразу после полного формирования текущего бара выполнить сделку на том же самом баре.

Однако, если Вы можете получить доступ к данным еще не сформировавшегося бара (смотри инструкцию Wealth-Lab User Guide раздел Yahoo! Data Provider), то наверняка возможно обновить дневной бар прямо перед закрытием торговой сессии для получения предварительной оценки цены закрытия. Затем, используя полученную "прикидочную" цену закрытия, использовать ее для генерации алерта и совершения сделки.

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

Именно такой подход демонстрируется в примере, приведенном ниже.

Пример (как выполнить пример приведенного кода)...

protected override void Execute()
{
   SMA smaFast = new SMA(Close, 8, "Fast");
   SMA smaSlow = new SMA(Close, 16, "Slow");
   PlotSeries(PricePane, smaFast, Color.Green, LineStyle.Solid, 1);
   PlotSeries(PricePane, smaSlow, Color.Red, LineStyle.Solid, 1);

   for(int bar = 16; bar < Bars.Count; bar++)
   {
      if (IsLastPositionActive)
      {
         Position p = LastPosition;
         if (CrossUnder(bar, smaFast, smaSlow))
         {

         /* При выполнении условий на выход из позиции: */

            if (bar == Bars.Count - 1) //Если текущий бар является последним баром, то генерируется алерт с типом приказа AtMarket

               SellAtMarket(bar+1, p, "Alert");

            else //Если текущий бар не является последним, то генерируется обычный приказ AtClose на текущем баре

               SellAtClose(bar, p, "AtClose");
         }
      }

      else
      {
         if (CrossOver(bar, smaFast, smaSlow))
            BuyAtMarket(bar + 1);
      }
   }
}

При торговле внутри дня разница между приказами AtClose и AtMarket составляет всего одну сделку. Поскольку торговые сигналы AtClose при торговле внутри дня не могут быть реализованы по практическим соображениям, они должны использоваться очень редко (а лучше вообще никогда не использоваться).

При торговле внутри дня нужно использовать сигналы AtMarket. Исключением может быть только использование сигналов AtClose для закрытия позиции в конце торговой сессии. Реализовать такие сигналы можно тем же самым способом, что и для дневного таймфрейма (пример мы разбирали чуть выше).

Итак, сегодня мы рассмотрели как в программе Wealth-Lab организована работа с алертами. Разобравшись с алертами мы сделали еще один решительный шаг к полной автоматизации биржевой торговли. Однако прежде чем начинать торговать нужно изучить еще несколько вопросов. В следующий раз расскажу Вам о том, как можно проводить анализ нескольких таймфреймов одновременно. Не забывайте подписываться на новые посты по RSS.

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

  1. [...] Алерт – это торговый сигнал, который сигнализирует о необходимости отправить торговый приказ указанного типа в систему. [...]

  2. [...] в монитор стратегий, ее сигналы даже не нужно  превращать в алерты.   Можно указывать там стратегию "как есть", т.е. вообще [...]

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