gpt4 book ai didi

c# - 财务申请中的小数点位置不正确

转载 作者:行者123 更新时间:2023-12-05 00:11:23 26 4
gpt4 key购买 nike

我刚接触编程并开始学习 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 为底的 float ,大于当前的字长(32 或 64 位)。

您可能需要同步读取和写入它,您可以通过多种方式做到这一点。不过,上述信息仍然适用。

关于c# - 财务申请中的小数点位置不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60641505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com