Strategi dukungan dan resistensi dengan volume breakout dan trailing stop loss

Penulis:ChaoZhang, Tanggal: 2024-01-11 17:58:26
Tag:

img

Gambaran umum

Ide utama dari strategi ini adalah untuk menggabungkan level support/resistance dan volume breakout untuk menentukan sinyal masuk, dan menggunakan indikator ATR untuk secara dinamis menyesuaikan stop loss untuk mengambil keuntungan, untuk menangkap lebih banyak potensi keuntungan.

Logika Strategi

Strategi ini terdiri dari logika utama berikut:

  1. Gunakan ta.pivothigh dan ta.pivotlow untuk menghitung harga tertinggi dari lilin L_Bars sebelumnya dan harga terendah dari lilin R_Bars sebelumnya, sebagai level resistance dan support.

  2. Ketika harga penutupan melintasi di atas level resistensi dan volume melanggar di atas ambang volumeRange, pergi panjang.

  3. Setelah masuk panjang, atur stop loss pada close-ATR_LO. Setelah masuk pendek, atur stop loss pada close+ATR_SH. Ini mewujudkan penyesuaian stop loss trailing yang dinamis.

  4. Hanya mengambil sinyal pertama dalam jam perdagangan (0915-1445) setiap hari. Tidak ada pesanan baru setelah mencapai batas risiko harian yang ditentukan oleh input risiko.

Analisis Keuntungan

  1. Gunakan teori dukungan/resistensi dikombinasikan dengan indikator volume untuk meningkatkan akurasi masuk.

  2. Trailing stop loss berdasarkan ATR dapat menyesuaikan tingkat stop secara fleksibel berdasarkan volatilitas pasar, mengurangi kemungkinan retracement keuntungan.

  3. Kontrol yang tepat atas waktu perdagangan harian dan risiko per perdagangan membantu menangkap tren dan menghindari stop loss yang berlebihan.

Analisis Risiko

  1. Tingkat dukungan/resistensi mungkin gagal dan tidak dapat memberikan sinyal masuk yang efektif.

  2. Multiplikator ATR yang diatur terlalu tinggi dapat menyebabkan stop loss terlalu jauh, meningkatkan risiko kerugian.

  3. Ambang volume yang diatur terlalu rendah dapat kehilangan peluang, terlalu tinggi dapat menyebabkan sinyal palsu.

Solusi:

  • Sesuaikan parameter dukungan/resistensi berdasarkan karakteristik produk yang berbeda.

  • Mengoptimalkan pengganda ATR dan parameter ambang volume.

  • Tambahkan indikator lain untuk mengkonfirmasi sinyal masuk.

Arahan Optimasi

  1. Tambahkan indikator lain seperti moving average untuk membantu menentukan sinyal masuk.

  2. Mengoptimalkan parameter seperti pengganda ATR dan ambang volume.

  3. Gunakan algoritma pembelajaran mesin untuk mewujudkan optimasi parameter dinamis.

  4. Memperluas strategi untuk produk lain untuk menemukan pola parameter.

Ringkasan

Strategi ini mengintegrasikan berbagai alat analisis, menerapkan metode support/resistance, volume, dan stop loss, dan mencapai hasil backtest yang baik. Namun, lebih banyak ketidakpastian mungkin ada dalam perdagangan langsung, yang membutuhkan peningkatan lebih lanjut seperti optimasi parameter dan indikator konfirmasi entri tambahan untuk meningkatkan kinerja dunia nyata. Secara keseluruhan, strategi ini memiliki logika yang jelas dan mudah dipahami, memberikan kasus referensi yang baik untuk strategi perdagangan kuantitatif.


