Экспорт стакана произвольного инструмента

Экспорт стакана произвольного инструмента
Atom
7/20/2011
Dottz


Ситуация следующая:

Делаю дельта-хеджер. В главном окне предлагается выбрать счет , торгуемые опционы и фьючи. Список опционов и фьючей выводится на основе данных, получаемых из 2 произвольных таблиц: таблица со списком опционов(через табл. "текущая таблица"), где располагаются только опционы и есть поле "Код бумаги" и таблица с параметрами опционов (через табл. "информация по опционам"). Первая нужна мне для списка опционов, а вторая для их параметров (греки, волатильность).

Далее переход к самому хеджеру: в нем 2 стакана (ст. опциона и ст. фьюча) , список параметров для хеджирования и проч. мелочи. Столкнулся с проблемой вывода этих самых стаканов:
Для вывода стакана через RegisterQuotes(), на вход надо дать тип Security. У меня же имеется только Код инструмента.

Вопросы:

1. Как осуществить вывод стакана , имея только код инструмента?
2. Как в дальнейшем получать информацию лишь по одному инструменту, а не искать по ID инструмента в таблице и считывать их. А то слишком много неиспользуемых данных грузится и процесс поиска параметров по инструменту усложняется использованием таблиц.

Tags:


Thanks:


< 1 2 
Alexander

Avatar
Date: 7/21/2011
Reply


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


Вот как я делаю:

Code
private const string WorkInstrument = "RIU1@RTS";
			var security = _multiTrader.Securities.Where(s => s.Id == WorkInstrument).ToList();


у вас не приходит Security, т.к.
1) вы не экспортируете таблицу инструментов почему-то
2) у вас нет сделок по инструменту - он не создаётся никак


Т.е. Security нет и найти вы его никак не можете.
Если есть желание - создайте руками, задав Id и все необходимые поля. Но зачем такие извращения мне до сих пор неясно
Thanks: Dottz

Dottz

Avatar
Date: 7/21/2011
Reply


Решил сделать по вашему совету со стандартной таблицей, добавив туда дополнительные поля для опционов. В таблице, когда поступают новые Security веду обработку по типу инструмента, если тип = опцион , то добавляю его в один список, если фьюч , то в другой. Но вот тут возникает проблема обработки этого события. Код обработки события ниже:

Code


this.Trader.NewSecurities += securities => this.GuiAsync(() =>
                        {
                            foreach (var s in securities)
                            {
                                //фильтры по опционам, фьючам и мусору
                                if (s.OptionType == OptionTypes.Call || s.OptionType == OptionTypes.Put)
                                {
                                    string instrumentString = String.Format("[{1}]", s.ShortName);
                                    if (!OptionBox.Items.Contains(instrumentString))
                                        OptionBox.Items.Add(instrumentString);
                                }
                                if (s.Type == SecurityTypes.Future)
                                {
                                    string instrumentString = String.Format("[{1}] {2}", s.ExpiryDate.ToString(), s.ShortName.ToString());
                                    if (!FuturesBox.Items.Contains(instrumentString))
                                        FuturesBox.Items.Add(instrumentString);
                                }

                            }                            
                        });



Получаю на это дело ошибку:

Code
Попытка выполнения управляемого кода под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.
Thanks:

Alexander

Avatar
Date: 7/21/2011
Reply


Dottz
Решил сделать по вашему совету со стандартной таблицей, добавив туда дополнительные поля для опционов. В таблице, когда поступают новые Security веду обработку по типу инструмента, если тип = опцион , то добавляю его в один список, если фьюч , то в другой. Но вот тут возникает проблема обработки этого события. Код обработки события ниже:

Code


this.Trader.NewSecurities += securities => this.GuiAsync(() =>
                        {
                            foreach (var s in securities)
                            {
                                //фильтры по опционам, фьючам и мусору
                                if (s.OptionType == OptionTypes.Call || s.OptionType == OptionTypes.Put)
                                {
                                    string instrumentString = String.Format("[{1}]", s.ShortName);
                                    if (!OptionBox.Items.Contains(instrumentString))
                                        OptionBox.Items.Add(instrumentString);
                                }
                                if (s.Type == SecurityTypes.Future)
                                {
                                    string instrumentString = String.Format("[{1}] {2}", s.ExpiryDate.ToString(), s.ShortName.ToString());
                                    if (!FuturesBox.Items.Contains(instrumentString))
                                        FuturesBox.Items.Add(instrumentString);
                                }

                            }                            
                        });



