Эта стратегия сочетает в себе Super Trend, Pivot Points и Average True Range (ATR), чтобы сформировать динамическую линию стоп-лосса, и индикатор Average Directional Movement Index (ADX), чтобы судить и отслеживать тенденции.
Супер-Тренд в сочетании с Pivot Points и ATR Stop Loss оценивает направление прорыва цены через динамическую линию стоп-лосса для определения направления открытия.
В частности, Pivot Points сначала получают последнюю поддержку и сопротивление, а затем формируют динамическую среднюю цену с арифметическим средним за предыдущие два дня. Затем ATR рассчитывается и умножается на коэффициент ATR, а затем добавляется или вычитается из динамической средней цены, чтобы получить верхние и нижние рельсы.
Линия стоп-лосса будет динамически корректироваться в соответствии с последней ценой и ATR-значением, что позволяет отслеживать тенденцию очень хорошо.
Стратегия имеет следующие преимущества:
Используйте индикатор Super Trend для отслеживания направления движения тренда, чтобы избежать блокировки прибыли колебаниями рынков.
С помощью индикатора ADX можно оценить силу тренда, избегать ошибок в торговле во время консолидации.
Линия стоп-лосса динамически регулируется, чтобы максимизировать прибыль.
Объедините RSI, чтобы избежать перекупки и перепродажи.
В целом, параметры стратегии разумны. Выбор dframe учитывает непрерывность. Установка take profit и stop loss также хороша.
Стратегия также сопряжена с некоторыми рисками:
Индикаторы Super Trend и MA могут выдавать противоречивые сигналы.
Индикатор ADX установлен на 14 циклов, что недостаточно чувствительно к внезапным событиям.
Параметр RSI настроен на по умолчанию, что может не позволить полностью избежать перекупки и перепродажи.
Влияние внезапных событий, таких как серьезные плохие/хорошие новости, не рассматривалось.
Соответствующие решения:
Корректируйте цикл MA так, чтобы он соответствовал индикатору Super Trend.
Постарайтесь сократить цикл ADX, чтобы повысить чувствительность к внезапным событиям.
Оптимизируйте параметры RSI, чтобы найти оптимальные значения.
Добавить модуль фильтра новостей, чтобы избежать крупных пресс-релизов.
Стратегия также может быть оптимизирована в следующих аспектах:
Добавьте модель машинного обучения, чтобы судить о тренде, делая торговые решения более умными.
Попробуйте ввести альтернативные эмоциональные показатели вместо ADX, чтобы оценить силу тренда.
Увеличить адаптивный модуль остановки потери, чтобы сделать остановку более динамичной и точной.
Дополнительные функции с помощью технологии глубокого обучения для оптимизации общей стратегии.
Используйте передовые языки, такие как Python для разработки стратегии, чтобы увеличить масштабируемость стратегии.
В целом, эта стратегия очень практична. Главное - отслеживать направление движения тренда и участвовать, когда тренд достаточно силен. Установка стоп-лосса и прибыли также очень хороша, чтобы максимизировать блокировку прибыли, избегая потерь. Конечно, еще есть много возможностей для оптимизации. Добавление технологий машинного обучения и глубокого обучения сделает стратегию более эффективной и расширяемой.
/*backtest start: 2023-01-15 00:00:00 end: 2024-01-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Bendre ADX STrend", overlay = true) /////////////////////////// // SuperTrend + Pivot Point ////////////////////////// src = input(close, title="EMA Source") PPprd = input(defval = 2, title="Pivot Point Period") AtrFactor=input(defval = 2, title = "ATR Factor") AtrPd=input(defval = 21, title = "ATR Period") StartDate = input(timestamp("1 Dec 2023"), title="Start Date") EndDate = input(timestamp("12 Jan 2024"), title="End Date") window() => true var float ph = na var float pl = na ph := ta.pivothigh(PPprd, PPprd) pl :=ta.pivotlow(PPprd, PPprd) float center = na center := center[1] // float lastpp = ph ? ph : pl ? pl : 0.0 float lastpp = na(ph) ? na(pl) ? na : pl : ph if lastpp > 0 if na(center) center := lastpp else center := (center * 2 + lastpp) / 3 Up = center - (AtrFactor * ta.atr(AtrPd)) Dn = center + (AtrFactor * ta.atr(AtrPd)) var float TUp = na var float TDown = na Trend = 0 TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1) Trailingsl = Trend == 1 ? TUp : TDown // Lines linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend") bsignalSSPP = close > Trailingsl ssignalSSPP = close < Trailingsl /////// // ADX ////// lenADX = 14 th = 14 TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1]))) DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0 DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100 ADX = ta.sma(DX, lenADX) ////// // MA ///// lenMA = 21 srcMA = input(close, title="Source") // offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500) offsetMA = input(0, title="Offset") outMA = ta.sma(srcMA, lenMA) // // RSI // length = input( 14 ) overSold = input( 30 ) overBought = input( 65 ) price = close vrsi = ta.rsi(price, length) // // DMI - Direction Movement Index // [diplus1, diminus1, adx] = ta.dmi(14, 14) // Buy - Sell Entries buy = bsignalSSPP and outMA < close and ADX > th sell = ssignalSSPP if (buy and vrsi > overBought and adx > 19) // .order // Tuned version strategy.entry("Buy", strategy.long, when = window()) // strategy.close("Sell", "close Sell") if (sell) and (strategy.position_size > 0) // strategy.entry("Sell", strategy.short) strategy.close("Buy", "Close Buy") if(sell and vrsi < overSold and adx > 25) strategy.entry("Sell", strategy.short, when = window()) if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) ) strategy.close("Sell", "close Sell") // if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold) // strategy.entry("Sell", strategy.short, when = window()) // if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0 and (buy)) // strategy.close("Sell", "close Sell")