v2 · 阶段 A

能买卖的金叉

快线从下往上穿过慢线就买,从上往下穿过就卖。

sma_fast=20 sma_slow=50 enter_long=1 volume>0

1一句话

快线从下往上穿过慢线,就买;从上往下穿过,就卖。这叫金叉和死叉。

2生活类比

两条人走路。矮个子突然超过高个子,队伍气氛变热,这是金叉,买。矮个子又落到后面,气氛变冷,这是死叉,卖。你不预测谁会一直快,只在他们交叉的那一下行动。

3搬到这版

还是这个类FirstSma。研究机上的文件现在是空壳;金叉写法在 _history/FirstSma_v2_cross.py。
算线populate_indicators 里算出 sma_fast 和 sma_slow。
盖章买populate_entry_trend 用 loc 在金叉那一行写 enter_long = 1。
盖章卖populate_exit_trend 在死叉那一行写 exit_long = 1。
为什么是 locdataframe 是整张表。必须整列比较。写成 if dataframe["sma_fast"] > ... 会报错。

4每个新参数

sma_fast = 20

近 20 根收盘价的平均身高。矮个子,反应快。

它是什么
最近 20 根已收盘 K 的收盘价平均值。
不管它会怎样
没有快线,就没有交叉,买卖条件写不出来。
拧大 / 拧小 / 拧反了
拧小(比如 5):更敏感,假交叉更多。拧大(比如 40):更钝、更晚。拧到比慢线还大:快慢颠倒,金叉死叉反了。
sma_slow = 50

近 50 根的平均身高。高个子,走得稳。

它是什么
最近 50 根已收盘 K 的收盘价平均值,比快线稳。
不管它会怎样
只剩一条线,没有交叉可看。
拧大 / 拧小 / 拧反了
拧小:接近快线,交叉变碎。拧大:更慢,短趋势会被漏掉。20 和 50 先讲含义,不先乱改。
enter_long = 1

在这一行表格上盖「要买」的章。

它是什么
Freqtrade 只认 1 表示这根 K 收盘后准备开多。下一根开盘才成交。
不管它会怎样
不写或一直是空,回测还是 0 笔。
拧大 / 拧小 / 拧反了
拧成别的数,软件不当买入。必须用 loc 整列写,不能 if。
volume > 0

这根 K 得有人成交,不是停牌的空棒。

它是什么
成交量大于 0,排除无量的假 K。
不管它会怎样
不管它:停牌或坏数据也可能触发金叉。
拧大 / 拧小 / 拧反了
拧反写成 volume == 0:永远不买。拧成很大的量能门槛:信号变少,那是另一课的过滤。

5假懂

人们会说:「均线上穿就赚钱」
更短的一句:金叉只是「短趋势刚超过长趋势」的瞬间。后面还可能马上死叉。它是规则,不是保证。

6你来讲

答得出来,这课才过关。说给别人听,不要只在心里点头。

  1. 为什么不能写成 if dataframe["sma_fast"] > dataframe["sma_slow"]?
  2. 把 20 和 50 对调,金叉还是原来的意思吗?
  3. volume > 0 在防什么?拿掉它最坏会怎样?

7这版代码

摘自 _history/FirstSma_v2_cross.py。只看这版新加的算线和盖章。

dataframe["sma_fast"] = ta.SMA(dataframe, timeperiod=20)
dataframe["sma_slow"] = ta.SMA(dataframe, timeperiod=50)

dataframe.loc[
    (
        qtpylib.crossed_above(dataframe["sma_fast"], dataframe["sma_slow"])
        & (dataframe["volume"] > 0)
    ),
    ["enter_long", "enter_tag"],
] = (1, "golden_cross")

dataframe.loc[
    (
        qtpylib.crossed_below(dataframe["sma_fast"], dataframe["sma_slow"])
        & (dataframe["volume"] > 0)
    ),
    ["exit_long", "exit_tag"],
] = (1, "death_cross")

8过关

对着文件,把每一行讲给别人听。特别要讲清:为什么用 loc,为什么不能写成 if。

这版还不必强求回测数字。数字放到 v3,用你自己跑出来的。