Sterling как получить BestBid и BestAsk
Atom Ответить
08.10.2015


Добрый день.

Перенесу вопрос в этот топик. У меня платформа Sterling, но я никак не могу получить BestBid и BestAsk.

Trader.RegisterTrades(SPY);
MessageBox.Show("SPYlast= " + Convert.ToString(Trader.GetSecurityValue(SPY, Level1Fields.LastTradePrice)));
//Этот блок нормально выдает последнюю сделку

Trader.RegisterTrades(SPY);
Trader.RegisterSecurity(SPY);
var SPYbid = Trader.GetSecurityValue(SPY, Level1Fields.BestBidPrice);
var SPYask = Trader.GetSecurityValue(SPY, Level1Fields.BestAskPrice);
MessageBox.Show("SPYbid: " + Convert.ToString(SPYbid) + " SPYask: " + Convert.ToString(SPYask));
var lastBidPrice = SPY.BestBid == null ? (decimal?)null : SPY.BestBid.Price;
MessageBox.Show("SPYbid= " + Convert.ToString(lastBidPrice));
//А тут всегда Null

Подписка на MarketDepth, помогает только ситуативно, через 1-2 секунды котировки зависают.


Пробовал такой же код на Fusion, все работает, BestBid и BestAsk выдает. Мне бы понять, как это со Sterling сделать, брокер у меня все-таки этот.



Спасибо:




8 Ответов
MrLightKing

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


Итак, я немного продвинулся в этом вопросе. Оказывается в Sterling подписка на RegisterMarketDepth сразу дает правильные данные. Но потом возникает вот какая проблема - уже выбранные (совершенные или отмененные) заявки по bid или ask он не убирает, а оставляет, в тоже время самые новые заявки он дает (это видно в окне level2 по актуальным объемам). Пробовал это и в своей программе и в примере.

Получается что если по ask было например:
201,01
201,02
201,03
А потом на бирже аски 201,01 и 202,02 ушли и самым лучшим стал 201,03 то он все равно становится за 201,01 и 202,02 в стакане в программе. И получается, что на бирже BestAsk 201,03, а в программе остается 201,01 - такой себе эффект зависания котировок.

Я пробовал делать вот так: кнопка для RegisterMarketDepth при начала получения котировок, и кнопку UnRegisterMarketDepth для отписки.

Так все работает, но так же в программе не сделаешь, потому что там все быстрее проходит чем вручную клацать. А если Register и UnRegister вставить в код, то он иногда не успевает подписываться или отписываться и возникает ошибка.

Вот может кому-то поможет. А есть какая-то команда, чтобы в Security очистить все поля с данными по Bid и Ask?
Автор топика
Спасибо:

Mikhail Sukhov

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


Думаю, стоит сделать логирование обработчиков Sterling. Вывести в лог что в каждом приходит. Ну и разобрать по полочкам. Пока то что вы пишите выглядит странно, а значит есть вероятность, что копаете совсем не в ту сторону.
Спасибо: MrLightKing

MrLightKing

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


Несовсем понял, что надо сделать, но разберусь )) Так как кровно заинтересован сделать функциональным Sterling.
Автор топика
Спасибо:

Mikhail Sukhov

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


MrLightKing Перейти
Несовсем понял, что надо сделать, но разберусь )) Так как кровно заинтересован сделать функциональным Sterling.


Попробуйте прогера какого-то вам помочь. Возможно, дело то вовсе не в коннекторе. Цена вопроса пару косарей сделать диагностику. Вон кто-то себя пиарит https://stocksharp.ru/fo...ash-alghoritm-na-WL-i-S/
Спасибо:

MrLightKing

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


Дело то точно в коннекторе или в чем-то другом )) Пример из библиотеки по Sterling тоже неадекватно работает. Просто теперь пытаюсь добиться необходимого результата теми средствами, что есть. Исходники исправить я точно не смогу )) Разберусь с логами, может выложу, что интересного.

Заявочку на решение вопроса в рабочий раздел выложил.
Автор топика
Спасибо:

Mikhail Sukhov

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


MrLightKing Перейти
Заявочку на решение вопроса в рабочий раздел выложил.


Я тоже выделил эту задачу. И готов помочь в решении вопроса. Но надо качественные исходные данные. Если вы предоставите нормальные логи, описание ошибки и диагностическую информацию, то это можно будет исправить быстро (повторюсь, если проблема в коннекторе, а не в вашем коде, и пример не показатель, так как примеры пишутся часто копипастингом без учета деталей). Но это в случае если вы сможете самостоятельно или с помощью кого-то предоставить данные для дальнейшего анализа. Помогать и консультировать с моей стороны физически нет возможности.
Спасибо:

MrLightKing

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


Вроде нашел )))

Я сделал так - я открыл пример по Sterling (там уже есть Log-manager) и запустил на премаркете, пока рынок не очень активный и наблюдал за логами и стаканом, вот небольшой кусочек:

