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


Дата создания: 2023-11-13 17:46:01 Последнее изменение: 2023-11-13 17:46:01
Копировать: 0 Количество просмотров: 883
1
Подписаться
1617
Подписчики

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

Обзор

Стратегия основана на LazyBear’s Compression Momentum Indicator, в сочетании с Brin Belt и Keltner Channel, идентифицирует сжатие и расширение, образовавшееся в ценовом прорыве, определяет направление потенциальной тенденции цен на акции, использует метод отслеживания тенденций для определения направления открытия позиции. Преимущество стратегии заключается в том, что она использует в полной мере способность динамического индикатора идентифицировать потенциальную тенденцию и устанавливает несколько условных фильтров для контроля качества торговых сигналов, которые могут эффективно отфильтровывать неопределенные торговые сигналы, чтобы избежать слишком частого трейдинга в целом волатильном диапазоне.

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

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

  2. Вычислить среднюю линию, верхнюю и нижнюю линию в канале Келтнера. Средняя линия - это простая скользящая средняя по цене закрытия на n дней, верхняя и нижняя линии - это простая скользящая средняя по реальному диапазону на n дней плюс минус m раз.

  3. Определение того, является ли цена прорывом вверх-вниз по Бринской и Келтнерской полосам, представляет собой сжатие и расширение. Сжатие происходит, когда цена прорывается вниз сверху, а расширение - когда цена прорывается вверх снизу.

  4. Вычислить значение линейной кривой регрессии, используемой в качестве индикатора динамики. При прохождении 0 на линию динамики это сигнал покупки, при прохождении 0 - сигнал продажи.

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

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

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

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

  3. Это позволит вам продвинуться вперед и увеличить ваши шансы на прибыль.

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

  5. Параметры технических показателей могут быть настроены на различные сорта и комбинации параметров.

  6. Можно установить период обратной измерения для оптимизации теста на конкретный период времени.

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

  1. Тренд-следящая стратегия, которая может привести к убыткам, если тенденция изменится.

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

  3. На основании исторических данных, не может быть гарантирована стабильность возвращения в будущем.

  4. Невозможность справиться с рыночными потрясениями и резкими колебаниями цен, вызванными внезапными событиями.

  5. Неправильно настроенное окно времени отслеживания может привести к пересчёту.

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

  1. Оптимизация параметров пояса Бурин и прохода Келтнера для поиска оптимального сочетания.

  2. Тест включает в себя мобильный стоп для контроля максимального убытка от одной сделки.

  3. Попытки дальнейшей оптимизации в рамках конкретных сочетаний сортов и циклов.

  4. В частности, в исследовании используются модели машинного обучения для определения обратной тенденции.

  5. Тестирование различных стратегий управления входом и позицией.

  6. Изучение того, как распознать сигналы обратного тренда и своевременно остановить убыток.

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

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

Исходный код стратегии
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//Strategy based on LazyBear Squeeze Momentum Indicator
//I added some custom feature and filters
//
// @author LazyBear
// List of all my indicators:
// https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing
// v2 - fixed a typo, where BB multipler was always stuck at 1.5. [Thanks @ucsgears]
//
strategy(shorttitle = "SQZMOM_LB", title="Strategy for Squeeze Momentum Indicator [LazyBear]", overlay=false, calc_on_every_tick=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD)

length = input(14, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(16, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
 
useTrueRange = input(true, title="Use TrueRange (KC)", type=bool)

//FILTERS
useExtremeOrders  = input(false, title="Early entry on momentum change", type=bool)
useMomAverage = input(false, title="Filter for Momenutum value", type=bool)
MomentumMin = input(20, title="Min for momentum")

// Calculate BB
src = close
basis = sma(src, length)
dev = mult * stdev(src, length)
upperBB = basis + dev
lowerBB = basis - dev
 
// Calculate KC
ma = sma(src, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC
 
sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)
 
val = linreg(src  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)
 
bcolor = iff( val > 0,            iff( val > nz(val[1]), lime, green),            iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : aqua
plot(val, color=bcolor, style=histogram, linewidth=4)
plot(0, color=scolor, style=cross, linewidth=2)

//LOGIC
//momentum filter
filterMom=useMomAverage?abs(val)>(MomentumMin/100000)?true:false:true

//standard condition
longCondition = scolor[1]!=aqua and scolor==aqua and bcolor==lime and filterMom
exitLongCondition = bcolor==green and not useExtremeOrders
shortCondition = scolor[1]!=aqua and scolor==aqua and bcolor==red and filterMom
exitShortCondition = bcolor==maroon and not useExtremeOrders

//early entry
extremeLong= useExtremeOrders and scolor==aqua and bcolor==maroon and bcolor[1]!=bcolor[0] and filterMom
exitExtLong = scolor==black or bcolor==red
extremeShort = useExtremeOrders and scolor==aqua and bcolor==green and bcolor[1]!=bcolor[0] and filterMom
exitExtShort = scolor==black or bcolor==lime

//STRATEGY

strategy.entry("SQ_Long", strategy.long, when = longCondition)
strategy.close("SQ_Long",when = exitLongCondition )

strategy.entry("SQ_Long_Ext", strategy.long, when = extremeLong)
strategy.close("SQ_Long_Ext",when = exitExtLong)
//strategy.exit("exit Long", "SQ_Long", when = exitLongCondition)

strategy.entry("SQ_Short", strategy.short, when = shortCondition)
strategy.close("SQ_Short",when = exitShortCondition)

strategy.entry("SQ_Short_Ext", strategy.short, when = extremeShort)
strategy.close("SQ_Short_Ext",when = exitExtShort)
//strategy.exit("exit Short", "SQ_Short", when = exitShortCondition)



// // === Backtesting Dates === thanks to Trost

// testPeriodSwitch = input(true, "Custom Backtesting Dates")
// testStartYear = input(2018, "Backtest Start Year")
// testStartMonth = input(1, "Backtest Start Month")
// testStartDay = input(1, "Backtest Start Day")
// testStartHour = input(0, "Backtest Start Hour")
// testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
// testStopYear = input(2018, "Backtest Stop Year")
// testStopMonth = input(12, "Backtest Stop Month")
// testStopDay = input(14, "Backtest Stop Day")
// testStopHour = input(23, "Backtest Stop Hour")
// testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
// testPeriod() =>
//     time >= testPeriodStart and time <= testPeriodStop ? true : false
// isPeriod = testPeriodSwitch == true ? testPeriod() : true
// // === /END

// if not isPeriod
//     strategy.cancel_all()
//     strategy.close_all()