Управление стаканом котировок

Управление стаканом котировок
Atom
30.03.2010
ddd888


Добрый день, Михаил! Как-то заметил, что стакан котировок отображается
не совсем правильно - цена почему-то не снижается сверху вниз по всей
глубине, а начинается с мимнимальной котировки и повышается сверху
вниз по "биду", а в месте где начинается "аск" "переворачивается и
снова начинается с самой маленькой котировки "аск" и так повышается до
самого низа. Думал отсортировать данные на этапе прихода данных:

this.Trader.ProcessWellKnownDdeData += (name, dict) =>
// узнаем, что пришедшие данные отвечают за стакан
if (name.Contains("stock"))
// первичная сортировка по цене
IEnumerable<Quote> _curquotes = (IEnumerable<Quote>)dict;
_curquotes = _curquotes.OrderBy(t => t.Price);
... и т.д.

но это ни к чему не привело. Подскажите, пожалуйста, как правильно
отсортировать данные?

Еще здесь был как-то уже вопрос про доступ к отдельным значениям
котировок в стакане, но объяснения я так и не нашел. Как же все-такии
это можно сделать (получить значение той или иной котировки в стакане
для анализа)?

Теги:


Спасибо:


<< < 5 6 7 8 9  >
Mikhail Sukhov

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


Спасибо:

ddd888

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


Т.е., чтобы изменить строку транзакции сначала надо убрать
соотвествующую инструкцию, а потом заново ее написать?
Типа
1. ((QuikTrader)_trader).FormatTransaction += builder =>
builder.RemoveInstruction(TransactionBuilder.Comment);
2. ((QuikTrader)_trader).FormatTransaction += str =>
str.SetComment(_mycomment); ?

Спасибо:

ddd888

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


Да, все работает, только вместо TransactionBuilder.Comment почему-то
надо использовать TransactionBuilder.ClientCode тогда "Комментарий"
изменяется. А почему не свойство Comment отвечает за комментарий -
ведь это логичнее?

Спасибо:

Mikhail Sukhov

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


Особенности настроек Квик сервера.

Спасибо:

ddd888

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


В связи с одним обсуждением (о задержке вывода стакана) возник вопрос:
с какой целью в окне "инструменты" был создан таймер, если экспорт
стакана можно просто запустить через методы RegisterQuotes и
GetMarketDepth?

Кстати, GetMarketDepth.BestBid и GetMarketDepth.BestAsk показывают не
лучший бид и аск соответственно, а вообще максимальную и минимальную
цены стакана. По-моему, так не должно быть.

Спасибо:

Mikhail Sukhov

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


1. RegisterQuotes запускает ДДЕ экспорт для стакана.
2. Получается этот стакан GetMarketDepth
3. А кто будет в цикле это вызывать? Цикл нужен потому что стакан не
статичен и меняется каждый раз. В отличие от таблицы с инструментами,
в стакане Quote пересоздается каждый раз, а вот объект Security живет
всю жизнь. Что и логично - инструмент о новый каждый раз, а заявки
снимаются и
исполняются.

GetMarketDepth.BestBid и GetMarketDepth.BestAsk - а как Вы это видите?

Спасибо:

ddd888

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


GetMarketDepth.BestBid и GetMarketDepth.BestAsk получаю просто через
GetMarketDepth(this.Security).BestBid.Price. В консоле эти значения
соответствеено показывают для данного стакана минимальную и
максимальную котировки соответственно.

Я начал тут "копать" по причине того, что уже много "наворотил" в
своем GUI для управления стаканом. (Пока S#1.8) И недавно обнаружил,
что при переходе на наиболее волатильные фьючи, типа RTS (до этого я
тестировал все на сравнительно маловолатильных фьючерсах), стакан
начинает резко тормозить. До запуска стакана вывод нормальный, а при
запуске - начинается тормоз. Как будто что-то не успевает
обрабатываться. Начал выводить данные в консоль - ситуация выглядит
получше, но все равно - запаздывает на 5-10 секунд, а то и больше. Вот
и ищу причину.

Про цикл не совсем понял. Если можно подписаться на событие
GetMarketDepth.Changed и затем получить новые котировки, то зачем
нужен цикл? (Или наоборот - если нужен цикл, то зачем нужно событие
GetMarketDepth.Changed?) Наверное я не совсем правильно понимаю
механику работы GetMarketDepth...

Спасибо:

Mikhail Sukhov

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


На GetMarketDepth.Changed можно подписаться. Но если открыть несколько
стаканов - то ГУИ это убъет. GetMarketDepth.Changed вызывается очень
часто. И в каждом из этих вызовов необходимо делать BeginInvoke (или
Sync). А вот таймер всегда стабильно раз в несколько секунд, и не
зависит от количество открытых стаканов.

Спасибо:

ddd888

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


Да, я уже понял, что ресурсов компьютера хватит для более-менее
эффективной обработки лишь одного стакана. Наверное, надо переносить
большую часть обработки "внутрь" процессов, а на ГУИ выводить лишь
самое необходимое. Придется теперь подробнее заниматься
производительностью кода. Или искать альтернативы DDE? Хотя,
интересно, вот в самом же квике десятки тысяч данных обновляются без
видимых затруднений - значит ли это, что у них технология лучше?

Спасибо:

ddd888

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


Столкнулся с таким сообщением от квика: "Вывод в wrapper по DDE
приостановлен. Переполнена очередь сообщений."
Что это значит?

Спасибо:
<< < 5 6 7 8 9  >

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

loading
clippy