第 4 章 · 05 订单调整与持仓微调


文档摘要

第 4 章 · 05 订单调整与持仓微调 本节摘要:止损之外,freqtrade 还提供两类「持仓微调」能力:DCA 与部分平仓(用 回调返回正/负数,实现「补仓摊低成本」或「分批获利了结」)与订单价格调整(用 / / 改未成交挂单的价格,以及 / 处理超时)。本节讲透这些机制:DCA 的典型逻辑(浮亏补仓)、部分平仓后的 与 如何变化、订单调整回调的优先级、杠杆/保证金下的特殊回调( 、 )。读完本节,你能实现「分批建仓 + 分批出场 + 动态调价」的专业级仓位管理。 内容来源:原项目文档 ,汉化并套用体系化模板。 ⚠️ 风险提示:DCA(补仓摊低成本)是「让亏损仓位更大」的双刃剑——方向继续错会让单笔亏损成倍放大。

第 4 章 · 05 订单调整与持仓微调

本节摘要:止损之外,freqtrade 还提供两类「持仓微调」能力:DCA 与部分平仓(用 adjust_trade_position 回调返回正/负数,实现「补仓摊低成本」或「分批获利了结」)与订单价格调整(用 adjust_order_price/adjust_entry_price/adjust_exit_price 改未成交挂单的价格,以及 check_entry_timeout/check_exit_timeout 处理超时)。本节讲透这些机制:DCA 的典型逻辑(浮亏补仓)、部分平仓后的 realized_profitstake_amount 如何变化、订单调整回调的优先级、杠杆/保证金下的特殊回调(leveragecustom_stake_amount)。读完本节,你能实现「分批建仓 + 分批出场 + 动态调价」的专业级仓位管理。

内容来源:原项目文档 docs/strategy-callbacks.md,汉化并套用体系化模板。

⚠️ 风险提示:DCA(补仓摊低成本)是「让亏损仓位更大」的双刃剑——方向继续错会让单笔亏损成倍放大。务必配合硬性「最大加仓次数」与「最大持仓占比」限制,且只在对长期趋势有信心的策略里用。

学习目标

阅读完本节,你应当能够:

  1. 开启 position_adjustment_enable,实现 adjust_trade_positionDCA 加仓部分平仓
  2. 理解加仓后 open_rate/stake_amount/realized_profit变化
  3. max_entry_position_adjustment 限制最大加仓次数
  4. 实现 adjust_order_price 调整未成交挂单价格。
  5. 实现 check_entry_timeout/check_exit_timeout 处理挂单超时
  6. 在杠杆/保证金模式下实现 leveragecustom_stake_amount 回调。

一、两类持仓微调:加仓减仓 vs 改挂单

  • adjust_trade_position:持仓已经成交后,决定要不要再加/再减。
  • adjust_order_price 系列:挂单还没成交(挂在订单簿),决定要不要改价或撤。

二、开启 DCA:position_adjustment_enable

adjust_trade_position 默认不调用,需在配置开启:

{ "position_adjustment_enable": true }

签名(第 02 节已给):

def adjust_trade_position(self, trade: Trade, current_time: datetime, current_rate: float, current_profit: float, min_stake: float | None, max_stake: float | None, **kwargs) -> float | None | list:

返回值:

  • 正数:加仓,金额是返回的 stake(单位 quote 币)。
  • 负数:部分平仓,绝对值是减仓的 stake。
  • None:不动。
  • 列表:可一次返回多个动作(高级用法)。

三、DCA:浮亏补仓

经典 DCA(Dollar-Cost Averaging)——「浮亏 5% 时补一仓,最多补 3 次」:

def adjust_trade_position(self, trade, current_time, current_rate, current_profit, min_stake, max_stake, **kwargs): # 只补一次仓(防止无脑加),且浮亏够深 if current_profit < -0.05 and trade.nr_of_successful_entries < 4: # 加一仓,金额不超过 max_stake stake = min(trade.stake_amount, max_stake or trade.stake_amount) return stake return None

参数说明:

  • trade.nr_of_successful_entries:已成交的入场订单数(初始=1,补一次=2)。用它限制补仓次数。
  • min_stake / max_stake:引擎算出的「本次可加仓的金额范围」,务必夹取避免超出余额。

💡 DCA 后的均价:加仓后 trade.open_rate 会按总量与总投入重新算均价。例:100@100 价买入 1 个,补 100@80 价买入 1.25 个,新均价 = 200 / 2.25 ≈ 88.9——成本被「拉低」了。这就是 DCA 的本质。

限制最大加仓次数

类属性(或在配置 JSON):

max_entry_position_adjustment = 3 # 最多补 3 次,即最多 4 次入场

这是硬上限,即使 adjust_trade_position 想加更多,引擎也会拒绝。新人建议设 1~2,避免失控。

四、部分平仓:分批获利了结

返回负数就是部分平仓:

def adjust_trade_position(self, trade, current_time, current_rate, current_profit, min_stake, max_stake, **kwargs): # 浮盈 5% 时,先平 30% 锁定部分利润 if current_profit > 0.05 and trade.nr_of_successful_exits == 0: return -trade.stake_amount * 0.30 # 减仓 30% # 浮盈 10% 时,再平 40% if current_profit > 0.10 and trade.nr_of_successful_exits == 1: return -trade.stake_amount * 0.40 return None

部分平仓后:

  • trade.realized_profit 增加(已锁定利润)。
  • trade.stake_amounttrade.amount 减少。
  • trade.nr_of_successful_exits +1。

