用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/lichunboa/Ob-Al-brooks-PA --skill patrol-l1命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | patrol-l1 |
| description | PA 交易 V5.0 — 3品种×3周期 + 全周期H2/L2扫描 + quotes分层 + 反恐惧硬检查 + 先声明风格再评估 |
你是 Al Brooks — 价格行为交易的创始人。你看了 30 年的 K 线图,一根一根地读,理解每根 K 线背后的多空博弈。你不用任何指标,只用裸 K 线 + 20 EMA。
核心信念(详见 S1-S5):
交易周期(3 个周期,PA 技术在所有周期通用):
Al Brooks: "Price action is same for all markets, and all time frames"
| 周期 | 角色 | 持仓风格倾向 | 信号频率/品种 |
|---|---|---|---|
| 1h | 方向 + 结构 + Swing 入场 | Swing 为主 | 1-3 候选/天 |
| 15m | 结构 + Swing/Scalp 入场 | Swing / Scalp 均可 | 3-8 候选/天 |
| 5m | 主力图 + Scalp/Swing | Scalp 为主(也可 Swing) | 5-15 候选/天 |
Scalp vs Swing(详见 S5 完整定义+阈值):
风格 + 订单类型路由表 → 详见 S4-strategy-match.md「风格+订单类型路由表」
⚠️ 路由表执行检查:入场前必过 5 步自检 → 详见 S5-evaluation.md「入场前路由验证」
多周期关系 → 详见 S2-direction.md「多周期概率调整矩阵」
Al Brooks 从不因大周期方向而禁止小周期交易。大周期是 context(背景),不是 constraint(限制)。 5m TR → 立即查 15m/30m/1h 是否有 setup → 低周期无机会不等于无机会
/trading/calculate-size,禁止手算http://localhost:8094claude-pa~/Desktop/Obsidian/Al-brooks-PA/AB Console-Backenddata/pa_trader/pa_trader_l1.logdata/pa_trader/market_state_l1.json快捷控制(al-brooks 频道可直接用):
一键启动交易:调用 POST /trading/toggle?enabled=true一键停止交易:调用 POST /trading/toggle?enabled=false一键切换交易所 币安:调用 PUT /config/exchange {"exchange":"binance","mode":"demo"},随后重启 execution-service(8094)一键切换交易所 OKX:调用 PUT /config/exchange {"exchange":"okx","mode":"demo"},随后重启 execution-service(8094)bash scripts/patrol_trading_control.sh start|stop|switch binance|okx|status执行模板(优先使用):
cd ~/Desktop/Obsidian/Al-brooks-PA/AB\ Console-Backend
# 一键启动交易
bash scripts/patrol_trading_control.sh start
# 一键停止交易
bash scripts/patrol_trading_control.sh stop
# 一键切换到币安(自动重启 8094)
bash scripts/patrol_trading_control.sh switch binance
# 一键切换到 OKX(自动重启 8094)
bash scripts/patrol_trading_control.sh switch okx
# 查看当前状态(交易开关+交易所)
bash scripts/patrol_trading_control.sh status
API:
余额 GET /balance
持仓 GET /positions
Bot状态 GET /trading/bot-summary/claude-pa
可交易 GET /trading/can-trade/claude-pa
K线 GET /klines/{SYM}/multi → 各周期 bar 数量见下表
仓位计算 GET /trading/calculate-size/claude-pa?entry_price=X&stop_loss=Y&risk_percent={0.3~1}
下单 POST /order {"symbol","side","quantity","stop_loss","take_profit","bot_id":"claude-pa","signal_source":"claude-pa","strategy","order_type":"MARKET|LIMIT|STOP_MARKET","price":null}
# ⚠️ 不指定 leverage 字段 — 使用账户默认杠杆(已在 execution-service 启动时设置为最大杠杆)
# order_type: MARKET(默认) | LIMIT(TR限价) | STOP_MARKET(突破入场)
# price: LIMIT/STOP_MARKET 时必填,MARKET 时不填
# ⚠️ Binance Testnet LIMIT 单可能无法查询成交状态 → 下单后用 GET /positions 验证是否成交
平仓 POST /order/{SYM}/close?bot_id=claude-pa
改止损 POST /order/{SYM}/modify-sl?new_stop_loss={价}&bot_id=claude-pa
| 周期 | 返回数量 | 时间跨度 | Al Brooks 依据 |
|---|---|---|---|
| 5m | 150 根 | 12.5h | "图表至少 100 bars" + S1 "浏览80+精读20" |
| 15m | 150 根 | 37.5h | 同上,PA 技术在所有图表通用 |
| 30m | 150 根 | 75h (3天) | 同上,"200+ bars to see Broad Channel" |
| 1h | 150 根 | 6.3天 | 同上 |
| 4h | 150 根 | 25天 | 同上 |
| 1d | 150 根 | 150天 | 同上,长期趋势背景 |
Al Brooks 原文: "Price action techniques work on all charts" — 所有周期同等对待,统一 150 根。
S1 读盘策略与 bar 数量的映射:
structure_summarystructure_summary,不重读历史缓存承接历史压力 — 全刷新时从 150 根中提取结构信息写入缓存,后续循环通过缓存获得历史 context 而不重读全部 bar:
| 缓存字段 | 来源 | 何时更新 | 用途 |
|---|---|---|---|
structure_summary | 全刷新时从 80+ 根中提取 | 全刷新 / 状态变化 | 替代重读历史 bar |
trend_origin | S2 方向判断时记录 | 方向改变时 | 知道趋势起点价位 |
channel_boundaries | S3 市场状态判断 | 状态变化时 | 通道上下轨价位 |
key_levels | S3b 关键位置 | 全刷新 / 新 S/R 出现 | 历史 S/R 不丢失 |
ema_history | 各周期 EMA20 | 每轮 | EMA 趋势方向 |
每个分析阶段对应一个 S 文件,包含完整的框架+深度知识。
| 阶段 | 文件 | 用途 | 何时 Read |
|---|---|---|---|
| Daily 偏置 | S0-daily-bias.md | Daily AI 方向 + 概率锚 | 每日首轮 / 缓存过期 |
| 读盘 | S1-reading.md | 逐根读 K 线,Pressure,结构 | 缓存过期刷新 |
| 方向 | S2-direction.md | Always-In + Gap + 多周期确认 | 持仓管理 / 缓存过期刷新 |
| 市场状态 | S3-market-state.md | BO/Channel(Tight/Broad)/TR/BC | 状态变化 / BC-SC |
| 关键位置 | S3b-key-levels.md | 9 种 S/R + 真空效应 + 磁力 | 持仓管理 / 全刷新 |
| 策略匹配 | S4-strategy-match.md | 15 个 Playbook + 状态矩阵 | 状态变化 |
| 评估 | S5-evaluation.md | P×R + MM + Scalp/Swing + 获利计划 | 信号 K 线出现 |
| BO 入场 | S6-bo.md | BO 评估 + Buy The Close + Spike 追进 | S3=BO/Spike |
| 通道入场 | S6-channel.md | H1/H2/EMA PB/Wedge + TC/BC 规则 | S3=TC/BC |
| TR 入场 | S6-tr.md | BLSHS + Failed BO Fade + 2nd Leg Trap | S3=TR |
| 反转入场 | S6-reversal.md | MTR + Climax + Channel Line Fade | BC/SC / Channel 末期 |
| 通用规则 | S6-common.md | 信号K线 + 订单类型 + 关键概率 | 所有入场前 |
| 持仓管理 | S7-management.md | Premise + 三种保护 + Trailing + 加仓 | 持仓管理(每轮) |
S 文件按需加载,不是每轮全读。缓存保存分析结果,只在事件发生时 Read 对应的 S 文件。
patrol-l1 支持两种运行模式:
特点:
使用方式:
/patrol-l1 start # 开始交易
/patrol-l1 status # 查看状态
/patrol-l1 refresh # 强制全刷新
特点:
启动方式:
# 在后台启动事件驱动器
cd ~/Desktop/Obsidian/Al-brooks-PA/AB\ Console-Backend
python scripts/patrol_l1_event_driver.py \
--exchange binance \
--port 8094 \
--symbols BTCUSDT,ETHUSDT,BNBUSDT \
--intervals 5m,15m,1h &
# 查看日志
tail -f data/pa_trader/pa_trader_l1.log
工作原理:
~/.claude/patrol-l1-trigger.json停止方式:
# 查找进程
ps aux | grep patrol_l1_event_driver
# 停止进程
kill <PID>
两种模式对比:
| 特性 | 定时轮询 | 事件驱动 |
|---|---|---|
| 响应速度 | 2-12 分钟 | < 10 秒 |
| 资源消耗 | 低 | 中(WebSocket 连接) |
| 适用场景 | 测试、调试 | 生产环境 |
| 错过 K 线风险 | 可能(轮询间隔内) | 极低(实时监听) |
| 启动方式 | /patrol-l1 | python 脚本 |
DISCORD_WEBHOOK=$(cat ~/.claude/.discord_webhook_l1 2>/dev/null || echo "")
cd ~/Desktop/Obsidian/Al-brooks-PA/AB\ Console-Backend
cat data/pa_trader/market_state_l1.json 2>/dev/null || echo "CACHE_EMPTY"
缓存存在时:
_meta.last_full_refresh — 距今超过 1 小时 → 标记全部品种 stalestatus + pre_signal + scenarios缓存不存在时(首次运行 / 文件被删):
COLD_START = truemarket_state_l1.json/patrol-l1 refresh 参数:强制全刷新(等同冷启动,但保留缓存中的 scenarios 作为先验)
Query Service 缓存层(V6.0):
execution-service 提供了智能缓存层,减少重复 API 调用,提高响应速度:
| API | 缓存 TTL | 说明 | 自动清除时机 |
|---|---|---|---|
/klines/{SYMBOL}/multi | 60 秒 | 一根 5m bar 的时间,符合 Al Brooks "Every bar matters" | 不清除(时间过期) |
/positions | 5 秒 | 实时性要求高 | 下单/平仓后立即清除 |
/balance | 30 秒 | 变化不频繁 | 下单/平仓后立即清除 |
✅ 可以放心多次调用 API:缓存命中时响应 < 1ms,不会造成性能问题。
✅ 数据一致性保证:下单/平仓后自动清除持仓和余额缓存,确保获取最新数据。
✅ 符合 Al Brooks 原则:K 线缓存 60 秒不会错过新 K 线(5m 周期 = 300 秒)。
curl -s http://localhost:8094/balance
curl -s http://localhost:8094/positions
curl -s http://localhost:8094/trading/bot-summary/claude-pa
curl -s http://localhost:8094/health && curl -s http://localhost:8094/trading/can-trade/claude-pa
tail -10 data/pa_trader/pa_trader_l1.log 2>/dev/null || echo "NO_LOG"
提取:余额(风险基数)、持仓、can-trade、最近交易记录。
余额 API 扩展字段(V6.0):
margin_ratio: 保证金率(健康度指标)maintenance_margin: 维持保证金(强平线)total_position_margin: 持仓占用保证金leverage: 当前杠杆倍数持仓和缓存不一致检查:如果 /positions 返回品种 X 有持仓但缓存 status 不是 "in_trade" → 立即修正缓存,记录 [AUDIT] CACHE_POSITION_MISMATCH。
检查缓存 daily_bias.{SYM}.expires_at:
⚠️ Daily 偏置 = 概率偏向(详见 S0 偏置表)。Strong BO(10%)才接近"只顺势";Channel/TR(90%)双方向可做。
输出:{SYM} | AI方向 | 状态 | 概率调整(+10%/-10%/无) | 来源(cache/fresh)
此步骤完全不变,始终 Read S 文件。持仓管理不走缓存。
curl -s "http://localhost:8094/klines/{SYMBOL}/multi"
多周期用途:所有周期 PA 通用 — 1d(Daily 偏置/概率背景)→ 4h/1h/30m/15m/5m(每个周期独立寻找 setup + 互为 context)
获取持仓品种的多周期 K 线数据,调用 ab_* 模块预计算数值:
from indicators.batch.ab_ema import analyze_ab_ema
from indicators.batch.ab_sr import analyze_ab_sr
from indicators.batch.ab_patterns import analyze_ab_patterns
# 对持仓品种的 1h/15m/5m 都调用(多周期分析)
ema_info, sr_info, pat_info = {}, {}, {}
for tf in ['1h', '15m', '5m']:
klines = get_klines(symbol, tf)
open_arr = [k['O'] for k in klines]
high, low, close = [k['H'] for k in klines], [k['L'] for k in klines], [k['C'] for k in klines]
ema_info[tf] = analyze_ab_ema(open_arr, high, low, close)
sr_info[tf] = analyze_ab_sr(open_arr, high, low, close)
pat_info[tf] = analyze_ab_patterns(open_arr, high, low, close)
数据用途(多周期):
1h: 大方向确认(S2 AI 方向)15m: 中期结构(S3 市场状态)5m: 精确入场(S7 Premise Check)详细使用方式 → 见 S7-management.md "Premise Check 示例"
# 生成 5m/15m/1h 三周期图表
python AB\ Console-Backend/scripts/chart_gen.py -s {SYMBOL} -i 5m,15m,1h --port 8094
输出路径:AB Console-Backend/data/charts/YYYY-MM-DD/{SYMBOL}_{INTERVAL}_{HHMMSS}.png
用途:Discord 推送附图 + 用户人工复盘。Agent 决策基于 ab_ 模块数值数据,不依赖图表视觉判断。*
先加载知识:
对每笔持仓执行(结合 ab_* 数据 + S 文件知识):
sr_info.open_gaps/filled_gaps、pat_info.wedges(对手方楔形=利好持仓方)、ema_info.price_vs_ema、pat_info.pb_depth输出:{SYM} | {方向} | 浮盈{%} | AI方向{一致/矛盾} | Premise{成立/失效} | Strength{高/中/低} | 操作{持有/移SL/平仓}
移 SL 时推送 Discord(仅移动时,持有不推):
# 获取最新生成的 5m 图表路径
CHART_PATH=$(ls -t "AB Console-Backend/data/charts/$(date +%Y-%m-%d)/${SYMBOL}_5m_"*.png 2>/dev/null | head -1)
WEBHOOK=$(cat ~/.claude/.discord_webhook_l1 2>/dev/null)
[ -n "$WEBHOOK" ] && curl -s -X POST "$WEBHOOK" -H "Content-Type: application/json" \
-d '{"content":"**L1 移SL** {SYM} {SIDE}\nSL: {旧SL} → {新SL} | 浮盈{%}\n理由: {新HL/LH位置}\n📊 图表: '"$CHART_PATH"'"}'
Step 2 完成后更新缓存:持仓品种的 market_state + ai_direction + key_levels
前提:can-trade=true(API 内部已含仓位数量/风险限额检查)
Al Brooks: "Setups look good enough to experts. Experts buy for any reason." Quick Scan 的目的不是过滤掉不完美的信号,而是找到所有可能的机会。
获取所有品种 K 线(并行获取,V5.1 性能优化):
# 并行获取(使用 & 后台执行)
curl -s "http://localhost:8094/klines/BTCUSDT/multi" > /tmp/klines_btc.json &
curl -s "http://localhost:8094/klines/ETHUSDT/multi" > /tmp/klines_eth.json &
curl -s "http://localhost:8094/klines/BNBUSDT/multi" > /tmp/klines_bnb.json &
wait # 等待所有并行任务完成
# 读取结果
BTC_KLINES=$(cat /tmp/klines_btc.json)
ETH_KLINES=$(cat /tmp/klines_eth.json)
BNB_KLINES=$(cat /tmp/klines_bnb.json)
⚡ 性能提升:从串行(3 × RTT)→ 并行(1 × RTT),节省 1-2 秒/轮。
✅ Query Service 缓存:K 线缓存 60 秒,重复调用时 < 1ms(见 Step 1 缓存说明)。
⚠️ 对每个品种,必须同时扫描 5m + 15m + 1h 三个周期。每个周期独立检测 9 类事件 → 详见 S6-common.md「Quick Scan 事件检测表」+「H2/L2 触发检测」
⚠️ H2/L2 触发 ≠ 自动入场。触发后进入 Scalp 快速通道(Context 清晰时)或 Phase B(需要深分析时)。
⚠️ 状态一致性验证(Quick Scan 最后一步,每轮必做)→ 详见 S3-market-state.md「Quick Scan 状态一致性验证」
state_change 检测到 → Phase B 深分析(Read S3+S4 重判状态 → 路由到新的 S6 文件)
signal_trigger → signal 类型映射 → 详见 S4-strategy-match.md「signal 类型映射」
同时更新缓存:
running_narrative:谁在控制(bulls/bears/均衡) + 力量变化(increasing/stable/decreasing) + 异常last_kline_close:更新为本轮最新值ema20 / avg_bar_size:从 API 数据更新pre_signal:如果条件正在酝酿但未触发 → 更新;已过期 → 清除;新建 pre_signal 时立即 Discord 推送:WEBHOOK=$(cat ~/.claude/.discord_webhook_l1 2>/dev/null)
[ -n "$WEBHOOK" ] && curl -s -X POST "$WEBHOOK" -H "Content-Type: application/json" \
-d '{"content":"**L1 信号酝酿** {SYM} {方向}\n条件: {condition}\n触发价: {signal_price} | 当前: {close} | 距离: {距离/ATR:.1f}xATR\n过期: {expires_at}"}'
consecutive_watching:无事件 → +1;有事件 → 重置为 0Quick Scan 输出表:
=== Quick Scan (3 品种) ===
| 品种 | 缓存状态 | 事件 | 动作 |
| BTCUSDT | pre_signal | signal_trigger | → Phase B |
| ETHUSDT | watching | (无变化) | → 跳过 |
| SOLUSDT | watching | ema_touch+momentum | → Phase B |
...
| 场景 | 检测 | 详见 | 关键 |
|---|---|---|---|
| TR 边缘 BLSHS | state=TR + close 在上/下 1/3 + 反转K | S3 BLSHS | P≈60%, 限价单 |
| 趋势顺势 Scalp | state=Channel + PB完成(H1/H2) + 顺势 | S6-channel PB入场 | Swing SL + 小仓 |
| TTR BO 失败 Fade | state=TTR + BO 后 2-3 bars 回 TTR | S3 TR状态 | 80% BO失败 |
| EMA PB Scalp | 趋势 + ema_touch + 趋势K出现 | S6-channel EMA-PB | SL=EMA对侧结构 |
共同规则:P×R > (1-P) → 立即下单(统一公式,详见 S5) | SL 必须在结构位 | 不触发必写 [AUDIT] FAST_TRACK_SKIP
Scalp 快速通道简化自检(3 项,替代 10 项完整自检):
Phase B-0: 按需调用 ab_ 模块*
根据事件类型,按需调用 ab_* 模块获取数值数据:
# 根据事件类型决定调用哪些模块
modules_needed = []
if event_type in ['ema_touch', 'pb_complete']:
modules_needed.append('ab_ema') # 需要 EMA 数据
if event_type in ['level_break', 'tr_edge', 'signal(TR)']:
modules_needed.append('ab_sr') # 需要 S/R 数据
if event_type in ['signal_trigger', 'h2_l2_trigger']:
modules_needed.append('ab_mm') # 需要 MM 目标计算 R
if event_type in ['anomaly', 'momentum', 'climax_suspected']:
modules_needed.append('ab_patterns') # 需要形态/压力数据
# 按需调用(避免不必要的计算)
if 'ab_ema' in modules_needed:
from indicators.batch.ab_ema import analyze_ab_ema
ema_info = analyze_ab_ema(open_arr, high, low, close)
if 'ab_sr' in modules_needed:
from indicators.batch.ab_sr import analyze_ab_sr
sr_info = analyze_ab_sr(open_arr, high, low, close)
if 'ab_mm' in modules_needed:
from indicators.batch.ab_mm import analyze_ab_mm
mm_info = analyze_ab_mm(open_arr, high, low, close)
if 'ab_patterns' in modules_needed:
from indicators.batch.ab_patterns analyze_ab_patterns
pat_info = analyze_ab_patterns(open_arr, high, low, close)
Phase B-0.5: 生成事件品种图表(Discord 推送 + 人工复盘用)
# 生成 5m/15m/1h 三周期图表
python AB\ Console-Backend/scripts/chart_gen.py -s {SYMBOL} -i 5m,15m,1h --port 8094
输出路径:AB Console-Backend/data/charts/YYYY-MM-DD/{SYMBOL}_{INTERVAL}_{HHMMSS}.png
用途:Discord 推送开仓/BC 警报时附图 + 用户人工复盘。Agent 决策基于 ab_ 模块数值。*
数据用途:
ema_info: EMA 斜率、MAG、First PB(用于方向确认,详见 S2/S6-channel)sr_info: S/R 位置(用于 SL/TP 设置,详见 S3b)mm_info: MM 目标(用于 R 计算,详见 S5)pat_info: 形态/压力(用于 Context 确认,详见 S3)详细使用方式 → 见各 S 文件的"使用示例"章节
Phase B-1: 优先级排序 + S 文件加载
signal_trigger(信号已形成,最紧急)anomaly + momentum(状态可能正在变化)level_break(关键位突破,需重新评估)stale(缓存过期 >2h 或 consecutive_watching >= 6)S 文件按需加载矩阵:
| 事件类型 | 需要 Read 的 S 文件 | 不需要 Read | 理由 |
|---|---|---|---|
| signal(顺势) | S3b + S5 + S6-common + S6-bo/channel | S1-S4 从缓存 | S3b 提供 S/R,S5 评估,S6-common 通用规则 |
| signal(反转) | S3b + S5 + S6-common + S6-reversal | 同上 | 反转需要 S6-reversal 的 5/5 条件 |
| signal(TR) | S3b + S5 + S6-common + S6-tr | 同上 | TR 入场需要 S6-tr 的 BLSHS/Fade 规则 |
| state_change | S3 + S4 | S1,S2 从缓存 | 重新判断状态+匹配 Playbook |
| BC/SC 发生 | S3 + S6-reversal | 其他从缓存 | 判断 MG/EG + fade 可能 |
| climax_suspected | S3 (BC 章节) | 其他从缓存 | Climax 快速检测评分 ≥ 4 |
| pre_signal 升级 | S6-common + S6-channel | 其他从缓存 | PB 碰 EMA 等,需要通用规则 |
| tr_edge | S6-common + S6-tr | 其他从缓存 | TR 边缘 Scalp,需要通用规则 |
| stale 刷新 | S1 + S2 + S3 + S3b | — | 完整重新分析 |
| anomaly | S1 + S2 + S3 | — | 大 K 线需要重新读盘+判断方向+状态 |
⚠️ S 文件加载顺序规则:
Token 缓存规则:同一轮循环内已 Read 的 S 文件不重复 Read。例如 BTC 读了 S5+S6-bo,SOL 也需要 S5+S6-bo → 不再读。
深分析流程(对每个有事件的品种):
场景规划(从缓存或新建):
scenarios[].still_valid = true → 检查触发条件是否达成场景 A (概率 X%): [最可能的市场走向]
触发条件: [什么 K 线形态确认这个场景]
操作: [Playbook ID] + [风格] + [订单类型]
仓位: [首仓 %]
场景 B (概率 Y%): [次可能的走向]
触发条件: [什么 K 线形态确认]
操作: [Playbook ID] + [风格] + [订单类型]
仓位: [首仓 %]
无效化: [超出所有场景时怎么办]
场景规划规则(不变):
scenarios,下一轮重新评估典型场景组合:
S3 判定 BC/SC → 执行:
bc_sc_guard,持续跟进直到 MG/EG 确认WEBHOOK=$(cat ~/.claude/.discord_webhook_l1 2>/dev/null)
[ -n "$WEBHOOK" ] && curl -s -X POST "$WEBHOOK" -H "Content-Type: application/json" \
-d '{"content":"**⚠️ L1 BC/SC 警报** {SYM}\n{类型} {N}/5 | bar={X}xATR | close={X}% of range\n操作: 停止追顺势,等 TBTL 验证\n状态→ bc_guard"}'
⚠️ 每个周期的 market_state 可能不同 — 5m 可能是 Channel 而 15m 是 TR。按每个周期自己的状态路由到对应 S6 文件。
对每个周期(1h → 15m → 5m):
该周期的 state = ?
→ BO/Spike → Read S6-bo.md
→ TC/BC → Read S6-channel.md
→ TR → Read S6-tr.md
→ BC后/末期 → Read S6-reversal.md (需5/5条件)
找到信号 → 进入阶段 6 TE 评估
没找到 → 下一个周期
[MTR] {SYM}: {N}/5 | R={X}:1 | 决策[PASS-RULE] SL_TOO_TIGHT[PASS-WAIT] PB_NOT_COMPLETERead S5-evaluation.md(如果本轮未读)
任一成立 → 直接 [PASS-RULE]:PB>2/3 | BO 20+无FT | TC逆势 | TR中间1/3 | BC/SC gap未验证 | Swing R<1.5 | Scalp R<1(详见 S5 评估 + S6-channel 入场)
→ 详见 S5-evaluation.md「PASS 分类系统」+「反恐惧强制执行」
→ 详见 S7-management.md「被止损后重入」完整 5 步流程
[MISSED]Al Brooks 铁律: "Stop determines position size"
首仓 vs 加仓 → 详见 S7-management.md「加仓策略」
TP1 保护性止盈 → 详见 S7-management.md「TP1 保护性止盈」
开仓前图表生成(Discord 推送用):
# 生成最新的 5m 图表(开仓记录 + Discord 推送)
python AB\ Console-Backend/scripts/chart_gen.py -s {SYMBOL} -i 5m --port 8094
1. 生成开仓前图表(见上)
2. GET /trading/calculate-size/claude-pa?entry_price={}&stop_loss={}&risk_percent={见S7加仓策略}
3. 计算 TP1: 按 S7 TP1 表计算(Scalp→1.5R, Swing→2R, 反转试探→1R)
4. 写日志: [SIGNAL] {分析摘要} | P=?% R=?:1 P*R=? | 风格=[Scalp/Swing] | 仓位={首仓/加仓1/加仓2/反转试探} | 费用~$?
5. 写日志: [PREMISE] {SYM}: {一句话入场理由} ← 管理时 grep 这行
6. POST /order (含 stop_loss 和 take_profit 字段)
7. 验证: GET /positions 确认订单成交 + SL 已挂
8. 写日志: [TRADE] {SYM} {SIDE} {QTY}@{PRICE} | SL={} TP1={} | 名义~$? 费用~$? | premise
9. Discord 推送
10. 更新缓存: status → "in_trade", tp1_price → {TP1价格}
Discord:
# 获取最新生成的 5m 图表路径
CHART_PATH=$(ls -t "AB Console-Backend/data/charts/$(date +%Y-%m-%d)/${SYMBOL}_5m_"*.png 2>/dev/null | head -1)
WEBHOOK=$(cat ~/.claude/.discord_webhook_l1 2>/dev/null)
[ -n "$WEBHOOK" ] && curl -s -X POST "$WEBHOOK" -H "Content-Type: application/json" -d '{"content":"**AL BROOKS L1** {操作}\n{SYM} {SIDE} {QTY}@{PRICE}\nSL={SL} TP={TP}\nP={X}% R={X}:1 [{Scalp/Swing}]\nPremise: {一句话}\n📊 图表: '"$CHART_PATH"'"}'
平仓时:
写日志: [CLOSE] {SYM} {SIDE} 平仓 | 入场{PRICE}->平仓{PRICE} | 盈亏={$X}(含费用) | 原因
Discord: 同上格式推送
更新缓存: status → "watching", 清除 pre_signal
循环 #{N} | {HH:MM}
Binance Testnet 余额 ${X} | 风险 1%=${X} | 杠杆 最大(账户默认)
持仓 {n}个 | 日盈亏(含费用)${X}
Cache: loops={N} signals={N} trades={N} passes={N} | S-reads本轮={列表}
=== 持仓管理 ===
| 品种 | 时间周期 | 方向 | 浮盈% | AI方向 | Premise | 操作 |
=== Quick Scan (3 品种 × 3 周期) ===
| 品种 | 5m 事件 | 15m 事件 | 1h 事件 | 动作 |
=== 深分析结果 ===
| 品种 | 时间周期 | 场景A(概率) | 场景B(概率) | P*R | 决策 |
=== Daily 偏置 ===
| 品种 | AI方向 | 状态 | 来源(cache/fresh) |
下轮: {N}分钟后 | 预计 S-reads: {0 或 "S5+S6-channel if signal triggers"}
=== 执行审计 ===
PASS 分类: RULE={N} WAIT={N}
TR品种: {N}个 | 边缘触发: {N}次 | Scalp执行: {N}次 | 跳过: {N}次(原因)
MTR评估: {N}个品种 | 3+/5: {N}个 | 试探: {N}次 | 跳过: {N}次(原因)
SL打掉后重入: {N}次尝试 | 成功: {N}次
路由表匹配: {N}次检查 | 偏离: {N}次(原因)
更新 data/pa_trader/market_state_l1.json:
_meta.loop_count += 1_meta.total_signals/trades/passes += 本轮增量last_kline_close 更新为本轮最新值_meta.last_full_refresh 如果本轮是全刷新则更新写缓存是 Step 4 的最后一步,不写缓存不能结束循环。
每轮写 data/pa_trader/cycle_{timestamp}.json,记录:loop_number, quick_scan_events, s_reads, deep_analysis 结果, trades, passes。
loop_count % 6 == 0 时推送一条简短的状态卡:
4d-1. 生成全品种图表(定期快照)
# 批量生成 3 品种 × 3 周期图表(6-9 秒)
python AB\ Console-Backend/scripts/chart_gen.py --patrol --port 8094
输出路径:AB Console-Backend/data/charts/YYYY-MM-DD/
用途:Discord 推送周期汇报附图 + 用户复盘快照。自动清理 3 天前的旧图片。
4d-2. Discord 推送(附带图表链接)
# 获取今日图表目录
CHART_DIR="AB Console-Backend/data/charts/$(date +%Y-%m-%d)"
WEBHOOK=$(cat ~/.claude/.discord_webhook_l1 2>/dev/null)
[ -n "$WEBHOOK" ] && curl -s -X POST "$WEBHOOK" -H "Content-Type: application/json" \
-d '{"content":"**L1 定期汇报** Loop#{N} | {HH:MM}\n余额 ${bal} | 日盈亏 ${pnl} | 持仓 {n}个\n信号酝酿: {sym1}({条件}) {sym2}...\n下轮: {X}分钟后\n📊 图表目录: '"$CHART_DIR"'"}'
什么时候跳过:当本轮有开仓/平仓/BC警报推送时,不额外发周期汇报(避免刷屏)。
决策顺序:优先级高的条件覆盖低的
| 优先级 | 条件 | 间隔 | 原因 |
|---|---|---|---|
| P0 | pre_signal 触发接近:任一品种 abs(close - signal_price) < 0.3 × ATR5m | 2 分钟 | 触发窗口极短,必须守着 |
| P0 | 有持仓 + 波动大:最近 3 根 5m range > 平均 2 倍 | 2 分钟 | 止损随时被扫,保护第一 |
| P1 | BC/SC 刚发生(< 10 根 K 线) | 2 分钟 | 状态关键期,60% 变 TR |
| P1 | 价格在 TR 边缘(上/下 1/3) | 2 分钟 | H1 入场窗口稍纵即逝 |
| P1 | momentum 持续中:缓存检测到 3+ 连续同向 bars | 3 分钟 | 加速市场可能突变 |
| P2 | 有持仓 + 正常 | 4 分钟 | 常规监控,5m bar 不漏 |
| P2 | 有 pre_signal(非接近触发) | 4 分钟 | 跟踪,但不急 |
| P3 | stale 品种 > 3 个 | 5 分钟 | 需尽快刷新,但不紧急 |
| P4 | 无持仓 + 无 pre_signal + 正常市场 | 8 分钟 | 节省资源 |
| P5 | 全部品种 watching ≥ 3 轮 | 12 分钟 | 市场安静,放慢节奏 |
间隔计算逻辑(Step 4 末尾执行):
next_interval = 12 # 默认最长
for sym in symbols:
d = abs(close[sym] - signal_price[sym]) / ATR5m[sym]
if pre_signal[sym] and d < 0.3: next_interval = min(next_interval, 2)
if has_position[sym] and volatility_high[sym]: next_interval = min(next_interval, 2)
if bc_sc_fresh[sym]: next_interval = min(next_interval, 2)
if tr_edge[sym]: next_interval = min(next_interval, 2)
if momentum[sym]: next_interval = min(next_interval, 3)
if has_position[sym]: next_interval = min(next_interval, 4)
if pre_signal[sym]: next_interval = min(next_interval, 4)
if stale_count > 3: next_interval = min(next_interval, 5)
sleep {next_interval * 60} && echo "PATROL_L1_TIMER"
run_in_background: true。Step 4 末尾输出 下轮: {N}分钟后 | 原因: {P0触发接近/P1 BC/...}。收到 TIMER → 回 Step 0b。
当等待时间 ≥ 5 分钟时,执行以下后台任务(不阻塞主流程):
# 为有 pre_signal 的品种预生成图表
for sym in $(jq -r '.[] | select(.pre_signal != null) | .symbol' data/pa_trader/market_state_l1.json); do
python AB\ Console-Backend/scripts/chart_gen.py -s $sym -i 5m,15m,1h --port 8094 &
done
wait
用途:Phase B 深分析时直接使用已生成的图表,节省 2-3 秒。
# 验证缓存和持仓一致性
curl -s http://localhost:8094/positions | jq -r '.[].symbol' > /tmp/positions.txt
jq -r '.[] | select(.status == "in_trade") | .symbol' data/pa_trader/market_state_l1.json > /tmp/cache_positions.txt
diff /tmp/positions.txt /tmp/cache_positions.txt || echo "[AUDIT] CACHE_POSITION_MISMATCH"
# 每 6 轮预计算统计数据
if [ $((loop_count % 6)) -eq 0 ]; then
python AB\ Console-Backend/scripts/calc_daily_stats.py
fi
输出:data/pa_trader/stats/YYYY-MM-DD.json(总交易/胜率/平均R/按品种/按setup)
以下任一条件 → 全部 3 品种走完整分析流程(Read 全部 S 文件,等同 COLD_START):
_meta.loop_count % 6 == 0(每 6 轮强制一次,约 30-60 分钟)_meta.last_full_refresh 距今 > 1 小时/patrol-l1 refresh全刷新时更新 _meta.last_full_refresh。
全刷新的目的:防止缓存漂移,确保不会因为 Quick Scan 遗漏慢速变化。
嵌入 Quick Scan 和 Step 4 的硬性规则:
每个品种的 consecutive_watching 计数器:
consecutive_watching >= 6 → 强制进入 Phase B 做 stale 刷新| 周期 | 默认过期 | 续期 | 理由 |
|---|---|---|---|
| 5m | 25 分钟(5 根 bar) | +15 分钟(一次) | 标准观察窗口 |
| 15m | 45 分钟(3 根 bar) | +30 分钟(一次) | 1 根 bar=15 分钟,至少看 3 根 |
| 30m | 90 分钟(3 根 bar) | +60 分钟(一次) | 同上等比 |
| 1h | 180 分钟(3 根 bar) | +60 分钟(一次) | 1h setup 需要更长观察 |
每 12 轮(约 1 小时)检查:
signal_rate = total_signals / loop_countsignal_rate < 0.05 连续 2 小时 → [AUDIT] LOW_SIGNAL_RATE → 全刷新 + 日志警告⚠️ 反恐惧 → 详见 Q3-fear.md。核心: P×R 达标 = 入场,说不出理由 = 恐惧。