Стратегия торговли на основе силы тренда с несколькими скользящими средними — гибкая интеллектуальная торговая система, основанная на отклонении скользящей средней

MA ATR HTF RR TP SL
Дата создания: 2024-12-11 17:46:33 Последнее изменение: 2024-12-11 17:46:33
Копировать: 0 Количество просмотров: 446
1
Подписаться
1617
Подписчики

Стратегия торговли на основе силы тренда с несколькими скользящими средними — гибкая интеллектуальная торговая система, основанная на отклонении скользящей средней

Обзор

Стратегия представляет собой интеллектуальную торговую систему, основанную на множестве движущихся средних и интенсивности тренда. Она измеряет интенсивность рыночных тенденций, анализируя степень отклонения цены от различных периодических движущихся средних, и в сочетании с индикатором волатильности ATR используется для управления позициями и контроля риска. Стратегия обладает высокой степенью настраиваемости и может гибко корректировать параметры в зависимости от различных рыночных условий и потребностей торговли.

Стратегический принцип

Основная логика стратегии основана на следующих аспектах:

  1. Используйте движущиеся средние с двумя различными циклами (быстрое и медленное) для определения направления тренда и перекрестных сигналов
  2. Количественная интенсивность тренда определяется путем расчета отклонения цены от скользящей средней (в точках)
  3. В сочетании с K-линейной формой (поглощение, дубинка, стреляющая звезда, крест и т. д.) в качестве вспомогательного подтверждающего сигнала
  4. Динамический расчет стоп-лостов и прибыльных целей с использованием ATR
  5. Управление заказами с частичной прибылью и отслеживанием остановок

Стратегические преимущества

  1. Система обладает высокой адаптивностью и может быть скорректирована с помощью параметров для адаптации к различным рыночным условиям
  2. Избегайте частых сделок во время слабых трендов, измеряя силу тренда с помощью отклонения
  3. Повышение надежности торговых сигналов в сочетании с множеством технических показателей и формовой идентификацией
  4. Применение динамического метода остановки убытков, основанного на ATR, для разумного контроля риска
  5. Поддержка двух форм управления капиталом: рекуперативный и фиксированный
  6. Частичная прибыль и слежение за остановкой убытков, эффективная защита прибыли

Стратегический риск

  1. Поскольку на рынке может возникнуть больше ложных сигналов, рекомендуется увеличить фильтрацию показателей колебаний.
  2. Несколько пакетов индикаторов могут привести к упущенным возможностям.
  3. Слишком оптимизированные параметры могут привести к риску перенастройки
  4. Большие сделки могут быть подвержены риску скольжения на рынках с низкой ликвидностью
  5. Необходимо разумно установить стоп-раздел, чтобы избежать слишком больших одноразовых потерь.

Направление оптимизации стратегии

  1. В качестве вспомогательного индикатора подтверждения тенденции может быть добавлен показатель объема сделок
  2. Рассматривается возможность внедрения динамически корректируемой частоты торгов
  3. Фильтрация сигналов на основе согласованности тенденций в разные периоды времени
  4. Добавление дополнительных вариантов, таких как временная остановка
  5. Разработать адаптивные механизмы оптимизации параметров для улучшения адаптивности стратегии

Подвести итог

Стратегия создает всеобъемлющую торговую систему, которая сочетает в себе движущиеся средние, количественное измерение интенсивности тренда, K-линейную форму и динамическое управление рисками. Она сохраняет простоту логики стратегии и повышает надежность сделки с помощью механизма многократного подтверждения. Высокая настраиваемость стратегии позволяет ей адаптироваться к различным стилям торговли и рыночным условиям, но при использовании следует обращать внимание на оптимизацию параметров и контроль риска.