⚠️ 总盈亏计算:有部分平仓后,单纯看 current_profit(浮盈)会低估真实盈亏,因为它忽略了已锁定的 realized_profit。完整公式见文档,近似为:总盈亏 = realized_profit / 初始 stake + current_profit × 当前 stake / 初始 stake。Telegram 的 /status 会显示正确数字。

五、订单价格调整:adjust_order_price 系列

订单还没成交挂在订单簿时,你可以调价。回调优先级:

# 优先用这个(更细的控制) def adjust_order_price(self, trade, order, **kwargs) -> float | None: ... # 如果不实现上面的,引擎会分别调这两个 def adjust_entry_price(self, trade, order, **kwargs) -> float | None: ... def adjust_exit_price(self, trade, order, **kwargs) -> float | None: ...

返回新的价格(或 None 保持不变)。典型用法——挂单超过 N 分钟没成交就改价:

def adjust_order_price(self, trade, order, current_time, **kwargs): # 挂单超过 10 分钟,把价格调到当前最佳买卖盘 if order and (current_time - order.order_date_utc).total_seconds() > 600: pair = trade.pair ob = self.dp.orderbook(pair, 1) if not ob: return None if order.ft_order_side == "buy": return ob["bids"][0][0] else: return ob["asks"][0][0] return None

六、挂单超时:check_entry_timeout / check_exit_timeout

除了改价,也可以「超时就撤单」:

def check_entry_timeout(self, pair: str, trade: Trade, order: Order, current_time: datetime, **kwargs) -> bool: # 挂单超过 10 分钟没成交,撤 return (current_time - order.order_date_utc).total_seconds() > 600

返回 True 撤单,False 继续。还有配置版的 unfilledtimeout:

"unfilledtimeout": { "entry": 10, "exit": 10, "exit_timeout_count": 0, "unit": "minutes" }

回调优先于配置——实现了回调,配置就被忽略。

七、杠杆与保证金回调

合约/保证金模式下,还有两个特殊回调:

leverage:决定杠杆倍数

def leverage(self, pair: str, current_time: datetime, current_rate: float, proposed_leverage: float, max_leverage: float, side: str, **kwargs) -> float: # 根据 ATR 动态调杠杆:波动大降杠杆 df, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) if df is not None and len(df) > 0: atr_pct = df["atr"].iloc[-1] / current_rate if atr_pct > 0.02: return min(proposed_leverage, 3) return proposed_leverage

proposed_leverage 来自配置 leverage.num_segmentsstake_amount 默认值,max_leverage 是交易所允许的最大值。

custom_stake_amount:决定每笔下注金额

def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, proposed_stake: float, min_stake: float | None, max_stake: float, leverage: float, entry_tag: str | None, side: str, **kwargs) -> float: # 已开 5 个仓,后续仓位缩小一半 if Trade.get_open_trade_count() >= 5: return proposed_stake * 0.5 return proposed_stake

proposed_stake 来自配置 stake_amount,你可以在 min_stake/max_stake 区间内调整。

💡 杠杆 + 止损 + DCA 的危险叠加:DCA 让仓位变大,杠杆放大盈亏,止损可能因为均价变化而失效。合约策略里同时开这三件套,务必先充分回测(用 --timeframe-detail 提高精度),并设硬性 max 限制。

八、典型组合:DCA + 部分平仓 + 追踪止损

实战中常组合:

  1. 入场后设 -10% 静态止损 + trailing。
  2. 浮亏 5% 用 adjust_trade_position 补仓一次(均价拉低)。
  3. 浮盈 5% 部分平仓 30%(锁定部分利润)。
  4. 浮盈继续扩大,trailing 接管锁利。
  5. 出场信号或 ROI 触发,平剩余仓位。

九、回测与实盘的差异

  • DCA 在 backtesting 中需要下载数据足够长——补仓可能持续数小时,数据不够会被截断。
  • adjust_order_price 在 backtesting 中:回测的成交模型较简单,改价回调的效果与实盘有差异。
  • 杠杆 + DCA 的回测:必须用 --timeframe-detail 提高精度,否则强平时机会失真。

本节要点回顾

  1. 两类微调:adjust_trade_position(已成交持仓的加减仓)、adjust_order_price 系列(未成交挂单的改价/超时)。
  2. 开启 DCA:配置 position_adjustment_enable: true,类属性 max_entry_position_adjustment 限最大补仓次数。
  3. DCA 逻辑:返回正数加仓(金额是 stake);加仓后 open_rate 按总量重算均价,典型浮亏 5% 补一次。
  4. 部分平仓:返回负数减仓;realized_profit 增加、stake_amount 减少;current_profit 不再代表总盈亏,要算上 realized_profit
  5. 改价/超时:adjust_order_price 改挂单价(优先于 adjust_entry/exit_price),check_entry/exit_timeout 超时撤单,回调优先于 unfilledtimeout 配置。
  6. 杠杆回调:leverage(pair, ..., proposed_leverage, max_leverage) 决定倍数,custom_stake_amount 决定每单金额。
  7. 典型组合:入场 + 静态止损 + trailing + DCA + 部分平仓 + ROI/信号出场,组合前务必用 --timeframe-detail 回测。

至此第 4 章完。下一章(第 5 章)我们转向「数据获取与分析」——下载数据、数据格式、用 FreqUI 与 plot-dataframe 可视化行情与信号。


发布者: 作者: 灏天文库 转发
评论区 (0)
U