双範囲フィルターモメント取引戦略

作者: リン・ハーンチャオチャン, 日付: 2024-04-01 10:54:47
タグ:

img

概要

この戦略は,デュアルレンジフィルターに基づいたモメント・トレーディング戦略である.この戦略は,包括的なレンジフィルターを取得するために,急速な期間のスムーズなレンジを計算し,現在の価格傾向を決定するために使用する.価格がこの範囲以上/下を横切ると,この戦略は購入/売却信号を生成する.さらに,戦略は4つのグラデント・テイク・プロフィートレベルと1つのストップ・ロストレベルを設定し,リスクを制御し,利益をロックする.

戦略原則

  1. 速くて遅い期間のスムーズ範囲を計算します.速くて短い期間と小さい倍数を使用し,ゆっくりとした範囲は長い期間と大きな倍数を使用します.
  2. 総合範囲フィルター (TRF) として,高速範囲と遅い範囲の平均値を使用する.
  3. 現在の価格と前の価格を比較して上下傾向を決定する.
  4. 動的上位帯 (FUB) と下位帯 (FLB) をトレンドの基準として計算する.
  5. 閉じる価格とTRFの関係に基づいて,買い・売るシグナルを生成する.
  6. 4つのグラデント・テイク・プロフィートレベルと1つのストップ・ロースレベルを設定し,異なるポジションパーセントと利益/損失パーセントに対応します.

利点分析

  1. ダイアルレンジフィルターは,高速と遅い期間を組み合わせ,戦略が異なる市場ペースに適応し,より多くの取引機会を把握できるようにします.
  2. ダイナミックな上部と下部帯の設計は,戦略を現在の傾向に合わせ,誤った信号を減らすのに役立ちます.
  3. 4つのグラディエント・テイク・プロフィートレベルは,トレンドが続くときに戦略がより多くの利益を得ることができ,トレンドが逆転するときに部分的な利益を得ることができます.
  4. ストップ・ロスの設定は,取引毎の最大損失を制御し,アカウントの安全性を保護します.

リスク分析

  1. 市場変動や範囲限定の状況では,戦略は多くの誤った信号を生成し,頻繁に取引と手数料損失を引き起こす可能性があります.
  2. グラデント・テイク・プロフィートの設定により,一部の利益が早めに固定され,戦略がトレンドの動きから完全に利益を得ることができません.
  3. ストップ・ロスの設定は,ブラック・スワン事件による極端な損失を完全に回避することができません.

最適化方向

  1. 誤った信号を減らすために,トレンド決定の補助条件として,より多くの技術指標または市場情勢指標を組み込むことを検討する.
  2. 戦略の適応性を向上させるため,利益とストップ・ロスの設定については,異なる市場環境と取引手段に応じて動的に調整します.
  3. バックテストの結果に基づいて,戦略の安定性と収益性を高めるため,高速および遅い範囲期間を選択し,収益率とストップ損失レベルの百分比設定などのパラメータ設定をさらに最適化します.

概要

ダブルレンジフィルターモメントトレード戦略は,価格動向を決定し,買い/売るシグナルを生成するために,ダイナミックな上下帯と組み合わせて,高速および遅い期間のスムーズな範囲を使用して包括的なフィルターを構築する.この戦略はまた,リスクを制御し,利益をロックするために4つのグラデントテイク・プロフィートレベルと1つのストップ・ロスのレベルを設定する.この戦略は,トレンド市場で使用するのに適していますが,変動する市場でより多くの偽信号を生成する可能性があります.将来,より多くの指標を導入し,テイク・プロフィートとストップ・ロスの設定を最適化し,戦略の適応性と安定性を向上させるためにパラメータを動的に調整することを検討してください.


/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=5
strategy(title='2"Twin Range Filter', overlay=true)
strat_dir_input = input.string(title='İşlem Yönü', defval='Alis', options=['Alis', 'Satis', 'Tum'])
strat_dir_value = strat_dir_input == 'Alis' ? strategy.direction.long : strat_dir_input == 'Satis' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

////////////////////////////

// Backtest inputs
BaslangicAy = input.int(defval=1, title='İlk ay', minval=1, maxval=12)
BaslangicGun = input.int(defval=1, title='İlk Gün', minval=1, maxval=31)
BaslangicYil = input.int(defval=2023, title='İlk Yil', minval=2000)
SonAy = input.int(defval=1, title='Son Ay', minval=1, maxval=12)
SonGun = input.int(defval=1, title='Son Gün', minval=1, maxval=31)
SonYil = input.int(defval=9999, title='Son Yıl', minval=2000)

