이 전략은 볼링거 밴드를 사용하여 긴 거래와 짧은 거래의 브레이크포인트를 식별하고 ADX 지표와 결합하여 낮은 변동성 불리한 시장 조건을 필터링하여 트렌드를 추적합니다.
이 전략은 주로 긴 또는 짧은 방향을 결정하기 위해 볼링거 밴드 지표에 기반합니다. 볼링거 밴드의 중간 밴드는 종료 가격의 N-day 이동 평균이며, 밴드 폭은 표준 편차를 사용하여 계산됩니다. 하부 밴드 아래의 브레이크오웃은 긴 거래를 신호하고, 상부 밴드 위의 브레이크오웃은 짧은 거래를 신호합니다.
트렌드가 아닌 불안정한 시장에서 유효하지 않은 브레이크 아웃 및 잘못된 거래를 피하기 위해 전략은 낮은 변동성 시장 조건을 필터링하기 위해 ADX 지표를 통합합니다. ADX 값이 한계 이하일 때만 거래 신호가 생성됩니다. ADX가 한계를 넘으면 모든 포지션은 트렌드 조건을 기다리는 데 닫습니다.
이 전략은 또한 오픈 트레이드에 대한 후속 스톱 로스를 설정하고 이윤을 취합니다. 구체적으로, 포지션을 열었을 때, 이전 N 일 동안의 가장 낮은 가격과 가장 높은 가격은 그 방향으로 스톱 로스로 기록되고 이윤을 취합니다. 이것은 반전으로 인한 손실을 줄이는 동안 이윤을 잠금 할 수 있습니다.
코드 논리에서 전략은 먼저 볼링거 밴드 및 ADX 매개 변수를 계산합니다. 그 다음 가격이 밴드 상단 또는 하단 범위를 깨고 ADX가 문턱 이하인지 확인하여 거래 신호를 생성합니다. 그 후 스톱 손실 및 영업 수준은 동적으로 업데이트되고 현재 위치 방향에 따라 추적됩니다.
부피와 브레이크오웃을 확인하기 위해 다른 지표와 결합하는 것을 고려하십시오. 동향 변화를 식별하기 위해 기울기를 사용하여 ADX 필터를 최적화하십시오. 조기 출시를 피하기 위해 스톱 로스 범위를 넓히고 수익을 취하십시오.
이 전략은 명확하고 간단한 논리를 가지고 있으며, 명백한 브레이크아웃 신호를 위해 볼링거 밴드를 사용하여 트렌드 조건을 위해 ADX에 의해 필터링하여 트렌드 기회를 포착합니다. 스톱 로스 및 영업은 위험을 제어하고 이익을 잠금하는 데 사용됩니다. 이해하기 쉽고 구현하기 쉽기 때문에 전략은 기본 트렌드 다음 시스템으로 추가 테스트 및 최적화를 가치가 있습니다.
/*backtest start: 2023-10-26 00:00:00 end: 2023-11-02 00:00:00 period: 1m basePeriod: 1m 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/ // © tweakerID // This strategy uses Bollinger Bands to buy when the price // crosses over the lower band and sell when it crosses down // the upper band. It only takes trades when the ADX is // below a certain level, and exits all trades when it's above it. //@version=4 strategy("BB + ADX Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_value = 0.04, initial_capital=100) //Inputs i_reverse=input(false, title="Reverse Trades") i_ADXClose=input(true, title="ADX Close") i_SL=input(false, title="Use Swing Lo/Hi Stop Loss & Take Profit") i_SwingLookback=input(20, title="Swing Lo/Hi Lookback") i_SLExpander=input(defval=0, step=.5, title="SL Expander") i_TPExpander=input(defval=0, step=.5, title="TP Expander") //ADX Calculations adxlen = input(14, title="ADX Smoothing") dilen = input(20, title="DI Length") dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) adxlevel=input(30, step=5) //BB Calculations BBCALC=input(false, title="-----------BB Inputs-----------") length = input(20, minval=1) mult = input(2.0, minval=0.001, maxval=50) MAlen=input(defval=9) source = close basis = sma(source, length) dev = mult * stdev(source, length) upper = basis + dev lower = basis - dev //Entry Logic BUY = crossover(source, lower) and sig < adxlevel SELL = crossunder(source, upper) and sig < adxlevel //SL & TP Calculations SwingLow=lowest(i_SwingLookback) SwingHigh=highest(i_SwingLookback) bought=strategy.position_size != strategy.position_size[1] LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0))*i_SLExpander) SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0))*i_SLExpander) lTP=strategy.position_avg_price + (strategy.position_avg_price-(valuewhen(bought, SwingLow, 0))+((valuewhen(bought, atr(14), 0))*i_TPExpander)) sTP=strategy.position_avg_price - (valuewhen(bought, SwingHigh, 0)-strategy.position_avg_price)-((valuewhen(bought, atr(14), 0))*i_TPExpander) islong=strategy.position_size > 0 isshort=strategy.position_size < 0 SL= islong ? LSL : isshort ? SSL : na TP= islong ? lTP : isshort ? sTP : na //Entries strategy.entry("long", long=i_reverse?false:true, when=BUY) strategy.entry("short", long=i_reverse?true:false, when=SELL) //EXITS if i_ADXClose strategy.close_all(when=sig > adxlevel) if i_SL strategy.exit("longexit", "long", stop=SL, limit=TP) strategy.exit("shortexit", "short", stop=SL, limit=TP) //Plots plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL") plot(i_SL ? TP : na, color=color.green, style=plot.style_cross, title="TP") plot(upper) plot(lower)