ボラティリティ適応型Heiken Asch ATRトレーリングストップトレンド取引戦略

ATR EMA HEIKIN ASHI Trailing Stop TREND FOLLOWING volatility STOP LOSS
作成日: 2025-08-18 17:33:13 最終変更日: 2025-08-18 17:33:13
コピー: 0 クリック数: 283
2
フォロー
319
フォロワー

ボラティリティ適応型Heiken Asch ATRトレーリングストップトレンド取引戦略 ボラティリティ適応型Heiken Asch ATRトレーリングストップトレンド取引戦略

概要

波動率自主適応ハイケンアッシュATRトラッキングストップトレンド取引戦略は,金融市場のトレンドの識別とリスク管理のために設計された体系化された取引方法である.この戦略は,ハイケンアッシュ (Heikin Ashi) グラフィックス技術に基づいて,市場ノイズをフィルターし,平均リアル波幅 (ATR) の動的調整によるトラッキングストップシステムと組み合わせ,指数移動平均線 (EMA) の交差によって取引信号を生成する.この戦略は,多頭取引のみを実行し,波動率調整の構成要素を使用して信号の安定性と取引管理を強化する.この戦略は,暗号通貨などの高波動市場に特に適しており,体系化されたトレンド追跡を追求するトレーダーにも適しています.

戦略原則