Получаю на это дело ошибку:

Code
Попытка выполнения управляемого кода под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.



Google говорит что это ошибка Managed DirectX. Со S# это точно никак не связано
Thanks:

Dottz

Avatar
Date: 7/21/2011
Reply


Вот же блин, ошибка глупая:
У String.Format индекс с нуля должен начинаться, а у меня с 1 (0 убрал, вместе с одним элементом и забыл про него).
Alexander, спасибо за помощь. Security получаю через стандартную таблицу, дополнительные поля добавил и решилась проблема с 2умя таблицами. Со стаканом думаю разберусь, ибо теперь есть Security обоих! =)
Thanks:

Dottz

Avatar
Date: 7/21/2011
Reply


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

не получается объявить атрибут [Identity] и [InnerSchema], подскажите, какую сборку надо подключить

Класс объявляю вот так:
Code

public class OptionTypeStrike : IEquatable<OptionTypeStrike>
    {
        [DdeCustomColumn("Тип", Order = 0)]
        public string Type { get; set; }

        [DdeCustomColumn("Страйк", Order = 1)]
        public long Strike { get; set; }

        public override OptionTypeStrike Clone()
        {
            throw new NotImplementedException();
        }

        public override int GetHashCode()
        {
            return this.Type.GetHashCode() ^ this.Strike.GetHashCode();
        }

        protected override bool OnEquals(OptionTypeStrike other)
        {
            return this.Type == other.Type && this.Strike == other.Strike;
        }
    }

При объявлении ругалось на Equotable (пропущена ссылка на сборку) - заменил на IEquotable, т.к. предположил , что интерфейс уже устарел.
Code

[DdeCustomTable("Таблица параметров опционов")]
    public class OptionDetails
    {
        //этой штуке и нужно присвоить идентификатор
        public OptionTypeStrike Option { get; set; }
        
        [DdeCustomColumn("Теор. цена", Order = 2)]
        public long TheorCost { get; set; }
        
        [DdeCustomColumn("Расч.цена", Order = 3)]
        public long ActCost { get; set; }
        
        [DdeCustomColumn("Расч.премия", Order = 4)]
        public long Premium { get; set; }

        [DdeCustomColumn("Дата исполнения", Order = 5)]
        public string PerformDate { get; set; }

        [DdeCustomColumn("Задан. волат.", Order = 6)]
        public decimal GivenVolatility { get; set; }

        [DdeCustomColumn("Волатильность", Order = 7)]
        public decimal Volatility { get; set; }

        [DdeCustomColumn("Дельта", Order = 8)]
        public decimal Delta { get; set; }

        [DdeCustomColumn("Гамма", Order = 9)]
        public decimal Gamma { get; set; }

        [DdeCustomColumn("Тета", Order = 10)]
        public decimal Teta { get; set; }

        [DdeCustomColumn("Вега", Order = 11)]
        public decimal Vega { get; set; }
    }
Thanks:

Alexander

Avatar
Date: 7/22/2011
Reply


Ecng.Serialization

почаще смотрите примеры, там есть почти всё. не зря же их мы писали - чтобы не отвечать на вопросы, которые эти примеры покрывают.

И наследоваться лучше от Equatable, он в Ecng.Common. Что также есть в примерах.

Пример - SampleDdeCustomTable.
Thanks:

Mikhail Sukhov

Avatar
Date: 7/26/2011
Reply


Интересный у вас экспорт данных. Квик греки не рассчитывает. Значит вы их пишите на Купели. А знаете что их умеет считать сам S#?
Thanks:

Dottz

Avatar
Date: 7/26/2011
Reply


Alexander , я почему спросил - в примере SampleDdeCustomTable, в объявлении класса как раз и не используется объявление атрибута [Identity] , а в мануале http://stocksharp.com/do...6-9895-cffb6342203f.htm описано только объявление , а в какой сборке этот атрибут имеется не указано. Я стараюсь тщательно изучать примеры, прежде, чем спрашивать.


Mikhail Sukhov, дык в таблице параметров опционов все греки имеются, я их и выгружаю. На Qpile'e не пишу ничего, мне по сути на данном этапе только дельта нужна для хеджа, а она вроде есть в этой таблице. Или вы имеете ввиду , что те данные, которые квик дает сомнительны? Про расчет греков я видел пример, но только где-то на форуме я встречал высказывание, что это не работает для более ранних версий квика. Поэтому и стал делать через Custom-таблицы.
Thanks:
< 1 2 

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy