Binance коннектор. Глюки при отрисовке свечей
Atom
07.05.2022


При использовании режима отрисовки в виде японских свечей или баров периодически проскакивает рисование High или Low свечи, которых по факту не существует. В этом можно убедиться переключив режим на профиль или кластерный график. Из-за этого весь график сжимается по оси Y. Как такое возможно?
Картинки прилагаются:
image4269.png - кривые цены на хаях отмечены красной линией
image3375.png - переключаемся на профильные свечи, кривые хай-лоу пропадают
image7513.png - этот же период с родного терминала Binance, никаких прострелов не наблюдается
image779.png - растянутый на весь экран график в режиме баров. Кривые хай-лоу сжимают график до невозможности прочтения.
image3439.png - растянутый на весь экран график в режиме профиля. Кривые хай-лоу чудесным образом исчезают.

UPDATE1: Поизучал трейды из которых строятся свечки - в файлах trades.bin (которые генерирует S# из маркет даты) есть фантомные трейды, которых нет на биржевых графиках родного терминала Binance (В ATAS тоже все в порядке). Т.е. по сути японские свечки и бары строятся правильно (тогда возникает вопрос почему неправильно рисуются профили и кластера), а вот маркет данные обрабатываются в недрах библиотеки неправильно и периодически регистрируются какие-то трейды, цена которых лежит явно за пределами торгуемого диапазона инструмента. Причем как правило это один трейд с минимальным объемом по цене, которая в несколько раз выше или ниже текущего дневного диапазона.

UPDATE2:
Не знаю поможет это для решения проблемы или нет, но один раз я получит вот такое исключение:

Binance_PusherClientFutures_MarketData 06.05.2022 16:51:37 +03:00 Error System.InvalidOperationException: Error parsing string ''.
---> System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'price')
at StockSharp.Algo.Candles.Compression.VolumeProfileBuilder.GetPriceLevelIdx(Decimal price)
at StockSharp.Algo.Candles.Compression.VolumeProfileBuilder.Update(Decimal price, Nullable`1 volume, Nullable`1 side)
at StockSharp.Algo.Candles.Compression.VolumeProfileHelper.Update(VolumeProfileBuilder volumeProfile, ICandleBuilderValueTransform transform)
at StockSharp.Algo.Candles.Compression.CandleBuilder`1.OnProcess(ICandleBuilderSubscription subscription, ICandleBuilderValueTransform transform)+MoveNext()
at StockSharp.Algo.Candles.Compression.CandleBuilder`1.Process(ICandleBuilderSubscription subscription, ICandleBuilderValueTransform transform)+MoveNext()
at StockSharp.Algo.Candles.Compression.CandleBuilderMessageAdapter.ProcessValue(ISubscriptionIdMessage message)
at StockSharp.Algo.Candles.Compression.CandleBuilderMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.OrderBookTruncateMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.OrderBookIncrementMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.OrderLogMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.SubscriptionMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.SubscriptionMessageAdapter.InnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.PartialDownloadMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.Commissions.CommissionMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.SubscriptionSecurityAllMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.SubscriptionOnlineMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.Positions.PositionMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.TransactionOrderingMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.LookupTrackingMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.Slippage.SlippageMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.Latency.LatencyMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Algo.HeartbeatMessageAdapter.OnInnerAdapterNewOutMessage(Message message)
at StockSharp.Binance.BinanceMessageAdapter.SessionOnNewTrade(BinanceSections section, Trade trade)
at Ecng.Net.WebSocketClient.OnReceive(CancellationTokenSource source)

UPDATE3: При этом если выкачать данные как исторические, т.е. не получать и сохранять их в реалтайм (во время торгов), а выкачать гидрой, то в таком случае фантомных трейдов нет.

image4269.png 22 KB (17) image3375.png 22 KB (16) image7513.png 20 KB (19) image779.png 26 KB (17) image3439.png 33 KB (14)



Спасибо:




Support

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


1) Насчет неверных цен сделок: скорее всего вы подключаетесь используя ключ от демо (binance testnet) -- поэтому получаете неверные/неполные данные. Для получения реальных данных (сделок) нужно использовать ключ от реального аккаунта.
2) Насчет ошибки (UPDATE2): сообщение об ошибке, которое вы привели, неполное. Приведите всё сообщение, или предоставьте лог-файл.
3) Насчет UPDATE3: когда вы выкачиваете данные как исторические, они выкачиваются сразу в виде свечей. Для скачивания исторических свечей, в отличие от исторических сделок, бинанс не требует авторизации при помощи ключа, поэтому выкачиваются реальные данные.
Спасибо:

Sprite

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


1. Зачем фантазировать? Я подключаюсь к реальному, а не к демо счету, я уже писал об этом в предыдущем безответном топике.
2. Более полное описание ошибки предоставлю как только она повторится.
3. Зачем фантазировать? Я выкачиваю исторические данные исключительно в виде тиков (и об этом я писал). Никаких готовых свечей я не выкачиваю.

В итоге коннектор во время торгов каким-то образом обрабатывает или генерирует, а затем сохраняет кривые сделки в файлы trades.bin, что делает его использование бессмысленным для торговли. В то время как скачанные гидрой файлы trades.bin таких кривых сделок не содержат.
Спасибо:

Support

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


Если гидра сохраняет тики в файл trades.bin корректно, то скорее всего какая то проблема в вашем приложении в процессе сохранения данных.
При построении свечей из реалтайм сделок в SampleConnection я тоже проблемы не вижу.
Сделайте минимальный проект visual studio, воспроизводящий проблему. Можете например взять за основу тот же SampleConnection или другой пример, добавить туда сохранение данных и выполнить все подписки, которые есть в вашем оригинальном приложении, убедиться что проблема воспроизводится, и потом прислать этот проект. Попробуем разобраться.
Спасибо:

Sprite

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


Прилагаю скриншоты минутного графика на сегодня 23 мая:
1. Сайт Binance
2. Моё приложение
3. Ваше приложение SampleConnection

Обратите внимание на минутную свечку в 16 часов 14 минут. На сайте Binance нет такой сопли вниз, ваш коннектор её нарисовал в обоих приложениях.

image988.png
image5709.png
image6753.png

Дополнительно выкладываю видео как коннектор в вашем приложении SampleConnection загружает исторические свечки, построенные на тиках.

https://cloud.mail.ru/public/egW7/f5EQ4XLVE

В этом видео вы можете увидеть как коннектор скачивает по 1000 тиков и строит по ним исторические свечки. Я запустил проект в 13 часов и начал скачивать данные с начала дня (т.е. с 00:00 часов), чтобы в итоге коннектор синхронизировался с текущими биржевыми данными.
В итоге через 10 минут стало ясно что мы успели скачать/построить/нарисовать 15 свечек, т.е. для того чтобы коннектор перешел в состояние риал тайм ему нужно около 12 часов. А если рынок будет более активен то и больше, до бесконечности.

Для обоих примеров с использованием SampleConnection в проекте изменена единственная строчка, чтобы коннектор строил свечи из тиков, а не брал готовые с биржи.
Строчка:
https://github.com/Stock...tiesWindow.xaml.cs#L458
Было
DataType2 = DataType.TimeFrame(tf),
Стало
DataType2 = DataType.TimeFrame(TimeSpan.FromSeconds(59)),
image988.png 41 KB (1) image5709.png 14 KB (1) image6753.png 47 KB (1)
Спасибо:


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

loading
clippy