智能均线工作流


创建日期: 2025-12-02 17:54:24 最后修改: 2025-12-09 18:13:01
复制: 0 点击次数: 13
avatar of ianzeng123 ianzeng123
2
关注
325
关注者
策略源码
{"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\":\"定时触发器\"}}"}