我刚接触编程,并开始学习C#,这是我的第一个项目。我正在努力弄清为什么发生了奇怪且看似随机的问题。这是一个相当简单的交易应用程序。基本上,它连接到Websocket流并从交易所接收实时价格数据,然后实时评估价格并执行一些操作。价格每秒更新数百次,并且没有任何问题,然后突然间,我得到的价格价格比交易所发送的实际价格低数千美元。我终于实时发现了这种情况。该应用程序已经运行了11个小时左右,没有出现问题,然后出现了不良价值。
这是有问题的代码:
public static decimal CurrentPrice;
// ...
if (BitmexTickerStreamIsConnected)
{
bitmexApiSocketService.Subscribe(BitmetSocketSubscriptions.CreateInstrumentSubsription(
message =>
{
foreach (var instrumentDto in message.Data)
{
if (instrumentDto.Symbol == "XBTUSD")
{
BitmexTickerStreamLastMessageReceived = DateTime.Now;
decimal LastPrice = instrumentDto.LastPrice.HasValue ? Convert.ToDecimal(instrumentDto.LastPrice) : CurrentPrice;
CurrentPrice = LastPrice;
}
}
}));
}
这些是断点被击倒后来自调试的值:
instrumentDto.LastPrice = 7769.5
LastPrice = 7769.5
CurrentPrice = 776.9
问题在于CurrentPrice似乎出于某种原因将小数点向左移动一位。从websocket传入的值很好,只是在CurrentPrice设置为LastPrice时才发生此问题。
我不知道为什么会这样,而且似乎完全是随机的。
任何人都知道为什么会发生这种情况或如何发生?
谢谢您的帮助!
最佳答案
有两个常见原因:
由于更新速度快,市场数据有时会给
您会根据提供者来整理不良数据。如果你是
直接从交易所消费,您需要为此编写代码。一些
提供者(如OPRA)将为您过滤或标记不良滴答声。
如果您持续看到此问题,则是由于刻度大小之类的原因
或规模。有些交易所的做法有所不同,但实际上,您
需要将某些价格字段乘以一定比例。请教
有关详细信息,请参见数据提供者文档。
如果很少看到这种情况,则可能价格很便宜。是的,这绝对会在特定情况下发生,您需要为此做好准备,除非您想成为下一个Knight Capital。
在我编写(或提供)的所有处理程序中,都有一个“健全性检查”以查看数据是否良好。根据您要完成的工作,只需删除不良刻度即可。
我常用的另一种解决方案是交替的数据流(通常称为“ A”和“ B”流或类似数据流)。如果您在一个流上打了一个不好的滴答声,请使用另一个。
也就是说,这与编程语言没有直接关系,但从根本上讲,它是通过API /数据来处理怪癖的。
编辑
还要注意这里的线程问题。确保CurrentPrice
不会一次被多个线程更新。 decimal
是128位以10为基的浮点,并且当前大于字长(32或64位)。
您可能需要同步对其进行的读取和写入,可以通过多种方式进行。但是,以上信息仍然适用。