슈퍼 트렌드 스톱 트레일링 트레이딩 전략


생성 날짜: 2023-09-18 16:05:31 마지막으로 수정됨: 2023-09-18 16:05:31
복사: 0 클릭수: 880
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 슈퍼 트렌드 지표를 사용하여 가격 흐름을 판단하고, 스톱 로스 메커니즘과 함께 트렌드 추적 거래를 수행한다. 그것은 두 개의 이동 평균의 차이를 결합하여 슈퍼 트렌드 지표를 구성하며, 지표는 더 많이 파고, 아래쪽은 공허하다. 동시에 스톱 로스를 설정하여 과도한 손실을 피한다.

전략 원칙

빠른 선과 느린 선의 DEMA를 계산하고, 두 선의 차치값에 따라 슈퍼 트렌드 방향을 결정한다. 상승 추세에서 빠른 선에 느린 선을 더 많이 통과한다. 하향 추세에서 빠른 선 아래의 느린 선을 공백으로 통과한다. 입문 후, 스톱 로드 라인을 설정하고, 손실이 스톱 로드 범위에 도달하면 손실이 종료된다.

우위 분석

  • 슈퍼 트렌드를 판단하는 가격 트렌드는 간단하고 효과적입니다.
  • 단편 거래 위험을 효과적으로 제어하는 손해 방지 장치
  • 다른 단계에 따라 다른 파라미터 조합을 사용할 수 있습니다.
  • 철수 통제 능력이 강하다

위험 분석

  • 이동 평균 판단의 추세가 뒤떨어져 있습니다.
  • 너무 느슨한 스톱포인트 설정으로 손실이 커질 수 있습니다.
  • 거래 빈도, 수수료 부담
  • 트렌드 전환점을 정확히 판단할 수 없습니다.

적당히 평균주기를 단축하고, 스톱로스를 최적화하고, 거래 횟수를 줄여서 위험을 조절할 수 있다.

최적화 방향

  • 다른 빠른/ 느린 선의 변수 조합을 테스트합니다.
  • 스톱 로즈 변수를 최적화합니다.
  • 다른 지표와 함께 추세 전환을 고려합니다.
  • 다양한 품종에서 테스트 파라미터 강도

요약하다

이 전략은 간단한 지표를 사용하여 트렌드 방향을 판단하고, 손실을 제어하는 위험을 감수하며, 일일 거래에 적합하다. 파라미터 조정 등을 통해 효과를 더욱 높일 수 있다.

