
Strategi ini menggunakan indikator EMA untuk mengidentifikasi tren dan melakukan pelacakan pada saat pergerakan yang bergoyang. Strategi ini menggabungkan strategi pelacakan tren dan penangkapan goyang untuk melakukan pelacakan garis panjang pada saat pergerakan yang kuat dan perdagangan garis pendek pada saat pergerakan yang bergoyang untuk mendapatkan keuntungan yang lebih baik.
Strategi ini menggunakan 20 siklus EMA sebagai indikator untuk menilai tren. Ketika harga melewati EMA, dianggap bahwa pasar mulai naik; Ketika harga melewati EMA, dianggap bahwa pasar mulai turun.
Ketika harga di atas memakai EMA, dengan harga tertinggi 20 periode tertinggi sebagai stop stop, dengan harga terendah setelah memakai EMA rendah sebagai stop loss, melakukan masuk lebih banyak; ketika harga di bawah memakai EMA, dengan harga terendah 20 periode rendah sebagai stop stop, dengan harga terendah setelah memakai EMA tinggi sebagai stop loss, melakukan masuk kosong.
Strategi juga menilai apakah ADX lebih besar dari 30. Perdagangan hanya dilakukan ketika tren cukup jelas, yaitu ketika ADX lebih tinggi dari 30. Ini dapat mencegah terjadinya stop loss dalam situasi yang bergolak.
Pada saat memegang posisi, trail stop akan disesuaikan dengan kondisi pasar secara real-time untuk mengunci lebih banyak keuntungan.
Strategi ini menggabungkan keunggulan dari trend tracking dan shock trading untuk menghasilkan keuntungan yang lebih besar dalam situasi yang sedang tren, tetapi juga untuk mendapatkan keuntungan yang lebih stabil dalam situasi yang bergolak, dan memiliki kemampuan beradaptasi yang lebih kuat.
Aplikasi EMA juga membuat parameter strategi lebih sedikit, mengurangi risiko optimasi berlebihan, sehingga menjamin stabilitas strategi.
Risiko utama dari strategi ini adalah kemungkinan terjadi lebih banyak stop loss ketika guncangan meningkat. Pada saat ini, peran ADX menjadi jelas. Ketika nilai ADX rendah, perdagangan ditutup untuk menghindari kerugian ketika tidak ada tren yang jelas.
Selain itu, pengaturan stop loss yang masuk akal juga penting. Penetapan stop loss yang terlalu besar dapat meningkatkan kerugian tunggal. Penetapan stop loss yang terlalu kecil mungkin terlalu sensitif dan meningkatkan probabilitas stop loss. Di sini perlu ditemukan keseimbangan antara tujuan keuntungan dan risiko stop loss.
Strategi ini dapat dioptimalkan dalam beberapa hal:
Pilihan siklus EMA. Anda dapat menguji lebih banyak parameter siklus EMA untuk menemukan kombinasi parameter yang optimal.
Parameter ADX dapat dioptimalkan. Periode ADX dan nilai terendah ADX dapat mencoba pengaturan yang berbeda.
Algoritma Stop Loss dapat ditingkatkan, misalnya dengan memperkenalkan Stop Loss Dinamis.
Anda dapat mempertimbangkan untuk menggabungkan indikator lain, seperti KDJ, MACD, dan lain-lain, untuk membentuk strategi verifikasi multi-indikator.
Strategi pelacakan getaran silang emas EMA ganda secara keseluruhan adalah strategi yang sangat praktis. Ini menggabungkan karakteristik strategi tren dan getaran, yang dapat digunakan untuk pelacakan garis panjang maupun untuk perdagangan garis pendek.
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("Linda Raschke's Holy Grail", shorttitle="RHG", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, overlay = true)
adxlen = input(14, title="ADX period")
adxMin = input(30)
dilen = adxlen
f_highest(_src, _length)=>
_adjusted_length = _length < 1 ? 1 : _length
_value = _src
for _i = 0 to (_adjusted_length-1)
_value := _src[_i] >= _value ? _src[_i] : _value
_return = _value
f_lowest(_src, _length)=>
_adjusted_length = _length < 1 ? 1 : _length
_value = _src
for _i = 0 to (_adjusted_length-1)
_value := _src[_i] <= _value ? _src[_i] : _value
_return = _value
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)
emaLength = input(20)
curEma = ema(close, emaLength)
highPeriod = input(20)
d = na
takeProfitLong = highest(high, highPeriod)
stopLossLong = f_lowest(low, barssince(low >= curEma))
if strategy.position_size == 0
if adx(dilen, adxlen) <= adxMin or high < curEma
strategy.cancel("Long")
if adx(dilen, adxlen) > adxMin and low < curEma and high > curEma and curEma > curEma[highPeriod / 2] and curEma > curEma[highPeriod] and takeProfitLong > high
strategy.order("Long", strategy.long, stop = high)
strategy.exit("Exit", "Long", limit = takeProfitLong, stop = stopLossLong)
d := high
takeProfitShort = lowest(low, highPeriod)
stopLossShort = f_highest(high, barssince(high <= curEma))
if strategy.position_size == 0
if adx(dilen, adxlen) <= adxMin or low > curEma
strategy.cancel("Short")
if adx(dilen, adxlen) > adxMin and high > curEma and low < curEma and curEma < curEma[highPeriod / 2] and curEma < curEma[highPeriod] and takeProfitShort < low
strategy.order("Short", strategy.short, stop = low)
strategy.exit("Exit", "Short", limit = takeProfitShort, stop = stopLossShort)
d := low
strategy.close("Exit")
plot(d == high ? stopLossLong : d == low ? stopLossShort : na, style = circles, linewidth = 4, color = red)
plot(d == high ? takeProfitLong : d == low ? takeProfitShort : na, style = circles, linewidth = 4, color = green)
plot(d, style = circles, linewidth = 4, color = yellow)
plot(curEma, color = black, linewidth = 2)
// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
strategy.cancel_all()
strategy.close_all()