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.
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.
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.
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.
Kemungkinan pengoptimuman untuk strategi ini termasuk:
Uji lebih banyak tempoh EMA untuk mencari kombinasi yang optimum.
Mengoptimumkan parameter ADX termasuk tempoh ADX dan nilai ambang.
Memperbaiki algoritma mengambil keuntungan dan menghentikan kerugian, contohnya dengan memperkenalkan berhenti dinamik.
Menggabungkan penunjuk tambahan seperti KDJ dan MACD untuk mewujudkan sistem pengesahan pelbagai penunjuk.
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()