이 전략은 세 가지 지표 - 이동 평균, 볼링거 밴드 및 상대 강도 지수 (RSI) 를 복수 기간 주식 거래에 결합합니다. 빠른 및 느린 이동 평균, RSI 50 이하 및 구매시 BB 중부 대역 이하의 폐쇄 가격을 교차하는 것을 고려합니다. 70 이상의 RSI를 고려하고 판매시 BB 상부 대역 이상의 폐쇄 가격을 고려합니다.
이 전략은 주로 의사 결정에 대한 세 가지 지표를 활용한다. 첫째, MACD 지표는 빠르고 느린 이동 평균으로 구성된다. 느린 라인의 위의 빠른 라인의 크로스오버는 구매 신호를 생성한다. 둘째, 중간, 상위 및 하위 밴드를 가진 볼링거 밴드. 하위 밴드 근처의 가격은 스윙 로우에서 구매 기회를 제시하고, 상위 밴드 근처의 가격은 스윙 로우에서 판매 기회를 제시한다. 마지막으로, RSI는 가격 행동의 속도와 변화 속도를 반영하고 잠재적 인 스윙 로우와 스윙 로우를 식별한다.
구체적으로, 전략은 먼저 느린 이동 평균 이상의 빠른 이동 평균을 가로질러 구매를 제안하는 상승 추세를 강화하는 것을 나타냅니다. 또한 50 이하의 RSI를 요구하며 가격이 과판 수준에있을 수 있음을 보여줍니다. 또한 BB 중간 밴드 이하의 폐쇄 가격을 요구하며 가격 스윙이 낮고 좋은 입구 지점을 나타냅니다.
이윤 취득 및 스톱 로스 (stop loss) 를 위해, RSI가 70을 넘으면 가격이 과잉 매수 수준에 있고 상승 동력이 감소하고 있음을 나타냅니다. 또한 폐쇄 가격이 BB 상단 범위를 넘어서면 수익 취득에 적합한 인회 위험이 높아진다는 것을 나타냅니다.
이 전략은 이동 평균, 볼링거 밴드 및 RSI의 강점을 결합하여 입점과 출점을 더 정확하게 결정합니다. 주요 장점은 다음과 같습니다.
이동 평균은 가격 상승 동력을 결정한다. BB 중부 대역은 진입을 위해 스윙 최저치를 파악한다. RSI는 가격 정점에 구매를 피한다. 세 가지 모두 함께 가격 상승 동향 중 비교적 이상적인 구매 기회를 제공합니다.
RSI와 BB 상단 조합은 과잉 매입 상황을 피하기 위해 수익을 내기 위해 가격 변동 최고치를 잘 포착합니다.
다기간에 대한 평가는 수익을 극대화하기 위해 시간 프레임에 걸쳐 거래 기회를 포착 할 수 있습니다.
논리적 거래 규칙은 중장기 투자에 대한 전략을 쉽게 이해할 수 있습니다.
결정의 정확성을 향상시키기 위해 지표를 결합했음에도 불구하고 주요 위험이 있습니다.
매개 변수 설정 위험. 지표의 매개 변수는 경험적 조정이 필요합니다. 부적절한 조정은 전략 성과에 영향을 미칩니다.
황소 시장에 더 적합합니다. 곰 시장에서 가격 하락의 속도는 스톱 손실을 비효율화 할 수 있습니다.
단일 주식 위험은 포트폴리오에도 불구하고 계속됩니다. 자산에 대한 투자가 다양화되어야합니다.
잠재적으로 과도한 거래 빈도: 최적의 매개 변수 설정은 더 높은 거래 비용과 세금을 발생시키는 빈번한 거래로 이어질 수 있습니다.
해결책:
적당한 신호 주파수를 얻기 위해 백테스트를 기반으로 매개 변수를 조정합니다.
이동 평균 기간을 적당히 입력 빈도로 조정하고 손실을 최소화하십시오.
단일 주식 위험을 최소화하기 위해 더 많은 자산에 대한 투자가 다양화됩니다.
거래 빈도를 줄이기 위해 구매와 수익 취득 기준을 완화합니다.
최적화 할 수있는 더 많은 공간이 남아 있습니다.
부피와 같은 더 많은 필터를 추가하여 구매의 부피를 증폭시켜 의사 결정의 정확성을 향상시킵니다.
포지션 사이징 모듈을 시장 조건에 따라 포지션의 다이내믹 사이징에 통합합니다.
딥러닝 알고리즘을 활용하여 대용량 데이터 세트를 통해 자동으로 매개 변수를 조정합니다.
적용 가능성을 확대하기 위해 판결에 대한 더 많은 기간을 도입하십시오.
전체적으로 전략은 명확하고 이해하기 쉬운 논리를 가지고 있으며, 잘못된 신호를 줄이기 위해 시너지 지표를 사용합니다. 추가 매개 변수 조정 및 지표를 추가하면 안정성과 의사 결정 정확도를 계속 향상시킬 수 있습니다. 중장기 투자 및 정량 거래에 적합합니다. 그럼에도 불구하고 어떤 전략도 시장 위험을 완전히 제거하지 않습니다. 적절한 위치 크기와 스톱 로스 레벨은 항상 필요합니다.
/*backtest start: 2023-11-25 00:00:00 end: 2023-12-25 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // //@author Alorse //@version=4 strategy("MACD + BB + RSI [Alorse]", shorttitle="BB + MACD + RSI [Alorse]", overlay=true, pyramiding=0, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=1000, default_qty_value=20, commission_type=strategy.commission.percent, commission_value=0.01) txtVer = "1.0.1" version = input(title="Version", type=input.string, defval=txtVer, options=[txtVer], tooltip="This is informational only, nothing will change.") src = input(title="Source", type=input.source, defval=close) // MACD fast_length = input(title="Fast Length", type=input.integer, defval=12, group="MACD") slow_length = input(title="Slow Length", type=input.integer, defval=26, group="MACD") signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group="MACD") sma_source = input(title="Oscillator MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD") sma_signal = input(title="Signal Line MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD") fast_ma = sma_source == "SMA" ? sma(src, fast_length) : ema(src, fast_length) slow_ma = sma_source == "SMA" ? sma(src, slow_length) : ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal == "SMA" ? sma(macd, signal_length) : ema(macd, signal_length) // Bollinger Bands bbGroup = "Bollindger Bands" length = input(20, title="Length", group=bbGroup) mult = input(2.0, title="StdDev", minval=0.001, maxval=5, group=bbGroup) basis = sma(src, length) dev = mult * stdev(src, length) upper = basis + dev lower = basis - dev // RSI rsiGroup = "RSI" lenRSI = input(14, title="Length", minval=1, group=rsiGroup) // lessThan = input(50, title="Less than", minval=1 , maxval=100, group=rsiGroup) RSI = rsi(src, lenRSI) // Strategy Conditions buy = crossover(macd, signal) and RSI < 50 and close < basis sell = RSI > 70 and close > upper // Stop Loss slGroup = "Stop Loss" useSL = input(false, title="╔══════ Enable ══════╗", group=slGroup, tooltip="If you are using this strategy for Scalping or Futures market, we do not recommend using Stop Loss.") SLbased = input(title="Based on", type=input.string, defval="Percent", options=["ATR", "Percent"], group=slGroup, tooltip="ATR: Average True Range\nPercent: eg. 5%.") multiATR = input(10.0, title="ATR Mult", type=input.float, group=slGroup, inline="atr") lengthATR = input(14, title="Length", type=input.integer, group=slGroup, inline="atr") SLPercent = input(10, title="Percent", type=input.float, group=slGroup) * 0.01 longStop = 0.0 shortStop = 0.0 if SLbased == "ATR" longStop := valuewhen(buy, low, 0) - (valuewhen(buy, rma(tr(true), lengthATR), 0) * multiATR) longStopPrev = nz(longStop[1], longStop) longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop := (valuewhen(sell, rma(tr(true), lengthATR), 0) * multiATR) + valuewhen(sell, high, 0) shortStopPrev = nz(shortStop[1], shortStop) shortStop := close[1] > shortStopPrev ? max(shortStop, shortStopPrev) : shortStop if SLbased == "Percent" longStop := strategy.position_avg_price * (1 - SLPercent) shortStop := strategy.position_avg_price * (1 + SLPercent) strategy.entry("Long", true, when=buy) strategy.close("Long", when=sell, comment="Exit") if useSL strategy.exit("Stop Loss", "Long", stop=longStop)