동적 채널 돌파구 전략

저자:차오장, 날짜: 2024-02-27 15:15:07
태그:

img

전반적인 설명

이 전략은 Keltner 채널 지표와 이동 평균 라인을 결합하여 동적 인 브레이크아웃 구매 및 판매 가격을 설정하여 낮은 구매-높은 판매 브레이크아웃 거래를 달성합니다. 전략은 자동으로 채널 브레이크아웃 구매 및 판매 기회를 식별 할 수 있습니다.

전략 원칙

  1. 채널 중심을 계산: 채널의 가격 중심을 계산하기 위해 기하급수적인 이동 평균을 사용
  2. 채널 대역폭 계산: 채널 대역폭을 계산하기 위해 실제 변동성, 평균 실제 변동성 또는 가격 진폭의 이동 평균을 사용
  3. 채널 상부 및 하부 레일: 중간 ± N × 채널 대역폭
  4. 입력 순서: 가격이 상단 레일에 닿을 때, 돌파구 구매 가격을 설정하고 돌파구를 기다립니다. 가격이 하단 레일에 닿을 때, 돌파구 판매 가격을 설정하고 돌파구를 기다립니다.
  5. 출구 명령: 가격이 매입 후 중간에 떨어지거나 가장 높은 가격이 입시 가격을 초과 할 때 손실을 중지하십시오. 판매 후 가격이 중간에 다시 반등하거나 가장 낮은 가격이 입시 가격보다 낮을 때 손실을 중지하십시오.

이점 분석

  1. 역동적인 채널을 이용하면 시장 트렌드의 변화를 빠르게 파악할 수 있습니다.
  2. 매개 변수를 이용하면 가격 동향의 방향을 판단할 수 있습니다.
  3. N 곱하기 대역폭 설정은 빈번한 위치 조정을 피하기 위해 채널 범위를 합리적으로 만듭니다
  4. 돌파구 메커니즘을 사용하는 것은 트렌드 이론에 부합하고 트렌드를 따르고 있습니다
  5. 스톱 로스 조건을 설정하면 위험을 엄격히 통제할 수 있습니다.

위험 분석

  1. 중간선을 계산하는 방법의 선택은 채널 범위와 가격의 일치 효과에 영향을 줄 것입니다.
  2. 너무 큰 또는 작은 N 배수는 전략의 수익률에 영향을 줄 것입니다.
  3. 돌파구 구매 및 판매는 잘못된 신호를 형성하는 경향이 있으며 엄격히 중단되어야합니다.

최적화 방향

  1. 최적의 매개 변수를 찾기 위해 다른 중간 선 계산 방법을 시도
  2. 최적의 곱셈을 찾기 위해 다른 N 값을 테스트
  3. 잘못된 신호를 피하기 위해 돌파 진폭을 증가
  4. 단일 손실을 엄격하게 제어하기 위해 스톱 손실 논리를 최적화

요약

전체 전략은 동적 채널 지표를 통해 가격 추세와 방향을 판단하기 위해 과학적이고 합리적인 방법을 사용하고, 돌파 신호를 캡처하기 위해 합리적인 매개 변수를 설정하고, 낮은 구매-고가 판매를 달성하고, 과도한 수익을 얻습니다. 동시에 다양한 시장에서 안정적으로 실행 할 수 있도록 전략의 위험을 지속적으로 최적화합니다.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Keltner Strategy", overlay=true)
length = input.int(20, minval=1)
mult = input.float(2.0, "Multiplier")
src = input(close, title="Source")
exp = input(true, "Use Exponential MA")
BandsStyle = input.string("Average True Range", options = ["Average True Range", "True Range", "Range"], title="Bands Style")
atrlength = input(10, "ATR Length")
esma(source, length)=>
	s = ta.sma(source, length)
	e = ta.ema(source, length)
	exp ? e : s
ma = esma(src, length)
rangema = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrlength) : ta.rma(high - low, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = ta.crossover(src, upper)
crossLower = ta.crossunder(src, lower)
bprice = 0.0
bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1])
sprice = 0.0
sprice := crossLower ? low -syminfo.mintick : nz(sprice[1])
crossBcond = false
crossBcond := crossUpper ? true
     : na(crossBcond[1]) ? false : crossBcond[1]
crossScond = false
crossScond := crossLower ? true
     : na(crossScond[1]) ? false : crossScond[1]
cancelBcond = crossBcond and (src < ma or high >= bprice )
cancelScond = crossScond and (src > ma or low <= sprice )
if (cancelBcond)
	strategy.cancel("KltChLE")
if (crossUpper)
	strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE")
if (cancelScond)
	strategy.cancel("KltChSE")
if (crossLower)
	strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE")

더 많은