NautilusTrader 限价触价单(Limit-If-Touched)完全指南:触发机制、参数详解与源码级实现

发布时间:2026/9/12 13:33:31
NautilusTrader 限价触价单(Limit-If-Touched)完全指南:触发机制、参数详解与源码级实现 NautilusTrader 限价触价单Limit-If-Touched完全指南触发机制、参数详解与源码级实现【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_traderLimit-If-Touched限价触价单LIT是一种条件订单当市场触及触发价trigger price时才在指定限价释放一张Limit订单。在 NautilusTrader 中它适用于价格逼近目标后再激活价格保护单如止盈场景既能避免过早挂单暴露意图又能通过限价防止追价风险。阅读本文后你将掌握 LIT 的触发语义、与 Stop-Limit 的区别、完整可运行的 Rust/Python 示例、全部可选参数及其默认值以及LimitIfTouchedOrder在 crates/model/src/orders/limit_if_touched.rs 中的源码级实现与验证逻辑。什么是 Limit-If-Touched一张Limit-If-Touched订单包含两个价格触发价trigger price与限价limit price。订单在被触发之前不进入订单簿一旦市场价格触及触发价订单随即以指定的限价释放为一张普通Limit订单进入订单簿等待成交。其语义与Stop-Limit止损限价单恰好互补Stop-Limit市场朝不利方向运动下跌买入 / 上涨卖出触及触发价后释放限价单用于止损Limit-If-Touched市场朝有利方向运动触及触发价后释放限价单用于在价格到达目标区域时建立仓位或止盈。正是这种朝向有利方向触发的特性使它在 FIX 协议中没有专属的OrdType值。NautilusTrader 文档在 docs/concepts/orders/index.md 的 FIX 映射表中明确说明FIX 未为Limit-If-Touched定义专门的OrdType 40业界通常以4Stop Limit配合有利触发方向发送。下表为条件类订单在 NautilusTrader 中的分类对照订单类型类别描述STOP_MARKET条件单触发价被击中后释放一张Market单STOP_LIMIT条件单触发价被击中后释放一张指定价格的Limit单MARKET_IF_TOUCHED条件单触发价被触及后释放一张Market单LIMIT_IF_TOUCHED条件单触发价被触及后释放一张指定价格的Limit单TRAILING_STOP_MARKET条件跟踪单按偏移跟踪触发价随后释放Market单TRAILING_STOP_LIMIT条件跟踪单按偏移跟踪触发价随后释放Limit单典型使用场景在原文档 docs/concepts/orders/limit_if_touched.md 的用例中LIT 的核心价值是只在触发被触及后才激活一张有价格保护price-protected的订单。典型场景包括止盈Take Profit当价格向目标方向靠近时不要过早将限价单挂在订单簿中而是等到价格真正触及目标区域再释放限价单。这样做可以避免过早挂单占用的订单簿可见性也避免在价格尚未到位时因市场反转而错失更优价位追价建仓/平仓只在价格突破到指定水平后以不差于指定限价的价格执行实现价格保护式入场。需要警惕的风险与原文档强调的一致与 Stop-Limit 相同若触发后市场快速穿越限价market moves through the limit订单可能无法成交。触发只是放行限价才是成交的最终约束。触发类型Trigger Type与执行指令LIT 属于条件订单其触发价格的计算依赖触发类型。NautilusTrader 的TriggerType枚举定义了触发所参考的市场价格摘自 docs/concepts/orders/index.md 的Trigger type小节触发类型说明DEFAULT使用交易所默认的触发类型LAST_PRICE使用最新成交价BID_ASKBUY 单用卖价askSELL 单用买价bidDOUBLE_LAST需要连续两次匹配的 last priceDOUBLE_BID_ASK需要连续两次匹配的 bid/ask按订单方向取用LAST_OR_BID_ASK使用 last price 或按方向匹配的 bid/askMID_POINT使用买卖价中点MARK_PRICE使用交易所标记价格INDEX_PRICE使用交易所指数价格当trigger_type参数缺省时工厂将回退到TriggerType::Default见下文源码分析。此外LIT 订单还受以下通用执行指令约束定义见 docs/concepts/orders/index.mdTime in Force有效期GTC一直有效直到取消默认、IOC、FOK、GTD指定到期时间、DAY、AT_THE_OPEN、AT_THE_CLOSEExpire time到期时间与GTD配合使用指定订单离开交易所订单簿/订单管理系统的时间Post-only只提供流动性、不摄取流动性若会立即成交则被交易所拒绝或取消做市商可用于锁定 maker 费率Reduce-only只允许减少现有持仓禁止在空仓时开仓或增加敞口NautilusSimulatedExchange会在关联仓位归零时取消订单、并在仓位缩小时缩减订单数量Display quantity订单在盘口上可见的数量小于总量的订单即冰山单display_qty为 0 表示隐藏单需交易所支持。完整代码示例Rust 与 Python原文档提供了在 Binance Futures 上买入 5 张 BTCUSDT-PERP 永续合约的 LIT 示例限价 30,100 USDT市场触及 30,150 USDT 时触发订单创建一小时后过期。以下示例完整保留自 docs/concepts/orders/limit_if_touched.md并标注了每个可选参数的默认值。Rustuse nautilus_model::{ enums::{OrderSide, TimeInForce, TriggerType}, identifiers::InstrumentId, types::{Price, Quantity}, }; use ustr::Ustr; let expire_time self.clock().timestamp_ns() 3_600_000_000_000_u64; let order self.order().limit_if_touched( InstrumentId::from(BTCUSDT-PERP.BINANCE), OrderSide::Buy, Quantity::from(5), Price::from(30100), Price::from(30150), Some(TriggerType::LastPrice), // optional (default DEFAULT) Some(TimeInForce::Gtd), // optional (default GTC) Some(expire_time), // one hour from now Some(true), // post_only (default false) Some(false), // reduce_only (default false) None, // quote_quantity (default false) None, // display_qty None, // emulation_trigger None, // trigger_instrument_id None, // exec_algorithm_id None, // exec_algorithm_params Some(vec![Ustr::from(TAKE_PROFIT)]), // tags None, // client_order_id );Rust 侧的self.order()来自策略 APIStrategy暴露的limit_if_touched方法签名定义在 crates/trading/src/strategy/api.rs它内部将参数转发给OrderFactory::limit_if_touched实现于 crates/common/src/factories/order.rs。Pythonfrom nautilus_trader.model import InstrumentId from nautilus_trader.model import LimitIfTouchedOrder from nautilus_trader.model import OrderSide from nautilus_trader.model import Price from nautilus_trader.model import Quantity from nautilus_trader.model import TimeInForce from nautilus_trader.model import TriggerType order: LimitIfTouchedOrder self.order_factory.limit_if_touched( instrument_idInstrumentId.from_str(BTCUSDT-PERP.BINANCE), order_sideOrderSide.BUY, quantityQuantity.from_int(5), pricePrice.from_str(30_100), trigger_pricePrice.from_str(30_150), trigger_typeTriggerType.LAST_PRICE, # -- optional (default DEFAULT) time_in_forceTimeInForce.GTD, # -- optional (default GTC) expire_timeself.clock.timestamp_ns() 3_600_000_000_000, post_onlyTrue, # -- optional (default False) reduce_onlyFalse, # -- optional (default False) tags[TAKE_PROFIT], # -- optional (default None) )Python 侧通过self.order_factory每个Strategy内置的OrderFactory见 docs/concepts/orders/index.md 的Order factory小节创建订单工厂自动为订单分配 trader/strategy ID、生成客户端订单 ID 与初始化 ID、记录初始时间戳并应用所选订单类型的默认值。关于LimitIfTouchedOrder的更多字段与方法细节可进一步查阅文档中给出的 API 参考nautilus_trader.model.LimitIfTouchedOrder。参数详解与默认值综合原文档注释与工厂源码 crates/common/src/factories/order.rslimit_if_touched的全部参数、默认值与内部处理如下参数默认值说明instrument_id必填目标合约如BTCUSDT-PERP.BINANCEorder_side必填BUY或SELLquantity必填订单数量必须为正数price必填触发后释放的限价trigger_price必填触发价trigger_typeDEFAULT触发参考价格类型缺省时工厂调用trigger_type.unwrap_or(TriggerType::Default)time_in_forceGTC有效期缺省时工厂调用time_in_force.unwrap_or(TimeInForce::Gtc)expire_timeNone到期时间纳秒时间戳配合GTD使用post_onlyfalse只提供流动性reduce_onlyfalse只减少持仓quote_quantityfalse数量是否以报价货币计display_qtyNone盘口可见数量冰山单emulation_triggerNone本地模拟触发类型trigger_instrument_idNone触发参考的标的跨品种触发时使用exec_algorithm_idNone执行算法 ID非空时工厂会同时生成exec_spawn_idexec_algorithm_paramsNone执行算法参数映射tagsNone自定义标签如[TAKE_PROFIT]client_order_id自动生成客户端订单 ID缺省时由ClientOrderIdGenerator生成源码级实现结构与状态机结构定义LimitIfTouchedOrder定义在 crates/model/src/orders/limit_if_touched.rs其专有字段为pub struct LimitIfTouchedOrder { pub price: Price, pub trigger_price: Price, pub trigger_type: TriggerType, pub expire_time: OptionUnixNanos, pub is_post_only: bool, pub display_qty: OptionQuantity, pub trigger_instrument_id: OptionInstrumentId, pub is_triggered: bool, pub ts_triggered: OptionUnixNanos, core: OrderCore, }其中core: OrderCore通过Deref/DerefMut暴露通用订单属性client_order_id、quantity、status、filled_qty、leaves_qty、avg_px、commissions等见同文件impl Order for LimitIfTouchedOrder与 crates/model/src/orders/limit_if_touched.rs其余为 LIT 专属状态。is_triggered与ts_triggered记录了订单是否被触发以及触发时间。构造校验new_checkedLimitIfTouchedOrder::new_checkedcrates/model/src/orders/limit_if_touched.rs在构造时执行一系列不变量校验数量校验check_positive_quantity要求quantity为正数否则报错invalid Quantity for quantity not positive, was 0可见数量校验check_display_qty要求display_qty若提供不超过quantity有效期校验check_time_in_force要求当time_in_force为GTD时expire_time必须存在且非零否则报错expire_time is required for GTD order触发方向校验LIT 特有OrderSide::Buy且trigger_price price时报错BUY Limit-If-Touched must have trigger_price priceOrderSide::Sell且trigger_price price时报错SELL Limit-If-Touched must have trigger_price price。这一方向约束正是 LIT有利方向触发语义的体现买入时触发价不得高于限价卖出时触发价不得低于限价。上述校验均有对应的单元测试覆盖见同文件测试模块如test_buy_trigger_gt_price、test_sell_trigger_lt_price、test_gtd_without_expire、test_quantity_zero。此外构造时会生成OrderInitialized事件OrderInitialized::new_checked把price、trigger_price、trigger_type、expire_time等写入事件LimitIfTouchedOrder也实现了TryFromOrderInitializedcrates/model/src/orders/limit_if_touched.rs支持从初始化事件还原订单对象——这是事件溯源event sourcing架构中订单重建的基础。状态机与事件处理apply方法crates/model/src/orders/limit_if_touched.rs处理订单事件流收到OrderEventAny::Triggered事件时将is_triggered置为true并记录ts_triggered收到OrderEventAny::Updated事件时更新price、trigger_price与quantity收到OrderEventAny::Filled/FillVoided事件时基于限价计算滑点set_slippage(self.price)。状态流转遵循 docs/concepts/orders/index.md 中的订单生命周期图ACCEPTED状态下条件单被击中后进入TRIGGERED其定义明确写到 A stop-limit, trailing-stop-limit, or limit-if-touched order triggered on the venue随后可进入PARTIALLY_FILLED/FILLED或从ACCEPTED/PARTIALLY_FILLED经PENDING_UPDATE/PENDING_CANCEL到达CANCELEDGTD 到期则进入EXPIRED。测试test_limit_if_touched_order_update验证了更新事件对限价、触发价与数量的同步test_limit_if_touched_order_sets_slippage_when_filled验证了成交时滑点计算。与 Stop-Limit 的对比及选型建议维度Stop-LimitLimit-If-Touched触发方向不利方向价格向下买入 / 向上卖出有利方向价格向上买入 / 向下卖出触发类型支持TriggerType支持TriggerType触发后行为释放指定限价的Limit单释放指定限价的Limit单典型用途止损、风险控制止盈、价格保护式入场FIXOrdType 404Stop Limit无专属值常用4 有利触发触发价与限价关系BUY触发价 ≤ 限价SELL触发价 ≥ 限价Nautilus 校验BUY触发价 ≤ 限价SELL触发价 ≥ 限价Nautilus 校验触发后不成交风险市场穿越限价时可能不成交市场穿越限价时可能不成交选型建议风险场景防亏损扩大选 Stop-Limit目标场景获利了结、价格到位后建仓选 Limit-If-Touched。两者触发后都以限价保护成交价因此都面临触发后市场快速穿越限价导致不成交的风险需要结合市场波动与挂单深度评估限价与触发价之间的间距。注意事项与局限交易所支持差异NautilusTrader 提供统一 API但订单类型与执行指令的支持因交易所与适配器而异——适配器可能在提交前直接拒绝不支持的请求或由交易所拒单。使用前请查阅目标集成的能力说明各适配器文档位于 docs/integrations。GTD 必须提供 expire_time若time_in_forceGTD而expire_time缺失构造会直接失败源码校验。触发方向约束BUY 单触发价必须 ≤ 限价SELL 单触发价必须 ≥ 限价违反时构造失败。不保证成交触发 ≠ 成交。若市场在触发后迅速穿越限价订单可能停留在订单簿中直至撤销或过期。本地模拟若目标交易所不原生支持 LIT可参考 docs/concepts/orders/emulated.md 中关于本地模拟条件订单OrderEmulator以MARKET/LIMIT实际执行的机制订单流转涉及EMULATED、RELEASED状态见 docs/concepts/orders/index.md 的状态定义表。延伸阅读订单总览触发类型与执行指令 — 订单类型总表、TriggerType全枚举、订单状态机与 FIX 映射模拟订单Emulated orders — 在原生不支持条件单的交易所上进行本地模拟执行Execution — 订单如何到达交易所以及成交处理核心实现crates/model/src/orders/limit_if_touched.rs工厂实现crates/common/src/factories/order.rs策略 APIcrates/trading/src/strategy/api.rs。【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询