Это количественная торговая стратегия, разработанная на основе индикатора Momentum Squeeze LazyBear. Стратегия объединяет полосы Боллинджера, каналы Келтнера и индикаторы импульса для достижения высокой скорости выигрыша в трейдинге через комбинацию нескольких технических индикаторов.
Основным показателем этой стратегии является индикатор сжатия импульса LazyBear. Этот индикатор определяет, сжимаются ли полосы Боллинджера каналами Келтнера. Когда происходит сжатие, это означает, что рынок вошел в потенциальную точку прорыва. Объединив направление индикатора импульса, сделки могут быть приняты, когда сжатие освобождается, чтобы захватить рыночный прорыв.
В частности, стратегия сначала рассчитывает 21-периодные полосы Боллинджера, с шириной 2 стандартных отклонений от цены. В то же время она рассчитывает 20-периодные каналы Келтнера, с шириной в 1,5 раза больше амплитуды цены. Когда полосы Боллинджера сжимаются
Для выходов, когда цвет индикатора импульса меняется на серый, это означает, что состояние сжатия закончилось, и тенденция может измениться.
Осуждая общую связь между этими показателями, можно улучшить точность торговых решений и уменьшить вероятность ошибочных сделок.
Стратегия сжатия импульса может захватить ключевые точки, где рынок, вероятно, выйдет из строя. Эти точки часто являются точками перелома, где рынок делает важные направленные суждения. Если правильно судить, последующее движение рынка будет относительно длинным, поэтому потенциальное пространство прибыли стратегии велико.
По сравнению с случайным трейдингом, точка входа, выбранная этой стратегией, находится в точке сжатия между полосами Боллинджера и каналами Келтнера.
Параметры цикла и параметры пропускной способности полос Боллинджера и каналов Келтнера оказывают большое влияние на результаты торговли. Если параметры установлены ненадлежащим образом, могут возникнуть ошибки в оценке. Это требует поиска оптимальных параметров через много обратного тестирования.
Всегда существует риск того, что цена может восстановиться после прорыва в выбранной этой стратегией точке, что приведет к потере.
Когда состояние сжатия заканчивается, эта стратегия закрывает все позиции. Однако иногда ценовая тенденция может все еще продолжаться, что создает риск преждевременного выхода. Логика выхода должна быть оптимизирована.
С помощью большего количества пробных данных обратного тестирования можно найти лучшие параметры цикла и пропускной способности для улучшения эффективности стратегии.
Установите движущиеся или колеблющиеся остановки, чтобы быстро сократить убытки при перепаде цен.
Когда стратегия выходит из позиций, могут быть установлены определенные условия для повторного выхода на рынок, если тенденция сохранится.
Постарайтесь включить больше показателей различных типов, таких как другие показатели волатильности, показатели объема и т. д., чтобы установить комплексную стратегию интеграции показателей, чтобы улучшить точность решений.
Стратегия интегрирует полосы Боллинджера, каналы Келтнера и индикаторы импульса. Судя по отношениям между этими индикаторами, она входит в точки высокого уровня успеха. Есть возможности оптимизации во многих аспектах, таких как оптимизация параметров, стратегии стоп-лосса, условия повторного входа и интеграция композитных индикаторов для дальнейшего улучшения эффективности стратегии.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //All credits to LazyBear. All I did was turn it into a strategy! strategy(title = "SQZMOM STRAT", overlay=false) // --- GENERAL INPUTS --- FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12) FromYear = input(defval = 2020, title = "From Year", minval = 2012) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToYear = input(defval = 9999, title = "To Year", minval = 2017) FromDay = 1 ToDay = 1 start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision) trade_leverage = input(1, title = "Trade - Leverage", step = 0.25) trade_risk = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100) tradeType = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"]) // --- SQZMOM CODE length = input(21, title="BB Length") mult = input(2.0,title="BB MultFactor") lengthKC=input(20, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool) // Calculate BB source = close basis = sma(source, length) dev = multKC * stdev(source, length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC ma = sma(source, 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(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0) bcolor = color.gray if (val > 0 and val > nz(val[1])) bcolor := color.green if (val < 0 and val < nz(val[1])) bcolor := color.red scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray plot(val, color=bcolor, style=plot.style_histogram, linewidth=4) plot(0, color=scolor, style=plot.style_cross, linewidth=2) // --- VWMA CODE --- useVWMA = input(false, title = "Use VWMA to selectively long/short?", type = input.bool) lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1) useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?") nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA) medianSrc=close calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares) m=calc_evwma(medianSrc, lengthVWMA, nbfs) // ---STRATEGY--- if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false)) longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1) if (longCondition) contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4) strategy.entry("LONG", strategy.long, qty = contracts, when = window()) if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false)) shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1) if (shortCondition) contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4) strategy.entry("SHORT", strategy.short, qty = contracts, when = window()) if (bcolor == color.gray) strategy.close("LONG") strategy.close("SHORT")