notes_works/new notes/freqtrade_基础.md
zhangkun9038@dingtalk.com 4380e95e00 2025-04-07 13:07:53: ...
2025-04-07 13:08:02 +08:00

9.6 KiB
Raw Permalink Blame History

date tags title
<% tp.date.now ("YYYY-MM-DD HH:mm:ss") %>

帮我讲解一下下面的内容,没太看明白

Bot execution logic¶Starting freqtrade in dry-run or live mode (using freqtrade trade) will start the bot and start the bot iteration loop. This will also run the bot_start() callback.By default, the bot loop runs every few seconds (internals.process_throttle_secs) and performs the following actions:
``
Fetch open trades from persistence.
Calculate current list of tradable pairs.
Download OHLCV data for the pairlist including all informative pairs
This step is only executed once per Candle to avoid unnecessary network traffic.
Call bot_loop_start() strategy callback.
Analyze strategy per pair.
    Call populate_indicators()
    Call populate_entry_trend()
    Call populate_exit_trend()
Update trades open order state from exchange.
    Call order_filled() strategy callback for filled orders.
    Check timeouts for open orders.
        Calls check_entry_timeout() strategy callback for open entry orders.
        Calls check_exit_timeout() strategy callback for open exit orders.
        Calls adjust_order_price() strategy callback for open orders.
            Calls adjust_entry_price() strategy callback for open entry orders. only called when adjust_order_price() is not implemented
            Calls adjust_exit_price() strategy callback for open exit orders. only called when adjust_order_price() is not implemented
Verifies existing positions and eventually places exit orders.
    Considers stoploss, ROI and exit-signal, custom_exit() and custom_stoploss().
    Determine exit-price based on exit_pricing configuration setting or by using the custom_exit_price() callback.
    Before an exit order is placed, confirm_trade_exit() strategy callback is called.
Check position adjustments for open trades if enabled by calling adjust_trade_position() and place additional order if required.
Check if trade-slots are still available (if max_open_trades is reached).
Verifies entry signal trying to enter new positions.
    Determine entry-price based on entry_pricing configuration setting, or by using the custom_entry_price() callback.
    In Margin and Futures mode, leverage() strategy callback is called to determine the desired leverage.
    Determine stake size by calling the custom_stake_amount() callback.
    Before an entry order is placed, confirm_trade_entry() strategy callback is called.