この戦略の核心は,いくつかの重要な技術要素の協働に基づいています.

  1. ハイケーン・アヒルトのフィルター策略は,3つの異なるハイケンアッシュ計算モードを提供する: ((手動計算,TradingViewの内蔵関数と通常の図) 市場短期的な騒音を軽減し,潜在的なトレンドの方向を強調する. 手動計算モードは最も透明で信頼できる結果を提供し,内蔵関数は,確認された歴史柱を使用し,重塗り絵を防ぐ.

  2. ATRの追跡停止メカニズム平均リアル波幅 (ATR) は,市場変動のダイナミックな測定指標として,ユーザー定義のパラメータ (キー値とATR周期) と組み合わせて,ストップトラッキングの感度を校正し,異なる市場変動の環境に適応できるようにする.このメカニズムは,動的脱出点を提供し,トレンドの進行中に資金を保護し,利益をロックすることを目的としています.

  3. EMA交差信号生成: 入場と出場のシグナルは,ハイケンアッシュ価格とインデックス移動平均 ((EMA)) の間の相互作用によって導かれる.この2つの構成要素の間の交差イベントは,潜在的な多頭入場または出場シグナルを発する動量転換を客観的に識別するために使用される.

  4. 厳格な停止の実施戦略には,入場価格のパーセントまたは固定点偏差として設定できる選択可能なストップ機能が含まれています.重要なことに,ストップは,合成のハイケンアッシュ値ではなく,実際の市場価格に基づいて実行され,実際の市場流動性と価格レベルに基づいてリスク管理を保証します.

  5. 回測協定: 戦略は,現実的な反省として構成され,fill_orders_on_standard_ohlc=trueを使用して標準OHLC価格上の注文の実行を模擬し,特定の歴史期間を定義する設定可能な日付フィルターを含み,パフォーマンス評価を行う.

  6. データ可視化:スクリプトは,買入/売却シグナル,ATRのストップとストップのレベルを追跡するグラフの重複,およびリアルタイム戦略パラメータ,現在のポジションの状態,トレンド方向および重要な価格レベルを示す情報表を提供する.

戦略的優位性

  1. ノイズフィルタリング能力ハイケン・アシグマの技術は,短期市場のノイズを効果的にフィルターし,トレーダーがより重要な市場動向に集中し,偽信号の干渉を減らすのに役立ちます.

  2. ダイナミックなリスク管理ATRベースのトラッキング・ストップメカニズムは,市場の波動性に応じて自動的に調整し,波動が加剧したときにより緩やかなストップを提供し,波動が弱まったときに保護を緊縮し,リスク・リターン比率を最適化します.

  3. 客観的な出入り信号EMAによって交叉生成された信号は主観的な判断を排除し,取引決定をより体系的かつ繰り返し可能にし,感情的な規律を維持するのに役立ちます.

  4. 実際の市場価格の実行策略:反測では実際の市場価格 (ハイケンアッシュ合成価格ではなく) を使って取引と停止を実行し,より正確な反測結果を提供し,実際の取引環境に近い.

  5. ビジュアルフィードバックと監視統合された情報表とビジュアル指標は,リアルタイムの戦略状態と重要なデータポイントを提供し,迅速な評価とモニタリングを容易にし,意思決定能力を強化します.

  6. フレキシブルなパラメータ配置調整可能なキーパラメータ (感度値,ATRサイクル,ハイケンアッシュ方法,およびストップ・ローズ設定) は,戦略を異なる市場環境とトレーダーのリスク好みに適応させる.

  7. 複数の戦略を設計する: 潜在的空頭圧縮リスクを回避して上昇傾向を捉えることに焦点を当て,特に特定の暗号通貨のような長期にわたる悲観的な市場に適しています.

戦略リスク

  1. トレンド反転リスクATRのストップトラッキングは,トレンド追跡策として,市場横断または急速な反転時に大きな引き下げに直面する可能性があるため,そのような損失を完全に防ぐことはできません.

  2. パラメータ最適化トラップ: 過度な最適化パラメータは,曲線適合を引き起こす可能性があり,戦略は歴史的なデータで優れたパフォーマンスを発揮するが,将来の市場では不良なパフォーマンスを発揮する. 安定性を確保するために複数の市場と時間枠でテストすることが推奨される.

  3. 入場時のリスク:EMA交差信号は,トレンドが既に発達した後期に現れ,入場位置が望ましくないことを引き起こします. 強い市場では,これは高い値で買い物を引き起こす可能性があります.

  4. 危険を誘発する: 波動性の高い市場では,全体的な傾向が良い場合でも,価格は一時的に止損レベルに触れて,不必要な退出を引き起こす可能性があります. 市場の特徴に応じて,慎重に止損パラメータを設定する必要があります.

  5. 単一の技術指標依存戦略はATRとEMAの指標に大きく依存し,基本的要因や他の技術的指標を考慮しないため,重要な市場転換点を逃す可能性があります.

  6. 長期横断市場のパフォーマンス: 長期横断市場では,この戦略は,連続した小さな損失の蓄積につながる複数の誤信号を生じることがあります. 市場がトレンド状態にあることを確認する際に使用することをお勧めします.

  7. スライドポイントと実行リスク: 策略は反測で滑り点を考慮しているが,実際の取引の滑り点と実行の遅れは,特に流動性が低い市場では,設定値より大きい可能性があります.

戦略最適化の方向性

  1. 多時間枠分析統合: 高いタイムフレームのトレンド確認シグナルを考慮し,高いタイムフレームのトレンド方向が一致している場合にのみ取引を実行することで,勝率とリスク/リターン比率を大幅に向上させることができます.

  2. 波動率フィルター: 波動率に基づくフィルターを追加し,異常な波動期間の取引を一時停止したり,ポジションのサイズを調整したりすることで,市場の極端な波動から生じるリスクを軽減できます.

  3. ダイナミックなポジション管理固定パーセント配置ではなく,波動率と市場の状況に基づいて動的なポジションサイズ調整を実現し,異なる市場条件下で資金使用効率を最適化できます.

  4. 多指標確認: 他の互補的な技術指標を二次確認として統合する (例えば,相対的に強い指数RSI,ランダム指数またはMACD) は,偽信号率を低下させ,取引品質を向上させる.

  5. 減損策の改善より複雑なストップ戦略を実現する.例えば,ATRの倍数やサポート/レジスタンスレベルに基づくストップを,単純なパーセントや固定ポイントではなく,市場構造に適した方法で追跡する.

  6. 出場戦略の詳細化: より精巧な部分利益と分期出場メカニズムを開発し,トレンドの口を維持しながら部分利益をロックし,全体的なリターン曲線を最適化します.

  7. 市場制度の識別:市場制度識別アルゴリズムを追加し,異なる市場状態 (トレンド,揺れ,または逆転) に適応するために戦略パラメータを自動的に調整し,戦略の自主適応能力を向上させる.

  8. 機械学習の統合戦略の性能をさらに向上させ,主観的な干渉を減らすために,パラメータの選択を最適化したり,最適なエントリー/エグジットを予測するために,機械学習技術を探索する.

要約する

波動率自在適応 ハイケンアッシュATR ストップ・ローズ・トラッキング トレンド取引戦略は,合理的でリスクが制御可能な設計されたトレンド追跡システムで,特に波動性の高い市場に適しています. ハイケンアッシュチャートのノイズフィルタリング能力,ATRのダイナミック・リスク管理,EMAのトレンド識別機能を組み合わせることで,この戦略は客観的で体系的な取引枠組みを提供します.

この戦略の主要な優点は,自主的に適応し,市場変動に応じて自動的にストップ・ロスのレベルを調整し,資金を保護し,利益をロックする能力にある.同時に,その厳格なストップ・ロスの実施と実際の市場価格に基づく執行メカニズムは,測定結果の信頼性と複製性を保証している.

しかし,トレンド追跡戦略として,市場横横または急速な反転時に挑戦が起こり得る. 多時間枠分析を統合し,波動率フィルターを追加し,ポジション管理を最適化し,出場戦略を細かくするなどの改善措置を講じることで,戦略の安定性とパフォーマンスをさらに強化することができる.

この戦略は,システム化された取引方法を構築したいトレーダーにとって,個人リスクの好みや市場の特徴に応じてカスタマイズ・拡張できる堅固な基盤を提供し,様々な市場環境で安定したリスク調整リターンを実現する可能性を秘めています.

ストラテジーソースコード
/*backtest
start: 2024-08-18 00:00:00
end: 2025-08-17 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"DOGE_USDT","balance":5000}]
*/

//@version=6
strategy(title="Mutanabby_AI | ATR+ | ")  // Ensures realistic execution

// 📊 INPUT PARAMETERS
//=============================================================================
a = input.int(1, title="🔧 Key Value (Sensitivity)", minval=1, maxval=10, 
              tooltip="Lower = More signals, Higher = Fewer signals")
c = input.int(10, title="📈 ATR Period", minval=1, maxval=500,
              tooltip="Period for ATR calculation")

// 🕯️ HEIKIN ASHI METHOD SELECTION
//=============================================================================
ha_method = input.string("Manual Calculation", title="🕯️ Heikin Ashi Method", 
                         options=["Manual Calculation", "ticker.heikinashi()", "Regular Candles"], 
                         tooltip="Manual = Most reliable, ticker.heikinashi = Good, Regular = Standard OHLC")

// 🛡️ STOP LOSS SETTINGS
//=============================================================================
use_stop_loss = input.bool(false, title="🛡️ Enable Stop Loss", 
                           tooltip="Enable stop loss at entry price level")
stop_loss_type = input.string("Percentage", title="📊 Stop Loss Type", 
                               options=["Percentage", "Fixed Points"], 
                               tooltip="Choose stop loss calculation method")
stop_loss_percent = input.float(2.0, title="📉 Stop Loss %", minval=0.1, maxval=50.0, step=0.1,
                                 tooltip="Stop loss percentage below entry price")
stop_loss_points = input.float(10.0, title="📉 Stop Loss Points", minval=0.1, step=0.1,   tooltip="Stop loss in price points below entry price")



// Date condition
date_condition = true

// 🎨 VISUAL SETTINGS
//=============================================================================
show_signals = input.bool(true, title="🎯 Show Buy/Sell Signals")
show_trailing_stop = input.bool(true, title="📈 Show ATR Trailing Stop")
show_stop_loss = input.bool(true, title="🛡️ Show Stop Loss Line")
show_bar_colors = input.bool(true, title="🎨 Color Bars")
show_position_info = input.bool(true, title="📊 Show Position Info")

// 🧮 HEIKIN ASHI CALCULATIONS
//=============================================================================

// METHOD 1: MANUAL HEIKIN ASHI CALCULATION (MOST RELIABLE)
//=============================================================================
// Manual HA calculation - most transparent and reliable
var float ha_open_manual = na
ha_close_manual = (open + high + low + close) / 4
ha_open_manual := na(ha_open_manual[1]) ? (open + close) / 2 : (ha_open_manual[1] + ha_close_manual[1]) / 2
ha_high_manual = math.max(high, math.max(ha_open_manual, ha_close_manual))
ha_low_manual = math.min(low, math.min(ha_open_manual, ha_close_manual))

// METHOD 2: TICKER.HEIKINASHI() (GOOD ALTERNATIVE)
//=============================================================================
// Get Heikin Ashi data via ticker.heikinashi() - non-repainting
ha_ticker = ticker.heikinashi(syminfo.tickerid)
[ha_open_ticker, ha_high_ticker, ha_low_ticker, ha_close_ticker] =   request.security(ha_ticker, timeframe.period, [open[1], high[1], low[1], close[1]],  lookahead=barmerge.lookahead_on)  // Use confirmed bars to prevent repainting

// METHOD 3: REGULAR CANDLES
//=============================================================================
// Regular OHLC data
ha_open_regular = open
ha_high_regular = high
ha_low_regular = low
ha_close_regular = close

// SELECT METHOD BASED ON USER INPUT
//=============================================================================
src = ha_method == "Manual Calculation" ? ha_close_manual : 
      ha_method == "ticker.heikinashi()" ? ha_close_ticker : ha_close_regular

source_open = ha_method == "Manual Calculation" ? ha_open_manual : 
              ha_method == "ticker.heikinashi()" ? ha_open_ticker : ha_open_regular
              
source_high = ha_method == "Manual Calculation" ? ha_high_manual : 
              ha_method == "ticker.heikinashi()" ? ha_high_ticker : ha_high_regular
              
source_low = ha_method == "Manual Calculation" ? ha_low_manual : 
             ha_method == "ticker.heikinashi()" ? ha_low_ticker : ha_low_regular

// 📊 ATR TRAILING STOP CALCULATION
//=============================================================================
// Calculate True Range using selected method
tr1 = source_high - source_low
tr2 = math.abs(source_high - src[1])
tr3 = math.abs(source_low - src[1])
tr = math.max(tr1, math.max(tr2, tr3))

// ATR calculation
xATR = ta.sma(tr, c)
nLoss = a * xATR

// ATR Trailing Stop logic
var float xATRTrailingStop = na
xATRTrailingStop := if src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0)
    math.max(nz(xATRTrailingStop[1]), src - nLoss)
