이 전략은 조합 전략으로, 동력 지표, 트렌드 추적 지표 및 평균선 지표를 결합하여, 트렌드 추적과 브레이크 구매/판매를 구현한다. 구매/판매 시기를 판단하는 것은 주로 스토카스틱 지표와 슈퍼트렌드 지표의 조합을 통해이며, EMA 평균선으로 시장의 주요 트렌드를 판단한다.
이 전략은 주로 다음과 같은 몇 가지 지표로 구성됩니다.
EMA 평균선: EMA 25, 50, 100, 200를 사용하여 4개의 평균선을 사용하여 주요 트렌드를 판단한다. EMA25에서 EMA50을 통과하고 EMA100에서 EMA200을 통과하면 상승 추세이며 그렇지 않으면 하락 추세이다.
슈퍼트렌드 트렌드 추적 지표: Factor 3와 ATR 10의 변수를 사용하여 현재 가격이 상승 또는 하락 추세에 있는지 판단합니다. 슈퍼트렌드가 녹색이면 상승 추세, 빨간색은 하락 추세입니다.
스토캐스틱 동력 지표: %K 8과 %D 3, 스토캐스틱이 골드포크 또는 데드포크 현상을 발생하는지 판단한다. %K 선이 아래에서 %D 선을 통과할 때 골드포크 신호이며, 반대로 데드포크 신호이다.
구매 전략은: EMA가 상승 추세를 나타내고 + Supertrend이 상승 추세를 나타내고 + Stochastic 황금 포크 시간. 판매 전략은: EMA가 하향 추세를 나타내고 + Supertrend이 하향 추세를 나타내고 + Stochastic 사다리 시간.
이 전략은 트렌드, 동력, 그리고 3가지의 지표들을 통합하여 시장의 움직임을 비교적 안정적으로 판단할 수 있다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
여러 지표와 함께 판단력이 강하여 가짜 돌파구를 효과적으로 필터링 할 수 있습니다.
동력 지표의 추가로 전환점을 조기 판단할 수 있다.
사용자 정의 가능한 매개 변수, 다른 시장 환경에 적용
상대적으로 효율적인 스톱 및 스톱 설정을 구현한다.
태양선과 같은 고주기에서 재검토할 수 있으며, 효과도 좋다.
이 전략에는 몇 가지 위험도 있습니다.
매개 변수 설정이 잘못되면 거래 빈도나 신호 불안정성이 발생할 수 있다. 매개 변수 조정이 필요하다.
선택 시에는 여전히 잘못된 판단이 발생할 수 있습니다. 더 많은 미세한 파동 지표를 추가하는 것을 고려할 수 있습니다.
스톱스피는 스토카스틱 지표의 극한값으로 설정되어 있으며, 너무 가까이 다가갈 수 있으므로 적절한 완화를 고려할 수 있습니다.
응답 데이터가 부족하여 파라미터 적합성에 영향을 미칠 수 있으므로 응답 주기를 확장해야 한다.
이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.
더 많은 변수 조합을 테스트하여 최적의 변수를 찾습니다. 예를 들어 Supertrend의 Factor 변수를 조정합니다.
에너지 지표, 변동률 지표 등과 같은 더 많은 필러파 지표를 추가하여 잘못된 판단의 가능성을 줄인다.
다른 손실 방법을 테스트 할 수 있습니다. 예를 들어, 극한에서 특정 비율의 손실 라인을 설정합니다.
더 많은 수익을 확보하기 위해 동적 상쇄를 고려하는 것과 같은 상쇄 방법을 최적화하십시오.
전략의 적용 범위를 넓히고, 예를 들어 더 많은 거래 품종을 적용하거나 더 높은 주기에 사용하려고 한다.
이 전략은 전체적인 아이디어가 명확하고, 지표 선택이 합리적이며, 트렌드 추적과 브레이크 거래를 구현하고, 재측량 효과가 좋다. 그러나 여전히 최적화 공간이 존재하며, 매개 변수를 조정하고, 더 많은 파동 지표를 추가하고, 손해 중지 방식을 개선하는 등 다방면 최적화를 통해 전략이 더 안정적이고 신뢰할 수 있다.
/*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)