이 전략은 트렌드 방향을 결정하기 위해 이동 평균 시스템을 사용하며 거래 관리에 촛불 출구와 함께 낮은 변동성 오스실레이션 시장을 피하기 위해 변동성 지수를 결합합니다.
이 전략은 빠른 이동 평균과 느린 이동 평균을 비교하여 트렌드 방향을 판단합니다. 빠른 MA가 느린 MA를 넘을 때 길게 가고 빠른 MA가 느린 MA를 넘을 때 짧게됩니다. 오스실레이션 시장을 피하기 위해 전략에는 볼링거 밴드도 포함됩니다. BB 너비의 변화율이 한 임계치를 초과 할 때 거래 신호를 생성합니다. 마지막으로 전략은 범위 제한 시장에 갇히지 않기 위해
구체적으로, 거래 논리는 다음과 같습니다.
빠른 MA (20일 기본) 및 느린 MA (50일 기본) 를 계산합니다.
볼링거 밴드 (디폴트 40일, 표준편차 2개) 너비의 변화율을 계산합니다.
빠른 MA가 느린 MA를 넘어서고 BB 너비 변화율이 기본 임계 9%를 초과하면 긴 경로로 이동합니다.
빠른 MA가 느린 MA보다 낮을 때 짧은 순서로 이동하고 BB 너비 변화율이 기본 기준 9%를 초과하면
롱 스톱은 가장 높은 - ATR * 곱셈입니다. 짧은 스톱은 가장 낮은 + ATR * 곱셈입니다.
MA 시스템은 트렌드를 효과적으로 추적합니다.
BB 너비 변경은 변동을 필터링하고 불필요한 거래를 줄입니다.
최적화를 위해 여러 가지 조절 가능한 매개 변수
명확한 논리, 이해하기 쉽고 실행하기 쉽습니다.
MA 지연은 빠른 반전을 놓칠 수 있습니다.
부적절한 BB 매개 변수는 유효한 신호를 필터링할 수 있습니다.
과도한 캔들리 출입은 거래가 과도하게 증가합니다.
부적절한 매개 변수 최적화는 위험을 가져옵니다.
주요 사건으로 인한 극심한 시장 변화에 적응할 수 없습니다.
최적의 매개 변수를 찾기 위해 다양한 MA 조합을 테스트합니다.
가장 좋은 변동성 필터를 위해 다른 BB 기간을 테스트합니다.
입국 확인을 위한 다른 지표들을 추가합니다.
동적 정지 기능을 도입하여 시장을 더 잘 추적할 수 있습니다.
변화하는 시장에 대한 자동 최적화를 위해 기계 학습을 활용합니다.
이 전략은 MA 시스템, BB 지표 및 사다리 출구를 통합하여 비교적 안정적인 트렌드 다음 시스템을 형성합니다. 적절한 매개 변수 최적화는 좋은 결과를 얻을 수 있습니다. 그러나 트렌드 역전 및 오스실레이션의 위험이 남아 있습니다. 기계 학습은 탄력성을 더욱 향상시킬 수 있습니다. 전반적으로 학습에 대한 좋은 전략입니다.
/*backtest start: 2022-10-11 00:00:00 end: 2023-10-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © juanchez //@version=4 strategy("CHI", overlay = true, close_entries_rule = "ANY") n = input(title= "highest high o lowest low period", defval= 22) f= input(title= "multiplicador", defval= 4) long = highest(high, n) - atr(n)*f short= lowest(low, n) + atr(n)*f plot(long, color= color.red) plot(short, color= color.green) //moving averages period= input(title= "moving averages period", defval= 50) period2= input(title= "moving averages period2", defval= 20) type= input(title= "moving averages type", options= ["sma", "ema"], defval= "ema") //moving average function mo(p, t) => if t == "sma" sma(close[barstate.islast ? 1: 0], p) else if t== "ema" ema(close[barstate.islast ? 1: 0], p) m= mo(period, type) m2= mo(period2, type) trend= m2 > m plot(m, color = color.maroon, linewidth = 3) plot(m2, linewidth= 3) //BOLLINGER BANDS ENTRIES bb1_period= input(title= "Bollinger bands 1 period", defval=40, minval=1) bb1_source=input(title="Bollinger band 1 source", defval=close) bb1_multi=input(title="Bollinger Bands 1 factor", defval=2, minval=1, step=0.1) show_bb1= input(title="Show Bollinger bands 1", defval=false) //BOLLINGER BANDS _bb(src, lenght, multi)=> float moving_avg= sma(src[barstate.islast? 1: 0], lenght) float deviation= stdev(src[barstate.islast? 1: 0], lenght) float lowerband = moving_avg - deviation*multi float upperband = moving_avg + deviation*multi [moving_avg, lowerband, upperband] [bb1, lowerband1, upperband1]= _bb(bb1_source, bb1_period, bb1_multi) //FIRST BAND plot(show_bb1? bb1 : na, title="BB1 Moving average", linewidth= 3, color= color.fuchsia) plot(show_bb1? upperband1 : na, title="BB1 Upper Band", linewidth= 3, color= color.green) plot(show_bb1? lowerband1 : na, title="BB1 Lower Band", linewidth= 3, color= color.red) //BB's Width threshold thresh= input(title= "widen %", defval= 9, minval = 0, step = 1, maxval= 100) widht= (upperband1 - lowerband1)/bb1 roc= change(widht)/widht[1]*100 cross=crossover(roc, thresh) // entry //long elong= input(true, title= "enable long") longcondition= m2 > m and cross and elong //short eshort= input(true, title= "enable short") shortcondition= m2 < m and cross and eshort plotshape(longcondition? true: false , location= location.belowbar, style= shape.labelup, size= size.small, color= color.green, text= "Buy", textcolor= color.white) plotshape(shortcondition? true: false , location= location.abovebar, style= shape.labeldown, size= size.small, color= color.red, text= "Sell", textcolor= color.white) out= crossunder(close, long) outt= crossover(close, short) strategy.entry("long", strategy.long, when = longcondition) strategy.close("long", when = out) strategy.entry("short", strategy.short, when = shortcondition) strategy.close("short", when = outt)