Секреты TSLab | Торговые роботы | События
18 Авг

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

В предыдущей статье мы рассмотрели самый плохой и не правильный способ запроса открытых позиций. Использовать его в создании торговых алгоритмов категорически НЕ рекомендуется. Как и было обещано, в этой статье разберем способ который работает в большинстве случаев и может быть использован для написания скриптов с помощью TSLab API. Все приводимые выкладки справедливы для версии TSLab 1.2.xx и совершенно не обязательно будут актуальны для версии 1.3.хх

3 способа, как запросить у TSLab открытые позиции.

2. почти ПРАВИЛЬНЫЙ способ

Этот способ запроса позиций существует еще с версии 1.1 и тоже устарел, но может быть использован в работе, так как в некоторых случаях может принести увеличение скорости работы. В статье “Тормозят скрипты TSLab? Ускоряемся” я разбирал данный вопрос.

    // Возвращает последнюю активную позицию для заданного сигнала или null
    IPosition GetLastActiveForSignal(string signalName);

    // Последняя позиция в списке для заданного сигнала открытия или null
    IPosition GetLastForSignal(string signalName);

    // Последняя позиция в списке для заданного сигнала закрытия или null
    IPosition GetLastForCloseSignal(string signalName);

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

using TSLab.Script;
using TSLab.Script.Handlers;

namespace test.Статьи
{
    public class PositionGet2 : IExternalScript
    {
        public void Execute(IContext ctx, ISecurity sec)
        {
            for (int i = 11; i < ctx.BarsCount; i++)
            {
                var le = sec.Positions.GetLastActiveForSignal("LE");
                if (le == null)
                {
                    if (i % 5 == 0)
                        sec.Positions.BuyAtMarket(i+1, 1, "LE");
                }
                else
                {
                    if (sec.Bars[i].IsWhite() && sec.Bars[i-1].IsWhite())
                        le.CloseAtMarket(i+1, "LXP");

                    if (sec.Bars[i].IsBlack() && sec.Bars[i-1].IsBlack())
                        le.CloseAtMarket(i + 1, "LXS");
                }
            }
        }
    }
}

В режиме лаборатории скрипт работает нормально и генерит картинку не отличимую от таковой из предыдущей статьи:

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

Рисунок 1. Работа скрипта в лаборатории.

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

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

Рисунок 2. Работа скрипта в режиме агента.

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

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

Рисунок 3. Лог скрипта.

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

using RusAlgo.Helper;
using TSLab.Script;
using TSLab.Script.Handlers;

namespace test.Статьи
{
    public class PositionGet3 : IExternalScript
    {
        public void Execute(IContext ctx, ISecurity sec)
        {
            var center = new double[ctx.BarsCount];
            center[0] = sec.ClosePrices[0];

            for (int i = 1; i < ctx.BarsCount; i++)
            {
                // найдем послед закрытую позицию
                var lx = sec.Positions.GetLastForCloseSignal("LX");
                var sx = sec.Positions.GetLastForCloseSignal("SX");
                var a = new[] {lx, sx}.Where(p => p != null);
                if (a.Any())
                {
                    var b = Max(a, p => p.ExitBarNum);
                    center[i] = b.ExitPrice;
                }
                else
                {
                    center[i] = center[i - 1];
                }

                var le = sec.Positions.GetLastActiveForSignal("LE");
                if (le == null)
                {
                    sec.Positions.BuyAtPrice(i + 1, 1, center[i] * 0.9985, "LE");
                }
                else
                {
                    if (i - le.EntryBarNum > 5)
                        le.CloseAtMarket(i+1, "LX");
                }

                var se = sec.Positions.GetLastActiveForSignal("SE");
                if (se == null)
                {
                    sec.Positions.SellAtPrice(i + 1, 1, center[i] * 1.0015, "SE");
                }
                else
                {
                    if (i - se.EntryBarNum > 5)
                        se.CloseAtMarket(i + 1, "SX");
                }
            }

            var pane = ctx.First;
            var gl = pane.AddList("center", center, ListStyles.LINE, new Color(), LineStyles.SOLID, PaneSides.RIGHT);
            gl.Thickness = 3;
        }
    }
}

Логика нахождения последней закрытой позиции немного усложнилась, но суть остается такой же. В лаборатории все получается очень здорово и красиво (как обычно)!

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

Рисунок 4. Результат в лаборатории.

Загоняем скрипт в реал и видим похожую картинку, но без входов и выходов. Куда делись входы/выходы? Есть такая особенность у TSLab, убирать закрытые позиции с графика если они были на истории, то есть виртуальные. В итоге, в самом скрипте к этим позициям мы можем обращаться, и по факту, толстая черная кривая об этом однозначно говорит, а на графике их не видим. Впрочем, все аналогично прошлой статье.
Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

