最小价格增量
下单价格必须符合合约允许的最小价格增量。比如美股通常是 0.01,但期权、期货、债券、不同价格区间可能有不同规则。
TWS API 里有两层信息:
| 字段 / 接口 | 作用 |
|---|---|
ContractDetails.minTick | 合约整体最小跳动的简化值。 |
ContractDetails.marketRuleIds | 市场规则编号,可能有一个或多个。 |
reqMarketRule(marketRuleId) | 返回不同价格区间对应的最小跳动。 |
为什么不能只看小数位
Section titled “为什么不能只看小数位”价格 100.005 看起来只是多了一位小数,但对最小跳动 0.01 的股票来说不是合法价格。TWS 可能拒绝订单,或者要求按合法价格修正。
对期权、期货、债券或低价股票来说,最小价格增量可能还会按价格区间变化。因此更稳的流程是:先查合约详情,再查市场规则。
AAPL 返回示例
Section titled “AAPL 返回示例”对 AAPL 请求合约详情和市场规则,返回:
CONTRACT_DETAIL=conId=265598;symbol=AAPL;secType=STK;exchange=SMART;primaryExchange=NASDAQ;marketRuleIds=4563...;minTick=0.01MARKET_RULE=marketRuleId=4563;lowEdge=0.0;increment=0.01意思是:从价格区间 0.0 开始,AAPL 该规则下最小跳动是 0.01。因此 100.00、100.01 合法,100.005 不合法。
下单前价格校验
Section titled “下单前价格校验”交易系统在提交限价单前,可以先把用户输入价格按最小跳动检查。金融价格建议用 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")) # Trueprint(is_valid_price("100.005", "0.01")) # False自动修正价格
Section titled “自动修正价格”是否自动修正价格取决于业务场景。交易工具可以给用户提示“价格应按 0.01 递增”;策略系统如果要自动修正,必须明确向上取整、向下取整还是四舍五入,因为买入和卖出的风险方向不同。
| 场景 | 常见处理 |
|---|---|
| 买入限价 | 通常不应自动向上提高太多,避免买贵。 |
| 卖出限价 | 通常不应自动向下压低太多,避免卖便宜。 |
| 止损触发价 | 要结合订单方向和触发逻辑处理。 |
| 用户界面 | 更适合提示合法增量,让用户自己确认。 |