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

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


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

Сделал простейший код, который читает тики из инструментов, генерит свечки и складывает под другим именем.
Все бы хорошо, но при сохранении свечек вылетает ошибка "Инструмент для 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);
            }

Теги:


Спасибо:


VoDA

Фотография
Дата: 11.09.2013
Ответить


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

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

Bond

Фотография
Дата: 11.09.2013
Ответить


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

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


А как это будет выглядеть в коде?[rolleyes]
Спасибо:

VoDA

Фотография
Дата: 11.09.2013
Ответить


Bond
А как это будет выглядеть в коде?[rolleyes]


Я создаю континиус через цикл:
Код
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

Фотография
Дата: 11.09.2013
Ответить


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

VoDA

Фотография
Дата: 11.09.2013
Ответить


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


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

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

Bond

Фотография
Дата: 11.09.2013
Ответить


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


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

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


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

VoDA

Фотография
Дата: 13.09.2013
Ответить


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


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

VoDA

Фотография
Дата: 13.09.2013
Ответить


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


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

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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy