Strategi Pelacakan Osilasi Silang EMA Ganda adalah strategi yang mengidentifikasi tren menggunakan indikator EMA dan melacak osilasi selama kondisi pasar yang tidak stabil. Strategi ini menggabungkan konsep pelacakan tren dan penangkapan osilasi.
Strategi ini menggunakan EMA 20 periode sebagai indikator untuk menilai tren. Ketika harga melintasi di atas EMA, itu menandakan tren naik, dan ketika harga melintasi di bawah, itu menandakan tren turun.
Ketika harga melintasi EMA, posisi panjang dimasukkan dengan menggunakan harga tertinggi selama 20 periode terakhir sebagai take profit dan terendah sejak crossover sebagai stop loss.
Pada saat yang sama, strategi ini juga memeriksa apakah ADX di atas 30. Perdagangan hanya dilakukan ketika tren cukup kuat, yaitu ketika ADX lebih tinggi dari 30.
Selama perdagangan terbuka, trailing stop terus menyesuaikan berdasarkan kondisi pasar untuk mengunci lebih banyak keuntungan.
Strategi ini menggabungkan keuntungan dari kedua pelacakan tren dan perdagangan osilasi. Ini dapat menghasilkan pengembalian yang lebih tinggi selama pasar tren dan pengembalian yang lebih konsisten selama osilasi.
Penggunaan EMA juga membuat parameter tetap sederhana, mengurangi risiko optimasi berlebihan dan memastikan stabilitas.
Risiko utama dari strategi ini adalah kemungkinan stop out yang lebih sering selama osilasi yang intensif. Di sinilah ADX mulai bermain. Dengan menonaktifkan perdagangan ketika ADX rendah, kerugian dapat dihindari jika tidak ada tren yang jelas.
Selain itu, penempatan stop loss yang tepat juga penting. Stop yang terlalu luas dapat meningkatkan jumlah kerugian perdagangan tunggal. Stop yang terlalu ketat mungkin terlalu sensitif dan meningkatkan probabilitas stop out. Keseimbangan perlu ditemukan antara target keuntungan dan risiko stop loss.
Optimasi yang mungkin untuk strategi ini meliputi:
Mencoba lebih banyak periode EMA untuk menemukan kombinasi yang optimal.
Mengoptimalkan parameter ADX termasuk periode ADX dan nilai ambang.
Memperbaiki algoritma profit taking dan stop loss, misalnya dengan memperkenalkan dynamic stops.
Menggabungkan indikator tambahan seperti KDJ dan MACD untuk menciptakan sistem konfirmasi multi-indikator.
Singkatnya, strategi Pelacakan Osilasi Silang EMA Ganda adalah strategi yang sangat praktis. Ini menggabungkan kekuatan dari kedua strategi perdagangan tren dan strategi osilasi. Ini dapat digunakan untuk pelacakan jangka panjang dan perdagangan jangka pendek. Peningkatan kinerja lebih lanjut dapat dicapai melalui optimasi parameter dan penambahan indikator konfirmasi. Ini cocok bagi investor dengan beberapa tingkat kemampuan analitis mengenai kondisi pasar.
/*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()