この戦略は,RSI指標とEMA移動平均値に基づくモメントヘッジ取引戦略である.この戦略は,市場トレンド逆転の機会を把握するために,市場トレンド逆転の機会 (50,100,200) と組み合わせた二重RSI期間 (RSI-14とRSI-2) を利用し,ダイナミックなポジション管理を通じてヘッジを実施する.この戦略の核心特性は,エントリー条件を満たした時点でポジションを徐々に増加させ,RSIオーバーバイト/オーバーセールレベルに基づいて利益を得るために利用する.
この戦略は,EMA-50,EMA-100およびEMA-200とともに,異なる期間のRSI-14とRSI-2を採用し,取引信号を決定する.ロング条件では,RSI-14が31未満,RSI-2が10を超越し,EMAはベアラインナインでなければなりません (EMA-50 < EMA-100 < EMA-200).ショート条件は反対で,RSI-14が69を超越し,RSI-2が90を超越し,EMAがブライスラインナインで (EMA-50 > EMA-100 > EMA-200).この戦略は20倍レバレッジを使用し,現在の株式に基づいて取引量を動的に計算します.現在のポジションサイズ条件が満たされると,新しいポジションは現在のポジションの2倍で開かれます.利潤取りの条件は,RSI指標の逆転ブレイクに基づいて設定されます.
この包括的な戦略は,トレード精度を向上させるために複数の技術指標を使用して,勢いとトレンドフォローを組み合わせます.この戦略は,ダイナミックなポジション管理とヘッジメカニズムを通じて革新しますが,重大なリスクを負います.リスク制御メカニズムを最適化し,追加のフィルターを導入することで,この戦略はライブトレードでより良いパフォーマンスを発揮する可能性があります.ライブ実装の前に徹底的なバックテストとパラメータ最適化が推奨されます.
/*backtest start: 2024-11-26 00:00:00 end: 2024-12-03 00:00:00 period: 10m basePeriod: 10m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Custom RSI EMA Strategy Hedge", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1) // Definování vstupních podmínek rsi_14 = ta.rsi(close, 14) rsi_2 = ta.rsi(close, 2) ema_50 = ta.ema(close, 50) ema_100 = ta.ema(close, 100) ema_200 = ta.ema(close, 200) // Pákový efekt leverage = 20 // Podmínky pro long pozici longCondition = (rsi_14[1] < 31) and ta.crossover(rsi_2, 10) and (ema_50 < ema_100) and (ema_100 < ema_200) // Podmínky pro short pozici shortCondition = (rsi_14[1] > 69) and ta.crossunder(rsi_2, 90) and (ema_50 > ema_100) and (ema_100 > ema_200) // Identifikátory pozic long_id = "Long" short_id = "Short" // Definování průměrné ceny pozice pro long a short var float long_avg_price = na var float short_avg_price = na // Sledujeme, zda se velikost pozice změnila var float last_long_position_size = na var float last_short_position_size = na // Přerušení průměrné ceny pozice při změně pozice if (last_long_position_size != strategy.position_size and strategy.position_size > 0) long_avg_price := na if (last_short_position_size != strategy.position_size and strategy.position_size < 0) short_avg_price := na // Aktualizace průměrné ceny pozice if (strategy.position_size > 0) long_avg_price := strategy.position_avg_price else long_avg_price := na if (strategy.position_size < 0) short_avg_price := strategy.position_avg_price else short_avg_price := na // Uložení aktuální velikosti pozice pro příští bar if (strategy.position_size > 0) last_long_position_size := strategy.position_size else if (strategy.position_size < 0) last_short_position_size := strategy.position_size // Podmínky pro take profit takeProfitLongCondition = (rsi_14 > 69) and (rsi_2 > 90) and (long_avg_price < close) takeProfitShortCondition = (rsi_14 < 31) and (rsi_2 < 10) and (short_avg_price > close) // Velikost pozice new_long_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2 new_short_position_size = strategy.position_size == 0 ? na : math.abs(strategy.position_size) * 2 // Úprava velikosti pozice s ohledem na pákový efekt position_value = strategy.equity * leverage trade_qty_long = position_value / close trade_qty_short = position_value / close // Vstup do long pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici if (longCondition) strategy.entry(long_id, strategy.long, qty=new_long_position_size == na ? trade_qty_long : new_long_position_size) // Vstup do short pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici if (shortCondition) strategy.entry(short_id, strategy.short, qty=new_short_position_size == na ? trade_qty_short : new_short_position_size) // Výstup z long pozice při splnění podmínek pro take profit if (takeProfitLongCondition) strategy.close(long_id) // Výstup z short pozice při splnění podmínek pro take profit if (takeProfitShortCondition) strategy.close(short_id) // Zvýraznění části grafu, kde platí podmínky pro long highlightLongCondition = (ema_50 < ema_100) and (ema_100 < ema_200) bgcolor(highlightLongCondition ? color.new(color.green, 90) : na) // Zvýraznění části grafu, kde platí podmínky pro short highlightShortCondition = (ema_50 > ema_100) and (ema_100 > ema_200) bgcolor(highlightShortCondition ? color.new(color.red, 90) : na) // Přidání bodů pozic do grafu plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="L") plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="S") // Vykreslení průměrné ceny pozice pro long a short pouze pokud pozice existuje plot(strategy.position_size > 0 ? long_avg_price : na, title="Long Avg Price", color=color.blue, linewidth=2) plot(strategy.position_size < 0 ? short_avg_price : na, title="Short Avg Price", color=color.orange, linewidth=2) // Zvýraznění čtverců pro RSI14 > 70 (červeně) a RSI14 < 30 (zeleně) var int rsi_above_70_start = na var int rsi_below_30_start = na var float top_value_above_70 = na var float bottom_value_above_70 = na var float top_value_below_30 = na var float bottom_value_below_30 = na // Identifikace začátku a konce období pro RSI14 > 70 if (rsi_14[1] > 70 and rsi_14[2] > 70) if na(rsi_above_70_start) rsi_above_70_start := bar_index top_value_above_70 := high bottom_value_above_70 := low else top_value_above_70 := math.max(top_value_above_70, high) bottom_value_above_70 := math.min(bottom_value_above_70, low) else if not na(rsi_above_70_start) // box.new(left = rsi_above_70_start, right = bar_index - 1, top = top_value_above_70, bottom = bottom_value_above_70, border_color = color.red, border_width = 2, bgcolor=color.new(color.red, 90)) rsi_above_70_start := na top_value_above_70 := na bottom_value_above_70 := na // Identifikace začátku a konce období pro RSI14 < 30 if (rsi_14[1] < 30 and rsi_14[2] < 30) if na(rsi_below_30_start) rsi_below_30_start := bar_index top_value_below_30 := high bottom_value_below_30 := low else top_value_below_30 := math.max(top_value_below_30, high) bottom_value_below_30 := math.min(bottom_value_below_30, low) else if not na(rsi_below_30_start) // box.new(left = rsi_below_30_start, right = bar_index - 1, top = top_value_below_30, bottom = bottom_value_below_30, border_color = color.green, border_width = 2, bgcolor=color.new(color.green, 90)) rsi_below_30_start := na top_value_below_30 := na bottom_value_below_30 := na