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


Дата создания: 2024-02-02 17:42:58 Последнее изменение: 2024-02-02 17:42:58
Копировать: 0 Количество просмотров: 1171
1
Подписаться
1617
Подписчики

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

Обзор

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

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

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

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

  1. Bollinger Bands: содержит средний, верхний и нижний рельсы
  2. Keltner Channels: содержит средний, верхний и нижний рельсы
  3. Моментный индикатор: разница между текущей ценой и ценой n дней назад

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

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

Анализ преимуществ стратегии

Основными преимуществами стратегии сжимания динамической мощности в случае с личинкой являются:

  1. Начало тренда можно автоматически распознать, а раннее вхождение в него
  2. Помимо того, что мы знаем, что это не так, мы знаем, что это не так, но мы знаем, что это так.
  3. Тенденции и обратный курс
  4. Настраиваемые параметры для оптимизации различных сортов

Анализ рисков

Однако, как отмечается в статье, “последнее, что нужно сделать, - это приложить все усилия для того, чтобы не допустить, чтобы это произошло”.

  1. Большая вероятность ложного сигнала в поясе Брин и канале Келтнера
  2. Показатели динамики неустойчивы и могут пропустить лучшую точку входа.
  3. Необходимо оптимизировать параметры, иначе они не будут работать
  4. Эффективность больше зависит от торгуемых сортов

Для снижения риска рекомендуется оптимизировать параметры длины пояса Бурин и канала Келтнера, скорректировать стоп-пост, выбрать более ликвидные торговые разновидности, а также проверить их в сочетании с другими показателями.

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

В целях дальнейшего повышения эффективности стратегии выдавливания динамики, основными направлениями оптимизации являются:

  1. Сочетание параметров для тестирования различных сортов и циклов
  2. Оптимизация длины Брин-пояса и Кельтнерского канала
  3. Оптимизация длины динамического индикатора
  4. Различные стратегии остановки убытков для многоголовых и пустых голов
  5. Добавление других показателей для проверки сигнала

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

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

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

