Стратегия движущейся средней является стратегией торговли акциями, которая сочетает в себе движущиеся средние сигналы с индикаторами импульса. Стратегия использует несколько технических индикаторов, включая экспоненциальную движущуюся среднюю (EMA), простую движущуюся среднюю (SMA), движущуюся среднюю конвергентную дивергенцию (MACD) и модифицированный индекс относительной силы (StockRSI), чтобы генерировать сигналы покупки при подтверждении восходящей долгосрочной тенденции. Когда краткосрочные индикаторы импульса показывают сигналы обратного движения, стратегия получает прибыль.
Ключевыми компонентами этой стратегии являются:
Кроссовер EMA/SMA: 9-периодическая быстрая линия EMA пересекает 21-периодическую медленную линию SMA для запуска сигнала покупки.
Индикатор MACD: Истограмма MACD должна быть положительной в сочетании с перекрестным сигналом EMA/SMA в качестве дополнительного подтверждения.
Индикатор StockRSI: Сигналы запускаются, когда StockRSI выше уровня OVERBOUGHT (80) или ниже уровня OVERSOLD (20).
Боллингерские полосы: Требовать, чтобы цена находилась в диапазонах, где средняя полоса представляет собой 20-периодную SMA, а ширина диапазонов составляет два стандартных отклонения.
Перестаньте терять и получайте прибыль: рассчитывается на основе 14-периодного ATR.
Стратегия требует, чтобы по крайней мере 2 из 3 индикаторов давали сигналы покупки, цена находится в диапазоне полос Боллинджера, а долгосрочный тренд остается бычьим, чтобы генерировать окончательный сигнал покупки.
Ключевыми достоинствами этой стратегии являются:
Отличные результаты обратных тестов: Многочисленные проверенные показатели приводят к превосходству над ориентиром и отдельными показателями.
Оптимальные параметры: Ключевые параметры, такие как периоды EMA и полосы Боллинджера, оптимизированы для повышения стабильности.
Автоматизированная остановка потерь/прибыль: Болинджерские полосы и ATR позволяют динамически регулировать остановки для лучшего контроля риска.
Легко применяется: Чистая кодовая структура и легкий доступ к данным позволяют осуществлять простые практические операции.
Несмотря на хорошие результаты, основные риски включают:
Ложные сигналы: Необычные колебания рынка или сбои показателей могут генерировать неправильные сигналы.
Недостаточные параметры: Неправильные параметры могут привести к чрезмерной частоте торговли или недостаточной чувствительности.
Неуместный стоп-лоссСтрогий стоп-лосс имеет тенденцию к преждевременному прекращению, в то время как слишком широкий стоп-лосс может привести к чрезмерным потерям.
Для устранения вышеуказанных рисков могут быть приняты следующие меры:
Ручное вмешательство: В ненормальных ситуациях сигналы могут быть проверены вручную, параметры перенаправлены или стратегии временно остановлены.
Оптимизация параметров: Для систематической оптимизации можно использовать более научные и объективные методы, такие как генетические алгоритмы.
Скорректированные по волатильности остановки: диапазоны стоп-лосса могут быть установлены в 1-3 раза выше ATR для учета волатильности.
Стратегия может быть улучшена в следующих областях:
Более надежные механизмы остановки потерь: могут быть включены стоп-лосс или стопы, основанные на скользящих средних.
Фильтры объема: Добавление показателей объема для предотвращения ложных прорывов.
Динамические параметры: автоматическая оптимизация параметров, таких как скользящие средние периоды и ширина диапазона на основе меняющихся рыночных условий.
Машинное обучение: LSTM, RNN и другие алгоритмы позволяют динамически оптимизировать параметры.
Стратегия Momentum Breakout Moving Average использует преимущества сочетания нескольких технических индикаторов и достигла приличной прибыльности с долгосрочным и краткосрочным подтверждением.
/*backtest start: 2022-11-20 00:00:00 end: 2023-11-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true) // Volatility volatility = ta.atr(14) // EMA/MA Crossover fast_length = 9 slow_length = 21 fast_ma = ta.ema(close, fast_length) slow_ma = ta.sma(close, slow_length) crossover_signal = ta.crossover(fast_ma, slow_ma) // MACD [macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9) macd_signal = crossover_signal and (macdHistogram > 0) // Bollinger Bands source = close basis = ta.sma(source, 20) upper = basis + 2 * ta.stdev(source, 20) lower = basis - 2 * ta.stdev(source, 20) // Fractal-based Support and Resistance levels isFractalHigh = high[2] < high[1] and high[1] > high[0] isFractalLow = low[2] > low[1] and low[1] < low[0] resistance = ta.valuewhen(isFractalHigh, high[1], 0) support = ta.valuewhen(isFractalLow, low[1], 0) // StockRSI length = 14 K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length)) D = ta.sma(K, 3) overbought = 80 oversold = 20 stockrsi_signal = ((K < D) and (K < oversold)) or ((K > D) and (K > overbought)) // Buy and sell conditions mandatory_buy_conditions = (crossover_signal ? 1 : 0) + (macd_signal ? 1 : 0) + (stockrsi_signal ? 1 : 0) // Long-term Trend Check long_term_ma = ta.sma(close, 200) long_term_bullish = close > long_term_ma long_term_bearish = close < long_term_ma // Plot the long-term MA for visual clarity plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1) // Simplified Buy and Sell conditions buy_condition = long_term_bullish and (mandatory_buy_conditions >= 2) and (close > lower) and (close < upper) sell_condition = (macdHistogram < 0) and (K > D) and (K > overbought) // Potential SL and TP based on volatility potential_SL = close - volatility potential_TP = close + 2 * volatility plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr) plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr) // ... (rest of your code above) // State variable to track if we're in a position, a counter for trades, and a delayed counter for plotting var bool inPosition = false var tradeCounter = 0 var tradeCounterDelayed = 0 // Declaration of the variable // Buy logic: Check if tradeCounter is 0 and the buy condition is met if tradeCounter == 0 and buy_condition strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP) inPosition := true tradeCounter := tradeCounter + 1 // Sell logic: Check if tradeCounter is 1, the sell condition is met, and we are in a position if tradeCounter == 1 and inPosition and sell_condition strategy.close("BUY") inPosition := false tradeCounter := tradeCounter - 1 // Update the delayed trade counter: tradeCounterDelayed := tradeCounter // Plotting bgcolor(buy_condition ? color.new(color.green, 90) : sell_condition ? color.new(color.red, 90) : na) plotshape(series=buy_condition and tradeCounterDelayed == 0, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small) plotshape(series=sell_condition and tradeCounterDelayed == 1, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small) // ... (rest of your code if any)