这段内容是 Freqtrade 官方文档中关于“机器人执行逻辑”Bot Execution Logic的描述主要讲解了 Freqtrade 交易机器人在启动后(无论是模拟模式 Dry-run 还是实盘模式 Live mode如何通过一个循环Bot Iteration Loop持续运行并执行交易相关的操作。你的困惑可能来自于专业术语较多或逻辑流程不够直观下面我会尽量用通俗的语言一步步拆解这段内容。


核心概念

Freqtrade 的机器人并不是一次性执行完所有任务后就停止,而是像一个“永动机”一样,每隔几秒(由 internals.process_throttle_secs 参数控制,默认为几秒钟)运行一次完整的逻辑循环。这个循环会检查市场、更新交易状态、执行买卖操作,直到你手动停止机器人。

启动机器人时(用命令 freqtrade trade会触发以下流程

  1. 初始化: 调用 bot_start() 回调函数(如果你在策略中定义了这个函数,它会在机器人启动时执行一次)。

  2. 进入循环: 每隔几秒执行一次完整的逻辑。


循环中的每一步

下面是循环中每次迭代的具体步骤,我会逐一解释它们的含义和作用:

  1. 从持久化存储中获取未关闭的交易
  • 含义: 检查当前有哪些交易(比如已经买入但还没卖出的订单)还在进行中。

  • 作用: 确保机器人知道当前的交易状态,避免重复操作或遗漏已有交易。

  • 举例: 你昨天买了 BTC/USD今天机器人启动后会先加载这些未卖出的交易。

  1. 计算当前可交易的货币对列表
  • 含义: 根据你的配置pairlist交易对列表确定当前可以交易的货币对比如 BTC/USD、ETH/USD

  • 作用: 动态更新交易对,可能剔除流动性差的或添加新的交易对。

  • 你的背景: 类似你在 Go/Node.js 中动态管理 API 请求的目标列表。

  1. 下载 OHLCV 数据
  • 含义: OHLCV 是指“开盘价、最高价、最低价、收盘价、成交量”的数据,用于分析市场走势。

  • 细节:

    • 只针对配置中的交易对和“信息对”informative pairs可能用于辅助决策的额外数据

    • 为了减少网络请求每根K线比如 1小时K线只下载一次。

  • 作用: 为后续策略分析提供最新的市场数据。

  • 举例: 下载了过去 1 小时 BTC/USD 的价格数据。

  1. 调用 bot_loop_start() 回调
  • 含义: 如果你在策略中定义了这个函数,它会在每次循环开始时运行。

  • 作用: 让你插入自定义逻辑,比如打印日志或检查外部条件。

  • 举例: 你可以用它记录每次循环的时间。

  1. 逐个分析交易对的策略
  • 含义: 对每个交易对运行你的策略代码,分三步调用:

    1. populate_indicators(): 计算技术指标如均线、RSI

    2. populate_entry_trend(): 判断是否应该买入(进场信号)。

    3. populate_exit_trend(): 判断是否应该卖出(离场信号)。

  • 作用: 这是策略的核心,决定买卖的时机。

  • 举例: 如果 BTC/USD 的价格高于 20 日均线,可能触发买入信号。

  1. 从交易所更新交易和订单状态
  • 含义: 检查当前订单的状态(比如是否已成交、是否超时)。

  • 细节:

    • 如果订单已成交,调用 order_filled() 回调。

    • 检查未成交订单是否超时:

      • 买入订单超时调用 check_entry_timeout()。

      • 卖出订单超时调用 check_exit_timeout()。

    • 调整订单价格(如果需要):

      • 调用 adjust_order_price(),如果没实现则分别调用 adjust_entry_price()(买入)和 adjust_exit_price()(卖出)。
  • 作用: 确保订单状态与交易所一致,避免错过成交或长时间挂单。

  • 举例: 你下的买入订单 1 小时没成交,机器人可能会取消它。

  1. 检查现有仓位并决定是否卖出
  • 含义: 检查当前持有的仓位(已买入但未卖出的交易),决定是否需要卖出。

  • 细节:

    • 考虑止损stoploss、投资回报率ROI、卖出信号exit-signal等。

    • 可通过 custom_exit() 或 custom_stoploss() 自定义卖出逻辑。

    • 卖出价格由配置中的 exit_pricing 或 custom_exit_price() 决定。

    • 卖出前调用 confirm_trade_exit() 确认。

  • 作用: 自动执行卖出操作,比如达到盈利目标或触发止损。

  • 举例: BTC/USD 涨了 5%,达到 ROI机器人自动卖出。

  1. 调整现有交易的仓位
  • 含义: 如果开启了仓位调整功能,调用 adjust_trade_position() 检查是否需要加仓或减仓。

  • 作用: 动态管理仓位,比如在盈利时加仓。

  • 举例: BTC/USD 涨了 3%,你决定再投入一部分资金。

  1. 检查交易槽位是否可用
  • 含义: 检查是否达到最大同时交易数量max_open_trades

  • 作用: 避免超过设定的交易上限。

  • 举例: 如果上限是 5 个交易,而已有 5 个未关闭,就不会开新仓。

  1. 验证买入信号并开新仓
  • 含义: 如果有买入信号(由 populate_entry_trend() 生成),决定是否下单买入。

  • 细节:

    • 买入价格由 entry_pricing 配置或 custom_entry_price() 决定。

    • 在杠杆模式Margin/Futures调用 leverage() 确定杠杆倍数。

    • 调用 custom_stake_amount() 确定投入金额。

    • 买入前调用 confirm_trade_entry() 确认。

  • 作用: 执行买入操作,开新仓。

  • 举例: ETH/USD 触发买入信号,机器人以市价买入 0.1 ETH。

  1. 重复循环
  • 上述步骤完成后机器人等待几秒process_throttle_secs然后重新开始循环直到你停止它。

用生活化的比喻理解

想象 Freqtrade 是一个“超市收银员”,每隔几秒检查一次:

  1. 看看手头的单子(获取未关闭交易)。

  2. 更新商品清单(计算交易对列表)。

  3. 拿最新的价格表(下载 OHLCV 数据)。

  4. 喊一声开工bot_loop_start())。

  5. 分析每个商品是否值得买或卖(策略分析)。

  6. 确认订单状态(更新交易所数据)。

  7. 决定卖掉手里的货(检查仓位并卖出)。

  8. 调整购物篮里的东西(调整仓位)。

  9. 看看还能不能再买(检查交易槽位)。

  10. 发现好货就下单(执行买入)。 然后重复这个过程,像一个勤劳的机器人收银员。


对你的背景的适应

  • Go/Node.js 经验: 这个循环类似于事件驱动编程Event Loop每次迭代处理一堆任务。你可以把回调函数callback看作异步任务的处理器。

  • Linux 运维经验: 你可以轻松管理 Freqtrade 的日志user_data/log、进程用 ps 或 docker ps 查看),甚至写脚本监控性能。


如果还有疑问

  • 你没看明白的具体是哪部分?是回调函数的作用,还是某个步骤的逻辑?告诉我,我再深入讲解!