← Zurück

Перенос данные от одного инструмента другому

Вопрос - как программно перенести данные от одного инструмента другому?

Сделал простейший код, который читает тики из инструментов, генерит свечки и складывает под другим именем. Все бы хорошо, но при сохранении свечек вылетает ошибка "Инструмент для TimeFrameCandle равен RIZ8@FORTS, а должен быть TESTING@FORTS." TESTING@FORTS это название тестового инструмента.

PS делается для создания склеенных свечек по фьючу.

            var timeFrame = TimeSpan.FromMinutes(30);

            var tradesSecurity = new Security
                                     {
                                         Id = "RIZ8@FORTS",
                                         Name = "RIZ8@FORTS",
                                         Code = "RIZ8@FORTS",
                                         MinStepPrice = 1,
                                         MinStepSize = 1,
                                         MinPrice = 1,
                                         MaxPrice = 1000000,
                                         ExchangeBoard = ExchangeBoard.Forts,
                                     };
            var candlesSecurity = new Security
                                      {
                                          Id = "TESTING@FORTS",
                                          Name = "TESTING@FORTS",
                                          Code = "TESTING@FORTS",
                                          MinStepPrice = 1,
                                          MinStepSize = 1,
                                          MinPrice = 1,
                                          MaxPrice = 1000000,
                                          ExchangeBoard = ExchangeBoard.Forts,
                                      };

            var tradesRegistry = new StorageRegistry();
            ((LocalMarketDataDrive) tradesRegistry.DefaultDrive).Path = "some path 1";
            ((LocalMarketDataDrive) tradesRegistry.DefaultDrive).UseAlphabeticPath = true;

            var candlesRegistry = new StorageRegistry();
            ((LocalMarketDataDrive) candlesRegistry.DefaultDrive).Path = "some path 2";
            ((LocalMarketDataDrive) candlesRegistry.DefaultDrive).UseAlphabeticPath = true;

            var candlesStorage = candlesRegistry.GetCandleStorage(typeof (TimeFrameCandle), candlesSecurity, timeFrame);
            var candleSeries = new CandleSeries(typeof (TimeFrameCandle), candlesSecurity, timeFrame);

            var tradesStorage = tradesRegistry.GetTradeStorage(tradesSecurity);

            var trades = tradesStorage.Load(new DateTime(2008, 11, 01), new DateTime(2008, 11, 05));
            var candles = trades.ToCandles(candleSeries);

            if (candles.Count > 0)
            {
                candlesStorage.Save(candles);
            }

War dieses Thema hilfreich?

Thema teilen

Kommentare (8)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

VoDA
VoDA Autor

Отвечу сам себе - для создания свечек по непрерывному фьючу (или иному инструменту) необходимо и достаточно сделать ContinuousSecurity.

ContinuousSecurity хранит свечки в базовых инструментах, что уменьшает расходы на хранение "составных" инструментов (нет дублирования).

Bond
Bond
Bond

VoDA: Отвечу сам себе - для создания свечек по непрерывному фьючу (или иному инструменту) необходимо и достаточно сделать ContinuousSecurity.

ContinuousSecurity хранит свечки в базовых инструментах, что уменьшает расходы на хранение "составных" инструментов (нет дублирования).

А как это будет выглядеть в коде?🙄

VoDA
VoDA Autor

Bond: А как это будет выглядеть в коде?🙄

Я создаю континиус через цикл:

private static readonly string[] Mounths = new[] {"H", "M", "U", "Z",}; // последовательность важна для правильной генерации имен фьючерсов
        public const int FIRST_YEAR = 2005;

        public ContinuousSecurity GenerateSecurity(decimal minStepPrice, decimal minStepSize)
        {
            var prefix = "RI";
            var securityName = prefix + "@CONTINIOUS";
            var result = new ContinuousSecurity
                             {
                                 Id = securityName,
                                 Code = securityName,
                                 Name = "ContinuousSecurity for " + securityName,
                                 MinStepPrice = minStepPrice,
                                 MinStepSize = minStepSize,
                                 MinPrice = 1,
                                 MaxPrice = 1000000,
                                 ExchangeBoard = ExchangeBoard.Forts,
                             };
            for (var year = FIRST_YEAR; year < 2020; year++)
            {
                for (var i = 0; i < 4; i ++)
                {
                    var yearPart = year%10;      // тут получаем последнюю цифру года
                    var mounth = i*3 + 3;
                    var mounthPart = Mounths[i]; // тут выбирается индекс, показывающий месяц

                    var id = prefix + mounthPart + yearPart + "@FORTS";
                    var code = prefix + "-" + (yearPart) + "." + (mounth);
                    var security = new Security
                                       {
                                           Id = id,
                                           Code = code,
                                           Name =
                                               "ContinuousSecurity for " + prefix + " expiration in " + mounth + "." +
                                               year,
                                           MinStepPrice = minStepPrice,
                                           MinStepSize = minStepSize,
                                           MinPrice = 1,
                                           MaxPrice = 1000000,
                                           ExchangeBoard = ExchangeBoard.Forts,
                                       };
                    var expiration = new DateTime(year, mounth, 7);					// переход между фьючами происходит 7-го числа
                    result.ExpirationJumps.Add(security, expiration);
                }
            }
            return result;
        }

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

Работа с таким инструментом идет через те же вызовы, что и обычный Security.

Bond
Bond

Спасибо за код! Интересно получилось. Вот только как ни крути лучше ручками даты выставлять. К тому же, я пришел к выводу, что лучше склеивать за день до экспирации. И в день экспирации уже работать с новым инструментом. Тогда тесты получатся более реальными.

VoDA
VoDA Autor

Bond: Спасибо за код! Интересно получилось. Вот только как ни крути лучше ручками даты выставлять. К тому же, я пришел к выводу, что лучше склеивать за день до экспирации. И в день экспирации уже работать с новым инструментом. Тогда тесты получатся более реальными.

зависит от задачи ;)

сделаешь руками - выкладывай на сайт :)

Bond
Bond

VoDA:

Bond: Спасибо за код! Интересно получилось. Вот только как ни крути лучше ручками даты выставлять. К тому же, я пришел к выводу, что лучше склеивать за день до экспирации. И в день экспирации уже работать с новым инструментом. Тогда тесты получатся более реальными.

зависит от задачи ;)

сделаешь руками - выкладывай на сайт :)

Я уже несколько недель достаю разработчиков, прошу склейку в Гидре подремонтировать. Обычные данные и склеенные фьючерсы со свечами с Финама уже выложил в общий доступ на Яндекс диске. Как сделаю с правильными днями экспирации, тоже постараюсь выложить 😉

VoDA
VoDA Autor

Bond: Я уже несколько недель достаю разработчиков, прошу склейку в Гидре подремонтировать. Обычные данные и склеенные фьючерсы со свечами с Финама уже выложил в общий доступ на Яндекс диске. Как сделаю с правильными днями экспирации, тоже постараюсь выложить 😉

Тогда лучше отдельно свечки выложи. У свечек размер сильно меньше и качать проще ;)

VoDA
VoDA Autor

Bond: Я уже несколько недель достаю разработчиков, прошу склейку в Гидре подремонтировать. Обычные данные и склеенные фьючерсы со свечами с Финама уже выложил в общий доступ на Яндекс диске. Как сделаю с правильными днями экспирации, тоже постараюсь выложить 😉

А еще лучше код для создания Cont Security или таблица где выписаны называния и даты переходов между фьючами. Это намного полезнее ;)

Данные у всех одинаковые, так что гонять их между компами необходимости мало. А вот результат (свечки/стратегии/etc) и места занимает меньше и полезнее =)