
이진량 지표 연동 거래 전략은 기술 분석을 기반으로 한 정량 거래 시스템으로, 전략은 상대적으로 약한 지표 ((RSI) 와 이동 평균의 종결 분산 지표 ((MACD) 의 장점을 교묘하게 결합하여 시장의 강력한 상승 추세를 포착하는 데 초점을 맞추고 있습니다. 이 전략은 다중 거래만을 수행하고, 동적 돌파 신호를 식별하고 위험 관리 메커니즘과 결합하여 체계화된 거래 의사 결정 과정을 구현합니다. 이 전략의 핵심은 동적 약화 또는 위험 목표가 달성되면 RSI와 MACD 지표가 동시에 상승 신호를 표시하는 것을 보는 것입니다.
이 전략의 작동은 두 가지 핵심 기술 지표의 상호 작용에 기반합니다. 첫째, 전략은 시장이 과매매 또는 과매매 상태인지 판단하기 위해 가격 변화의 속도와 정도를 측정하기 위해 RSI 지표를 사용합니다. 둘째, MACD 지표를 사용하여 시장 추세의 변화와 동력의 강도를 식별합니다. 구체적인 거래 규칙은 다음과 같습니다.
입장 조건:
추가 필터링 조건:
출전 조건:
전략은 상태 추적 메커니즘을 설계하여 평상시 상태에서 진입할 수 있도록 보장하고 포지션 상태에서 진출할 수 있도록 하며, 반복 신호의 문제를 피한다. 이러한 디자인은 각 진입 후 한 번의 진출이 가능하도록 하여 거래 논리의 명확성과 일관성을 유지한다.
지표의 동기효과RSI와 MACD의 두 지표의 장점을 결합하여 RSI는 가격 변화에 신속하게 반응하고 MACD는 중기 및 장기 동향을 확인 할 수 있습니다. 둘은 신호의 신뢰성을 향상시킵니다.
유연한 필터링이 전략은 EMA 트렌드 필터링과 오버셀 상위 컨텍스트 필터링의 두 가지 선택 가능한 메커니즘을 제공하여 거래자가 다양한 시장 환경에 따라 전략의 적응성을 조정할 수 있습니다.
좋은 위험 관리: 내장된 스톱 스톱 손실 메커니즘, 거래자가 자신의 위험 선호에 따라 퍼센티지 파라미터를 설정할 수 있도록, 단일 거래의 위험 경계를 효과적으로 제어한다.
상태 관리가 명확하다: 상태 변수를 통해 포지션 상태를 추적하여 거래 신호의 일관성과 논리를 보장하고, 반복적으로 입문하거나 출퇴근하는 문제를 피합니다.
고도의 사용자 정의전략: 전략은 RSI 길이, MACD 변수, 필터링 조건 및 위험 관리 변수를 포함한 여러 조정 가능한 매개 변수를 제공하여 거래자가 다른 시장 조건과 거래 유형에 따라 최적화 할 수 있습니다.
시각적 도움말전략은 입출장 표시, K선 색채 및 트리거 배경 디스플레이와 같은 시각 기능을 제공하여 거래자가 직관적으로 이해하고 전략을 조정할 수 있습니다.
가짜 침입 위험: 불안한 시장에서 RSI와 MACD는 빈번한 가짜 브레이크 신호를 생성하여 연속적인 손실 거래로 이어질 수 있습니다. 이러한 위험을 완화하기 위해, 변동률 지표 또는 추세 강도 지표와 같은 추가 시장 환경 필터를 추가 할 수 있습니다.
한방 거래 제한: 이 전략은 단지 다단계 거래를 수행하고, 하향 추세에서 잠재적인 하락 기회를 놓치게 될 것이다. 전체적인 거래 시스템에서, 상응하는 하위 전략을 추가하거나, 명확한 하향 추세에서 거래를 중지하는 것을 고려할 수 있다.
매개변수 민감도: 전략 성능은 파라미터 설정에 민감하며, 다른 시장과 시간 프레임에는 다른 파라미터 조합이 필요할 수 있습니다. 여러 시장 조건에 대한 재검토를 통해 파라미터를 최적화하고, 자율적 파라미터 방법을 사용하는 것을 고려하는 것이 좋습니다.
손해배상 설정 위험: 너무 작은 스톱은 빈번하게 트리플될 수 있고, 너무 큰 스톱은 단독으로 너무 큰 손실을 초래할 수 있다. 목표 시장의 변동적 특성에 따라 스톱 비율을 조정하거나, ATR 배수와 같은 동적 스톱 방법을 사용하는 것을 고려한다.
신호 지연성: 지연 지표로서, RSI와 MACD의 신호는 가격이 이미 눈에 띄게 변한 후에 나타날 수 있으며, 진입 가격과 수익률에 영향을 미칩니다. 진입 시기를 최적화하기 위해 더 민감한 선행 지표와 결합하는 것이 고려 될 수 있습니다.
자기 적응 변수 시스템시장의 변동률이나 트렌드 강도에 기반한 적응 파라미터 조정 메커니즘을 개발하여 RSI와 MACD의 파라미터를 현재 시장 조건에 따라 자동으로 최적화하여 다양한 시장 환경에서 전략의 적응성을 향상시킵니다.
다중 시간 프레임 분석예를 들어, 더 큰 시간 프레임에서 트렌드 방향을 확인한 다음 더 작은 시간 프레임에서 특정 거래를 실행하는 등 여러 시간 프레임 확인 메커니즘을 도입하여 가짜 신호를 줄이고 승률을 높여줍니다.
동적 상쇄 메커니즘: 고정된 퍼센티지 스톱을 ATR (Average True Rate) 에 기반한 동적 스톱으로 바꾸어, 시장의 변동성에 더 잘 적응하고, 자금을 보호하면서 가격에 충분한 호흡 공간을 제공합니다.
자금 관리 최적화: 계좌의 순가치, 변동성 및 승률에 기반한 지위 관리 알고리즘을 도입합니다. 예를 들어, 케일리 공식이나 고정 비율 위험 모델은 각 거래의 위험 을 현재 계좌 상태와 시장 조건에 맞게 만듭니다.
통합 시장 환경 필터: 트렌드, 흔들림 또는 전환을 식별 할 수있는 필터를 추가합니다. 예를 들어 ADX (평균 방향 지수), 변동률 지표 또는 주기 분석 도구는 전략에 적합한 시장 조건에서 거래를 수행합니다.
공허 거래 논리를 추가: 폭넓은 전략으로 하향 트렌드에서 똑같이 효과적일 수 있도록 하향 트렌드 규칙을 포함하여 전체적인 거래 시스템을 구축한다.
이중 동적 지표 협동 거래 전략은 RSI와 MACD의 두 가지 고전적 기술 지표의 장점을 결합하여 논리적으로 명확하고 위험 제어 가능한 양적 거래 시스템을 만듭니다. 이 전략은 상승 추세에서 동적 기회를 포착하는 데 초점을 맞추고 있으며, 여러 가지 필터링 메커니즘과 위험 관리 도구를 통해 거래 품질을 향상시킵니다.
/*backtest
start: 2025-02-28 00:00:00
end: 2025-08-10 00:00:00
period: 3h
basePeriod: 3h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
// Vibe coded by Andrew Grothe 2025-08-08. Adjust the TP/SL on lines 28 & 29 to fine tune the strategy
strategy("RSI + MACD Long-Only Strategy", overlay=true, pyramiding=0, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.0)
// Inputs — RSI
rsiLen = input.int(14, "RSI Length", minval=1, group="RSI")
rsiOB = input.int(70, "RSI Overbought", minval=50, maxval=100, group="RSI")
rsiOS = input.int(30, "RSI Oversold", minval=0, maxval=50, group="RSI")
rsiMid = input.int(50, "RSI Midline", minval=0, maxval=100, group="RSI")
// Inputs — MACD
fastLen = input.int(12, "MACD Fast Length", minval=1, group="MACD")
slowLen = input.int(26, "MACD Slow Length", minval=1, group="MACD")
sigLen = input.int(9, "MACD Signal Length", minval=1, group="MACD")
requireAboveZero = input.bool(false, "Require MACD > 0 (trend filter)", group="MACD")
// Inputs — Filters & Visuals
useOversoldContext = input.bool(false, "Entry must be within N bars after RSI < Oversold", group="Signals")
oversoldWindowBars = input.int(10, "N bars after oversold", minval=1, group="Signals")
useEMATrend = input.bool(false, "Only Long if price > EMA", group="Signals")
emaLen = input.int(200, "EMA Length", minval=1, group="Signals")
showMarkers = input.bool(true, "Plot Entry/Exit Markers", group="Visuals")
colorBars = input.bool(false, "Color Bars on Signals", group="Visuals")
// Inputs — Risk
// 1 hour = 2.0/1.0, 2 hour = 10.5/2.5
useTPSL = input.bool(true, "Use Take Profit / Stop Loss", group="Risk")
tpPerc = input.float(11.5, "Take Profit %", minval=0.0, step=0.1, group="Risk")
slPerc = input.float(2.5, "Stop Loss %", minval=0.0, step=0.1, group="Risk")
// Core calculations
rsi = ta.rsi(close, rsiLen)
[macd, macdSignal, macdHist] = ta.macd(close, fastLen, slowLen, sigLen)
emaTrend = ta.ema(close, emaLen)
// Conditions
macdBull = macd > macdSignal and (not requireAboveZero or macd > 0)
rsiBull = rsi > rsiMid
recentlyOversold = ta.barssince(rsi < rsiOS) <= oversoldWindowBars
trendOk = not useEMATrend or close > emaTrend
// Precompute cross events to avoid conditional execution warnings
rsiCrossUpMid = ta.crossover(rsi, rsiMid)
macdCrossUp = ta.crossover(macd, macdSignal)
rsiCrossDownMid = ta.crossunder(rsi, rsiMid)
macdCrossDown = ta.crossunder(macd, macdSignal)
// Signals (long-only)
longTrigger = (rsiCrossUpMid and macdBull) or (macdCrossUp and rsi >= rsiMid)
longEntry = longTrigger and (not useOversoldContext or recentlyOversold) and trendOk
exitSignal = rsiCrossDownMid or (macdCrossDown and macdHist <= 0)
// Stateful gating so we only get one exit per entry
var bool inLong = false
inLongPrev = barstate.isfirst ? false : inLong[1]
finalLongEntry = longEntry and not inLongPrev
finalExit = exitSignal and inLongPrev
inLong := (inLongPrev or finalLongEntry) and not finalExit
// Plots
plot(useEMATrend ? emaTrend : na, title="EMA", color=color.orange, linewidth=2)
plotshape(showMarkers and finalLongEntry, title="Long Entry", style=shape.triangleup, location=location.belowbar, color=color.lime, size=size.tiny, text="Long")
plotshape(showMarkers and finalExit, title="Exit", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, text="Exit")
barcolor(colorBars ? (finalLongEntry ? color.lime : finalExit ? color.red : na) : na)
// Debug background to visualize when raw long trigger occurs
bgcolor(longTrigger ? color.new(color.lime, 90) : na)
// Alerts
//alertcondition(finalLongEntry, title="RSI+MACD Long Entry", message="RSI+MACD Long Entry on {{ticker}} {{interval}} at {{close}}")
//alertcondition(finalExit, title="RSI+MACD Exit", message="RSI+MACD Exit on {{ticker}} {{interval}} at {{close}}")
// Strategy Orders — Long only
if finalLongEntry
strategy.entry("Long", strategy.long)
// Protective exits (TP/SL) while in position
if useTPSL and strategy.position_size > 0
longSL = strategy.position_avg_price * (1 - slPerc / 100.0)
longTP = strategy.position_avg_price * (1 + tpPerc / 100.0)
strategy.exit("Long TP/SL", from_entry="Long", stop=longSL, limit=longTP)
// Signal-based exit
if finalExit and strategy.position_size > 0
strategy.close("Long", comment="Signal Exit")