В процессе загрузки ресурсов... загрузка...

EMA/SMA Trend Following with Swing Trading Strategy Комбинированный фильтр объема и процентная система получения прибыли/остановки потерь

Автор:Чао Чжан, Дата: 2024-12-11 15:12:35
Тэги:ЕМАSMA

img

Обзор

Эта стратегия является всеобъемлющей торговой системой, которая сочетает в себе методы торговли сдвигом, использование кроссоверов EMA и SMA, идентификацию высокого / низкого сдвига, фильтрацию объема и механизмы получения прибыли и остановки потерь на основе процентов.

Принципы стратегии

Стратегия использует многоуровневый механизм фильтрации сигнала, начиная с EMA ((10) и SMA ((21) кроссоверов для определения основного тренда, затем используя 6-барные переломные точки левого/правого поворота для времени входа, требуя при этом объема выше 200-периодного скользящего среднего для обеспечения достаточной ликвидности. Система использует 2% прибыли и 1% последующего стоп-лоса для управления рисками. Долгие позиции инициируются, когда цена превышает подвижные максимумы с подтверждением объема; короткие позиции принимаются, когда цена превышает подвижные минимумы с подтверждением объема.

Преимущества стратегии

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

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

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

Руководство по оптимизации

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

Резюме

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


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Strategy combining EMA/SMA Crossover, Swing High/Low, Volume Filtering, and Percentage TP & Trailing Stop
strategy("Swing High/Low Strategy with Volume, EMA/SMA Crossovers, Percentage TP and Trailing Stop", overlay=true)

// --- Inputs ---
source = close
TITLE = input(false, title='Enable Alerts & Background Color for EMA/SMA Crossovers')
turnonAlerts = input(true, title='Turn on Alerts?')
colorbars = input(true, title="Color Bars?")
turnonEMASMA = input(true, title='Turn on EMA1 & SMA2?')
backgroundcolor = input(false, title='Enable Background Color?')

// EMA/SMA Lengths
emaLength = input.int(10, minval=1, title='EMA Length')
smaLength = input.int(21, minval=1, title='SMA Length')
ema1 = ta.ema(source, emaLength)
sma2 = ta.sma(source, smaLength)

// Swing High/Low Lengths
leftBars = input.int(6, title="Left Bars for Swing High/Low", minval=1)
rightBars = input.int(6, title="Right Bars for Swing High/Low", minval=1)

// Volume MA Length
volMaLength = input.int(200, title="Volume Moving Average Length")

// Percentage Take Profit with hundredth place adjustment
takeProfitPercent = input.float(2.00, title="Take Profit Percentage (%)", minval=0.01, step=0.01) / 100

// Trailing Stop Loss Option
useTrailingStop = input.bool(true, title="Enable Trailing Stop Loss?")
trailingStopPercent = input.float(1.00, title="Trailing Stop Loss Percentage (%)", minval=0.01, step=0.01) / 100

// --- Swing High/Low Logic ---
pivotHigh(_leftBars, _rightBars) =>
    ta.pivothigh(_leftBars, _rightBars)

pivotLow(_leftBars, _rightBars) =>
    ta.pivotlow(_leftBars, _rightBars)

ph = fixnan(pivotHigh(leftBars, rightBars))
pl = fixnan(pivotLow(leftBars, rightBars))

// --- Volume Condition ---
volMa = ta.sma(volume, volMaLength)

// Declare exit conditions as 'var' so they are initialized
var bool longExitCondition = na
var bool shortExitCondition = na

// --- Long Entry Condition: Close above Swing High & Volume >= 200 MA ---
longCondition = (close > ph and volume >= volMa)
if (longCondition)
    strategy.entry("Long", strategy.long)

// --- Short Entry Condition: Close below Swing Low & Volume >= 200 MA ---
shortCondition = (close < pl and volume >= volMa)
if (shortCondition)
    strategy.entry("Short", strategy.short)

// --- Take Profit and Trailing Stop Logic ---

// For long position: Set take profit at the entry price + takeProfitPercent
longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercent)
shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercent)

// --- Long Exit Logic ---
if (useTrailingStop)
    // Trailing Stop for Long
    strategy.exit("Long Exit", "Long", stop=na, trail_offset=strategy.position_avg_price * trailingStopPercent, limit=longTakeProfitLevel)
else
    // Exit Long on Take Profit only
    strategy.exit("Long Exit", "Long", limit=longTakeProfitLevel)

// --- Short Exit Logic ---
if (useTrailingStop)
    // Trailing Stop for Short
    strategy.exit("Short Exit", "Short", stop=na, trail_offset=strategy.position_avg_price * trailingStopPercent, limit=shortTakeProfitLevel)
else
    // Exit Short on Take Profit only
    strategy.exit("Short Exit", "Short", limit=shortTakeProfitLevel)

// --- Plot Swing High/Low ---

plot(ph, style=plot.style_circles, linewidth=1, color=color.blue, offset=-rightBars, title="Swing High")
plot(ph, style=plot.style_line, linewidth=1, color=color.blue, offset=0, title="Swing High")
plot(pl, style=plot.style_circles, linewidth=1, color=color.red, offset=-rightBars, title="Swing High")
plot(pl, style=plot.style_line, linewidth=1, color=color.red, offset=0, title="Swing High")
// --- Plot EMA/SMA ---
plot(turnonEMASMA ? ema1 : na, color=color.green, title="EMA")
plot(turnonEMASMA ? sma2 : na, color=color.orange, title="SMA")

// --- Alerts ---
alertcondition(longCondition, title="Long Entry", message="Price closed above Swing High with Volume >= 200 MA")
alertcondition(shortCondition, title="Short Entry", message="Price closed below Swing Low with Volume >= 200 MA")

// --- Bar Colors for Visualization ---
barcolor(longCondition ? color.green : na, title="Long Entry Color")
barcolor(shortCondition ? color.red : na, title="Short Entry Color")
bgcolor(backgroundcolor ? (ema1 > sma2 ? color.new(color.green, 50) : color.new(color.red, 50)) : na)

Связанные

Больше