You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:55:36