Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 财务应用程序中的小数点位置不正确_C#_.net_Decimal_Finance_Trading - Fatal编程技术网

C# 财务应用程序中的小数点位置不正确

C# 财务应用程序中的小数点位置不正确,c#,.net,decimal,finance,trading,C#,.net,Decimal,Finance,Trading,我对编程相当陌生,开始学习C语言,这是我的第一个项目。我正在努力弄清楚为什么会出现奇怪的、看似随机的问题。这是一个相当简单的交易应用程序。基本上,它连接到websocket流,从交易所接收实时价格数据,然后实时评估价格并执行一些操作。价格每秒更新数百次,运行时没有问题,然后突然,我会得到一个价格值,比交易所发送的实际价格低数千美元。我终于实时捕捉到了这种情况。该应用程序已经运行了11个小时左右没有出现问题,然后坏值出现了 以下是相关代码: public static decimal Curren

我对编程相当陌生,开始学习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
最后价格=7769.5
当前价格=776.9
问题是CurrentPrice似乎出于某种原因将小数点向左移动了一位。来自websocket的值很好,仅当CurrentPrice设置为LastPrice时,问题才会发生

我不知道为什么会发生这种情况,而且似乎完全是随机的

有人知道为什么会发生这种情况,或者是如何发生的吗


谢谢你的帮助

有两个常见原因:

  • 由于市场数据的更新速度,偶尔会给出 根据提供程序,您可以更正错误数据。如果你是 直接从exchange消费您需要为此编写代码。一些 提供者(如)将为您筛选或标记错误标记
  • 如果你一直看到这个问题,那是由于刻度大小之类的原因造成的 或规模。有些交易所的做法有所不同,但有效地帮助了你 需要将某些价格字段乘以一定的比例。咨询 有关详细信息,请参阅数据提供程序文档
如果这是非常罕见的,你可能只是得到了一个坏的价格。是的,这绝对会在某个时刻发生,你需要为此做好准备,除非你想成为下一个

在我编写(或参与)的所有处理程序中,都有一个“健全性检查”,以查看数据是否良好。取决于你想完成什么,只要把坏的记号去掉就可以了

我常用的另一种解决方案是交替的数据流(通常称为“A”和“B”流或类似)。如果一条流的滴答声不好,请使用另一条流

也就是说,这与编程语言没有直接关系,但其核心是处理API/数据的怪癖

编辑

这里还要注意线程问题。确保多个线程不会同时更新
CurrentPrice
decimal
是128位以10为基数的浮点,它大于当前的字大小(32或64位)


您可能需要同步对它的读写,这可以通过多种方式实现。尽管如此,上述信息仍然适用。

有趣的是,在切换后的备用提要上出现了错误的滴答声。@GeorgeNewton如果您确实需要滴答声,几乎总是有办法在“重播”提要中请求它。正如您所说,通常最好放弃。只有在异国情调的十字架或类似的地方,滴答声可能在几分钟内出现。。“然后你很少会得到任何不好的数据。”乔治纳顿同意。除了描述为什么会发生这种情况外,我真的想告诉大家,您绝对需要保护自己免受不良数据的影响。的确如此。感谢@Zer0的详细回复。我肯定会采纳你的建议,并添加一个健全的检查,因为你永远不知道什么时候会得到坏数据,需要保护自己不受这些影响。也就是说,我发现奇怪的是,从交易所(instrumentDto.LastPrice)输入的勾号是正确的,只是在将变量CurrentPrice设置为该值时,问题似乎发生了。我的第一个想法是,这是来自交易所的坏数据,但它似乎是正确的。很奇怪