ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NautilusTrader 追踪止损市价单(Trailing-Stop-Market)完全指南:原理、参数与实战代码

NautilusTrader 追踪止损市价单(Trailing-Stop-Market)完全指南:原理、参数与实战代码 NautilusTrader 追踪止损市价单Trailing-Stop-Market完全指南原理、参数与实战代码【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader追踪止损市价单Trailing-Stop-Market是 NautilusTrader 九种订单类型中最重要的条件跟踪型订单之一它的止损触发价会随市场朝有利方向移动而保持固定偏移一旦触发便立即释放一张市价单。本文基于 docs/concepts/orders/trailing_stop_market.md 展开结合 TrailingStopMarketOrder 的 Rust 源码实现 与订单体系文档系统讲解其原理、使用场景、Python/Rust 双语言构造代码、全部可选参数、FIX 协议映射、底层状态机与验证规则帮助你直接在实盘或回测策略中正确使用追踪止损保护利润。什么是 Trailing-Stop-Market 订单Trailing-Stop-Market订单的核心特征是一条动态止损线订单维护一个触发价trigger price该触发价与市场参考价之间保持固定偏移trailing offset当市场朝有利方向移动时触发价跟随市场同步移动即追踪始终与最新市场价格保持设定的偏移当市场朝不利方向回撤达到偏移量时触发价被触及订单释放一张Market市价单立即执行。在 FIX 5.0 SP2 协议中Trailing-Stop-Market 没有专属的OrdType值其映射为FIX OrdType 403Stop加上 trailing peg追踪钉住字段。NautilusTrader 将其建模为独立的OrderType::TrailingStopMarket是OrderType枚举九个成员之一见 docs/concepts/orders/index.md 中的订单类型总表。从源码结构看crates/model/src/orders/trailing_stop_market.rs 中TrailingStopMarketOrder结构体专门承载了这类订单的全部领域状态pub struct TrailingStopMarketOrder { core: OrderCore, pub activation_price: OptionPrice, // 激活价达到该价位后订单才开始生效 pub trigger_price: OptionPrice, // 触发价初始可显式指定也可由偏移首先生成 pub trigger_type: TriggerType, // 触发方法默认 DEFAULT pub trailing_offset: Decimal, // 追踪偏移量核心字段 pub trailing_offset_type: TrailingOffsetType, // 偏移类型PRICE / BASIS_POINTS / TICKS / PRICE_TIER pub expire_time: OptionUnixNanos, // GTD 到期时间 pub display_qty: OptionQuantity, // 冰山显示数量 pub trigger_instrument_id: OptionInstrumentId, // 跨品种触发时的参考合约 pub is_activated: bool, // 是否已激活 pub is_triggered: bool, // 是否已触发 pub ts_triggered: OptionUnixNanos, // 触发时间戳 }其中trailing_offset与trailing_offset_type是追踪逻辑的两个核心字段前者决定偏移的大小后者决定偏移的计量方式见下文追踪偏移类型小节。使用场景保护利润同时保留上行空间Trailing-Stop-Market的典型用途是在保护已有浮盈的同时允许仓位继续吃下有利方向的行情窄偏移tight offset止损线贴市很近回撤很小就会触发锁定利润更果断但普通波动就可能误触发导致过早离场宽偏移wide offset止损线离市较远能容忍正常波动、让利润奔跑代价是回吐更多利润触发后释放的**市价单存在滑点slippage、被拒rejected或剧烈反转时无法成交unfilled**的风险——这是市价执行方式的固有代价需要在仓位管理与风控中预留缓冲。一句话总结使用决策窄偏移适合波动小、对回撤容忍度低的标的宽偏移适合趋势性强、日内噪声大的标的。订单的reduce_only参数可进一步约束其只能缩减既有仓位避免意外开仓。实战示例在 Binance Futures 上卖出 ETHUSD-PERP原文档给出了一个完整的实战案例在 Binance Futures 交易所COIN_M 保证金模式的ETHUSD-PERP永续合约上卖出 10 张合约。订单在价格达到5,000 USD时激活随后以**当前最新成交价的 1%以基点表示即 100 个基点**作为追踪偏移。Python 版本from decimal import Decimal from nautilus_trader.model import InstrumentId 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 TrailingOffsetType from nautilus_trader.model import TrailingStopMarketOrder from nautilus_trader.model import TriggerType order: TrailingStopMarketOrder self.order_factory.trailing_stop_market( instrument_idInstrumentId.from_str(ETHUSD-PERP.BINANCE), order_sideOrderSide.SELL, quantityQuantity.from_int(10), activation_pricePrice.from_str(5_000), trigger_typeTriggerType.LAST_PRICE, # -- optional (default DEFAULT) trailing_offsetDecimal(100), trailing_offset_typeTrailingOffsetType.BASIS_POINTS, time_in_forceTimeInForce.GTC, # -- optional (default GTC) expire_timeNone, # -- optional (default None) reduce_onlyTrue, # -- optional (default False) tags[TRAILING_STOP-1], # -- optional (default None) )Rust 版本use nautilus_model::{ enums::{OrderSide, TimeInForce, TrailingOffsetType, TriggerType}, identifiers::InstrumentId, types::{Price, Quantity}, }; use rust_decimal::Decimal; use ustr::Ustr; let order self.order().trailing_stop_market( InstrumentId::from(ETHUSD-PERP.BINANCE), OrderSide::Sell, Quantity::from(10), Decimal::from(100), // trailing_offset Some(TrailingOffsetType::BasisPoints), // optional (default PRICE) Some(Price::from(5000)), // activation_price None, // trigger_price (materializes from the offset on the first trail) Some(TriggerType::LastPrice), // optional (default DEFAULT) Some(TimeInForce::Gtc), // optional (default GTC) None, // expire_time Some(true), // 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(TRAILING_STOP-1)]), // tags None, // client_order_id );两种语言调用的是同一套底层模型Python 的OrderFactory.trailing_stop_market通过 pyo3 绑定 最终落到 Rust 的TrailingStopMarketOrder::new_checked而 Rust 策略中self.order()返回的工厂方法同样构造该订单并自动填充 trader/strategy ID、client order ID 与时间戳参见 docs/concepts/orders/index.md 的 Order factory 一节。关键行为activation_price 与 trigger_price 的关系原文档特别强调了一条容易被忽视的规则如果同时省略activation_price和trigger_price订单立即在当前市场价格激活且触发价会在第一次更新时由trailing_offset物化materialize生成。也就是说显式给出activation_price如示例中的 5,000市场必须先触及激活价订单才进入有效追踪状态显式给出trigger_price作为追踪的初始锚点两者都省略订单立即激活首个触发价 当前市场价 ∓ 偏移量方向取决于买卖方向。该行为在源码中得到印证crates/model/src/orders/trailing_stop_market.rs 的测试test_reconstruct_with_trigger_and_activation_none验证了trigger_price与activation_price均为None的订单可以正常构建is_activated标志在订单初始化时为false通过set_activated()置为true见 同文件 L242-L245激活价可通过has_activation_price()查询并能在事件回放中无损保留测试test_activation_price_round_trips_through_event验证了OrderInitialized事件携带激活价并支持重建。参数全解从默认值到校验规则追踪偏移类型TrailingOffsetType订单如何计量固定偏移由trailing_offset_type决定。依据 docs/concepts/orders/index.md 的 Trailing offset type 小节与 crates/model/src/enums.rs 的枚举定义枚举值含义PRICE以价格差计量偏移默认值。示例偏移10即 10 个价格单位BASIS_POINTS以基点计量百分比100 个基点 1%。示例中Decimal(100)即 1% 偏移TICKS以 tick最小价格变动单位个数计量PRICE_TIER使用交易所特定的价格档位venue-specific price tier注意缺失的trailing_offset_type用None表示对追踪类订单是非法的。Rust 构造器的默认值为PRICE因此不传该参数时需保证trailing_offset的单位是价格。触发方法TriggerTypetrigger_type决定用哪个市场价来判定是否触发同样是条件单的必备语义。依据 docs/concepts/orders/index.md 的 Trigger type 小节枚举值含义DEFAULT使用交易所默认触发方法默认值LAST_PRICE使用最新成交价BID_ASKBUY 单看 askSELL 单看 bidDOUBLE_LAST需要连续两次相同的 last price 才触发DOUBLE_BID_ASK需要连续两次匹配的 bid/ask 才触发LAST_OR_BID_ASK使用 last price 或按方向取 bid/askMID_POINT使用 bid 与 ask 的中点MARK_PRICE使用交易所标记价格合约类常用INDEX_PRICE使用交易所指数价格示例中选用的TriggerType.LAST_PRICE意味着追踪参考价 最新成交价若在流动性薄弱的合约上担心成交价毛刺可改用MARK_PRICE或DOUBLE_LAST平滑触发判定。其余可选参数与默认值参数默认值说明time_in_forceGTC生效时长可选IOC/FOK/GTD/DAY等expire_timeNone配合GTD使用指定订单到期时间GTD必须提供expire_timereduce_onlyFalse是否只允许缩减仓位防止反向开仓quote_quantityFalse数量是否以报价货币计量display_qtyNone冰山订单的可见数量须小于等于quantityemulation_triggerNone本地模拟触发条件见下文模拟执行trigger_instrument_idNone跨品种触发用另一合约的行情作为触发参考tagsNone订单标签便于检索与统计构造时的校验规则源码级TrailingStopMarketOrder::new_checkedcrates/model/src/orders/trailing_stop_market.rs在构造阶段执行严格的正确性校验失败即返回OrderError对应测试用例位于同文件测试模块数量必须为正quantity非正直接报错测试test_quantity_zero_errdisplay_qty 不得超过 quantity否则抛出Condition failed: display_qty may not exceed quantity测试test_display_qty_gt_quantity_errGTD 必须携带 expire_timeTimeInForce::Gtd且expire_time缺失/为零时拒绝构造测试test_gtd_without_expire_err初始化事件字段完备性由OrderInitialized重建订单时trigger_type、trailing_offset、trailing_offset_type三个字段缺一不可见TryFromOrderInitialized实现L597-L654。订单生命周期与底层状态机Trailing-Stop-Market 订单的生命周期与 NautilusTrader 统一的订单状态机完全一致完整状态流转图见 docs/concepts/orders/index.md 的 Order state flow 小节其特有节点集中在激活 → 触发阶段INITIALIZED订单在本地实例化提交后被交易所确认 →ACCEPTED在交易所挂起追踪中市场触及激活价后订单被激活is_activated true触发价开始随市场移动Stop 被击中 →TRIGGEREDis_triggered置为true同时记录ts_triggered释放市价单并成交 →PARTIALLY_FILLED/FILLED。从源码看TrailingStopMarketOrder::applycrates/model/src/orders/trailing_stop_market.rs对OrderEventAny::Triggered事件设置is_triggered与ts_triggered对Filled/FillVoided事件若订单已持有触发价会以触发价为基准自动计算并记录滑点set_slippage(trigger_price)。测试test_trailing_stop_market_order_sets_slippage_when_filled演示了买入单在触发价 90.00、成交价 98.50 时滑点被记为 8.50。订单更新方面update()方法L522-L531接受OrderUpdated事件可以更新trigger_price追踪过程中交易所推送的新触发价与剩余数量但拒绝携带price字段的更新追踪单本身没有挂单价测试test_trailing_stop_market_order_rejects_invalid_update_atomically验证了非法更新会被原子性拒绝订单状态与事件历史保持不变。在无原生支持的交易所上使用模拟执行Emulated orders并非所有交易所都原生支持追踪止损。NautilusTrader 的OrderEmulator组件允许在本地模拟追踪止损等条件单订单停留在EMULATED状态由本地行情驱动判定触发条件触发后以RELEASED状态释放并转成普通的MARKET/LIMIT单提交给交易所最终执行时只使用真实支持的订单类型。若你的目标 venue 不支持 Trailing-Stop-Market可参考 docs/concepts/orders/emulated.md 了解模拟的生命周期INITIALIZED→EMULATED→ 本地触发 →RELEASED→SUBMITTED在构造订单时通过emulation_trigger指定本地触发方法查询与最佳实践对模拟单的状态查询、撤销与归因需走模拟路径。追踪止损是模拟执行最典型的受益者本地每收到一个 tick 就重新计算触发价触发判定完全可控且不会因交易所不支持而丢失策略逻辑。延伸阅读订单体系总览含全部九种订单类型与 FIX 映射模拟订单在无原生支持的交易所上模拟追踪止损执行订单如何到达交易所、成交如何处理TrailingStopMarketOrder 的 Python API 参考含全部属性与方法订单状态流转与术语open / closed / in-flight 定义【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表