else if src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0)
    math.min(nz(xATRTrailingStop[1]), src + nLoss)
else if src > nz(xATRTrailingStop[1], 0)
    src - nLoss
else
    src + nLoss

// Position state tracking
var int pos = na
pos := if src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0)
    1
else if src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0)
    -1
else
    nz(pos[1], 0)

// 🎯 SIGNAL GENERATION
//=============================================================================
// EMA for crossover detection
ema_val = ta.ema(src, 1)

// Crossover conditions
above = ta.crossover(ema_val, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema_val)

// Buy and sell signals
buy_signal = src > xATRTrailingStop and above
sell_signal = src < xATRTrailingStop and below

// Trend direction
is_uptrend = src > xATRTrailingStop
is_downtrend = src < xATRTrailingStop

// 🛡️ STOP LOSS CALCULATION
//=============================================================================
var float entry_price = na
var float stop_loss_level = na

// Calculate stop loss level
calculate_stop_loss(entry_price_val) =>
    if stop_loss_type == "Percentage"
        entry_price_val * (1 - stop_loss_percent / 100)
    else
        entry_price_val - stop_loss_points

// 📈 LONG ONLY STRATEGY LOGIC
//=============================================================================
var bool in_long_position = false

// Entry condition: Buy signal when not in position
long_entry = buy_signal and date_condition and not in_long_position

