多时间框架趋势追踪日内scalping策略


创建日期: 2023-11-16 17:47:06 最后修改: 2023-11-16 17:47:06
复制: 1 点击次数: 356
1
关注
1102
关注者

多时间框架趋势追踪日内scalping策略

概述

本策略通过结合多个时间框架的移动平均线指标,实现多时间框架之间的趋势一致性判断,在日内采取scalping操作策略,追捧趋势获得利润。

策略原理

本策略使用5分钟、15分钟、30分钟和60分钟四个时间框架的8期和20期移动平均线构建交易信号。当较短期的8日移动平均线上穿20日移动平均线时产生买入信号;当8日移动平均线下穿20日移动平均线时产生卖出信号。

策略要求5分钟、15分钟、30分钟和60分钟时间框架的交易信号必须一致时才发出交易指令。也就是说,只有当这四个时间框架的移动平均线都符合买入信号或者卖出信号时,才会进行买入或者卖出操作。

在进入仓位后,策略会以固定盈利点位设置止盈单,实现日内的scalping操作。

具体来说,策略通过调用security函数获取不同时间框架下的移动平均线数据。计算出5分钟、15分钟、30分钟和60分钟的8日与20日平均线差值,并绘制差值曲线。

根据差值曲线是否上穿零轴判断买入和卖出信号。并设定多个标志位islong和isshort来记录每个时间框架下的交易信号。最终在islong和isshort的状态满足要求时发出入场和出场指令。

在入场后,策略通过strategy.exit函数设置固定点数止盈,实现scalping操作。

优势分析

本策略具有以下优势:

  1. 多时间框架设计,通过不同周期指标的综合判断,能够有效过滤假断和减少交易频率。

  2. 日内scalping策略,Profit优化,能够持续获得小利润累积。

  3. 代码结构清晰,每个部分功能明确,易于理解和优化。

  4. 条件设置合理,可有效控制交易风险。

风险分析

本策略也存在一定的风险:

  1. 多时间框架设计虽然可以过滤部分噪音,但也可能错过部分细节导致签到不明显的趋势变化。

  2. 日内scalping带来频繁交易,需要考虑交易成本控制。

  3. 固定止盈点位设置不够灵活,无法根据市场变化调整。

  4. 依赖指标产生交易信号,存在被愚弄的可能。

优化方向

本策略可以从以下几个方面进行优化:

  1. 增加更多不同周期时间框架的指标判断,使信号更稳定可靠。

  2. 优化止盈策略,根据ATR动态设定止盈点位。

  3. 加入附加条件过滤入场时机,例如交易量放大、突破历史极值等。

  4. 优化移动平均线的周期参数,寻找最佳参数组合。

  5. 增加机器学习模型判断指标信号的可靠性,避免被套利。

总结

本策略整体来说是一个典型的多时间框架趋势追踪策略,日内采取scalping方式获利。策略思路清晰,代码结构合理,值得进一步测试和优化。通过一定的优化调整,本策略可以成为一个非常实用的日内scalping策略模板。

