
Strategi ini menggabungkan penyambung rata-rata bergerak dan penunjuk momentum, yang membolehkan trend dijejaki dengan berkesan dan berbalik pada masa yang tepat. Strategi ini pertama-tama menggunakan rata-rata bergerak cepat dan rata-rata bergerak perlahan untuk membentuk tanda Forex yang lebih tinggi dan tanda Forex yang lebih rendah. Kemudian, digabungkan dengan penunjuk momentum dengan parameter tertentu, jika penunjuk momentum pada rata-rata bergerak cepat naik lagi, ia dianggap sebagai trend terus, dan terus meningkat; apabila penunjuk momentum turun, ia dianggap sebagai pembalikan trend, kedudukan rata.
Logik teras strategi ini adalah berdasarkan isyarat trend yang dibentuk oleh persilangan purata bergerak, dan indikator momentum menentukan pembalikan trend. Logik kod bahagian penting adalah sebagai berikut:
Hitung harga purata bergerak cepat price1 dan purata bergerak perlahan price2 ◄ di mana harga1 adalah HMA 5 kitaran, harga2 adalah HMA 7 kitaran ◄
Apabila harga1 di atas menembusi harga2 menghasilkan isyarat berganda, dan apabila harga1 di bawah menembusi harga2 menghasilkan isyarat kosong. Ini adalah penggunaan biasa berdasarkan purata bergerak.
Selepas mencetuskan isyarat berbilang, jika penunjuk momentum rc1 pada harga purata bergerak cepat 1 naik lagi, ia dianggap sebagai trend berterusan dan kekal dalam keadaan berbilang.
Apabila penunjuk momentum roc1 turun, ia dianggap sebagai pembalikan trend dan melakukan kedudukan kosong. Logik pemprosesan isyarat kosong adalah sama.
Pengenalan ADX Threshold, digunakan untuk menyaring isyarat salah dalam keadaan bukan trend, hanya apabila ADX lebih tinggi daripada threshold akan menghasilkan isyarat melakukan lebih banyak shorting.
Kelebihan utama strategi ini berbanding dengan strategi purata bergerak yang mudah ialah pengenalan penunjuk dinamik yang menentukan pembalikan trend, yang dapat mengesan trend dan pembalikan lebih tepat pada masanya. Kelebihan spesifiknya adalah sebagai berikut:
Rata-rata bergerak sendiri bertindak balas terhadap perubahan harga dengan lambat, manakala penunjuk momentum dapat menangkap isyarat pembalikan lebih cepat, yang membantu menghentikan kerugian atau membalikkan kedudukan tepat pada masanya.
Isyarat pembalikan berdasarkan indikator momentum lebih dipercayai, yang dapat mengurangkan pembukaan posisi yang tidak perlu dalam perdagangan trend.
Penggunaan indikator ADX mengelakkan isyarat salah dalam pasaran bukan trend, membolehkan strategi lebih fokus pada fasa trend, dan dengan itu meningkatkan kebarangkalian keuntungan.
Strategi logiknya jelas dan mudah difahami dan diikuti, sesuai untuk pemula dalam perdagangan algoritma.
Ruang untuk mengoptimumkan parameter penunjuk besar, boleh dicapai dengan menyesuaikan kitaran purata bergerak, parameter momentum dan lain-lain untuk mengoptimumkan pasaran yang berbeza.
Risiko utama dalam strategi ini adalah:
Rata-rata bergerak itu sendiri bertindak balas terhadap perubahan harga yang terlewat, yang boleh menyebabkan isyarat terlewat dan terlepas masa masuk yang terbaik.
Penembusan palsu menyebabkan kedudukan terbuka atau kosong yang tidak perlu, yang memerlukan pengoptimuman parameter penunjuk lebih lanjut atau pengenalan syarat penapisan tambahan.
Keputusan pembalikan trend bergantung kepada indikator dinamik, dan apabila pasaran berubah secara mendadak, kesan indikator dinamik mungkin akan dikurangkan.
Indeks ADX tidak dapat menilai trend dan penyusunan dengan sempurna, dan penetapan had terlalu tinggi atau terlalu rendah boleh menyebabkan masalah.
Strategi ini tidak mempertimbangkan kos urus niaga, perlu berhati-hati untuk menetapkan titik berhenti untuk mengawal risiko apabila digunakan secara praktikal.
Strategi ini boleh dioptimumkan dengan cara berikut:
Cuba jenis purata bergerak yang lain, atau sesuaikan parameter purata bergerak, untuk mengoptimumkan kesan halus indikator.
Optimumkan parameter panjang indikator dinamika supaya ia lebih sensitif terhadap perubahan harga.
Cuba untuk menetapkan penapis harga apabila indikator momentum berbalik, untuk mengelakkan tertipu oleh turun naik kecil jangka pendek.
Peningkatan penggunaan ADX, seperti menggunakan parameter yang berbeza untuk tahap ADX yang berbeza.
Memperkenalkan syarat tambahan seperti penunjuk jumlah transaksi, meningkatkan kualiti isyarat, penapis penembusan palsu.
Menambah mekanisme penangguhan kerugian untuk mengawal kerugian tunggal. Menilai tahap bayaran bayaran di pasaran sebenar dan menetapkan penangguhan kerugian yang munasabah.
Strategi ini mengintegrasikan kelebihan penunjuk purata bergerak dan penunjuk momentum, mewujudkan trend yang dijejaki dan menangkap pembalikan. Berbanding dengan trend yang semata-mata, strategi ini dapat bertindak lebih fleksibel terhadap tahap pasaran yang berbeza, dan mengelakkan kerugian yang disebabkan oleh kejatuhan yang tinggi, sambil mengekalkan perdagangan trend.
/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//study(title="MA Crossover Strategy", overlay = true)
strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true)
src = input(open, title="Source")
price = request.security(syminfo.tickerid, timeframe.period, src)
ma1 = input(5, title="1st MA Length")
type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"])
ma2 = input(7, title="2nd MA Length")
type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"])
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
adxthreshold = input(20, title="ADX threshold")
dirmov(len) =>
up = change(high)
down = -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 = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / truerange)
minus = fixnan(100 * rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
//study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="")
//plot(sig, color=color.red, title="ADX")
f_hma(_src, _length)=>
_return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length)))
price1 = if (type1 == "SMA")
sma(price, ma1)
else
if (type1 == "EMA")
ema(price, ma1)
else
f_hma(price, ma1)
price2 = if (type2 == "SMA")
sma(price, ma2)
else
if (type2 == "EMA")
ema(price, ma2)
else
f_hma(price, ma2)
//plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0)
plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0)
plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0)
//longCondition = price1> price2
longCondition = price1> price2 and sig > adxthreshold
if (longCondition)
strategy.entry("Long", strategy.long)
shortCondition = price1 < price2 and sig > adxthreshold
if (shortCondition)
strategy.entry("Short", strategy.short)
lookback1 = input(1, "Lookback 1")
roc1 = roc(price1, lookback1)
ma1up = false
ma1down = false
ma2up = false
ma2down = false
ma1up := nz(ma1up[1])
ma1down := nz(ma1down[1])
ma2up := nz(ma2up[1])
ma2down := nz(ma2down[1])
trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01
if crossover(roc1, trendStrength1)
ma1up := true
ma1down := false
if crossunder(roc1, -trendStrength1)
ma1up := false
ma1down := true
shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold
if (shortexitCondition)
strategy.close("Short")
longexitCondition = ma1down and ma1up[1] and sig > adxthreshold
if (longexitCondition)
strategy.close("Long")