/*backtest
start: 2024-01-03 00:00:00
end: 2024-01-10 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//   ____________                _________                      _____________
//  |____________|             ||________|                      ||__________|
//       ||            ____    ||        ||                     ||                    ______ ________    _____ ________
//       ||    |   || ||       ||________|| |   || ||    ||     ||     |   ||   /\\   |   // |______| || ||    |______|
//       ||    |===|| |===     ||__________ |   || ||    ||     ||     |===||  /__\\  |===      ||    ||   \\     ||
//       ||    |   || ||___    ||        || |___|| ||___ ||___  ||     |   || /    \\ |   \\    ||    || ___||    ||
//       ||                    ||________||                     ||__________
//       ||                    ||________|                      ||__________|
  
//@version=5
strategy("SUPPORT RESISTANCE STRATEGY [5MIN TF]",overlay=true )
L_Bars = input.int(defval = 10, minval = 1 , maxval = 50, step =1)
R_Bars = input.int(defval = 15, minval = 1 , maxval = 50, step =1)
volumeRange = input.int(20, title='Volume Break [threshold]', minval = 1)

// ═══════════════════════════ //
// ——————————> INPUT <——————— //
// ═══════════════════════════ //

EMA1 = input.int(title='PRICE CROSS EMA', defval = 150, minval = 10 ,maxval = 400)
factor1 = input.float(title='_ATR LONG',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL LONG")
factor2 = input.float(title='_ATR SHORT',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL SHORT")
risk = input.float(title='RISK',defval = 200 , minval = 1 , maxval = 5000 , step = 50, tooltip = "RISK PER TRADE")


var initialCapital = strategy.equity
t = time(timeframe.period, '0915-1445:1234567')
time_cond = not na(t)

// ══════════════════════════════════ //
// ———————————> EMA DATA <——————————— //
// ══════════════════════════════════ //
ema1 = ta.ema(close, EMA1)

plot(ema1, color=color.new(color.yellow, 0), style=plot.style_linebr, title='ema1')

// ══════════════════════════════════ //
// ————————> TRAIL DATA <———————————— //
// ══════════════════════════════════ //
// *******Calculate LONG TRAIL data*****
ATR_LO = ta.atr(14)*factor1

// *******Calculate SHORT TRAIL data*****
ATR_SH = ta.atr(14)*factor2

long_trail = close - ATR_LO
short_trail = close + ATR_SH

// Plot atr data
//plot(longStop, color=color.new(color.green, 0), style=plot.style_linebr, title='Long Trailing Stop')
//plot(shortStop , color=color.new(color.red, 0), style=plot.style_linebr, title='Short Trailing Stop')

// ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ //
// ————————————————————————————————————————————————————————> RESISTANCE/SUPPORT LEVELS DATA <————————————————————————————————————————————————————————————————————————————————————————————— //
// ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ //

Resistance_pi = fixnan(ta.pivothigh(L_Bars, R_Bars)[1])
Support_pi = fixnan(ta.pivotlow(L_Bars, R_Bars)[1])
r1 = plot(Resistance_pi, color=ta.change(Resistance_pi) ? na : color.red,  offset=-(R_Bars + 1),linewidth=2, title='RESISTANCE')
s1 = plot(Support_pi, color=ta.change(Support_pi) ? na : color.green, offset=-(R_Bars + 1),linewidth=2, title='SUPPORT')

//Volume 
vol_1 = ta.ema(volume, 5)
vol_2 = ta.ema(volume, 10)
osc_vol = 100 * (vol_1 - vol_2) / vol_2

// ══════════════════════════════════//
// ————————> LONG POSITIONS <————————//
// ══════════════════════════════════//
//******barinstate.isconfirmed used to avoid repaint in real time*******

if ( ta.crossover(close, Resistance_pi) and osc_vol > volumeRange and not(open - low > close - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close >= ema1 )
    strategy.entry(id= "Long" ,direction = strategy.long, comment = "BUY")
    
plot(long_trail , color=color.new(color.blue, 0), style=plot.style_linebr, title='long Stop')

if strategy.position_size > 0 
    strategy.exit("long tsl", "Long" , stop = long_trail ,comment='SELL')
 
// ═════════════════════════════════════//
// ————————> SHORT POSITIONS <————————— //
// ═════════════════════════════════════//
if ( ta.crossunder(close, Support_pi) and osc_vol > volumeRange and not(open - close < high - open)  and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close <= ema1 )
    strategy.entry(id = "Short" ,direction = strategy.short,  comment = "SELL") 

if strategy.position_size < 0
    strategy.exit("short tsl", "Short" ,  stop = short_trail ,comment='BUY')

// ════════════════════════════════════════════════//
// ————————> CLOSE ALL POSITIONS BY 3PM <————————— //
// ════════════════════════════════════════════════//
strategy.close_all(when = hour == 14 and minute == 55)

// ════════════════════════════════════════//
// ————————> MAX INTRADAY LOSS  <————————— //
// ════════════════════════════════════════//
// strategy.risk.max_intraday_loss(type = strategy.cash, value = risk)



Lebih banyak