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.
Strategi ini terdiri daripada logik utama berikut:
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.
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.
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.
Hanya mengambil isyarat pertama dalam waktu dagangan (0915-1445) setiap hari. Tiada pesanan baru selepas mencapai had risiko harian yang ditakrifkan oleh input risiko.
Gunakan teori sokongan / rintangan digabungkan dengan penunjuk jumlah untuk meningkatkan ketepatan kemasukan.
Penghentian kerugian yang berasaskan ATR boleh menyesuaikan tahap berhenti secara fleksibel berdasarkan turun naik pasaran, mengurangkan peluang untuk mendapatkan keuntungan.
Kawalan yang sesuai terhadap masa dagangan harian dan risiko setiap dagangan membantu menangkap trend dan mengelakkan kerugian berhenti yang berlebihan.
Tahap sokongan / rintangan mungkin gagal dan tidak dapat memberikan isyarat kemasukan yang berkesan.
Pengganda ATR yang ditetapkan terlalu tinggi boleh menyebabkan stop loss terlalu jauh, meningkatkan risiko kerugian.
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.
Tambahkan penunjuk lain seperti purata bergerak untuk membantu menentukan isyarat kemasukan.
Mengoptimumkan parameter seperti pengganda ATR dan ambang jumlah.
Gunakan algoritma pembelajaran mesin untuk merealisasikan pengoptimuman parameter dinamik.
Memperluas strategi untuk produk lain untuk mencari corak parameter.
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)