← Zurück

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

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

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

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

Вопросы:

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (18)

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

Alexander
Alexander
  1. Находите среди всех Seciruty которые вам пришли с нужным вам кодом инструмента
  2. Отфильтруйте таблицы, не запускайте экспорт по ненужным таблицам.
Dottz
Dottz Autor

Alexander:

  1. Находите среди всех Seciruty которые вам пришли с нужным вам кодом инструмента
  2. Отфильтруйте таблицы, не запускайте экспорт по ненужным таблицам.
  1. Так я не экспортирую стандартную таблицу SecuritiesTable, т.к. в ней у меня только акции добавлены. А в той, которой располагаются опционы, там данные представлены не типом Security, а пользовательским типом и в нем вот есть код бумаги.
  2. Я имел ввиду, можно ли получать данные , минуя экспорт в таблицы. Т.к. мне вся таблица не нужна, нужна информация только по одному инструменту, но этот инструмент всегда разный. В самой таблице в квике нельзя только один инструмент оставить.
Alexander
Alexander

Dottz:

Alexander:

  1. Находите среди всех Seciruty которые вам пришли с нужным вам кодом инструмента
  2. Отфильтруйте таблицы, не запускайте экспорт по ненужным таблицам.
  1. Так я не экспортирую стандартную таблицу SecuritiesTable, т.к. в ней у меня только акции добавлены. А в той, которой располагаются опционы, там данные представлены не типом Security, а пользовательским типом и в нем вот есть код бумаги.
  2. Я имел ввиду, можно ли получать данные , минуя экспорт в таблицы. Т.к. мне вся таблица не нужна, нужна информация только по одному инструменту, но этот инструмент всегда разный. В самой таблице в квике нельзя только один инструмент оставить.
  1. Security будет создан в любом случае - ищите в нём
  2. Фильтруйте данные которые приходят и сохраняйте только то что надо. Там все методы виртуальные - можно переписать как душе угодно :)
Dottz
Dottz Autor

Дык в Trader.SecuritiesTable нет метода, позволяющего извлечь по коду элемент с типом Security, как например, если подписаться на событие появления новых инструментов


MainWindow.Instance.Trader.NewSecurities += securities =>
                {
                    if (this.S_Future == null && this.S_Option == null)
                    {
                        // находим инструменты
                        this.S_Future = securities.FirstOrDefault(sec => sec.Code == OptionCode);
                        this.S_Option = securities.FirstOrDefault(sec => sec.Code == FutureCode);

                        if ((this.S_Future != null) && (this.S_Option!= null))
                        {
                            // запускаем экспорт стаканов фьюча и опциона
                            MainWindow.Instance.Trader.RegisterQuotes(S_Future);
                            MainWindow.Instance.Trader.RegisterQuotes(S_Option);
                        }
                    }
                };

Только этот код не работает, ибо я не экспортирую стандартную таблицу... Где еще можно выцепить тип Security я не знаю, подскажите пожалуйста.

Alexander
Alexander

Распечатайте все инструменты, которые появляются в NewSecurities.

Dottz
Dottz Autor

MainWindow.Instance.Trader.NewSecurities += securities =>
                {
                    foreach (var s in securities)
                    {
                        TestBox.AppendText(String.Format("Инструмент: {1} | {2} \n", s.Code,s.Class));
                    }
                    
                    if (this.S_Future == null && this.S_Option == null)
                    {
                        // находим инструменты
                        this.S_Future = securities.FirstOrDefault(sec => sec.Code == OptionCode);
                        this.S_Option = securities.FirstOrDefault(sec => sec.Code == FutureCode);

                        if ((this.S_Future != null) && (this.S_Option!= null))
                        {
                            // запускаем экспорт стаканов фьюча и опциона
                            MainWindow.Instance.Trader.RegisterQuotes(S_Future);
                            MainWindow.Instance.Trader.RegisterQuotes(S_Option);
                        }
                    }
                };

Добавил вывод в текстовое поле - пусто. У меня просто напросто это событие не происходит, поэтому и пусто...

Alexander
Alexander

А сделки по инструментам есть? Таблица всех сделок экспортируется?

Если ничего этого нет, таблица инструментов не экспортируется - тогда конечно не будет новых инструментов.

Возвращаясь к вопросам -

  1. у какого конкретно инструмента вы хотите осуществить вывод стакана?
  2. думаю, решён.
Dottz
Dottz Autor

В настройках экспорта у меня следующее:


this.Trader.StartExport();
//Кастомная таблица по опционам
this.Trader.Terminal.StartDde(_OptionTable);

До сделок по инструментам я еще не дошел , т.к. стакан еще не получается вывести, соответственно и сделок не с чем пока совершать.

  1. у меня 2 инструмента : фьюч и опцион , коды которых выбираются на форме. На форму они выводятся из кастомной таблицы опционов. По обоим мне надо вывести стакан. Как я понял, осуществить это возможно, нужно лишь Security.
  2. Здесь как я понял, если у меня будет Security , то и экспорт можно ограничить одной этой бумагой и данные по ней получать через ее свойства, наподобие Security.BestBid, Security.Volatility и проч. Я верно понял?
Alexander
Alexander

Dottz: В настройках экспорта у меня следующее:

this.Trader.StartExport(); //Кастомная таблица по опционам this.Trader.Terminal.StartDde(_OptionTable);

> До сделок по инструментам я еще не дошел , т.к. стакан еще не получается вывести, соответственно и сделок не с чем пока совершать.
> 
> 1) у меня 2 инструмента : фьюч и опцион , коды которых выбираются на форме. На форму они выводятся из кастомной таблицы опционов. По обоим мне надо вывести стакан. Как я понял, осуществить это возможно, нужно лишь Security.
> 2) Здесь как я понял, если у меня будет Security , то и экспорт можно ограничить одной этой бумагой и данные по ней получать через ее свойства, наподобие Security.BestBid, Security.Volatility и проч. Я верно понял?


1) это реально существующие инструменты? почему вы не хотите просто вывести таблицу инструментов с нужными инструментами?
2) проще фильтр в самом квике настроить.
Dottz
Dottz Autor

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

Alexander
Alexander

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

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

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

у вас не приходит Security, т.к.

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

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

Dottz
Dottz Autor

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



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);
                                }

                            }                            
                        });


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

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

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

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

                        }                            
                    });
> 
> Получаю на это дело ошибку:
> 
> ```plain
Попытка выполнения управляемого кода под блокировкой OS Loader. Запуск управляемого кода в пределах функции DllMain или функции инициализации образа может вызвать зависание приложения.

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

Dottz
Dottz Autor

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

Dottz
Dottz Autor

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

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

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


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, т.к. предположил , что интерфейс уже устарел.


[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; }
    }

Mikhail Sukhov
Mikhail Sukhov

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

Alexander
Alexander

Ecng.Serialization

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

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

Пример - SampleDdeCustomTable.

Dottz
Dottz Autor

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

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