2015/10/30 14:26:23.203|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 14:26:23.223,T(S)=2015.10.30 08:11:25.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,99],[BestBidPrice, 120,99],[BestAskVolume, 1800],[BestBidVolume, 100]
2015/10/30 14:26:24.439|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 14:26:24.441,T(S)=2015.10.30 08:11:26.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[LastTradePrice, 120,97],[LastTradeVolume, 45],[Volume, 105922],[VWAP, 6,75800200902551]
2015/10/30 14:26:24.441|Debug |SterlingTrader|BP:Execution,T(L)=2015.10.30 14:26:24.441,T(S)=2015.10.30 08:11:26.000,(Tick),Sec=S#:AAPL@*, Native:,Type:,Ord=/0/0,Fail=,TId=,Pf=,TPrice=120,97,UId=
2015/10/30 14:26:24.626|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 14:26:24.634,T(S)=2015.10.30 08:11:26.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,97],[BestBidPrice, 120,97],[BestAskVolume, 500],[BestBidVolume, 100]
2015/10/30 14:26:25.221|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 14:26:25.238,T(S)=2015.10.30 08:11:27.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,99],[BestBidPrice, 120,99],[BestAskVolume, 1800],[BestBidVolume, 100]
2015/10/30 14:26:26.484|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 14:26:26.504,T(S)=2015.10.30 08:11:28.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,99],[BestBidPrice, 120,99],[BestAskVolume, 1800],[BestBidVolume, 500]
2015/10/30 14:26:26.506|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 14:26:26.514,T(S)=2015.10.30 08:11:28.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[LastTradePrice, 120,95],[LastTradeVolume, 10],[Volume, 105932],[VWAP, 6,75736405241098]
2015/10/30 14:26:26.514|Debug |SterlingTrader|BP:Execution,T(L)=2015.10.30 14:26:26.514,T(S)=2015.10.30 08:11:28.000,(Tick),Sec=S#:AAPL@*, Native:,Type:,Ord=/0/0,Fail=,TId=,Pf=,TPrice=120,95,UId=
2015/10/30 14:26:27.990|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 14:26:27.990,T(S)=2015.10.30 08:11:30.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,98],[BestBidPrice, 120,98],[BestAskVolume, 300],[BestBidVolume, 500]
2015/10/30 14:26:30.209|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 14:26:30.228,T(S)=2015.10.30 08:11:32.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,97],[BestBidPrice, 120,97],[BestAskVolume, 100],[BestBidVolume, 500]

В чем суть: BestAskPrice, BestAskVolume, BestBidVolume выдает правильно, а вот BestBidPrice всегда неправильно и всегда равен BestAskPrice

Я залез на GitHub в исходники и нашел в StockSharp / Connectors / Sterling / SterlingMessageAdapter_MarketData.cs

message.TryAdd(Level1Fields.BestAskPrice, (decimal)structQuoteUpdate.fAskPrice);
message.TryAdd(Level1Fields.BestBidPrice, (decimal)structQuoteUpdate.fAskPrice); //должен быть bid

l1CngMsg.TryAdd(Level1Fields.BestAskPrice, (decimal)structQuoteSnap.fAskPrice);
l1CngMsg.TryAdd(Level1Fields.BestBidPrice, (decimal)structQuoteSnap.fAskPrice); // должен быть bid


Я так понимаю в этом ошибка?
Автор топика
Спасибо: Mikhail Sukhov

MrLightKing

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


Перекомпилировал исходники, протестировал, BestBid и BestAsk выдает правильно:

2015/10/30 15:54:09.366|Debug |SterlingTrader|BP:Execution,T(L)=2015.10.30 15:54:09.366,T(S)=2015.10.30 09:39:09.000,(Tick),Sec=S#:AAPL@*, Native:,Type:,Ord=/0/0,Fail=,TId=,Pf=,TPrice=120,83,UId=
2015/10/30 15:54:09.542|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 15:54:09.559,T(S)=2015.10.30 09:39:09.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,84],[BestBidPrice, 120,82],[BestAskVolume, 600],[BestBidVolume, 600]
2015/10/30 15:54:10.382|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 15:54:10.388,T(S)=2015.10.30 09:39:10.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,84],[BestBidPrice, 120,83],[BestAskVolume, 500],[BestBidVolume, 100],[LastTradePrice, 120,835],[LastTradeVolume, 100],[Volume, 3488240],[VWAP, 120,9446]
2015/10/30 15:54:10.388|Debug |SterlingTrader|BP:Execution,T(L)=2015.10.30 15:54:10.388,T(S)=2015.10.30 09:39:10.000,(Tick),Sec=S#:AAPL@*, Native:,Type:,Ord=/0/0,Fail=,TId=,Pf=,TPrice=120,835,UId=
2015/10/30 15:54:10.580|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 15:54:10.581,T(S)=2015.10.30 09:39:10.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,84],[BestBidPrice, 120,83],[BestAskVolume, 500],[BestBidVolume, 300]
2015/10/30 15:54:10.759|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 15:54:10.776,T(S)=2015.10.30 09:39:10.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,84],[BestBidPrice, 120,83],[BestAskVolume, 400],[BestBidVolume, 300]
2015/10/30 15:54:10.969|Debug |SterlingTrader|BP:Level1Change,T(L)=2015.10.30 15:54:10.974,T(S)=2015.10.30 09:39:10.000,Sec=S#:AAPL@*, Native:,Type:,Changes=[BestAskPrice, 120,84],[BestBidPrice, 120,83],[BestAskVolume, 500],[BestBidVolume, 300]

Вопрос вот в чем? Как получить доступ к этим полям? ))

После подписки на RegisterTrades и RegisterSecurity
var Stock1_Bid = Stock1.BestBid == null ? (decimal?)null : Stock1.BestBid.Price;
и
Trader.GetSecurityValue(Stock1, Level1Fields.BestAskPrice);
ничего не выдают.
Автор топика
Спасибо:


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

loading
clippy