
이 전략은 쌍평선형으로 가격 채널을 구성하고, 채널 범위를 사용하여 가격 트렌드 방향을 판단하고, 스톱로스 추적을 설정하여 수익에 대한 트렌드 추적 전략을 설정합니다.
쌍평평선 가격 통로 전략은 빠른 EMA와 느린 EMA를 사용하여 가격 통로를 구성한다. 빠른 EMA의 파라미터는 89주기, 느린 EMA의 파라미터는 200주기이다. 동시에 높은 가격, 낮은 가격, 종전 가격에 기반한 세 개의 평선으로 가격 통로 범위를 구성한다. 통로 상단 궤도 및 하단 궤도 각각 34주기의 높은 가격 EMA와 낮은 가격 EMA이다.
빠른 EMA가 느린 EMA 위에 있고 가격이 하락할 때 상승 추세로 판단하고, 빠른 EMA가 느린 EMA 아래에 있고 가격이 하락할 때 하락 추세로 판단한다.
상승 추세에서, 전략은 트렌드 반전을 확인 할 때 공백을 할 것입니다. 하향 추세에서, 전략은 트렌드 반전을 확인 할 때 더 할 것입니다.
또한, 전략은 중지 손실 추적 기능을 갖췄습니다. 포지션을 보유한 후 중단 손실 가격을 추적하는 실시간 업데이트를 통해 수익을 잠금합니다.
이 전략의 가장 큰 장점은 쌍평평선을 사용하여 가격 통로를 구축하여 가격 추세를 판단하고, 반전 시장을 결합하여 상하를 쫓는 것을 피하는 것입니다. 또한 모바일 스톱 손실 추적 기능을 통해 수익을 고정하고 손실 위험을 줄일 수 있습니다.
다른 장점들은: 변수 최적화 공간이 넓고, 다양한 품종과 주기에 따라 파라미터를 조정할 수 있다. 실시간으로 중지 손실 가격을 업데이트하고, 운영 위험은 낮다.
이 전략의 주요 위험은 역전 신호 판단의 효과가 좋지 않다는 점이며, 잘못된 판단이 발생할 수 있다. 이때는 변수를 최적화하여 트렌드 반전의 효과를 확인하는 것이 필요하다.
또한, 스톱포인트 설정도 중요합니다. 스톱포인트가 너무 크면 충분히 결정적인 스톱포인트가 발생하지 않을 수 있고, 스톱포인트가 너무 작으면 과도한 스톱포인트가 발생할 수 있습니다. 이것은 특정 품종에 따라 조정해야 합니다.
마지막으로, 데이터 문제도 전략의 실패로 이어질 수 있습니다. 신뢰할 수 있고, 연속적이고, 충분한 역사적 데이터를 사용하여 재검토 및 실내 검증 전략을 사용하십시오.
이 전략의 최적화는 다음과 같은 몇 가지 측면에 집중됩니다.
빠른 EMA와 느린 EMA의 주기를 최적화하여 효과를 판단하기 위해 다른 파라미터 조합을 설정할 수 있습니다.
가격 통로의 상하 궤도 파라미터는 또한 더 적합한 주기 파라미터를 찾기 위해 조정할 수 있습니다.
스톱포인트의 설정은 매우 중요하며, 스톱포인트 전략을 최적화하기 위해 다양한 매개 변수를 테스트할 수 있습니다.
트렌드 반전을 확인하기 위해 다른 지표가 도입되었는지 테스트할 수 있습니다.
이 전략은 전체적인 운영과정이 합리적으로 순조롭게 진행되며, 트렌드 방향을 판단하기 위해 쌍평선 채널을 이용하고, 이동한 스톱로스로 수익을 잠금하는, 보다 안정적인 트렌드 추적 전략이다. 매개 변수 최적화와 풍력 조절 설정을 최적화함으로써, 이 전략은 효율적인 양적 거래 전략 중 하나가 될 수 있다.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Trend trader Strategy", overlay=true)
//f you want to trade shallower Pullbacks for quicker scalps, try reducing the
// PAC and EMA combination lengths for example:
// * 21 PAC and 55, 144, 377 for fast, medium, slow EMAs
// * 13 PAC and 34, 89, 233 for fast, medium, slow EMAs
// - Each alert should be evaluated on it's own merits, the alerts are designed to highlight possible
// scalping trades from Pullback recoveries around the PAC.
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 6, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
isMon() => dayofweek(time('D')) == dayofweek.monday
isTue() => dayofweek(time('D')) == dayofweek.tuesday
isWed() => dayofweek(time('D')) == dayofweek.wednesday
isThu() => dayofweek(time('D')) == dayofweek.thursday
isFri() => dayofweek(time('D')) == dayofweek.friday
// Calculate start/end date and time condition
DST = 1 //day light saving for usa
//--- Europe
London = iff(DST==0,"0000-0900","0100-1000")
//--- America
NewYork = iff(DST==0,"0400-1400","0500-1500")
//--- Pacific
Sydney = iff(DST==0,"1300-2200","1400-2300")
//--- Asia
Tokyo = iff(DST==0,"1500-2400","1600-0100")
customTime =iff(DST==0,"2300-1500","2400-1600")
customTime2 =iff(DST==0,"0800-1500","0900-1600")
//-- Time In Range
timeinrange(res, sess) => time(res, sess) != 0
london = timeinrange(timeframe.period, London)
newyork = timeinrange(timeframe.period, NewYork)
c_time = timeinrange(timeframe.period,customTime)
c_time2 = timeinrange(timeframe.period,customTime2)
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate and (london or newyork)
// === INPUTS ===
HiLoLen = input(34, minval=2, title="High Low PAC channel Length")
fastEMAlength = input(89, minval=2)
mediumEMAlength = input(200, minval=2)
slowEMAlength = input(600, minval=2)
ShowFastEMA = input(false)
ShowMediumEMA = input(false)
ShowSlowEMA = input(false)
ShowHHLL = input(false)
ShowFractals = input(false)
filterBW = input(false, title="Show Ideal Fractals Only")
ShowBarColor = input(true, title="Show coloured Bars around PAC")
ShowBuySell = input(false, title="Show Buy/Sell Alert Arrows")
Lookback = input(3, minval=1, title="Pullback Lookback for PAC Cross Check")
DelayArrow = input(false, title="Show Alert Arrows Only on Closed Candles")
Delay = DelayArrow ? 1 : 0
ShowTrendBGcolor= input(true)
UseHAcandles = input(false, title="Use Heikin Ashi Candles in Algo Calculations")
//
// === /INPUTS ===
// === BASE FUNCTIONS ===
haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low
// ||--- Fractal Recognition Functions: ---------------------------------------------------------------||
isRegularFractal(mode) =>
ret = mode == 1 ? high[4] < high[3] and high[3] < high[2] and high[2] > high[1] and
high[1] > high[0] : mode == -1 ?
low[4] > low[3] and low[3] > low[2] and low[2] < low[1] and low[1] < low[0] :
false
ret
isBWFractal(mode) =>
ret = mode == 1 ? high[4] < high[2] and high[3] <= high[2] and high[2] >= high[1] and
high[2] > high[0] : mode == -1 ?
low[4] > low[2] and low[3] >= low[2] and low[2] <= low[1] and low[2] < low[0] :
false
ret
// ||-----------------------------------------------------------------------------------------------------||
//
// === /BASE FUNCTIONS ===
// === SERIES SETUP ===
//
// ||--- Setup Moving Averages and PAC channel:
// ||-----------------------------------------------------------------------------------------------------||
fastEMA = ema(haClose, fastEMAlength)
mediumEMA = ema(haClose, mediumEMAlength)
slowEMA = ema(haClose, slowEMAlength)
pacC = ema(haClose, HiLoLen)
pacL = ema(haLow, HiLoLen)
pacU = ema(haHigh, HiLoLen)
TrendDirection = fastEMA > mediumEMA and pacL > mediumEMA ? 1 :
fastEMA < mediumEMA and pacU < mediumEMA ? -1 : 0
// ||--- Fractal Recognition:
// ||-----------------------------------------------------------------------------------------------------||
filteredtopf = filterBW ? isRegularFractal(1) : isBWFractal(1)
filteredbotf = filterBW ? isRegularFractal(-1) : isBWFractal(-1)
// ||-----------------------------------------------------------------------------------------------------||
// ||--- Higher Highs, Lower Highs, Higher Lows, Lower Lows -------------------------------------------||
valuewhen_H0 = valuewhen(filteredtopf == true, high[2], 0)
valuewhen_H1 = valuewhen(filteredtopf == true, high[2], 1)
valuewhen_H2 = valuewhen(filteredtopf == true, high[2], 2)
//
higherhigh = filteredtopf == false ? false :
valuewhen_H1 < valuewhen_H0 and valuewhen_H2 < valuewhen_H0
lowerhigh = filteredtopf == false ? false :
valuewhen_H1 > valuewhen_H0 and valuewhen_H2 > valuewhen_H0
valuewhen_L0 = valuewhen(filteredbotf == true, low[2], 0)
valuewhen_L1 = valuewhen(filteredbotf == true, low[2], 1)
valuewhen_L2 = valuewhen(filteredbotf == true, low[2], 2)
//
higherlow = filteredbotf == false ? false :
valuewhen_L1 < valuewhen_L0 and valuewhen_L2 < valuewhen_L0
lowerlow = filteredbotf == false ? false :
valuewhen_L1 > valuewhen_L0 and valuewhen_L2 > valuewhen_L0
//
// === /SERIES ===
//
// === PLOTTING ===
//
// Plot the Price Action Channel (PAC) base on EMA high,low and close
L = plot(pacL, color=color.gray, linewidth=1, title="High PAC EMA", transp=50)
U = plot(pacU, color=color.gray, linewidth=1, title="Low PAC EMA", transp=50)
C = plot(pacC, color=color.red, linewidth=2, title="Close PAC EMA", transp=0)
fill(L, U, color=color.gray, transp=90, title="Fill HiLo PAC")
// Colour bars according to the close position relative to the PAC selected.
BARcolor = haClose > pacU ? color.blue : haClose < pacL ? color.red : color.gray
barcolor(ShowBarColor ? BARcolor : na, title="Bar Colours")
//
BGcolor = TrendDirection == 1 ? color.green :
TrendDirection == -1 ? color.red : color.yellow
bgcolor(ShowTrendBGcolor ? BGcolor : na, transp=90, title="Trend BG Color")
// STEP 1:
// Configure trail stop level with input options (optional)
longTrailPerc = input(title="Trail Long Loss (%)",
type=input.float, minval=0.0, step=0.05, defval=0.1) * 0.01
shortTrailPerc = input(title="Trail Short Loss (%)",
type=input.float, minval=0.0, step=0.05, defval=0.1) * 0.01
atrRange = input(14, title="ATR Range", type=input.integer)
buyStop = input(2, title="* ATR Buy SL", type=input.float)
sellStop = input(1, title="* ATR Sell SL", type=input.float)
targetATR = input(1, title="* ATR TP1", type=input.float)
moveToEntryFigure = input(0.5, title=" move to entry in % towards target", type=input.float)
showMove = input(true, title="Show Move to Entry points")
showMoveBuycol = showMove ? color.lime : na
showMoveSellcol = showMove ? color.lime : na
// Plots
buyStopp = plot(close - atr(atrRange) * buyStop, title="Buy SL", style=plot.style_stepline, color=color.red, transp=75, linewidth=3)
sellStopp = plot(close + atr(atrRange) * sellStop, title="Sell SL", style=plot.style_stepline, color=color.red, transp=75, linewidth=3)
buyTP1 = plot(close + atr(atrRange) * targetATR, title="Buy TP", style=plot.style_cross, color=color.lime, transp=75, linewidth=3)
sellTP1 = plot(close - atr(atrRange) * targetATR, title="Sell TP", style=plot.style_cross, color=color.lime, transp=75, linewidth=3)
buyMove = plot(close + atr(atrRange) * targetATR * moveToEntryFigure, title="Buy Move to Entry", style=plot.style_cross, color=showMoveBuycol, transp=75, linewidth=3)
sellMove = plot(close - atr(atrRange) * targetATR * moveToEntryFigure, title="Sell Move to Entry", style=plot.style_cross, color=showMoveSellcol, transp=75, linewidth=3)
if barstate.isconfirmed
if(BGcolor==color.red and BGcolor[1]==color.yellow and c_time )
strategy.entry("short", strategy.short, comment="short", alert_message='short')
strategy.cancel("long")
if(BGcolor==color.green and BGcolor[1]==color.yellow and c_time )
strategy.entry("long", strategy.long, comment="long", alert_message = 'long')
strategy.cancel("short")
// STEP 2:
// Determine trail stop loss prices
longStopPrice = 0.0, shortStopPrice = 0.0
longStopPrice := if (strategy.position_size > 0)
stopValue = close * (1 - longTrailPerc)
max(stopValue, longStopPrice[1])
else
0
shortStopPrice := if (strategy.position_size < 0)
stopValue = close * (1 + shortTrailPerc)
min(stopValue, shortStopPrice[1])
else
999999
// Plot stop loss values for confirmation
plot(series=(strategy.position_size > 0) ? longStopPrice : na,
color=color.fuchsia, style=plot.style_cross,
linewidth=2, title="Long Trail Stop")
plot(series=(strategy.position_size < 0) ? shortStopPrice : na,
color=color.fuchsia, style=plot.style_cross,
linewidth=2, title="Short Trail Stop")
// STEP 3:
// Submit exit orders for trail stop loss price
//if (strategy.position_size > 0)
// strategy.exit("XL TRL STP","long", stop=longStopPrice)
//if (strategy.position_size < 0)
// strategy.exit("XS TRL STP","short", stop=shortStopPrice)
tp=input(0.0032,type=input.float, title="tp")
sl=input(0.001,type=input.float, title="sl")
//strategy.close("long", when= tp/2,qty_percent = 50)
//strategy.exit("longtp/sl","long",profit=tp, loss=sl, stop=longStopPrice, alert_message='closelong')
//strategy.exit("shorttp/sl","short",profit=tp, loss=sl, stop=shortStopPrice, alert_message='closeshort')
//tpatrlong= close + atr(atrRange) * targetATR
//slatrlong= close - atr(atrRange) * buyStop
//strategy.exit("longtp/sl","long",profit=tp, loss=sl, alert_message='closelong')
//strategy.exit("shorttp/sl","short",profit=tp, loss=sl, alert_message='closeshort')
strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong")
strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")
if(BGcolor==color.yellow or not c_time)
strategy.close("short", comment="time or yellow", alert_message='closeshort')
strategy.close("long", comment="time or yellow", alert_message='closelong')