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

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


Главной особенностью 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.

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

  1. [...] Программирование торговых стратегий в программе Wealth-La…  Главная  Делаем индикаторы в Wealth-Lab своими [...]

  2. Artem_trader пишет:

    Начал изучать 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” и устанавливает максимальный риск за одну сделку (выражнный в процентах от наличного капитала). Затем в зависимости от удаленности Стопа от цены входа этот модуль рассчитывает количество контрактов, котрым можно торговать без риска превысить максимальный уровень риска.

  3. Artem_trader пишет:

    Пропал мой комментарий с решением проблемы…

    • Дмитрий Власов пишет:

      Артем, Ваш комментарий не нашел.. Хотя весь “Спам” перерыл – туда он не попадал. Так что,если не трудно, напшите, плз., еще раз.

  4. Artem_trader пишет:

    Сразу же после того, как написал первый комментарий, немного порылся на коммьюнити (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. В этот раз убрал все ссылки, посмотрим, пролезет ли коммент на этот раз.

  5. Artem_trader пишет:

    Как говорится, сформулировать проблему – значит, наполовину решить её. Кусок кода, который я привёл, надо было размещать в блоке “если есть активная позиция”, а то в моём примере объект Position не существует (не знаю, правильно ли я сказал, но смысл ясен).
    Перенёс в блок “если есть активная позиция”.
    Вообще, кстати говоря, мне кажется странным этот шаблон кода, когда сначала проверяются условия для закрытия позиции, а следом – условия для открытия. ИМХО, это изврат :)
    В этом случае, нам не получится открыть и закрыть позицию в течение одного бара, потому что после открытия позиции, счётчик баров увеличиться и мы будем иметь дело уже со следующим баром.

  6. Artem_trader пишет:

    Видимо, то, о чём я написал, мало кто использует, раз никто не высказался по описанной мною проблеме.
    Напомню как она звучит – “как управлять размером позиции из кода в зависимости от предполагаемого риска на капитал в КАЖДОЙ конкретной сделке”.
    Т.е. внимание! В одной сделке мы согласны рискнуть каким-то процентом от размера капитала, а в следующей сделке – уже другим процентом. Это определяется в зависимости от рыночных условий, не суть.
    PozSizer требует, чтобы мы заранее знали риск на капитал в любой сделке, которая может быть сгенерирована системой и просит указывать нас размер риска в %тах.
    Решить проблему можно было бы легко и просто, если бы в Wealth-Lab 6.0 присутствовала возможность определения размера капитала в каждом произвольном баре, и эту цифру можно было сохранить в переменной:
    ActualEquity = Equity(bar)

    В 6й версии такой возможности не оказалось, а PozSizer несмотря на его гибкость, не покрывает все потребности по управлению размером позиции.
    Таким образом, я пришёл к тому, что на основе данных по каждой сделке можно симулировать приращение капитала, сохраняя в произвольной переменной эти данные.

    В коде это выглядит так:
    if (IsLastPositionActive)
    EquitySize = EquitySize+LastActivePosition.NetProfitAsOfBar( bar );

    Способ вполне работает, однако, сейчас конечная цифра эквити у Тестера и у меня внутри кода различаются :)
    Не существенно, конечно, но неприятно :) Комиссии убраны, в чём может быть дело?

    • Graf пишет:

      Artem_trader
      Привет!
      Дружище, расскажи, получилось сделать то, что ты задумал?
      Я тоже хочу сделать стратегию, в которой риск на сделку (размер позиции) зависит от состояния equity.
      Шестая версия дает возможность сделать это стандартными средствами на портфеле или нет?
      А придуманный тобой способ сработал?

      • Артём пишет:

        Graf,
        Сорри, вопрос только сейчас увидел, когда снова погрузиля в решение этого вопроса. Мне так его и не удалось решить. Проблема звучит так: КАК ПОЛУЧИТЬ ДОСТУП К ДАННЫМ ПО КАПИТАЛУ НА ЛЮБОЙ МОМНТ ВРЕМЕНИ (например, получить, какой был эквити 10 дне назад).

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

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