
Strategi pelacakan tren Heiken Aashi adalah sistem perdagangan komprehensif yang menggabungkan keuntungan dari grafik Heiken Aashi, indikator tren super, dan filter ADX, yang dirancang untuk mengidentifikasi pergerakan tren yang kuat dan melakukan manajemen dana yang efektif. Strategi ini berfokus pada menangkap momentum dalam tren yang telah ditetapkan, sambil menggunakan mekanisme stop loss tiga tingkat yang canggih untuk melindungi dana dan mengunci keuntungan.
Strategi pelacakan tren Haykanush didasarkan pada sinergi dari tiga indikator teknis inti:
Analisis peta Haiken AchimStrategi ini secara khusus berfokus pada “entitas” Heiken Axioms yang hampir tidak memiliki garis bawah, yang menunjukkan harga bergerak tegas ke satu arah, hampir tidak ada penyesuaian, yang mengisyaratkan momentum dan kelanjutan tren yang kuat. Bulu hijau tanpa garis bawah dianggap sebagai sinyal ganda, dan merah tanpa garis atas dianggap sebagai sinyal kosong.
Filter indikator tren superSistem menggunakan indikator supertrend (default factor: 3.0, ATR period: 10) untuk mengkonfirmasi arah tren potensial. Sinyal masuk harus sesuai dengan arah supertrend, yang meningkatkan keandalan sinyal dan mengurangi kesalahan perdagangan.
Filter ADX (opsional): Indeks arah rata-rata digunakan untuk menilai kekuatan tren, perdagangan hanya dipicu ketika ADX melebihi ambang batas yang ditentukan (default: 25), yang membantu memfilter sinyal kebisingan di pasar goyangan atau horizontal.
Sistem perdagangan memiliki aturan masuk dan keluar yang jelas:
Salah satu fitur yang paling menonjol dari strategi ini adalah sistem tiga tingkat stop loss yang inovatif:
Manajemen Risiko BerlapisSistem Stop Loss Tiga Lapisan memberikan perlindungan dana yang komprehensif dan beradaptasi dengan berbagai kondisi pasar dan skenario risiko, yang merupakan keuntungan paling menonjol dari strategi ini.
Sangat mudah beradaptasiSemua komponen (supertrend, ADX) dapat diaktifkan / dimatikan sesuai dengan kondisi pasar yang berbeda, dan parameter dapat disesuaikan, sehingga strategi memiliki fleksibilitas yang tinggi.
Kemampuan untuk menangkap tren yang kuatStrategi ini dapat mengidentifikasi pergerakan tren yang kuat dengan mengkombinasikan sinyal visual yang jelas dari Haykanush, pengakuan supertrend, dan penilaian kekuatan tren dari ADX.
Umpan balik visual yang jelasStrategi menampilkan status posisi, harga masuk, dan tingkat stop loss saat ini di grafik, sehingga trader dapat secara intuitif memahami dan melacak kinerja strategi.
Manajemen dana internalStrategi menggunakan manajemen posisi berdasarkan persentase ekuitas ((default: 3%) yang memastikan bahwa risiko terbuka konsisten dengan perubahan ukuran akun.
Sistem transaksi yang lengkap: Menyediakan proses perdagangan yang lengkap dari sinyal masuk ke aturan keluar, tanpa perlu keputusan atau indikator tambahan.
Risiko over-optimisasiStrategi mengandung beberapa parameter yang dapat disesuaikan, yang dapat menyebabkan masalah kesesuaian kurva, yaitu strategi berkinerja baik pada data historis, tetapi tidak bekerja dengan baik dalam perdagangan real-time. Solusinya adalah dengan menggunakan data historis yang cukup panjang untuk melakukan pengujian ulang dan menguji kehandalan strategi dalam berbagai kondisi pasar.
Risiko pembalikan trenMeskipun memiliki mekanisme stop loss bertingkat, strategi ini mungkin menghadapi kemunduran yang lebih besar jika tren yang kuat tiba-tiba berbalik. Fluktuasi ekstrim yang tiba-tiba di pasar dapat menyebabkan stop loss gagal dipicu pada waktu yang tepat, menyebabkan kerugian lebih besar dari yang diharapkan. Solusi adalah mempertimbangkan untuk meningkatkan filter tingkat fluktuasi atau menerapkan aturan manajemen risiko yang lebih ketat.
Parameter SensitivitasPengaturan parameter yang berbeda dapat menghasilkan hasil yang sangat berbeda, terutama faktor supertrend dan ADX threshold. Ini mengharuskan pedagang untuk memahami secara mendalam dampak dari setiap parameter dan menemukan titik keseimbangan yang sesuai dengan lingkungan pasar tertentu.
Performa buruk dalam lingkungan rendahDalam pasar yang rendah volatilitas atau horizontal, strategi ini dapat menghasilkan beberapa sinyal salah, yang menyebabkan perdagangan “gelincir”. Solusinya adalah menghentikan perdagangan dalam lingkungan seperti itu, atau menambahkan filter lingkungan pasar tambahan.
Manajemen risikoManajemen posisi persentase tetap mungkin tidak cocok untuk semua situasi pasar, dan dalam pasar yang sangat berfluktuasi mungkin perlu mengurangi ukuran posisi untuk mengendalikan risiko.
Meningkatkan fleksibilitas adaptasiStrategi saat ini dapat dioptimalkan lebih lanjut dengan memperkenalkan filter volatilitas, seperti indikator volatilitas historis (HV) atau volatilitas tersirat (IV), untuk menyesuaikan parameter secara otomatis dalam berbagai kondisi pasar. Ini akan memungkinkan strategi untuk mempertahankan kinerja yang stabil selama periode fluktuasi tinggi dan rendah.
Integrasi filter waktuPertimbangkan untuk menambahkan filter berbasis waktu untuk menghindari perdagangan pada periode waktu yang diketahui kurang berfluktuasi atau kurang berorientasi pada tren pasar. Ini sangat berguna untuk perdagangan varietas tertentu, karena varietas yang berbeda menunjukkan karakteristik perilaku yang berbeda pada periode waktu yang berbeda dalam sehari.
Memperkenalkan optimasi pembelajaran mesin: Dapat menggunakan teknologi pembelajaran mesin untuk secara otomatis mengidentifikasi kombinasi parameter terbaik, bukan bergantung pada pengaturan parameter statis. Hal ini dapat dilakukan dengan menganalisis pola dalam data historis untuk memprediksi pengaturan parameter mana yang mungkin akan berkinerja terbaik dalam kondisi pasar tertentu di masa depan.
Menambahkan filter pasar relevanMeningkatkan sinyal masuk dengan mengamati perilaku pasar atau indeks terkait, misalnya mempertimbangkan tren pasar secara keseluruhan atau kekuatan pasar terkait ketika berdagang varietas tertentu.
Optimalkan mekanisme penghentian kerugianSistem tiga-lapisan yang ada saat ini dapat dioptimalkan lebih jauh, misalnya dengan menyesuaikan persentase stop loss asuransi berdasarkan dinamika fluktuasi, atau dengan menggunakan level support/resistance untuk mengatur stop loss dengan tepat pada titik-titik yang bergoyang, bukan pada titik-titik tinggi dan rendah pada periode pengembalian sederhana.
Integrasi analisis volume transaksi: Menambahkan filter volume transaksi dalam proses konfirmasi sinyal, memastikan bahwa pergerakan harga didukung oleh volume transaksi yang cukup, sehingga meningkatkan keandalan sinyal.
Strategi pelacakan tren Haiken Ashe adalah sistem perdagangan yang kompleks dan komprehensif, yang berfokus pada menangkap peluang momentum dalam tren yang kuat melalui kombinasi unik dari grafik Haiken Ashe, indikator supertrend, dan filter ADX. Sistem tiga tingkat stop loss menyediakan manajemen risiko yang komprehensif, sementara pengaturan parameter yang dapat disesuaikan memungkinkan untuk beradaptasi dengan berbagai kondisi pasar.
Keuntungan utama dari strategi ini adalah sinyal visual yang jelas, kemampuan untuk mengidentifikasi tren yang kuat, dan mekanisme perlindungan dana yang komprehensif. Namun, pedagang harus menyadari tantangan optimasi parameter dan potensi keterbatasan dalam lingkungan yang rendah volatilitas.
Strategi ini dapat meningkatkan stabilitas dan adaptasi lebih lanjut dengan mengimplementasikan arah optimasi yang disarankan, seperti menambahkan mekanisme adaptasi volatilitas, mengintegrasikan filter waktu dan analisis volume perdagangan. Akhirnya, strategi pelacakan tren Heikhan Ashi mewakili pendekatan seimbang yang menggabungkan sinyal yang jelas dari analisis teknis dan prinsip manajemen risiko sistematis, memberikan alat yang berharga bagi pedagang yang melacak tren.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-12 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Heiken Ashi Supertrend ADX - Strategy", overlay=true, initial_capital=1000, commission_type=strategy.commission.percent, commission_value=0, calc_on_every_tick=true, process_orders_on_close=false, default_qty_type=strategy.percent_of_equity, default_qty_value=3)
// Supertrend Settings
useSupertrend = input.bool(true, "Use Supertrend for Entries", group="Supertrend Settings")
atrPeriod = input.int(10, "ATR Period", minval=1, group="Supertrend Settings")
factor = input.float(3.0, "Supertrend Factor", minval=0.5, step=0.1, group="Supertrend Settings")
// ADX Filter Settings
useAdxFilter = input.bool(false, "Use ADX Filter", group="ADX Filter")
adxPeriod = input.int(14, "ADX Period", minval=1, group="ADX Filter")
adxThreshold = input.float(25, "ADX Threshold", minval=0, group="ADX Filter")
// Stop Loss Options
useSwingStop = input.bool(false, "Use Swing Point Stop", group="Stop Loss Options")
swingLookback = input.int(3, "Swing Lookback Periods", minval=1, maxval=20, group="Stop Loss Options")
useSafetyNetStop = input.bool(true, "Use Insurance Stop", group="Stop Loss Options")
safetyNetPercent = input.float(5.0, "Insurance Stop Loss Percent", minval=0.1, step=0.1, group="Stop Loss Options")
// Trailing Stop Loss Settings
useTrailingStop = input.bool(true, "Use ATR Trailing Stop", group="Stop Loss Options")
trailAtrMultiplier = input.float(2.0, "Trailing Stop ATR Multiplier", minval=0.1, step=0.1, group="Stop Loss Options")
// Get HA data for signals
ha_security = ticker.heikinashi(syminfo.tickerid)
[o, h, l, c] = request.security(ha_security, timeframe.period, [open, high, low, close])
// Get real price data
real_open = open
real_high = high
real_low = low
real_close = close
// Calculate Supertrend using built-in function with real price data
[supertrend, direction] = ta.supertrend(factor, atrPeriod)
supertrend := barstate.isfirst ? na : supertrend
// Determine if we're in an uptrend or downtrend based on Supertrend
isUptrend = direction < 0 // In TradingView, negative direction means uptrend
isDowntrend = direction > 0 // In TradingView, positive direction means downtrend
// Calculate ATR for visualization
atrValue = ta.atr(atrPeriod)
// Calculate ADX and Trade Logic
[diplus, diminus, adx] = ta.dmi(adxPeriod, adxPeriod)
int trade = 0
if trade == 0 and diplus > diminus
trade := 1
else if trade == 0 and diminus > diplus
trade := -1
else if trade == 1 and diminus > diplus
trade := -1
else if trade == -1 and diplus > diminus
trade := 1
else
trade := trade[1]
// Combine with ADX Threshold
isAdxBullish = diplus > diminus and adx > adxThreshold
isAdxBearish = diminus > diplus and adx > adxThreshold
// Debug ADX Values (only if needed for development)
// plot(adx, "ADX", color=color.orange, linewidth=1)
// plot(diplus, "DI+", color=color.green, linewidth=1)
// plot(diminus, "DI-", color=color.red, linewidth=1)
// hline(adxThreshold, "ADX Threshold", color=color.gray, linestyle=hline.style_dashed)
// Check for wicks on the current candle
threshold = syminfo.mintick * 0.1
noBottomWick = math.abs(math.min(o, c) - l) <= threshold
noTopWick = math.abs(h - math.max(o, c)) <= threshold
// Identify candle color and signal conditions
isGreenCandle = c > o
isRedCandle = c < o
// KEY INTEGRATION: Color the real bars based on HA trend
bullishColor = color.green // Green for long/bullish
bearishColor = color.purple // Purple for short/bearish
barcolor(isGreenCandle ? bullishColor : bearishColor)
// Signal conditions for both entry and exit
longCondition = (isGreenCandle and noBottomWick and barstate.isconfirmed) and (not useSupertrend or isUptrend) and (not useAdxFilter or isAdxBullish)
shortCondition = (isRedCandle and noTopWick and barstate.isconfirmed) and (not useSupertrend or isDowntrend) and (not useAdxFilter or isAdxBearish)
exitLongCondition = isRedCandle and noTopWick and barstate.isconfirmed
exitShortCondition = isGreenCandle and noBottomWick and barstate.isconfirmed
// Calculate swing points based on real candles (not HA)
swingLow = ta.lowest(real_low, swingLookback)
swingHigh = ta.highest(real_high, swingLookback)
// Position tracking
var int position = 0 // 0 = no position, 1 = long, -1 = short
var float entryPrice = na
var float trailStopLevel = na // For ATR trailing stop
var float swingStopLevel = na // For swing point stop
var float safetyNetStopLevel = na // For safety net stop
var float highestSinceEntry = na // For tracking highest price since entry (for long positions)
var float lowestSinceEntry = na // For tracking lowest price since entry (for short positions)
// Alert variables
var bool longAlert = false
var bool shortAlert = false
var bool exitLongAlert = false
var bool exitShortAlert = false
// Reset alerts each bar
longAlert := false
shortAlert := false
exitLongAlert := false
exitShortAlert := false
// Handle entries and exits
if longCondition and (position <= 0)
if position < 0
exitShortAlert := true
strategy.close("Short", comment="Exit Short")
position := 0
longAlert := true
strategy.entry("Long", strategy.long, comment="Enter Long")
position := 1
entryPrice := real_close
highestSinceEntry := real_close
lowestSinceEntry := na
// Initialize trailing stops
if useTrailingStop
trailStopLevel := real_close - (atrValue * trailAtrMultiplier)
// Initialize swing point stop
if useSwingStop
swingStopLevel := swingLow
// Initialize safety net stop
if useSafetyNetStop
safetyNetStopLevel := real_close * (1 - safetyNetPercent / 100)
if shortCondition and (position >= 0)
if position > 0
exitLongAlert := true
strategy.close("Long", comment="Exit Long")
position := 0
shortAlert := true
strategy.entry("Short", strategy.short, comment="Enter Short")
position := -1
entryPrice := real_close
highestSinceEntry := na
lowestSinceEntry := real_close
// Initialize trailing stops
if useTrailingStop
trailStopLevel := real_close + (atrValue * trailAtrMultiplier)
// Initialize swing point stop
if useSwingStop
swingStopLevel := swingHigh
// Initialize safety net stop
if useSafetyNetStop
safetyNetStopLevel := real_close * (1 + safetyNetPercent / 100)
if position > 0 and exitLongCondition
exitLongAlert := true
strategy.close("Long", comment="Exit Long Signal")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
if position < 0 and exitShortCondition
exitShortAlert := true
strategy.close("Short", comment="Exit Short Signal")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Check for swing point stop hit
if useSwingStop and position != 0 and not na(swingStopLevel)
// For long positions, check if price drops below the swing low
if position > 0 and real_low <= swingStopLevel
strategy.close("Long", comment="Swing Point Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
// For short positions, check if price rises above the swing high
else if position < 0 and real_high >= swingStopLevel
strategy.close("Short", comment="Swing Point Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Check for safety net stop loss hit
if useSafetyNetStop and position != 0 and not na(safetyNetStopLevel)
// For long positions, check if price drops below the safety net level
if position > 0 and real_low <= safetyNetStopLevel
strategy.close("Long", comment="Safety Net Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
// For short positions, check if price rises above the safety net level
else if position < 0 and real_high >= safetyNetStopLevel
strategy.close("Short", comment="Safety Net Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Track highest/lowest prices for trailing stop calculation
if position > 0 and not na(highestSinceEntry)
highestSinceEntry := math.max(highestSinceEntry, real_high)
if position < 0 and not na(lowestSinceEntry)
lowestSinceEntry := math.min(lowestSinceEntry, real_low)
// Update and check trailing stop (ATR-based)
if useTrailingStop and position != 0 and not na(trailStopLevel)
// Update trailing stop level for long positions
if position > 0
// Calculate new potential trailing stop level
trailStopNew = real_close - (atrValue * trailAtrMultiplier)
// Only move the stop up, never down
if trailStopNew > trailStopLevel
trailStopLevel := trailStopNew
// Check if price hit stop
if real_low <= trailStopLevel
strategy.close("Long", comment="ATR Trailing Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
highestSinceEntry := na
// Update trailing stop level for short positions
else if position < 0
// Calculate new potential trailing stop level
trailStopNew = real_close + (atrValue * trailAtrMultiplier)
// Only move the stop down, never up
if trailStopNew < trailStopLevel
trailStopLevel := trailStopNew
// Check if price hit stop
if real_high >= trailStopLevel
strategy.close("Short", comment="ATR Trailing Stop Hit")
position := 0
trailStopLevel := na
swingStopLevel := na
safetyNetStopLevel := na
lowestSinceEntry := na
// Plot stop loss levels
plot(useTrailingStop and position != 0 ? trailStopLevel : na, "ATR Trailing Stop", color=color.yellow, style=plot.style_linebr, linewidth=1)
plot(useSwingStop and position != 0 ? swingStopLevel : na, "Swing Point Stop", color=color.red, style=plot.style_circles, linewidth=2)
plot(useSafetyNetStop and position != 0 ? safetyNetStopLevel : na, "Insurance Stop", color=color.yellow, style=plot.style_circles, linewidth=1)
// Visual signals for chart (just entry/exit markers, no ADX labels)
plotshape(longAlert, title="Long Entry", location=location.abovebar, color=bullishColor, style=shape.triangleup, size=size.small)
plotshape(shortAlert, title="Short Entry", location=location.belowbar, color=bearishColor, style=shape.triangledown, size=size.small)
plotshape(exitLongAlert, title="Long Exit Signal", location=location.abovebar, color=bullishColor, style=shape.xcross, size=size.small)
plotshape(exitShortAlert, title="Short Exit Signal", location=location.belowbar, color=bearishColor, style=shape.xcross, size=size.small)
// Supertrend visualization
bodyMiddlePlot = plot((real_open + real_close) / 2, "Body Middle", display=display.none)
upTrend = plot(useSupertrend and isUptrend ? supertrend : na, "Up Trend", color=bullishColor, style=plot.style_linebr, linewidth=1)
downTrend = plot(useSupertrend and isDowntrend ? supertrend : na, "Down Trend", color=bearishColor, style=plot.style_linebr, linewidth=1)
fill(upTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bullishColor, 85) : na, title="Uptrend Background")
fill(downTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bearishColor, 85) : na, title="Downtrend Background")
// Position background
bgcolor(position == 1 ? color.new(bullishColor, 85) : position == -1 ? color.new(bearishColor, 85) : na, title="Position Background")
// Position label
var label positionLabel = na
label.delete(positionLabel)
if barstate.islast
positionText = position == 1 ? "LONG" : position == -1 ? "SHORT" : "FLAT"
entryInfo = not na(entryPrice) ? "\nEntry: " + str.tostring(entryPrice, "#.00000") : ""
atrStopInfo = useTrailingStop and not na(trailStopLevel) ? "\nATR Stop: " + str.tostring(trailStopLevel, "#.00000") + " (" + str.tostring(trailAtrMultiplier, "#.0") + "x ATR)" : ""
swingStopInfo = useSwingStop and not na(swingStopLevel) ? "\nSwing Stop: " + str.tostring(swingStopLevel, "#.00000") + " (" + str.tostring(swingLookback) + " bars)" : ""
safetyNetInfo = useSafetyNetStop and not na(safetyNetStopLevel) ? "\nInsurance Stop: " + str.tostring(safetyNetStopLevel, "#.00000") + " (" + str.tostring(safetyNetPercent, "#.0") + "%)" : ""
supertrendInfo = useSupertrend ? "\nSupertrend: " + (isUptrend ? "UPTREND" : "DOWNTREND") : ""
positionColor = position == 1 ? bullishColor : position == -1 ? bearishColor : color.gray
positionLabel := label.new(bar_index, high, positionText + entryInfo + atrStopInfo + swingStopInfo + safetyNetInfo + supertrendInfo, color=positionColor, style=label.style_label_down, textcolor=color.white)