PyCryptoBot / 配置参考

config.json 逐项说明:约 30 个真实开关,以及一个反直觉的命名规律

PyCryptoBot 的行为几乎全部由工作目录下的 config.json 决定:交易哪两个币、多久评估一次、买入前要过几道过滤、什么条件下认亏、单笔最多投多少。仓库里给了两份官方样本——config.json.sampleconfig.json.advanced.sample,但没有任何一份文档解释这些键。

这一页把两份样本里的开关按功能分四组抽出来,逐项给出键名、样本里的默认值与你需要注意的地方。开篇先说一个最容易踩的点:买入侧那一批开关叫 disable*值为 1 表示「禁用这个过滤条件」,也就是把这道关卡拆掉——它和直觉正好相反。

下方所有键名与默认值都来自 2026-09-21 采集的两份样PyCryptoBot 本文件;碰到行为细节,请以官方仓库实现为准。本站不推荐任何具体参数组合,因为参数取决于你的标的、周期与风险预算。

依据 config.json 两份官方样本约 30 个真实开关Granularity 固定 7 档验证日期 2026-09-21
本文验证环境
  • PyCryptoBot v8.2.4(main=1fa9aaef,2024-03-04)
  • Python 3.11(官方 Dockerfile 基线)
  • 交易所范围:Binance / Coinbase / KuCoin
  • 验证日期 2026-09-21
  • 本站未实机运行机器人
买入过滤 8 项趋势 / 位置 / 动量 / 量能 / 强弱 / 兜底
卖出与风控 11 项止损 / 移动止损 / 保本 / 分批卖出
仓位与规模 3 项单笔上限 / 下限 / 上次规模
模式与输出开关live / websocket / autorestart / graphs / stats
配置开关分组示意(依据 config.json.sampleconfig.json.advanced.sample 中出现的真实键名归纳,非官方分类)。四组的含义分别是「什么时候允许买」「什么时候必须卖」「一次买多少」「以什么模式跑和输出什么」。
两份样本

标准样本与进阶样本的区别在哪?

很多人拿到仓库后随手 cp config.json.sample config.json 就开跑。但两份样本的设计意图并不相同:标准样本是「过滤全开、保守买入」,进阶样本把八个买入过滤全部设为禁用,并额外打开动态止损与自定义策略,把判断权交给策略文件。

