【总结】打造一个自己的策略 策略

1. 总结

有实盘意义的策略:

  1. bias乖离率
  2. 短周期+长周期 Open+Close交叉
  3. Supertrend超级趋势(ATR通道)
  4. 金字塔买入策略
  5. Keltner渠道 (三重EMA+ATR渠道)
  6. Keltner渠道 v2 (MA+ATR渠道)
  7. 鳄鱼线
  8. EMA交叉

没实盘意义的策略:

  1. 快速MACD、MACD的各种交叉(什么二次金叉,水上水下)
  2. RSI、KDJ、MFI、BOLL啥逆转抄底,进场还行,出场拉夸
  3. ..... 不写了,太多了几十个。哈哈

买入卖出:

  1. 构造EMA+ATR通道 突破上轨买入
  2. 突破ATR买入卖出
  3. EMA交叉买入卖出
  4. 每上穿一次买入一份 金字塔式买入

过滤方法:

  1. EMA标准差归一化阈值
  2. ADX过滤方法
  3. 收盘价必须在上轨以下才买入
  4. ema250 > ema500 顺大势
  5. 相同长度ema > ma时才开仓
  6. 大周期 ema线顺势
  7. ATR > ATR[1]
  8. KDJ逆转
  9. RSI阈值

移动止损:

  1. 每出现开仓信号一次,把止损线移动到开仓信号,可以固定比例,也可以是ATR

以上就是我这半个月的总结了,做个记录

2. 打造一个自己的策略

一句话说的很好 “徒弟会进场,师傅会出场”
EMA交叉买入卖出 优点进场快 但是死于缠绕震荡
ATR突破买入卖出 优点不会频繁出场 但是频次慢

因为长线的持仓和等待太过煎熬,本文打算要做一个适用于高频短线的策略。

策略大概构想:

  1. 入场:MACD、ADX、Ema < Ma 三者满足时
  2. 出场:ATR移动出场(每出现一次开仓信号移动)

虽然Keltner渠道也是把移动平均线和ATR结合了,但是短线表现不好

最后各种测试和修改,花了用了两天的时间,成功做了出来(大部分时间都花在了遗传算法选优上)
再用遗传算法选2021年表现最优的参数
因为5m短线数据量太大,回测选参数太慢,所以就只用了一年的数据
这就是为啥下面的回测2021年表现最好

3. 回测结果

2018年,大半年都在跌,短线表现很差
图片alt

2019年,表现勉勉强强
图片alt

2020年
图片alt

2021年
图片alt

2021年复利的情况
图片alt

4. 策略对比

对比一下之前做过的 EMA交叉、Supertrend、Keltner渠道2 这三个策略

图片alt

本文所做的策略,属于5m高频短线策略,所以相比其他策略,没复利的情况下可能不如其他长线策略,但是复利起来就很恐怖了
但是也有短线策略回撤大的毛病。。。相信未来可以继续学习改善
完~


苏慕白 发布于  2021-11-14 11:01 

11-13 随笔 笔记

今天尝试了下用python回测股票
速度惨不忍睹。。
放弃了
准备尝试期货

主要是4000多只股票,然后每个都要计算指标值太慢了

最后这句话绝对真实:徒弟会入场,师傅会出场
策略何尝不是呢


苏慕白 发布于  2021-11-13 21:24 

【原生代码】Python3 计算DI、ADX趋向指标 指标

1.引用:

import pandas as pd
import numpy as np

2.代码

#RSI中使用的移动平均线。 它是指数加权移动平均线,alpha加权值 = 1 /长度
def RMA(r, days, name=0):
    cps = [ v[name] for v in r ] if name else r
    rmas = [0 for i in range(len(cps))]  # 创造一个和cps一样大小的集合
    alpha = 1 / days

    for i in range(len(cps)):
        if i > days-1:
            if rmas[i-1] and not np.isnan(rmas[i-1]):
                rmas[i] = alpha * cps[i] + (1 - alpha) * rmas[i-1]
            else:
                ma = 0
                for i2 in range(i-days,i):  #求平均值
                    ma += cps[i2+1]
                rmas[i] = ma / days

    return rmas

