Range Breakthrough Dual Moving Average Filtering Strategy

Penulis:ChaoZhang, Tanggal: 2023-11-27 17:03:08
Tag:

img

Gambaran umum

Ini adalah strategi yang memanfaatkan moving average dan Bollinger Bands untuk penilaian tren, dikombinasikan dengan prinsip penyaringan breakout dan stop loss.

Prinsip Strategi

Strategi ini terdiri dari bagian-bagian utama berikut:

  1. Penghakiman tren: Gunakan MACD untuk menilai tren harga dan membedakan tren bullish dan bearish.

  2. Penyaringan kisaran: Gunakan Bollinger Bands untuk menilai kisaran fluktuasi harga dan menyaring sinyal yang tidak menembus kisaran.

  3. Konfirmasi rata-rata bergerak ganda: EMA cepat dan EMA lambat membentuk rata-rata bergerak ganda untuk mengkonfirmasi sinyal tren. Sinyal beli hanya dihasilkan ketika EMA cepat > EMA lambat.

  4. Mekanisme Stop Loss: Menetapkan titik stop loss. Tutup posisi ketika harga melewati titik stop loss ke arah yang tidak menguntungkan.

Logika untuk sinyal masuk adalah:

  1. MACD menilai tren naik
  2. Harga menembus rel atas Bollinger Bands
  3. EMA cepat lebih tinggi dari EMA lambat

Ketika ketiga kondisi terpenuhi pada saat yang sama, sinyal beli dihasilkan.

Ada dua jenis posisi penutupan, mengambil keuntungan dan stop loss. titik mengambil keuntungan adalah harga masuk dikalikan dengan persentase tertentu, dan titik stop loss adalah harga masuk dikalikan dengan persentase tertentu. ketika harga menembus salah satu titik, posisi ditutup.

Analisis Keuntungan

Keuntungan dari strategi ini adalah:

  1. Dapat menangkap perubahan tren secara tepat waktu dengan lebih sedikit traceback.
  2. Mengurangi sinyal palsu dengan menyaring dengan rata-rata bergerak ganda, meningkatkan kualitas sinyal.
  3. Mekanisme stop loss secara efektif mengontrol kerugian tunggal.
  4. Ruang pengoptimalan parameter besar yang dapat disesuaikan dengan kondisi optimal.

Analisis Risiko

Ada juga beberapa risiko dalam strategi ini:

  1. Sinyal palsu yang dihasilkan di pasar sampingan dapat menyebabkan kerugian.
  2. Pengaturan stop loss yang tidak benar dapat menyebabkan kerugian yang tidak perlu.
  3. Parameter yang tidak tepat dapat mengakibatkan kinerja strategi yang buruk.

Untuk mengatasi risiko ini, strategi dapat dioptimalkan dengan menyesuaikan parameter, menetapkan posisi stop loss, dll.

Arahan Optimasi

Strategi dapat dioptimalkan dalam aspek berikut:

  1. Sesuaikan panjang rata-rata bergerak ganda untuk menemukan kombinasi parameter yang optimal.
  2. Uji metode stop loss yang berbeda, seperti trailing stop loss, oscillating stop loss, dll.
  3. Uji parameter MACD untuk menemukan pengaturan yang optimal.
  4. Gunakan pembelajaran mesin untuk optimasi parameter otomatis.
  5. Tambahkan kondisi tambahan untuk sinyal filter.

Dengan menguji pengaturan parameter yang berbeda dan mengevaluasi pengembalian dan rasio Sharpe, kondisi optimal dari strategi dapat ditemukan.

Kesimpulan

Ini adalah strategi kuantitatif yang memanfaatkan penilaian tren, penyaringan kisaran, konfirmasi rata-rata bergerak ganda dan ide stop loss. Ini dapat secara efektif menentukan arah tren dan mencapai keseimbangan antara maksimalisasi keuntungan dan pengendalian risiko. Melalui optimasi parameter, pembelajaran mesin dan cara lainnya, strategi memiliki ruang yang besar untuk perbaikan untuk mencapai hasil yang lebih baik.


/*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)


Lebih banyak