이중 탈출 전략

저자:차오장, 날짜: 2023-11-03 17:16:02
태그:

img

전반적인 설명

이 전략은 볼링거 밴드를 사용하여 긴 거래와 짧은 거래의 브레이크포인트를 식별하고 ADX 지표와 결합하여 낮은 변동성 불리한 시장 조건을 필터링하여 트렌드를 추적합니다.

전략 논리

이 전략은 주로 긴 또는 짧은 방향을 결정하기 위해 볼링거 밴드 지표에 기반합니다. 볼링거 밴드의 중간 밴드는 종료 가격의 N-day 이동 평균이며, 밴드 폭은 표준 편차를 사용하여 계산됩니다. 하부 밴드 아래의 브레이크오웃은 긴 거래를 신호하고, 상부 밴드 위의 브레이크오웃은 짧은 거래를 신호합니다.

트렌드가 아닌 불안정한 시장에서 유효하지 않은 브레이크 아웃 및 잘못된 거래를 피하기 위해 전략은 낮은 변동성 시장 조건을 필터링하기 위해 ADX 지표를 통합합니다. ADX 값이 한계 이하일 때만 거래 신호가 생성됩니다. ADX가 한계를 넘으면 모든 포지션은 트렌드 조건을 기다리는 데 닫습니다.

이 전략은 또한 오픈 트레이드에 대한 후속 스톱 로스를 설정하고 이윤을 취합니다. 구체적으로, 포지션을 열었을 때, 이전 N 일 동안의 가장 낮은 가격과 가장 높은 가격은 그 방향으로 스톱 로스로 기록되고 이윤을 취합니다. 이것은 반전으로 인한 손실을 줄이는 동안 이윤을 잠금 할 수 있습니다.

코드 논리에서 전략은 먼저 볼링거 밴드 및 ADX 매개 변수를 계산합니다. 그 다음 가격이 밴드 상단 또는 하단 범위를 깨고 ADX가 문턱 이하인지 확인하여 거래 신호를 생성합니다. 그 후 스톱 손실 및 영업 수준은 동적으로 업데이트되고 현재 위치 방향에 따라 추적됩니다.

이점 분석

  • 볼링거 밴드는 트렌드 기회를 잡기 위해 명확한 브레이크 아웃 신호를 제공합니다.
  • ADX 필터는 명확한 트렌드가 없는 혼란스러운 시장 거래를 피합니다.
  • 스톱 로스는 단일 거래 손실을 효과적으로 제어합니다.
  • 대부분의 수익에서 수익을 추적하는 것

위험 분석

  • 부피를 고려하지 않고 파업은 거짓일 수 있습니다.
  • 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)




더 많은