#其他MA类型看上一篇文章
def ATR(r, days, ma='sma'):
    tr = [0]
    for i in range(len(r)):
        if i:
            tr.append(max(r[i]['High']-r[i]['Low'], abs(r[i]['High'] - r[i-1]['Close']), abs(r[i]['Low'] - r[i-1]['Close'])))

    if ma == 'rma':
        return RMA(tr, days)

    if ma == 'ema':
        return EMA(tr, days)

    if ma == 'sma':
        return SMA(tr, days)

    if not ma:
        return tr

"""DI"""
def DI(r, days):
    df = pd.DataFrame(r)
    df['up'] = df['High'] - df['High'].shift(1)
    df['down'] = -(df['Low'] - df['Low'].shift(1))
    df['truerange'] = RMA(ATR(r, days=0, ma=0), days)
    df['plus'] = RMA([df['up'][i] if df['up'][i] > df['down'][i] and df['up'][i]> 0 else 0 for i in range(len(df['up']))], days) / df['truerange']
    df['minus'] = RMA([df['down'][i] if df['down'][i] > df['up'][i] and df['down'][i]> 0 else 0 for i in range(len(df['up']))], days) / df['truerange']

    df['plus'] = df['plus'].apply(float) * 100
    df['minus'] = df['minus'].apply(float) * 100
    return df['plus'], df['minus']

"""ADX趋向指标"""
def ADX(r, diDays, adxDays):
    df = pd.DataFrame(r)
    df['plus'], df['minus'] = DI(r, diDays)
    df['sum'] = df['plus'] + df['minus']
    df['adx'] = [abs(df['plus'][i] - df['minus'][i]) / (1 if df['sum'][i] == 0 else df['sum'][i]) for i in range(len(df['sum']))]
    df['adx'] = RMA(df['adx'].values, adxDays)
    df['adx'] = df['adx'].apply(float) * 100

    return df['adx'], df['plus'], df['minus']

3.使用例子

指标计算的值我都和TradingView对比过,放心使用~
r为K线数据

df['adx'], df['plus'], df['minus'] = ADX(r, 14, 14)

图片alt


苏慕白 发布于  2021-11-13 21:16 

【Keltner渠道2】MA+ATR通道 策略

1.策略原理

和上一个版本的做了以下修改:

  1. 不使用三重EMA平滑 单纯的MA
  2. 突破下轨才平仓 原来是突破中轨
  3. 移动止损:例如止损4%,每出现一次开仓信号,止损价格按开仓信号的收盘价重新计算
  4. ema46 < ma46时开仓 (没什么软用, 不加的效果更好)
  5. 增加ADX过滤开仓 (看上一篇文章)
  6. 开盘价必须在上轨的下方

2.回测结果

2020年-2021年 1h
图片alt

2019年 1h
图片alt

2020年-2021年
图片alt


苏慕白 发布于  2021-11-13 19:50 

金字塔买入策略 策略

1.策略原理

刚刚看到一个金字塔买入策略

中线上穿长线 并且 短线上穿中短线 时买入一份
最多持有七份

买入后设置每份的固定止盈止损

这个类似于网格和马丁
但是这个有止损不会爆仓和被套
如果连续几次买入七份都被止损才会爆仓
就是赌会继续上涨,

2.回测结果

这里设置的是 每份止盈3% 止损10%
图片alt
图片alt

3.随笔

可以不可以用于股票呢?分成十份资金,按照指标开仓,止盈止损


苏慕白 发布于  2021-11-11 23:31 

ADX(DI)过滤开仓信号 指标

1. ADX指标可视化

