判断非负整数是否是3的倍数_价格是最小变动价位(tick)整数倍检查

订单(order)有效性检查是交易系统一个重要的基础功能。当一个订单从柜台进入交易系统后,会经历几十项不同规则的检查,主要涉及订单自身的合法性、以及当时交易系统和合约的状态、权限等等不同的领域。
其中一个典型的检查是,价格是否是最小变动价位(tick)的整数倍。这是之前介绍价格波动带时提到的合约价格不连续的问题的延伸。

  合约乘数:每点300元
  报价单位:指数点
最小变动价位:0.2点

以上述合约表中的描述来说,因为tick=0.2,我们会在某些交易软件的五档行情表中看到类似这样的价格列表:

36a8d839e78edf50688cdcd13c9d26b1.png

来源:

https://www.wenhuacaijing.hk/wenti/174.html

那么,这个问题就转换成了一个简单的数学问题:如何判断一个数是另外一个数的倍数?

JAVA BigDecimal的实现

package com.github.tdd.finance;

import java.math.BigDecimal;

public class TickCheckRule {
public boolean checkTick(BigDecimal price, BigDecimal tick) throws Exception {
if (tick.compareTo(BigDecimal.ZERO)==0)
throw new Exception("tick should not be ZERO");
//取余
BigDecimal number= price.remainder(tick);
if(number.compareTo(BigDecimal.ZERO) == 0) {
return true;
} else
return false;
}
}

然后写几个用例来测试一下

package com.github.tdd.finance;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.math.BigDecimal;

import static org.assertj.core.api.Assertions.assertThat;

public class TestTick {

TickCheckRule rule = new TickCheckRule();

@Test
public void tickShouldNotBeZero(){
BigDecimal price = BigDecimal.valueOf(2.3);
BigDecimal tick = new BigDecimal("0");
Assertions.assertThrows(Exception.class, () -> {
rule.checkTick(price,tick);
});
}
@Test
public void NotTickVerySmallRemainder() throws Exception {
BigDecimal price = new BigDecimal("100.10000001");
BigDecimal tick = new BigDecimal("0.1");
assertThat(rule.checkTick(price,tick)).isFalse();
}
@Test
public void DividedByTick() throws Exception {
BigDecimal price = new BigDecimal("0.10");
BigDecimal tick = new BigDecimal("0.1");
assertThat(rule.checkTick(price,tick)).isTrue();
}
@Test
public void notValidEndless() throws Exception {
BigDecimal price = new BigDecimal("4");
BigDecimal tick = new BigDecimal("3");
assertThat(rule.checkTick(price,tick)).isFalse();
}
}

那么问题来了,在现实中代码是用C++编写,并没有使用类似BigDecimal的库来专门处理数学运算。我们来看看接口说明文档中的实际价格定义。以CTP交易接口为例,

    ///最小变动价位
TThostFtdcPriceType PriceTick;
///本次结算价
TThostFtdcPriceType SettlementPrice;
///涨停板价
TThostFtdcPriceType UpperLimitPrice;
///跌停板价
TThostFtdcPriceType LowerLimitPrice;

而这些价格的基础类型定义是

/////////////////////////////////////////////////////////////////////////
///TFtdcPriceType是一个价格类型
/////////////////////////////////////////////////////////////////////////
typedef double TThostFtdcPriceType;

可以看到价格是一个double类型的浮点数。
http://www.sfit.com.cn/

JAVA Double版本

    public boolean checkTick(double price, double tick) throws Exception {
if (isZero(tick)==0)
throw new Exception("tick should not be ZERO");
//判断是否能整除,
double number= price %tick;
if(isZero(number) == 0) {
return true;
} else
return false;
}

private int isZero(double x){
double EPSINON = 0.000000001;
if (( x >= -EPSINON ) && ( x <= EPSINON ))
{
return 0;
}

return -1;
}

写个用例测试一下

    @Test
public void NotTickVerySmallRemainder() throws Exception {
String price ="100.100001";
String tick="0.1";
assertThat(rule.checkTick(price,tick)).isFalse();
}

小节

本文简要介绍了价格是tick整数倍的判断

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值