Стратегия среднего обратного конверта скользящего среднего

Автор:Чао Чжан, Дата: 2023-12-04 16:12:39
Тэги:

img

Обзор

Стратегия средней реверсионной конвертной скользящей средней является средней реверсионной торговой стратегией, основанной на скользящих средних. Она использует двойную экспоненциальную скользящую среднюю (DEMA) в качестве базового расчета и добавляет несколько конвертов выше и ниже нее. Когда цена касается полос конверта, она открывает длинные или короткие позиции на основе направления. Когда цена регрессирует к скользящей средней, она закрывает все позиции.

Логика стратегии

Стратегия использует двойную экспоненциальную скользящую среднюю (DEMA) в качестве базового индикатора, которая является скользящей средней, которая более чувствительна к недавним изменениям цен. Выше и ниже DEMA несколько ценовых диапазонов добавляются, чтобы сформировать зону конверта. Диапазон конверта устанавливается пользователем с фиксированным процентным интервалом между каждой полосой.

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

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

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

  • Использует двойную экспоненциальную скользящую среднюю, которая чувствительна к краткосрочным изменениям цен для улавливания переворотов тренда.
  • Полосы оболочек вокруг скользящей средней могут точно отражать изменение цен.
  • Открывает позиции по партиям, полностью используя эффективность капитала.
  • После получения прибыли быстро меняйте направление, чтобы адаптироваться к изменениям на рынке.
  • Параметры можно свободно оптимизировать.

Риски

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

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

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

Стратегия может быть оптимизирована в следующих аспектах:

  1. Проверьте различные алгоритмы скользящих средних.

  2. Корректировать параметр длины скользящей средней для лучшего адаптации к краткосрочным колебаниям.

  3. Оптимизировать параметры конверта путем тестирования различных процентных параметров.

  4. Добавьте методы остановки потери, такие как отслеживание остановки потери, чтобы ограничить однократную потерю.

  5. Добавить условия фильтрации с другими показателями, чтобы избежать недействительных входов на иррациональные рынки.

Заключение

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


/*backtest
start: 2022-11-27 00:00:00
end: 2023-12-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Mean Reversion - Envelope Strategy", overlay=true )

// ----------------------- DESCRIPTION -----------------------
// THIS SCRIPT IS A MEAN REVERSION SYSTEM THAT USES A MOVING AVERAGE AS BASE CALCULATION AND A % OF THIS MOVING AVERAGE TO CALCULATE THE ENVELOPE
// BY DEFAULT, THE SYSTEM WILL PLACE LONG ORDERS ON THE MOVING AVERAGE -5% PER ENVELOPE COUNT (5%, 10% AND SO ON...)
// YOU CAN ENABLE THE SHORT ORDERS THAT WILL FOLLOW THE SAME LOGIC ON THE OPPOSITE SIDE
// THE SYSTEM WILL CLOSE EVERY ONGOING TRADE WHEN THE PRICE RETURNS TO THE MEAN

// ---------------------------------------------
// ---------------- SETTINGS -------------------
src = input(close, "Moving Average Source", group = "Moving Average")
ma_window = input.int(5, "Moving Average Window", step = 1, group = "Moving Average")
ma_type = input.string('4. DEMA', "Moving Average Type", options=['1. SMA', '2. EMA', '3. RMA', '4. DEMA'], group = "Moving Average")
enveloppe_step = input.float(0.05, "Delta Per Enveloppe", step = 0.01, group = "Envelope")
envelope_count = input.int(5, "Envelope count", options = [1, 2, 3, 4, 5], group = "Envelope")
use_longs = input.bool(true, 'Use Long Orders ?', group = "Orders") 
use_short = input.bool(false, 'Use Short Orders ?', group = "Orders")


// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_funct() =>
    if(ma_type == '1. SMA') 
        ta.sma(src, ma_window)
    if(ma_type == '2. EMA') 
        ta.ema(src, ma_window)
    if(ma_type == '3. RMA') 
        ta.rma(src, ma_window)
    if(ma_type == '4. DEMA') 
        2 * ta.ema(src, ma_window) - ta.ema(ta.ema(src, ma_window), ma_window)

ma_base = ma_funct()

ma_high_1 = envelope_count > 0 ? ma_base * (1 + enveloppe_step) : na
ma_high_2 = envelope_count > 1 ? ma_base * (1 + enveloppe_step * 2) : na
ma_high_3 = envelope_count > 2 ? ma_base * (1 + enveloppe_step * 3) : na
ma_high_4 = envelope_count > 3 ? ma_base * (1 + enveloppe_step * 4) : na
ma_high_5 = envelope_count > 4 ? ma_base * (1 + enveloppe_step * 5) : na

ma_low_1 = envelope_count > 0 ? ma_base * (1 - enveloppe_step) : na
ma_low_2 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 2) : na
ma_low_3 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 3) : na
ma_low_4 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 4) : na
ma_low_5 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 5) : na


// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / envelope_count))


if use_short
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / envelope_count))

strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)


Больше