我正在研究交易。我想在价格不是价格大小的倍数或者在倍数的给定容差范围内时拒绝交易。
即。如果提交的订单有价格P和abs(P - N * tick_size)>对所有自然数的容忍度,这样的订单将被拒绝,因为价格无效。
我如何对所有数字进行测试?任何提示都会有所帮助!
答案 0 :(得分:3)
不需要循环。这很容易看出:| P - N * s | < t表示| P / s - N | < t(让我们肯定......)
因此,要计算N,您需要找到最接近P / s的整数。或者,N = round(P / s)。
这导致了一个简单的算法:
auto const N = round(P/tick_size);
bool const result = abs(P - N*tick_size) > tolerance
注意,假设你的数字是实数,我有点作弊。但是,对于定点或整数数学,这几乎是相同的,因为整数除法总是向零舍入。我们可以先执行abs
:
auto const Pp = abs(P);
auto const N1 = P / tick_size;
auto const N2 = N1 + 1;
bool const result = !(abs(Pp - N1*tick_size) <= tolerance || abs(Pp - N2*tick_size) <= tolerance);
正如@KerrekSB已经指出的那样,你应该一直做严谨的金融数学作为定点数学。
如果你真的需要所有自然数,你还必须查看底层基元的任意精度整数数学。如果您正在使用Linux,GNU Multiprecision Math Library是一个很好的解决方案。