策略源码
                
                    /*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title="PeBAS $JPY Scalper 15m ",overlay=true) 
zeigeallebars= input(false, title="Zeige alle (Show all) Candles/Bars?")
profitwert=input(52, title="Profit")
myatr=  input(title="ATR", type=float, defval=0.00002, minval=0.00001,step=0.00001)


//Plot  EMA-Differenz Aktueller Timeframe

dif=(ema(close,8)+ema(close,20))/2
mcolor=ema(close,8) > ema(close,20) ? green : red
bs = ema(close,8) > ema(close,20) ? true : false
ThisATR=atr(16)

//trans = zeigeallebars == true ? 00 : 100
//plot(dif,"dif",color=mcolor,linewidth=6,transp=trans)


//1M EMA
htf_ma1Mema8 = ema(close, 5)
htf_ma1Mema20 = ema(close, 20)
ema81m=request.security(syminfo.tickerid, "1", htf_ma1Mema8)
ema201m=request.security(syminfo.tickerid, "1", htf_ma1Mema20)
dif1M = (ema81m + ema201m) / 2
Close1M = request.security(syminfo.tickerid, "1", close)
color1=ema81m > ema201m ? green : red
//plot(dif1M,"dif",color1,linewidth=6)
//plotshape(1, style=shape.cross, color=color1,location=location.top)
ls1 = ema81m > ema201m ? 1 : 0



//5M EMA

htf_ma5Mema8 = ema(close, 8)
htf_ma5Mema20 = ema(close, 20)
ema85m=request.security(syminfo.tickerid, "5", htf_ma5Mema8)
ema205m=request.security(syminfo.tickerid, "5", htf_ma5Mema20)
dif5M = (ema85m + ema205m) / 2
 
color5=ema85m > ema205m ? green : red
plot(dif5M,"dif",color5,linewidth=5)
ls5 = ema85m > ema205m ? 1 : 0
alert1= ema85m > ema205m and ema85m[1] < ema205m[1] ? 1 : 0
islong5 = ema85m > ema205m ? 1 : 0
isshort5 = ema85m < ema205m ? 1 : 0

//15M EMA

htf_ma15Mema8 = ema(close, 8)
htf_ma15Mema20 = ema(close, 20)
ema815m=request.security(syminfo.tickerid, "15", htf_ma15Mema8)
ema2015m=request.security(syminfo.tickerid, "15", htf_ma15Mema20)
dif15M = (ema815m + ema2015m) / 2
 
color15=ema815m > ema2015m ? green : red
plot(dif15M,"dif",color15,linewidth=3)
ls15= ema815m > ema2015m ? 1 : 0
alert2= ema815m > ema2015m and ema815m[1] < ema2015m[1] ? 1 : 0
islong15 = ema815m > ema2015m ? 1 : 0
isshort15 = ema815m < ema2015m ? 1 : 0





//30M EMA
htf_ma30Mema8 = ema(close, 8)
htf_ma30Mema20 = ema(close, 20)
ema830m=request.security(syminfo.tickerid, "30", htf_ma30Mema8)
ema2030m=request.security(syminfo.tickerid, "30", htf_ma30Mema20)
dif30M = (ema830m + ema2030m) / 2
 
color30=ema830m > ema2030m ? green : red
ls30= ema830m > ema2030m ?1 : 0
islong30 = ema830m > ema2030m ? 1 : 0
isshort30 = ema830m < ema2030m ? 1 : 0



//60M EMA

htf_ma60Mema8 = ema(close, 8)
htf_ma60Mema20 = ema(close, 20)
ema860m=request.security(syminfo.tickerid, "60", htf_ma60Mema8)
ema2060m=request.security(syminfo.tickerid, "60", htf_ma60Mema20)
dif60M = (ema860m + ema2060m) / 2
 
color60=ema860m > ema2060m ? green : red
ls60= ema860m > ema2060m ?1 : 0

islong60 = ema860m > ema2060m ? 1 : 0
isshort60 = ema860m < ema2060m ? 1 : 0

plot(dif60M,"dif",color60,linewidth=3,transp=70)

islong = islong5 ==1 and islong15 ==1 and islong60 ==1 and year > 2017 ? 1 : 0
isshort = isshort5 ==1 and isshort15 ==1 and  isshort60 ==1 and year > 2017 ? 1 : 0


condition2l= 0 
condition2s = 0

c= alert1 == alert2  and alert1[1] != alert2[1] ? 1 : 0
alertcondition(c, title='Da tat sich was ', message='Da tat sich was!')

strategy.entry("enter long", strategy.long,1,when = islong ==1 and islong[1] == 0  ) 
strategy.entry("enter short", strategy.short,1,when = isshort == 1  and isshort [1] == 0) 
strategy.exit("close",profit=profitwert)
strategy.exit("close",profit=profitwert)




                
            
更多内容