이 전략은 적응적인 이동 평균에 기반한 트렌드를 따르는 전략이다. 이 전략은 거래 신호를 생성하기 위해 서로 다른 기간을 가진 두 개의 DEMA 이동 평균을 사용합니다. 이 전략은 현재 기간을 기반으로 분석을위한 시간 프레임을 자동으로 조정하여 멀티 타임 프레임 추적을 허용합니다.
이 전략은 빠른 DEMA 라인과 느린 DEMA 라인을 사용하여 거래 신호를 구성합니다. 빠른 라인은 tf 기간을 가지고 있으며 느린 라인은 tf * 2 기간을 가지고 있습니다. 빠른 라인이 느린 라인의 위를 넘을 때 구매 신호가 생성됩니다. 빠른 라인이 느린 라인의 아래를 넘을 때 판매 신호가 생성됩니다. 이것은 전략이 중장기 트렌드를 추적 할 수 있도록합니다. 또한 전략은 소란한 거래를 줄이기 위해 두 배 이동 평균 필터를 사용합니다. 헐 필터가 방향성에 동의 할 때만 신호가 생성됩니다.
이 전략의 가장 큰 장점은 서로 다른 기간에 자동으로 적응할 수 있다는 것입니다. 현재 기간에 따라 매일에서 주간으로 분석 시간 프레임을 선택할 것입니다. 이것은 전략을 다양한 시장 환경에 적합하게 만듭니다. 또한 이중 이동 평균 구조는 트렌드를 효과적으로 추적 할 수 있으며 이중 필터는 신호 품질을 향상시킵니다. 결과적으로이 전략은 중장기 트렌드를 추적하는 데 매우 적합합니다.
이 전략의 주요 위험은 트렌드 역전에서 비롯된다. 시장이 황소 시장에서 곰 시장으로 전환할 때, 빠르고 느린 라인은 급격히 하향적으로 교차하여 거대한 부동 손실을 초래할 수 있다. 또한, 라인 필터는 또한 수익성 있는 기회를 놓칠 수 있다. 필터가 가격 방향성에 동의하지 않으면, 다른 방법으로 수익성 있는 신호가 건너뛰어질 것이다. 결과적으로, 이 전략은 주로 안정적인 중장기 트렌딩 시장을 목표로 한다.
전략은 필터 매개 변수를 조정하거나 다른 지표를 대체로 사용하여 최적화 할 수 있습니다. 예를 들어, MACD는 HullMA 대신 테스트 할 수 있습니다. 또는 HullMA 기간 매개 변수를 조정 할 수 있습니다. 또한 더 적합한 거래 규칙을 찾기 위해 다른 매개 변수 조합을 테스트 할 수 있습니다. 또한 변동성 지표도 위치 크기를 제어하는 데 포함 할 수 있습니다. 시장 변동성이 증가할 때 더 작은 포지션을 취할 수 있습니다.
결론적으로, 이것은 매우 실용적인 트렌드 다음 전략이다. 그것은 서로 다른 기간에 대한 분석 시간 프레임을 자동으로 조정할 수 있으며 다른 시간 지평에 걸쳐 거래하기에 적합합니다. 이중 이동 평균 구조는 트렌드를 꾸준히 추적 할 수 있으며 필터는 신호 품질을 향상시킵니다. 전반적으로 안정적인 중장기 수익을 찾는 투자자에게 적합합니다.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-24 23:59:59 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 // //--------------------------------------------- //* Author - PPSingnal //* http://ppsignal.com //--------------------------------------------- // // strategy (title="PPSignal V4 (Auto Adaptive Times)", shorttitle="PPSignal V4", overlay=true) delayOffset = input(defval = 0, title = "Delay Open/Close MA (Forces Non-Repainting)", minval = 0, step = 1) //---------------------------------------- INICIO PPI ---------------------------------------- // - PARÁMETROS DE ENTRADA // SE DEFINE LA RESOLUCIÓN useRes1 = true setRes1 = true tf = timeframe.period == "60" ? 4 : timeframe.period == "240" ? 4 : timeframe.period == "D" ? 4 : timeframe.period == "W" ?4 : 4 // PRIMER DEMA type = "DEMA" src = close len = tf off = 0 lsma = 0 // SEGUNDA DEMA type2 = "DEMA" src2 = open len2 = tf off2 = 0 lsma2 = 0 // - INPUTS END //---------------------------------------- INICIO FUNCIONES ---------------------------------------- // RETORNA UNA MEDIA MOVIL (TYPE=TIPO / SRC = TIPO DE PRECIO / LEN=LONGITUD / LSMA=0) variant(type, src, len, lsma) => v1 = sma(src, len) // Simple v2 = ema(src, len) // Exponential v3 = wma(src, len) // Weighted v4 = vwma(src, len) // Volume Weighted v5 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len // Smoothed v6 = 2 * v2 - ema(v2, len) // Double Exponential v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len) // Triple Exponential v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) // Hull v9 = linreg(src, len, lsma) // Least Squares // return variant, defaults to SMA if input invalid. type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : v1 // SuperSmoother filter // © 2013 John F. Ehlers a1 = exp(-1.414*3.14159 / len) b1 = 2*a1*cos(1.414*3.14159 / len) c2 = b1 c3 = (-a1)*a1 c1 = 1 - c2 - c3 v12 = 0.0 v12 := c1*(src + nz(src[1])) / 2 + c2*nz(v12[1]) + c3*nz(v12[2]) // RETORNA LA RESOLUCIÓN SETEADA Y SINO LA DEFAULT // 3H: 1min - 3min - 5min - 15min // DIARIO: 30 - 45 - 60 // SEMANAL: 120 - 180 - 240 - D reso(exp, use, res) => use ? request.security(syminfo.tickerid, timeframe.period=="1" ? "D" : timeframe.period=="3" ? "D" : timeframe.period=="5" ? "D" : timeframe.period=="15" ? "D" : timeframe.period=="30" ? "D" : timeframe.period=="45" ? "W" : timeframe.period=="60" ? "W" : timeframe.period=="120" ? "W" : timeframe.period=="180" ? "W" : timeframe.period=="240" ? "W" : timeframe.period=="D" ? "W" : "W", exp) : exp //---------------------------------------- FIN FUNCIONES ---------------------------------------- //---------------------------------------- INICIO VARIABLES ---------------------------------------- // DEMAS ma_short = reso(variant(type, src[off], len, lsma), useRes1, setRes1) ma_long = reso(variant(type2, src2[off2], len2, lsma2), useRes1, setRes1) //---------------------------------------- FIN VARIABLES ---------------------------------------- //---------------------------------------- FIN PPI ---------------------------------------- //---------------------------------------- PRIMER FILTRO ---------------------------------------- // Double HullMA scolor = false n=1 n2ma=2*wma(close,round(n/2)) nma=wma(close,n) diff=n2ma-nma sqn=round(sqrt(n)) n2ma1=2*wma(close[1],round(n/2)) nma1=wma(close[1],n) diff1=n2ma1-nma1 sqn1=round(sqrt(n)) n1=wma(diff,sqn) n2=wma(diff1,sqn) //---------------------------------------- FIN PRIMER FILTRO ---------------------------------------- //---------------------------------------- INICIO CONDICIONES ---------------------------------------- // CONDICION CON FILTRO cruce= (ma_short > ma_long) and n1>n2 ? true : ma_short < ma_long ? false : cruce[1] // Condition // FONDO DE COLOR bground = cruce ? white : red bgcolor(bground, transp=90) // BARRAS COLOREADAS barcol = cruce ? yellow : red barcolor(barcol, transp=0) closePlot = plot(ma_short, title = "Zone 1", color = gray, circles = 0, style = circles, transp = 100) openPlot = plot(ma_long, title = "Zone 2", color = green, circles = 0, style = circles, transp = 100) trendState = ma_short > ma_long ? true : ma_short < ma_long ? false : trendState[1] // channel fill closePlotU = plot(trendState ? ma_short : na, transp = 100, editable = false) openPlotU = plot(trendState ? ma_long : na, transp = 100, editable = false) closePlotD = plot(trendState ? na : ma_short, transp = 100, editable = false) openPlotD = plot(trendState ? na : ma_long, transp = 100, editable = false) fill(openPlotU, closePlotU, title = "Up Trend Fill", color = yellow, transp = 70) fill(openPlotD, closePlotD, title = "Down Trend Fill", color = red, transp = 70) //---------------------------------------- FIN CONDICIONES ---------------------------------------- //---------------------------------------- INICIO ESTRATEGIA ---------------------------------------- //CONDICION COMPRA longCond = (ma_short > ma_long) and n1>=n2 //CONDICION VENTA shortCond = (ma_short < ma_long) //ABRO COMPRA A strategy.entry("Bull Trend", strategy.long, when = longCond) //ABRO VENTA A strategy.entry("Bearish Trend", strategy.short, when = shortCond) //CIERRO VENTA A strategy.exit("Exit Short", from_entry = "Bull Trend", when = shortCond) //CIERRO COMPRA A strategy.exit("Exit Long", from_entry = "Bearish Trend", when = longCond) //---------------------------------------- FIN ESTRATEGIA ----------------------------------------