// Exit conditions - CRITICAL: Use real prices for stop loss, not HA prices
atr_exit = sell_signal and date_condition and in_long_position
stop_loss_hit = use_stop_loss and in_long_position and low <= stop_loss_level  // Uses real low price

// Combined exit condition
long_exit = atr_exit or stop_loss_hit

// Execute trades - Orders execute at REAL market prices
if long_entry
    strategy.entry("LONG", strategy.long, comment="🚀 LONG")
    in_long_position := true
    entry_price := close  // REAL entry price, not HA price
    stop_loss_level := use_stop_loss ? calculate_stop_loss(entry_price) : na

if long_exit
    exit_reason = stop_loss_hit ? "🛡️ STOP LOSS" : "💰 ATR EXIT"
    strategy.close("LONG", comment=exit_reason)
    in_long_position := false
    entry_price := na
    stop_loss_level := na

// 🎨 VISUAL ELEMENTS
//=============================================================================
// Trailing stop line color
stop_color = pos == 1 ? color.green : pos == -1 ? color.red : color.blue

// Plot ATR Trailing Stop
plot(show_trailing_stop ? xATRTrailingStop : na, 
     color=stop_color, 
     linewidth=2, 
     title="ATR Trailing Stop")

// Plot Stop Loss Level
plot(show_stop_loss and use_stop_loss and in_long_position ? stop_loss_level : na,
     color=color.new(color.red, 0), 
     linewidth=2, 
     style=plot.style_linebr,
     title="Stop Loss Level")

