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

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

При написании любого алгоритма приходится работать с позициями. Нужно знать о наличии открытых позиции, чтобы не открывать их снова и снова. TSLab уже существует довольно давно и за это время он очень сильно видоизменился. Была версия 1.0, потом 1.1 и сейчас 1.2. В каждой из них был свой ПРАВИЛЬНЫЙ способ как запросить у tslab открытые позиции. Практика показывает, что не все понимают отличий между разными версиями и продолжают в новых версиях использовать устаревшие методики. В результате работа скриптов оказывается неожиданной для вашего депозита. Это, особенно в последнее время, наблюдается у перешедших на 1.2 с версии 1.1. Попробую перечислить различные доступные способы запроса открытых позиций, доступные через TSLab API , и расскажу об их плюсах и минусах.

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

1. самый старый способ

Он существует еще с самых первых версий программы и появился в результате копирования программы Wealth-Lab. Надеюсь, ни для кого не является секретом то, что TSLab начался как аналог Wealth-Lab для российского рынка. Отсюда и похожий подход, и похожее API. Метод запроса открытых позиций так же похож.

    // Последняя активная позиция в списке или null
    IPosition LastPositionActive { get; }

    // Последняя активная длинная позиция в списке или null
    IPosition LastLongPositionActive { get; }

    // Последняя короткая позиция в списке или null
    IPosition LastShortPositionActive { get; }

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

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

namespace test.Статьи
{
    public class PositionGet : IExternalScript
    {
        public void Execute(IContext ctx, ISecurity sec)
        {
            for (int i = 11; i < ctx.BarsCount; i++)
            {
                // запросим у tslab открытые позиции ЛОНГ
                var le = sec.Positions.LastLongPositionActive;
                if (le == null)
                {
                    if (i % 5 == 0)
                        sec.Positions.BuyAtMarket(i+1, 1, "LE");
                }
                else
                {
                    if (i-le.EntryBarNum > 3)
                        le.CloseAtMarket(i+1, "LX");
                }
            }
        }
    }
}

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

TSLab открытые позиции

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

В реальных торгах он будет рисовать нам следующее:

TSLab открытые позиции

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

Но самое интересное будет написано в логе скрипта, и на это стоит обратить внимание ОСОБО.

TSLab открытые позиции

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

Что это за попытка закрыть позицию на прошлых барах? Мы изобрели машину времени и закрываем позицию в прошлом  по выгодной цене? :). В 90% скриптов с использованием указанного способа запроса позиций вы будете получать подобные сообщения. Как дополнительная проблема, у вас будет раздуваться лог TSLab и место на диске будет заканчиваться достаточно быстро.

Суть проблемы в том, что после входа в реальную позиции, любой запрос последней позиции на любом баре всегда будет возвращать нашу РЕАЛЬНУЮ позицию. Ну а раз на баре 10 у нас уже есть позиции мы сразу пробуем ее закрывать и на баре 19 первая попытка таки происходит. Логично что TSLab такое пресекает и просто выдает сообщение о наших играх в машину времени. И каждый раз когда такое происходит выпадает новое сообщение о попытке закрыть позицию в прошлом. Забавная, в общем, ситуация :). Кроме сообщения, тут ничего криминального не наблюдается. Работать будет более-менее адекватно все.

Теперь еще один скрипт, с другой логикой:

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

namespace test.Статьи
{
    // для статьи  Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО!
    public class PositionGet1 : 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++)
            {
                // запросим у tslab закрытые позиции и вытащим цену
                center[i] = sec.Positions.LastPositionClosed != null 
                                ? sec.Positions.LastPositionClosed.ExitPrice 
                                : center[i-1];

                // запросим у tslab открытые позиции ЛОНГ
                var le = sec.Positions.LastLongPositionActive;
                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");
                }

                // запросим у tslab открытые позиции ШОРТ
                var se = sec.Positions.LastShortPositionActive;
                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 открытые позиции

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

Загоняем скрипт в реал и видим похожую картинку, но без входов и выходов. Куда делись входы/выходы? Есть такая особенность у TSLab, убирать закрытые позиции с графика если они были на истории, то есть виртуальные. В итоге, в самом скрипте к этим позициям мы можем обращаться, и по факту, толстая черная кривая об этом однозначно говорит, а на графике их не видим.
TSLab открытые позиции

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

Но стоит нам войти в позицию на самом деле (я это делаю руками через ордер с комментарием, при этом достаточно криво, указав для покупки сигнал SE), как картинка кардинально меняется.

TSLab открытые позиции

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

Куда все делось? Почему у нас просто ровная линия??? Шайтан!

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

TSLab открытые позиции

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

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

Но проблема, увы, не в программе, а в том, как мы написали скрипт. Мы написали его криво, и он работает криво.

Разберем рисунок 6. Почему на нем просто прямая линия, без изломов, которые должны быть? Суть проблемы в том, что как только мы вошли в реальную позицию на баре номер 200 (цифра взята из головы весьма субъективно), то TSLab ЗАПРЕЩАЕТ открывать позиции на истории раньше бара 200. Таким образом все виртуальные позиции ДО нашего реального входа из скрипта пропадают. А раз пропадают, то пропадают и выходы из позиции. Ну, а раз нет выходов то центральная линия тоже будет стоять на месте и изгибаться не будет. Вот такая штука :).

- Ну ладно, черт с ними с виртуальными позициями! – скажете вы. А что за бред происходит на рисунке 7? Это еще что за баг TSLab-а? Уже ни в какие ворота! Уйду на (сюда можно вставить название любой другой платформы)!

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

На закуску результат работы скрипта через некоторое время

http://i67.fastpic.ru/big/2014/0814/91/0857131cd67358593a08c75bd64c8191.jpeg

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

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

плюсы

Есть ли плюсы у данного способа запрашивать у TSLab открытые позиции? На мой взгляд их, объективно НЕТ. Но можно придумать несколько если постараться:

  • код получается простым
  • легко переходить с Wealth-Lab-а
  • позволяет много раз входить и выходить на одной свече (об этом в статье Вход и выход на одной свече)

минусы

Минусов навалом, и они перевешивают все возможные плюсы. Вот главные минусы:

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

 

Вывод

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

 

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


comments powered by HyperComments

Диана
2017-01-02 10:58:49
Казино Вулкан раздают деньги сегодня http://cenforce100.ru/casino-vulkan.php
14
Июл
2017

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

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

11
Июн
2017

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

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

7
Май
2017

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

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

2
Апр
2017

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

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

7
Мар
2017

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

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