跳至内容

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() 策略回调函数。
  • 如果启用了仓位调整功能,则调用 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 秒调用一次,这可能导致回测结果与实盘存在差异。