跳转到内容

最小价格增量

下单价格必须符合合约允许的最小价格增量。比如美股通常是 0.01,但期权、期货、债券、不同价格区间可能有不同规则。

TWS API 里有两层信息:

字段 / 接口作用
ContractDetails.minTick合约整体最小跳动的简化值。
ContractDetails.marketRuleIds市场规则编号,可能有一个或多个。
reqMarketRule(marketRuleId)返回不同价格区间对应的最小跳动。

价格 100.005 看起来只是多了一位小数,但对最小跳动 0.01 的股票来说不是合法价格。TWS 可能拒绝订单,或者要求按合法价格修正。

对期权、期货、债券或低价股票来说,最小价格增量可能还会按价格区间变化。因此更稳的流程是:先查合约详情,再查市场规则。

对 AAPL 请求合约详情和市场规则,返回:

CONTRACT_DETAIL=conId=265598;symbol=AAPL;secType=STK;exchange=SMART;primaryExchange=NASDAQ;marketRuleIds=4563...;minTick=0.01
MARKET_RULE=marketRuleId=4563;lowEdge=0.0;increment=0.01

意思是:从价格区间 0.0 开始,AAPL 该规则下最小跳动是 0.01。因此 100.00100.01 合法,100.005 不合法。

交易系统在提交限价单前,可以先把用户输入价格按最小跳动检查。金融价格建议用 Decimal,不要直接依赖浮点数。

from decimal import Decimal
def is_valid_price(price: str, increment: str) -> bool:
price_value = Decimal(price)
increment_value = Decimal(increment)
units = price_value / increment_value
return units == units.to_integral_value()
print(is_valid_price("100.01", "0.01")) # True
print(is_valid_price("100.005", "0.01")) # False

是否自动修正价格取决于业务场景。交易工具可以给用户提示“价格应按 0.01 递增”;策略系统如果要自动修正,必须明确向上取整、向下取整还是四舍五入,因为买入和卖出的风险方向不同。

场景常见处理
买入限价通常不应自动向上提高太多,避免买贵。
卖出限价通常不应自动向下压低太多,避免卖便宜。
止损触发价要结合订单方向和触发逻辑处理。
用户界面更适合提示合法增量,让用户自己确认。