이 전략은 이중 이동 평균을 통해 긴 및 짧은 신호를 생성하고 추적 스톱 손실을 구현합니다. 핵심 아이디어는 이동 평균으로 트렌드 방향을 결정하고 트렌드를 따라 길거나 짧게 이동하고 ATR을 사용하여 스톱 손실을 추적하는 스톱 손실을 계산하는 것입니다.
이 전략은 hl2를 소스 가격으로 사용하고 특정 기간의 ATR을 스톱 로스 범위로 계산합니다. 상부 및 하부 대역은 특정 인수로 곱한 ATR을 기반으로 계산됩니다. 가격이 상부 대역을 넘을 때, 구매 신호가 생성됩니다. 가격이 하부 대역을 넘을 때, 판매 신호가 생성됩니다.
포지션 개척 후, 스톱 손실은 추적 스톱 손실을 달성하기 위해 ATR의 변화에 따라 실시간으로 조정됩니다. 구체적으로, 장기간 거래 후, 하위 대역은 최신 최저 기준에 따라 점진적으로 상승하여 스톱 손실을 추적합니다. 단위로 전환한 후, 상위 대역은 최신 최고 기준에 따라 점진적으로 감소하여 스톱 손실을 추적합니다.
이러한 방식으로, 이 전략은 트렌드 방향을 결정하는 이동 평균의 능력을 최대한 활용하고, 또한 거래 방향과 위험 통제를 보장하기 위해 ATR에 기반한 추적 스톱 로스 메커니즘을 통합합니다.
이 전략의 가장 큰 장점은 위험 통제에 있다. 전통적인 이동 평균 전략은 방향 판단만을 고려하고 쉽게 계좌를 폭발시킬 수 있다. 스톱 손실을 추적하기 위해 ATR을 통합함으로써 이 전략은 시장 변동성에 따라 스톱 손실을 동적으로 조정하여 거래 위험을 효과적으로 제어할 수 있다.
또한 이 전략은 쌍방향 거래를 결합한다. 단방향 전략에 비해, 트렌드가 역전될 때 위치 방향을 신속하게 조정할 수 있어 한 방향으로 갇히지 않고 전략 수익성을 향상시킨다.
이 전략의 주요 위험은 ATR 기간 및 멀티플리커의 매개 변수 설정에서 발생합니다. ATR 기간이 너무 짧거나 멀티플리커가 너무 크면 위험 요소를 효과적으로 제어하기 위해 스톱 손실 범위가 너무 작을 것입니다. ATR 기간이 너무 길거나 멀티플리커가 너무 작으면 스톱 손실이 수익에 너무 느슨해질 것입니다. 또한 가격이 이동 평균에 침투 할 때 잘못된 브레이크의 위험이 있습니다.
위험은 ATR 기간과 증배수를 최적화하여 스톱 로스 및 수익 목표 사이의 균형을 맞추고 거짓 브레이크를 필터하고 신호 품질을 향상시키기 위해 다른 지표를 통합하여 관리 할 수 있습니다.
이 전략은 다음과 같은 측면에서 강화될 수 있습니다.
가장 좋은 매개 변수 조합을 찾기 위해 이동 평균 기간을 최적화합니다.
MACD, KDJ 등과 같은 다른 지표를 추가하여 신호를 필터하고 품질을 향상시킵니다.
수익성을 높이기 위해 고정 분수, 마틴게일 등과 같은 포지션 사이징을 포함합니다.
연구 매개 변수 최적화를 위한 다양한 제품 간의 차이.
매개 변수 훈련과 최적화를 위해 유전 알고리즘과 같은 기계 학습을 적용합니다.
이 전략은 트렌드 판단과 위험 통제를 완전히 고려하고, 마이너 다운을 낮추면서 수익을 추구합니다. 매개 변수 최적화 및 포트폴리오 방법을 통해 추가 강화는 전략 수익성을 향상시키는 데 도움이 될 수 있습니다. 요약하면, 이것은 명확한 논리와 쉬운 구현을 가진 견고하고 안정적인 양적 거래 전략입니다.
/*backtest start: 2022-11-09 00:00:00 end: 2023-11-15 00:00:00 period: 1d basePeriod: 1h 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/ // © KivancOzbilgic //@version=4 strategy("Trenbolone Strategy", overlay = true) Periods = input(title="ATR Period", type=input.integer, defval=10) src = input(hl2, title="Source") Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0) changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true) showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false) highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true) barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true) atr2 = sma(tr, Periods) atr= changeATR ? atr(Periods) : atr2 up=src-(Multiplier*atr) up1 = nz(up[1],up) up := close[1] > up1 ? max(up,up1) : up dn=src+(Multiplier*atr) dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green) buySignal = trend == 1 and trend[1] == -1 plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0) plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0) dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red) sellSignal = trend == -1 and trend[1] == 1 plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0) plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0) mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0) longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor) fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor) FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 999) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 999) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window() => time >= start and time <= finish ? true : false longCondition = buySignal if (longCondition) strategy.entry("BUY", strategy.long, when = window()) shortCondition = sellSignal if (shortCondition) strategy.entry("SELL", strategy.short, when = window()) buy1 = barssince(buySignal) sell1 = barssince(sellSignal) color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na barcolor(barcoloring ? color1 : na)