美文网首页
tick的整数倍

tick的整数倍

作者: antony已经被占用 | 来源:发表于2020-08-13 08:32 被阅读0次

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

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

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

    image.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 NotTickVerySmall() 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的库来专门处理数学运算。价格是一个float类型的浮点数。

    JAVA Float版本

    相关文章

      网友评论

          本文标题:tick的整数倍

          本文链接:https://www.haomeiwen.com/subject/jeaydktx.html