Стратегия двойного импульса

Автор:Чао Чжан, Дата: 2023-11-16 17:00:54
Тэги:

img

Обзор

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

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

Код сначала устанавливает свойства стратегии, такие как тип ордера, схема комиссии и т. д. Затем он вычисляет два индикатора импульса:

// Momentum settings
****
i_len           = input(defval = 12, title = "Length", minval = 1)
i_src           = input(defval = close, title = "Source")  
i_percent       = input(defval = true, title = "Percent?")
i_mom           = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"])

// Momentum code 

mom0 = momentum(i_src, i_len, i_percent)
mom1 = momentum(mom0, 1, i_percent) 
mom2 = momentum(i_src, 1, i_percent)

momX = mom1   

if i_mom == "MOM2"
    momX := mom2

mom0 - базовый индикатор импульса с длиной i_len, источник данных i_src, вычислять ли процент решается i_percent.

mom1 - это индикатор импульса с mom0 как источником данных и длиной 1.

mom2 - это индикатор импульса с исходными данными i_src как источник и длиной 1.

По умолчанию индикатор импульса momX выбирает mom1, а также mom2.

Когда mom0 и momX обоих пересекают линию 0, мы идем длинным.

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

  1. Использование двойных индикаторов импульса с различными настройками улучшает надежность сигнала с двойным подтверждением и меньшим количеством ложных сигналов.

  2. Только длинные входы и использование коротких для выходов снижает частоту торговли и снижает затраты на транзакции.

  3. Гибкие настройки параметров импульса подходят для различных рыночных условий.

  4. Чистая структура кода, легкая для понимания и модификации.

  5. Торговые сообщения включены, хорошо интегрируются с автоматическими торговыми системами.

Риски стратегии

  1. Двойной импульс может пропустить более слабые сигналы тренда, уменьшая ложные сигналы.

  2. Пропускает короткие торговые возможности с длинными записями.

  3. Неправильное настройка параметров импульса приводит к чрезмерной торговле или задержке сигналов.

  4. Недостаточные данные обратного теста приводят к перенастройке параметров.

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

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

  1. Испытайте комбинации параметров длины и процента для определения оптимального.

  2. Подумайте о добавлении коротких торговых сигналов после подтверждения тренда, чтобы получить больше сделок.

  3. Испытывайте различные расчеты импульса, такие как ROC, RSI и т. Д., Для получения лучших результатов.

  4. Добавьте фильтрацию трендов, чтобы избежать рынков.

  5. Оптимизировать стоп-лосс для максимальной прибыльности в пределах риска.

Заключение

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


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Momentum Long Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true)

// There will be no short entries, only exits from long.
strategy.risk.allow_entry_in(strategy.direction.long)

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time)
 
time_cond  =true

// Momentum settings

i_len           =       input(defval = 12,      title = "Length",       minval = 1)
i_src           =       input(defval = close,   title = "Source")
i_percent       =       input(defval = true,    title = "Percent?")
i_mom           =       input(defval = "MOM2",  title = "MOM Choice",   options = ["MOM1", "MOM2"])

// Messages for buy and sell
message_buy  = input("{{strategy.order.alert_message}}", title="Buy message")
message_sell = input("{{strategy.order.alert_message}}", title="Sell message")

// Momentum code

momentum(seria, length, percent) =>
	_mom        =       percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length]
	_mom

mom0        =       momentum(i_src, i_len, i_percent)
mom1        =       momentum(mom0, 1, i_percent)
mom2        =       momentum(i_src, 1, i_percent)

momX        =       mom1

if i_mom == "MOM2"
    momX    :=     mom2
    
// Strategy Alerts    

if (mom0 > 0 and momX > 0 and time_cond)
    strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy)
else
	strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
	strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell)
else
	strategy.cancel("MomExit")
	
// Plotting

plot(0, color = #5d606b, title = "ZERO")
plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")

Больше