Strategi Sokongan dan Rintangan dengan Penembusan Volume dan Hentian Hentian

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

img

Ringkasan

Idea utama strategi ini adalah untuk menggabungkan tahap sokongan / rintangan dan pecah volum untuk menentukan isyarat kemasukan, dan menggunakan penunjuk ATR untuk menyesuaikan stop loss secara dinamik untuk mengambil keuntungan, untuk menangkap lebih banyak keuntungan berpotensi.

Logika Strategi

Strategi ini terdiri daripada logik utama berikut:

  1. Gunakan ta.pivothigh dan ta.pivotlow untuk mengira harga tertinggi lilin L_Bars terdahulu dan harga terendah lilin R_Bars terdahulu, sebagai tahap rintangan dan sokongan.

  2. Apabila harga penutupan melintasi tahap rintangan dan jumlah pecah di atas ambang VolumeRange, pergi panjang. Apabila harga penutupan melintasi di bawah tahap sokongan dan jumlah pecah di atas ambang VolumeRange, pergi pendek.

  3. Selepas masuk panjang, tetapkan stop loss pada close-ATR_LO. Selepas masuk pendek, tetapkan stop loss pada close+ATR_SH. Ini merealisasikan penyesuaian stop loss yang dinamis.

  4. Hanya mengambil isyarat pertama dalam waktu dagangan (0915-1445) setiap hari. Tiada pesanan baru selepas mencapai had risiko harian yang ditakrifkan oleh input risiko.

Analisis Kelebihan

  1. Gunakan teori sokongan / rintangan digabungkan dengan penunjuk jumlah untuk meningkatkan ketepatan kemasukan.

  2. Penghentian kerugian yang berasaskan ATR boleh menyesuaikan tahap berhenti secara fleksibel berdasarkan turun naik pasaran, mengurangkan peluang untuk mendapatkan keuntungan.

  3. Kawalan yang sesuai terhadap masa dagangan harian dan risiko setiap dagangan membantu menangkap trend dan mengelakkan kerugian berhenti yang berlebihan.

Analisis Risiko

  1. Tahap sokongan / rintangan mungkin gagal dan tidak dapat memberikan isyarat kemasukan yang berkesan.

  2. Pengganda ATR yang ditetapkan terlalu tinggi boleh menyebabkan stop loss terlalu jauh, meningkatkan risiko kerugian.

  3. Sempadan jumlah yang ditetapkan terlalu rendah boleh kehilangan peluang, terlalu tinggi boleh menyebabkan isyarat palsu.

Penyelesaian:

  • Sesuaikan parameter sokongan / rintangan berdasarkan ciri-ciri produk yang berbeza.

  • Mengoptimumkan pengganda ATR dan parameter ambang jumlah.

  • Tambah penunjuk lain untuk mengesahkan isyarat masuk.

Arahan pengoptimuman

  1. Tambahkan penunjuk lain seperti purata bergerak untuk membantu menentukan isyarat kemasukan.

  2. Mengoptimumkan parameter seperti pengganda ATR dan ambang jumlah.

  3. Gunakan algoritma pembelajaran mesin untuk merealisasikan pengoptimuman parameter dinamik.

  4. Memperluas strategi untuk produk lain untuk mencari corak parameter.

Ringkasan

Strategi ini mengintegrasikan pelbagai alat analisis, menggunakan kaedah sokongan / rintangan, jumlah, dan stop loss, dan mencapai hasil backtest yang baik. Tetapi lebih banyak ketidakpastian mungkin wujud dalam perdagangan langsung, yang memerlukan peningkatan lanjut seperti pengoptimuman parameter dan penunjuk pengesahan kemasukan tambahan untuk meningkatkan prestasi dunia nyata. Secara keseluruhan, strategi ini mempunyai logika yang jelas dan mudah difahami, memberikan kes rujukan 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 lanjut