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


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

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

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

Вопросы:

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

Теги:


Спасибо:




18 Ответов
Alexander

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


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

Dottz

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


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


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

Alexander

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


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


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


1) Security будет создан в любом случае - ищите в нём
2) Фильтруйте данные которые приходят и сохраняйте только то что надо. Там все методы виртуальные - можно переписать как душе угодно :)
Спасибо:

Dottz

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


Дык в 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

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


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

Dottz

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


Код

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

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


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

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


Возвращаясь к вопросам -
1) у какого конкретно инструмента вы хотите осуществить вывод стакана?
2) думаю, решён.
Спасибо:

Dottz

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


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

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

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

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

Alexander

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


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

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

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

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



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

Dottz

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


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

Alexander

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


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

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


Решил сделать по вашему совету со стандартной таблицей, добавив туда дополнительные поля для опционов. В таблице, когда поступают новые 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

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


Dottz Перейти
Решил сделать по вашему совету со стандартной таблицей, добавив туда дополнительные поля для опционов. В таблице, когда поступают новые 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 или функции инициализации образа может вызвать зависание приложения.



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

Dottz

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


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

Dottz

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


Дабы не плодить темы, спрошу здесь, т.к. новая проблема вытекает из всего , что следовало до нее... Стаканы вывел, все параметры считал, все вроде хорошо, но строки в Таблице с параметрами опционов добавляются кучами.
Чтобы это предотвратить вроде как нужно объявить некий идентификатор в классе и потом уже по нему обновлять текущие строки. Следуя руководству и примеру 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; }
    }
Автор топика
Спасибо:

Alexander

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


Ecng.Serialization

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

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

Пример - SampleDdeCustomTable.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 26.07.2011
Ответить


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

Dottz

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


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


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


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

loading
clippy