Главной особенностью Wealth-Lab является то, что используя язык C# и библиотеку WealthScript, Вы получаете возможность запрограммировать любые правила Вашей торговой системы. Всякий раз, когда Вы запускаете запрограммированную стратегию, Wealth-Lab отображает на графике все генерируемые сделки при помощи легко воспринимаемых стрелочек, обозначающих покупки и продажи.
В результате выполнения стратегии рассчитывается целый список показателей, отражающих эффективность стратегии. Также в вашем распоряжении появляется детализированный список всех сделок, которые были бы совершены, придерживайся Вы всех правил, которые Вы запрограммировали в стратегии.
Посмотрите повнимательнее настройки (доступны при нажатии F12) для того, чтобы увидеть дополнительные возможности отражения результатов выполнения стратегии (дополнительные визуализаторы).
Класс стратегий в программе Велс Лаб
В программе Wealth-Lab классы стратегий являются производными от класса WealthScript. Вы можете добавлять методы, процедуры, переменные, классы и т.п. в класс Вашей стратегии, но при этом класс с Вашей стратегией должен содержать метод Execute(), который является входной точкой для запуска каждой стратегии. И именно здесь программируется основная часть большинства стратегий.
Инсталлированный в Wealth-Lab шаблонный код стратегии показывает типичную структуру кода, применяемого для проектирования торговых стратегий.
Пример (как выполнить пример приведенного кода)...
<pre>/* Встроенный в Wealth-Lab шаблон кода стратеги */ using System; using System.Collections.Generic; using System.Text; using System.Drawing; using WealthLab; using WealthLab.Indicators; namespace WealthLab.Strategies { public class MyStrategy : WealthScript { protected override void Execute() //метод, который является "точкой входа" { for (int bar = 20; bar < Bars.Count; bar++) //запускаем цикл, просматривая каждый бар от начального до конечного { if (IsLastPositionActive) //Если существует активная позиция { //Здесь нужно запрограммировать правила выхода из позиции } else //если нет активных позиций { //Здесь нужно запрограммировать правила входа в позицию } } } } }
Вы можете изменить шаблонный код стратегии - написав свой собственный вариант и сохранив этот шаблон в виде кода стратегий по умолчанию (выбрав Edit > Set as Default Template Code).
Компиляция кода стратегий в программе Wealth-Lab
Класс Strategy, который Вы создаете чтобы описать все правила стратегий компилируется и создается когда Вы:
- Нажимаете на кнопку "Run the Strategy",
- Нажимаете на кнопку "Compile",
- Если Вы открываете нескомпилированную стратегию из проводника стратегий (Strategy Explorer),
- Когда окно стратегии восстанавливается вместе с рабочим пространством.
В результате компиляции стратегии все находящиеся в рамках класса переменные инициализируются только тогда, когда создается экземпляр класса стратегии.
Выполните стратегию, приведенную в примере нажав кнопку "Run the Strategy", нажав клавишу F5, или кликнув по любому финансовому инструменту.
Пример (как выполнить пример приведенного кода)...
using System; using WealthLab; namespace WealthLab.Strategies { public class StrategyTest : WealthScript { private int _scriptRunCountSinceCompile = 0; protected override void Execute() { _scriptRunCountSinceCompile++; PrintDebug("Runs since compile = " + _scriptRunCountSinceCompile); } } }
Последовательно выполняя указанную в данном примере стратегию (различными способами) Вы увидите, как меняется счетчик количества раз запуска стратегии.
Обращаем Ваше внимание на то, что переменная _scriptRunSinceCompile получает первоначальное значение равное нулю только после компиляции и только после этого сохраняет заданное значение при выполнении метода Execute().
Ограничения для кода стратегий в программе Wealth-Lab
Стратегии, базирующиеся на таких показателях, как Equity, Cash, или Drawdown
Следует запомнить, что архитектура программы Wealth-Lab Developer 6-й версии не позволяет создавать такие торговые стратегии, которые принимают решения о входе в сделку либо о выходе из нее опираясь на показатель Equity, который включает в себя величину Cash (наличных денег) и Drawdown (просадку).
Для того, чтобы получить информацию об определенном методе либо свойстве библиотеки WealthScript, которые используются в коде стратегии - выделите мышкой соответствующий метод либо свойство и нажмите кнопку F11, что позволит Вам обратиться к справочнику QuickRef (F11).
Стратегии с единственной позицией (однопозиционные стратегии), но со множественными условиями на вход
В особых случаях - только для двух режимов тестирования: "Raw Profit" и "Portfolio Simulation" в программе Wealth-Lab возможно не инициировать входной сигнал тогда, когда это ожидается. Для этого должны соблюдаться следующие условия:
1. Код стратегии придерживается однопозиционной логики, что значит в одно и тоже время может существовать только одна позиция для одного финансового инструмента;
2. В коде не прописываются правила управления величиной позиции;
3. Новый сигнал на вход в позицию по условию 1 должен находиться в коде стратегии раньше чем сигнал на выход из позиции по условию 2.,
Wealth-Lab всегда выполняет сделки, прописанные в стратегии в режиме "Raw Profit", поэтому первая сделка в ряду нескольких условий на вход всегда приводит к созданию позиции. Если эта позиция в дальнейшем отвергается (из-за правил управления величиной позиции либо вследствие недостаточности капитала для входа в позицию), то создание новой позиции (даже если выполняется какое-либо другое условие на вход в позицию) невозможно до тех пор, пока не произойдет выход из позиции (это справедливо только для однопозиционная логики). Это объясняется тем, что ветвь входа в позицию не начнет отрабатываться в коде программы пока не произойдет выход из позиции.
В качестве обобщенного примера представьте себе стратегию с однопозиционной логикой кода, которая всегда генерирует сигнал на покупку в каждый вторник или среду, а сигнал на выход из позиции генерируется в пятницу. Выполнение данной стратегии в режиме "Raw Profit" всегда будет приводить ко входу в позицию только во вторник, т.к. логика выхода из позиции предполагает совершение сделки только в пятницу. Соответственно, сделка в среду всегда будет пропускаться. Тестовый вход в позицию в среду никогда не осуществиться, даже если сделка во вторник будет отклонена из-за правил управления величиной позиции либо из-за недостаточности капитала.
Сегодняшняя обзорная часть, посвященная программированию торговых стратегий в программе Wealth-Lab завершена. В следующей статье подробно рассмотрим виды торговых сигналов, которые существуют в программе Велс Лаб. Не забывайте подписаться на новые посты по RSS.
[...] Программирование торговых стратегий в программе Wealth-La… Главная Делаем индикаторы в Wealth-Lab своими [...]
[...] [...]
Начал изучать 6й WealthLab и C# заодно. Не в последнюю очередь из-за того, что наткнулся на этот сайт. До этого 4 года работал с WLD 3.0
Наткнувшись на это, начинаю сомневаться в адекватности ТЕСТИРУЮЩЕГО софта:
“Следует запомнить, что архитектура программы Wealth-Lab Developer 6-й версии не позволяет создавать такие торговые стратегии, которые принимают решения о входе в сделку либо о выходе из нее опираясь на показатель Equity, который включает в себя величину Cash (наличных денег) и Drawdown (просадку).”
И это несмотря на то, что:
“Главной особенностью Wealth-Lab является то, что используя язык C# и библиотеку WealthScript, Вы получаете возможность запрограммировать любые правила Вашей торговой системы”
Ну ладно, вопрос такой:
Каким образом можно реализовать установку размера позиции с учётом размера капитала? Я до сих пор не верю, что такие элементарные вещи не могут быть реализованы в WLD 6.x. Я хотел получить новые возможности, а тут “вот оно чо” (с).
У меня к размеру капитала привязана величина стопа, которая каждый раз разная, т.е. для каждой следующей сделки величина стопа рассчитывается индивидуально. От величины стопа рассчитывается кол-во участвующих в сделке контрактов.
PosSizer хочет фиксированной величины стопа, т.е. не подходит. Внутри кода, получается, формулу для расчёта кол-ва контрактов с учётом указанных мною входных данных, создать не получится?
Может, это вопрос более написания дополнительных библиотек или чего-нибудь в этом духе? Не верю я в такой фейл
Артем, приветствую.
Конечно же в WEalth-Lab 6 можно эффективно управлять размером позиции. Особеностью этой программы является то, что размером позиции можно управлять как прямо внутри кода с помощью метода SetShareSize() (почитайе, к примеру здесь: http://finlab.copiny.com/question/details/id/50224) так и с помощью специальных модулей управления размером позици (PosSizer).
В Вашем распоряжении уже целая куча таких модлей для управления размером позиции в дефолтной версии. Кроме того, лицензионным пользователям можно скачать уже готовые модули управления размером позиции вот отсюда:
И конечно же, Вы можете написать свой собственный модуль управления размером позици, обладаю минимальными навыками работы в C#. Обо всем этом я буду рассказывать на своем авторском курсе про Wealth-Lab. И после этого вкратце выложу здесь на блоге.
А для того, чтобы рассчитать количество лотов (контрактов) для покупки (или продажи) в зависимости от риска на одну сделку, размера капитала и отдаленности Stop Loss – будет достаточно метода управения позицией, который называется “Max Percent Risk” и устанавливает максимальный риск за одну сделку (выражнный в процентах от наличного капитала). Затем в зависимости от удаленности Стопа от цены входа этот модуль рассчитывает количество контрактов, котрым можно торговать без риска превысить максимальный уровень риска.
Пропал мой комментарий с решением проблемы…
Артем, Ваш комментарий не нашел.. Хотя весь “Спам” перерыл – туда он не попадал. Так что,если не трудно, напшите, плз., еще раз.
Сразу же после того, как написал первый комментарий, немного порылся на коммьюнити (http://www.wealth-lab.com/Community/Forum/Default.aspx?id=vFcanP5D6YwLLKGFY5FyfA==). Сразу вопрос не в тему, но вдруг кто знает – как получить доступ в коммьюнити? Примеры кодов скрыты для незарегистрированных юзеров. Я регистрировался, получил подтверждение по почте, активировал аккаунт, но каждый раз при вводе логина получаю надпись “Username is logged”. Фрагменты обсуждений в коммьюнити, таким образом недоступны. Не знаю, с какого конца туда подступиться, пока забил на это, вернёмся к теме.
SetShareSize, естественно, мне знаком, пользуюсь на WLD 3, тут проблем нет.
Возможности PozSizer тоже понятны – они не дают динамически из кода управлять размером позиции, если, например, от сделки к сделке меняется % риска на капитал (типа, в одних рыночных условиях мы можем пойти на бОльший риск, чем в других). Кроме того, неплохо бы вынести этот параметр для оптимизации.
Так вот для этих целей и нужен механизм определения денежной позиции для произвольного бара в ходе тестирования.
Проблема решается путём самостоятельного симулирования кривой эквити. Т.е. вводим переменную, в которой храним сумму капитала, к которой, если у нас открыта позиция, по окончании каждого бара прибавляется чистая прибыль от удержания позиции по итогам этого отдельного бара. ДЛя этого используем метод .NetProfitAsOfBar() объекта Position (Я могу путаться в терминах, заранее сорри, только начинаю изучать ООП и C#).
Технически выглядит так:
if (!IsLastPositionActive)
{
EquitySize = EquitySize + LastActivePosition.NetProfitAsOfBar( bar );
Правда, справедливости ради, надо сказать, что у меня всё ещё не заработал этот механизм Выдает ошибку, но не на этапе компиляции, а Runtime:
“Runtume error: В экземпляре объекта не задана ссылка на объект.
в WealthLabCompile.GSV.Execute()”. Но, думаю, я в ближайшее время с этим разберусь, и вся схема в принципе, должна работать.
Дмитрий, спасибо за ресурс, так бы ещё долго не собрался учиться
P.S. В этот раз убрал все ссылки, посмотрим, пролезет ли коммент на этот раз.
Как говорится, сформулировать проблему – значит, наполовину решить её. Кусок кода, который я привёл, надо было размещать в блоке “если есть активная позиция”, а то в моём примере объект Position не существует (не знаю, правильно ли я сказал, но смысл ясен).
Перенёс в блок “если есть активная позиция”.
Вообще, кстати говоря, мне кажется странным этот шаблон кода, когда сначала проверяются условия для закрытия позиции, а следом – условия для открытия. ИМХО, это изврат
В этом случае, нам не получится открыть и закрыть позицию в течение одного бара, потому что после открытия позиции, счётчик баров увеличиться и мы будем иметь дело уже со следующим баром.
Видимо, то, о чём я написал, мало кто использует, раз никто не высказался по описанной мною проблеме.
Напомню как она звучит – “как управлять размером позиции из кода в зависимости от предполагаемого риска на капитал в КАЖДОЙ конкретной сделке”.
Т.е. внимание! В одной сделке мы согласны рискнуть каким-то процентом от размера капитала, а в следующей сделке – уже другим процентом. Это определяется в зависимости от рыночных условий, не суть.
PozSizer требует, чтобы мы заранее знали риск на капитал в любой сделке, которая может быть сгенерирована системой и просит указывать нас размер риска в %тах.
Решить проблему можно было бы легко и просто, если бы в Wealth-Lab 6.0 присутствовала возможность определения размера капитала в каждом произвольном баре, и эту цифру можно было сохранить в переменной:
ActualEquity = Equity(bar)
В 6й версии такой возможности не оказалось, а PozSizer несмотря на его гибкость, не покрывает все потребности по управлению размером позиции.
Таким образом, я пришёл к тому, что на основе данных по каждой сделке можно симулировать приращение капитала, сохраняя в произвольной переменной эти данные.
В коде это выглядит так:
if (IsLastPositionActive)
EquitySize = EquitySize+LastActivePosition.NetProfitAsOfBar( bar );
Способ вполне работает, однако, сейчас конечная цифра эквити у Тестера и у меня внутри кода различаются
Не существенно, конечно, но неприятно Комиссии убраны, в чём может быть дело?
Artem_trader
Привет!
Дружище, расскажи, получилось сделать то, что ты задумал?
Я тоже хочу сделать стратегию, в которой риск на сделку (размер позиции) зависит от состояния equity.
Шестая версия дает возможность сделать это стандартными средствами на портфеле или нет?
А придуманный тобой способ сработал?
Graf,
Сорри, вопрос только сейчас увидел, когда снова погрузиля в решение этого вопроса. Мне так его и не удалось решить. Проблема звучит так: КАК ПОЛУЧИТЬ ДОСТУП К ДАННЫМ ПО КАПИТАЛУ НА ЛЮБОЙ МОМНТ ВРЕМЕНИ (например, получить, какой был эквити 10 дне назад).
На сегодняшний день я привожу к выводу, что стандартными способами сделать это невозможно. Мой способ, который я предложил, не совпадаем с цифрой, которую выдает Wealth Lab. Сейчас пытаюсь разобраться, почему.
Артем