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

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

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

来源:

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;        } elsereturn 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();

@Testpublic void tickShouldNotBeZero(){        BigDecimal price = BigDecimal.valueOf(2.3);        BigDecimal tick = new BigDecimal("0");        Assertions.assertThrows(Exception.class, () -> {            rule.checkTick(price,tick);        });    }@Testpublic void NotTickVerySmallRemainder() throws Exception {        BigDecimal price = new BigDecimal("100.10000001");        BigDecimal tick = new BigDecimal("0.1");      assertThat(rule.checkTick(price,tick)).isFalse();    }@Testpublic void DividedByTick() throws Exception {        BigDecimal price = new BigDecimal("0.10");        BigDecimal tick = new BigDecimal("0.1");        assertThat(rule.checkTick(price,tick)).isTrue();    }@Testpublic 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;        } elsereturn false;    }

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

return -1;    }

写个用例测试一下

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

小节

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

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

  1. 判断非负整数是否是3的倍数_二、因数与倍数教案

    二.因数与倍数 第1课时 因数和倍数(1) [教学内容] 教材第5页例1 [教材分析] 这节课首先利用整数除法中,根据商的不同情况把整数除法分成两类,其中通过整数除法中商是整数且没有余数这样的算式,直 ...

  2. 判断非负整数是否是3的倍数_六年级小升初数学总复习专题(2-1)因数与倍数...

    同学们好经过前两个章节的专题学习我们已经掌握了整数的认识部分,接下去我们要开始研究整数与整数之间的关系,首先我们要学习的是因数与倍数,因数与倍数就像两个好朋友一样,每天玩耍在一起,有因数在 的时候就有 ...

  3. 判断非负整数是否是3的倍数_五年级数学因数与倍数知识点汇总与解题方法技巧...

    在日常教学过程中,我发现孩子们和某些家长对学习数学的方法有一些误区,就是觉着数学,单纯就是逻辑思维,只要多做练习题就能学好,但是不是这样的,低年级的学生,学习数学还是以背诵为主,练习与背诵同步才行,像 ...

  4. java判断波动的曲线是否大体平衡_基于标的物价格和波动率的期权投资策略

    期权投资与普通的股票.债券.期货等交易品种相比,其相同点在于成功的前提都是基于对市场情况或标的物趋势的正确把握,但其独有特点也十分鲜明. 第一,期权杠杆倍数多样性.期权是衍生交易品种的一种,具备一般衍 ...

  5. c++判断数字是否为3的倍数的算法实现(附完整源码)

    C++判断数字是否为3的倍数的算法实现 C++判断数字是否为3的倍数的算法实现完整源码(定义,实现,main函数测试) C++判断数字是否为3的倍数的算法实现完整源码(定义,实现,main函数测试) ...

  6. 判断某整数是否既是5又是7的整数倍()

    题目描述 输入一个正整数,判断该数是否既是5又是7的整数倍.若是,则输出Yes,否则输出No. 输入 输入一个正整数 输出 若该数是5和7的倍数,则输出Yes,否则输出No. 样例输入 Copy 35 ...

  7. c++基础题:判断某整数是否既是5又是7的整数倍

    判断某整数是否既是5又是7的整数倍 题目描述 输入一个正整数,判断该数是否既是5又是7的整数倍.若是,则输出Yes,否则输出No. 输入 输入一个正整数 输出 若该数是5和7的倍数,则输出Yes,否则 ...

  8. 问题 C: 零基础学C/C++26——判断某整数是否既是5又是7的整数倍

    题目描述 输入一个正整数,判断该数是否既是5又是7的整数倍.若是,则输出Yes,否则输出No. 输入 输入一个正整数 输出 若该数是5和7的倍数,则输出Yes,否则输出No. 样例输入 Copy 35 ...

  9. 判断某整数是否既是5又是7的整数倍

    题目描述 输入一个正整数,判断该数是否既是5又是7的整数倍.若是,则输出Yes,否则输出No. 输入 输入一个正整数 输出 若该数是5和7的倍数,则输出Yes,否则输出No. 样例输入 35 样例输出 ...

  10. 编程判断一个实数(任何位数)是否为0.5的整数倍

    0.5的整数倍 Time Limit: 1000MS   Memory Limit: 100K Total Submissions: 1   Accepted: 1 Description 输入一个实 ...

最新文章

  1. 01二维矩阵中最大全为1的正方形maxSquare——经典DP问题(二维)
  2. Mac下安装MariaDB(自用备忘)
  3. 动态参数与global和nonlocal
  4. Linux 命令之 vmstat 命令-显示虚拟内存状态
  5. input获得焦点和失去焦点
  6. @Pointcut的用法
  7. php数据全部输出,我的php 分页输出数据 全部输出没有按我设定的输出 也就是本来该一页输出5条的 现在全部输出完了...
  8. Parameter ‘username‘ not found. Available parameters are [arg1, arg0, param1, param2] 绑定参数异常
  9. 五年引用量最高的10大AI论文:Adam第一,Transformer上榜,竟然没有ResNet?
  10. 李宏毅机器学习——结构化学习(一)
  11. 用组策略彻底禁止USB存储设备、光驱、软驱、ZIP软驱
  12. oracle创建只读视图语句,使用语句创建视图(6)——设置视图约束(check option)...
  13. servlet基础:Servlet、ServletConfig、ServletContext
  14. 枚举方法在swtch中的用法
  15. 最强大易用的开源MODBUS库-YMODBUS,包含MASTER/SLAVE
  16. 电脑怎么远程连接服务器?如何进行远程桌面连接?
  17. 哈工大18年春软件构造课程讨论题
  18. Micromedia Flash Player已终止一项可能不安全的操作解决办法
  19. 互联网基础架构之锅的传递及作用域
  20. ESP32系列--第六篇 WiFi AP模式

热门文章

  1. 11G新特性 -- Expression Statistics
  2. protobuf java学习
  3. mpls--通过全局路由表和静态路由的因特网接入
  4. 可变序列和不可变序列——python小练
  5. 浏览器中调用Linux程序,一个可以使用浏览器通过ssh连接linux的程序
  6. java 文本框怎么属性绑定_如何将对象属性绑定到angular2中的文本框
  7. mysql数据库自动添加编号_mysql数据库自动添加编号
  8. 如何删除git本地分支
  9. 老式计算机如何设置u盘启动,旧主板bios界面设置U盘启动教程
  10. javascript的caller,callee,call,apply