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


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

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

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

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

Теги:


Спасибо:


< 1 2 3 4 5  > >>
Mikhail Sukhov

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


GetMarketDepth - это стакан MarketDepth.

MarketDepth - это коллекция котировок. Ошибка говорит о том, что
коллекция пуста. Такое бывает, когда нет экспорта по стакану (или он
еще не стартанул).

Спасибо:

ddd888

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


С коллекцией котировок теперь тоже все понятно. :)
Спасибо за полезные ссылки. Прочитал, все что было по отображению
данных, но на практике ... никак не могу понять, почему эта
конструкция работает:

<ListView ItemsSource="{Binding ElementName=quotesWindow,
Path=Quotes}"
GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">
<ListView.View>
<GridView>
<GridViewColumn Width="70" Header="Bid"
DisplayMemberBinding="{Binding Path=Bid}" />

а вот эта (дополнительное текстовое поле в том же окне) нет:

<TextBox Name="AskBox" ... IsReadOnly="True" AcceptsTab="True"
Grid.Column="1" Text="{Binding Path=BestBid}"/>

и так тоже нет:

<TextBox Name="BidBox" ... AcceptsTab="True" IsReadOnly="True"
MinHeight="0" Grid.Column="1" Text="{Binding ElementName=quotesWindow,
Path=Quotes/BestBid/}">

Best Bid - это дополнительное поле в SampleQuote. Причем если Best Bid
загрузить в <GridViewColumn>, то данные нормально отображаются, а в
текстовом поле нет. Это можно легко объяснить?

Спасибо:

ddd888

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


Похоже, объяснить оказалось нелегко. :) По крайней мере, для меня. Но
после долгих "танцев с бубнами" удалось найти решение через обработку
событий в коллекции Quotes. Судя по похожим проблемам на многих
форумах. по-видимому, это был единственно возможный выход с данной
версией WPF.

Спасибо:

Mikhail Sukhov

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


Нет, просто был занят релизом.

Text="{Binding Path=BestBid}" не выводится скорее всего потому, что не
такого свойства. BestBid - это свойтство MarketDepth. А quotesWindow
работаео к коллекцией SampleQuotes.

Text="{Binding ElementName=quotesWindow, Path=Quotes/BestBid/}" - не
уверен что WPF понимает такие запросы. Я думаю, проще будет через
форумы программерские спрашивать такие вещи. Напримерhttp://rsdn.ru/forum/dotnet.gui/

. Так как я и сам не особо спец в визуальной технологии.

Спасибо:

ddd888

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


Сейчас уже не очень актуально, т.к. решение по привязке уже есть и
вроде как работает без сбоев. Как я это понял, проблема не в том, что
WPF не понимает запросы - он как раз многое понимает - но не
обновляет при обновлении коллекции - в этом я нашел причину и исправив
ее через подписку на событие измения коллекции, все заработало.

Возник вопрос другого плана. При отправке своей заявки с помощью
создания экземпляра класса NewOrderWindow возникает исключение от
"Ecng.Trading.Quik.ApiException: Код ошибки: WrongSyntax Сообщение
ACCOUNT=..." и т.д. При отправке из "Инструменты" заявка отправляется
нормально, а из моего метода - нет, хотя - я проверил - синтаксис
отправляемой заявки точно такой же! Отличие от отправки из окна
"Инструменты" лишь в том, что я создаю новый пустой экземпляр Security
и приписываю ему код бумаги и класс. В чем тут собака порылась?

Спасибо:

Mikhail Sukhov

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


А какой текст транзакции пр которой возникает ошибка?

Спасибо:

ddd888

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


Текст такой (интересно, есть способ как-то его скопировать, чтобы не
переписывать? :)):

"ACCOUNT=SPBFUT...;CLIENT_CODE=XXX;TYPE=L;TRANS_ID=3;CLASSCODE=SPBFUT;SECCDE=GZM0;ACTION=NEW_ORDER;OPERATION=B;QUANTITY=10;PRICE=17331;EXECUTION_CONITION=PUT_IN_QUEUE;"

дальше идут:

в [] [] (Int32 [],StringBuilder [])
в [] [] (String[], OrderStatus& [], Int32&[], Double& [], Strng& []) и
т.д. там где [] - на самом деле квадратики...

Спасибо:

ddd888

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


Поскольку используется одна и та же функция NewOrder, то должно быть
дело где-то в составляющих Order order, который параметром в
RegisterOrder отправляется? Как же на самом деле формируется класс
Order?

Спасибо:

ddd888

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


Пооблему удалось решить, послав в мой класс с методом ссылку на весь
экземпляр Security и затем использовав его в формировании заявки. :)
Ключевой момент - оказалось, что для формировании заявки только
Security.code и Security.class - не достаточно. Что же там еще
используется? Т.е. предыдущий вопрос все-таки остается - как
формируется класс Order? Какие свойства Security он использует и как?

Спасибо:

Mikhail Sukhov

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


А если посмотреть под Debug режимом в студии эти свойства?

Спасибо:
< 1 2 3 4 5  > >>

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

loading
clippy