金融与交易
用 Freqtrade 写策略/回测/部署/实时控制时…
在 CoinClaw 容器或 host 模式中用 Freqtrade 进行策略生成、回测、hyperopt、部署切换、实盘/模拟切换与实时盈亏/持仓查询时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 Freqtrade 写策略/回测/部特定
解决思路
- 在 CoinClaw 容器(OpenClaw / Hermes / Claude Code)中,freqtrade 由 supervisord 作为常驻 daemon 管理,监听 127.0.0.1:8080,默认跑 NoOpStrategy(空跑);不要自己启动 freqtrade 进程,避免抢端口导致 dashboard offline。
- 正确部署流程:先写策略文件,再调用 `ft-deploy.mjs deploy '{"strategy":"..."}'`,由脚本修改 config 并重启 daemon,dashboard 会自动刷出新策略。
- `scripts/ft.mjs` 和 `scripts/ft-deploy.mjs` 通过 `lib/coinclaw-env.mjs` 自动识别三引擎,自动解析路径 / auth / supervisord socket,agent 不需要关心具体引擎。
- 查询类问题必须优先调用 freqtrade REST API,不要自己计算:问“现在赚多少 / 总盈亏 / 今天涨了多少”先调 `ft.mjs profit`(`/api/v1/profit`)。
- 问“持仓 / 现在开了哪些”先调 `ft.mjs trades_open`(`/api/v1/status`)。
- 问“余额 / 资金多少”先调 `ft.mjs balance`(`/api/v1/balance`)。
- 问“跑的什么策略 / 当前模式”先调 `ft.mjs daemon_info` 或 `config`。
- 问“历史交易 / 已平仓”先调 `ft.mjs trades_history`。
- 问“单交易对绩效”先调 `ft.mjs profit_per_pair`。
- dashboard 数字对齐:用户问“赚了多少”必须报告两个数字:已平仓累计盈亏 = `profit_closed_coin`(USDT),即 dashboard 顶栏累计盈亏;含浮动总盈亏 = `profit_all_coin`(USDT),即已平仓 + 当前持仓浮动盈亏。
- 不要只调 `/status` 拿持仓浮动盈亏,否则会漏掉已平仓部分,导致跟 dashboard 数字不一致。
- config.json 是 daemon 启动时读一次,手动改不会自动生效,切策略 / 切实盘 / 切交易对必须走脚本。
- 切策略:调用 `ft.mjs set_strategy '{"strategy":"X"}'`,必须重启 daemon(约 30s)。
- 切交易对:调用 `ft.mjs set_pairs '{"pairs":[...]}'`,不重启,`reload_config` 即可。
- 切实盘 / 模拟:调用 `ft.mjs set_dry_run '{"dry_run":false}'`,必须重启 daemon。
- reload 配置:调用 `ft.mjs reload`,不重启。
- 一次完成所有变更:调用 `ft-deploy.mjs deploy '{"strategy":"X","pairs":["BTC/USDT:USDT"],"dry_run":false}'`。
- 任何直接修改 config.json 的操作(包括手动编辑 pair_whitelist / minimal_roi / stoploss 等)后,必须立即调 `ft.mjs reload`,否则 daemon 仍用内存旧配置运行,改动不生效。
- chat 主动发起的高 stake 操作必须强 confirm:适用用户在 chat 里说“平掉”“切实盘”“卖了”“开仓”等,通过 agent 调用 `force_exit` / `force_enter` / `set_dry_run` 的操作。
- 高 stake 操作流程:先列预览,包括动哪个 trade / pair / 当前盈亏 / 估算损益 / dry_run vs live / 余额状况。
- 高 stake 操作流程:明确等用户输入“确认”或“yes”才真调 `force_exit` / `set_dry_run` / `force_enter`。
- 高 stake 操作流程:即使用户语气笃定(“平了”“直接切”),也必须先预览等确认。
- 不需要 confirm 的操作:查询类(查持仓 / 盈亏 / 状态)直接读。
- 不需要 confirm 的操作:freqtrade daemon 自己根据策略信号自动开 / 平仓,这是 daemon 本职工作,用户切实盘那一刻就授权了,agent 不在这个链路里,不要拦也不需要 confirm。
- 不需要 confirm 的操作:非破坏性配置(`set_pairs` 加币对、`reload`)列改动表后直接执行。
- 避免反例:用户说“平掉”就直接调 `force_exit` 平真持仓。
- 避免反例:用户说“切实盘”却不列 .env key / 余额 / 风险就直接 `set_dry_run '{"dry_run":false}'`。
- 正确示例:用户说“平掉”,先列“持仓: BNB/USDT 0.05 +$1.07, 平这单吗? dry_run=true 模拟盘”,等用户确认。
- 写策略 + 切策略倾向分两轮:第一轮写完策略文件后告诉用户“已生成 X.py,要切上去吗?”。
- 第二轮用户确认后调 `set_strategy` 切策略并重启 daemon(约 30s),让用户切前能 review 文件且对 daemon 重启 30s 有预期。
- 用户明确说“一气呵成做完”时可以单 turn 跑完两步,但默认分轮。
- Freqtrade 不支持网格策略(grid);用户问网格时直接说明限制,并建议趋势跟踪 / 区间策略 / 网格回报模拟器替代,不要硬写伪网格。
- 快速参考:看 daemon 状态 + 配置用 `node scripts/ft-deploy.mjs check` 或 `ft.mjs daemon_info`。
- 快速参考:看策略列表用 `node scripts/ft-deploy.mjs strategy_list`。
- 快速参考:创建策略(快速生成器)用 `node scripts/ft-deploy.mjs create_strategy '{"name":"MyStrat","timeframe":"15m","indicators":["rsi","macd","ema"],"aicoin_data":["funding_rate"]}'`。
- 快速参考:部署策略到 daemon 用 `node scripts/ft-deploy.mjs deploy '{"strategy":"MyStrat"}'`。
- 快速参考:部署 + 切实盘用 `node scripts/ft-deploy.mjs deploy '{"strategy":"MyStrat","dry_run":false}'`。
- 快速参考:回测用 `node scripts/ft-deploy.mjs backtest '{"strategy":"MyStrat","timeframe":"1h","timerange":"20250101-20260301"}'`。
- 快速参考:Hyperopt 调参用 `node scripts/ft-deploy.mjs hyperopt '{"strategy":"MyStrat","timeframe":"1h","epochs":100}'`。
- 快速参考:看盈亏用 `node scripts/ft.mjs profit`。
- 快速参考:看持仓用 `node scripts/ft.mjs trades_open`。
- 快速参考:看余额用 `node scripts/ft.mjs balance`。
- 快速参考:切交易对用 `node scripts/ft.mjs set_pairs '{"pairs":["BTC/USDT:USDT","ETH/USDT:USDT"]}'`。
- 快速参考:重启 daemon 用 `node scripts/ft.mjs restart`。
- 快速参考:看日志用 `node scripts/ft-deploy.mjs logs '{"lines":100}'`。
- 创建策略先判断路径:用户只给笼统描述(“RSI 策略”“均线交叉”“布林带回归”)且没指定具体参数细节,走 A 快速生成器。
- 创建策略先判断路径:用户给了具体逻辑(自定义入场 / 出场条件、跨周期共振、多币种轮动、复合指标、自定义仓位管理),走 B 直接写 Python。
- 用 A 生成后用户要改细节,直接编辑生成的 .py 文件,不要重新 `create_strategy` 覆盖。
- A 快速生成器:用 `create_strategy` 一条命令生成一个可跑策略文件,适合“先跑起来再调”。
- A 示例:`node scripts/ft-deploy.mjs create_strategy '{"name":"MACDStrategy","timeframe":"15m","indicators":["macd","rsi","atr"]}'`。
- A 示例:`node scripts/ft-deploy.mjs create_strategy '{"name":"RSILong","timeframe":"1h","indicators":["rsi"],"direction":"long"}'`。
- A 示例:`node scripts/ft-deploy.mjs create_strategy '{"name":"WhaleStrat","timeframe":"15m","indicators":["rsi","macd"],"aicoin_data":["funding_rate","ls_ratio"]}'`。
- A 可选 `indicators`:`rsi`, `bb`, `ema`, `sma`, `macd`, `stochastic`/`kdj`, `atr`, `adx`, `cci`, `williams_r`, `vwap`, `ichimoku`, `volume_sma`, `obv`。
- A 可选 `direction`:`"long"`(默认,只做多)| `"short"`(只做空)| `"both"`(双向);用户说“RSI<30 买入,RSI>70 卖出”应设 `direction="long"`(RSI>70 = 平多,不是开空);只有用户明确说“做空 / 双向 / 多空都做”时才用 `"both"` 或 `"short"`。
- A 可选 `aicoin_data`:`funding_rate`、`ls_ratio`、`big_orders`、`liquidation_map`(都需付费套餐),`open_interest`(v3 聚合 OI 历史暂未接通,会自动降级到默认值)。
- A 局限:只能组合预设指标,不支持跨周期、多币种轮动、自定义复合指标;遇到这些需求直接走 B。
- B 自定义 Python:直接写 `.py` 文件到 daemon 的 strategy 目录,可实现任何 freqtrade 支持的策略逻辑(跨周期 informative pairs、自定义仓位管理、多指标复合条件等)。
- B 目录:三引擎 strategy 目录不同,从 `daemon_info` 拿,或用 `Write` 工具写到下面任一路径(脚本自动用 `/api/v1/show_config` 验证):OpenClaw `~/.openclaw/workspace/strategies/`;Hermes `/workspace/strategies/`;Claude Code `/workspace/strategies/`。
- B 使用 AiCoin Python SDK:`aicoin_data.py` 在 image build 时已复制到上面目录,也由 `create_strategy` 兜底拷贝。
- SDK 封装 AiCoin Open API v3:`from aicoin_data import AiCoinData`;`ac = AiCoinData(cache_ttl=300)` 自动从 `.env` 读 key,内置 5 分钟缓存。
- SDK 高层信号:`ac.whale_signal("BTC/USDT:USDT", "binance")` 返回大单买卖压力 -1..+1;`ac.ls_ratio_norm()` 返回多空比 0..1(>0.5 偏多);`ac.funding_rate_pct("BTC/USDT:USDT", "binance")` 返回最新资金费率百分比;`ac.liq_bias("BTC/USDT:USDT", "binance")` 返回清算图方向偏向 -1..+1。
- SDK 原始数据:`ac.coin_ticker("bitcoin,ethereum")` 实时行情;`ac.klines("BTC/USDT", "binance", interval="1h", limit=100)`。
- SDK 任意 v3 接口:`ac.get("markets/hot-coins", {"tab_key": "defi"})`;`ac.get("hyperliquid/whales/open-positions", {"coin": "BTC"})`;path 是 `/api/v3/` 后那段,清单见 https://open.aicoin.com/api/v3/_catalog。
- 回测期 AiCoin 实时数据不可用,高层信号会抛异常;策略里要 `try/except` 兜底用默认值;资金费率、大单、清算等需付费套餐,没权限同样抛异常并兜底。
- B 完整模板:继承 `IStrategy`,`INTERFACE_VERSION = 3`,设置 `timeframe`、`can_short`、`minimal_roi`、`stoploss`、`trailing_stop` 等参数。
- 模板中定义 `rsi_buy = IntParameter(20, 40, default=30, space='buy')`、`rsi_sell = IntParameter(60, 80, default=70, space='sell')`,以及 `_ac_funding_rate`、`_ac_last_update`。
- 模板 `populate_indicators`:计算 RSI(delta/gain/loss/rs),初始化 `dataframe['funding_rate']=0.0`;若 `self.dp` 且 `self.dp.runmode.value in ('live', 'dry_run')`,按 300 秒节流调用 `_update_aicoin_data(metadata)`,并把值写入最后一行。
- 模板 `_update_aicoin_data`:`try/except` 下把策略目录加入 `sys.path`,`from aicoin_data import AiCoinData`,`ac = AiCoinData(cache_ttl=300)`,从 `metadata` 和 `self.config` 取 pair/exchange,调用 `ac.funding_rate_pct(pair, exchange)` 赋给 `self._ac_funding_rate`,异常记 warning。
- 模板 `populate_entry_trend`:`rsi < rsi_buy.value` 且 `volume > 0` 设 `enter_long=1`;`rsi > rsi_sell.value` 且 `volume > 0` 设 `enter_short=1`。
- 模板 `populate_exit_trend`:`rsi > 70` 设 `exit_long=1`;`rsi < 30` 设 `exit_short=1`。
- 写完策略后用 `deploy '{"strategy":"MyStrategy"}'` 让 daemon 切到这个策略。
- AiCoin 数据集成模式:`funding_rate` 大于 0.01% → 多头过度 → 空信号;小于 -0.01% → 多信号;需基础版。
- `ls_ratio` 小于 0.45(空头多)→ 反向做多;大于 0.55 → 反向做空;需基础版。
- `big_orders` `(buy_vol-sell_vol)/total > 0.3` → 鲸鱼买入做多;需标准版。
- `open_interest` OI 涨 + 价涨 = 健康趋势;OI 涨 + 价跌 = 反转;需专业版。
- `liquidation_map` 上方爆仓多 → 多头挤压 → 做多;需高级版。
- 回测注意事项:AiCoin 实时数据不在历史区间内可用;回测时 AiCoin 列用默认值(`funding_rate=0.0`,`ls_ratio=0.5`,`whale_signal=0.0`)。
- 回测结果只反映技术指标部分;live/dry_run 跑的时候才用真实 AiCoin 数据,表现应该比回测好。
- 向用户报告回测结果时必须主动说明 AiCoin 数据不在回测中,不要让用户以为回测包含了 AiCoin 信号。
- `scripts/ft-deploy.mjs` 的 `check`:无参数,返回 daemon 状态 + 配置 + 余额。
- `scripts/ft-deploy.mjs` 的 `daemon_info`(在 ft.mjs):无参数,单调用拿全。
- `scripts/ft-deploy.mjs` 的 `deploy`:`'{"strategy":"MyStrat"}'` 或 `'{"strategy":"MyStrat","dry_run":false,"pairs":["BTC/USDT:USDT"]}'`。
- `scripts/ft-deploy.mjs` 的 `create_strategy`:`'{"name":"MyStrat","timeframe":"15m","indicators":["rsi","macd"],"direction":"long","aicoin_data":["funding_rate"]}'`。
- `scripts/ft-deploy.mjs` 的 `backtest`:`'{"strategy":"MyStrat","timeframe":"1h","timerange":"20250101-20260301","pairs":["ETH/USDT:USDT"]}'`。
- `scripts/ft-deploy.mjs` 的 `hyperopt`:`'{"strategy":"MyStrat","timeframe":"1h","epochs":100}'`。
- `scripts/ft-deploy.mjs` 的 `download_data`:`'{"timeframe":"1h","timerange":"20250101-"}'`。
- `scripts/ft-deploy.mjs` 的 `strategy_list`:无参数。
- `scripts/ft-deploy.mjs` 的 `backtest_results`:无参数,列最近 10 个回测结果文件名。
- `scripts/ft-deploy.mjs` 的 `start` / `stop`:无参数,coinclaw 模式调 supervisorctl,host 模式管 PID。
- `scripts/ft-deploy.mjs` 的 `status` / `logs`:`'{"lines":100}'`。
- `scripts/ft-deploy.mjs` 的 `update` / `remove`:coinclaw 模式 no-op,提示用 helm upgrade / web UI 删 instance。
- `scripts/ft.mjs` 的 `daemon_info`:一次拿 strategy / mode / pairs / open trades 数量。
- `scripts/ft.mjs` 的 `profit`:已平仓累计 + 含浮动总盈亏(回答盈亏类问题必须先调)。
- `scripts/ft.mjs` 的 `trades_open`:当前持仓(调 `/status`)。
- `scripts/ft.mjs` 的 `trades_history`:已平仓交易。
- `scripts/ft.mjs` 的 `balance`:余额。
- `scripts/ft.mjs` 的 `profit_per_pair`:每交易对绩效。
- `scripts/ft.mjs` 的 `daily` / `weekly` / `monthly`:时间维度统计。
- `scripts/ft.mjs` 的 `force_enter` / `force_exit`:手动开 / 平仓。
- `scripts/ft.mjs` 的 `set_strategy`:切策略(改 config + 重启 daemon)。
- `scripts/ft.mjs` 的 `set_pairs`:改交易对白名单(reload,不重启)。
- `scripts/ft.mjs` 的 `set_dry_run`:切实盘 / 模拟(改 config + 重启 daemon)。
- `scripts/ft.mjs` 的 `restart`:重启 freqtrade daemon(supervisorctl + kill 兜底)。
- `scripts/ft.mjs` 的 `reload`:reload_config 而不重启。
- `scripts/ft.mjs` 的 `start` / `stop` / `ping` / `version` / `health`:标准 REST。
- `scripts/ft.mjs` 的 `logs`:freqtrade 自带 `/logs` 接口。
- `scripts/ft-dev.mjs` 的 `backtest_start` / `backtest_status` / `backtest_history` / `candles_live` / `candles_analyzed` / `strategy_list` / `strategy_get` / `whitelist` / `blacklist` 等用于调试(回测 / 蜡烛 / 策略详情)。
- 环境变量与认证:`.env` 自动加载顺序为 coinclaw 容器内 `/workspace/.env`(Hermes/CC)或 `/home/node/.openclaw/workspace/.env`(OpenClaw);host 模式为 `~/.coinos/.env`(coinos 文件夹,推荐)→ 当前目录 `.env` → 旧 `~/.openclaw/.env`(向后兼容)。
- freqtrade REST 认证:`freqtrade-api.mjs` 自动从容器内 `.ft_api_pass` 文件读密码,agent 不用配 `FREQTRADE_USERNAME` / `FREQTRADE_PASSWORD`,用户也可通过 `.env` 覆盖。
- 交易所 key 在 web UI 的 EnvSection 里配置,写到 `.env` 后 entrypoint 会自动 patch 进 freqtrade `config.json`;agent 不要直接读 `.env` 给用户看交易所 key。
- AiCoin Open API key 用于策略集成 AiCoin 数据:`AICOIN_ACCESS_KEY_ID=your-key-id`,`AICOIN_ACCESS_SECRET=your-secret`。
- 付费功能引导:返回 304 / 403 时不要重试,直接告诉用户套餐:免费版 $0 纯技术指标;基础版 $29/mo + `funding_rate`, `ls_ratio`;标准版 $79/mo + `big_orders`, `agg_trades`;高级版 $299/mo + `liquidation_map`;专业版 $699/mo + `open_interest`, `ai_analysis`。
- 获取地址:https://www.aicoin.com/opendata。
- 跨 skill 引用:单纯查行情 / K 线 / 新闻 / 资金费率(不开仓)用 `aicoin-market`。
- 跨 skill 引用:直接下单 / 开仓 / 平仓(不通过 freqtrade)用 `aicoin-trading`。
- 跨 skill 引用:Hyperliquid 鲸鱼 / 持仓 / 清算用 `aicoin-hyperliquid`。
- 跨 skill 引用:链上 DEX swap / 钱包余额 / gas 用 `aicoin-onchain`。
- 跨 skill 引用:余额 / 持仓 / 注册 / API key 配置(账户类)用 `aicoin-account`。
- 常见 pitfall:不要 `cat /workspace/.ft_api_pass` 把内部 daemon 密码贴到 chat;直接用 `ft.mjs` 调 REST,脚本内部读密码不会泄漏。
- 常见 pitfall:不要在 chat 里 echo 用户的交易所 key;这些是高敏数据,引导用户去 EnvSection 配置。
- 常见 pitfall:不要自己心算 RSI / MACD / EMA;freqtrade 算出的值跟心算结果会差,用 `ft-dev.mjs candles_analyzed` 拿 daemon 的真实指标。
- 常见 pitfall:不要“先 stop daemon 再 freqtrade trade ... &”;那是绕过 supervisord,下次 dashboard 看到的还是老的 daemon 状态;必须用 `set_strategy` / `deploy` / `restart`。
- 常见 pitfall:回测拿不到 AiCoin 数据是正常的;不要造假 CSV 喂回测,直接告诉用户回测只反映技术指标,见根 AGENTS.md 的“数据准确性铁则”。
适用边界 · 注意事项
- 用户要网格策略时不要使用本技能硬写伪网格;Freqtrade 不支持网格,应说明限制并建议趋势跟踪 / 区间策略 / 网格回报模拟器替代。
- 回测时 AiCoin 实时数据不可用,不能期望回测包含 AiCoin 信号,也不要造假 CSV 喂回测。
- 单纯查行情 / K 线 / 新闻 / 资金费率(不开仓)或直接下单 / 开仓 / 平仓(不通过 freqtrade)时,不应使用本技能,改用 aicoin-market / aicoin-trading 等对应技能。