对比项config.json.sample(标准)config.json.advanced.sample(进阶)对使用者的影响
买入过滤开关只列 7 个,且取值有开有关(disablebuymacd=0disablebuyobv=1把 8 个全部设为 1,即全部禁用进阶样本等于关掉所有内置买入过滤,买入判断改由自定义策略负责
是否含 disablebuyema有(=1)均线过滤只在进阶样本里作为可选项出现
是否含 buylastsellsize有(=1)「按上次卖出的规模买入」是进阶样本独有的仓位控制手段
是否含 dynamictsltsl*有(dynamictsl=1 且带三个 multiplier)动态移动止损只在进阶样本里出现,标准样本用的是固定移动止损
是否含 enable_pandas_ta / enable_custom_strategy有(均 =1)这两个开关是「用 pandas-ta 指标」与「启用自定义策略」的入口,标准样本不含
buymaxsize 默认值0100 表示不限制单笔上限;进阶样本给了一个具体的 10,明显更克制
计价币种与止损取值GBPtrailingstoploss=-1.5trigger=5USDtrailingstoploss=-1trigger=3样本面向的市场与止损幅度不同,照抄前先改成自己的计价币种
是否含 sellatloss / sellatresistance两者都有(=0)只有 sellatloss(=1)「到阻力位卖出」是标准样本独有的一路卖出触发
scanner 段内容exchange_bot_count=3autostart=0terminal_start_processmaxbotcount=6只含 atr72_pcnt/exitaftersell/enableleverage/use_default_scanner/maxbotcount=5/autosandelay/enable_buy_next两个样本的 scanner 段字段并不一致,扫描器的可配置项要按你要用的那份核对
telegram 段内容logger_level不含 logger_level日志级别只在标准样本里出现
一个重要提醒:进阶样本把八个买入过滤全部禁用、同时打开自定义策略,这意味着它的买入判断不再是「默认策略」。如果你只是想先跑通流程,从标准样本起步更不容易看错现象;想改策略逻辑,再考虑进阶样本。两份样本都属于示例配置,不是推荐配置。
买入过滤

八个买入侧开关分别是什么?「disable 其实是关掉关卡」是什么坑

买入侧开关的命名规律是:disable + 条件名。值为 1 表示禁用该条件,也就是把这道买入关卡拆掉;值为 0 才表示该条件生效。理解这一点,再看样本里的取值就不会读反。

开关类别作用方向适用场景注意点
disablebullonly趋势过滤限制只在多头趋势中买入顺趋势策略、想减少逆势进场标准样本取 0(生效)。关掉它等于允许逆势买入,回撤结构会明显变化
disablebuynearhigh位置过滤避免在接近近期高点时买入对追高敏感、想压低建仓成本标准样本取 1(已禁用)。这是样本里少见的「默认关掉一道保护」的地方
disablebuymacd动量过滤用 MACD 条件约束买入时点想过滤掉动量不足的进场标准样本取 0(生效)。与其它条件叠加时会显著减少交易次数
disablebuyema均线过滤用 EMA 条件约束买入时点与 MACD 配合做双确认仅进阶样本出现,标准样本里没有这个键
disablebuyobv量能过滤用 OBV 条件要求量价配合关注成交量确认的策略标准样本取 1(已禁用)。依赖成交量数据质量
disablebuyelderray强弱过滤用 Elder Ray 判断多空力量想过滤掉弱势反弹中的买入标准样本取 0(生效)。属于较「专业」的一路条件,调参前先理解它的读法
disablefailsafefibonaccilow兜底过滤斐波那契低点保护防止在极端位置买入标准样本取 1(已禁用)。名字里的 failsafe 说明它是最后一道保护
disableprofitbankreversal利润回流过滤结合「利润银行」反转条件约束买入不想在利润回吐阶段接盘标准样本取 0(生效)。与卖出侧的利润锁定逻辑相关,建议成对理解
怎么用这张表:不要一次改多个开关——每多开一道条件,交易次数都会下降,同时也会带来机会成本(长时间空仓、踏空一段趋势)。建议一次只改一个,用模拟模式跑同一段区间对比交易次数与空仓比例,再决定要不要保留。本站不提供「推荐组合」,因为条件越多不等于越好。
卖出与风控

卖出侧维度比买入侧更多:17 个真实开关逐项说明

一个容易被忽略的事实:这套PyCryptoBot PyCryptoBot 机器人在卖出与风控上的开关数量远多于买入侧。也就是说,它真正花力气的地方不是「怎么买」,而是「什么时候认亏、什么时候锁住利润、怎么防止把浮盈变成浮亏」。

开关作用默认值(取自样本)注意点
sellatloss允许按亏损卖出,作为一路卖出触发标准 0;进阶 1取 0 时这一路卖出条件不生效,等于不放任亏损离场
sellatresistance到阻力位即卖出标准 0仅标准样本出现;与「让利润奔跑」的思路相反,需明确取舍
selllowerpcnt低于买入价达到该百分点时卖出仅进阶 -2sellatloss 语义有重叠,同时开启时要想清楚谁先触发
trailingstoploss移动止损的止损幅度标准 -1.5;进阶 -1负号代表亏损方向;它是「跟随最高点回撤多少就卖」
trailingstoplosstrigger利润达到多少后开始启用移动止损标准 5;进阶 3只设止损不设触发点,止损会从一开始就生效,容易被正常波动扫出去
dynamictsl是否改用动态移动止损仅进阶 1取 0 时用固定版;取 1 后下面三个 multiplier 才生效
tslmultiplier动态止损幅度的倍数仅进阶 1.5仅在 dynamictsl=1 时有意义
tsltriggermultiplier动态触发点的倍数仅进阶 1.5同上;两个 multiplier 共同决定「多快开始保护」
tslmaxpcnt动态止损允许的最大回撤幅度仅进阶 -5它是动态机制的封顶值,别和 trailingstoploss 混为一谈
trailingsellpcnt移动卖出的触发幅度仅进阶 -0.25与移动止损不是同一机制,两者并存时触发顺序要实测确认
trailingsellimmediatepcnt达到该幅度立即卖出,不等周期收盘仅进阶 -1它会改变成交时点,回测与实盘的差异会因此放大
trailingsellbailoutpcnt急跌时的兜底卖出幅度仅进阶 -2.5名字里的 bailout 说明它是最后一层保护
preventloss是否启用「保本卖出」仅进阶 1官方 CHANGELOG 在 5.1.0 引入该选项(防亏损)
preventlosstrigger从多少利润开始盯保本仅进阶 1.25与下一项配对使用
preventlossmargin回落到多少就执行保本卖出仅进阶 0.5触发后回落即卖,目的是不让浮盈变成浮亏
nosellmaxpcnt利润率超过该值时先不卖出标准 3用于「涨得太快先观察」的取舍
nosellminpcnt利润率低于该值时先不卖出标准 -3小幅浮亏不卖,避免被摩擦成本反复消耗
这张表里最需要谨慎的是「同时开多路卖出」。移动止损、移动卖出、保本卖出、兜底卖出各自有自己的触发条件,谁能先触发决定你的实际离场价。本站没有实机验证它们的优先次序,因此不做任何「应该怎么配」的建议——请用模拟模式对同一段区间逐项开关、记录成交时点,自己看先后关系。
仓位与模式

一次买多少、以什么模式跑、要不要出图

前三组决定「买不买、卖不卖」,这一组决定「买多少」和「以什么形态运行」。其中 livewebsocket 两个开关最需要反复确认。

开关作用默认值(取自样本)注意点
buymaxsize单笔买入上限(以计价币种计)标准 0;进阶 100 表示不限制,新手很容易忽略这点而以为「有默认上限」
buyminsize单笔买入下限,低于该值不买标准 0要与交易所的最小下单量和精度规则配合,否则会出现下单被拒
buylastsellsize按上次卖出的规模决定本次买入规模仅进阶 1用于保持仓位规模一致,减少规模漂移
trailingbuypcnt价格回落到该百分比时再买入标准/进阶均 0.5属于「追低买入」机制,避免一次打满;配合 trailingimmediatebuy 系列行为会更复杂
live实盘开关(0/1)标准 0整份配置里最该反复确认的一个。上线前请把它仍然是 0 这件事当作一次单独检查
websocket是否使用 WebSocket 推送行情标准 0与轮询模式的 API 调用量差别明显;不同交易所的实现成熟度不同
autorestart异常后是否自动重启标准 0;进阶 1自动重启能救回挂掉的进程,但也可能掩盖真实 bug,使日志更难读
graphs是否输出图表标准 0依赖 matplotlib;容器镜像里已预设 matplotlib 配置目录,非 root 运行也不会因目录不可写而失败
stats是否输出运行统计标准 0复盘时有用;与日志一起构成事后核查的主要材料
use_sell_fee卖出时是否计入手续费标准 1直接关系成本口径,属于「看不出但影响结果」的那类开关
manual_trades_only只监控不下单,买卖手动执行CHANGELOG 6.4.0 引入(样本中未预置)适合长期持有但想继续看行情与保证金的场景
selltriggeroveride信号整体偏强买时抑制卖出触发CHANGELOG 6.4.0 引入(样本中未预置)官方说明其为自定义策略的配套开关,与点数制策略有关
同一份样PyCryptoBot 本文件里的两处写法不一致(实测发现):config.json.sample 中,binance 段的 granularity 写的是字符串 "1hour",而 coinbasecoinbasepro 段写的是整数秒 "3600"同一个字段在同一份文件里出现了两套写法。照抄样本时如果把两种写法混用(例如把 "1hour" 抄到 coinbase 段),很可能配出你意料之外的评估周期。碰到周期行为不对,先核对这里。
周期枚举值对应的短写含义适用场景
601m / 1min / 1T1 分钟高频试水;噪声大、API 调用密集
3005m / 5min / 5T5 分钟短线,对费率与滑点最敏感
90015m / 15min / 15T15 分钟日内波段
180030m / 30min / 30T30 分钟日内波段,交易次数适中
36001h / 1hour / 1H1 小时最常见的日内外组合;样本里 coinbase 段用的就是 3600
216006h / 6hour / 6H6 小时低频,适合不想频繁操作的人
864001d / 1day / 1D1 天最低频;指标预热需要的历史也最长
周期是封闭枚举:以上 7 档之外的值不会被接受,源码里对无法识别的取值会直接抛 Invalid Granularity。所以「我想用 2 小时」这种需求在当前实现下没有配置入口——这属于能力边界,不是参数问题。
分步操作

安全改配置的五步:一次只动一个开关

配置类问题的麻烦之处在于「改坏了不报错,只是行为变了」。下面这套顺序的目的是让每一次改动都能被单独归因。

  1. 先备份样本,再决定从哪一份起步

    命令:在工作目录执行 cp config.json.sample config.json(Windows 用 copy),并把原始样本另存一份到别的目录。预期结果:工作目录出现 config.json,且你手上还有一份未被修改的原始样本可随时对照。这一步的价值在后面每改一次都体现出来。

  2. 只改一个开关,并写下改动理由

    命令:用编辑器只修改一个键(例如把 disablebuymacd 从 0 改成 1),同时在旁边记一行「因为想减少 MACD 条件带来的交易次数」。预期结果:文件仍是合法 JSON——可以用 python -m json.tool config.json 校验,输出格式化后的 JSON 即表示语法正确。

  3. 保持 live 为 0,以非实盘模式跑一轮

    命令:先确认 "live" : 0,再按你的运行方式启动(本地 python3 pycryptobot.py,或容器 docker compose up)。预期结果:日志里出现行情与指标相关输出,且没有任何真实订单被提交。第一次跑务必用最小配置:只配一个币对、一个周期。

  4. 对照日志确认行为真的变了

    命令:查看工作目录下的 pycryptobot.log(compose 场景看挂载出来的宿主文件),搜索买卖决策相关的行。预期结果:你改动的那个条件确实影响了决策路径——如果日志里看不出差异,很可能是改动没被读到(配置文件路径不对、或进程没有重启)。

  5. 把这次改动记录下来,再动下一个开关

    命令:把「改了哪个键、从什么值改到什么值、这次运行的区间、观察到的现象」写进一份变更记录(哪怕是纯文本)。预期结果:当你之后回看某段表现异常时,能回答「那时候的配置是什么」。没有这份记录,所有参数结论都不可复现。

为什么反复强调「一次只动一个」:这套配置里有相当多互相牵制的开关——例如卖出侧同时开着移动止损、移动卖出与保本卖出,最终离场价取决于谁先触发。一次改多个,出来的结果无法归因,只能推倒重来。这一点和回测的方法论是同一个道理,详见回测、模拟与成本口径
FAQ

关于配置的高频问题

以下键名与默认值来自 2026-09-21 采集的两份官方样本;行为细节以官方仓库实现为准。本站不推荐具体参数组合。

为什么买入开关都叫 disable*,值还是 1?

因为它们表达的是「禁用某个条件」,不是「启用某个条件」。disablebuymacd: 1 的意思是「把 MACD 这道买入关卡关掉」,而 disablebuymacd: 0 才表示 MACD 条件参与判断。这个命名与直觉相反,读样本时最容易读反。建议做法是:改之前把当前取值抄一行在旁边,改完再抄一行,靠对比而不是靠记。

一份 config.json 能同时跑多个交易所或多个币对吗?

样本的结构是「按交易所分段」,每段各有一套 config(含 base_currency/quote_currency)。所以文件层面可以容纳多家交易所的配置;但一次运行的进程只服务一个币对。要同时跑多个币对,常见做法是准备多个工作目录(各自一份 config.json 与日志),再用 compose 或 systemd 起多个进程——这也是 docker-compose.yaml 里给出了多市场示例的原因。

livewebsocket 是一回事吗?

不是。live 决定「是否真的下单」,websocket 决定「行情怎么拿」——是轮询还是订阅推送。两者互相独立:可以 live=0websocket=1(用推送行情做模拟),也可以 live=1websocket=0(轮询下单)。上线前请单独确认 live,不要用「我记得改过」来判断。

granularity 到底该写 "1hour" 还是 3600

两种写法在代码里都能被识别(枚举同时接受整数秒和几种字符串别名,例如 1h1hour1H)。真正的问题是官方样本自己在同一个文件里用了两套写法binance 段是 "1hour"coinbasecoinbasepro 段是 "3600"。照抄时请让一个文件内的写法保持一致,便于排查;具体周期行为以运行日志为准。

两份样本我该从哪一份开始?

建议从 config.json.sample(标准样本)起步:它的买入过滤大部分处于生效状态,便于观察「默认行为长什么样」。config.json.advanced.sample 把八个买入过滤全部禁用并打开自定义策略,属于「把判断权交给策略文件」的形态,更适合已经想改策略逻辑的人。两份都只是示例,不是官方推荐配置。

改了配置文件需要重启吗?

配置是在进程启动时读取的,所以修改后需要重启进程才会生效——具体到 Telegram 控制面,官方还提供了「重新加载配置」类的动作可供使用。判断是否生效最可靠的办法不是看界面,而是看日志:如果行为没有变化,先怀疑配置没被重新读取(路径不对、进程没重启、或改的是另一份文件)。改完记得用 python -m json.tool config.json 校验一次 JSON 语法,语法错误会导致启动直接失败。

口径说明:本页所有开关名与默认值均逐字取自 PyCryptoBot 仓库中的两份官方样本文件,未做重命名;PyCryptoBot 的参数命名存在历史不一致(例如 disable* 的反向语义、同一份样本里 granularity 出现两种写法),本站按仓库实际写法记录而非按直觉整理。PyCryptoBot 的版本与分支现状见版本页;PyCryptoBot 的交易所覆盖见交易所矩阵页。本站未实机运行 PyCryptoBot。

下一步:这些开关最终作用于什么信号

配置开关决定「允许做什么」,但真正决定买卖时点的是策略代码。下一站看 models/Strategy.py 的真实方法清单,以及那套点数制自定义策略为什么不会被升级覆盖。