248 lines
9.6 KiB
Markdown
248 lines
9.6 KiB
Markdown
---
|
||
date:
|
||
<% tp.date.now ("YYYY-MM-DD HH:mm:ss") %>:
|
||
tags:
|
||
title:
|
||
---
|
||
|
||
帮我讲解一下下面的内容,没太看明白
|
||
|
||
|
||
|
||
```
|
||
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,今天机器人启动后会先加载这些未卖出的交易。
|
||
|
||
|
||
2. 计算当前可交易的货币对列表
|
||
|
||
- 含义: 根据你的配置(pairlist,交易对列表),确定当前可以交易的货币对(比如 BTC/USD、ETH/USD)。
|
||
|
||
- 作用: 动态更新交易对,可能剔除流动性差的或添加新的交易对。
|
||
|
||
- 你的背景: 类似你在 Go/Node.js 中动态管理 API 请求的目标列表。
|
||
|
||
|
||
3. 下载 OHLCV 数据
|
||
|
||
- 含义: OHLCV 是指“开盘价、最高价、最低价、收盘价、成交量”的数据,用于分析市场走势。
|
||
|
||
- 细节:
|
||
|
||
- 只针对配置中的交易对和“信息对”(informative pairs,可能用于辅助决策的额外数据)。
|
||
|
||
- 为了减少网络请求,每根K线(比如 1小时K线)只下载一次。
|
||
|
||
- 作用: 为后续策略分析提供最新的市场数据。
|
||
|
||
- 举例: 下载了过去 1 小时 BTC/USD 的价格数据。
|
||
|
||
|
||
4. 调用 bot_loop_start() 回调
|
||
|
||
- 含义: 如果你在策略中定义了这个函数,它会在每次循环开始时运行。
|
||
|
||
- 作用: 让你插入自定义逻辑,比如打印日志或检查外部条件。
|
||
|
||
- 举例: 你可以用它记录每次循环的时间。
|
||
|
||
|
||
5. 逐个分析交易对的策略
|
||
|
||
- 含义: 对每个交易对运行你的策略代码,分三步调用:
|
||
|
||
1. populate_indicators(): 计算技术指标(如均线、RSI)。
|
||
|
||
2. populate_entry_trend(): 判断是否应该买入(进场信号)。
|
||
|
||
3. populate_exit_trend(): 判断是否应该卖出(离场信号)。
|
||
|
||
- 作用: 这是策略的核心,决定买卖的时机。
|
||
|
||
- 举例: 如果 BTC/USD 的价格高于 20 日均线,可能触发买入信号。
|
||
|
||
|
||
6. 从交易所更新交易和订单状态
|
||
|
||
- 含义: 检查当前订单的状态(比如是否已成交、是否超时)。
|
||
|
||
- 细节:
|
||
|
||
- 如果订单已成交,调用 order_filled() 回调。
|
||
|
||
- 检查未成交订单是否超时:
|
||
|
||
- 买入订单超时调用 check_entry_timeout()。
|
||
|
||
- 卖出订单超时调用 check_exit_timeout()。
|
||
|
||
- 调整订单价格(如果需要):
|
||
|
||
- 调用 adjust_order_price(),如果没实现则分别调用 adjust_entry_price()(买入)和 adjust_exit_price()(卖出)。
|
||
|
||
- 作用: 确保订单状态与交易所一致,避免错过成交或长时间挂单。
|
||
|
||
- 举例: 你下的买入订单 1 小时没成交,机器人可能会取消它。
|
||
|
||
|
||
7. 检查现有仓位并决定是否卖出
|
||
|
||
- 含义: 检查当前持有的仓位(已买入但未卖出的交易),决定是否需要卖出。
|
||
|
||
- 细节:
|
||
|
||
- 考虑止损(stoploss)、投资回报率(ROI)、卖出信号(exit-signal)等。
|
||
|
||
- 可通过 custom_exit() 或 custom_stoploss() 自定义卖出逻辑。
|
||
|
||
- 卖出价格由配置中的 exit_pricing 或 custom_exit_price() 决定。
|
||
|
||
- 卖出前调用 confirm_trade_exit() 确认。
|
||
|
||
- 作用: 自动执行卖出操作,比如达到盈利目标或触发止损。
|
||
|
||
- 举例: BTC/USD 涨了 5%,达到 ROI,机器人自动卖出。
|
||
|
||
|
||
8. 调整现有交易的仓位
|
||
|
||
- 含义: 如果开启了仓位调整功能,调用 adjust_trade_position() 检查是否需要加仓或减仓。
|
||
|
||
- 作用: 动态管理仓位,比如在盈利时加仓。
|
||
|
||
- 举例: BTC/USD 涨了 3%,你决定再投入一部分资金。
|
||
|
||
|
||
9. 检查交易槽位是否可用
|
||
|
||
- 含义: 检查是否达到最大同时交易数量(max_open_trades)。
|
||
|
||
- 作用: 避免超过设定的交易上限。
|
||
|
||
- 举例: 如果上限是 5 个交易,而已有 5 个未关闭,就不会开新仓。
|
||
|
||
|
||
10. 验证买入信号并开新仓
|
||
|
||
- 含义: 如果有买入信号(由 populate_entry_trend() 生成),决定是否下单买入。
|
||
|
||
- 细节:
|
||
|
||
- 买入价格由 entry_pricing 配置或 custom_entry_price() 决定。
|
||
|
||
- 在杠杆模式(Margin/Futures)下,调用 leverage() 确定杠杆倍数。
|
||
|
||
- 调用 custom_stake_amount() 确定投入金额。
|
||
|
||
- 买入前调用 confirm_trade_entry() 确认。
|
||
|
||
- 作用: 执行买入操作,开新仓。
|
||
|
||
- 举例: ETH/USD 触发买入信号,机器人以市价买入 0.1 ETH。
|
||
|
||
|
||
11. 重复循环
|
||
|
||
- 上述步骤完成后,机器人等待几秒(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 查看),甚至写脚本监控性能。
|
||
|
||
|
||
---
|
||
|
||
如果还有疑问
|
||
|
||
- 你没看明白的具体是哪部分?是回调函数的作用,还是某个步骤的逻辑?告诉我,我再深入讲解! |