콤비네이션 전략에 따른 동력 파업 및 트렌드

저자:차오장, 날짜: 2023-12-13 16:41:25
태그:

img

전반적인 설명

이 전략은 동력 지표, 트렌드 다음 지표 및 이동 평균 지표를 통합하여 트렌드 다음 및 브레이크아웃 진입/출출을 실현하는 조합 전략입니다. 주로 스토카스틱 지표와 슈퍼 트렌드 지표의 조합을 사용하여 진입/출출 시기를 결정하고 EMA 라인을 사용하여 주요 시장 트렌드를 판단합니다.

전략 원칙

이 전략은 다음의 지표로 구성됩니다.

  1. EMA 라인: EMA 25, 50, 100 및 200을 사용하여 주요 트렌드를 결정합니다. EMA25가 EMA50을 넘고 EMA100가 EMA200을 넘으면 상승 추세이고 그렇지 않으면 하락 추세입니다.

  2. 슈퍼트렌드 트렌드 추적 지표: 현재 가격이 상승 추세인지 하락 추세인지 판단하기 위한 매개 변수 인 인자 3 및 ATR 10입니다. 슈퍼트렌드가 녹색이면 상승 추세입니다. 빨간색이면 하락 추세입니다.

  3. 스토카스틱 모멘텀 지표: %K 8 및 %D 3는 스토카스틱이 황금 십자 또는 죽은 십자 를 생성하는지 여부를 결정합니다.

구매 전략은: EMA는 상승 추세를 나타냅니다 + 슈퍼트렌드는 상승 추세를 나타냅니다 + 스토카스틱 골든 크로스
판매 전략은: EMA는 하락 추세를 + 슈퍼트렌드는 하락 추세를 + 스토카스틱 마드 크로스를 보여줍니다.

이 전략은 트렌드, 모멘텀 및 브레이크아웃 지표를 통합하여 시장 움직임과 거래 지점을 안정적으로 결정합니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 여러 가지 지표를 결합하면 안정성이 향상되고 가짜 파장을 효과적으로 필터링합니다.

  2. 추진력 표시기를 추가하면 전환점을 조기에 발견할 수 있습니다.

  3. 사용자 정의 가능한 매개 변수는 다른 시장 환경에 적합합니다.

  4. 상대적으로 효율적인 스톱 로스 및 수익 설정이 실현됩니다.

  5. 매일처럼 긴 시간대에 백테스트를 하면 잘 작동합니다.

위험 분석

또한 몇 가지 위험이 있습니다.

  1. 잘못된 매개 변수 설정은 너무 빈번한 거래 또는 불안정한 신호를 일으킬 수 있습니다. 매개 변수는 최적화해야합니다.

  2. 아직 시점에 잘못된 판단이 있을 수 있습니다. 더 많은 필터 지표가 추가될 수 있습니다.

  3. 스토카스틱 극단에 설정된 스톱 손실은 너무 가깝을 수 있습니다. 더 넓은 스톱은 테스트 할 가치가 있습니다.

  4. 불충분한 백테스트 데이터는 매개 변수 조정에 편차를 일으킬 수 있습니다. 백테스트 기간을 확장하십시오.

최적화 방향

전략은 다음과 같은 방법으로 최적화 될 수 있습니다.

  1. 최적을 찾기 위해 더 많은 매개 변수 집합을 테스트합니다. 예를 들어 슈퍼 트렌드 인수를 조정합니다.

  2. 잘못된 판단을 줄이기 위해 에너지나 변동성 같은 더 많은 필터 지표를 추가합니다.

  3. 다른 스톱 로스 방법을 테스트합니다. 예를 들어, 비율에 기반한 스톱 로스.

  4. 최적화하여 수익을 취하는 것 처럼 더 많은 수익을 확보하기 위해 후속 중지.

  5. 범위를 넓히고 더 많은 제품이나 더 긴 기간에 적응하세요.

결론

