トレンドブレイクスルーダブル移動平均フィルター戦略


作成日: 2023-11-27 17:03:08 最終変更日: 2023-11-27 17:03:08
コピー: 0 クリック数: 689
1
フォロー
1617
フォロワー

トレンドブレイクスルーダブル移動平均フィルター戦略

概要

これは,均線とブリン通路を利用してトレンド判断を行い,フィルターとストップの原理を突破する戦略である.それは,トレンドが変化する時に適切な信号を捕捉し,双均線フィルターによって誤信号を軽減し,リスクを制御するためにストップを設定することができる.

戦略原則

この戦略は以下の部分から構成されています.

  1. トレンド判断:MACDを使用して価格のトレンドを判断し,多頭と空頭のトレンドを区別する.

  2. 範囲フィルタリング:ブリンチャネルを使用して価格変動の範囲を判断し,範囲を突破しない信号をフィルタリングする.

  3. 双均線確認:急速EMAと遅いEMAからなる双均線で,トレンドシグナルを確認する. 購入シグナルが生成されるのは,急速EMA>遅いEMAである場合にのみである.

  4. 止損機構:止損点を設定し,価格が不利な方向に止損点を突破したときに平仓を止める.

信号の判断の論理は次のとおりです.

  1. MACDは上昇傾向にあると判断した.
  2. 価格がブリン・チャネルを突破
  3. 速度のEMAが遅さのEMAより高い

この3つの条件が同時に満たされると,購入シグナルが生成されます.

平仓の論理は,2種類に分けられる. ストップ・ピッチ・ピッチ・ポジションとストップ・ピッチ・ポジションである. ストップ・ポイントは入札価格に一定比率を掛け,ストップ・ポイントは入札価格に一定比率を掛けである. 価格がいずれかのポイントを突破したときの平仓である.

優位分析

この戦略の利点は以下の通りです.

  1. 市場が変化するにつれて,市場が変化するにつれて,市場が変化するにつれて,
  2. 双均線フィルターによる誤信号の改善.
  3. 損失防止メカニズムは,単一損失を効果的に制御する.
  4. パラメータ最適化スペースは広いので,最適状態に調整できます。

リスク分析

この戦略にはいくつかのリスクがあります.

  1. 震災時の誤った信号は,損害を招く可能性があります.
  2. ストップポイントを正しく設定しないことで,不必要な損失が引き起こされる可能性があります.
  3. 誤ったパラメータは,戦略の効果を損なう可能性があります.

これらのリスクに対して,最適化パラメータ,停止位置の調整などによって最適化および改善を行うことができます.

最適化の方向

この戦略は以下の方向から最適化できます.

  1. 双均線の長さを調整し,最適なパラメータの組み合わせを探します.
  2. トラッキング・ストップ,振動・ストップなど,さまざまなストップ方法をテストする.
  3. MACDパラメータをテストし,最適パラメータを探します.
  4. 機械学習によるパラメータの自動最適化.
  5. 追加条件フィルタリング信号

異なるパラメータ設定をテストし,収益率とシャープ比率を評価することで,この戦略の最適な状態を見つけることができます.

要約する

これは,トレンド判断,範囲フィルター,双均線確認,および停止思考を利用した定量化戦略である. これは,トレンドの方向を効果的に判断し,利潤の最大化とリスク管理の間のバランスをとることができる. この戦略には,パラメータ最適化および機械学習などの方法によって,改善の余地があり,よりよい効果が得られる.

ストラテジーソースコード
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)

// Original Script > @DonovanWall
// Adapted Version > @guikroth
// 
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////



SS = input.bool(false,"Percentage Take Profit Stop Loss")


longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


// Color variables
upColor   = color.white
midColor  = #90bff9
downColor = color.blue

// Source
src = input(defval=close, title="Source")

// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : 
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Colors
filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
   src > filt and src < src[1] and upward > 0 ? upColor : 
   src < filt and src < src[1] and downward > 0 ? downColor : 
   src < filt and src > src[1] and downward > 0 ? downColor : midColor

filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter")

// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")

// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")

// Bar Color
barcolor(barcolor)

// Break Outs
longCond = bool(na)
shortCond = bool(na)
longCond := src > filt and src > src[1] and upward > 0 or 
   src > filt and src < src[1] and upward > 0
shortCond := src < filt and src < src[1] and downward > 0 or 
   src < filt and src > src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1



// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")


////////////// 副

sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')

DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7

calc_macd(source, fastLength, slowLength) =>
    fastMA = ta.ema(source, fastLength)
    slowMA = ta.ema(source, slowLength)
    fastMA - slowMA

calc_BBUpper(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis + dev

calc_BBLower(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis - dev

t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity

e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)

trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

duoad = trendUp > 0 and trendUp > e1

kongad = trendDown > 0 and trendDown > e1



duo =  longCondition and duoad

kong = shortCondition and kongad


//Alerts
plotshape(longCondition  and trendUp > e1 and  trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition  and trendDown > e1 and  trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))




if  longCondition and trendUp > e1 and  trendUp > 0 
    strategy.entry('Long',strategy.long, comment = "buy" )

if  shortCondition and trendDown > e1 and  trendDown > 0 
    strategy.entry('Short',strategy.short, comment = "sell" )




longlimtPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
   
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



if (strategy.position_size > 0)  and SS == true
    
    strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
    

if (strategy.position_size < 0)  and SS == true
    
    strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)