Секреты TSLab | Торговые роботы | События
24 Июн

Индикаторы TSLab с общими параметрами.

Возможно, из заголовка данной статьи не слишком ясно о чем тут речь и следует немного пролить свет на проблему. Бывают случаи когда у нас несколько индикаторов TSLab имеют общие параметры, как это имеет место быть в FinInfo или RusAlgo.Storage.FinInfo . В этих двух наборах есть необходимость указывать путь к файлам с сохраненной информацией в качестве параметра кубиков. В “FinInfo” используется способ “в лоб”, когда мы в каждом блоке прописываем путь к файлам с данными. Это чревато ошибками. В одном из блоков забыли указать правильный путь и у вас все смешается. Одни блоки будут использовать одни данные, а другие блоки будут работать по другим данным. В “RusAlgo.Storage.FinInfo” используется прием, позволяющий всем кубикам использовать общие настройки, которые мы задаем только один раз в  специальном блоке визуального редактора. Таким образом, уменьшается вероятность ошибки при выполнении рутинных операций, повышается удобство использования визуального редактора (ведь не приходится 10 раз прописывать одно и то же). Вот про то, как централизовать задание настроек для множества блоков визуального редактора мы и поговорим в этой статье.

Индикаторы TSLab с общими параметрами. Постановка задачи.

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

ВАЖНО: мне следует оговориться и заранее принести извинения и заверения в благородности моих мотивов разработчику “FinInfo”. Я ни в коем разе не пытался принизить вашу работу вычленив некоторые отличия от собственной разработки. Просто, наглядное сравнение двух возможных способов реализации представляется затруднительным без реальных примеров и ваша разработка, по стечению обстоятельств, попала в эти реальные примеры. Надеюсь, что упоминание в статье, наоборот  привлечет внимание к вашей разработке и будет способствовать ее развитию и внедрению в массы.

Индикаторы TSLab с общими параметрами

Рисунок 1. FinInfo и многократное повторение пути к папке.

Индикаторы TSLab с общими параметрами

Рисунок 2. RusAlgo.Storage.FinInfo и однократное указание пути к папке.

На обоих картинках индикаторы TSLab выполняют сходную задачу по выведению на график сохраненной ранее информации по инструменту. На рисунке 1 при этом в каждом кубике  приходится задавать папку, а на рисунке 2 мы задаем ее только один раз. Полезная возможность? Вам решать. Я всегда стараюсь централизовать настройки, если это возможно.

Теперь, когда смысл и назначение статьи стали совершенно прозрачными, мы перейдем к реализации на практике с помощью TSLab API.

Реализация

Для реализации нам, как обычно, понадобится кэш скриптов, Visual Studio и немного серого вещества. Основной принцип будет следующий:

  1. создаем специальный кубик, через который будет задавать настройки (настройщик).
  2. в этом кубике настройки помещаются в кэш скрипта под специальным ключом.
  3. кубики использующие настройки (потребители), обязательно размещаются соединенными с настройщиком.
  4. потребители считывают из кэша настройки и используют их.

После реализации в визуальном редакторе у нас будут на руках индикаторы TSLab изображенные на рисунке 3.

Индикаторы TSLab с общими параметрами

Рисунок 3. Результаты наших трудов.

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

Дальше пойдет сплошной код на C# и первым у нас будет класс, реализующий хранение настроек в кэшэ скрипта. Он будет достаточно простым и в то же время законченным. Код взят с реального проекта, с упрощениями под нашу текущую задачу.

    class HandlerSettings
    {
        private const string SettingsKeyPrefix = "RusAlgo.Storage.FinInfo.Pro.HandlerSettings";

        public string DbDir { get; set; }

        public static HandlerSettings SRestore(ISecurity sec, IContext ctx)
        {
            // a) для 1 инструмента, одна штука настроек. 
            var cacheKey = MakeSettingsKey(sec);

            // загрузим настройки если есть, либо вернем дефолт настройки.
            var aCache = ctx.LoadObject(cacheKey);
            if (aCache == null)
            {
                var res = new HandlerSettings();
                ctx.StoreObject(cacheKey, res);
                aCache = res;
            }

            var aSet = (HandlerSettings) aCache;
            return aSet;
        }

        public void Store(ISecurity sec, IContext ctx)
        {
            // a) для 1 инструмента, одна штука настроек. 
            var cacheKey = MakeSettingsKey(sec);

            // сохраняем настройки в кэш скрипта
            var aCache = ctx.LoadObject(cacheKey);
            if (aCache == null)
            {
                var res = new HandlerSettings();
                ctx.StoreObject(cacheKey, res);
                aCache = res;
            }

            var aSet = (HandlerSettings)aCache;
            Copy(this, aSet);
        }

        public static string MakeSettingsKey(ISecurity sec)
        {
            var cacheKey = SettingsKeyPrefix + sec.SecurityDescription.FullName;
            return cacheKey;
        }

        public static void Copy(HandlerSettings from, HandlerSettings to)
        {
            to.DbDir = from.DbDir;
        }
    }

Теперь, пришла очередь кубика через который мы в визуальном редакторе будет настройки задавать.

    [HandlerCategory("RusAlgo.Test")]
    public class SettingsHandler : IOneSourceHandler, ISecurityInputs, ISecurityReturns, IStreamHandler, IContextUses
    {
        public IContext Context { set; private get; }

        [HandlerParameter(Default = "c:\\\\temp\\\\")]
        public string DirPath { get; set; }

        public ISecurity Execute(ISecurity sec)
        {
            // кубик просто прозрачно через себя пропускает данные сохраняя настройки в кэшэ
            var set = new HandlerSettings() {DbDir = DirPath};
            set.Store(sec, Context);
            return sec;
        }
    }

Уже почти готово. Осталось сделать кубик потребляющий настройки. Что из этого получилось, смотрите ниже.

    [HandlerCategory("RusAlgo.Test")]
    public class ConsumerHandler : IOneSourceHandler, ISecurityInputs, ISecurityReturns, IStreamHandler, IContextUses
    {
        public IContext Context { set; private get; }

        public ISecurity Execute(ISecurity sec)
        {
            // просто выводим в лог путь к папке считанный из кэша
            var set = HandlerSettings.SRestore(sec, Context);
            Context.Log(set.DbDir, new Color());
            return sec;
        }
    }

Можно заметить, что благодаря правильной структуре кода, все получилось весьма компактным и красивым. Осталось теперь только собрать все это в виде библиотеки и подключить в TSLab. После запуска скрипта, изображенного на рисунке 3, мы получаем:

Рисунок 4. Лог нашего скрипта.

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

Выводы

Благодаря нехитрой комбинации кэша скриптов и кода на TSLab API мы получили удобный способ централизованного задания настроек для целого комплекта блоков визуального редактора. Этим мы избавили себя от возможных (и очень частых) ошибок при рутинной правке настроек для каждого кубика.


comments powered by HyperComments

Евгения
2017-01-03 16:58:35
Секс знакомства http://bit.ly/2hkF2s9
8
Сен
2017

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

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

6
Авг
2017

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

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

14
Июл
2017

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

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

11
Июн
2017

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

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

7
Май
2017

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

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