← Zurück

Sterling как получить BestBid и BestAsk

Добрый день.

Перенесу вопрос в этот топик. У меня платформа 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 сделать, брокер у меня все-таки этот.

War dieses Thema hilfreich?

Thema teilen

Kommentare (8)

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

MrLightKing
MrLightKing Autor

Итак, я немного продвинулся в этом вопросе. Оказывается в 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
Mikhail Sukhov

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

MrLightKing
MrLightKing Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

Попробуйте прогера какого-то вам помочь. Возможно, дело то вовсе не в коннекторе. Цена вопроса пару косарей сделать диагностику. Вон кто-то себя пиарит http://stocksharp.com/forum/5111/Napishu-vash-alghoritm-na-WL-i-S/

MrLightKing
MrLightKing Autor

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

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

Mikhail Sukhov
Mikhail Sukhov

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

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

MrLightKing
MrLightKing Autor

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

Я сделал так - я открыл пример по 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
MrLightKing Autor

Перекомпилировал исходники, протестировал, 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); ничего не выдают.