如何在NinjaScript中设置动态止盈止损及分步平仓规则
NinjaScript 动态止盈止损实现方案
核心思路
针对你提出的规则,需要通过状态变量跟踪止盈触发状态、记录入场价用于保本止损,分阶段处理平仓逻辑:
- 初始阶段:设置固定止盈PT1(10点)和百分比止损SL(1%)
- PT1触发后:平仓一半仓位(Long_1),切换到保本止损模式,同时监控反向K线(红蜡烛)平仓剩余仓位(Long_2)
关键变量定义
在脚本类中添加全局变量,用于跟踪状态和记录关键价格:
private bool isPT1Hit = false; // 标记PT1是否触发 private double longEntryPrice = 0; // 记录多头入场价 private const int PT1_POINTS = 10; // 固定止盈PT1点数 private const double SL_PERCENT = 0.01; // 止损百分比1%
入场逻辑修改
入场时记录入场价格,初始化状态:
// 入场操作(替换为你的实际入场条件) if (/* 你的多头入场条件 */) { EnterLong("Long_1"); EnterLong("Long_2"); longEntryPrice = Close[0]; // 也可通过OnOrderUpdate事件捕获订单FillPrice,更精准 isPT1Hit = false; // 重置PT1触发状态 }
动态止盈止损逻辑实现
替换原有的SetProfitTarget和SetStopLoss逻辑,改用条件判断手动处理:
if (Position.MarketPosition == MarketPosition.Long) { // 未触发PT1的初始阶段 if (!isPT1Hit) { // PT1触发:价格达到入场价+10点 if (Close[0] >= longEntryPrice + PT1_POINTS * TickSize) { ExitLong("Exit_Long1", "Long_1"); // 平仓Long_1仓位 isPT1Hit = true; // 标记PT1已触发 } // 初始止损触发:价格低于入场价1% else if (Close[0] <= longEntryPrice * (1 - SL_PERCENT)) { ExitLong("Exit_Sl", "Long_1"); ExitLong("Exit_Sl", "Long_2"); } } // PT1触发后的阶段 else { // 保本止损触发:价格低于入场价 if (Close[0] <= longEntryPrice) { ExitLong("Exit_BreakEven", "Long_2"); } // 红蜡烛触发平仓:当前K线为阴线(收盘价低于开盘价) else if (Close[0] < Open[0]) { ExitLong("Exit_PT2", "Long_2"); } } }
注意事项
- 若要精准获取入场价,建议在
OnOrderUpdate事件中捕获订单的FillPrice,替代直接使用Close[0] TickSize是品种最小变动单位,确保PT1的10点计算符合品种规则- 可根据需求调整红蜡烛的判断时机(比如用实时价格监控,或Bar收盘确认)
内容的提问来源于stack exchange,提问作者pillar star
相关产品推荐
相关产品推荐