// Plot buy/sell signals
plotshape(show_signals and buy_signal, 
          title="Buy Signal", 
          text="BUY", 
          style=shape.labelup, 
          location=location.belowbar,
          color=color.new(color.green, 0), 
          textcolor=color.white, 
          size=size.small)

plotshape(show_signals and sell_signal, 
          title="Sell Signal", 
          text="SELL", 
          style=shape.labeldown, 
          location=location.abovebar,
          color=color.new(color.red, 0), 
          textcolor=color.white, 
          size=size.small)

// Plot stop loss hit signal
plotshape(show_signals and stop_loss_hit, 
          title="Stop Loss Hit", 
          text="SL", 
          style=shape.labeldown, 
          location=location.abovebar,
          color=color.new(color.orange, 0), 
          textcolor=color.white, 
          size=size.small)

// Bar coloring
barcolor(show_bar_colors ? (is_uptrend ? color.new(color.green, 70) : 
         is_downtrend ? color.new(color.red, 70) : na) : na)

// Position status background
bgcolor(show_position_info and strategy.position_size > 0 ?  color.new(color.green, 95) : show_position_info and strategy.position_size == 0 ?   color.new(color.gray, 98) : na,   title="Position Status")

// Entry price line - shows REAL entry price
plot(show_position_info and strategy.position_size > 0 ? strategy.position_avg_price : na,
     color=color.new(color.blue, 0), 
     linewidth=1, 
     style=plot.style_linebr, 
     title="Entry Price")

// 📊 INFORMATION TABLE
//=============================================================================
if show_position_info and barstate.islast
    var table info_table = table.new(position.top_right, 3, 11, 
                                      bgcolor=color.white, 
                                      border_width=1,
                                      border_color=color.gray,
                                      frame_width=1,
                                      frame_color=color.black)
    
    // Table headers
    table.cell(info_table, 0, 0, "Mutanabby_AI | Manual HA | ATR | SL", text_color=color.white, bgcolor=color.blue, text_size=size.small)
    table.cell(info_table, 1, 0, "", text_color=color.white, bgcolor=color.blue)
    table.cell(info_table, 2, 0, "", text_color=color.white, bgcolor=color.blue)
    
    // Strategy info
    table.cell(info_table, 0, 1, "HA Method:", text_color=color.rgb(10, 10, 10), text_size=size.small)
    method_color = ha_method == "Manual Calculation" ? color.green : 
                   ha_method == "ticker.heikinashi()" ? color.blue : color.gray
    table.cell(info_table, 1, 1, ha_method, text_color=method_color, text_size=size.small)
    
    table.cell(info_table, 0, 2, "Key Value:", text_color=color.rgb(10, 10, 10), text_size=size.small)
    table.cell(info_table, 1, 2, str.tostring(a), text_color=color.blue, text_size=size.small)
    
    table.cell(info_table, 0, 3, "ATR Period:", text_color=color.rgb(2, 2, 2), text_size=size.small)
    table.cell(info_table, 1, 3, str.tostring(c), text_color=color.blue, text_size=size.small)
    
    table.cell(info_table, 0, 4, "Stop Loss:", text_color=color.rgb(3, 3, 3), text_size=size.small)
    table.cell(info_table, 1, 4, use_stop_loss ? "ON" : "OFF", 
               text_color=use_stop_loss ? color.green : color.gray, text_size=size.small)
    
    table.cell(info_table, 0, 5, "Position:", text_color=color.rgb(3, 3, 3), text_size=size.small)
    table.cell(info_table, 1, 5, strategy.position_size > 0 ? "LONG" : "NONE", 
               text_color=strategy.position_size > 0 ? color.green : color.gray, text_size=size.small)
    
    table.cell(info_table, 0, 6, "Trend:", text_color=color.rgb(0, 0, 0), text_size=size.small)
    table.cell(info_table, 1, 6, is_uptrend ? "UP" : "DOWN", 
               text_color=is_uptrend ? color.green : color.red, text_size=size.small)
    
    table.cell(info_table, 0, 7, "Current Price:", text_color=color.black, text_size=size.small)
    table.cell(info_table, 1, 7, str.tostring(close, "#.##"), text_color=color.black, text_size=size.small)
    
    table.cell(info_table, 0, 8, "Trailing Stop:", text_color=color.black, text_size=size.small)
    table.cell(info_table, 1, 8, str.tostring(xATRTrailingStop, "#.##"), text_color=color.blue, text_size=size.small)
    
    // Show stop loss level if enabled and in position
    if use_stop_loss and in_long_position
        table.cell(info_table, 0, 9, "Stop Loss:", text_color=color.black, text_size=size.small)
        table.cell(info_table, 1, 9, str.tostring(stop_loss_level, "#.##"), text_color=color.red, text_size=size.small)
    else
        table.cell(info_table, 0, 9, "Stop Loss:", text_color=color.black, text_size=size.small)
        table.cell(info_table, 1, 9, "N/A", text_color=color.gray, text_size=size.small)
    
    table.cell(info_table, 0, 10, "Last Signal:", text_color=color.black, text_size=size.small)
    signal_text = buy_signal ? "BUY" : sell_signal ? "SELL" : stop_loss_hit ? "STOP LOSS" : "NONE"
    signal_color = buy_signal ? color.green : sell_signal ? color.red : stop_loss_hit ? color.orange : color.gray
    table.cell(info_table, 1, 10, signal_text, text_color=signal_color, text_size=size.small)

