동적 트렌드 추적 최적화 전략

저자:차오장, 날짜: 2024-01-12 11:20:04
태그:

img

전반적인 설명

이 전략은 CMO 지표와 변화율을 계산하여 동적으로 지원 라인을 그래프화합니다. 가격은 지원 라인을 통과 할 때 거래 신호가 생성됩니다. 한편, 전략은 또한 더 많은 이익을 잠금하기 위해 지원 라인을 둘러싼 스톱 로스 범위를 최적화합니다.

전략 논리

  1. 가격 동향을 결정하기 위해 CMO 지표를 계산합니다.
  2. 가격 변화 추세를 반영하기 위해 Var의 변화율을 계산
  3. 변화율에 기초한 그래프 지원 라인
  4. 최적화된 스톱 손실 라인을 계산합니다.
  5. 가격이 지지선을 넘으면 거래 신호를 생성합니다.

이점 분석

  1. CMO 지표를 사용하여 가격 트렌드를 결정하고 잘못된 파장을 피합니다.
  2. 지원선은 트렌드 방향을 명확히 나타냅니다.
  3. 더 많은 수익을 위한 최적화된 스톱 로스 잠금
  4. 명확하고 간단한 거래 신호, 쉽게 따라

위험 분석

  1. CMO 지표는 지연 효과가 있으며 가격 전환점을 놓칠 수 있습니다.
  2. 지원 라인의 파열은 잘못된 신호를 생성 할 수 있습니다.
  3. 잘못된 스톱 로스 최적화는 더 큰 손실로 이어질 수 있습니다.

위험 해결 방법:

  1. 뒤떨어지는 것을 줄이기 위해 CMO 매개 변수를 적절히 조정
  2. 잘못된 신호를 피하기 위해 다른 표시기와 더 많은 필터를 추가
  3. 적절한 스톱 손실 최적화 비율을 결정하기 위한 시험

최적화 방향

  1. 거짓 신호를 필터링하기 위해 더 많은 표시기를 추가합니다.
  2. 인공지능 자동화 정지 손실 범위 최적화
  3. 자동 조정 거래 크기

요약

전체적으로 이 전략은 트렌드 방향을 명확히 결정하기 위해 지지선을 사용하여 잘 작동합니다. CMO 지표와 최적화된 스톱 로스로 결합하면 좋은 결과를 얻을 수 있습니다. 그러나 더 많은 지표를 결합함으로써 개선 될 수있는 잘못된 신호의 위험이 있습니다.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-01-11 00:00:00
period: 45m
basePeriod: 5m
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/
// © melihtuna

//@version=4
strategy("Optimized Trend Tracker - Strategy Version", shorttitle="OTT-Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000, currency=currency.USD, commission_value=0.1, commission_type=strategy.commission.percent)

src = input(close, title="Source")
pds=input(1, "OTT Period", minval=1)
percent=input(0.1, "OTT Percent", type=input.float, step=0.1, minval=0)
condition = input(title="Condition", defval="Support Line Crossing Signals", options=["Price/OTT Crossing Signals", "Support Line Crossing Signals"])
showsupport = input(title="Show Support Line?", type=input.bool, defval=true)
highlight = input(title="Show OTT Color Changes?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloing = input(title="Barcolor On/Off ?", type=input.bool, defval=true)
showlabels = input(title="Show OTT BUY/SELl Labels?", type=input.bool, defval=false)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2020, title = "From Year", minval = 2017)
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 = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

alpha=2/(pds+1)
ud1=src>src[1] ? src-src[1] : src
dd1=src<src[1] ? src[1]-src : src
UD=sum(ud1,9)
DD=sum(dd1,9)
CMO=(UD-DD)/(UD+DD)
k= abs(CMO)
Var=0.0
Var:=(alpha*k*src)+(1-alpha*k)*nz(Var[1])
fark=Var*percent*0.01
longStop = Var - fark
longStopPrev = nz(longStop[1], longStop)
longStop := Var > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop =  Var + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := Var < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and Var > shortStopPrev ? 1 : dir == 1 and Var < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop
OTT=Var>MT ? MT*(200+percent)/200 : MT*(200-percent)/200 
plot(showsupport ? Var : na, color=#0585E1, linewidth=2, title="Support Line")
OTTC = highlight ? OTT[2] > OTT[3] ? color.green : color.red : #B800D9 
pALL=plot(nz(OTT[2]), color=OTTC, linewidth=2, title="OTT", transp=0)

buySignalk = window() and crossover(Var, OTT[2])
sellSignallk = window() and crossunder(Var, OTT[2])
buySignalc = window() and crossover(src, OTT[2])
sellSignallc = window() and crossunder(src, OTT[2])

plotshape(condition == "Support Line Crossing Signals" ? showlabels and buySignalk ? OTT*0.995 : na : showlabels and buySignalc ? OTT*0.995 : na, title="BUY", text="BUY", location=location.belowbar, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
plotshape(condition == "Support Line Crossing Signals" ? showlabels and sellSignallk ? OTT*1.005 : na : showlabels and sellSignallc ? OTT*1.005 : na, title="SELL", text="SELL", location=location.abovebar, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)
  
ottBuyColor=#77DD77
ottSellColor=#FF0000
vColor = strategy.position_size > 0 ? ottBuyColor : ottSellColor

if condition == "Support Line Crossing Signals"
    strategy.entry("BUY", true, 1, when = buySignalk)
    strategy.entry("SELL", false, 1, when = sellSignallk)
else
    strategy.entry("BUY", true, 1, when = buySignalc)
    strategy.entry("SELL", false, 1, when = sellSignallc)

mPlot = plot(close, title="", style=plot.style_circles, linewidth=0,display=display.none)

longFillColor = highlighting ? (Var>OTT ? color.green : na) : na
shortFillColor = highlighting ? (Var<OTT ? color.red : na) : na
fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

barcolor(barcoloing ? vColor : na)





더 많은