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


Дата создания: 2023-11-16 17:00:54 Последнее изменение: 2023-12-01 14:59:44
Копировать: 1 Количество просмотров: 648
1
Подписаться
1617
Подписчики

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

Обзор

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

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

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

// 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 - динамический индикатор длиной 1 с исходными данными i_src.

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

Когда mom0 и momX одновременно превышают 0-ую ось, делают больше; когда 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")