이 전략은 달의 위기 주기를 거래 신호로 사용하고 RSI, MACD, OBV 및 기타 지표와 결합하여 비트코인과 같은 암호화폐의 거래 기회를 식별합니다. 이 전략의 주요 장점은 외적인 요소인 달의 위기를 거래 트리거로 활용하는 것입니다. 이는 기술 지표에만 의존하는 대부분의 전략과는 다릅니다. 따라서 어느 정도 시장 조작을 피할 수 있습니다.
이 전략의 핵심 논리는 달 위기 주기의 다른 단계에 따라 긴 또는 짧은 기회를 결정하는 것입니다. 달 위기는 다음과 같이 계산됩니다.
달 위상 주기의 길이는 = 29.5305882 일
정월 시간 을 알면 그 정월 부터 현재 시간 까지의 날 수 를 계산 할 수 있다
달 연령 = 알려진 보름달 이후의 날 % 달 위상 주기의 길이가
달 위상 값 = (1 + cos ((달 연령 / 달 위상 주기의 길이가 * 2 * π)) / 2
달의 위상 값은 0에서 1 사이로 변동합니다. 값이 클수록 보름달에 더 가깝다는 것을 의미하며, 값이 작으면 신달에 더 가깝다는 것을 의미합니다.
이 전략은 달 위상 임계값에 따라 긴 또는 짧은 기회를 판단합니다. 달 위상 값이 긴 임계값 (0.51 기본값) 보다 크다면, 길게 갈 가능성이 있습니다. 달 위상 값이 짧은 임계값 (0.49 기본값) 보다 작다면, 짧게 갈 가능성이 있습니다.
또한, 전략은 거래량, RSI 및 MACD와 같은 지표를 결합하여 불리한 조건에서 거래 신호를 피합니다. 거래량이 급증하고 RSI 및 MACD 신호가 일치 할 때만 포지션을 개척합니다.
이 전략의 주요 장점:
요약하자면 이 전략은 달 위기의 특유의 장점을 최대한 활용하고, 높은 확률의 거래 기회를 식별하기 위해 여러 기술적 지표를 결합하며, 거래 위험을 효과적으로 정의하기 위해 위험 통제 메커니즘을 활용합니다.
이 전략의 주요 위험은 다음과 같습니다.
이러한 위험을 통제하기 위해 다음과 같은 조치를 취할 수 있습니다.
매개 변수 최적화와 조합된 지표로 거래 위험을 크게 완화할 수 있습니다.
이 전략의 더 많은 최적화를 위한 여지가 있습니다.
이 전략은 독특한 달 단계 거래 신호를 통해 효율적인 비트코인 거래를 실현하고, 주류 기술 지표와 결합한다. 단일 지표 전략에 비해, 이 전략은 시장 조작 위험으로부터 더 잘 헤지 할 수 있으며 독특한 이점을 가지고 있다. 위험을 방지하기 위해 스톱 로스를 활용하고 매개 변수 최적화를 통해 안정적이고 좋은 수익을 얻을 수 있다. 이 전략은 여전히 개선할 여지가 많으며 유망한 응용 전망이 있다.
/*backtest start: 2023-01-08 00:00:00 end: 2024-01-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Lunar Phase Strategy by Symphoenix", overlay=true) // Input parameters start_year = input(2023, title="Start year") end_year = input(2023, title="End year") longPhaseThreshold = input(0.51, title="Long Phase Threshold") shortPhaseThreshold = input(0.49, title="Short Phase Threshold") riskPerTrade = input(0.05, title="Risk Per Trade (as a % of Equity)") stopLossPerc = input(0.01, title="Stop Loss Percentage") atrLength = input(21, title="ATR Length for Volatility") trailPerc = input(0.1, title="Trailing Stop Percentage") maxDrawdownPerc = input(0.1, title="Maximum Drawdown Percentage") volumeLength = input(7, title="Volume MA Length") // Constants for lunar phase calculation and ATR atr = ta.atr(atrLength) volMA = ta.sma(volume, volumeLength) // Volume moving average // Improved Lunar Phase Calculation calculateLunarPhase() => moonCycleLength = 29.5305882 daysSinceKnownFullMoon = (time - timestamp("2019-12-12T05:12:00")) / (24 * 60 * 60 * 1000) lunarAge = daysSinceKnownFullMoon % moonCycleLength phase = ((1 + math.cos(lunarAge / moonCycleLength * 2 * math.pi)) / 2) phase lunarPhase = calculateLunarPhase() // Advanced Volume Analysis priceChange = ta.change(close) obv = ta.cum(priceChange > 0 ? volume : priceChange < 0 ? -volume : 0) // Additional Technical Indicators rsi = ta.rsi(close, 14) [macdLine, signalLine, _] = ta.macd(close, 12, 26, 9) // Calculate Position Size based on Volatility and Account Equity calculatePositionSize() => equity = strategy.equity riskAmount = equity * riskPerTrade positionSize = riskAmount / atr if positionSize > 1000000000000 positionSize := 1000000000000 positionSize positionSize = calculatePositionSize() // Maximum Drawdown Tracking var float maxPortfolioValue = na maxPortfolioValue := math.max(maxPortfolioValue, strategy.equity) drawdown = (maxPortfolioValue - strategy.equity) / maxPortfolioValue // Check for maximum drawdown if drawdown > maxDrawdownPerc strategy.close_all() strategy.cancel_all() // Volume Analysis isVolumeConfirmed = volume > volMA // Date Check for Backtesting Period isWithinBacktestPeriod = year >= start_year and year <= end_year // Entry and Exit Conditions // Adjusted Entry and Exit Conditions longCondition = lunarPhase > longPhaseThreshold and lunarPhase < 0.999 and isVolumeConfirmed and obv > obv[1] and rsi < 70 and macdLine > signalLine and isWithinBacktestPeriod shortCondition = lunarPhase < shortPhaseThreshold and lunarPhase > 0.001 and isVolumeConfirmed and obv < obv[1] and rsi > 30 and macdLine < signalLine and isWithinBacktestPeriod if longCondition if strategy.position_size < 0 strategy.close_all() if strategy.position_size < positionSize strategy.entry("Long", strategy.long, qty=positionSize) strategy.exit("Exit Long", "Long", trail_offset=atr * trailPerc, trail_points=atr) if shortCondition if strategy.position_size > 0 strategy.close_all() if strategy.position_size > -positionSize strategy.entry("Short", strategy.short, qty=positionSize) strategy.exit("Exit Short", "Short", trail_offset=atr * trailPerc, trail_points=atr) // Implementing Stop-Loss Logic longStopLoss = strategy.position_avg_price * (1 - stopLossPerc) shortStopLoss = strategy.position_avg_price * (1 + stopLossPerc) if strategy.position_size > 0 and close < longStopLoss strategy.close("Long") if strategy.position_size < 0 and close > shortStopLoss strategy.close("Short")