Исходный код стратегии
/*backtest
start: 2024-01-31 00:00:00
end: 2024-02-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mtahreemalam original strategy by LazyBear

strategy(title = 'SQM Strategy, TP & SL',
         shorttitle = 'Squeeze.M Strat',
         overlay = true,
         pyramiding = 0,
         default_qty_type = strategy.percent_of_equity,
         default_qty_value = 100,
         initial_capital = 1000,
         commission_type=strategy.commission.percent, 
         commission_value=0.0,
         process_orders_on_close=true,
         use_bar_magnifier=true)
//Strategy logic
strategy_logic = input.string("Cross above 0", "Strategy Logic", options = ["LazyBear", "Cross above 0"])

// Date Range
testPeriodSwitch = input(false, "Custom Backtesting Date Range",group="Backtesting Date Range")
i_startTime = input(defval = timestamp("01 Jan 2022 00:01 +0000"), title = "Backtesting Start Time",group="Backtesting Date Range")
i_endTime = input(defval = timestamp("31 Dec 2022 23:59 +0000"), title = "Backtesting End Time",group="Backtesting Date Range")
timeCond = true
isPeriod = testPeriodSwitch == true ? timeCond : true

//// Stoploss and Take Profit Parameters
// Enable Long Strategy
enable_long_strategy = input.bool(true, title='Enable Long Strategy', group='SL/TP For Long Strategy', inline='1')
long_stoploss_value = input.float(defval=5, title='Stoploss %', minval=0.1, group='SL/TP For Long Strategy', inline='2')
long_stoploss_percentage = close * (long_stoploss_value / 100) / syminfo.mintick
long_takeprofit_value = input.float(defval=5, title='Take Profit %', minval=0.1, group='SL/TP For Long Strategy', inline='2')
long_takeprofit_percentage = close * (long_takeprofit_value / 100) / syminfo.mintick

// Enable Short Strategy
enable_short_strategy = input.bool(true, title='Enable Short Strategy', group='SL/TP For Short Strategy', inline='3')
short_stoploss_value = input.float(defval=5, title='Stoploss %', minval=0.1, group='SL/TP For Short Strategy', inline='4')
short_stoploss_percentage = close * (short_stoploss_value / 100) / syminfo.mintick
short_takeprofit_value = input.float(defval=5, title='Take Profit %', minval=0.1, group='SL/TP For Short Strategy', inline='4')
short_takeprofit_percentage = close * (short_takeprofit_value / 100) / syminfo.mintick

//// Inputs
//SQUEEZE MOMENTUM STRATEGY
length = input(20, title='BB Length', group = "Squeeze Momentum Settings")
mult = input(2.0, title='BB MultFactor', group = "Squeeze Momentum Settings")
source = close
lengthKC = input(20, title='KC Length', group = "Squeeze Momentum Settings")
multKC = input(1.5, title='KC MultFactor', group = "Squeeze Momentum Settings")
useTrueRange = input(true, title='Use TrueRange (KC)', group = "Squeeze Momentum Settings")
signalPeriod=input(5, title="Signal Length", group = "Squeeze Momentum Settings")
show_labels_sqm = input(title='Show Buy/Sell SQM Labels', defval=true, group = "Squeeze Momentum Settings")
h0 = hline(0)

// Defining MA
ma = ta.sma(source, length)

// Calculate BB
basis = ma
dev = mult * ta.stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
range_1 = useTrueRange ? ta.tr : high - low
rangema = ta.sma(range_1, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC


// SqzON | SqzOFF | noSqz
sqzOn = lowerBB > lowerKC and upperBB < upperKC
sqzOff = lowerBB < lowerKC and upperBB > upperKC
noSqz = sqzOn == false and sqzOff == false

// Momentum
val = ta.linreg(source - math.avg(math.avg(ta.highest(high, lengthKC), ta.lowest(low, lengthKC)), ta.sma(close, lengthKC)), lengthKC, 0)

red_line = ta.sma(val,signalPeriod)
blue_line = val

// lqm = if val > 0
//         if val > nz(val[1])
        // long_sqm_custom
        // if val < nz(val[1])
        // short_sqm_custom
// Plots
//plot(val, style = plot.style_line, title = "blue line", color= color.blue, linewidth=2)
//plot(ta.sma(val,SignalPeriod), style = plot.style_line, title = "red line",color = color.red, linewidth=2)

//plot(val, color=blue, linewidth=2)
//plot(0, color=color.gray, style=plot.style_cross, linewidth=2)
//plot(red_line, color=red, linewidth=2)

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

////SQM Long Short Conditions
//Lazy Bear Buy Sell Condition
// long_sqm_lazy = (blue_line>red_line)
// short_sqm_lazy = (blue_line<red_line)

long_sqm_lazy = ta.crossover(blue_line,red_line)
short_sqm_lazy = ta.crossunder(blue_line,red_line)


//Custom Buy Sell Condition
dir_sqm = val < 0 ? -1 : 1
long_sqm_custom = dir_sqm == 1 //and dir_sqm[1] == -1
short_sqm_custom = dir_sqm == -1 //and dir_sqm[1] == 1

long_sqm = strategy_logic == "LazyBear" ? long_sqm_lazy : long_sqm_custom 
short_sqm = strategy_logic == "LazyBear" ? short_sqm_lazy : short_sqm_custom 


// Plot Stoploss & Take Profit Levels
long_stoploss_price = strategy.position_avg_price * (1 - long_stoploss_value / 100)
long_takeprofit_price = strategy.position_avg_price * (1 + long_takeprofit_value / 100)
short_stoploss_price = strategy.position_avg_price * (1 + short_stoploss_value / 100)
short_takeprofit_price = strategy.position_avg_price * (1 - short_takeprofit_value / 100)
plot(enable_long_strategy and not enable_short_strategy ? long_stoploss_percentage : na, color=color.red, style=plot.style_linebr, linewidth=2, title='Long SL Level')
plot(enable_long_strategy and not enable_short_strategy ? long_takeprofit_percentage : na, color=color.green, style=plot.style_linebr, linewidth=2, title='Long TP Level')
plot(enable_short_strategy and not enable_long_strategy ? short_stoploss_price : na, color=color.red, style=plot.style_linebr, linewidth=2, title='Short SL Level')
plot(enable_short_strategy and not enable_long_strategy ? short_takeprofit_price : na, color=color.green, style=plot.style_linebr, linewidth=2, title='Short TP Level')


// Long Strategy
if long_sqm and enable_long_strategy == true
    strategy.entry('Long', strategy.long)
    strategy.exit('Long  SL/TP', from_entry='Long', loss=long_stoploss_percentage, profit=long_takeprofit_percentage)
    strategy.close('Long', comment = "L. CL")

// Short Strategy
if short_sqm and enable_short_strategy == true 
    strategy.entry('Short', strategy.short)
    strategy.exit('Short SL/TP', from_entry='Short', loss=short_stoploss_percentage, profit=short_takeprofit_percentage)
    strategy.close('Short', comment = "S.Cl")

plot_sqm_long = long_sqm and not long_sqm[1]
plot_sqm_short = short_sqm and not short_sqm[1]

plotshape(plot_sqm_long and show_labels_sqm, title='Buy', style=shape.labelup, location=location.belowbar, size=size.normal, text='Buy', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(plot_sqm_short and show_labels_sqm, title='Sell', style=shape.labeldown, location=location.abovebar, size=size.normal, text='Sell', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))

// Date Range EXIT
if (not isPeriod) 
    strategy.cancel_all()
    strategy.close_all()