리소스 로딩... 로딩...

스톱 로스 트레일 전략과 함께 슈퍼 트렌드

저자:차오장, 날짜: 2023-09-18 16:05:31
태그:

전반적인 설명

이 전략은 가격 트렌드를 결정하기 위해 슈퍼 트렌드 지표를 사용하며 트렌드를 따르는 거래를 위한 스톱 로스 메커니즘을 포함합니다. 슈퍼 트렌드는 두 개의 이동 평균에서 구성됩니다. 상향 크로스오버에서 길고 하향 크로스오버에서 짧습니다. 과도한 손실을 피하기 위해 스톱 로스가 설정됩니다.

전략 논리

빠른 라인과 느린 라인의 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)



더 많은