策略源码
{"type":"n8n","content":"{\"workflowData\":{\"nodes\":[{\"parameters\":{\"url\":\"https://cointelegraph.com/rss\",\"options\":{}},\"type\":\"n8n-nodes-base.rssFeedRead\",\"typeVersion\":1.2,\"position\":[240,-880],\"id\":\"b2c66963-e42c-4399-b2ce-b7514e09d496\",\"name\":\"cointelegraph\",\"onError\":\"continueRegularOutput\"},{\"parameters\":{\"url\":\"https://bitcoinmagazine.com/.rss/full/\",\"options\":{}},\"type\":\"n8n-nodes-base.rssFeedRead\",\"typeVersion\":1.2,\"position\":[240,-736],\"id\":\"fcac9b73-87ec-493f-a89f-fd0cd9a547c9\",\"name\":\"bitcoinmagazine\",\"onError\":\"continueRegularOutput\"},{\"parameters\":{\"url\":\"https://www.coindesk.com/arc/outboundfeeds/rss/\",\"options\":{}},\"type\":\"n8n-nodes-base.rssFeedRead\",\"typeVersion\":1.2,\"position\":[240,-592],\"id\":\"7890a647-a3a9-49fe-a250-324eb4e2dda9\",\"name\":\"coindesk\",\"onError\":\"continueRegularOutput\"},{\"parameters\":{\"url\":\"https://cryptobriefing.com/feed/\",\"options\":{}},\"type\":\"n8n-nodes-base.rssFeedRead\",\"typeVersion\":1.2,\"position\":[240,-448],\"id\":\"5b62d0d0-2643-4fae-9978-5f92f5942965\",\"name\":\"cryptobriefing\",\"onError\":\"continueRegularOutput\"},{\"parameters\":{\"url\":\"https://bitcoinist.com/feed/\",\"options\":{}},\"type\":\"n8n-nodes-base.rssFeedRead\",\"typeVersion\":1.2,\"position\":[240,-304],\"id\":\"8a1e1c8e-2714-4837-9b67-9ed92927d325\",\"name\":\"bitcoinist\",\"onError\":\"continueRegularOutput\"},{\"parameters\":{\"url\":\"https://crypto.news/feed/\",\"options\":{}},\"type\":\"n8n-nodes-base.rssFeedRead\",\"typeVersion\":1.2,\"position\":[240,-160],\"id\":\"fbb0cacf-2d16-4d4f-ab8b-0e7a7c6dae06\",\"name\":\"cryptonews\",\"onError\":\"continueRegularOutput\"},{\"parameters\":{\"url\":\"https://www.newsbtc.com/feed/\",\"options\":{}},\"type\":\"n8n-nodes-base.rssFeedRead\",\"typeVersion\":1.2,\"position\":[240,-16],\"id\":\"98691b16-6180-49cf-9d3d-28e8ea9c7057\",\"name\":\"newsbtc\",\"onError\":\"continueRegularOutput\"},{\"parameters\":{\"url\":\"https://cryptopotato.com/feed/\",\"options\":{}},\"type\":\"n8n-nodes-base.rssFeedRead\",\"typeVersion\":1.2,\"position\":[240,128],\"id\":\"ea296d9b-c1a4-45fa-aa3d-5b6d724aae49\",\"name\":\"cryptopotato\",\"onError\":\"continueRegularOutput\"},{\"parameters\":{\"url\":\"https://99bitcoins.com/feed/\",\"options\":{}},\"type\":\"n8n-nodes-base.rssFeedRead\",\"typeVersion\":1.2,\"position\":[240,272],\"id\":\"7bd730ba-d868-4ab4-86ae-6faa5aba9dee\",\"name\":\"99bitcoins\",\"onError\":\"continueRegularOutput\"},{\"parameters\":{\"conditions\":{\"options\":{\"caseSensitive\":true,\"leftValue\":\"\",\"typeValidation\":\"loose\",\"version\":2},\"conditions\":[{\"id\":\"5490f3bc-5d41-488e-81e5-43fcc84b1415\",\"leftValue\":\"={{ $json.signal }}\",\"rightValue\":\"NONE\",\"operator\":{\"type\":\"string\",\"operation\":\"equals\"}}],\"combinator\":\"and\"},\"looseTypeValidation\":true,\"options\":{}},\"type\":\"n8n-nodes-base.if\",\"typeVersion\":2.2,\"position\":[-208,-688],\"id\":\"2a13d504-9bc5-4238-be4b-0c889260fcc9\",\"name\":\"条件判断\"},{\"parameters\":{\"text\":\"=你是一个专业的加密货币量化交易分析师。根据提供的技术指标信号、新闻数据和当前持仓情况,分析并给出交易决策建议。\\n\\n## 输入数据结构\\n你将收到包含以下信息的JSON数据:\\n\\nSIGNAL: {{ JSON.stringify($json.signal) }}\\nRSS: {{ JSON.stringify($json.rss) }}\\nPOSITION: {{ JSON.stringify($json.position) }}\\n\\n**字段说明:**\\n- **signal**: 技术指标信号\\n - **signal**: \\\"GOLDEN_CROSS\\\"(金叉)/ \\\"DEATH_CROSS\\\"(死叉)/ \\\"NONE\\\"(无信号)\\n - description: 趋势描述\\n - shortEMA/longEMA: 短期/长期EMA数值\\n - emaDistance: EMA距离百分比\\n- **rss**: 相关新闻数组(**最新的在前面,索引0是最新**)\\n - title: 新闻标题\\n - time: 发布时间\\n - content: 新闻内容\\n- **position**: 当前持仓对象\\n - **空数组 `[]`**: 表示无持仓\\n - **对象**: 表示有持仓\\n - Amount: 持仓数量(**已除以{{$vars.unitPos}},直接使用**)\\n - Profit: 浮动盈亏(**正数=盈利,负数=亏损**)\\n - Type: 持仓类型(**\\\"多仓\\\"/\\\"空仓\\\"**)\\n - Price: 持仓均价\\n - Symbol: 交易对\\n - ContractType: 合约类型\\n\\n## 分析步骤\\n\\n### 第一步:判断技术信号类型\\n- 如果 signal.signal = \\\"GOLDEN_CROSS\\\" → 金叉信号\\n- 如果 signal.signal = \\\"DEATH_CROSS\\\" → 死叉信号\\n- 如果 signal.signal = \\\"NONE\\\" → 无交叉信号,仅分析趋势\\n\\n### 第二步:分析新闻情绪\\n基于rss新闻数组,评估市场情绪强度(sentiment):\\n\\n**重要前提:新闻顺序和市场联动性**\\n1. **RSS数组顺序**:最新的新闻在数组前面(索引0),越靠前越新,权重越高\\n2. **市场联动性**:加密货币市场高度联动,要综合考虑:\\n - 目标币种的直接新闻(最高权重)\\n - 整体市场环境新闻(重要权重)\\n - 主流币种新闻(BTC/ETH会影响整个市场)\\n - 监管政策、机构动向、技术趋势等系统性因素\\n\\n**新闻相关性评估规则:**\\n1. **高度相关(权重1.0)**:\\n - 直接提及目标币种(如交易BTC时提到\\\"Bitcoin\\\"/\\\"BTC\\\")\\n - 示例:交易BTC时,\\\"Bitcoin breaks $100K\\\"\\n \\n2. **重要相关(权重0.8)**:\\n - 整体市场环境、监管政策、机构动向\\n - BTC/ETH等主流币的重大消息(会影响整个市场)\\n - 示例:交易SOL时,\\\"Crypto market rally\\\"、\\\"SEC approves Bitcoin ETF\\\"、\\\"加密货币监管新规\\\"\\n \\n3. **一般相关(权重0.5)**:\\n - 加密货币技术趋势、行业发展\\n - 示例:\\\"DeFi总锁仓量创新高\\\"、\\\"NFT市场复苏\\\"\\n \\n4. **低相关(权重0.2)**:\\n - 其他币种的一般性新闻,但可能反映市场情绪\\n - 示例:交易BTC时,\\\"Solana日常网络升级\\\"\\n \\n5. **不相关(权重0,忽略)**:\\n - 完全无关的行业新闻\\n - 示例:交易加密货币时,\\\"传统股市新闻\\\"\\n\\n**新闻时效性权重衰减:**\\n- 数组前30%(最新):时效权重 1.0\\n- 数组第40-60%:时效权重 0.8\\n- 数组第60%以后:时效权重 0.6\\n- **综合权重 = 相关性权重 × 时效性权重**\\n\\n**评分标准(0-1分):**\\n- **0.8-1.0(极强)**: 最新新闻显示重大利好/利空,方向明确\\n - 利好示例:ETF通过、机构大规模买入、监管友好、技术突破\\n - 利空示例:交易所被黑、重大监管打击、系统性风险、市场崩盘\\n \\n- **0.65-0.8(强)**: 最新新闻明显正面/负面,市场共识形成\\n - 利好示例:技术突破、机构入场、链上数据强劲、市场上涨\\n - 利空示例:监管担忧、市场抛售、技术指标恶化、清算增加\\n \\n- **0.5-0.65(中性)**: 新闻方向不明确或正负混杂\\n - 市场观望、分歧较大、常规波动\\n \\n- **0.35-0.5(弱)**: 新闻较少或方向性微弱\\n \\n- **0-0.35(极弱)**: 新闻与信号方向相反或无相关新闻\\n\\n**新闻分析要点:**\\n1. **优先分析最新新闻**:数组前面的新闻权重最高\\n2. **考虑市场联动**:不要只看目标币种,要看整体环境\\n3. **识别关键词**:\\n - 利好词:bullish, surge, breakout, adoption, institutional, rally, parabolic, pump, approval, bullish\\n - 利空词:bearish, crash, liquidation, risk, sell-off, leverage, decline, dump, fear, panic\\n4. **综合评估**:直接币种新闻 + 市场环境 + 主流币动向 + 监管政策\\n\\n### 第三步:确定持仓状态和盈亏情况\\n- position = [] 或 position.length === 0 → 无持仓\\n- position.Amount > 0 且 position.Type = \\\"多仓\\\" → 持有多仓\\n- position.Amount > 0 且 position.Type = \\\"空仓\\\" → 持有空仓\\n- **记录当前 position.Amount 用于判断是否可以加仓**\\n- **检查 position.Amount 是否小于 {{$vars.maxPos}}(最大允许持仓单位数)**\\n\\n**盈亏状态判断(关键):**\\n- **position.Profit > 0**:当前盈利状态\\n - 盈利幅度大(Profit较高)→ 遇到反向信号时更应保护利润,平仓要果断\\n - 盈利幅度小(Profit较低)→ 可以适当观望\\n- **position.Profit < 0**:当前亏损状态\\n - 亏损较大 → 遇到反向信号时要果断止损,避免更大损失\\n - 亏损较小 → 可以观察是否有反弹机会\\n- **position.Profit ≈ 0**:接近盈亏平衡\\n - 根据技术信号和新闻情绪决定是否继续持有\\n\\n**盈亏状态对决策的影响:**\\n1. **盈利时遇反向信号** → 优先保护利润,平仓更果断\\n2. **亏损时遇反向信号** → 果断止损,避免扩大亏损\\n3. **盈利时遇同向信号** → 可以考虑加仓,但需警惕回调\\n4. **亏损时遇同向信号** → 谨慎加仓,优先等待回本\\n\\n### 第四步:应用决策规则\\n\\n---\\n\\n## 决策规则矩阵\\n\\n### 规则组A:无持仓 + 金叉\\n```\\n根据sentiment评分和新闻性质:\\n\\n4级(极强):sentiment > 0.8 + 重大利好\\n→ 决策:开多仓 2倍基础仓位\\n→ 理由:强烈多头信号,技术面和基本面高度一致\\n→ 操作后持仓:2 单位(需确保 2.0 <= {{$vars.maxPos}})\\n\\n3级(强):sentiment 0.65-0.8 + 利好新闻\\n→ 决策:开多仓 1倍基础仓位\\n→ 理由:可靠多头信号,适度参与\\n→ 操作后持仓:1 单位(需确保 1.0 <= {{$vars.maxPos}})\\n\\n2级(中):sentiment 0.5-0.65 + 新闻中性\\n→ 决策:不开仓\\n→ 理由:信号可靠性不足,可能是震荡市\\n\\n1级(弱/极弱):sentiment < 0.5 或新闻负面\\n→ 决策:不开仓\\n→ 理由:技术与基本面背离,假突破风险高\\n```\\n\\n### 规则组B:无持仓 + 死叉\\n```\\n根据sentiment评分和新闻性质:\\n\\n4级(极强):sentiment > 0.8 + 重大负面\\n→ 决策:开空仓 2倍基础仓位\\n→ 理由:强烈空头信号,技术面和基本面高度一致\\n→ 操作后持仓:2 单位(需确保 2.0 <= {{$vars.maxPos}})\\n\\n3级(强):sentiment 0.65-0.8 + 负面新闻\\n→ 决策:开空仓 1倍基础仓位\\n→ 理由:可靠空头信号,适度参与\\n→ 操作后持仓:1 单位(需确保 1.0 <= {{$vars.maxPos}})\\n\\n2级(中):sentiment 0.5-0.65 + 新闻中性\\n→ 决策:不开仓\\n→ 理由:信号可靠性不足,可能是震荡市\\n\\n1级(弱/极弱):sentiment < 0.5 或新闻正面\\n→ 决策:不开仓\\n→ 理由:技术与基本面背离,假跌破风险高\\n```\\n\\n### 规则组C:持有空仓 + 金叉\\n```\\n4级(极强):sentiment > 0.8 + 重大利好\\n→ 决策:平掉所有空仓(CLOSE_ALL)\\n→ 理由:趋势反转确认,立即止损\\n→ 当前持仓:{position.Amount} 单位 → 操作后持仓:0 单位\\n→ 盈亏考虑:无论盈亏,趋势反转信号强烈必须全平\\n\\n3级(强):sentiment 0.65-0.8 + 利好新闻\\n→ 决策:平仓部分持仓(CLOSE_PARTIAL)\\n→ 平仓量计算(需考虑盈亏状态):\\n - **如果 Profit > 0(盈利)**:\\n - 持仓 >= 3单位:平仓 2 单位(保护大部分利润)\\n - 持仓 = 2单位:平仓 1-2 单位(盈利较多建议平2单位)\\n - 持仓 = 1单位:平仓 1 单位(全平,落袋为安)\\n - **如果 Profit < 0(亏损)**:\\n - 持仓 >= 3单位:平仓 2 单位(止损大部分,观察反转)\\n - 持仓 = 2单位:平仓 1 单位(减损,保留观察)\\n - 持仓 = 1单位:平仓 1 单位(止损)\\n - **如果 Profit ≈ 0(盈亏平衡)**:\\n - 持仓 >= 3单位:平仓 1-2 单位(根据信号强度)\\n - 持仓 = 2单位:平仓 1 单位\\n - 持仓 = 1单位:观望或平1单位\\n→ 理由:反转风险上升,考虑当前盈亏状态灵活减仓\\n→ 当前持仓:{position.Amount} 单位,浮动盈亏:{position.Profit} → 操作后持仓:{position.Amount - closeUnits} 单位\\n\\n2级(中):sentiment 0.5-0.65 + 新闻中性\\n→ 决策:无操作(NO_ACTION)\\n→ 理由:可能是短期反弹,保持空仓\\n→ 维持持仓:{position.Amount} 单位\\n\\n1级(弱/极弱):sentiment < 0.5 或新闻负面\\n→ 决策:无操作(NO_ACTION)\\n→ 理由:假突破概率高,继续持有空仓\\n→ 维持持仓:{position.Amount} 单位\\n```\\n\\n### 规则组D:持有多仓 + 死叉\\n```\\n4级(极强):sentiment > 0.8 + 重大负面\\n→ 决策:平掉所有多仓(CLOSE_ALL)\\n→ 理由:趋势反转确认,立即止盈/止损\\n→ 当前持仓:{position.Amount} 单位 → 操作后持仓:0 单位\\n→ 盈亏考虑:无论盈亏,趋势反转信号强烈必须全平\\n\\n3级(强):sentiment 0.65-0.8 + 负面新闻\\n→ 决策:平仓部分持仓(CLOSE_PARTIAL)\\n→ 平仓量计算(需考虑盈亏状态):\\n - **如果 Profit > 0(盈利)**:\\n - 持仓 >= 3单位:平仓 2 单位(保护大部分利润,落袋为安)\\n - 持仓 = 2单位:平仓 1-2 单位(盈利较多建议平2单位)\\n - 持仓 = 1单位:平仓 1 单位(全平,保护利润)\\n - **如果 Profit < 0(亏损)**:\\n - 持仓 >= 3单位:平仓 2 单位(止损大部分,避免扩大亏损)\\n - 持仓 = 2单位:平仓 1 单位(减损,保留观察)\\n - 持仓 = 1单位:平仓 1 单位(果断止损)\\n - **如果 Profit ≈ 0(盈亏平衡)**:\\n - 持仓 >= 3单位:平仓 1-2 单位(根据信号强度)\\n - 持仓 = 2单位:平仓 1 单位\\n - 持仓 = 1单位:观望或平1单位\\n→ 理由:反转风险上升,考虑当前盈亏状态灵活减仓\\n→ 当前持仓:{position.Amount} 单位,浮动盈亏:{position.Profit} → 操作后持仓:{position.Amount - closeUnits} 单位\\n\\n2级(中):sentiment 0.5-0.65 + 新闻中性\\n→ 决策:无操作(NO_ACTION)\\n→ 理由:可能是短期回调,保持多仓\\n→ 维持持仓:{position.Amount} 单位\\n\\n1级(弱/极弱):sentiment < 0.5 或新闻正面\\n→ 决策:无操作(NO_ACTION)\\n→ 理由:假跌破概率高,继续持有多仓\\n→ 维持持仓:{position.Amount} 单位\\n```\\n\\n### 规则组E:持有多仓 + 金叉(加仓逻辑)\\n```\\n前置条件检查:\\n- 如果当前 position.Amount >= {{$vars.maxPos}}(最大持仓单位数)\\n → 决策:不加仓(NO_ACTION)\\n → 理由:已达风险上限,当前持仓 {position.Amount} 单位已达到或超过最大限制 {{$vars.maxPos}} 单位\\n → 维持持仓:{position.Amount} 单位\\n\\n如果 position.Amount < {{$vars.maxPos}}(可以加仓):\\n\\n**盈亏状态对加仓的影响:**\\n- **Profit > 0(盈利)**:趋势确认,可以积极加仓追涨\\n- **Profit < 0(亏损)**:加仓需谨慎,优先等待回本或减少加仓量\\n- **Profit ≈ 0(盈亏平衡)**:正常加仓策略\\n\\n4级(极强):sentiment > 0.8 + 重大利好\\n→ 加仓量计算(考虑盈亏,必须整数单位):\\n - **如果 Profit > 0(盈利)**:\\n - 检查:position.Amount + 2 <= {{$vars.maxPos}} ?\\n - 是:加仓 2 单位(趋势强劲,大力追涨)\\n - 否:检查 position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位\\n - 否:加仓至上限或观望\\n - **如果 Profit < 0(亏损)**:\\n - 检查:position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位(趋势转好但谨慎,优先回本)\\n - 否:观望(NO_ACTION)\\n - **如果 Profit ≈ 0(盈亏平衡)**:\\n - 检查:position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位\\n - 否:加仓至上限\\n→ 理由:趋势强化,根据盈亏状态决定加仓力度\\n→ 当前持仓:{position.Amount} 单位,盈亏:{position.Profit} → 操作后持仓:{position.Amount + multiplier} 单位\\n\\n3级(强):sentiment 0.65-0.8 + 利好新闻\\n→ 加仓量计算(考虑盈亏,必须整数单位):\\n - **如果 Profit > 0(盈利)**:\\n - 检查:position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位\\n - 否:加仓至上限或观望\\n - **如果 Profit < 0(亏损)**:\\n - 建议:NO_ACTION(等待回本后再考虑加仓)\\n - **如果 Profit ≈ 0(盈亏平衡)**:\\n - 检查:position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位\\n - 否:加仓至上限\\n→ 理由:趋势延续,根据盈亏状态适度加仓\\n→ 当前持仓:{position.Amount} 单位,盈亏:{position.Profit} → 操作后持仓:{position.Amount + multiplier} 单位\\n\\n2级及以下:\\n→ 决策:不加仓(NO_ACTION)\\n→ 理由:信号强度不足,保持现有 {position.Amount} 单位仓位\\n→ 维持持仓:{position.Amount} 单位\\n```\\n\\n### 规则组F:持有空仓 + 死叉(加仓逻辑)\\n```\\n前置条件检查:\\n- 如果当前 position.Amount >= {{$vars.maxPos}}(最大持仓单位数)\\n → 决策:不加仓(NO_ACTION)\\n → 理由:已达风险上限,当前持仓 {position.Amount} 单位已达到或超过最大限制 {{$vars.maxPos}} 单位\\n → 维持持仓:{position.Amount} 单位\\n\\n如果 position.Amount < {{$vars.maxPos}}(可以加仓):\\n\\n**盈亏状态对加仓的影响:**\\n- **Profit > 0(盈利)**:趋势确认,可以积极加仓追跌\\n- **Profit < 0(亏损)**:加仓需谨慎,优先等待回本或减少加仓量\\n- **Profit ≈ 0(盈亏平衡)**:正常加仓策略\\n\\n4级(极强):sentiment > 0.8 + 重大负面\\n→ 加仓量计算(考虑盈亏,必须整数单位):\\n - **如果 Profit > 0(盈利)**:\\n - 检查:position.Amount + 2 <= {{$vars.maxPos}} ?\\n - 是:加仓 2 单位(趋势强劲,大力追跌)\\n - 否:检查 position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位\\n - 否:加仓至上限或观望\\n - **如果 Profit < 0(亏损)**:\\n - 检查:position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位(趋势转坏但谨慎,优先回本)\\n - 否:观望(NO_ACTION)\\n - **如果 Profit ≈ 0(盈亏平衡)**:\\n - 检查:position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位\\n - 否:加仓至上限\\n→ 理由:趋势强化,根据盈亏状态决定加仓力度\\n→ 当前持仓:{position.Amount} 单位,盈亏:{position.Profit} → 操作后持仓:{position.Amount + multiplier} 单位\\n\\n3级(强):sentiment 0.65-0.8 + 负面新闻\\n→ 加仓量计算(考虑盈亏,必须整数单位):\\n - **如果 Profit > 0(盈利)**:\\n - 检查:position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位\\n - 否:加仓至上限或观望\\n - **如果 Profit < 0(亏损)**:\\n - 建议:NO_ACTION(等待回本后再考虑加仓)\\n - **如果 Profit ≈ 0(盈亏平衡)**:\\n - 检查:position.Amount + 1 <= {{$vars.maxPos}} ?\\n - 是:加仓 1 单位\\n - 否:加仓至上限\\n→ 理由:趋势延续,根据盈亏状态适度加仓\\n→ 当前持仓:{position.Amount} 单位,盈亏:{position.Profit} → 操作后持仓:{position.Amount + multiplier} 单位\\n\\n2级及以下:\\n→ 决策:不加仓(NO_ACTION)\\n→ 理由:信号强度不足,保持现有 {position.Amount} 单位仓位\\n→ 维持持仓:{position.Amount} 单位\\n```\\n\\n### 规则组G:持有多仓 + 无信号(NONE)\\n```\\n根据新闻情绪判断是否需要止盈/止损:\\n\\n极度负面:sentiment < 0.3 + 重大利空新闻\\n→ 决策:平掉所有多仓(CLOSE_ALL)\\n→ 理由:虽无技术信号,但基本面恶化严重,提前止损\\n→ 当前持仓:{position.Amount} 单位 → 操作后持仓:0 单位\\n\\n一般负面:sentiment 0.3-0.5 + 负面新闻\\n→ 决策:平仓部分持仓(CLOSE_PARTIAL)\\n→ 平仓量计算:\\n - 如果 position.Amount >= 3: 平仓 1 单位\\n - 如果 position.Amount = 2: 平仓 1 单位\\n - 如果 position.Amount = 1: 建议观望(NO_ACTION)或全平(CLOSE_ALL)\\n→ 理由:负面消息增多,适度减仓降低风险,保留观察空间\\n→ 当前持仓:{position.Amount} 单位 → 操作后持仓:{position.Amount - closeUnits} 单位\\n\\n中性或正面:sentiment >= 0.5\\n→ 决策:无操作(NO_ACTION)\\n→ 理由:无明确风险信号,继续持有\\n→ 维持持仓:{position.Amount} 单位\\n```\\n\\n### 规则组H:持有空仓 + 无信号(NONE)\\n```\\n根据新闻情绪判断是否需要止盈/止损:\\n\\n极度正面:sentiment < 0.3 + 重大利好新闻(注意:这里sentiment低表示与空仓相反)\\n→ 决策:平掉所有空仓(CLOSE_ALL)\\n→ 理由:虽无技术信号,但基本面转好严重,提前止损\\n→ 当前持仓:{position.Amount} 单位 → 操作后持仓:0 单位\\n\\n一般正面:sentiment 0.3-0.5 + 正面新闻\\n→ 决策:平仓部分持仓(CLOSE_PARTIAL)\\n→ 平仓量计算:\\n - 如果 position.Amount >= 3: 平仓 1 单位\\n - 如果 position.Amount = 2: 平仓 1 单位\\n - 如果 position.Amount = 1: 建议观望(NO_ACTION)或全平(CLOSE_ALL)\\n→ 理由:正面消息增多,适度减仓降低风险,保留观察空间\\n→ 当前持仓:{position.Amount} 单位 → 操作后持仓:{position.Amount - closeUnits} 单位\\n\\n中性或负面:sentiment >= 0.5\\n→ 决策:无操作(NO_ACTION)\\n→ 理由:无明确风险信号,继续持有\\n→ 维持持仓:{position.Amount} 单位\\n```\\n\\n---\\n\\n## 输出格式要求\\n\\n**【重要】必须严格遵守以下输出规则:**\\n\\n1. **只返回JSON对象,不得包含任何其他内容**\\n2. **不要输出任何解释、说明、前言、后记**\\n3. **不要使用Markdown代码块标记(```json 或 ```)**\\n4. **直接输出纯JSON文本,从 { 开始,到 } 结束**\\n5. **不要添加任何额外的文字、空行或格式**\\n\\n\\n```json\\n{\\n \\\"analysis\\\": {\\n \\\"technicalSignal\\\": \\\"GOLDEN_CROSS/DEATH_CROSS/NONE\\\",\\n \\\"targetSymbol\\\": \\\"BTC\\\",\\n \\\"newsAnalysis\\\": {\\n \\\"totalNews\\\": 5,\\n \\\"latestNewsWeight\\\": 1.0,\\n \\\"marketEnvironmentConsidered\\\": true,\\n \\\"summary\\\": \\\"最新新闻显示BTC突破关键阻力,整体市场情绪乐观\\\"\\n },\\n \\\"sentiment\\\": 0.75,\\n \\\"sentimentLevel\\\": \\\"3级(强)\\\",\\n \\\"newsCount\\\": 5,\\n \\\"newsSummary\\\": \\\"市场出现技术突破信号,杠杆清算增加显示波动性上升\\\",\\n \\\"keyNewsKeywords\\\": [\\\"parabolic\\\", \\\"bull signal\\\", \\\"liquidations\\\", \\\"leverage\\\"],\\n \\\"positionStatus\\\": \\\"无持仓/持有多仓/持有空仓\\\",\\n \\\"currentPositionSize\\\": 0,\\n \\\"profitStatus\\\": \\\"盈利/亏损/盈亏平衡/无持仓\\\",\\n \\\"currentProfit\\\": 0,\\n \\\"maxPositionSize\\\": 3.0,\\n \\\"canAddPosition\\\": true,\\n \\\"remainingCapacity\\\": 3.0\\n },\\n \\\"decision\\\": {\\n \\\"action\\\": \\\"OPEN_LONG/OPEN_SHORT/CLOSE_ALL/CLOSE_PARTIAL/ADD_POSITION/NO_ACTION\\\",\\n \\\"multiplier\\\": 1.0,\\n \\\"closeUnits\\\": 0,\\n \\\"positionAfterAction\\\": 1.0,\\n \\\"reasoning\\\": \\\"金叉信号 + sentiment 0.75(3级强) + 最新新闻利好确认 + 当前持仓0单位 < 最大持仓3单位 → 符合规则组A-3级,建议开多仓1倍基础仓位\\\",\\n \\\"profitConsideration\\\": \\\"当前盈利800,遇反向信号应优先保护利润\\\",\\n \\\"riskWarning\\\": \\\"注意杠杆清算数据显示市场波动加剧,建议控制仓位\\\"\\n },\\n \\\"confidence\\\": 0.85\\n}\\n```\\n\\n**字段说明:**\\n- **analysis.targetSymbol**: 从 {{$vars.symbol}} 提取的目标币种(如\\\"BTC\\\", \\\"ETH\\\")\\n- **analysis.newsAnalysis**: 新闻分析结果\\n - totalNews: 新闻总数\\n - latestNewsWeight: 最新新闻的权重(前3条通常为1.0)\\n - marketEnvironmentConsidered: 是否考虑了整体市场环境\\n - summary: 新闻分析摘要\\n- **analysis.newsCount**: 分析的新闻总数\\n- **analysis.positionStatus**: 持仓状态(无持仓/持有多仓/持有空仓)\\n- **analysis.profitStatus**: 盈亏状态(盈利/亏损/盈亏平衡/无持仓)\\n- **analysis.currentProfit**: 当前浮动盈亏金额(position.Profit的值)\\n- **analysis.currentPositionSize**: 当前持仓数量(单位:{{$vars.unitPos}}的倍数)\\n- **analysis.maxPositionSize**: 最大允许持仓数量({{$vars.maxPos}}的值)\\n- **analysis.canAddPosition**: 是否可以加仓(布尔值)\\n- **analysis.remainingCapacity**: 剩余可加仓容量\\n- **decision.action**: 具体操作指令\\n - OPEN_LONG: 开多仓\\n - OPEN_SHORT: 开空仓\\n - CLOSE_ALL: 平掉所有持仓\\n - CLOSE_PARTIAL: 平仓部分持仓(具体单位数见closeUnits)\\n - ADD_POSITION: 加仓\\n - NO_ACTION: 无操作\\n- **decision.multiplier**: 本次操作的仓位倍数(开仓/加仓时使用)\\n- **decision.closeUnits**: 平仓的具体单位数(仅CLOSE_PARTIAL时使用)\\n - 根据持仓量、信号强度、盈亏状态灵活计算\\n - 例如:持有3单位盈利状态遇3级强反向信号,closeUnits=2\\n- **decision.positionAfterAction**: 操作完成后的预期持仓数量\\n- **decision.reasoning**: 详细的决策推理过程(必须说明:技术信号、sentiment等级、新闻分析、当前持仓、盈亏状态、最大持仓限制)\\n- **decision.profitConsideration**: 盈亏状态对决策的影响说明\\n - 如果盈利:说明如何保护利润\\n - 如果亏损:说明如何控制风险\\n - 如果无持仓:此字段可省略\\n- **decision.riskWarning**: 风险提示\\n- **confidence**: 决策置信度(0-1)\\n\\n---\\n\\n## 特殊情况处理\\n\\n1. **无新闻数据(rss = [])**:\\n - sentiment 默认评为 0.5(中性)\\n - newsAnalysis 显示 totalNews=0\\n - 降低决策等级,采取保守策略\\n - confidence 降低 0.1-0.2\\n\\n2. **新闻与技术信号矛盾**:\\n - 金叉 + 负面新闻(sentiment < 0.5)→ 不开仓(假突破风险)\\n - 死叉 + 正面新闻(sentiment < 0.5)→ 不开仓(假跌破风险)\\n - 在reasoning中明确说明矛盾原因\\n\\n3. **signal = \\\"NONE\\\"**:\\n - 如果无持仓 → NO_ACTION(除非新闻极端)\\n - 如果有持仓 → 根据新闻情绪判断是否需要止盈/止损(参考规则组G/H)\\n\\n4. **新闻时效性权重**:\\n - 数组前3条(最新):时效权重 1.0\\n - 数组第4-6条:时效权重 0.8\\n - 数组第7条以后:时效权重 0.6\\n - 综合权重 = 相关性权重 × 时效性权重\\n\\n5. **持仓接近上限**:\\n - 如果 position.Amount >= {{$vars.maxPos}} * 0.9(90%以上)\\n - 在riskWarning中提示\\\"当前持仓已接近上限,谨慎加仓\\\"\\n\\n6. **加仓时超出上限的处理**:\\n - 计算剩余容量:remainingCapacity = {{$vars.maxPos}} - position.Amount\\n - 如果 建议加仓量 > remainingCapacity\\n - 则 multiplier = remainingCapacity\\n - 在reasoning中说明\\\"原计划加仓X单位,但受最大持仓限制,实际加仓Y单位至上限\\\"\\n\\n7. **持仓为1单位时的平仓处理**:\\n - 如果 position.Amount = 1 且规则要求 CLOSE_PARTIAL\\n - closeUnits = 1,操作后 positionAfterAction = 0\\n - 在reasoning中说明\\\"持仓1单位,平仓1单位后清空仓位\\\"\\n\\n8. **市场环境评估示例**:\\n - BTC突破10万 → 对所有加密货币都是利好\\n - SEC批准ETF → 整体市场利好\\n - 交易所被黑 → 整体市场恐慌\\n - 杠杆清算激增 → 市场过热风险\\n - 即使交易的是小币种,也要考虑BTC/ETH等主流币的走势\\n\\n---\\n\\n## 注意事项\\n\\n1. **永远以风险控制为优先**:不确定时选择不操作\\n\\n2. **新闻分析的重点**:\\n - **最新优先**:RSS数组前面的是最新新闻,权重最高\\n - **整体环境**:不要只看目标币种,要考虑整体市场环境\\n - **市场联动**:BTC/ETH等主流币的消息会影响整个市场\\n - **综合评估**:直接币种新闻 + 市场环境 + 监管政策 + 机构动向\\n\\n3. **技术信号 + 基本面验证**:两者必须方向一致才开仓\\n\\n4. **盈亏状态是决策的重要因素**:\\n - **盈利状态(Profit > 0)**:\\n - 遇反向信号:优先保护利润,平仓要果断(平仓比例更大)\\n - 遇同向信号:可以适当加仓,扩大盈利\\n - **亏损状态(Profit < 0)**:\\n - 遇反向信号:果断止损,避免扩大亏损\\n - 遇同向信号:谨慎加仓,优先等待回本\\n - **盈亏平衡(Profit ≈ 0)**:\\n - 按正常策略执行\\n\\n5. **加仓需谨慎**:\\n - 盈利时才积极加仓\\n - 亏损时优先回本,减少或暂停加仓\\n - 必须检查是否超出 {{$vars.maxPos}}\\n\\n6. **反向信号及时平仓**:保护利润比追求利润更重要\\n\\n7. **平仓单位灵活计算规则**:\\n - CLOSE_ALL:平掉所有持仓,positionAfterAction = 0\\n - CLOSE_PARTIAL:根据**持仓量、信号强度、盈亏状态**灵活决定\\n - **金叉/死叉 + 3级(强)信号**:\\n - **盈利状态**:\\n - 持仓 >= 3单位:平仓 2 单位(保护大部分利润)\\n - 持仓 = 2单位:平仓 1-2 单位(盈利多则平2)\\n - 持仓 = 1单位:平仓 1 单位(落袋为安)\\n - **亏损状态**:\\n - 持仓 >= 3单位:平仓 2 单位(止损大部分)\\n - 持仓 = 2单位:平仓 1 单位(减损观察)\\n - 持仓 = 1单位:平仓 1 单位(果断止损)\\n - **无信号(NONE)+ 一般负面/正面**:\\n - 持仓 >= 3单位:平仓 1 单位(约1/3)\\n - 持仓 = 2单位:平仓 1 单位(一半)\\n - 持仓 = 1单位:观望或全平\\n - **三大原则**:\\n 1. 信号越强,平仓比例越大\\n 2. 盈利时遇反向信号,平仓更果断\\n 3. 亏损时遇反向信号,止损更坚决\\n\\n8. **持仓数量计算准确**:\\n - 开仓:positionAfterAction = multiplier\\n - 加仓:positionAfterAction = currentPositionSize + multiplier\\n - 平仓全部:positionAfterAction = 0\\n - 平仓部分:positionAfterAction = currentPositionSize - closeUnits\\n\\n9. **reasoning必须包含的信息**:\\n - 当前技术信号类型\\n - sentiment评分和等级\\n - 最新新闻的重点内容和市场环境\\n - 当前持仓数量\\n - **当前盈亏状态及金额**\\n - 平仓/加仓单位数的计算逻辑(说明为什么是这个数量)\\n - 最大持仓限制\\n - 符合的规则组\\n - 操作后的持仓数量\\n\\n10. **平仓/加仓量决策逻辑示例**:\\n - \\\"当前持仓3单位,盈利800,根据3级强反向信号且盈利状态,平仓2单位保护大部分利润\\\"\\n - \\\"当前持仓2单位,亏损-300,根据4级极强同向信号但亏损状态,谨慎加仓0.5单位优先回本\\\"\\n - \\\"当前持仓1单位,盈利500,根据3级强反向信号且盈利状态,平仓1单位落袋为安\\\"\\n\\n---\\n\\n## 分析示例\\n\\n### 示例1:无持仓 + 金叉 + 强利好新闻\\n\\n**输入数据:**\\n```json\\n{\\n \\\"signal\\\": {\\\"signal\\\": \\\"GOLDEN_CROSS\\\", \\\"description\\\": \\\"金叉出现\\\"},\\n \\\"rss\\\": [\\n {\\\"title\\\": \\\"Bitcoin breaks $100K\\\", \\\"content\\\": \\\"Institutional adoption surges...\\\"},\\n {\\\"title\\\": \\\"Major ETF approval\\\", \\\"content\\\": \\\"SEC approves spot Bitcoin ETF...\\\"},\\n {\\\"title\\\": \\\"Crypto market sentiment turns bullish\\\", \\\"content\\\": \\\"Overall market rally...\\\"}\\n ],\\n \\\"position\\\": null\\n}\\n```\\n\\n**假设 $vars.symbol = \\\"BTC_USDT\\\", $vars.maxPos = 3**\\n\\n**输出:**\\n```json\\n{\\n \\\"analysis\\\": {\\n \\\"technicalSignal\\\": \\\"GOLDEN_CROSS\\\",\\n \\\"targetSymbol\\\": \\\"BTC\\\",\\n \\\"newsAnalysis\\\": {\\n \\\"totalNews\\\": 3,\\n \\\"latestNewsWeight\\\": 1.0,\\n \\\"marketEnvironmentConsidered\\\": true,\\n \\\"summary\\\": \\\"最新新闻:BTC突破10万美元(高度相关权重1.0),ETF获批(高度相关权重1.0),整体市场转向看涨(重要相关权重0.8)\\\"\\n },\\n \\\"sentiment\\\": 0.90,\\n \\\"sentimentLevel\\\": \\\"4级(极强)\\\",\\n \\\"newsCount\\\": 3,\\n \\\"newsSummary\\\": \\\"比特币突破10万美元,ETF获批,机构采用激增,整体市场情绪转向看涨\\\",\\n \\\"keyNewsKeywords\\\": [\\\"breakout\\\", \\\"institutional\\\", \\\"adoption\\\", \\\"approval\\\", \\\"bullish\\\"],\\n \\\"positionStatus\\\": \\\"无持仓\\\",\\n \\\"currentPositionSize\\\": 0,\\n \\\"maxPositionSize\\\": 3.0,\\n \\\"canAddPosition\\\": true,\\n \\\"remainingCapacity\\\": 3.0\\n },\\n \\\"decision\\\": {\\n \\\"action\\\": \\\"OPEN_LONG\\\",\\n \\\"multiplier\\\": 2.0,\\n \\\"closeUnits\\\": 0,\\n \\\"positionAfterAction\\\": 2.0,\\n \\\"reasoning\\\": \\\"金叉信号 + sentiment 0.90(4级极强) + 最新新闻显示重大利好(BTC突破关键价位、ETF获批、整体市场看涨)+ 当前持仓0单位 < 最大持仓3单位 → 符合规则组A-4级,建议开多仓2倍基础仓位,操作后持仓2.0单位\\\",\\n \\\"riskWarning\\\": \\\"虽然信号强烈,但BTC突破整数关口后常有回调,建议设置止损\\\"\\n },\\n \\\"confidence\\\": 0.92\\n}\\n```\\n\\n### 示例2:持有3单位多仓 + 死叉 + 负面新闻(减仓场景)\\n\\n**输入数据:**\\n```json\\n{\\n \\\"signal\\\": {\\\"signal\\\": \\\"DEATH_CROSS\\\", \\\"description\\\": \\\"死叉出现\\\"},\\n \\\"rss\\\": [\\n {\\\"title\\\": \\\"Bitcoin faces selling pressure\\\", \\\"content\\\": \\\"BTC drops below key support...\\\"},\\n {\\\"title\\\": \\\"Crypto market volatility increases\\\", \\\"content\\\": \\\"Liquidations surge across market...\\\"},\\n {\\\"title\\\": \\\"Ethereum upgrade successful\\\", \\\"content\\\": \\\"ETH 2.0 milestone reached...\\\"}\\n ],\\n \\\"position\\\": {\\n \\\"Amount\\\": 3.0,\\n \\\"Type\\\": \\\"多仓\\\",\\n \\\"Profit\\\": 800\\n }\\n}\\n```\\n\\n**假设 $vars.symbol = \\\"BTC_USDT\\\", $vars.maxPos = 3**\\n\\n**输出:**\\n```json\\n{\\n \\\"analysis\\\": {\\n \\\"technicalSignal\\\": \\\"DEATH_CROSS\\\",\\n \\\"targetSymbol\\\": \\\"BTC\\\",\\n \\\"newsAnalysis\\\": {\\n \\\"totalNews\\\": 3,\\n \\\"latestNewsWeight\\\": 1.0,\\n \\\"marketEnvironmentConsidered\\\": true,\\n \\\"summary\\\": \\\"最新新闻:BTC跌破关键支撑(高度相关权重1.0),整体市场清算激增(重要相关权重0.8),ETH升级成功(一般相关权重0.5,正面但不影响BTC短期走势)\\\"\\n },\\n \\\"sentiment\\\": 0.72,\\n \\\"sentimentLevel\\\": \\\"3级(强)\\\",\\n \\\"newsCount\\\": 3,\\n \\\"newsSummary\\\": \\\"BTC跌破关键支撑位,市场波动加剧清算激增,虽然ETH有利好但不改变BTC短期压力\\\",\\n \\\"keyNewsKeywords\\\": [\\\"selling pressure\\\", \\\"drops\\\", \\\"volatility\\\", \\\"liquidations\\\"],\\n \\\"positionStatus\\\": \\\"持有多仓\\\",\\n \\\"currentPositionSize\\\": 3.0,\\n \\\"maxPositionSize\\\": 3.0,\\n \\\"canAddPosition\\\": false,\\n \\\"remainingCapacity\\\": 0\\n },\\n \\\"decision\\\": {\\n \\\"action\\\": \\\"CLOSE_PARTIAL\\\",\\n \\\"multiplier\\\": 0,\\n \\\"closeUnits\\\": 2,\\n \\\"positionAfterAction\\\": 1.0,\\n \\\"reasoning\\\": \\\"死叉信号 + sentiment 0.72(3级强) + 最新新闻显示负面(BTC跌破支撑、市场清算增加)+ 当前持仓3.0单位 = 最大持仓3.0单位 → 符合规则组D-3级。因持仓较大(3单位)且信号较强(3级),根据灵活平仓规则建议平仓2单位(对应2×{{$vars.unitPos}}),操作后持仓1.0单位,既保护当前浮盈800,又保留部分仓位观察后续走势\\\",\\n \\\"riskWarning\\\": \\\"已达最大持仓,市场波动加剧,建议对剩余1单位设置严格止损\\\"\\n },\\n \\\"confidence\\\": 0.80\\n}\\n```\\n\\n### 示例3:持有2单位多仓 + 金叉 + 极强利好(接近上限)\\n\\n**输入数据:**\\n```json\\n{\\n \\\"signal\\\": {\\\"signal\\\": \\\"GOLDEN_CROSS\\\", \\\"description\\\": \\\"金叉出现\\\"},\\n \\\"rss\\\": [\\n {\\\"title\\\": \\\"Bitcoin parabolic move begins\\\", \\\"content\\\": \\\"Historic rally underway...\\\"},\\n {\\\"title\\\": \\\"Institutional FOMO intensifies\\\", \\\"content\\\": \\\"Massive inflows recorded...\\\"},\\n {\\\"title\\\": \\\"Federal Reserve hints at rate cuts\\\", \\\"content\\\": \\\"Macro environment turns favorable...\\\"}\\n ],\\n \\\"position\\\": {\\n \\\"Amount\\\": 2,\\n \\\"Type\\\": \\\"多仓\\\",\\n \\\"Profit\\\": 1500\\n }\\n}\\n```\\n\\n**假设 $vars.symbol = \\\"BTC_USDT\\\", $vars.maxPos = 3**\\n\\n**输出:**\\n```json\\n{\\n \\\"analysis\\\": {\\n \\\"technicalSignal\\\": \\\"GOLDEN_CROSS\\\",\\n \\\"targetSymbol\\\": \\\"BTC\\\",\\n \\\"newsAnalysis\\\": {\\n \\\"totalNews\\\": 3,\\n \\\"latestNewsWeight\\\": 1.0,\\n \\\"marketEnvironmentConsidered\\\": true,\\n \\\"summary\\\": \\\"最新新闻:BTC抛物线式上涨(高度相关权重1.0),机构FOMO入场(高度相关权重1.0),美联储暗示降息(重要相关权重0.8,宏观利好)\\\"\\n },\\n \\\"sentiment\\\": 0.92,\\n \\\"sentimentLevel\\\": \\\"4级(极强)\\\",\\n \\\"newsCount\\\": 3,\\n \\\"newsSummary\\\": \\\"BTC启动抛物线行情,机构FOMO情绪高涨资金大量流入,宏观环境转向有利(美联储降息预期)\\\",\\n \\\"keyNewsKeywords\\\": [\\\"parabolic\\\", \\\"historic\\\", \\\"FOMO\\\", \\\"institutional\\\", \\\"rate cuts\\\", \\\"favorable\\\"],\\n \\\"positionStatus\\\": \\\"持有多仓\\\",\\n \\\"profitStatus\\\": \\\"盈利\\\",\\n \\\"currentProfit\\\": 1500,\\n \\\"currentPositionSize\\\": 2,\\n \\\"maxPositionSize\\\": 3,\\n \\\"canAddPosition\\\": true,\\n \\\"remainingCapacity\\\": 1\\n },\\n \\\"decision\\\": {\\n \\\"action\\\": \\\"ADD_POSITION\\\",\\n \\\"multiplier\\\": 1,\\n \\\"closeUnits\\\": 0,\\n \\\"positionAfterAction\\\": 3,\\n \\\"reasoning\\\": \\\"金叉信号 + sentiment 0.92(4级极强) + 最新新闻显示重大利好(抛物线行情、机构FOMO、宏观环境改善)+ 当前持仓2单位,盈利1500 < 最大持仓3单位,剩余容量1单位 → 符合规则组E-4级。因当前盈利状态且趋势极强,加仓1单位至上限3单位\\\",\\n \\\"profitConsideration\\\": \\\"当前盈利1500,趋势极强可积极加仓扩大盈利\\\",\\n \\\"riskWarning\\\": \\\"持仓将达到最大限制,无法继续加仓。市场情绪极度乐观需警惕过热,建议设置移动止损保护利润\\\"\\n },\\n \\\"confidence\\\": 0.80\\n}\\n```\\n\\n---\\n\\n## 开始分析\\n\\n现在,请根据上述规则分析以下数据并给出决策建议。\",\"options\":{}},\"type\":\"@n8n/n8n-nodes-langchain.agent\",\"typeVersion\":1,\"position\":[992,-208],\"id\":\"6ec9107d-8082-4595-bd3d-aeaad06d488b\",\"name\":\"AI 智能体\"},{\"parameters\":{\"operation\":\"EMA\",\"inReal\":\"={{ $json.result }}\",\"optInTimePeriod\":\"={{ $vars.shortPeriod }}\"},\"type\":\"n8n-nodes-base.ta\",\"typeVersion\":1,\"position\":[-880,-784],\"id\":\"b3111770-9e89-4bbe-b2dc-40db4868f1be\",\"name\":\"短期均线指标\"},{\"parameters\":{\"operation\":\"EMA\",\"inReal\":\"={{ $json.result }}\",\"optInTimePeriod\":\"={{$vars.longPeriod}}\"},\"type\":\"n8n-nodes-base.ta\",\"typeVersion\":1,\"position\":[-880,-592],\"id\":\"589b47b5-1ace-4e70-b0b2-76ad0f2ac087\",\"name\":\"长期均线指标\"},{\"parameters\":{\"mode\":\"append\",\"numberInputs\":2},\"type\":\"n8n-nodes-base.merge\",\"typeVersion\":3.2,\"position\":[-656,-688],\"id\":\"34833873-26dd-466c-ad77-3edb15b3a137\",\"name\":\"指标合并\"},{\"parameters\":{\"operation\":\"getRecords\",\"exchange\":0,\"symbol\":{\"__rl\":true,\"value\":\"={{$vars.symbol}}_USDT.swap\",\"mode\":\"id\"},\"period\":180,\"limit\":\"={{ $vars.longPeriod + 10}}\"},\"type\":\"n8n-nodes-base.marketInfo\",\"typeVersion\":1,\"position\":[-1104,-688],\"id\":\"cf15c454-c5d9-46b8-a1e9-9a96230ff2a7\",\"name\":\"K线获取\"},{\"parameters\":{\"mode\":\"runOnceForAllItems\",\"language\":\"javaScript\",\"jsCode\":\"// 获取短周期和长周期EMA数组\\nconst shortEMA = $input.first().json.result;\\nconst longEMA = $input.last().json.result;\\n\\n// ✅ 正确的做法:使用已完成的K线\\nconst validShortEMA = shortEMA.filter(v => v !== null);\\nconst validLongEMA = longEMA.filter(v => v !== null);\\n\\n// 检查数据是否足够\\nif (validShortEMA.length < 2 || validLongEMA.length < 2) {\\n return {\\n success: false,\\n message: \\\"EMA数据不足,无法判断交叉\\\"\\n };\\n}\\n\\n// 使用倒数第2根(最后一根已完成的K线)\\nconst currentShort = validShortEMA[validShortEMA.length - 2];\\nconst currentLong = validLongEMA[validLongEMA.length - 2];\\n\\n// 计算当前趋势\\nlet currentTrend = \\\"NONE\\\";\\nif (currentShort > currentLong) {\\n currentTrend = \\\"BULL\\\";\\n} else if (currentShort < currentLong) {\\n currentTrend = \\\"BEAR\\\";\\n} else {\\n currentTrend = \\\"NEUTRAL\\\";\\n}\\n\\n// 🔥 从 _G() 获取上一次保存的趋势\\nconst prevTrend = _G(\\\"lastTrend\\\") || \\\"NONE\\\";\\n\\n// 判断交叉信号\\nlet signal = \\\"NONE\\\";\\nlet description = \\\"\\\";\\nlet action = \\\"\\\";\\n\\n// 死叉:从多头变为空头\\nif (prevTrend === \\\"BULL\\\" && currentTrend === \\\"BEAR\\\") {\\n signal = \\\"DEATH_CROSS\\\";\\n action = \\\"SELL\\\";\\n description = `🔴 死叉信号: 短期EMA下穿长期EMA`;\\n Log(description);\\n Log(` 趋势转变: 多头 → 空头`);\\n Log(` 当前: 短期(${currentShort.toFixed(2)}) < 长期(${currentLong.toFixed(2)})`);\\n}\\n// 金叉:从空头变为多头\\nelse if (prevTrend === \\\"BEAR\\\" && currentTrend === \\\"BULL\\\") {\\n signal = \\\"GOLDEN_CROSS\\\";\\n action = \\\"BUY\\\";\\n description = `🟢 金叉信号: 短期EMA上穿长期EMA`;\\n Log(description);\\n Log(` 趋势转变: 空头 → 多头`);\\n Log(` 当前: 短期(${currentShort.toFixed(2)}) > 长期(${currentLong.toFixed(2)})`);\\n}\\n// 无交叉信号\\nelse {\\n if (currentTrend === \\\"BULL\\\") {\\n description = `多头趋势: 短期EMA在长期EMA上方`;\\n action = \\\"HOLD_LONG\\\";\\n } else if (currentTrend === \\\"BEAR\\\") {\\n description = `空头趋势: 短期EMA在长期EMA下方`;\\n action = \\\"HOLD_SHORT\\\";\\n } else {\\n description = `中性趋势: 短期EMA与长期EMA重合`;\\n action = \\\"NONE\\\";\\n }\\n Log(\\\"📊 \\\" + description);\\n}\\n\\n// 🔥 保存当前趋势到 _G(),供下次使用\\n_G(\\\"lastTrend\\\", currentTrend);\\nLog(`💾 已保存当前趋势: ${currentTrend}`);\\n\\n// 计算EMA距离\\nconst emaDistance = ((currentShort - currentLong) / currentLong * 100);\\n\\n// 返回结果\\nreturn {\\n success: true,\\n signal: signal,\\n action: action,\\n description: description,\\n \\n // 趋势状态\\n currentTrend: currentTrend,\\n prevTrend: prevTrend,\\n trendChanged: signal !== \\\"NONE\\\",\\n \\n // 当前EMA数据(已完成K线)\\n shortEMA: parseFloat(currentShort.toFixed(2)),\\n longEMA: parseFloat(currentLong.toFixed(2)),\\n \\n // 距离数据\\n emaDistance: parseFloat(emaDistance.toFixed(4)),\\n emaDistancePercent: emaDistance.toFixed(4) + \\\"%\\\",\\n \\n // 数据长度\\n shortEMALength: validShortEMA.length,\\n longEMALength: validLongEMA.length,\\n \\n // 说明使用的是已完成K线\\n usingCompletedCandles: true,\\n savedToPersistence: true,\\n \\n timestamp: Date.now(),\\n time: _D()\\n};\",\"notice\":\"\"},\"type\":\"n8n-nodes-base.code\",\"typeVersion\":2,\"position\":[-432,-688],\"id\":\"4aad0984-a134-4888-83fc-46bec9aff34b\",\"name\":\"指标计算\"},{\"parameters\":{\"mode\":\"runOnceForAllItems\",\"language\":\"javaScript\",\"jsCode\":\"const signallog = $node['指标计算'].json.signal\\nLog('⚠️:出现信号: '+ signallog + ',进行相关交易操作')\\n\\nreturn {};\",\"notice\":\"\"},\"type\":\"n8n-nodes-base.code\",\"typeVersion\":2,\"position\":[16,-304],\"id\":\"9365e285-c9e2-4651-8d96-73ad7ef8d42b\",\"name\":\"信号输出\"},{\"parameters\":{\"mode\":\"append\",\"numberInputs\":9},\"type\":\"n8n-nodes-base.merge\",\"typeVersion\":3.2,\"position\":[464,-320],\"id\":\"4420a20c-d48a-4e1e-b62c-4197b799ae3d\",\"name\":\"RSS合并\"},{\"parameters\":{\"mode\":\"runOnceForAllItems\",\"language\":\"javaScript\",\"jsCode\":\"// ============================================\\n// 清洗 + 筛选最近24小时 + 按时间排序(调试版)\\n// ============================================\\n\\nconst inputItems = $input.all();\\nconst result = [];\\n\\n// 获取24小时前的时间戳\\nconst oneDayAgo = Date.now() - (24 * 60 * 60 * 1000);\\n\\nLog('当前时间:', new Date());\\nLog('24小时前:', new Date(oneDayAgo));\\n\\n// HTML清洗\\nfunction clean(html) {\\n if (!html) return '';\\n return html\\n .replace(/<[^>]+>/g, '')\\n .replace(/&[a-z]+;/gi, ' ')\\n .replace(/\\\\s+/g, ' ')\\n .trim();\\n}\\n\\n// 处理每个item\\nfor (const item of inputItems) {\\n const raw = item.json;\\n \\n // 模糊匹配字段\\n const title = raw.title || raw.heading || '';\\n const time = raw.pubDate || raw.isoDate || raw.published || '';\\n const content = raw.content || raw['content:encoded'] || raw.contentSnippet || '';\\n \\n const timestamp = new Date(time).getTime();\\n \\n // 只保留最近24小时的数据,且时间戳有效\\n if (!isNaN(timestamp) && timestamp >= oneDayAgo) {\\n result.push({\\n title: title,\\n time: time,\\n timestamp: timestamp,\\n content: clean(content)\\n });\\n }\\n}\\n\\n// 按时间戳排序,从新到旧\\nresult.sort((a, b) => b.timestamp - a.timestamp);\\n\\n// 移除临时的timestamp字段\\nconst sortedResult = result.map(({ timestamp, ...rest }) => rest);\\n\\nreturn { rssresult: sortedResult };\\n\",\"notice\":\"\"},\"type\":\"n8n-nodes-base.code\",\"typeVersion\":2,\"position\":[656,-208],\"id\":\"ba5b2e2e-94eb-47e7-b78a-ff93b7140418\",\"name\":\"RSS整理\"},{\"parameters\":{\"mode\":\"runOnceForAllItems\",\"language\":\"javaScript\",\"jsCode\":\"let signal = $node['指标计算'].json\\nlet rsscontent = $node['RSS整理'].json.rssresult\\nlet pos = exchange.GetPositions($vars.symbol + '_USDT.swap')\\n\\n// 整理持仓数据\\nlet positionData = null\\nif (pos && pos.length > 0) {\\n let p = pos[0]\\n positionData = {\\n MarginLevel: p.MarginLevel,\\n Amount: p.Amount / $vars.unitPos, // 除以开仓单位\\n FrozenAmount: p.FrozenAmount,\\n Price: p.Price,\\n Profit: p.Profit,\\n Margin: p.Margin,\\n Type: p.Type === 0 ? \\\"多仓\\\" : \\\"空仓\\\", // 0代表多仓,否则空仓\\n Symbol: p.Symbol,\\n ContractType: p.ContractType\\n }\\n}\\n\\nreturn {\\n // 信号数据\\n signal: signal,\\n \\n // RSS内容数据\\n rss: rsscontent,\\n \\n // 持仓数据\\n position: positionData\\n};\\n\",\"notice\":\"\"},\"type\":\"n8n-nodes-base.code\",\"typeVersion\":2,\"position\":[832,-208],\"id\":\"bfbc5f74-d777-4dfd-bfb7-4d5061a4d643\",\"name\":\"信息整理\"},{\"parameters\":{\"model\":{\"__rl\":true,\"value\":\"anthropic/claude-sonnet-4.5\",\"mode\":\"list\",\"cachedResultName\":\"anthropic/claude-sonnet-4.5\"}},\"type\":\"n8n-nodes-base.lmOpenAi\",\"typeVersion\":1,\"position\":[992,-32],\"id\":\"30a8af03-b8f7-4018-8881-729e6fcfdaab\",\"name\":\"OpenAI 模型\",\"credentials\":{\"openAiApi\":{\"id\":\"54d0b567-b3fc-4c6a-b6be-546e0b9cd83f\",\"name\":\"openrouter\"}}},{\"parameters\":{\"notice\":\"\",\"rule\":{\"interval\":[{\"field\":\"minutes\",\"minutesInterval\":3}]}},\"type\":\"n8n-nodes-base.scheduleTrigger\",\"typeVersion\":1.2,\"position\":[-1472,-688],\"id\":\"04601dea-e7f5-4898-be00-6ff94e2ab21d\",\"name\":\"定时触发器\"},{\"parameters\":{\"mode\":\"runOnceForAllItems\",\"language\":\"javaScript\",\"jsCode\":\"// ========== 初始设置节点 - 带可视化表格展示 ==========\\n\\n// 1. API基础设置\\nif($vars.simulateOr){\\n const api_base = \\\"https://testnet.binancefuture.com\\\"\\n exchange.SetBase(api_base)\\n}\\n\\n// 2. 初始化资金记录\\nif (_G('initmoney') === null) {\\n const initAccount = exchange.GetAccount();\\n _G('initmoney', initAccount.Balance);\\n const symbolinfo = $vars.symbol + '_USDT.swap'\\n const marketinfo = exchange.GetMarkets()[symbolinfo]\\n _G('marketinfo', marketinfo);\\n Log('📊 初始信息记录完成: ' + initAccount.Balance + ' USDT');\\n}\\n\\n// 3. 计算当前盈亏\\nconst currentAccount = exchange.GetAccount();\\nconst currentAccountValue = currentAccount.Equity;\\nconst initMoney = _G('initmoney');\\nconst totalProfit = currentAccountValue - initMoney;\\n\\nLogProfit(totalProfit, \\\"&\\\");\\n\\n// ========== 可视化表格生成函数 ==========\\n\\nconst CONFIG = {\\n symbol: $vars.symbol + '_USDT.swap' || \\\"BTC_USDT\\\",\\n contractType: \\\"swap\\\",\\n unitPos: $vars.unitPos || 1,\\n maxPos: $vars.maxPos || 5,\\n leverage: 10\\n};\\n\\n/**\\n * 获取当前持仓信息\\n */\\nfunction getCurrentPosition(symbol) {\\n \\n const positions = exchange.GetPositions(symbol);\\n if (!positions || positions.length === 0) {\\n return null;\\n }\\n \\n const pos = positions.find(p => \\n p.Symbol.includes(symbol.split('_')[0]) && \\n Math.abs(p.Amount) > 0\\n );\\n \\n if (!pos) return null;\\n \\n const isLong = pos.Type === PD_LONG || pos.Type === 0;\\n \\n return {\\n Amount: pos.Amount,\\n Type: isLong ? \\\"多仓\\\" : \\\"空仓\\\",\\n Price: pos.Price,\\n Profit: pos.Profit,\\n MarginLevel: pos.MarginLevel,\\n rawAmount: Math.abs(pos.Amount)\\n };\\n}\\n\\n/**\\n * 获取当前价格\\n */\\nfunction getCurrentPrice(symbol) {\\n\\n const ticker = exchange.GetTicker(symbol);\\n return ticker ? ticker.Last : null;\\n}\\n\\n/**\\n * 生成AI决策分析表格\\n */\\nfunction generateAnalysisTable(decision) {\\n if (!decision) {\\n return {\\n type: \\\"table\\\",\\n title: \\\"🤖 AI决策分析\\\",\\n cols: [\\\"提示\\\"],\\n rows: [[\\\"⚪ 暂无决策数据\\\"]]\\n };\\n }\\n \\n const { analysis, decision: tradeDecision, confidence } = decision;\\n \\n const sentimentEmoji = \\n analysis.sentiment >= 0.8 ? \\\"🔥\\\" :\\n analysis.sentiment >= 0.65 ? \\\"⚡\\\" :\\n analysis.sentiment >= 0.5 ? \\\"⚠️\\\" : \\\"❄️\\\";\\n \\n const actionEmoji = {\\n 'OPEN_LONG': '🚀',\\n 'OPEN_SHORT': '📉',\\n 'ADD_POSITION': '➕',\\n 'CLOSE_PARTIAL': '📊',\\n 'CLOSE_ALL': '🔚',\\n 'NO_ACTION': '⏸️'\\n }[tradeDecision.action] || '⚪';\\n \\n const actionText = {\\n 'OPEN_LONG': '开多仓',\\n 'OPEN_SHORT': '开空仓',\\n 'ADD_POSITION': '加仓',\\n 'CLOSE_PARTIAL': '部分平仓',\\n 'CLOSE_ALL': '全部平仓',\\n 'NO_ACTION': '观望'\\n }[tradeDecision.action];\\n \\n return {\\n type: \\\"table\\\",\\n title: \\\"🤖 AI决策分析\\\",\\n cols: [\\\"指标\\\", \\\"数值\\\", \\\"说明\\\"],\\n rows: [\\n [\\\"交易对\\\", `💎 ${analysis.targetSymbol}`, CONFIG.symbol],\\n [\\\"技术信号\\\", \\n analysis.technicalSignal === \\\"GOLDEN_CROSS\\\" ? \\\"📈 金叉\\\" :\\n analysis.technicalSignal === \\\"DEATH_CROSS\\\" ? \\\"📉 死叉\\\" : \\\"⚪ 无信号\\\",\\n analysis.technicalSignal],\\n [\\\"新闻情绪\\\", \\n `${sentimentEmoji} ${_N(analysis.sentiment * 100, 0)}%`,\\n analysis.sentimentLevel],\\n [\\\"新闻数量\\\", `📰 ${analysis.newsCount}`, \\\"总计分析新闻数\\\"],\\n [\\\"持仓状态\\\", \\n analysis.positionStatus === \\\"无持仓\\\" ? \\\"⚪ 无持仓\\\" :\\n analysis.positionStatus === \\\"持有多仓\\\" ? \\\"🟢 持有多仓\\\" : \\\"🔴 持有空仓\\\",\\n `${analysis.currentPositionSize} / ${analysis.maxPositionSize} 单位`],\\n [\\\"盈亏状态\\\",\\n analysis.profitStatus === \\\"无持仓\\\" ? \\\"-\\\" :\\n analysis.currentProfit > 0 ? `🟢 +${_N(analysis.currentProfit, 2)} USDT` :\\n analysis.currentProfit < 0 ? `🔴 ${_N(analysis.currentProfit, 2)} USDT` : \\\"⚪ 0\\\",\\n analysis.profitStatus],\\n [\\\"决策操作\\\", \\n `${actionEmoji} ${actionText}`,\\n tradeDecision.action],\\n [\\\"操作数量\\\",\\n tradeDecision.action === 'NO_ACTION' ? \\\"-\\\" :\\n tradeDecision.action === 'CLOSE_PARTIAL' ? `${tradeDecision.closeUnits} 单位` :\\n tradeDecision.action === 'CLOSE_ALL' ? \\\"全部\\\" :\\n `${tradeDecision.multiplier} 单位`,\\n `预期持仓: ${tradeDecision.positionAfterAction} 单位`],\\n [\\\"决策信心\\\", \\n confidence >= 0.8 ? `🔥 ${_N(confidence * 100, 0)}%` :\\n confidence >= 0.6 ? `⚡ ${_N(confidence * 100, 0)}%` :\\n `⚠️ ${_N(confidence * 100, 0)}%`,\\n \\\"AI决策置信度\\\"]\\n ]\\n };\\n}\\n\\n/**\\n * 生成执行结果表格\\n */\\nfunction generateExecutionTable(executionResult, decision) {\\n if (!executionResult) {\\n return {\\n type: \\\"table\\\",\\n title: \\\"📋 执行结果\\\",\\n cols: [\\\"提示\\\"],\\n rows: [[\\\"⚪ 暂无执行记录\\\"]]\\n };\\n }\\n \\n const statusEmoji = executionResult.executed ? \\\"✅\\\" : \\n executionResult.error ? \\\"❌\\\" : \\\"⏸️\\\";\\n \\n const rows = [\\n [\\\"执行状态\\\", executionResult.executed ? \\\"✅ 已执行\\\" : executionResult.error ? \\\"❌ 失败\\\" : \\\"⏸️ 未执行\\\"],\\n [\\\"操作类型\\\", executionResult.action],\\n [\\\"执行时间\\\", new Date(executionResult.timestamp).toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'})],\\n [\\\"执行消息\\\", executionResult.message || \\\"-\\\"]\\n ];\\n \\n // 添加详细信息\\n if (executionResult.details) {\\n const details = executionResult.details;\\n if (details.units) {\\n rows.push([\\\"操作单位\\\", `${details.units} 单位`]);\\n rows.push([\\\"实际数量\\\", `${_N(details.units * CONFIG.unitPos, 6)}`]);\\n }\\n if (details.orderId) {\\n rows.push([\\\"订单ID\\\", details.orderId]);\\n }\\n if (details.beforePosition !== undefined) {\\n rows.push([\\\"操作前持仓\\\", `${details.beforePosition} 单位`]);\\n }\\n if (details.afterPosition !== undefined) {\\n rows.push([\\\"操作后持仓\\\", `${details.afterPosition} 单位`]);\\n }\\n if (details.profit !== undefined) {\\n const profitEmoji = details.profit > 0 ? \\\"🟢\\\" : details.profit < 0 ? \\\"🔴\\\" : \\\"⚪\\\";\\n rows.push([\\\"结算盈亏\\\", `${profitEmoji} ${_N(details.profit, 2)} USDT`]);\\n }\\n }\\n \\n if (executionResult.error) {\\n rows.push([\\\"❌ 错误信息\\\", executionResult.error]);\\n }\\n \\n // 添加决策推理\\n if (decision && decision.decision) {\\n rows.push([\\\"决策推理\\\", decision.decision.reasoning]);\\n \\n if (decision.decision.riskWarning) {\\n rows.push([\\\"⚠️ 风险提示\\\", decision.decision.riskWarning]);\\n }\\n }\\n \\n return {\\n type: \\\"table\\\",\\n title: `${statusEmoji} 执行结果`,\\n cols: [\\\"项目\\\", \\\"内容\\\"],\\n rows: rows\\n };\\n}\\n\\n/**\\n * 生成持仓监控表格\\n */\\nfunction generatePositionTable() {\\n const position = getCurrentPosition(CONFIG.symbol);\\n const currentPrice = getCurrentPrice(CONFIG.symbol);\\n \\n if (!position || !currentPrice) {\\n return {\\n type: \\\"table\\\",\\n title: \\\"💼 持仓监控\\\",\\n cols: [\\\"提示\\\"],\\n rows: [[\\\"⚪ 当前无持仓\\\"]]\\n };\\n }\\n \\n const isLong = position.Type === \\\"多仓\\\";\\n const pnlPercent = _N((currentPrice - position.Price) * (isLong ? 1 : -1) / position.Price * 100, 2);\\n \\n let pnlDisplay = \\\"\\\";\\n if (pnlPercent > 0) pnlDisplay = `🟢 +${pnlPercent}%`;\\n else if (pnlPercent < 0) pnlDisplay = `🔴 ${pnlPercent}%`;\\n else pnlDisplay = `⚪ ${pnlPercent}%`;\\n \\n return {\\n type: \\\"table\\\",\\n title: \\\"💼 持仓监控\\\",\\n cols: [\\\"项目\\\", \\\"数值\\\"],\\n rows: [\\n [\\\"交易对\\\", `💎 ${CONFIG.symbol.split('_')[0]}`],\\n [\\\"持仓方向\\\", isLong ? \\\"📈 多仓\\\" : \\\"📉 空仓\\\"],\\n [\\\"持仓单位\\\", `${position.Amount} 单位`],\\n [\\\"实际数量\\\", `${_N(position.rawAmount, 6)}`],\\n [\\\"持仓均价\\\", `$${_N(position.Price, 2)}`],\\n [\\\"当前价格\\\", `$${_N(currentPrice, 2)}`],\\n [\\\"浮动盈亏\\\", pnlDisplay],\\n [\\\"盈亏金额\\\", `${_N(position.Profit, 2)} USDT`],\\n [\\\"杠杆倍数\\\", `${position.MarginLevel}x`],\\n [\\\"最大持仓\\\", `${CONFIG.maxPos} 单位`],\\n [\\\"剩余容量\\\", `${_N(CONFIG.maxPos - position.Amount / $vars.unitPos, 2)} 单位`]\\n ]\\n };\\n}\\n\\n/**\\n * 生成账户总览表格\\n */\\nfunction generateAccountTable() {\\n const profitPercent = _N(totalProfit / initMoney * 100, 2);\\n \\n let profitDisplay = \\\"\\\";\\n if (profitPercent > 0) profitDisplay = `🟢 +${profitPercent}%`;\\n else if (profitPercent < 0) profitDisplay = `🔴 ${profitPercent}%`;\\n else profitDisplay = `⚪ ${profitPercent}%`;\\n \\n return {\\n type: \\\"table\\\",\\n title: \\\"💰 账户总览\\\",\\n cols: [\\\"项目\\\", \\\"数值\\\"],\\n rows: [\\n [\\\"初始资金\\\", `${_N(initMoney, 2)} USDT`],\\n [\\\"当前权益\\\", `${_N(currentAccountValue, 2)} USDT`],\\n [\\\"累计盈亏\\\", `${_N(totalProfit, 2)} USDT`],\\n [\\\"收益率\\\", profitDisplay],\\n [\\\"可用余额\\\", `${_N(currentAccount.Balance, 2)} USDT`],\\n [\\\"冻结保证金\\\", `${_N(currentAccount.FrozenBalance, 2)} USDT`],\\n [\\\"更新时间\\\", _D()]\\n ]\\n };\\n}\\n\\n// ========== 读取保存的数据并生成表格 ==========\\n\\nconst lastDecision = _G('lastDecision');\\nconst lastExecution = _G('lastExecution');\\nconst lastUpdateTime = _G('lastUpdateTime');\\n\\n// 生成所有表格\\nconst accountTable = generateAccountTable();\\nconst positionTable = generatePositionTable();\\nconst analysisTable = generateAnalysisTable(lastDecision);\\nconst executionTable = generateExecutionTable(lastExecution, lastDecision);\\n\\n// 组合状态栏显示\\nlet statusDisplay = '`' + JSON.stringify(accountTable) + '`\\\\n\\\\n';\\nstatusDisplay += '`' + JSON.stringify(positionTable) + '`\\\\n\\\\n';\\nstatusDisplay += '`' + JSON.stringify(analysisTable) + '`\\\\n\\\\n';\\nstatusDisplay += '`' + JSON.stringify(executionTable) + '`';\\n\\n// 添加更新时间提示\\nif (lastUpdateTime) {\\n const timeSinceUpdate = Math.floor((Date.now() - lastUpdateTime) / 1000);\\n statusDisplay += `\\\\n\\\\n⏱️ 上次决策: ${timeSinceUpdate}秒前`;\\n}\\n\\n// 显示状态\\nLogStatus(statusDisplay);\\n\\nreturn {};\",\"notice\":\"\"},\"type\":\"n8n-nodes-base.code\",\"typeVersion\":2,\"position\":[-1280,-688],\"id\":\"f86490b7-38fd-4575-b82b-92bb1bec9f51\",\"name\":\"初始设置\"},{\"parameters\":{\"logAll\":false,\"output\":\"🍃:当前无信号\"},\"type\":\"n8n-nodes-base.log\",\"typeVersion\":1,\"position\":[16,-784],\"id\":\"8ea89071-fa48-4fe0-8728-ed5643afc03f\",\"name\":\"日志\"},{\"parameters\":{\"mode\":\"runOnceForAllItems\",\"language\":\"javaScript\",\"jsCode\":\"// ========== 配置参数 ==========\\nconst CONFIG = {\\n symbol: $vars.symbol + '_USDT.swap' || \\\"BTC_USDT.swap\\\",\\n contractType: \\\"swap\\\",\\n unitPos: $vars.unitPos || 0.01,\\n maxPos: $vars.maxPos || 5,\\n leverage: 10\\n};\\n\\n// ========== 工具函数 ==========\\n\\n/**\\n * 解析AI输出的JSON\\n */\\nfunction parseAIOutput(output) {\\n try {\\n const cleaned = output.replace(/```[a-z]*\\\\n?/gi, '').trim();\\n const start = cleaned.indexOf('{');\\n const end = cleaned.lastIndexOf('}');\\n \\n if (start === -1 || end === -1) {\\n throw new Error('未找到有效的JSON结构');\\n }\\n \\n const jsonStr = cleaned.substring(start, end + 1);\\n const parsed = JSON.parse(jsonStr);\\n \\n Log('✅ AI决策解析成功');\\n return { success: true, data: parsed, error: null };\\n } catch (e) {\\n Log(`❌ JSON解析失败: ${e.message}`);\\n return { success: false, data: null, error: e.message };\\n }\\n}\\n\\n/**\\n * 获取当前持仓信息\\n */\\nfunction getCurrentPosition(symbol) {\\n\\n const positions = exchange.GetPositions(symbol);\\n if (!positions || positions.length === 0) {\\n return null;\\n }\\n \\n const pos = positions.find(p => \\n p.Symbol.includes(symbol.split('_')[0]) && \\n Math.abs(p.Amount) > 0\\n );\\n \\n if (!pos) return null;\\n \\n const isLong = pos.Type === PD_LONG || pos.Type === 0;\\n \\n return {\\n Amount: _N(Math.abs(pos.Amount) / CONFIG.unitPos, 3), // 转换为单位数\\n Type: isLong ? \\\"多仓\\\" : \\\"空仓\\\",\\n Price: pos.Price,\\n Profit: pos.Profit,\\n MarginLevel: pos.MarginLevel,\\n rawAmount: Math.abs(pos.Amount) // 原始数量\\n };\\n}\\n\\n/**\\n * 获取当前价格\\n */\\nfunction getCurrentPrice(symbol) {\\n\\n const ticker = exchange.GetTicker(symbol);\\n return ticker ? ticker.Last : null;\\n}\\n\\n/**\\n * 检查开仓/加仓数量是否合理\\n */\\nfunction validateOpenQuantity(units, currentPositionUnits = 0) {\\n // 检查是否为正数\\n if (units <= 0) {\\n return { valid: false, reason: '数量必须大于0' };\\n }\\n \\n // 检查加仓后是否超过最大持仓\\n const afterPosition = currentPositionUnits + units;\\n if (afterPosition > CONFIG.maxPos) {\\n return { \\n valid: false, \\n reason: `加仓后持仓${afterPosition}单位将超过最大限制${CONFIG.maxPos}单位` \\n };\\n }\\n \\n return { valid: true, reason: null };\\n}\\n\\n/**\\n * 检查平仓数量是否合理\\n */\\nfunction validateCloseQuantity(units, currentPositionUnits) {\\n // 检查是否有持仓\\n if (!currentPositionUnits || currentPositionUnits <= 0) {\\n return { valid: false, reason: '当前无持仓,无法平仓' };\\n }\\n \\n // 检查是否为正数\\n if (units <= 0) {\\n return { valid: false, reason: '平仓数量必须大于0' };\\n }\\n \\n // 检查平仓数量是否超过持仓\\n if (units > currentPositionUnits) {\\n return { \\n valid: false, \\n reason: `平仓${units}单位超过当前持仓${currentPositionUnits}单位` \\n };\\n }\\n \\n return { valid: true, reason: null };\\n}\\n\\n/**\\n * 检查订单是否满足最小名义价值要求\\n */\\nfunction validateMinNotional(symbol, quantity) {\\n try {\\n const marketinfo = _G('marketinfo');\\n if (!marketinfo || !marketinfo.MinNotional) {\\n Log('⚠️ 未找到市场信息或MinNotional,跳过检查');\\n return { valid: true, reason: null };\\n }\\n \\n // 获取当前价格\\n const currentPrice = getCurrentPrice(symbol);\\n if (!currentPrice) {\\n return { valid: false, reason: '无法获取当前价格' };\\n }\\n \\n // 计算订单名义价值\\n const notionalValue = currentPrice * quantity;\\n \\n Log(`📊 名义价值检查: 当前价格=${currentPrice}, 数量=${quantity}, 名义价值=${_N(notionalValue, 2)}, 最小要求=${marketinfo.MinNotional}`);\\n \\n if (notionalValue < marketinfo.MinNotional) {\\n return {\\n valid: false,\\n reason: `订单名义价值 ${_N(notionalValue, 2)} 小于最小要求 ${marketinfo.MinNotional}`\\n };\\n }\\n \\n return { valid: true, reason: null };\\n \\n } catch (e) {\\n Log(`❌ MinNotional检查异常: ${e.message}`);\\n return { valid: false, reason: e.message };\\n }\\n}\\n\\n// ========== 交易执行函数 ==========\\n\\n/**\\n * 开仓(多/空)- 使用CreateOrder\\n */\\nfunction openPosition(symbol, direction, units) {\\n try {\\n\\n // 检查数量合理性\\n const validation = validateOpenQuantity(units, 0);\\n if (!validation.valid) {\\n Log(`⚠️ 开仓数量验证失败: ${validation.reason}`);\\n return { success: false, error: validation.reason };\\n }\\n \\n // 计算实际下单数量\\n const quantity = units * CONFIG.unitPos;\\n \\n // ✅ 新增:检查最小名义价值\\n const notionalCheck = validateMinNotional(symbol, quantity);\\n if (!notionalCheck.valid) {\\n Log(`⚠️ 开仓名义价值验证失败: ${notionalCheck.reason}`);\\n return { success: false, error: notionalCheck.reason };\\n }\\n \\n Log(`📝 准备开仓: 方向=${direction}, 单位=${units}, 实际数量=${quantity}`);\\n \\n // ✅ 正确的参数: symbol, side, price, amount\\n const orderType = direction === \\\"buy\\\" ? \\\"buy\\\" : \\\"sell\\\";\\n const orderId = exchange.CreateOrder(symbol, orderType, -1, quantity);\\n \\n if (orderId) {\\n Sleep(1000);\\n Log(`✅ ${symbol}: 开${direction === \\\"buy\\\" ? '多' : '空'}仓成功`);\\n Log(` 单位数: ${units}, 实际数量: ${quantity}, 杠杆: ${CONFIG.leverage}x`);\\n return { \\n success: true, \\n orderId: orderId,\\n quantity: quantity,\\n units: units\\n };\\n } else {\\n Log(`❌ ${symbol}: 开仓失败`);\\n return { success: false, error: '下单失败' };\\n }\\n } catch (e) {\\n Log(`❌ 开仓异常: ${e.message}`);\\n return { success: false, error: e.message };\\n }\\n}\\n\\n/**\\n * 加仓 - 使用CreateOrder\\n */\\nfunction addPosition(symbol, direction, units) {\\n try {\\n // 获取当前持仓\\n const currentPos = getCurrentPosition(symbol);\\n if (!currentPos) {\\n Log(`⚠️ 无持仓,无法加仓`);\\n return { success: false, error: '无持仓' };\\n }\\n \\n // 检查加仓数量合理性\\n const validation = validateOpenQuantity(units, currentPos.Amount);\\n if (!validation.valid) {\\n Log(`⚠️ 加仓数量验证失败: ${validation.reason}`);\\n return { success: false, error: validation.reason };\\n }\\n \\n \\n // 计算实际下单数量\\n const quantity = units * CONFIG.unitPos;\\n \\n // ✅ 新增:检查最小名义价值\\n const notionalCheck = validateMinNotional(symbol, quantity);\\n if (!notionalCheck.valid) {\\n Log(`⚠️ 加仓名义价值验证失败: ${notionalCheck.reason}`);\\n return { success: false, error: notionalCheck.reason };\\n }\\n \\n Log(`📝 准备加仓: 方向=${direction}, 单位=${units}, 实际数量=${quantity}`);\\n Log(` 当前持仓: ${currentPos.Amount}单位, 加仓后: ${currentPos.Amount + units}单位`);\\n \\n // ✅ 正确的参数: symbol, side, price, amount\\n const orderType = direction === \\\"buy\\\" ? \\\"buy\\\" : \\\"sell\\\";\\n const orderId = exchange.CreateOrder(symbol, orderType, -1, quantity);\\n \\n if (orderId) {\\n Sleep(1000);\\n Log(`✅ ${symbol}: 加${direction === \\\"buy\\\" ? '多' : '空'}仓成功`);\\n Log(` 加仓单位: ${units}, 持仓从 ${currentPos.Amount} 增至 ${currentPos.Amount + units}`);\\n return { \\n success: true, \\n orderId: orderId,\\n quantity: quantity,\\n units: units,\\n beforePosition: currentPos.Amount,\\n afterPosition: currentPos.Amount + units\\n };\\n } else {\\n Log(`❌ ${symbol}: 加仓失败`);\\n return { success: false, error: '加仓下单失败' };\\n }\\n } catch (e) {\\n Log(`❌ 加仓异常: ${e.message}`);\\n return { success: false, error: e.message };\\n }\\n}\\n\\n/**\\n * 平仓(部分/全部)- 使用CreateOrder\\n */\\nfunction closePosition(symbol, units, isCloseAll = false) {\\n try {\\n \\n // 取消所有挂单\\n const orders = exchange.GetOrders();\\n if (orders && orders.length > 0) {\\n orders.forEach(o => exchange.CancelOrder(o.Id));\\n Log(`🗑️ 取消了 ${orders.length} 个挂单`);\\n }\\n \\n // 获取当前持仓\\n const currentPos = getCurrentPosition(symbol);\\n if (!currentPos) {\\n Log(`⚠️ ${symbol}: 无持仓,无需平仓`);\\n return { success: false, error: '无持仓' };\\n }\\n \\n // 确定平仓数量\\n let closeUnits;\\n if (isCloseAll) {\\n closeUnits = currentPos.Amount;\\n Log(`📝 准备全部平仓: ${closeUnits}单位`);\\n } else {\\n // 检查平仓数量合理性\\n const validation = validateCloseQuantity(units, currentPos.Amount);\\n if (!validation.valid) {\\n Log(`⚠️ 平仓数量验证失败: ${validation.reason}`);\\n return { success: false, error: validation.reason };\\n }\\n closeUnits = units;\\n Log(`📝 准备部分平仓: ${closeUnits}单位 / ${currentPos.Amount}单位`);\\n }\\n \\n // 计算实际平仓数量\\n const closeQuantity = closeUnits * CONFIG.unitPos;\\n \\n // 确定平仓方向\\n const isLong = currentPos.Type === \\\"多仓\\\";\\n const closeType = isLong ? \\\"closebuy\\\" : \\\"closesell\\\";\\n \\n Log(` 持仓方向: ${currentPos.Type}, 平仓类型: ${closeType}`);\\n Log(` 平仓单位: ${closeUnits}, 实际数量: ${closeQuantity}`);\\n \\n // ✅ 正确的参数: symbol, side, price, amount\\n const orderId = exchange.CreateOrder(symbol, closeType, -1, closeQuantity);\\n \\n if (orderId) {\\n Sleep(1000);\\n const afterPosition = currentPos.Amount - closeUnits;\\n Log(`✅ ${symbol}: 平${isLong ? '多' : '空'}仓成功`);\\n Log(` 平仓单位: ${closeUnits}, 持仓从 ${currentPos.Amount} 降至 ${afterPosition}`);\\n Log(` 结算盈亏: ${_N(currentPos.Profit, 2)} USDT`);\\n \\n return { \\n success: true, \\n orderId: orderId,\\n quantity: closeQuantity,\\n units: closeUnits,\\n profit: currentPos.Profit,\\n beforePosition: currentPos.Amount,\\n afterPosition: afterPosition\\n };\\n } else {\\n Log(`❌ ${symbol}: 平仓失败`);\\n return { success: false, error: '平仓下单失败' };\\n }\\n } catch (e) {\\n Log(`❌ 平仓异常: ${e.message}`);\\n return { success: false, error: e.message };\\n }\\n}\\n\\n/**\\n * 执行AI交易决策\\n */\\nfunction executeAIDecision(decision) {\\n const { analysis, decision: tradeDecision } = decision;\\n const { action, multiplier, closeUnits } = tradeDecision;\\n \\n const symbol = CONFIG.symbol;\\n const executionResult = {\\n executed: false,\\n action: action,\\n details: {},\\n timestamp: new Date().toISOString(),\\n error: null\\n };\\n \\n try {\\n Log(`\\\\n========== 开始执行AI决策 ==========`);\\n Log(`操作类型: ${action}`);\\n \\n switch (action) {\\n case 'OPEN_LONG':\\n // 开多仓\\n Log(`\\\\n🚀 执行开多仓操作...`);\\n const longResult = openPosition(symbol, \\\"buy\\\", multiplier);\\n executionResult.executed = longResult.success;\\n executionResult.details = longResult;\\n executionResult.message = longResult.success ? \\n `✅ 成功开多仓 ${multiplier} 单位 (${multiplier * CONFIG.unitPos})` : \\n `❌ 开多仓失败: ${longResult.error}`;\\n break;\\n \\n case 'OPEN_SHORT':\\n // 开空仓\\n Log(`\\\\n📉 执行开空仓操作...`);\\n const shortResult = openPosition(symbol, \\\"sell\\\", multiplier);\\n executionResult.executed = shortResult.success;\\n executionResult.details = shortResult;\\n executionResult.message = shortResult.success ? \\n `✅ 成功开空仓 ${multiplier} 单位 (${multiplier * CONFIG.unitPos})` : \\n `❌ 开空仓失败: ${shortResult.error}`;\\n break;\\n \\n case 'ADD_POSITION':\\n // 加仓\\n Log(`\\\\n➕ 执行加仓操作...`);\\n const currentPos = getCurrentPosition(symbol);\\n if (!currentPos) {\\n throw new Error('无持仓,无法加仓');\\n }\\n \\n const addDirection = currentPos.Type === \\\"多仓\\\" ? \\\"buy\\\" : \\\"sell\\\";\\n const addResult = addPosition(symbol, addDirection, multiplier);\\n \\n executionResult.executed = addResult.success;\\n executionResult.details = addResult;\\n executionResult.message = addResult.success ? \\n `✅ 成功加仓 ${multiplier} 单位,持仓从 ${currentPos.Amount} 增至 ${currentPos.Amount + multiplier}` :\\n `❌ 加仓失败: ${addResult.error}`;\\n break;\\n \\n case 'CLOSE_PARTIAL':\\n // 部分平仓\\n Log(`\\\\n📊 执行部分平仓操作...`);\\n const partialResult = closePosition(symbol, closeUnits, false);\\n executionResult.executed = partialResult.success;\\n executionResult.details = partialResult;\\n executionResult.message = partialResult.success ? \\n `✅ 成功平仓 ${closeUnits} 单位,盈亏: ${_N(partialResult.profit, 2)} USDT` :\\n `❌ 部分平仓失败: ${partialResult.error}`;\\n break;\\n \\n case 'CLOSE_ALL':\\n // 全部平仓\\n Log(`\\\\n🔚 执行全部平仓操作...`);\\n const closeAllResult = closePosition(symbol, 0, true);\\n executionResult.executed = closeAllResult.success;\\n executionResult.details = closeAllResult;\\n executionResult.message = closeAllResult.success ? \\n `✅ 成功清空所有持仓 ${closeAllResult.units} 单位,结算盈亏: ${_N(closeAllResult.profit, 2)} USDT` :\\n `❌ 全部平仓失败: ${closeAllResult.error}`;\\n break;\\n \\n case 'NO_ACTION':\\n // 不操作\\n Log(`\\\\n⏸️ 无需操作,维持现状`);\\n executionResult.executed = false;\\n executionResult.details = {\\n direction: '观望',\\n reason: tradeDecision.reasoning,\\n currentPosition: analysis.currentPositionSize\\n };\\n executionResult.message = `⏸️ 无操作,维持当前持仓 ${analysis.currentPositionSize} 单位`;\\n break;\\n \\n default:\\n throw new Error(`未知操作类型: ${action}`);\\n }\\n \\n Log(`\\\\n执行结果: ${executionResult.message}`);\\n Log(`========== AI决策执行完成 ==========\\\\n`);\\n \\n } catch (e) {\\n executionResult.error = e.message;\\n executionResult.message = `❌ 交易执行失败: ${e.message}`;\\n Log(`❌ ${executionResult.message}`);\\n }\\n \\n return executionResult;\\n}\\n\\n// ========== 主执行流程 ==========\\n\\n\\nLog(\\\"🚀 AI交易决策执行器启动\\\");\\n\\n// 1. 从输入获取AI决策数据\\nconst inputData = $input.first().json;\\n\\n// ✅ 关键:检查是否是自己的输出(避免循环)\\nif (inputData && inputData.success !== undefined && inputData.executed !== undefined) {\\n Log('⚠️ 检测到执行器自己的输出,跳过处理');\\n return inputData;\\n}\\n\\nconst rawOutput = inputData.output || inputData;\\n\\nLog('📥 接收到的原始数据:');\\nLog(typeof rawOutput === 'string' ? rawOutput : JSON.stringify(rawOutput));\\n\\n// ✅ 再次检查:如果 rawOutput 已经是解析好的决策对象\\nif (rawOutput && rawOutput.decision && rawOutput.analysis) {\\n Log('✅ 输入已是解析好的决策对象,直接使用');\\n const decision = rawOutput;\\n \\n // 直接跳到执行步骤\\n const executionResult = executeAIDecision(decision);\\n \\n // 保存结果到全局变量(供初始设置节点读取)\\n _G('lastDecision', decision);\\n _G('lastExecution', executionResult);\\n _G('lastUpdateTime', Date.now());\\n \\n Log('✅ 分析结果已保存到全局变量');\\n \\n return {\\n json: {\\n success: true,\\n executed: executionResult.executed,\\n action: executionResult.action,\\n message: executionResult.message,\\n decision: decision.decision,\\n analysis: decision.analysis,\\n executionDetails: executionResult.details\\n }\\n };\\n}\\n\\n// 2. 解析AI输出\\nconst parseResult = parseAIOutput(rawOutput);\\nif (!parseResult.success) {\\n Log(`❌ 解析失败: ${parseResult.error}`);\\n return { json: { success: false, error: parseResult.error } };\\n}\\n\\nconst decision = parseResult.data;\\n\\n// 3. 执行交易决策\\nconst executionResult = executeAIDecision(decision);\\n\\n// 4. 保存结果到全局变量(供初始设置节点读取)\\n_G('lastDecision', decision);\\n_G('lastExecution', executionResult);\\n_G('lastUpdateTime', Date.now());\\n\\nLog('✅ 分析结果已保存到全局变量');\\n\\n// 5. 返回结果\\nreturn {\\n json: {\\n success: true,\\n executed: executionResult.executed,\\n action: executionResult.action,\\n message: executionResult.message,\\n decision: decision.decision,\\n analysis: decision.analysis,\\n executionDetails: executionResult.details\\n }\\n};\",\"notice\":\"\"},\"type\":\"n8n-nodes-base.code\",\"typeVersion\":2,\"position\":[1328,-208],\"id\":\"baa6bc1d-d277-47bd-ad12-d892299234c5\",\"name\":\"交易执行\"}],\"pinData\":{},\"connections\":{\"cointelegraph\":{\"main\":[[{\"node\":\"RSS合并\",\"type\":\"main\",\"index\":0}]]},\"bitcoinmagazine\":{\"main\":[[{\"node\":\"RSS合并\",\"type\":\"main\",\"index\":1}]]},\"coindesk\":{\"main\":[[{\"node\":\"RSS合并\",\"type\":\"main\",\"index\":2}]]},\"cryptobriefing\":{\"main\":[[{\"node\":\"RSS合并\",\"type\":\"main\",\"index\":3}]]},\"bitcoinist\":{\"main\":[[{\"node\":\"RSS合并\",\"type\":\"main\",\"index\":4}]]},\"cryptonews\":{\"main\":[[{\"node\":\"RSS合并\",\"type\":\"main\",\"index\":5}]]},\"newsbtc\":{\"main\":[[{\"node\":\"RSS合并\",\"type\":\"main\",\"index\":6}]]},\"cryptopotato\":{\"main\":[[{\"node\":\"RSS合并\",\"type\":\"main\",\"index\":7}]]},\"99bitcoins\":{\"main\":[[{\"node\":\"RSS合并\",\"type\":\"main\",\"index\":8}]]},\"条件判断\":{\"main\":[[{\"node\":\"日志\",\"type\":\"main\",\"index\":0}],[{\"node\":\"信号输出\",\"type\":\"main\",\"index\":0}]]},\"短期均线指标\":{\"main\":[[{\"node\":\"指标合并\",\"type\":\"main\",\"index\":0}]]},\"长期均线指标\":{\"main\":[[{\"node\":\"指标合并\",\"type\":\"main\",\"index\":1}]]},\"指标合并\":{\"main\":[[{\"node\":\"指标计算\",\"type\":\"main\",\"index\":0}]]},\"K线获取\":{\"main\":[[{\"node\":\"短期均线指标\",\"type\":\"main\",\"index\":0},{\"node\":\"长期均线指标\",\"type\":\"main\",\"index\":0}]]},\"指标计算\":{\"main\":[[{\"node\":\"条件判断\",\"type\":\"main\",\"index\":0}]]},\"信号输出\":{\"main\":[[{\"node\":\"cointelegraph\",\"type\":\"main\",\"index\":0},{\"node\":\"bitcoinmagazine\",\"type\":\"main\",\"index\":0},{\"node\":\"coindesk\",\"type\":\"main\",\"index\":0},{\"node\":\"cryptobriefing\",\"type\":\"main\",\"index\":0},{\"node\":\"bitcoinist\",\"type\":\"main\",\"index\":0},{\"node\":\"cryptonews\",\"type\":\"main\",\"index\":0},{\"node\":\"newsbtc\",\"type\":\"main\",\"index\":0},{\"node\":\"cryptopotato\",\"type\":\"main\",\"index\":0},{\"node\":\"99bitcoins\",\"type\":\"main\",\"index\":0}]]},\"RSS合并\":{\"main\":[[{\"node\":\"RSS整理\",\"type\":\"main\",\"index\":0}]]},\"RSS整理\":{\"main\":[[{\"node\":\"信息整理\",\"type\":\"main\",\"index\":0}]]},\"信息整理\":{\"main\":[[{\"node\":\"AI 智能体\",\"type\":\"main\",\"index\":0}]]},\"OpenAI 模型\":{\"ai_languageModel\":[[{\"node\":\"AI 智能体\",\"type\":\"ai_languageModel\",\"index\":0}]]},\"AI 智能体\":{\"main\":[[{\"node\":\"交易执行\",\"type\":\"main\",\"index\":0}]]},\"定时触发器\":{\"main\":[[{\"node\":\"初始设置\",\"type\":\"main\",\"index\":0}]]},\"初始设置\":{\"main\":[[{\"node\":\"K线获取\",\"type\":\"main\",\"index\":0}]]}},\"active\":false,\"settings\":{\"timezone\":\"Asia/Shanghai\",\"executionOrder\":\"v1\"},\"tags\":[],\"meta\":{\"templateCredsSetupCompleted\":true},\"credentials\":{},\"id\":\"22153d8e-0006-46b1-9be8-0103e800828a\",\"plugins\":{},\"mcpClients\":{}},\"startNodes\":[],\"triggerToStartFrom\":{\"name\":\"定时触发器\"}}"}