전략의 논리는 명확하고 지표 선택은 합리적입니다. 좋은 백테스트 결과로 트렌드 다음 및 모멘텀 브레이크아웃 거래를 실현합니다. 그러나 여전히 매개 변수 조정, 필터 추가, 정지 개선 및 수익 취득 등 최적화에 대한 여지가 있습니다. 다차원적 최적화는 전략을 더 견고하게 만들 수 있습니다.


/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-06 07:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Supertrend + Stoch Strategy", overlay=true)

// ---inputs---
pl = input(1.5, title="P/L", minval=0.1)
lossPercentage = input(1, title="Loss Percentage", minval=1, maxval=100)
atrPeriod = input(10, "ATR Length")
factor = input(3, "Supertrend Factor")
periodK = input(8, title="%K Length", minval=1)
smoothK = input(3, title="%K Smoothing", minval=1)
periodD = input(3, title="%D Smoothing", minval=1)
ema1l = input(25, title="EMA 1 Length", minval=1)
ema2l = input(50, title="EMA 2 Length", minval=1)
ema3l = input(100, title="EMA 3 Length", minval=1)
ema4l = input(200, title="EMA 4 Length", minval=1)

// ---lines---
ema1 = ema(close, ema1l)
ema2 = ema(close, ema2l)
ema3 = ema(close, ema3l)
ema4 = ema(close, ema4l)
trendUpper = ema1 > ema2 and ema3 > ema4
trendLower = ema1 < ema2 and ema3 < ema4

[supertrend, direction] = supertrend(factor, atrPeriod)
supertrendUpper = direction < 0
supertrendLower = direction > 0

k = sma(stoch(close, high, low, periodK), smoothK)
d = sma(k, periodD)
stochCrossOver = crossover(k, d)
stochCrossUnder = crossunder(k, d)

// ---plot---
plot(ema1, color=color.green)
plot(ema2, color=color.orange)
plot(ema3, color=color.blue)
plot(ema4, color=color.purple)

bodyMiddle = plot((open + close) / 2, display=display.none)
upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend = plot(direction < 0 ? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr)
fill(bodyMiddle, upTrend, color.new(color.green, 95), fillgaps=false)
fill(bodyMiddle, downTrend, color.new(color.red, 95), fillgaps=false)

// ---stop place compute---
edge = 0.  // periodly high/low
edge := stochCrossOver ? high : stochCrossUnder ? low : k > d ? max(edge[1], high) : k < d ? min(edge[1], low) : edge[1]

// plot(edge)

// ---trade condition---
// longCond = trendUpper and supertrendUpper and stochCrossOver
// shortCond = trendLower and supertrendLower and stochCrossUnder
longCond = trendUpper and supertrendUpper and stochCrossOver and strategy.position_size == 0
shortCond = trendLower and supertrendLower and stochCrossUnder and strategy.position_size == 0

// ---stop & take---
stop = 0.
stop := nz(stop[1], stop)
take = 0.
take := nz(take[1], take)

if longCond
    stop := edge[1]
    take := close + (close - stop) * pl
if shortCond
    stop := edge[1]
    take := close - (stop - close) * pl

// ---trade---
qty = strategy.equity / abs(stop - close) / 100 * lossPercentage

strategy.entry("Buy", strategy.long, when=longCond, qty=qty)
strategy.exit("Close Buy","Buy", limit=take, stop=stop)

strategy.entry("Sell", strategy.short, when=shortCond, qty=qty)
strategy.exit("Close Sell","Sell", limit=take, stop=stop)

stopLine = plot(strategy.position_size != 0 ? stop : na, color=color.red, style=plot.style_linebr)
takeLine = plot(strategy.position_size != 0 ? take : na, color=color.green, style=plot.style_linebr)
entryLine = plot(strategy.position_size != 0 ? strategy.position_avg_price : na, color=color.blue, style=plot.style_linebr)
fill(entryLine, stopLine, color.new(color.red, 90), fillgaps=false)
fill(entryLine, takeLine, color.new(color.green, 90), fillgaps=false)

더 많은