
Strategi pengesanan gegaran gempa EMA Gold Cross adalah strategi yang menggunakan indikator EMA untuk mengenal pasti trend dan untuk mengesan dalam keadaan gegaran. Strategi ini menggabungkan pemikiran untuk mengesan trend dan menangkap gegaran, untuk mengesan garis panjang dalam keadaan yang kuat, untuk berdagang garis pendek dalam keadaan gegaran, untuk mendapatkan keuntungan yang lebih baik.
Strategi ini menggunakan EMA 20 kitaran sebagai penunjuk untuk menilai trend. Apabila harga naik melalui EMA, dianggap bahawa pasaran mula naik; Apabila harga turun melalui EMA, dianggap bahawa pasaran mula turun.
Apabila harga di atas memakai EMA, dengan harga tertinggi 20 periodhighest sebagai berhenti, dengan harga terendah selepas memakai EMA rendah sebagai berhenti rugi, buat masuk lebih banyak; apabila harga di bawah memakai EMA, dengan harga terendah 20 periodlowest sebagai berhenti, dengan harga terendah selepas memakai EMA tinggi sebagai berhenti rugi, buat masuk kosong.
Strategi ini juga akan menilai sama ada ADX lebih besar daripada 30. Ia hanya akan berdagang apabila trend cukup jelas, iaitu ADX lebih tinggi daripada 30. Ini dapat mengelakkan stop loss dalam keadaan goyah.
Semasa memegang kedudukan, trail stop akan disesuaikan dengan keadaan pasaran dalam masa nyata untuk mengunci lebih banyak keuntungan.
Strategi ini menggabungkan kelebihan trend-following dan perdagangan goyah, untuk mendapatkan keuntungan yang lebih besar dalam keadaan yang sedang maju, tetapi juga untuk mendapatkan keuntungan yang lebih stabil dalam keadaan yang goyah, dengan daya adaptasi yang lebih kuat.
Penggunaan EMA juga menjadikan parameter strategi lebih sedikit, mengurangkan risiko pengoptimuman berlebihan, dan dengan itu memastikan kestabilan strategi.
Risiko utama strategi ini adalah bahawa lebih banyak kerugian boleh berlaku apabila guncangan meningkat. Ini adalah apabila peranan ADX menjadi jelas. Apabila nilai ADX rendah, perdagangan akan ditutup untuk mengelakkan kerugian apabila tidak ada trend yang jelas.
Di samping itu, menetapkan titik berhenti yang munasabah juga penting. Tetapan titik berhenti yang terlalu besar boleh meningkatkan kerugian tunggal; tetapan titik berhenti yang terlalu kecil mungkin terlalu sensitif dan meningkatkan kebarangkalian berhenti. Di sini perlu mencari keseimbangan antara sasaran keuntungan dan risiko berhenti.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Pilihan kitaran EMA. Anda boleh menguji lebih banyak parameter kitaran EMA untuk mencari kombinasi parameter terbaik.
Parameter ADX boleh dioptimumkan. Siklus ADX dan nilai had ADX boleh mencuba tetapan yang berbeza.
Algoritma Stop Loss boleh diperbaiki, seperti pengenalan Stop Loss Dinamik.
Anda boleh mempertimbangkan untuk menggabungkannya dengan penunjuk lain, seperti KDJ, MACD, dan lain-lain, untuk membentuk strategi pengesahan pelbagai penunjuk.
Strategi pengesanan gegaran silang emas EMA ganda secara keseluruhan adalah strategi yang sangat praktikal. Ia menggabungkan ciri-ciri strategi trend dan gegaran, boleh digunakan untuk pengesanan garis panjang dan boleh digunakan 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()