start = timestamp(BaslangicYil, BaslangicAy, BaslangicGun, 00, 00)  // backtest start window
finish = timestamp(SonYil, SonAy, SonGun, 23, 59)  // backtest finish window
window() => true

source = input(defval=close, title='Source')
showsignals = input(title='Show Buy/Sell Signals ?', defval=true)
per1 = input.int(defval=27, minval=1, title='Fast period')
mult1 = input.float(defval=1.6, minval=0.1, title='Fast range')
per2 = input.int(defval=55, minval=1, title='Slow period')
mult2 = input.float(defval=2, minval=0.1, title='Slow 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
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
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(source, smrng)
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])
STR = filt + smrng
STS = filt - smrng
FUB = 0.0
FUB := STR < nz(FUB[1]) or close[1] > nz(FUB[1]) ? STR : nz(FUB[1])
FLB = 0.0
FLB := STS > nz(FLB[1]) or close[1] < nz(FLB[1]) ? STS : nz(FLB[1])
TRF = 0.0
TRF := nz(TRF[1]) == FUB[1] and close <= FUB ? FUB : nz(TRF[1]) == FUB[1] and close >= FUB ? FLB : nz(TRF[1]) == FLB[1] and close >= FLB ? FLB : nz(TRF[1]) == FLB[1] and close <= FLB ? FUB : FUB
al = ta.crossover(close, TRF)
sat = ta.crossunder(close, TRF)
plotshape(showsignals and al, title='Long', text='BUY', style=shape.labelup, textcolor=color.white, size=size.tiny, location=location.belowbar, color=color.rgb(0, 19, 230))
plotshape(showsignals and sat, title='Short', text='SELL', style=shape.labeldown, textcolor=color.white, size=size.tiny, location=location.abovebar, color=color.rgb(0, 19, 230))
alertcondition(al, title='Long', message='Long')
alertcondition(sat, title='Short', message='Short')
Trfff = plot(TRF)
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = close > TRF ? color.green : na
shortFillColor = close < TRF ? color.red : na
fill(mPlot, Trfff, title='UpTrend Highligter', color=longFillColor, transp=90)
fill(mPlot, Trfff, title='DownTrend Highligter', color=shortFillColor, transp=90)

//////////////////////



renk1 = input(true, "Mum Renk Ayarları?")
mumrenk = input(true,title="Trend Bazlı Mum Rengi Değişimi?")
htaColor = renk1 ? (al ? color.rgb(224, 230, 57) : #E56337) : #c92626
barcolor(color = mumrenk ? (renk1 ? htaColor : na) : na)
if (al) and window()
    strategy.entry("Al", strategy.long)
if (sat) and window()
    strategy.entry("Sat", strategy.short)


per1(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
zarkesmgb = input.float(title='Zarar Kes Yüzdesi', defval=100, minval=0.01)
zarkeslos = per1(zarkesmgb)
q1 = input.int(title='Satış Lot Sayısı 1.Kısım %', defval=5, minval=1)
q2 = input.int(title='Satış Lot Sayısı 2.Kısım %', defval=8, minval=1)
q3 = input.int(title='Satış Lot Sayısı 3.Kısım %', defval=13, minval=1)
q4 = input.int(title='Satış Lot Sayısı 4.Kısım %', defval=21, minval=1)
tp1 = input.float(title='Kar Yüzdesi 1.Kısım', defval=13, minval=0.01)
tp2 = input.float(title='Kar Yüzdesi 2.Kısım', defval=21, minval=0.01)
tp3 = input.float(title='Kar Yüzdesi 3.Kısım', defval=29, minval=0.01)
tp4 = input.float(title='Kar Yüzdesi 4.Kısım', defval=34, minval=0.01)
strategy.exit('✨KS1', qty_percent=q1, profit=per1(tp1), loss=zarkeslos)
strategy.exit('✨KS2', qty_percent=q2, profit=per1(tp2), loss=zarkeslos)
strategy.exit('✨KS3', qty_percent=q3, profit=per1(tp3), loss=zarkeslos)
strategy.exit('✨KS4', qty_percent=q4, profit=per1(tp4), loss=zarkeslos)



もっと