//@version=5
indicator("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, timeframe="", timeframe_gaps=true)
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
    up = ta.change(high)
    down = -ta.change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    truerange = ta.rma(ta.tr, len)
    plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
    minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
    [plus, minus]
adx(dilen, adxlen) =>
    [plus, minus] = dirmov(dilen)
    sum = plus + minus
    adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
    [adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)
plot(sig, color=color.red, title="ADX")
plot(up, color=color.blue, title="up")
plot(down, color=color.green, title="up")

hline(27)

图片alt

2. 代码过滤逻辑

说是ADX,其实只用到了ADX中的DI指标值

DI参数:19
做多:
up > down and up > 27


苏慕白 发布于  2021-11-11 22:28 

一种止盈止损方式 笔记

1.核心代码

图片alt

2.原理

开仓后根据开仓价格设置
4.5% 止盈平仓15%
20% 止盈平仓75%
4% 止损平仓100%

指标出场信号 平仓100%

图片alt

3.PS

感觉止盈完全没必要,跑出来的结果只是胜率提高了,最终盈利结果没有提高


苏慕白 发布于  2021-11-11 21:37 

【Keltner渠道】EMA+ATR通道策略 策略

1.核心代码

图片alt

2.策略原理

当突破上轨时做多,突破中轨时平多
当突破下轨时做空,突破中轨时平空
图片alt

3.回测结果

45m周期 今年
图片alt

1小时周期 最近两年
图片alt

1小时周期 最近三年
图片alt


苏慕白 发布于  2021-11-11 11:05 

推荐阅读《以交易为生》 笔记

一名副业研究心理学的交易员写的一本书
朋友推荐我去看的,的确是一本好书!

图片alt
图片alt
图片alt


苏慕白 发布于  2021-11-11 10:49 

【Supertrend】ATR通道突破的策略 策略

0.前言

市场是随时变化且无情的
回测只能做为参考,不代表此策略会一直有效

1. 策略原理

ATR:真实波动指数
前一根收盘价突破ATR通道 则做多

此策略因为是价格突破,相比上一个EMA策略交易次数会减少很多

2. 回测设置

虚拟币:BTCUSDT、ETHUSDT (参数根据遗传算法得出)
股票:茅台、五粮液 (参数使用默认参数)
手续费:双边万4%

根据我的经验,趋势策略更适合跑ETHUSDT

3. 回测结果

BTCUSDT:
图片alt
图片alt


ETHUSDT:
图片alt
图片alt
图片alt
图片alt


茅台:
图片alt


五粮液:
图片alt


苏慕白 发布于  2021-11-2 19:06 

Layer tips实时悬浮显示隐藏 教程

引用:

<script src="//cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="//cdn.bootcss.com/layer/3.0.1/skin/default/layer.css" rel="stylesheet">
<script src="//cdn.bootcss.com/layer/3.0.1/layer.min.js"></script> 

HTML:

<span tan="啦啦啦"></span>

JS:

$('span').on({ 
     mouseenter:function(){ 
         var that = this; 
         var nei = $(this).attr("tan"); 
         if(nei){ 
             tips =layer.tips("<span style='color:#000;font-size:20px;'>"+nei+"</span>",that,{tips:[2,'#fff'],time:0,area: 'auto',maxWidth:500}); 
         } 
     }, 
     mouseleave:function(){ 
        layer.close(tips); 
    } 
 }); 

样式和位置可自己修改

标签: Layer tips

苏慕白 发布于  2021-11-2 14:45 

【原生代码】Python3 实现ATR、MA、EMA、SMMA、RMA、TEMA指标的计算 指标

1. 参数说明

r:K线数据,字典或者数组
days:指标长度
name:使用哪一个字段,填'Close'即可,如果不填则代表r是数组而不是字典

变量r 字典结构图如下:

{
    {
        'Time': 0,
        'Close': 0,
        'Open': 0,
        'High': 0,
        'Low': 0,
        'Volume': 0,
    }
}

2. ATR 真实波动幅度 (需配合下面的指标)

def ATR(r, days, ma='sma'):
    tr = [0]
    for i in range(len(r)):
        if i:
            tr.append(max(r[i]['High']-r[i]['Low'], abs(r[i]['High'] - r[i-1]['Close']), abs(r[i]['Low'] - r[i-1]['Close'])))

    if ma == 'rma':
        return RMA(tr, days)

    if ma == 'ema':
        return EMA(tr, days)

    return SMA(tr, days)

3. MA 移动平均线

def SMA(r, days, name=0):
    cps = [ v[name] for v in r ] if name else r
    emas = cps.copy()  # 创造一个和cps一样大小的集合

    for i in range(len(cps)):
        if i < days-1:
            emas[i] = 0
        else:
            ma = 0
            for i2 in range(i-days,i):
                i2 += 1
                ma += cps[i2]
            emas[i] = ma / days
    return emas

4. EMA 指数移动平均线

def EMA(r, days, name=0):

    if name == 'o+h+l+c':
        cps = [ (v['Open'] + v['High'] + v['Low'] + v['Close']) / 4 for v in r ]

    elif name == 'h+l+c':
        cps = [ (v['High'] + v['Low'] + v['Close']) / 3 for v in r ]

    elif name == 'h+l':
        cps = [ (v['High'] + v['Low']) / 2 for v in r ]

    else:
        cps = [ v[name] for v in r ] if name else r

    emas = [0 for i in range(len(cps))]  # 创造一个和cps一样大小的集合
    for i in range(len(cps)):
        if i == 0:
            emas[i] = cps[i]
        if i > 0:
            emas[i] = ((days - 1) * emas[i - 1] + 2 * cps[i]) / (days + 1)

    emas = [v for v in emas]
    return emas

5. SMMA 平滑移动平均线

def SMMA(r, days, name=0):
    cps = [ v[name] for v in r ] if name else r
    emas = [0 for i in range(len(cps))]  # 创造一个和cps一样大小的集合
    ma = 0
    for i in range(len(cps)):
        if i < days:
            ma += cps[i]
            emas[i] = 0

        else:
            if emas[i-1] == 0:
                emas[i] = ma / days
            else:
                emas[i] = (emas[i-1] * (days - 1) + cps[i]) / days

    emas = [v for v in emas]
    return emas

6. RMA,RSI中使用的移动平均线,它是指数加权移动平均线

def RMA(r, days, name=0):
    cps = [ v[name] for v in r ] if name else r
    rmas = [0 for i in range(len(cps))]  # 创造一个和cps一样大小的集合
    alpha = 1 / days

    for i in range(len(cps)):
        if i < days-1:
            rmas[i] = 0
        else:
            if rmas[i-1]:
                rmas[i] = alpha * cps[i] + (1 - alpha) * rmas[i-1]
            else:
                ma = 0
                for i2 in range(i-days,i):  #求平均值
                    ma += cps[i2+1]
                rmas[i] = ma / days
    return rmas

7. TEMA 三重指数平滑移动平均线

def TEMA(r, days, name='Close'):
    v2 = EMA(r, days, name)
    v3 = EMA(v2, days)
    v4 = EMA(v3, days)

    emas = []
    for i in range(len(v2)):
        ok = 3 * (v2[i] - v3[i]) + v4[i]
        emas.append(ok)
    return emas

苏慕白 发布于  2021-11-1 19:51 

EMA交叉策略 策略

0.前言

市场是随时变化且无情的
回测只能做为参考,不代表此策略会一直有效

1. 策略原理

前一个K线的EMA短线上穿长线EMA则做多
其中EMA的来源用o+h+l+c/4,并且通过ATR把标准差归一化,再做阈值处理
最后用遗传算法找出收益率、回撤最佳的参数

2. 回测设置

使用的交易对:ETHUSDT
K线周期:2h
手续费:双边万4%

3. 回测结果

2020年:
图片alt
图片alt
图片alt


2021年:
图片alt
图片alt
图片alt


2020年-2021年 两年
图片alt
图片alt
图片alt

2019年-2021年 TradingView现货回测结果 复利无杠杠
图片alt


苏慕白 发布于  2021-11-1 19:31 

【JS图片阅览器】安装使用Viewer.js 并用JS让Viewer.js显示图片 教程

1. 下载

Viewer.js官网下载地址:https://fengyuanchen.github.io/viewerjs/
网盘下载地址:https://zijieyunpan.com/E8f4Vo1Z4iK

2. 安装

引用文件 (需先引用jquery,然后放在jquery的后面)

<script type="text/javascript" src="/viewer/viewer.min.js"></script>
<script type="text/javascript" src="/viewer/jquery-viewer.min.js"></script>
<link rel="stylesheet" href="/viewer/viewer.min.css">

给图片加入class属性:viewer
如图:
图片alt

JS启用插件

$('.viewer').viewer();

然后点击图片即可查看效果~

3. 扩展:用JS让Viewer.js显示图片

例子:

<img src="https://fengyuanchen.github.io/viewerjs/images/thumbnails/tibet-1.jpg" id="viewer41930" style="display: none;">
<script>
var image = new Viewer(document.getElementById("viewer41930"),{url: "src"});
document.getElementById("viewer41930").click();
</script>
标签: Viewer.js

苏慕白 发布于  2021-11-1 16:14