我刚接触编程,并开始学习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位)。

您可能需要同步对其进行的读取和写入,可以通过多种方式进行。但是,以上信息仍然适用。

07-28 08:38