Tren Crossover EMA Dual Mengikuti Strategi dengan Filter ATR dan ADX

Penulis:ChaoZhang, Tanggal: 2023-11-15 15:53:57
Tag:

img

Gambaran umum

Strategi ini menggunakan sistem crossover EMA ganda klasik untuk mengikuti tren, dengan filter tambahan dari indikator ATR dan ADX, untuk melacak tren yang kuat dan mengendalikan risiko selama konsolidasi.

Logika Strategi

Strategi ini terutama didasarkan pada hal berikut:

  1. Gunakan EMA 8 periode yang lebih cepat dan EMA 20 periode yang lebih lambat untuk menghasilkan sinyal silang.

  2. Indikator ATR mencerminkan volatilitas baru-baru ini. Normalisasi ATR memungkinkan penyesuaian dinamis dari kondisi filter silang EMA, menurunkan persyaratan selama tren yang kuat dan menaikkan selama konsolidasi untuk mengendalikan risiko.

  3. Indikator ADX menentukan kekuatan tren. Pembacaan ADX di atas 30 menunjukkan tren yang kuat, mendorong stop loss yang tepat waktu.

  4. Bergabung dengan tren bull/bear untuk menentukan waktu masuk panjang/pendek. Pergi panjang pada golden crosses di pasar bull, dan pendek pada death crosses di pasar bear.

  5. Filter volume untuk masuk saat volume berkembang.

  6. Gunakan indeks USD sederhana untuk menentukan kekuatan USD, memperluas stop dan mengambil kisaran keuntungan selama USD yang kuat.

  7. Gunakan indikator SuperTrend untuk menentukan arah pasar secara keseluruhan untuk bantuan jangka panjang/pendek tambahan.

Strategi ini menggabungkan indikator tren dan osilasi untuk menyesuaikan parameter secara dinamis, melacak tren sambil mengendalikan risiko.

Keuntungan dari Strategi

  1. Sistem EMA ganda menyediakan penentuan tren, dengan kelancaran EMA menyaring pemutusan palsu.

  2. Filter ATR-normalized memungkinkan fleksibilitas untuk lingkungan pasar yang berbeda.

  3. ADX dan volume menyediakan pemeriksaan tambahan untuk menghindari masalah selama konsolidasi.

  4. Mempertimbangkan USD dan SuperTrend meningkatkan akurasi keputusan pada tren makro.

  5. Manajemen risiko secara otomatis beradaptasi berdasarkan kekuatan USD.

  6. Sinyal silang emas / mati yang sederhana dan logika stop / take profit membuatnya mudah diterapkan dan diuji kembali.

Risiko dari Strategi

  1. EMA ganda tertinggal dalam mendeteksi titik balik tren.

  2. Pemilihan parameter ATR yang buruk mungkin terlalu agresif atau konservatif.

  3. Parameter ADX perlu dioptimalkan, titik tinggi yang tidak tepat bisa melewatkan tren.

  4. Penentuan tren USD dan SuperTrend mungkin tidak akurat.

  5. Stop loss terlalu ketat meningkatkan kerugian, terlalu luas risiko whipsaws.

Ide-ide Peningkatan

  1. Pertimbangkan untuk menambahkan indikator seperti MACD untuk deteksi titik perputaran yang lebih baik.

  2. Mengoptimalkan parameter ATR lebih dari data historis.

  3. Uji parameter ADX yang berbeda dan optimalkan ambang titik tinggi.

  4. Tambahkan lebih banyak variabel untuk analisis USD dan tren pasar.

  5. Hitung persentase stop loss optimal dari statistik backtest.

  6. Eksperimen dengan trailing atau lampu gantung berhenti.

  7. Lanjutkan mengoptimalkan ukuran entri dan periode penyimpanan.

Kesimpulan

Strategi ini mengintegrasikan sistem EMA ganda klasik dengan beberapa indikator tambahan, menggunakan optimasi parameter untuk pendekatan trend berikut yang cukup kuat. Ini beradaptasi secara fleksibel dengan perubahan lingkungan pasar, melacak tren sambil mengendalikan risiko. pengujian lebih lanjut dan optimasi stop dan parameter indikator akan meningkatkan hasil.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Refactored Advanced EMA Cross with Normalized ATR Filter, Controlling ADX", shorttitle="ALP V5", overlay=true)

