
Strategi ini menggunakan gabungan purata bergerak, Laguerre RSI dan ADX untuk mencapai perdagangan terobosan. Apabila RSI bergerak cepat melalui purata bergerak perlahan, Laguerre RSI lebih besar daripada 80, ADX lebih besar daripada 20, dan apabila RSI bergerak cepat melalui purata bergerak perlahan, Laguerre RSI kurang daripada 20, ADX lebih besar daripada 20, strategi ini menangkap ciri-ciri kuantitatif pasaran yang bergerak dan memasuki pasaran ketika trend mula berkembang.
Strategi ini menilai trend dan masa untuk memasuki pasaran dengan menggunakan indikator berikut:
Kombinasi purata bergerak: EMA 16 hari, EMA 48 hari, SMA 200 hari. Apabila purata jangka pendek di atas rata-rata jangka panjang, ia dinilai sebagai pasaran overhead, dan apabila ia dipotong, ia dinilai sebagai pasaran kosong.
Laguerre RSI menentukan kawasan overbought dan oversold. RSI lebih besar daripada 80 adalah tanda overhead dan kurang daripada 20 adalah tanda kosong.
Indikator ADX menilai keadaan trend. ADX lebih besar daripada 20 menunjukkan keadaan trend, sesuai untuk perdagangan pecah.
Isyarat masuk adalah gabungan purata bergerak untuk menentukan arah trend, Laguerre RSI untuk menentukan masa masuk, penapis ADX untuk pasaran bukan trend. Isyarat keluar adalah pergerakan rata-rata yang berbalik. Seluruh kerangka keputusan strategi adalah lebih munasabah, setiap petunjuk saling bekerjasama untuk menentukan kosong dan masuk ke luar lapangan.
Strategi ini mempunyai kelebihan berikut:
Menangkap pergerakan trend: Strategi ini hanya digunakan apabila trend mula berkembang, dan dapat menangkap keuntungan indeks di pasaran selepasnya.
Hilang terhad: dengan penyetempatan yang betul, kerugian tunggal dapat dikawal dalam jangkauan tertentu. Walaupun terdapat peluang untuk memperoleh keuntungan.
Indikator portfolio menilai dengan tepat: purata bergerak, Laguerre RSI dan ADX menunjukkan penilaian pasaran yang lebih tepat dan masa masuk.
Mudah dilaksanakan: Strategi ini hanya menggunakan 3 indikator dan ia mudah dilaksanakan dan mudah dipelajari.
Strategi ini juga mempunyai risiko:
Risiko pembalikan trend: Strategi ini adalah strategi untuk mengikuti trend, dan kerugian yang besar akan timbul jika tidak mengetahui perubahan trend pada masa yang tepat.
Risiko penarikan balik: Dalam keadaan yang tidak menentu, penangguhan boleh ditembusi, membawa penarikan balik ke akaun.
Risiko pengoptimuman parameter: parameter penunjuk perlu disesuaikan dengan pasaran yang berbeza, jika tidak, ia akan menjadi tidak berkesan.
Kaedah pencegahan:
Penutupan ketat, kawalan kerugian tunggal.
Optimumkan parameter penunjuk, sesuaikan bilangan lubang pecah.
Pengambilan semula menggunakan kaedah seperti nilai simpanan jangka masa hadapan.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Pengoptimuman parameter terbaik: Ujian terhadap kitaran purata bergerak, parameter Laguerre RSI, dan parameter ADX untuk mencari kombinasi parameter yang optimum.
Optimasi terobosan: Uji terobosan rata-rata bergerak yang berbeza untuk mencari keseimbangan antara jumlah dagangan dan kadar keuntungan.
Optimasi syarat kemasukan: Uji indikator lain yang digabungkan dengan Laguerre RSI untuk mencari syarat yang lebih tepat untuk menentukan masa kemasukan.
Pengoptimuman keadaan keluar: Kajian lain digabungkan dengan purata bergerak sebagai keputusan isyarat keluar yang lebih tepat.
Matlamat keuntungan dan pengoptimuman hentikan kerugian: Uji strategi hentikan dan hentikan kerugian yang berbeza untuk mengoptimumkan keuntungan akaun.
Strategi ini berjaya menangkap trend dengan berkesan dengan menggunakan tiga indikator penghakiman purata bergerak, Laguerre RSI dan ADX. Masuk tepat pada masanya apabila trend mula berkembang, dan teruskan dengan trend untuk menangkap keuntungan peringkat indeks.
/*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")