Strategi ini menggabungkan purata bergerak, penunjuk Laguerre RSI dan penunjuk ADX untuk melaksanakan perdagangan pecah. Ia pergi lama apabila purata bergerak pantas melintasi di atas purata bergerak perlahan, Laguerre RSI lebih besar daripada 80, dan ADX lebih besar daripada 20; ia pergi pendek apabila purata bergerak pantas melintasi di bawah purata bergerak perlahan, Laguerre RSI kurang daripada 20, dan ADX lebih besar daripada 20. Strategi ini menangkap ciri momentum pasaran dan memasuki pasaran pada awal perkembangan trend.
Strategi ini terutamanya menggunakan penunjuk berikut untuk menentukan trend dan masa kemasukan:
Gabungan purata bergerak: EMA 16 hari, EMA 48 hari, SMA 200 hari. Trend menaik ditentukan apabila purata jangka pendek melintasi di atas purata jangka panjang, dan trend menurun apabila melintasi di bawah.
Laguerre RSI indikator untuk menentukan zon overbought dan oversold. RSI lebih daripada 80 adalah isyarat panjang, dan kurang daripada 20 isyarat pendek.
Indikator ADX untuk menentukan status trend. ADX lebih besar daripada 20 menunjukkan trend, sesuai untuk perdagangan pecah.
Isyarat kemasukan ditentukan oleh arah gabungan purata bergerak, masa kemasukan oleh Laguerre RSI, dan pasaran bukan trend disaring oleh ADX. Isyarat keluar dihasilkan apabila purata bergerak menyeberang kembali. Kerangka penilaian strategi keseluruhan agak munasabah, dengan penunjuk yang berbeza bekerjasama untuk menentukan entri dan keluar panjang / pendek.
Kelebihan strategi ini termasuk:
Menangkap momentum trend: Strategi hanya memasuki pasaran pada permulaan perkembangan trend, menangkap keuntungan eksponensial dari trend.
Kerugian terhad: Hentikan kerugian yang ditetapkan dengan betul mengehadkan kerugian dari perdagangan individu.
Penunjuk gabungan yang tepat: Purata bergerak, Laguerre RSI dan ADX dapat menentukan arah pasaran dan masa kemasukan dengan agak tepat.
Pelaksanaan mudah: Strategi hanya menggunakan 3 penunjuk dan mudah difahami dan dilaksanakan.
Terdapat juga beberapa risiko untuk strategi:
Risiko pembalikan trend: Sebagai strategi trend, kerugian besar boleh berlaku jika pembalikan trend tidak dikesan tepat pada masanya.
Risiko penarikan: Dalam pasaran yang berbeza, berhenti boleh dipukul yang membawa kepada penarikan akaun.
Risiko pengoptimuman parameter: Parameter penunjuk perlu diselaraskan untuk pasaran yang berbeza untuk mengelakkan kegagalan.
Tindakan balas:
Stop loss yang ketat untuk mengehadkan jumlah kerugian perdagangan tunggal.
Mengoptimumkan parameter penunjuk dan ambang pecah.
Menggunakan lindung nilai niaga hadapan dan lain-lain untuk menguruskan pengeluaran.
Beberapa cara untuk mengoptimumkan strategi termasuk:
Pengoptimuman parameter: Uji kombinasi tempoh purata bergerak, parameter Laguerre RSI, parameter ADX untuk mencari tetapan yang optimum.
Pengoptimuman pecah: Uji ambang penembusan purata bergerak yang berbeza untuk mengimbangi kekerapan perdagangan dan keuntungan.
Pengoptimuman kemasukan: Uji penunjuk lain digabungkan dengan Laguerre RSI untuk masa kemasukan yang lebih tepat.
Pengoptimuman Keluar: Penyelidikan isyarat keluar lain dalam kombinasi dengan purata bergerak.
Mengambil keuntungan berbanding pengoptimuman stop loss: Uji strategi yang berbeza untuk mengoptimumkan pulangan.
Ringkasnya, strategi ini berkesan menangkap pergerakan trend dengan menggunakan gabungan purata bergerak, Laguerre RSI dan ADX untuk menentukan kemasukan dan keluar. Dengan memasuki awal perkembangan trend dan mengikuti dengan teliti aliran trend, keuntungan eksponensial dapat dibuat, sementara kerugian berhenti membantu mengehadkan kerugian. Strategi ini sesuai untuk pelabur yang selesa membuat penilaian pasaran, serta mereka yang melakukan perdagangan automatik selepas pengoptimuman parameter. Secara keseluruhan strategi ini mempunyai utiliti praktikal yang kuat.
/*backtest start: 2023-12-05 00:00:00 end: 2023-12-12 00:00:00 period: 1m basePeriod: 1m 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/ // © PtGambler //@version=5 strategy("3MA + Laguerre RSI + ADX [Pt]", shorttitle = "3MA+LaRSI+ADX[Pt]", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500) // ********************************** Trade Period / Strategy Setting ************************************** startY = input(title='Start Year', defval=2011, group = "Backtesting window") startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window") startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window") finishY = input(title='Finish Year', defval=2050, group = "Backtesting window") finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window") finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window") timestart = timestamp(startY, startM, startD, 00, 00) timefinish = timestamp(finishY, finishM, finishD, 23, 59) use_entry_sess = input.bool(false, 'Use Entry Session Window', group = "Trading Session") t1_session = input("0930-1555:23456", "Entry Session", group="Trading Session", tooltip = "Entry Signal only generated within this period.") t1 = time(timeframe.period, t1_session) window = true margin_req = input.float(1, title="Margin Requirement / Leverage", step=0.1, group = "Trading Options") qty_per_trade = input.float(100, title = "% of initial capital per trade", group = "Trading Options") reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options") reinvest_percent = input.float(defval=100, title = "Reinvest percentage", group="Trading Options") close_eod = input.bool(false, "All trades will close at the close of trading window", group = "Trading Options") close_b4_open = input.bool(false, "Position must hit either SL/PT before entering new trade", group = "Trading Options") profit = strategy.netprofit strategy.initial_capital = 50000 float trade_amount = math.floor(strategy.initial_capital*margin_req / close) if strategy.netprofit > 0 and reinvest trade_amount := math.floor((strategy.initial_capital* (qty_per_trade/100)+(profit*reinvest_percent*0.01))*margin_req/ close) else trade_amount := math.floor(strategy.initial_capital* (qty_per_trade/100)*margin_req / close) // ****************************************************************************************** group_ma = "Moving Average Ribbon" group_larsi = "Laguerre RSI" group_adx = "ADX" group_SL = "Stop Loss / Profit Target" // ----------------------------------------- MA Ribbon ------------------------------------- ema1_len = input.int(16, "Fast EMA Length", group = group_ma) ema2_len = input.int(48, "Slow EMA Length ", group = group_ma) sma1_len = input.int(200, "Slow SMA Length", group = group_ma) ema1 = ta.ema(close, ema1_len) ema2 = ta.ema(close, ema2_len) sma1 = ta.sma(close, sma1_len) plot(ema1, "EMA 1", color.white, linewidth = 2) plot(ema2, "EMA 2", color.yellow, linewidth = 2) plot(sma1, "SMA 1", color.purple, linewidth = 2) ma_bull = ema1 > ema2 and ema2 > sma1 ma_bear = ema1 < ema2 and ema2 < sma1 // ------------------------------------------ Laguerre RSI --------------------------------------- alpha = input.float(0.2, title='Alpha', minval=0, maxval=1, step=0.1, group = group_larsi) gamma = 1 - alpha L0 = 0.0 L0 := (1 - gamma) * close + gamma * nz(L0[1]) L1 = 0.0 L1 := -gamma * L0 + nz(L0[1]) + gamma * nz(L1[1]) L2 = 0.0 L2 := -gamma * L1 + nz(L1[1]) + gamma * nz(L2[1]) L3 = 0.0 L3 := -gamma * L2 + nz(L2[1]) + gamma * nz(L3[1]) cu = (L0 > L1 ? L0 - L1 : 0) + (L1 > L2 ? L1 - L2 : 0) + (L2 > L3 ? L2 - L3 : 0) cd = (L0 < L1 ? L1 - L0 : 0) + (L1 < L2 ? L2 - L1 : 0) + (L2 < L3 ? L3 - L2 : 0) temp = cu + cd == 0 ? -1 : cu + cd LaRSI = temp == -1 ? 0 : cu / temp LaRSI := LaRSI * 100 bull_LaRSI = LaRSI > 80 bear_LaRSI = LaRSI < 20 // --------------------------------------- ADX ------------------------ adxlen = input(14, title="ADX Smoothing", group = group_adx) dilen = input(14, title="DI Length", group = group_adx) dirmov(len) => up = ta.change(high) down = -ta.change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = ta.rma(ta.tr, len) plus = fixnan(100 * ta.rma(plusDM, len) / truerange) minus = fixnan(100 * ta.rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) active_adx = sig > 20 //and sig > sig[1] // ******************************* Profit Target / Stop Loss ********************************************* use_SLPT = input.bool(false, 'Use Fixed SL / PT', group = group_SL) SL = input.float(50, 'Stop loss in ticks', step = 1, group = group_SL) * syminfo.mintick PT = input.float(100, "Profit target in ticks", step = 1, group = group_SL) * syminfo.mintick var L_PT = 0.0 var S_PT = 0.0 var L_SL = 0.0 var S_SL = 0.0 if strategy.position_size > 0 L_SL := L_SL[1] L_PT := L_PT[1] else if strategy.position_size < 0 S_SL := S_SL[1] S_PT := S_PT[1] else L_SL := close - SL L_PT := close + PT S_SL := close + SL S_PT := close - PT entry_line = plot(use_SLPT and strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr) L_PT_line = plot(use_SLPT and strategy.position_size > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr) S_PT_line = plot(use_SLPT and strategy.position_size < 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr) L_SL_line = plot(use_SLPT and strategy.position_size > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr) S_SL_line = plot(use_SLPT and strategy.position_size < 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr) fill(L_PT_line, entry_line, color = color.new(color.green,90)) fill(S_PT_line, entry_line, color = color.new(color.green,90)) fill(L_SL_line, entry_line, color = color.new(color.red,90)) fill(S_SL_line, entry_line, color = color.new(color.red,90)) // ---------------------------------- Strategy setup ------------------------------------------------------ L_entry1 = ma_bull and bull_LaRSI and active_adx S_entry1 = ma_bear and bear_LaRSI and active_adx L_exit1 = ta.crossunder(ema1, ema2) S_exit1 = ta.crossover(ema1, ema2) // Trigger zones bgcolor(ma_bull ? color.new(color.green ,90) : na) bgcolor(ma_bear ? color.new(color.red,90) : na) if L_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true) strategy.entry("Long", strategy.long, trade_amount) if S_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true) strategy.entry("Short", strategy.short, trade_amount) if use_SLPT strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit") strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit") else if L_exit1 strategy.close("Long", comment = "Exit Long") if S_exit1 strategy.close("Short", comment = "Exit Short") if use_entry_sess and not window and close_eod strategy.close_all(comment = "EOD close")