// Initialize variables to track if a buy order has been placed and number of periods since the last buy
var bool hasBought = false
var int barCountSinceBuy = 0

// Define EMA periods
emaShort = ta.ema(close, 8)
emaLong = ta.ema(close, 20)

// Define ATR period and normalization
atrLength = 14
atrValue = ta.atr(atrLength)
maxHistoricalATR = ta.highest(atrValue, 20)
minHistoricalATR = ta.lowest(atrValue, 20)
normalizedATR = (atrValue - minHistoricalATR) / (maxHistoricalATR - minHistoricalATR)

// Define ADX parameters
adxValue = ta.rma(close, 14)
adxHighLevel = 30
isADXHigh = adxValue > adxHighLevel

// Initialize risk management variables
var float stopLossPercent = na
var float takeProfitPercent = na
var float trailingStop = na

// Calculate USD strength (simplified)
usd_strength = close / ta.ema(close, 50) - 1

// Adjust risk parameters based on USD strength
if (usd_strength > 0)
    stopLossPercent := 3
    takeProfitPercent := 6
else
    stopLossPercent := 4
    takeProfitPercent := 8

// Initialize position variable
var float positionPrice = na

// Volume filter
minVolume = ta.sma(volume, 14) * 1.5
isVolumeHigh = volume > minVolume



// Piyasa yönü için süper trend göstergesi
[supertrendValue, supertrendDirection] = ta.supertrend(4, 14)  // Use a factor of 3 and ATR period of 10
bool isBullMarket = supertrendDirection < 0
bool isBearMarket = supertrendDirection > 0

// Yükselen piyasa için alım koşulu
buyConditionBull = isBullMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.2
// Düşen piyasa için alım koşulu
buyConditionBear = isBearMarket and ta.crossover(emaShort, emaLong) and normalizedATR > 0.5
// Genel alım koşulu
buyCondition = buyConditionBull or buyConditionBear

// Yükselen ve düşen piyasalar için farklı satış koşulları
sellConditionBull = isBullMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh)
sellConditionBear = isBearMarket and (ta.crossunder(emaShort, emaLong) or isADXHigh)
// Genel satış koşulu
sellCondition = sellConditionBull or sellConditionBear


// Buy condition
if (buyCondition)
    strategy.entry("Buy", strategy.long)
    positionPrice := close
    hasBought := true // Set the flag to true when a buy order is placed
    barCountSinceBuy := 0 // Reset the bar counter when a buy order is placed

// Increase the bar counter if a buy has been executed
if (hasBought)
    barCountSinceBuy := barCountSinceBuy + 1

// Calculate stop-loss and take-profit levels
longStopLoss = positionPrice * (1 - stopLossPercent / 100)
longTakeProfit = positionPrice * (1 + takeProfitPercent / 100)


// Final Sell condition, now also checks if a buy has occurred before and if at least 5 periods have passed
finalSellCondition = sellCondition and hasBought and barCountSinceBuy >= 3 and isVolumeHigh

if (finalSellCondition)
    strategy.close("Buy")
    positionPrice := na
    hasBought := false // Reset the flag when a sell order is placed
    barCountSinceBuy := 0 // Reset the bar counter when a buy order is closed

// Implement stop-loss, take-profit, and trailing stop
strategy.exit("Stop Loss", "Buy", stop=longStopLoss)
strategy.exit("Take Profit", "Buy", limit=longTakeProfit)
//strategy.exit("Trailing Stop", "Buy", trail_price=close, trail_offset=trailingStop * close / 100)


var label l = na

if (buyCondition)
    l := label.new(bar_index, high, text="buy triggered " + str.tostring(usd_strength))
    label.delete(l[1])

if (finalSellCondition)
    l := label.new(bar_index, high, text="sell triggered " + str.tostring(usd_strength))
    label.delete(l[1])

// Plot signals
plotshape(series=buyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy")
plotshape(series=finalSellCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")


Lebih banyak