양방향 MA 트레일링 스톱로스 전략


생성 날짜: 2023-11-16 17:18:59 마지막으로 수정됨: 2023-11-16 17:18:59
복사: 1 클릭수: 590
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

양방향 MA 트레일링 스톱로스 전략

개요

이 전략은 쌍방향 이동 평균을 통해 다공개 신호를 구축하여, 추적 스로프를 구현합니다. 이 전략의 핵심 아이디어는 이동 평균을 사용하여 트렌드 방향을 판단하고, 트렌드 방향으로 더 많은 공백을 하고, ATR을 사용하여 중지 손실을 계산하여, 추적 스로프를 구현하는 것입니다.

전략 원칙

이 전략은 hl2를 원천 가격으로 사용하고, 특정 주기 ATR을 중지 범위로 계산한다. ATR 값에 따라 특정 배수를 곱하여 상반과 하반을 계산한다. 가격이 상반을 통과할 때 구매 신호를 더 많이 생성하고, 가격이 하반을 통과할 때 판매 신호를 더 많이 생성한다.

포지션 개시 후, ATR의 실시간 변화에 따라 중지 수준을 조정하여 중지 추적을 구현한다. 구체적으로, 더 많은 것을 할 때, 하반면은 최신의 낮은 점에 따라 계속 상승하여 중지 추적을 구현한다.

따라서 이 전략은 이동 평균의 트렌드 방향을 판단하는 기능을 최대한 활용하고 ATR 기반의 스톱 로스 추적 장치를 추가하여 거래 방향의 정확성을 보장하고 거래 위험을 통제합니다.

전략적 이점

이 전략의 가장 큰 장점은 위험 제어에 있다. 전통적인 이동 평균 전략은 방향 판단만을 고려하여 포지션을 파기하기 쉽다. 이 전략은 ATR 계산의 추적 스톱로스를 추가하여 시장의 변동폭에 따라 스톱로스를 동적으로 조정하여 거래 위험을 효과적으로 제어 할 수 있다.

또한, 이 전략은 복합 다방면 양방향 거래를 다. 단일방향 전략에 비해, 추세가 변할 때 포지션 방향을 조기 조정할 수 있으며, 같은 방향으로 갇히지 않고 전략 수익을 높일 수 있다.

전략적 위험

이 전략의 주요 위험은 ATR 주기 및 배수의 설정에 있습니다. ATR 주기 너무 짧거나 배수가 너무 크면, 중지 범위는 너무 작아 위험을 효과적으로 제어 할 수 없습니다. ATR 주기 너무 길거나 배수가 너무 작으면, 중지 손실은 너무 느슨하여 수익을 얻는 것이 어렵습니다. 또한, 가격이 이동 평균을 돌파 할 때 포지션 신호를 쏘아 올릴 때 가짜 돌파가 발생할 수 있습니다.

변수주기와 배수를 최적화하여, 스톱로스 수익을 균형을 잡을 수 있습니다. 다른 지표와 결합하여 필터링 가짜 돌파구를 통해, 신호 품질을 향상시키고, 위험을 줄일 수 있습니다.

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 이동 평균 주기를 최적화하여 최적의 변수 조합을 찾습니다.

  2. MACD, KDJ 등 다른 지표 필터를 추가하여 신호 품질을 향상시킵니다.

  3. 고정 지분, 마팅거 등과 같은 포지션 관리 전략을 늘리고, 전략 수익을 높여라

  4. 다양한 품종의 변수 차이를 연구하고, 변수 최적화를 할 수 있다.

  5. 유전 알고리즘과 같은 기계 학습 방법과 결합하여 파라미터에 대한 훈련 최적화를 할 수 있다.

요약하다

이 전략은 트렌드 판단과 리스크 관리를 종합적으로 고려하고, 수익을 추구하면서 회전을 줄이는 데 중점을 둡니다. 변수 최적화 및 포지션과 같은 방법을 통해 전략 수익을 더욱 향상시킬 수 있습니다.

전략 소스 코드
/*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)