전략 소스 코드
/*backtest
start: 2023-09-10 00:00:00
end: 2023-09-13 00:00:00
period: 2m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "[Prod] SuperTrend with Stoploss+TrendZones - 1H", default_qty_type=strategy.percent_of_equity, default_qty_value=100, shorttitle = "[Prod] SuperTrend with Stoploss+TrendZones - 1H", overlay = true, commission_type=strategy.commission.percent, commission_value=0.3)
//--cyberfunk 2018 
 
////////////////////////////////////////////////////////////
// This section of code was borrowed from "Trend Trader Strategy" to 
// help us det. if we are in an uptrend or downtrend.
////////////////////////////////////////////////////////////
Length = input(12, minval=1),   // 19 / 5 also works for lenth /multiplier... but 11 /4 seems slightly more optimal somehow
Multiplier = input(4, minval=1)
avgTR      = wma(atr(1), Length)
highestC   = highest(Length)
lowestC    = lowest(Length)
hiLimit = highestC[1]-(avgTR[1] * Multiplier)
loLimit = lowestC[1]+(avgTR[1] * Multiplier)
ret = na
pos =na
ret := iff(close > hiLimit and close > loLimit, hiLimit,iff(close < loLimit and close < hiLimit, loLimit, nz(ret[1], 0)))
pos :=	iff(close > ret, 1,iff(close < ret, -1, nz(pos[1], 0))) 
//barcolor(pos == -1 ? red: pos == 1 ? green : blue )
plot(ret, color= blue , title="Trend Trader Strategy")
uptrend = if close > ret  // this will be used later to determine which domain we are in (uptrend or downtrend)
    true
else
    false
/////////////////////////////////////////////////////////////////////
// This script has been optimized for the 1 hr candle window view.  
// An older Pine2 ancestor of this script suffered from repainting issues when 
// viewing in lower resolutions than the res/2 parameter.
// running this in Pine3 mode seems to fix those problems, see https://www.tradingview.com/wiki/Pine_Script:_Release_Notes#Pine_Version_3  and https://backtest-rookies.com/2017/11/29/tradingview-indicator-repainting/ for references on the problem. 
//
//  There does seem to be ocassional repainting that affects backtrading here though, somehow.. and i'm not sure how to fix it.  V3 SHOULD have made it impossible.  Any help appreciated.
//
// Also note that the length of the DEMA sampling shouldn't be longer than a 
// candle, which could happen if you made resolution > chartres^2.  For example,
// a chartres=5min and a res=30 setting would cause sampling = 6, which is longer
// than the length of a candle (5 min, b/c chartres=5 min)
/////////////////////////////////////////////////////////////////////


fastPeriod    = input(title="fastPeriod",defval=4, minval=1)
slowPeriod = input(title="slowPeriod",defval=31, minval=1) 
resInteger = input(title="resolution",defval=98)
// The parameters above that work well highly oscillating sideways markets,
// struggle with longer-term trends, particularly strong ones, where there's the
// potential for a lot of loss or strong gain. To make sure we don't get burned 
// by long term losses, a stoploss mechanism is implemented to compensate.
// *stoplossPercent* is the point at which it becomes useful to "panic sell".
// *letitRidePercent* is the point beyond which it's more profitable NOT to panic sell.
// Like the periods, these values will have to be tuned to a particuliar market behavior.
stoplossPercent    = input(title="stopLossPercentage",type=float,defval=2, minval=1, maxval=100)
letitRidePercent = input(title="letItRidePercentage",type=float,defval=3, minval=1, maxval=100)

//To try to recapture the value of the long term strong-uptrends, first we 
// detected when we are in strong uptrend mode, by using an indicator (uptrend?)
// Then, if we are in strong uptrend mode, we use a different
// set of variables for fast/slow periods that's better suited to that situation.

uptrendFastPeriod = input(title="Uptrend FastPeriod",defval=4, minval=1) 
uptrendSlowPeriod = input(title="Uptrend SlowPeriod",defval=16, minval=1) 
//uptrendResInteger = input(title="Uptrend resolution",defval=98)

// Now that we have everything setup, for each bar we calculate the difference of emas for the downtrend/uptrend situations
res = tostring(resInteger) 
sampling =  (resInteger / timeframe.period )
demaFastNormal = security(syminfo.tickerid, res, 2 * ema(close, fastPeriod) - ema(ema(close, fastPeriod), fastPeriod))
demaSlowNormal = security(syminfo.tickerid,res, 2 * ema(close, slowPeriod) - ema(ema(close, slowPeriod), slowPeriod)  )
demaFastUT = security(syminfo.tickerid, res, 2 * ema(close, uptrendFastPeriod) - ema(ema(close, uptrendFastPeriod), uptrendFastPeriod))
demaSlowUT = security(syminfo.tickerid,res, 2 * ema(close, uptrendSlowPeriod) - ema(ema(close, uptrendSlowPeriod), uptrendSlowPeriod)  )

// now, based on our uptrend indicator, we decide which of the two line pairs to
// use to determine the crossover signals that tell us to buy/sell.
demaFast = uptrend? demaFastUT:demaFastNormal
demaSlow =  uptrend? demaSlowUT:demaSlowNormal


//  Now, we calculate the crossover signals.
// **IMPORTANT TRADING NOTE** :  You should buy/sell on the CLOSE of the
// highlighted bar with the  signal, to adhere to back-tested results!
// (Technically, the open of the NEXT bar, but these are usually effectively the same.)  
// Note that if you check "calculate on every tick", you might be decieved until 
// you reload the page, this is NOT, however, a repaint issue, as after the bar 
// after the signal closes there is a consistent buy/sell indicator at the open 
// price of the bar after the the signal, which is basically as close to same as
// the close price of the signal (red/green highlighted) bar.

buy = crossover(demaSlow[sampling], demaFast[sampling])
stoploss = ( strategy.openprofit <-1*stoplossPercent/100*strategy.equity) and not ( strategy.openprofit < -1*letitRidePercent/100*strategy.equity )
sell = strategy.opentrades!=0 and (crossunder(demaSlow[sampling], demaFast[sampling]) or crossover(ret,close) ) and not stoploss // "and not stoploss" here helps us not over-color when both conditions are true.  The stoploss is more interesting than a regular sell condition


///////////////////////////////////////
// PLOTTING SECTION 
// This is a collected place for Plotting and coloring all the things 
// for easy toggling on/off.
///////////////////////////////////////

//plot(buyPrice, title="BuyPriceLine", color = purple )   // For a study, this replaces the strategy.openprofit way to guard against stoploss
plot(demaFast)   // These are the crossover lines that trigger the buy/sell
plot(demaSlow)




bgcolor( buy ? lime : na, transp=50)
bgcolor( stoploss ? orange : na, transp=10)
bgcolor( sell ? red : na, transp=50)
bgcolor( strategy.openprofit < -1*letitRidePercent/100*strategy.equity ? purple : na, transp= 50)

bgcolor( demaSlow[sampling]> demaFast[sampling]  ? lime : na, transp=96)
bgcolor( demaSlow [sampling]< demaFast[sampling]  ? red : na, transp=99)

// the below is for backtesting from different timeframes.  By default it is set to 1/1/2017 at 1:00 AM
startdate=timestamp(2017, 01, 01, 01, 00)   // year , month, day, hour, minute

strategy.entry("BUY", strategy.long, when = buy and (time>=startdate) )
strategy.close("BUY", when = sell or stoploss)