이 전략은 양적 거래 전략으로, 이중 이동 평균 크로스오버, RSI 과잉 구매/ 과잉 판매 조건, 리스크-어워드 비율 관리 등을 결합한다. 이 전략은 더 정확한 거래 신호 필터링을 위해 과잉 구매/ 과잉 판매 영역을 식별하기 위해 RSI 지표를 사용하여 단기 및 장기 이동 평균 크로스오버를 통해 시장 트렌드 방향을 결정한다. 또한 ATR 기반의 동적 스톱 로스 설정과 고정된 리스크-어워드 비율 수익 목표 관리 시스템을 통합한다.
이 전략은 트렌드 결정의 기초로 9일 및 21일 이동평균을 사용하며, 신호 확인을 위해 RSI 지표의 과잉 구매/ 과잉 판매 구역 (35/65) 을 사용한다. 긴 입시 조건은 과잉 판매 지역에서 장기 MA와 RSI보다 짧은 기간 MA를 필요로 한다. 짧은 입시에는 과잉 구매 지역에서 장기 MA와 RSI보다 짧은 기간 MA를 필요로 한다. 전략은 스톱-로스 거리 값의 1.5배의 ATR 값을 사용하며 2:1 리스크-어워드 비율을 기반으로 수익 목표를 자동으로 계산한다. 과잉 거래를 방지하기 위해 최소 3시간의 보유 기간이 구현된다.
이 전략은 여러 기술적 지표의 조화를 통해 비교적 완전한 거래 시스템을 구축합니다. 그것은 입시 신호 품질뿐만 아니라 위험 관리 및 수익 목표 설정에도 중점을 둡니다. 최적화 할 수있는 영역이 있지만 전반적인 프레임워크 디자인은 좋은 실용적 가치와 확장 가능성에 합리적입니다. 모듈형 디자인은 후속 최적화에 대한 편의성을 제공합니다.
/*backtest start: 2024-10-01 00:00:00 end: 2024-10-31 23:59:59 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("JakeJohn", overlay=true) // Input parameters smaShortLength = input(9, title="Short SMA Length") smaLongLength = input(21, title="Long SMA Length") lengthRSI = input(14, title="RSI Length") rsiOverbought = input(65, title="RSI Overbought Level") rsiOversold = input(35, title="RSI Oversold Level") riskRewardRatio = input(2, title="Risk/Reward Ratio") // 2:1 atrMultiplier = input(1.5, title="ATR Multiplier") // Multiplier for ATR to set stop loss // Calculate indicators smaShort = ta.sma(close, smaShortLength) smaLong = ta.sma(close, smaLongLength) rsi = ta.rsi(close, lengthRSI) atr = ta.atr(14) // Entry conditions longCondition = (smaShort > smaLong) and (rsi < rsiOversold) // Buy when short SMA is above long SMA and RSI is oversold shortCondition = (smaShort < smaLong) and (rsi > rsiOverbought) // Sell when short SMA is below long SMA and RSI is overbought // Variables for trade management var float entryPrice = na var float takeProfit = na var int entryBarIndex = na // Entry logic for long trades if (longCondition and (strategy.position_size == 0)) entryPrice := close takeProfit := entryPrice + (entryPrice - (entryPrice - (atr * atrMultiplier))) * riskRewardRatio strategy.entry("Buy", strategy.long) entryBarIndex := bar_index // Record the entry bar index label.new(bar_index, high, "BUY", style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small) // Entry logic for short trades if (shortCondition and (strategy.position_size == 0)) entryPrice := close takeProfit := entryPrice - (entryPrice - (entryPrice + (atr * atrMultiplier))) * riskRewardRatio strategy.entry("Sell", strategy.short) entryBarIndex := bar_index // Record the entry bar index label.new(bar_index, low, "SELL", style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small) // Manage trade duration and exit after a minimum of 3 hours if (strategy.position_size != 0) // Check if the trade has been open for at least 3 hours (180 minutes) if (bar_index - entryBarIndex >= 180) // 3 hours in 1-minute bars if (strategy.position_size > 0) strategy.exit("Take Profit Long", from_entry="Buy", limit=takeProfit) else strategy.exit("Take Profit Short", from_entry="Sell", limit=takeProfit) // Background colors for active trades var color tradeColor = na if (strategy.position_size > 0) tradeColor := color.new(color.green, 90) // Light green for long trades else if (strategy.position_size < 0) tradeColor := color.new(color.red, 90) // Light red for short trades else tradeColor := na // No color when no trade is active bgcolor(tradeColor, title="Trade Background") // Plotting position tools if (strategy.position_size > 0) // Plot long position tool strategy.exit("TP Long", limit=takeProfit) if (strategy.position_size < 0) // Plot short position tool strategy.exit("TP Short", limit=takeProfit) // Plotting indicators plot(smaShort, color=color.green, title="Short SMA", linewidth=2) plot(smaLong, color=color.red, title="Long SMA", linewidth=2) // Visual enhancements for RSI hline(rsiOverbought, "Overbought", color=color.red) hline(rsiOversold, "Oversold", color=color.green) plot(rsi, color=color.blue, title="RSI", linewidth=2) // Ensure there's at least one plot function plot(close, color=color.black, title="Close Price", display=display.none) // Hidden plot for compliance