この記事では,チャネルブレイクを利用してトレンド取引を行う定量化戦略について詳しく説明する.この戦略は,EMAチャネルを通じてトレンドの方向性を認識し,ブリン帯判定逆転を逆操作する.
戦略の原則
この戦略には以下の要素が含まれる:
中線EMAを設定し,上下通路を比例的に拡張する.
価格が上チャネルラインを突破すると,多追尾し,下チャネルラインを突破すると空追尾する.
ブリン帯が狭くなり,トレンドが逆転すると判断し,逆操作を行う.
ATRを設定して損失のリスクを制限する.
カスタマイズ可能なチャネルパラメータ,最適なパラメータの組み合わせを見つける.
この戦略は,EMA経由で主流トレンドの方向性を判断し,ブリン帯を利用して反転の機会を識別し,完全なトレンドシステムを構成する.
2 戦略的優位性
この戦略の最大の利点は,指標が合理的に使用され,EMAが主流であると判断し,ブリン帯が反転を捕捉することです.
リスクのコントロールを可能にします.
最後に,パラメータはカスタマイズされ,異なる品種に最適化することができます.
3 潜在的リスク
しかし,この戦略には問題もあります.
まず,EMAとブリン帯の指標は後退している.
次に,反転操作の失敗リスクは考慮する必要があります.
最後に,パラメータ最適化は,過度に最適化されないために多くの作業を必要とします.
内容と要約
この記事では,EMAチャネルを突破してトレンド取引を行う戦略について詳しく説明します. 主流トレンドを識別し,逆転点で逆転操作を行うことができます. この戦略は,パラメータ最適化によって安定した収益を得ることができますが,最適化難しさや指標の遅れなどの問題を防ぎます.
/*backtest
start: 2023-08-15 00:00:00
end: 2023-09-14 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="[mdeacey] EMA Percentage Channel + Bollinger Band Trending Strategy", shorttitle="[mdeacey] EMA% Channel + BB Trend Strategy", overlay=true)
//EMA 200
len = input(title="EMA Length", type=input.integer, defval=100)
srce = input(title="EMA Source", type=input.source, defval=close)
ema1= ema(srce,len)
percent = input(title="Inside Channel (%)", type=input.float, defval= 1)
valuee = (percent*ema1)/100
upperbande = ema1 + valuee
lowerbande = ema1 - valuee
///2
percent2 = input(title="Outside Channel (%)", type=input.float, defval= 2)
valuee2 = (percent2*ema1)/100
upperbande2 = ema1 + valuee2
lowerbande2 = ema1 - valuee2
plot(upperbande, title='Inside Channel Upperband', color=color.black, linewidth=1, style=plot.style_line )
plot(lowerbande, title='Inside Channel Lowerband', color=color.black, linewidth=1, style=plot.style_line )
plot(upperbande2, title='Outside Channel Upperband', color=color.black, linewidth=1, style=plot.style_line )
plot(lowerbande2, title='Outside Channel Lowerband', color=color.black, linewidth=1, style=plot.style_line )
length = input(20, minval=2)
src = input(close, title="Close price")
mult = input(2.0, title="Multiplier", minval=0.001, maxval=50)
MA2 = sma(src, length)
dev = mult * stdev(src, length)
upper = MA2 + dev
lower = MA2 - dev
signalColor = crossunder(close, upper) ? color.red : crossover(close, lower) ? color.green : color.white
barcolor(color=signalColor)
nopo= strategy.position_size==0
upperBand = plot(upper, title='Upper Bollinger Band', color=color.gray, linewidth=1)
lowerBand = plot(lower, title='Lower Bollinger Band', color=color.gray, linewidth=1)
fill(upperBand, lowerBand, title='Bollinger Band', color=color.black)
strategy.entry("Long",true,when = crossover(close,lower) and close <lowerbande and close>lowerbande2)
strategy.close("Long",when = crossunder(close,lowerbande2))//crossunder(close,lowerbande) or crossunder(close,lowerbande2))
strategy.entry("Short",false,when = crossunder(close,upper) and close >upperbande and close<upperbande2)
strategy.close("Short",when = crossover(close,upperbande2) )//crossover(close,upperbande) or crossover(close,upperbande2) )
//Inputs
atrPeriod = input(defval=14, title="ATR Period",group='ATR Stoploss', type=input.integer) // Adjust this to change the ATR calculation length
multiplierPeriod = input(defval=1.75, title="ATR Multiplier",group='ATR Stoploss', type=input.float)// Adjust this to change the distance between your candles and the line
//ATR Calculation
pine_rma(x, y) =>
alpha = y
sum = 0.0
sum := (x + (alpha - 1) * nz(sum[1])) / alpha
true_range() =>
max(high - low, max(abs(high - close[1]), abs(low - close[1])))
//Long SL
plot(low - pine_rma(true_range() * multiplierPeriod, atrPeriod), "Long Stop", color=color.red, offset = 1)
// Short SL
plot(high +pine_rma(true_range() * multiplierPeriod, atrPeriod), "Short Stop", color=color.red, offset = 1)
strategy.exit("Exit","Long",limit=upper ,stop = low - pine_rma(true_range() * multiplierPeriod, atrPeriod) )
strategy.exit("Exit","Short",limit=lower ,stop =high +pine_rma(true_range() * multiplierPeriod, atrPeriod) )
/////////////////////new strategy
strategy.entry("Long",true,stop =upperbande ,when = close <upperbande and close[1] <upperbande and nopo )
strategy.close("Long",when = crossunder(close,upper) )// and close <upperbande and close>lowerbande)
strategy.entry("Short",false,stop =lowerbande ,when = close >lowerbande and close[1] >lowerbande and nopo )
strategy.close("Short",when = crossover(close, lower) )
strategy.exit("Exit","Long",stop = low - pine_rma(true_range() * multiplierPeriod, atrPeriod) )
strategy.exit("Exit","Short",stop =high +pine_rma(true_range() * multiplierPeriod, atrPeriod) )