
Эта стратегия основана на цикле лунных фаз в качестве торгового сигнала, в сочетании с несколькими показателями, такими как 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")