
ハイケンアッシュトレンドトラッキング戦略は,ハイケンアッシュグラフ,スーパートレンド指標,平均方向性指数 (ADX) フィルターの優位性を組み合わせた総合的な取引システムで,強いトレンドの動きを識別し,効果的な資金管理を行うことを目的としています. この戦略は,確立されたトレンドの動力を捕捉することに焦点を当てており,先端の3層の止損機構を使用して,資金を保護し,利益をロックします.
ハイケンアッシュのトレンドトラッキング戦略は,3つの核心技術指標の協同作用に基づいています.
ハイケン・アヒルトの地図分析この戦略は,特に,上下影線がほとんどない”実体”ハイケン・アシフに注目しています. これらのは,価格が1方向に断続的に移動し,強烈な動力とトレンドの継続を暗示するほとんど反動しないことを示しています. 下下影線のない緑のは多信号とみなされ,上下影線のない赤のは空信号とみなされます.
超トレンド指標のフィルターシステムでは超トレンド指標 ((デフォルト因数:3.0,ATR周期:10) を使って潜在的トレンド方向を確認する.入場信号は超トレンド方向と一致しなければならない.これは信号の信頼性を高め,誤った取引を減らす.
ADXフィルター (選択可能)平均方向性指数は,トレンドの強さを評価するために使用され,取引はADXが指定された値 (>デフォルト:25) を超える場合にのみトリガーされ,これは震動または横軸市場のノイズ信号をフィルターするのに役立ちます.
取引システムには明確な入場・出場ルールがあります.
この戦略の最も顕著な特徴は,革新的な3層のストップダメージシステムである.
多層リスク管理三層のストップシステムは,さまざまな市場条件とリスクシナリオに適応して,資金の全面的な保護を提供します.これは,この戦略の最も顕著な利点です.
適応性が高い: すべてのコンポーネント ((スーパートレンド,ADX) は,異なる市場条件に応じてオン/オフされ,パラメータも調整され,戦略が高度な柔軟性を持つことができます.
強力なトレンドキャプターハイケン・アヒヤの明確な視覚信号,スーパートレンドの確認,ADXのトレンド強さの評価を組み合わせることで,この戦略は強いトレンドの動きを効果的に識別できます.
明確な視覚的フィードバック: 戦略は,位置状態,入場価格,現在のストップロスのレベルをグラフで表示し,トレーダーに戦略の実行を直観的に理解し,追跡できるようにする.
内部資金管理: 戦略は,利権比率に基づいたポジション管理方法 ((デフォルト:3%) を採用しており,これは,口座のサイズが変化するにつれて,リスクの隙間が一貫していることを保証している.
完全な取引システム: 入場シグナルから出場ルールの完全な取引プロセスを提供し,追加の決定や指標を必要としません.
リスクの過剰最適化策略には複数の調整可能なパラメータが含まれているため,曲線適合の問題が生じることがあります.つまり,戦略は歴史的なデータで良好なパフォーマンスを発揮しますが,リアルタイム取引では不適切です. 解決策は,十分な長い歴史的データを使用して,バックテストを行い,異なる市場条件下で戦略の安定性をテストすることです.
トレンド反転リスク: 多層のストップメカニズムがあるにもかかわらず,この戦略は,強いトレンドが突然反転したときに大きな引き戻しに直面する可能性があります. 市場の急激な極端な変動は,ストップを間に合うようにトリガーできず,予想以上の損失を引き起こす可能性があります. 解決策は,波動率フィルターを追加するか,より厳しいリスク管理ルールを導入することを検討することです.
パラメータ感度異なるパラメータの設定は,特に超トレンド因子とADXの値では,非常に異なる結果をもたらす可能性があります.これは,トレーダーが各パラメータの影響を深く理解し,特定の市場環境に適したバランスポイントを見つけることを要求します.
低波動環境では不十分です: 低波動性または横断的な市場では,この戦略は複数の誤信号を生じ, ““取引を引き起こす可能性があります. 解決策は,このような環境で取引を一時停止するか,または追加の市場環境フィルターを追加することです.
資金管理のリスク: 固定パーセントのポジション管理は,すべての市場環境には適さない可能性があり,高度に変動する市場では,リスクを制御するためにポジションのサイズを減らす必要がある可能性があります.
波動性への適応の強化:現在の戦略は,歴史的な変動率 ((HV) または暗示的な変動率 ((IV) の指標のような波動性フィルターを導入することによってさらに最適化することができ,異なる市場環境でパラメータを自動的に調整できます.これは,戦略が高波動性および低波動性の両方の期間で安定したパフォーマンスを維持できるようにします.
タイムフィルターを統合する:時間ベースのフィルターを追加することを検討し,波動が低いまたは市場傾向が弱い時間帯での取引を避ける.これは,異なる品種が1日の異なる時間帯で異なる行動特性を表すため,特定の品種を取引する際に特に有用である.
機械学習の最適化について: 静的なパラメータ設定に依存するのではなく,機械学習技術を使用して最適のパラメータセットを自動的に識別できます.これは,過去のデータ内のパターンを分析して,将来の特定の市場条件下でどのパラメータ設定が最適であるかを予測することができます.
関連市場のフィルターを追加: 関連市場や指数の行動を観察することで入場シグナルを強化します.例えば,特定の品種を取引する際に,全体的な市場の傾向や関連市場の強さを考慮します.
損失防止の最適化:現在の3層のストップシステムは,変動的な動向に基づいて保険のストップパーセンテージを調整したり,サポート/レジスタンスレベルを使用して,単純な回顧期の高低のポイントではなく,揺動するストップポイントを正確に設定したりなど,さらに最適化することができます.
統合された取引量分析: 信号確認の過程で取引量フィルターを追加し,価格動向が十分な取引量でサポートされていることを確認し,信号の信頼性を向上させる.
ハイケンアッシュトレンドトラッキング戦略は,ハイケンアッシュチャート,スーパートレンド指標,ADXフィルターのユニークな組み合わせによって,強力なトレンド中の動力の機会を捕捉することに焦点を当てた複雑で包括的な取引システムです.その3層のストップ・ローズシステムは,総合的なリスク管理を提供し,そのカスタマイズ可能なパラメータ設定は,さまざまな市場条件に適応できるようにします.
この戦略の主な利点は,明確な視覚信号,強力なトレンド認識能力,そして完全な資金保護メカニズムである.しかし,トレーダーは,パラメータの最適化の課題と,低波動性のある環境での潜在的な制限を認識する必要があります.
この戦略は,波動性適応機構の追加,時間フィルターと取引量分析の統合などの推奨の最適化方向を実行することにより,その安定性と適応性をさらに強化することができます.最終的に,ハイケンアッシュのトレンド追跡戦略は,テクニカル分析の明確なシグナルと体系的なリスク管理の原則を組み合わせたバランスの取れたアプローチを代表し,トレンド追跡トレーダーに価値あるツールを提供します.
/*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)