이동 평균과 슈퍼 트렌드를 가진 트렌드 다음 전략

저자:차오장, 날짜: 2023-10-20 16:50:01
태그:

img

전반적인 설명

이 전략은 트렌드를 추적하고 위험을 제어하기 위해 트렌드 다음 전략을 실행하기 위해 이동 평균 지표와 슈퍼 트렌드 지표를 결합합니다. 트렌드 판단 기능과 슈퍼 트렌드 스톱 로스 기능을 최대한 활용합니다.

전략 논리

이 전략은 거래 신호를 위해 두 개의 FRAMA 이동 평균과 필터링을 위해 SuperTrend 지표를 사용합니다.

특히, 빠른 라인이 느린 라인의 위를 넘을 때 구매 신호가 생성됩니다. 빠른 라인이 느린 라인의 아래를 넘을 때 판매 신호가 생성됩니다. 잘못된 브레이크를 피하기 위해 전략은 슈퍼 트렌드 지표가 정렬되도록 요구하는 필터를 추가합니다. 슈퍼 트렌드가 신호 방향에 동의 할 때만 거래를합니다.

포지션 관리를 위해 전략은 슈퍼 트렌드 방향 변경을 스톱 로스 신호로 사용합니다. 슈퍼 트렌드가 방향을 역전하면 포지션이 중단됩니다.

또한, 트레일링 스톱 손실은 옵션으로 활성화 될 수 있습니다. 특정 이익 목표가 달성 된 후, 트레일링 스톱은 이익을 잠금하는 데 사용할 수 있습니다.

이점 분석

  • 트렌드 방향을 결정하기 위해 이동 평균을 활용하고 시장 소음을 필터링하고 트렌드를 정확하게 판단 할 수 있습니다.
  • 슈퍼트렌드 필터와 결합하면 잘못된 브레이크로 인한 잘못된 거래를 피할 수 있습니다.
  • 슈퍼트렌드 방향 변경은 스톱 로스 포인트로 작용하여 빠른 스톱 로스 및 효과적인 리스크 통제를 허용합니다.
  • 선택적 인 후속 스톱 손실은 이익을 극대화 할 수 있습니다.

위험 분석

  • 트렌드를 따라가는 전략으로서, 시장의 변화로 인해 취약합니다. 포지션 크기를 통제해야합니다.
  • 이동 평균은 지연 효과를 가지고 있으며, 조기 또는 늦은 진입을 유발할 수 있습니다.
  • 부적절한 슈퍼 트렌드 매개 변수는 너무 공격적이거나 너무 보수적인 스톱 로스로 이어질 수 있습니다.
  • 트레일링 스톱을 활성화 할 때, 과도한 스톱 손실을 피하기 위해 트레일링 너비가 올바르게 설정되어야합니다.

이러한 위험은 이동 평균 매개 변수를 조정하고, 슈퍼 트렌드 설정을 최적화하고, 트레일링 스톱 로스를 적절하게 사용하여 줄일 수 있습니다.

최적화 방향

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

  1. 최적화 이동 평균 매개 변수 최고의 매개 변수 조합을 찾기

부드러움과 민감성의 최적의 균형을 찾기 위해 다른 기간 조합을 테스트 할 수 있습니다.

  1. 슈퍼트렌드 매개 변수를 사용자 정의

다른 ATR 기간과 곱셈값을 테스트하여 스톱 손실 효과를 최적화 할 수 있습니다.

  1. 다른 지표 필터를 추가합니다

더 많은 필터, 예를 들어, 돈치안 채널, 변동성 지표 등이 테스트될 수 있습니다.

  1. 후속 정지 매개 변수를 최적화

수익을 극대화하고 위험을 통제하기 위해 다른 후속 너비로 테스트 할 수 있습니다.

  1. 다른 스톱 로스 전략과 결합

고정 정지, 변동성 정지, 적응 정지 조합을 시험할 수 있습니다.

결론

이 전략은 이동 평균 트렌드 분석과 슈퍼 트렌드의 스톱 관리를 트레일링 스톱 손실과 함께 완전한 트렌드 다음 전략으로 통합합니다. 리스크 관리 및 매개 변수 최적화에 대한 추가 개선은 안정성과 수익성을 향상시킬 수 있습니다. 일부 경험을 가진 양적 거래자에게 적합합니다.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-13 00:00:00
period: 30m
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/
// © 03.freeman