Исходный код стратегии
/*backtest
start: 2024-12-03 00:00:00
end: 2024-12-10 00:00:00
period: 10m
basePeriod: 10m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Customizable Strategy with Signal Intensity Based on Pips Above/Below MAs", overlay=true)

// Customizable Inputs
// Account and Risk Management
account_size = input.int(100000, title="Account Size (USD)", minval=1)
compounded_results = input.bool(true, title="Compounded Results")
risk_per_trade = input.float(1.0, title="Risk per Trade (%)", minval=0.1, maxval=100) / 100

// Moving Averages Settings
ma1_length = input.int(50, title="Moving Average 1 Length", minval=1)
ma2_length = input.int(200, title="Moving Average 2 Length", minval=1)

// Higher Time Frame for Moving Averages
ma_htf = input.timeframe("D", title="Higher Time Frame for MA Delay")

// Signal Intensity Range based on pips
signal_intensity_min = input.int(0, title="Signal Intensity Start (Pips)", minval=0, maxval=1000)
signal_intensity_max = input.int(1000, title="Signal Intensity End (Pips)", minval=0, maxval=1000)

// ATR-Based Stop Loss and Take Profit
atr_length = input.int(14, title="ATR Length", minval=1)
atr_multiplier_stop = input.float(1.5, title="Stop Loss Size (ATR Multiplier)", minval=0.1)
atr_multiplier_take_profit = input.float(2.5, title="Take Profit Size (ATR Multiplier)", minval=0.1)

// Trailing Stop and Partial Profit
trailing_stop_rr = input.float(2.0, title="Trailing Stop (R:R)", minval=0)
partial_profit_percentage = input.float(50, title="Take Partial Profit (%)", minval=0, maxval=100)

// Trend Filter Settings
trend_filter_enabled = input.bool(true, title="Trend Filter Enabled")
trend_filter_sensitivity = input.float(50, title="Trend Filter Sensitivity", minval=0, maxval=100)

// Candle Pattern Type for Entry
entry_candle_type = input.string("Any", title="Entry Candle Type", options=["Any", "Engulfing", "Hammer", "Shooting Star", "Doji"])

// Moving Average Entry Conditions
ma_entry_condition = input.string("Both", title="MA Entry", options=["Fast Above Slow", "Fast Below Slow", "Both"])

// Trade Direction (Long, Short, or Both)
trade_direction = input.string("Both", title="Trade Direction", options=["Long", "Short", "Both"])

// ATR Calculation
atr_value = ta.atr(atr_length)

// Moving Average Calculations (using Higher Time Frame)
ma1_htf = ta.sma(request.security(syminfo.tickerid, ma_htf, close), ma1_length)
ma2_htf = ta.sma(request.security(syminfo.tickerid, ma_htf, close), ma2_length)

// Candle Pattern Conditions
is_engulfing = close[1] < open[1] and close > open and high > high[1] and low < low[1]
is_hammer = (high - low) > 3 * (close - open) and (close > open) and (low == ta.lowest(low, 5))
is_shooting_star = (high - low) > 3 * (open - close) and (open > close) and (high == ta.highest(high, 5))
is_doji = (close - open) <= ((high - low) * 0.1)

// Apply the selected candle pattern
candle_condition = false
if entry_candle_type == "Any"
    candle_condition := true
if entry_candle_type == "Engulfing"
    candle_condition := is_engulfing
if entry_candle_type == "Hammer"
    candle_condition := is_hammer
if entry_candle_type == "Shooting Star"
    candle_condition := is_shooting_star
if entry_candle_type == "Doji"
    candle_condition := is_doji

// Moving Average Entry Conditions
ma_cross_above = ta.crossover(ma1_htf, ma2_htf)
ma_cross_below = ta.crossunder(ma1_htf, ma2_htf)

// Calculate pips distance to MAs and normalize it for signal intensity
pip_size = syminfo.mintick * 10  // Assuming Forex; for other asset classes, modify as needed

// Calculate distances in pips between price and MAs
distance_to_ma1_pips = math.abs(close - ma1_htf) / pip_size
distance_to_ma2_pips = math.abs(close - ma2_htf) / pip_size

// Calculate signal intensity based on the pips distance
// Normalize the signal intensity between the user-specified min and max
signal_intensity = math.min(math.max((distance_to_ma1_pips + distance_to_ma2_pips), signal_intensity_min), signal_intensity_max)

// Trend Filter Condition (Optional)
trend_condition = false
if trend_filter_enabled
    trend_condition := ta.sma(close, ma2_length) > ta.sma(close, ma2_length + int(trend_filter_sensitivity))

// Entry Conditions Based on MA, Candle Patterns, and Trade Direction
long_condition = (trade_direction == "Long" or trade_direction == "Both") and (ma_entry_condition == "Fast Above Slow" or ma_entry_condition == "Both") and ma_cross_above and candle_condition and (not trend_filter_enabled or trend_condition) and signal_intensity > signal_intensity_min
short_condition = (trade_direction == "Short" or trade_direction == "Both") and (ma_entry_condition == "Fast Below Slow" or ma_entry_condition == "Both") and ma_cross_below and candle_condition and (not trend_filter_enabled or not trend_condition) and signal_intensity > signal_intensity_min

// Position Sizing Based on Risk Per Trade and ATR for Stop Loss
risk_amount = account_size * risk_per_trade
stop_loss_atr = atr_multiplier_stop * atr_value

// Calculate the position size based on the risk amount and ATR stop loss
position_size = risk_amount / stop_loss_atr

// If compounded results are not enabled, adjust position size for non-compounded returns
if not compounded_results
    position_size := position_size / account_size * 100000  // Adjust for non-compounded results

// Convert take profit and stop loss from ATR to USD
pip_value = syminfo.mintick * 10  // Assuming Forex; for other asset classes, modify as needed
take_profit_atr = atr_multiplier_take_profit * atr_value
take_profit_usd = (take_profit_atr * pip_value) * position_size
stop_loss_usd = (stop_loss_atr * pip_value) * position_size

// Trailing Stop
trail_stop_level = trailing_stop_rr * stop_loss_atr

// Initialize long_box_id and short_box_id as boxes (not ints)
var box long_box_id = na
var box short_box_id = na

// Track Monthly Profit
var float monthly_profit = 0.0
if (month(timenow) != month(timenow[1]))  // New month
    monthly_profit := 0

// Long Trade Management
if long_condition
    strategy.entry("Long", strategy.long, qty=position_size)
    // Partial Profit at 50% position close when 1:1 risk/reward
    strategy.exit("Partial Profit", from_entry="Long", limit=strategy.position_avg_price + stop_loss_atr, qty_percent=partial_profit_percentage / 100)
    // Full take profit and stop loss with trailing stop
    strategy.exit("Take Profit Long", from_entry="Long", limit=strategy.position_avg_price + take_profit_atr, stop=strategy.position_avg_price - stop_loss_atr, trail_offset=trail_stop_level)

    // Delete the old box if it exists
    if not na(long_box_id)
        box.delete(long_box_id)
    
    // Plot Take Profit and Stop Loss for Long Positions
    // long_box_id := box.new(left=bar_index - 1, top=strategy.position_avg_price + take_profit_atr, right=bar_index, bottom=strategy.position_avg_price - stop_loss_atr, bgcolor=color.new(color.green, 90), border_width=1, border_color=color.new(color.green, 0))

// Short Trade Management
if short_condition
    strategy.entry("Short", strategy.short, qty=position_size)
    // Partial Profit at 50% position close when 1:1 risk/reward
    strategy.exit("Partial Profit", from_entry="Short", limit=strategy.position_avg_price - stop_loss_atr, qty_percent=partial_profit_percentage / 100)
    // Full take profit and stop loss with trailing stop
    strategy.exit("Take Profit Short", from_entry="Short", limit=strategy.position_avg_price - take_profit_atr, stop=strategy.position_avg_price + stop_loss_atr, trail_offset=trail_stop_level)

    // Delete the old box if it exists
    // if not na(short_box_id)
    //     box.delete(short_box_id)

    // Plot Take Profit and Stop Loss for Short Positions
    // short_box_id := box.new(left=bar_index - 1, top=strategy.position_avg_price + stop_loss_atr, right=bar_index, bottom=strategy.position_avg_price - take_profit_atr, bgcolor=color.new(color.red, 90), border_width=1, border_color=color.new(color.red, 0))

// Plot MAs and Signals
plot(ma1_htf, color=color.blue, title="MA1 (HTF)")
plot(ma2_htf, color=color.red, title="MA2 (HTF)")
plotshape(series=long_condition, location=location.belowbar, color=color.green, style=shape.labelup, title="Buy Signal", text="BUY")
plotshape(series=short_condition, location=location.abovebar, color=color.red, style=shape.labeldown, title="Sell Signal", text="SELL")