
이 전략은 RSI와 EMA 지표에 기반한 동적 거래 전략으로, 여러 시간 주기의 기술적 분석 방법을 결합한다. 이 전략은 RSI 초매매 신호와 EMA 트렌드 확인을 통해 거래하고, 포지션 동적 조정 메커니즘을 채택한다. 전략의 핵심은 단기 RSI 2 (주기) 와 중기 RSI (주기 14) 의 신호를 결합하는 것과 동시에 세 개의 다른 주기의 EMA (주기 50/100/200) 를 사용하여 시장의 트렌드 방향을 확인하는 것이다.
전략은 다단계 검증 메커니즘을 사용하여 거래 결정을 내립니다. 다단계 조건은 RSI14가 31보다 낮고 RSI2가 10을 넘어섰을 때 EMA50, EMA100, EMA200이 공백 배열을 표시하도록 요구합니다. 공백 조건은 RSI14가 69보다 높고 RSI2가 90을 넘어섰을 때 EMA50, EMA100, EMA200이 다단계 배열을 표시하도록 요구합니다. 전략에는 RSI 지표에 기반한 막기 장치가 포함되어 있으며, RSI가 극한에 도달하고 가격이 포지션 보유에 유리할 때 자동으로 평정됩니다.
이 전략은 동적 거래와 트렌드 추적 특성을 통합한 전략으로, 다중 기술 지표의 조합 사용으로 거래의 신뢰성을 높인다. 위험점이 있기는 하지만, 제안된 최적화 방향을 통해 전략의 안정성을 더욱 향상시킬 수 있다. 전략의 가장 큰 특징은 단기 및 중기 기술 지표를 결합하고, 동적 포지션 관리와 함께, 완전한 거래 시스템을 형성하는 것이다. 합리적인 위험 관리와 매개 변수 최적화를 통해, 이 전략은 실제 거래에서 안정적인 성능을 얻을 수 있다.
/*backtest
start: 2024-11-21 00:00:00
end: 2024-11-28 00:00:00
period: 15m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Custom RSI EMA Strategy", 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)
// Definování průměrné ceny pozice
var float long_avg_price = na
var float short_avg_price = na
// Sledujeme, zda se velikost pozice změnila
var float last_position_size = na
// Přerušení průměrné ceny pozice při změně pozice
if (last_position_size != strategy.position_size)
long_avg_price := na
short_avg_price := na
// Aktualizace průměrné ceny pozice
if (strategy.position_size > 0)
long_avg_price := strategy.position_avg_price
short_avg_price := na
else if (strategy.position_size < 0)
short_avg_price := strategy.position_avg_price
long_avg_price := na
// Uložení aktuální velikosti pozice pro příští bar
last_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_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 = 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", strategy.long, qty=new_position_size == na ? trade_qty : new_position_size)
// Vstup do short pozice s dvojnásobkem aktuální pozice nebo standardní velikostí při první pozici
if (shortCondition)
strategy.entry("Short", strategy.short, qty=new_position_size == na ? trade_qty : new_position_size)
// Výstup z long pozice při splnění podmínek pro take profit
if (takeProfitLongCondition)
strategy.close("Long")
// Výstup z short pozice při splnění podmínek pro take profit
if (takeProfitShortCondition)
strategy.close("Short")
// 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
plot(long_avg_price, title="Long Avg Price", color=color.blue, linewidth=2)
plot(short_avg_price, title="Short Avg Price", color=color.orange, linewidth=2)