//@version=4
// strategy("FRAMA strategy", overlay=true,precision=6, initial_capital=1000,calc_on_every_tick=true, pyramiding=0, default_qty_type=strategy.fixed, default_qty_value=10000, currency=currency.EUR)
ma_src = input(title="MA FRAMA Source", type=input.source, defval=close)
ma_frama_len = input(title="MA FRAMA Length", type=input.integer, defval=12)
res = input(title="Resolution", type=input.resolution, defval="1W")
frama_FC = input(defval=1,minval=1, title="* Fractal Adjusted (FRAMA) Only - FC")
frama_SC = input(defval=200,minval=1, title="* Fractal Adjusted (FRAMA) Only - SC")
High = security(syminfo.tickerid, res, high)
Low = security(syminfo.tickerid, res, low)
source = security(syminfo.tickerid, res, ma_src)
enterRule = input(false,title = "Use supertrend for enter")
exitRule = input(false,title = "Use supertrend for exit")

ma(src, len) =>
    float result = 0
    int len1 = len/2
    e = 2.7182818284590452353602874713527
    w = log(2/(frama_SC+1)) / log(e) // Natural logarithm (ln(2/(SC+1))) workaround
    H1 = highest(High,len1)
    L1 = lowest(Low,len1)
    N1 = (H1-L1)/len1
    H2_ = highest(High,len1)
    H2 = H2_[len1]
    L2_ = lowest(Low,len1)
    L2 = L2_[len1]
    N2 = (H2-L2)/len1
    H3 = highest(High,len)
    L3 = lowest(Low,len)
    N3 = (H3-L3)/len
    dimen1 = (log(N1+N2)-log(N3))/log(2)
    dimen = iff(N1>0 and N2>0 and N3>0,dimen1,nz(dimen1[1]))
    alpha1 = exp(w*(dimen-1))
    oldalpha = alpha1>1?1:(alpha1<0.01?0.01:alpha1)
    oldN = (2-oldalpha)/oldalpha
    N = (((frama_SC-frama_FC)*(oldN-1))/(frama_SC-1))+frama_FC
    alpha_ = 2/(N+1)
    alpha = alpha_<2/(frama_SC+1)?2/(frama_SC+1):(alpha_>1?1:alpha_)
    frama = 0.0
    frama :=(1-alpha)*nz(frama[1]) + alpha*src
    result := frama
    result

frama = ma(sma(source,1),ma_frama_len)
signal = ma(frama,ma_frama_len)
plot(frama, color=color.red)
plot(signal, color=color.green)


longCondition = crossover(frama,signal)
shortCondition = crossunder(frama,signal)

Factor=input(3, minval=1,maxval = 100)
Pd=input(7, minval=1,maxval = 100)


Up=hl2-(Factor*atr(Pd))
Dn=hl2+(Factor*atr(Pd))

TrendUp = 0.0
TrendDown = 0.0
Trend = 0.0
Tsl = 0.0
TrendUp :=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown :=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn

Trend := close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl := Trend==1? TrendUp: TrendDown

linecolor = Trend == 1 ? color.green : color.red

//plot(Tsl, color = linecolor , style =  plot.style_line , linewidth = 2,title = "SuperTrend")

plotshape(cross(close,Tsl) and close>Tsl , "Up Arrow", shape.triangleup,location.belowbar,color.green,0,0)
plotshape(cross(Tsl,close) and close<Tsl , "Down Arrow", shape.triangledown , location.abovebar, color.red,0,0)

plotarrow(Trend == 1 and Trend[1] == -1 ? Trend : na, title="Up Entry Arrow", colorup=color.lime, maxheight=60, minheight=50, transp=0)
plotarrow(Trend == -1 and Trend[1] == 1 ? Trend : na, title="Down Entry Arrow", colordown=color.red, maxheight=60, minheight=50, transp=0)


//  Strategy: (Thanks to JayRogers)
// === STRATEGY RELATED INPUTS ===
//tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 0, title = "Take Profit Points", minval = 0)
inpStopLoss     = input(defval = 0, title = "Stop Loss Points", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss Points", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong() => enterRule? (longCondition and Trend ==1):longCondition                                             // functions can be used to wrap up and work out complex conditions
exitLong() => exitRule and Trend == -1

strategy.entry(id = "Buy", long = true, when = enterLong() )             // use function or simple condition to decide when to get in
strategy.close(id = "Buy", when = exitLong() )                         // ...and when to get out

// === STRATEGY - SHORT POSITION EXECUTION ===
enterShort() => enterRule? (shortCondition and Trend ==-1):shortCondition
exitShort() => exitRule and Trend == 1

strategy.entry(id = "Sell", long = false, when = enterShort())
strategy.close(id = "Sell", when = exitShort() )

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Buy", from_entry = "Buy", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Sell", from_entry = "Sell", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)

// === Backtesting Dates === thanks to Trost

testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testStopHour = input(23, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = true
// === /END

if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

더 많은