Рисунок 5. Результат в агенте, без реальных позиций.

Но стоит нам войти в позицию на самом деле (на сей раз вход был совершен автоматически скриптом), как картинка кардинально меняется.

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

Рисунок 6. Результат в агенте, с открытой реальной позицией.

- Полный бред. Половина скрипта работает, а другая не работает. Почему не просто ровная линия как в прошлый раз? TSLab рвет мне мозг! – снова кричит наш воображаемый алготрейдер.

Дьявол как всегда в деталях. Если посмотреть на скрипт, мы видим что у нас разные сигналы на вход в лонг и шорт. Поэтому, если посмотреть на рисунок 4, можно заметить наличие только шортовых сделок в начале графика. Эти шортовые сделки TSLab и не убрал после входа в реальную лонговую сделку. Он ведь запрещает входить в виртуальную позицию только для тех сигналов, для которых есть реальные сделки. Все виртуальные лонговые сделки были выброшены и картинка приобрела тот вид как изображено на рисунке 6.

Все делается еще более запутанным после выхода из позиции и входа в реальную шортовую позицию.

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

Рисунок 7. Результат в агенте, с закрытой реальной позицией.

Теперь выброшены и виртуальные шортовые сделки. Видим линию на уровне последней закрытой реальной лонговой позиции.

После закрытия шорта картинка станет еще более веселой. Я даже не берусь пояснить почему происходит именно так. Просто факт на лицо.

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

Рисунок 8. Результат в агенте, через некоторое время.

- Опять гонево TSLab-а! Да тут вообще невозможно разобраться ни в чем! – в очередной раз восклицает наш выдуманный персонаж.

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

Еще через 10 минут картинка становится совсем интригующей.

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

Рисунок 9. Результат в агенте, с закрытой реальной позицией после непродолжительной торговли.

Что за загогулина возникает в начале графика не ясно. Но она возникает. И рисует ее скрипт, совершенно адекватно работающий на истории и показывающий красивую, радующую глаз картину.

плюсы

Есть ли плюсы у данного способа запрашивать у TSLab открытые позиции? Можно парочку наскрести:

  • по сравнению с правильным способом, данный дает прирост в скорости
  • по сравнению с НЕ правильным способом разрешает работать с отдельными сигналами

минусы

Минусы похожи на минусы НЕ правильного способа:

  • устарел и не рекомендуется к использованию разработчиками TSLab
  • часто создает проблемы в реальных торгах
  • при работе заглядывает в будущее при запросе позиций, что недопустимо

 

Вывод

Использовать в своих скрипта такой способ запрашивать у TSLab открытые позиции решать Вам. Я могу только порекомендовать НЕ использовать. Уж слишком много тикетов упало на меня по этой части и во всех одно и то же. Скрипт в реале работает криво.

 

PS: в следующей статье, наконец, разберем ПРАВИЛЬНЫЙ способ запроса позиций. Вопросы? Задавайте их в комментариях!


comments powered by HyperComments

ra81
2014-09-14 17:48:51
Траблу с таким способом схватил товарищ по тикету UBA-797-88015 http://support.tslab.ru/staff/index.php?/Tickets/Ticket/View/7708/mytickets/-1/-1/-1
Дима
2016-03-17 20:11:12
Спасибо за статьи продвигает
Диана
2017-01-02 10:51:02
Казино Вулкан раздают деньги сегодня http://cenforce100.ru/casino-vulkan.php
6
Ноя
2017

Доверительное управление. Результаты в октябре 2017 года.

Доверительное управление. Результаты в октябре 2017 года. В октябре продолжался боковик на всех торгуемых активах. Российский… »

7
Окт
2017

Доверительное управление. Результаты в сентябре 2017 года.

Доверительное управление. Результаты в сентябре 2017 года. В сентябре на основных торгуемых активах (Ri и… »

8
Сен
2017

Доверительное управление. Результаты в августе 2017 года.

Доверительное управление. Результаты в августе 2017 года. Стратегия “Опционы” принесла в августе прибыль в размере… »

6
Авг
2017

Доверительное управление. Результаты в июле 2017 года.

Доверительное управление. Результаты в июле 2017 года. В июле индекс РТС вновь колебался в достаточно узком… »

14
Июл
2017

Доверительное управление. Результаты в июне 2017 года.

Доверительное управление. Результаты в июне 2017 года. Июнь индекс РТС вновь провел преимущественно в боковых движениях, а… »