【总结】打造一个自己的策略 策略
1. 总结
有实盘意义的策略:
- bias乖离率
- 短周期+长周期 Open+Close交叉
- Supertrend超级趋势(ATR通道)
- 金字塔买入策略
- Keltner渠道 (三重EMA+ATR渠道)
- Keltner渠道 v2 (MA+ATR渠道)
- 鳄鱼线
- EMA交叉
没实盘意义的策略:
- 快速MACD、MACD的各种交叉(什么二次金叉,水上水下)
- RSI、KDJ、MFI、BOLL啥逆转抄底,进场还行,出场拉夸
- ..... 不写了,太多了几十个。哈哈
买入卖出:
- 构造EMA+ATR通道 突破上轨买入
- 突破ATR买入卖出
- EMA交叉买入卖出
- 每上穿一次买入一份 金字塔式买入
过滤方法:
- EMA标准差归一化阈值
- ADX过滤方法
- 收盘价必须在上轨以下才买入
- ema250 > ema500 顺大势
- 相同长度ema > ma时才开仓
- 大周期 ema线顺势
- ATR > ATR[1]
- KDJ逆转
- RSI阈值
移动止损:
- 每出现开仓信号一次,把止损线移动到开仓信号,可以固定比例,也可以是ATR
以上就是我这半个月的总结了,做个记录
2. 打造一个自己的策略
一句话说的很好 “徒弟会进场,师傅会出场”
EMA交叉买入卖出 优点进场快 但是死于缠绕震荡
ATR突破买入卖出 优点不会频繁出场 但是频次慢
因为长线的持仓和等待太过煎熬,本文打算要做一个适用于高频短线的策略。
策略大概构想:
- 入场:MACD、ADX、Ema < Ma 三者满足时
- 出场:ATR移动出场(每出现一次开仓信号移动)
虽然Keltner渠道也是把移动平均线和ATR结合了,但是短线表现不好
最后各种测试和修改,花了用了两天的时间,成功做了出来(大部分时间都花在了遗传算法选优上)
再用遗传算法选2021年表现最优的参数
因为5m短线数据量太大,回测选参数太慢,所以就只用了一年的数据
这就是为啥下面的回测2021年表现最好
3. 回测结果
2018年,大半年都在跌,短线表现很差
2019年,表现勉勉强强
2020年
2021年
2021年复利的情况
4. 策略对比
对比一下之前做过的 EMA交叉、Supertrend、Keltner渠道2 这三个策略
本文所做的策略,属于5m高频短线策略,所以相比其他策略,没复利的情况下可能不如其他长线策略,但是复利起来就很恐怖了
但是也有短线策略回撤大的毛病。。。相信未来可以继续学习改善
完~
11-13 随笔 笔记
今天尝试了下用python回测股票
速度惨不忍睹。。
放弃了
准备尝试期货
主要是4000多只股票,然后每个都要计算指标值太慢了
最后这句话绝对真实:徒弟会入场,师傅会出场
策略何尝不是呢
【原生代码】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)
【Keltner渠道2】MA+ATR通道 策略
1.策略原理
和上一个版本的做了以下修改:
- 不使用三重EMA平滑 单纯的MA
- 突破下轨才平仓 原来是突破中轨
- 移动止损:例如止损4%,每出现一次开仓信号,止损价格按开仓信号的收盘价重新计算
- ema46 < ma46时开仓 (没什么软用, 不加的效果更好)
- 增加ADX过滤开仓 (看上一篇文章)
- 开盘价必须在上轨的下方
2.回测结果
2020年-2021年 1h
2019年 1h
2020年-2021年
金字塔买入策略 策略
1.策略原理
刚刚看到一个金字塔买入策略
中线上穿长线 并且 短线上穿中短线 时买入一份
最多持有七份
买入后设置每份的固定止盈止损
这个类似于网格和马丁
但是这个有止损不会爆仓和被套
如果连续几次买入七份都被止损才会爆仓
就是赌会继续上涨,
2.回测结果
这里设置的是 每份止盈3% 止损10%
3.随笔
可以不可以用于股票呢?分成十份资金,按照指标开仓,止盈止损
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)
2. 代码过滤逻辑
说是ADX,其实只用到了ADX中的DI指标值
DI参数:19
做多:
up > down and up > 27
一种止盈止损方式 笔记
1.核心代码
2.原理
开仓后根据开仓价格设置
4.5% 止盈平仓15%
20% 止盈平仓75%
4% 止损平仓100%
指标出场信号 平仓100%
3.PS
感觉止盈完全没必要,跑出来的结果只是胜率提高了,最终盈利结果没有提高
【Keltner渠道】EMA+ATR通道策略 策略
1.核心代码
2.策略原理
当突破上轨时做多,突破中轨时平多
当突破下轨时做空,突破中轨时平空
3.回测结果
45m周期 今年
1小时周期 最近两年
1小时周期 最近三年
【Supertrend】ATR通道突破的策略 策略
0.前言
市场是随时变化且无情的
回测只能做为参考,不代表此策略会一直有效
1. 策略原理
ATR:真实波动指数
前一根收盘价突破ATR通道 则做多
此策略因为是价格突破,相比上一个EMA策略交易次数会减少很多
2. 回测设置
虚拟币:BTCUSDT、ETHUSDT (参数根据遗传算法得出)
股票:茅台、五粮液 (参数使用默认参数)
手续费:双边万4%
根据我的经验,趋势策略更适合跑ETHUSDT
3. 回测结果
BTCUSDT:
ETHUSDT:
茅台:
五粮液:
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);
}
});
样式和位置可自己修改
【原生代码】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
EMA交叉策略 策略
0.前言
市场是随时变化且无情的
回测只能做为参考,不代表此策略会一直有效
1. 策略原理
前一个K线的EMA短线上穿长线EMA则做多
其中EMA的来源用o+h+l+c/4,并且通过ATR把标准差归一化,再做阈值处理
最后用遗传算法找出收益率、回撤最佳的参数
2. 回测设置
使用的交易对:ETHUSDT
K线周期:2h
手续费:双边万4%
3. 回测结果
2020年:
2021年:
2020年-2021年 两年
2019年-2021年 TradingView现货回测结果 复利无杠杠
【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
如图:
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>