Strategy Pengesanan Osilasi Silang EMA Berganda

Penulis:ChaoZhang, Tarikh: 2024-01-03 11:38:51
Tag:

img

Ringkasan

Strategi Pengesanan Osilasi Silang EMA Berganda adalah strategi yang mengenal pasti trend menggunakan penunjuk EMA dan mengesan osilasi semasa keadaan pasaran yang tidak menentu. Strategi ini menggabungkan kedua-dua konsep pengesanan trend dan penangkapan osilasi.

Logika Strategi

Strategi ini menggunakan EMA 20 tempoh sebagai penunjuk untuk menilai trend. Apabila harga melintasi di atas EMA, ia menandakan trend menaik, dan apabila harga melintasi di bawah, ia menandakan trend menurun.

Apabila harga melintasi di atas EMA, kedudukan panjang dimasukkan menggunakan harga tertinggi dalam tempoh 20 tempoh terakhir sebagai mengambil keuntungan dan terendah sejak persilangan sebagai stop loss. Apabila harga melintasi di bawah EMA, kedudukan pendek dimasukkan menggunakan harga terendah dalam tempoh 20 tempoh terakhir sebagai mengambil keuntungan dan tertinggi sejak persilangan sebagai stop loss.

Pada masa yang sama, strategi ini juga memeriksa sama ada ADX di atas 30. Dagangan hanya diambil apabila trend cukup kuat, iaitu apabila ADX lebih tinggi daripada 30.

Semasa perdagangan terbuka, penangguhan penangguhan terus menyesuaikan berdasarkan keadaan pasaran untuk mengunci lebih banyak keuntungan.

Analisis Kelebihan

Strategi ini menggabungkan kelebihan kedua-dua trend tracking dan oscillation trading. Ia boleh menghasilkan pulangan yang lebih tinggi semasa pasaran trend dan pulangan yang lebih konsisten semasa oscillasi.

Penggunaan EMA juga mengekalkan parameter yang mudah, mengurangkan risiko terlalu optimum dan memastikan kestabilan.

Analisis Risiko

Risiko utama strategi ini adalah kemungkinan berhenti yang lebih kerap semasa turun naik yang intensif. Di sinilah ADX bermain. Dengan melumpuhkan perdagangan apabila ADX rendah, kerugian dalam ketiadaan trend yang jelas dapat dielakkan.

Selain itu, penempatan stop loss yang betul juga penting. Hentian yang terlalu luas boleh meningkatkan jumlah kerugian perdagangan tunggal. Hentian yang terlalu ketat mungkin terlalu sensitif dan meningkatkan kebarangkalian berhenti. Keseimbangan perlu dijumpai antara sasaran keuntungan dan risiko kehilangan berhenti.

Arahan pengoptimuman

Kemungkinan pengoptimuman untuk strategi ini termasuk:

  1. Uji lebih banyak tempoh EMA untuk mencari kombinasi yang optimum.

  2. Mengoptimumkan parameter ADX termasuk tempoh ADX dan nilai ambang.

  3. Memperbaiki algoritma mengambil keuntungan dan menghentikan kerugian, contohnya dengan memperkenalkan berhenti dinamik.

  4. Menggabungkan penunjuk tambahan seperti KDJ dan MACD untuk mewujudkan sistem pengesahan pelbagai penunjuk.

Ringkasan

Ringkasnya, strategi Pelacakan Osilasi Silang EMA Berganda adalah strategi yang sangat praktikal. Ia menggabungkan kekuatan kedua-dua strategi perdagangan trend dan strategi osilasi. Ia boleh digunakan untuk pelacakan jangka panjang dan perdagangan jangka pendek. Peningkatan prestasi yang lebih lanjut dapat dicapai melalui pengoptimuman parameter dan penambahan penanda pengesahan. Ia sesuai untuk pelabur dengan beberapa tahap keupayaan analisis mengenai keadaan pasaran.


/*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()


Lebih lanjut