Когда трейдер строит сложную стратегию - ему не всегда хватает возможностей шаблона однопозиционной стратегии. Ведь действительно иногда хочется использовать доливки либо пирамидинг. При этом вход в следующую позицию может зависеть от того, есть ли уже хотя бы одна позиция. Всем этим можно управлять с помощью программирования в программе Wealth-Lab. Такие стратегии, которые используют более одной позиции одновременно называются мультипозиционными, либо многопозиционными.
До сих пор мы рассматривали только такие примеры, в которых схема построения кода стратегии гарантировала, что одновременно удерживается не более одной позиции в единицу времени. Многопозиционные стратегии (MP-Strategies) сконструированы таким образом, чтобы иметь возможность управлять одной или более позициями одновременно. К примеру, стратегия, которая пирамидит позиции (делает дополнительные покупки либо дополнительные продажи) на одном финансовом инструменте должна управлять каждой новой позицией отдельно от других.
Хоть Вы и можете использовать метод SplitPosition() для того, чтобы разделить существующую позицию на две части, в настоящее время невозможно "соединить" множество позиций в одну.
Советы по управлению мультипозицией
WealthScript содержит некоторое количество свойств, которые помогут Вам при построении торговых стратегий работать с информацией о позициях. Это такие свойства, как:
- Positions.Count - дает информацию об общем количестве позиций, которые были созданы;
- ActivePositios.Count - возвращает общее количество позиций, которые активны на текущий момент;
Каждая позиция, которая добавляется в ряд позиций имеет свой собственный набор свойств, которые содержат информацию о специфике позиции:
- .Active - показывает является ли позиция в текущий момент активной. Возможны два состояния: "false" - позиция неактивна или "true" - позиция активна.
- .BarsHeld - показывает на протяжении какого количества баров существует позиция.
- .EntryPrice - отражает цену входа в позицию;
- .EntryBar - содержит номер бара, на котором произошел вход в позицию;
- .ExitBar - содержит номер бара, на котором произошел выход из позиции.
Для получения дополнительной информации обратитесь к инструкции QuikRef (F11) - выбрав раздел Position Object.
Когда Вы работаете с мультипозициями, обычно Вы должны внутри Вашего главного торгового цикла организовать второй цикл, в котором обрабатывается каждая активная позиция для определения того, должна ли она быть закрыта. Внимательно изучите как использовать ActivePositions.
Однако, Если логика стратегии предусматривает необходимость закрытия всех активных позиций одновременно, самым удобным способом осуществить это будет использования конструкции Position.AllPositions.
Заметка для программистов:
- Располагайте код, отвечающий за логику выхода из позиции перед кодированием правил входа в позицию. Это делается для того, чтобы предотвратить выход из позиции на том же самом баре, где произошел вход в позицию, если на этом баре срабатывает и логика входа и логика выхода.
- Использование логики LastPosition (особенно использование свойства IsLastPositionActive) обычно является ошибочным в многопозиционных стратегиях. Вы можете нечаянно закрыть позицию, открытую последней, оставив при этом без управления позиции, которые были открыты раньше.
Шаблон кода мультипозиционной стратегии в Wealth-Lab
В многопозиционной стратегии позиции обычно открываются на разных барах но для одного и того же финансового инструмента. В результате логика входов и логика выходов не может быть взаимоисключающей, как это принято в однопозиционных стратегиях. Именно из-за этого Вы должны очень внимательно следить за тем, что код Вашей стратегии при проверке статуса активности позиции не смотрит на следующую ей логику выхода из позиции. Другими словами, убедитесь в том, что логика входа в позиции не зависит от выходов, которые осуществляются на следующем баре.
Пример (как выполнить пример приведенного кода)...
protected override void Execute() { // главный торговый цикл for(int bar = 20; bar < Bars.Count; bar++) { //логика выхода из позици - проверка каждой активной позиции for(int pos = ActivePositions.Count - 1; pos >= 0; pos--) { // присваиваем ссылку на позицию используя индекс массива Position p = ActivePositions[pos]; // Пример: обрабатываем текущую позицию "p" if (bar - p.EntryBar > 10) ExitAtMarket(bar + 1, p, "по-времени"); } /* здесь правила входа в позиции */ } }
Никогда не используйте оператор foreach с коллекцией ActivePositions при программировании логики выхода из позиций. Такое удаление объектов из коллекций (которой по-сути является ActivePositions) является ошибкой при программировании в C#. А при закрытии позиций происходит именно удаление объекта Position из коллекции ActivePositions. Самым правильным подходом в этом случае будет запустить цикл по коллекции, начиная с последнего объекта по направлению к первому. Именно такой порядок работы отображен в предыдущем примере.
Как: использовать коллекцию ActivePositions
Wealth-Lab Developer версии 6 дает возможность прямого доступа к массиву, в котором содержатся только активные позиции. Этот массив и назван соответственно - ActivePositions. Посмотреть пример использования этого массива можно чуть выше, когда приводился пример к теме кода шаблона мультипозиционной стратегии.
// присваиваем ссылку на позицию используя индекс массива
Position p = ActivePositions[pos];
Логика работы здесь такая: выбирается конкретная позиция из массива и присваивается ссылка на эту позицию переменной, с которой происходит дальнейшая работа.
Как: использовать ссылку на Position.AllPositions
Если Ваша мультипозиционная стратегия использует одинаковые правила выхода для всех активных позиций, то удобно использовать в качестве ссылки на позицию в торговом сигнале на выход ссылку Position.AllPositions. Такое упрощение позволит Вам отказаться от создания цикла для проверки условий выхода из каждой активной позиции по отдельности.
Пример (как выполнить пример приведенного кода)...
/* Эта торговая стратегия покупает когда RSI пересекает снизу вверх уровень 30 и продает все позиции когда RSI пересекает уровень 70 сверху вниз.*/ protected override void Execute() { RSI rsi = RSI.Series(Close, 14); for(int bar = 42; bar < Bars.Count; bar++) { //первым делом кодируем правила выхода из позиции if( ActivePositions.Count > 0 ) if( CrossUnder(bar, rsi, 70) ) SellAtMarket(bar + 1, Position.AllPositions); //обратите внимание на ссылку на выход из всех позиций if( CrossOver(bar, rsi, 30 ) ) BuyAtMarket(bar + 1); } }
Вот так будет выглядеть окно стратегии:
Как видите, позиция набирается частями и затем при срабатывании условия на выход происходит выход сразу всех позиций одновременно.
Как ни странно, но даже такая простая стратегия за последние 3 года для акции Газпрома показывает вполне приемлемый результат.
Правда, результат кардинально изменится, если включить в период тестирования кризисный 2008 год.
Стратегии с несколькими финансовыми инструментами
Принимая во внимание особенность Wealth-Lab проводить бэктестинг нескольких финансовых инструментов, в общем-то не требуется явно указывать прямо в коде стратегии сделки с конкретным финансовым инструментом. Другими словами, скрипт использует для тестирования первичный финансовый инструмент - тот, который мы выбираем для тестирования.
Однако, когда стратегия содержит торговые правила, зависящие от поведения цены другого финансового инструмента, Вы должны полностью контролировать моделирование с помощью осуществления сделок со вторым финансовым инструментом, используя при этом метод SetContext(). Примером таких более сложных стратегий являются стратегии арбитража, парного трейдинга, а также стратегии, предполагающие ротацию финансовых инструментов в зависимости от некоторых условий.
Для примера, Вы можете изучить код предустановленных в Велс Лаб стратегий с названием "RSI Rotation" или "Dogs of the Dow".
Сегодня мы вкратце поговорили о возможности использовать не только однопозиционной стратегии, но и стратегий, которые могут управлять несколькими позициями одновременно. Также мы вкратце рассмотрели стратегии, которые работают не с несколькими позициями одного финансового инструмента, а с несколькими финансовыми инструментами одновременно, т.е. мультисимвольным стратегиям (MS-Strategies). Изучив возможности, которые появляются здесь Вы сможете программировать даже такие сложные торговые стратегии.
Следующая наша статья будет посвящена рассказу о том, как можно с помощью программы Велс Лаб своевременно получать торговые сигналы. Как Вы догадались, речь пойдет об алертах. Не забывайте подписываться по RSS на новые статьи нашего блога.
Дмитрий.
Практически по Вашим статьям только уже сносно освоил создание простеньких стратегий в Wealth-Lab. За что Вам отдельная благодарность.
Есть вопрос, который меня мучает и я не могу найти ответа ни у Вас, ни у Чечета на сайте, ни вообще в русскоязычной части просторов интернета.
Подскажите из чисто практического опыта, наверняка уже знаете.
Не будут ли мешать две и более стратегий друг другу. В смысле при проверке на условие IsLastPositionActive по одной стратегии не будет ли проверены позиции по другой стратегии, где они уже могут быть открыты?
При чем вопрос как по одному и тому же инструменту, так и по разным.
Вячеслав, приветствую. Нет, несколько стратегий друг другу мешать не будут… Ведь Вы код пишите и проторговываете для одной стратегии. Соответственно и все позиции тоже относятся к одной стратегии. Если стратегия сложная – типа парного трейдинга и т.п. – тот тоже можно грамотно все сделать. Рекомендую Вам посмотреть наш курс “Построение сложных торговых систем”. Вот ссылка: http://finlab.webasyst.net/shop/product/wealth-lab-programmirovanie-kompleksnyh-torgovyh-sistem-za-3-dnja/
Спасибо большое, Дмитрий.
В целом я услышал подтверждение своим догадкам, основанным лишь на механизме работы того же тслаба. То есть стратегии работают в своем виртуальном пространстве и ничего о других позициях не знают за пределами своего скрипта. Ну, если только через глобальные поля не передавать.
Но все же в Велсе механизм обращения к нужной нам позиции не так удобен как в тслаб, особенно в многопозиционной стратегии. В тслабе я могу обращаться именно к той позиции, которая открыта по определенному именованному мною сигналу без перебора всех открытых позиций, что приходится делать в Wealth-lab при многопозиционной стратегии.
PS
Спасибо за курс, вряд ли я найду для себя там много нового, а вот вебинары Ваши с Игорем я частенько посещаю.