freqtrade IStrategy 接口 · strategy as a class
populate_indicators 算指标(RSI、EMA、布林带),populate_entry_trend 定进场条件,populate_exit_trend 定出场条件。框架管回测、下单、风控,你只管"什么时候买、什么时候卖"。声明式、可读、可回测——这就是为什么 freqtrade 适合新手。
freqtrade 的策略是一个 Python 类,继承 IStrategy。你不用管事件、不用管下单、不用管回测引擎——只填三个方法。
给 dataframe 加指标列:RSI、EMA、ATR、布林带……用 ta-lib 或 pandas-ta。输入是 OHLCV,输出是加了列的 df。
给 df 加 enter_long 列:满足条件设 1,否则 0。比如 RSI<30 且 close>EMA20 就进场。
给 df 加 exit_long 列:满足出场条件设 1。比如 RSI>70 或止损触发。
回测、滑点、手续费、下单、仓位、止损、止盈、Telegram 通知——框架全包,你不用写。
这种"声明式"写法的好处:策略逻辑就是几行布尔条件,读代码就知道在干什么。坏处:灵活性不如 vnpy——你想做"根据持仓时间动态调止损"这种复杂逻辑,得绕一点(用 custom_stoploss)。
下面是一个 RSI 均线策略的模板,挖了 4 个空。从下方选项里挑合适的填进去(点空格再点选项),全部填对策略就能跑。
策略写好后,回测就一行命令:freqtrade backtesting --strategy RsiStrategy --timerange 20230101-20240101。框架会拿历史 OHLCV,按你的三个方法生成信号,模拟下单,算收益、夏普、最大回撤、胜率。
关键概念:dataframe 是逐行推进的。框架从第一根 bar 走到最后一根,每根都跑你的三个方法。但要注意——populate_indicators 算 RSI 时,第 14 根 bar 之前 RSI 是 NaN(数据不够)。框架会自动跳过这些 bar,不会假装有信号。
另一个高频踩坑:未来函数。你的进场条件用了未来才有的数据(比如用 df['close'].shift(-1) 看明天),回测会"作弊"——胜率虚高。freqtrade 默认不让你这么干,但你自己写指标时要小心。规则:第 i 根 bar 的信号,只能用第 i 根及之前的数据。