v1 · 阶段 A

空壳能 load

这版还不买卖。只让软件认出有这么一份策略。

INTERFACE_VERSION=3 timeframe=4h can_short=False process_only_new_candles=True

1一句话

这版还不买卖。它只是让交易软件认出有这么一份策略,名字叫 FirstSma。

2生活类比

开饭店。这版只办好营业执照、挂上店名、摆好三张空桌子。还没有菜单,所以不会有客人点菜。但巡查的人能在名单上找到这家店。

3搬到这版

文件user_data/strategies/FirstSma.py
类名FirstSma。命令认的是类名,不是文件名。
三张空桌populate_indicators / populate_entry_trend / populate_exit_trend,现在只把表格原样还回去。
占位stoploss = -0.99、minimal_roi = {"0": 10}、startup_candle_count = 1。不写加载会挂,含义放到 v3 / v4。

4每个新参数

INTERFACE_VERSION = 3

插座规格。插错代,电器不认。

它是什么
告诉 Freqtrade:我用的是第几代策略接口。
不管它会怎样
不写或写错,新写法 enter_long 可能不认,策略加载失败。
拧大 / 拧小 / 拧反了
写成 2,会走老的 buy / sell 接口,以后会被丢掉。不要拧,锁在 3。
timeframe = "4h"

你隔多久看一次盘。

它是什么
策略看的 K 线周期。一根走完才算一次。
不管它会怎样
不写就听 config。两边不一致,回测和实盘对不齐。
拧大 / 拧小 / 拧反了
拧到 1d,更慢、信号更少。拧到 1h,同样的「20 均线」只覆盖 20 小时,不是大约 3 天,信号会密一倍多。写成数字 4,加载失败。
can_short = False

店里只卖、不回收。只能先买后卖。

它是什么
这套策略允不允许做空。
不管它会怎样
默认就是 False。就算你填了 enter_short,也会被忽略。
拧大 / 拧小 / 拧反了
拧成 True,现货配置会加载失败。合约课之前不要动。
process_only_new_candles = True

只在整点打卡,不在半路上改主意。

它是什么
是不是只在「新的一根 K 收盘」时才重算指标和信号。
不管它会怎样
不管它(等于 False):还在走的那根 K 上反复算,信号画了又擦掉,回测和实盘对不齐。
拧大 / 拧小 / 拧反了
拧成 False,dry-run 会抖。中长线保持 True。
stoploss / minimal_roi / startup_candle_count

执照上的必填栏。这版先填「几乎用不到」的数,免得加载挂掉。

它是什么
Freqtrade 加载时强制要止损和 ROI。startup 是开头先空转多少根。
不管它会怎样
不写这三项,空壳都 load 不了。
拧大 / 拧小 / 拧反了
-0.99 和 {"0": 10} 等于先不管这两扇门。startup = 1,因为还没有均线要暖。真正含义:v3 讲 -0.12,v4 讲为什么 {"0": 10} 等于关掉 ROI。

5假懂

人们会说:「空壳也能回测」
更短的一句:能被认出来,不等于会交易。三个函数原样还表,回测是 0 笔。这版过关看的是名单上有 FirstSma,而且状态是 OK。

6你来讲

答得出来,这课才过关。不用写下来,说给没写过策略的人听。

  1. 命令里写文件名还是类名?差在哪?
  2. timeframe 改成 1h,后面的「20 均线」覆盖的是几天,还是几小时?
  3. 为什么这版还要写 stoploss = -0.99?不写会怎样?

7这版代码

只放空壳。先会讲上面三问,再对这几行。

from pandas import DataFrame
from freqtrade.strategy import IStrategy


class FirstSma(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = "4h"
    can_short = False
    process_only_new_candles = True

    # 强制占位,v3 / v4 再讲含义
    stoploss = -0.99
    minimal_roi = {"0": 10}
    startup_candle_count = 1

    def populate_indicators(self, dataframe, metadata):
        return dataframe

    def populate_entry_trend(self, dataframe, metadata):
        return dataframe

    def populate_exit_trend(self, dataframe, metadata):
        return dataframe

8过关

在研究机上跑这一条。表里要有 FirstSma,Status 是 OK。

freqtrade list-strategies --userdir /workspace/ft_userdata/user_data

三个空函数现在一行信号都没写,所以还不会买卖。下一版才加金叉。