Strategi Pelacakan Osilasi Crossover EMA Dual

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

img

Gambaran umum

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.

Logika Strategi

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.

Analisis 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.

Analisis Risiko

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.

Arahan Optimasi

Optimasi yang mungkin untuk strategi ini meliputi:

  1. Mencoba lebih banyak periode EMA untuk menemukan kombinasi yang optimal.

  2. Mengoptimalkan parameter ADX termasuk periode ADX dan nilai ambang.

  3. Memperbaiki algoritma profit taking dan stop loss, misalnya dengan memperkenalkan dynamic stops.

  4. Menggabungkan indikator tambahan seperti KDJ dan MACD untuk menciptakan sistem konfirmasi multi-indikator.

Ringkasan

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


Lebih banyak