Freqtrade 基础知识¶
本页介绍 Freqtrade 的基本工作原理和操作概念。
Freqtrade 术语¶
- 策略(Strategy):你的交易策略,告诉机器人该做什么。
- 交易(Trade):已开仓的头寸。
- 未成交订单(Open Order):当前已提交到交易所但尚未完成的订单。
- 交易对(Pair):可交易的货币对,通常格式为 基础/计价(例如
XRP/USDT表示现货,XRP/USDT:USDT表示期货)。 - 时间周期(Timeframe):使用 K 线的长度(例如
"5m"、"1h"等)。 - 技术指标(Indicators):技术分析指标(如 SMA、EMA、RSI 等)。
- 限价单(Limit order):在指定价格或更优价格执行的订单。
- 市价单(Market order):保证成交,但根据订单大小可能会影响市场价格。
- 当前收益(Current Profit):当前交易中尚未实现的(未实现)利润。此数值主要在机器人和用户界面中使用。
- 已实现收益(Realized Profit):已经实现的利润。仅在结合部分平仓时相关——这也解释了其计算逻辑。
- 总收益(Total Profit):已实现与未实现收益的总和。相对数值(%)基于该笔交易的总投资额进行计算。
手续费处理¶
Freqtrade 的所有收益计算均包含手续费。在回测 / 超参优化 / 模拟运行模式下,使用交易所默认手续费(交易所最低档费率)。在实盘操作中,则使用交易所实际收取的手续费(包括 BNB 折扣等优惠)。
交易对命名¶
Freqtrade 遵循ccxt 命名规范来命名币种。在错误市场使用错误的命名方式通常会导致机器人无法识别交易对,从而出现“该交易对不可用”之类的错误。
现货交易对命名¶
对于现货交易对,命名格式为 基础/计价(例如 ETH/USDT)。
期货交易对命名¶
对于期货交易对,命名格式为 基础/计价:结算货币(例如 ETH/USDT:USDT)。
机器人执行逻辑¶
以模拟运行或实盘模式启动 freqtrade(使用 freqtrade trade)将启动机器人并进入机器人迭代循环,同时会运行 bot_start() 回调函数。
默认情况下,机器人循环每隔几秒(internals.process_throttle_secs)运行一次,执行以下操作:
- 从持久化存储中获取未平仓交易。
- 计算当前可交易的交易对列表。
- 下载交易对列表的 OHLCV 数据,包括所有辅助数据对
此步骤每个 K 线周期仅执行一次,以避免不必要的网络流量。 - 调用
bot_loop_start()策略回调函数。 - 按交易对分析策略:
- 调用
populate_indicators() - 调用
populate_entry_trend() - 调用
populate_exit_trend()
- 调用
- 从交易所更新交易的挂单状态:
- 对已成交的订单调用
order_filled()策略回调函数。 - 检查挂单的超时情况:
- 对未成交的买入订单调用
check_entry_timeout()策略回调函数。 - 对未成交的卖出订单调用
check_exit_timeout()策略回调函数。 - 对挂单调用
adjust_order_price()策略回调函数:- 对未成交的买入订单调用
adjust_entry_price()策略回调函数。仅在未实现adjust_order_price()时调用 - 对未成交的卖出订单调用
adjust_exit_price()策略回调函数。仅在未实现adjust_order_price()时调用
- 对未成交的买入订单调用
- 对未成交的买入订单调用
- 对已成交的订单调用
- 验证现有持仓并视情况下达卖出平仓订单:
- 考虑止损、ROI 和卖出信号,以及
custom_exit()和custom_stoploss()。 - 根据
exit_pricing配置设置或通过custom_exit_price()回调函数确定卖出价格。 - 在下达卖出订单前,会调用
confirm_trade_exit()策略回调函数。
- 考虑止损、ROI 和卖出信号,以及
- 如果启用了仓位调整功能,则调用
adjust_trade_position()检查未平仓交易,并在需要时下达追加订单。 - 检查交易仓位是否仍有空位(是否已达到
max_open_trades限制)。 - 验证买入信号,尝试开立新仓位:
- 根据
entry_pricing配置设置或通过custom_entry_price()回调函数确定买入价格。 - 在保证金和期货模式下,调用
leverage()策略回调函数以确定期望的杠杆倍数。 - 通过调用
custom_stake_amount()回调函数确定投注金额。 - 在下达买入订单前,会调用
confirm_trade_entry()策略回调函数。
- 根据
此循环将不断重复,直到机器人停止。
回测 / 超参数优化执行逻辑¶
回测 或 超参数优化 仅执行上述部分逻辑,因为大多数交易操作都是完全模拟的。
- 加载配置交易对的历史数据。
- 调用
bot_start()一次。 - 计算指标(每个交易对调用一次
populate_indicators())。 - 计算买入/卖出信号(每个交易对调用一次
populate_entry_trend()和populate_exit_trend())。 - 每根 K 线循环模拟入场和出场点。
- 调用策略回调函数
bot_loop_start()。 - 检查订单超时,可通过
unfilledtimeout配置,或通过策略回调函数check_entry_timeout()/check_exit_timeout()进行检查。 - 对未成交订单调用策略回调函数
adjust_order_price()。- 对未成交的入场订单调用策略回调函数
adjust_entry_price()。仅在未实现adjust_order_price()时调用! - 对未成交的出场订单调用策略回调函数
adjust_exit_price()。仅在未实现adjust_order_price()时调用!
- 对未成交的入场订单调用策略回调函数
- 检查交易入场信号(
enter_long/enter_short列)。 - 确认交易入场/出场(如果策略中已实现,则调用
confirm_trade_entry()和confirm_trade_exit())。 - 调用策略中实现的
custom_entry_price()来确定入场价格(价格会被调整至开盘 K 线范围内)。 - 在保证金和期货模式下,调用策略回调函数
leverage()来确定所需杠杆。 - 通过调用
custom_stake_amount()回调函数确定下注金额。 - 若启用,检查已开仓交易的仓位调整,并调用
adjust_trade_position()判断是否需要追加订单。 - 对已成交的入场订单调用策略回调函数
order_filled()。 - 调用
custom_stoploss()和custom_exit()以查找自定义出场点。 - 对于基于出场信号、自定义出场或部分出场的情况:调用
custom_exit_price()确定出场价格(价格会被调整至收盘 K 线范围内)。 - 对已成交的出场订单调用策略回调函数
order_filled()。
- 调用策略回调函数
- 生成回测报告输出
注意
回测和超参数优化(Hyperopt)在计算中均包含交易所默认费用。可通过指定 --fee 参数,将自定义费用传入回测/超参数优化。
回调函数调用频率
回测中每个回调函数每根 K 线最多调用一次(--timeframe-detail 参数可修改此行为,改为每根详细 K 线调用一次)。大多数回调函数在实盘运行中通常每 ~5 秒调用一次,这可能导致回测结果与实盘存在差异。