Trend Crossover EMA Dual Mengikut Strategi dengan Penapis ATR dan ADX

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

img

Ringkasan

Strategi ini menggunakan sistem crossover EMA berganda klasik untuk mengikuti trend, dengan penapis tambahan dari penunjuk ATR dan ADX, untuk mengesan trend yang kuat dan mengawal risiko semasa penyatuan.

Logika Strategi

Strategi ini terutamanya berdasarkan perkara berikut:

  1. Menggunakan EMA 8 tempoh yang lebih cepat dan EMA 20 tempoh yang lebih perlahan untuk menjana isyarat silang.

  2. Indikator ATR mencerminkan turun naik baru-baru ini. Normalisasi ATR membolehkan penyesuaian dinamik keadaan penapis silang EMA, menurunkan keperluan semasa trend yang kuat dan menaikkan semasa penyatuan untuk mengawal risiko.

  3. Indikator ADX menentukan kekuatan trend. bacaan ADX di atas 30 menunjukkan trend yang kuat, mendorong stop loss tepat pada masanya.

  4. Gabungkan dengan trend bull/bear untuk menentukan masa masuk panjang/pendek. Pergi panjang pada salib emas dalam pasaran lembu, dan pendek pada salib kematian dalam pasaran beruang.

  5. Penapis jumlah untuk masuk apabila jumlah meluas.

  6. Gunakan indeks USD yang mudah untuk menentukan kekuatan USD, meluaskan julat berhenti dan mengambil keuntungan semasa USD yang kuat.

  7. Gunakan penunjuk SuperTrend untuk menentukan arah pasaran keseluruhan untuk bantuan jangka panjang / jangka pendek tambahan.

Strategi ini menggabungkan penunjuk trend dan turun naik untuk menyesuaikan parameter secara dinamik, mengesan trend sambil mengawal risiko.

Kelebihan Strategi

  1. Sistem EMA berganda menyediakan penentuan trend, dengan kelancaran EMA menapis pecah palsu.

  2. Penapis yang dipernormalizasikan oleh ATR membolehkan fleksibiliti untuk persekitaran pasaran yang berbeza.

  3. ADX dan jumlah menyediakan pemeriksaan tambahan untuk mengelakkan whipsaws semasa penyatuan.

  4. Mempertimbangkan USD dan SuperTrend meningkatkan ketepatan keputusan mengenai trend makro.

  5. Pengurusan risiko menyesuaikan diri secara automatik berdasarkan kekuatan USD.

  6. Isyarat silang emas / mati yang mudah dan logik berhenti / mengambil keuntungan memudahkan pelaksanaan dan uji balik.

Risiko Strategi

  1. EMA berganda lambat dalam mengesan titik perubahan trend.

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

  3. Parameter ADX perlu dioptimumkan, titik tinggi yang tidak betul boleh terlepas trend.

  4. Penentuan trend USD dan SuperTrend mungkin tidak tepat.

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

Idea Peningkatan

  1. Pertimbangkan untuk menambah penunjuk seperti MACD untuk pengesanan titik perolehan yang lebih baik.

  2. Mengoptimumkan parameter ATR ke atas data sejarah.

  3. Uji parameter ADX yang berbeza dan optimumkan ambang titik tinggi.

  4. Tambah lebih banyak pembolehubah untuk analisis trend USD dan pasaran.

  5. Mengira peratusan stop loss optimum dari statistik backtest.

  6. Bereksperimen dengan penghentian belakang atau candelier.

  7. Teruskan mengoptimumkan saiz kemasukan dan tempoh penyimpanan.

Kesimpulan

Strategi ini mengintegrasikan sistem EMA berganda klasik dengan beberapa penunjuk tambahan, menggunakan pengoptimuman parameter untuk pendekatan trend yang cukup kukuh. Ia menyesuaikan diri dengan fleksibel dengan perubahan persekitaran pasaran, mengesan trend sambil mengawal risiko. Pengujian dan pengoptimuman lebih lanjut berhenti dan parameter penunjuk akan meningkatkan hasil. Konsep-konsep yang patut dipelajari dan diperbaiki.


/*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 lanjut