이 전략은 트렌드를 판단하고 상대적으로 안정적인 트렌드 추적 거래를 구현하기 위해 기술 지표 STC, 이동 평균 MA 및 평균 진정한 범위 ATR을 결합합니다.
STC 지표는 트렌드 반전을 판단합니다. 빠른 라인을 빼고 느린 라인을 사용하여 2차 평형을 처리하여 일관성있는 트렌드 신호를 형성합니다. 인디케이터가 0 축 위를 넘고 판매 신호가 0 축 아래를 넘을 때 구매 신호가 발생합니다.
이동 평균 MA는 트렌드 방향을 판단합니다. 주식 가격이 MA를 넘을 때 상승 추세를 신호하여 긴 포지션 보유 신호를 제공합니다. 가격이 MA를 넘을 때 하락 추세를 신호하여 짧은 포지션 보유 신호를 제공합니다.
ATR 지표는 스톱 로스를 설정하고 이윤을 취합니다. ATR은 시장 변동성에 따라 스톱 로스를 동적으로 조정하고 이윤 포인트를 취할 수 있습니다. ATR은 상승 추세에서 상승하고 하락 추세에서 떨어지는 거래 방향 자체에 대한 신호로 작용합니다.
이 전략은 STC 신호를 진입의 주요 시점으로 삼고 MA를 보조 트렌드 판단으로 사용하고 ATR을 스톱 로스 및 리프트를 위해 사용합니다. STC가 구매 신호를 주면, MA가 상승 추세를 보이고 ATR이 상승하면 긴 포지션을 개척합니다. STC가 판매 신호를 주면, MA가 하락 추세를 보이고 ATR이 하락하면 쇼트 포지션을 개척합니다.
이 전략은 트렌드와 전환점을 판단하기 위해 여러 지표를 결합하여 거래 신호의 정확성을 향상시킵니다.
STC는 반전 신호를 캡처하고 트렌드에 갇히지 않도록 할 수 있습니다. MA는 주요 트렌드를 따르는 것을 보장하기 위해 불확실한 반전 신호를 필터합니다.
ATR은 시장의 변동성에 따라 동적 스톱 로스를 설정하고 수익을 취하며 엄청난 손실을 피합니다.
여러 지표의 조합은 강한 트렌드 추적 능력을 형성합니다. 역사적 백테스트는 상대적으로 안정적인 수익성을 보여줍니다.
STC는 시간 지연이 있어 가격 전환에 최적의 시기를 놓칠 수 있습니다.
MA는 급격한 가격 변동이 있을 때 지연하는 경향이 있는데 이는 잘못된 신호를 일으킬 수 있습니다.
ATR Stop Loss는 초 안에 타격될 수 있습니다. ATR 곱셈기는 큰 트렌드 중에 느슨하거나 일시적으로 비활성화되어야 합니다.
더 많은 지표는 스톱 로스를 타는 확률이 더 높다는 것을 의미합니다. 불필요한 스톱 로스를 피하기 위해 매개 변수를 조정해야합니다.
STC 매개 변수를 조정해서 반전에 더 빠르게 반응하는 조합을 찾아
더 나은 트렌드 추적을 위해 MA 기간 매개 변수를 최적화하십시오.
다른 ATR 배수의 시험 충격
STC를 다른 지표로 대체해 더 잘 어울리도록 해 보세요.
멀티 파라미터 자동 최적화를 위한 기계 학습 알고리즘을 도입합니다.
큰 사이클 트렌드를 고려하고 다른 단계를 구별하십시오.
STC MA ATR 전략은 안정적인 트렌드 추적 거래를 위해 트렌드 반전 지점을 포착하기 위해 3 개의 지표를 결합합니다. 지표 조합은 잘못된 신호를 필터하고 스톱 로스 / 토익으로 위험을 제어합니다. 강력한 견고성과 안정성을 가지고 있습니다. 매개 변수 최적화 및 알고리즘 도입을 통해 추가 개선이 가능합니다. 전반적으로 신뢰할 수 있고 온건한 전략 선택입니다.
/*backtest start: 2023-09-16 00:00:00 end: 2023-10-16 00:00:00 period: 4h basePeriod: 15m 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/ // © Romedius //@version=5 strategy("My Strategy", overlay=true, margin_long=100, margin_short=100) // STC EEEEEE=input(12,"Length",group="STC") BBBB=input(26,"FastLength",group="STC") BBBBB=input(50,"SlowLength",group="STC") AAAA(BBB, BBBB, BBBBB) => fastMA = ta.ema(BBB, BBBB) slowMA = ta.ema(BBB, BBBBB) AAAA = fastMA - slowMA AAAA AAAAA(EEEEEE, BBBB, BBBBB) => //AAA=input(0.5) var AAA = 0.5 var CCCCC = 0.0 var DDD = 0.0 var DDDDDD = 0.0 var EEEEE = 0.0 BBBBBB = AAAA(close,BBBB,BBBBB) CCC = ta.lowest(BBBBBB, EEEEEE) CCCC = ta.highest(BBBBBB, EEEEEE) - CCC CCCCC := (CCCC > 0 ? ((BBBBBB - CCC) / CCCC) * 100 : nz(CCCCC[1])) DDD := (na(DDD[1]) ? CCCCC : DDD[1] + (AAA * (CCCCC - DDD[1]))) DDDD = ta.lowest(DDD, EEEEEE) DDDDD = ta.highest(DDD, EEEEEE) - DDDD DDDDDD := (DDDDD > 0 ? ((DDD - DDDD) / DDDDD) * 100 : nz(DDDDDD[1])) EEEEE := (na(EEEEE[1]) ? DDDDDD : EEEEE[1] + (AAA * (DDDDDD - EEEEE[1]))) EEEEE mAAAAA = AAAAA(EEEEEE,BBBB,BBBBB) stc = mAAAAA > mAAAAA[1] ? true : false stc_sig = stc == true and stc[1] == false ? 1 : stc == false and stc[1] == true ? -1 : 0 stc_long = stc_sig == 1 stc_short = stc_sig == -1 // STC end // ATR stops nATRPeriod = input(5,group="ATR Stops") nATRMultip = input(3.5,group="ATR Stops") xATR = ta.atr(nATRPeriod) nLoss = nATRMultip * xATR xATRTrailingStop = 0.0 xATRTrailingStop := close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), close - nLoss) : close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), close + nLoss) : close > nz(xATRTrailingStop[1], 0) ? close - nLoss : close + nLoss pos = 0 pos := close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0) ? 1 : close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0) atr_sig = pos == -1 ? false : true // ATR stops end // ma ma_len = input(200, title="MA Length", group="Moving Average") ma = ta.sma(close, 200) ma_sig = close < ma ? false : true // ma end // strategy entries tp_mult = input(2, title="Take Profit ATR Multiplier", group="Strategy") sl_mult = input(1, title="Stop Loss ATR Multiplier", group="Strategy") early_stop = input(true, title="Close position when ATR changes color") atr_stop = if close < xATRTrailingStop close - (close - xATRTrailingStop) * sl_mult else close + (xATRTrailingStop - close) * sl_mult longCondition = atr_sig == true and stc_sig == 1 and ma_sig == true shortCondition = atr_sig == false and stc_sig == -1 and ma_sig == false if (longCondition) strategy.entry("Long", strategy.long) strategy.exit("Exit Long", "Long", limit=close + xATR * tp_mult, stop=atr_stop) else if atr_sig == false and early_stop strategy.close("Long") if (shortCondition) strategy.entry("Short", strategy.short) strategy.exit("Exit Short", "Short", limit=close - xATR * tp_mult, stop=atr_stop) else if atr_sig == true and early_stop strategy.close("Short") // plot stuff atr_color = pos == -1 ? color.red: pos == 1 ? color.green : color.blue plot(atr_stop, title="ATR Stop", color=atr_color) ma_color = ma_sig ? color.green : color.red plot(ma, title="Moving Average", color=ma_color) stc_color = stc_long ? color.green : color.red plotshape(stc_long, style=shape.triangleup, color=stc_color, title="STC Long Signal", size=size.tiny) plotshape(stc_short, style=shape.triangledown, color=stc_color, title="STC Short Signal", size=size.tiny) // plot stuff end