// 🚨 ALERTS
//=============================================================================
// Alert conditions
alertcondition(buy_signal, title="🚀 Mutanabby_AI | ATR+ LONG Entry", 
               message="Mutanabby_AI | ATR+ : BUY signal at {{close}}")

alertcondition(sell_signal, title="💰 Mutanabby_AI | ATR+ LONG Exit", 
               message="Mutanabby_AI | ATR+ : SELL signal at {{close}}")

alertcondition(stop_loss_hit, title="🛡️ Mutanabby_AI | ATR+ Stop Loss Hit", 
               message="Mutanabby_AI | ATR+ : STOP LOSS hit at {{close}}")

alertcondition(buy_signal or sell_signal or stop_loss_hit, title="🔔 Mutanabby_AI | ATR+ Any Signal", 
               message="Mutanabby_AI| ATR+ : {{ticker}} - {{close}} - Signal: {{strategy.position_size > 0 ? 'EXIT' : 'ENTRY'}}")

//=============================================================================
// 📝 STRATEGY NOTES:
//
// 🎯 OPTIMAL IMPLEMENTATION for realistic backtesting:
// 📈 Uses manual HA calculation for transparency and reliability
// 💰 Orders execute at REAL market prices (not synthetic HA prices)  
// 🛡️ Stop loss uses real market prices for accurate risk management
// 🔧 Multiple HA methods available for comparison and validation
// ⚡ Added fill_orders_on_standard_ohlc=true for extra protection
// 
// 🎯 METHOD COMPARISON:
// 🥇 Manual Calculation: Most reliable, transparent, no external dependencies
// 🥈 ticker.heikinashi(): Good alternative, uses confirmed bars to prevent repainting
// 🥉 Regular Candles: Standard OHLC for comparison purposes
//
// 💡 BEST PRACTICES IMPLEMENTED:
// ✅ Always run on regular candlestick charts (not native HA charts)
// ✅ Use confirmed/historical HA values to prevent repainting
// ✅ Execute all orders at real market prices
// ✅ Stop loss based on real prices, not synthetic HA prices
// ✅ Entry price tracking uses actual fill prices
// ✅ Transparent calculation methods for verification
//
// 🚨 AVOID:
// ❌ Running strategies directly on TradingView's native HA charts
// ❌ Using current bar HA values (causes repainting)
// ❌ Stop loss based on HA prices instead of real prices
//=============================================================================