이 전략은 5일 상하위 돌파 가격 통로 전략이라고 불린다. 이 전략은 최근 5일 거래의 최고 가격과 최저 가격을 통계를 통해 가격 통로를 구축하고, 가격이 통로를 돌파할 때 트렌드 거래를 한다.
구체적인 단계는 다음과 같습니다.
최근 5일간의 최고 가격과 최저 가격을 계산합니다.
가장 높은 2개의 최고 가격을 빌드해서 올라와, 가장 낮은 2개의 최저 가격을 빌드해서 내려와.
가격 상승이 상반도의 일정 비율을 초과할 때 (예를 들어 0.3%), 구매 신호가 발생한다.
가격 하락이 하락의 일정한 비율을 초과하면 판매 신호가 발생한다.
입점 후 두 번째 높은 낮은 수준을 스톱로스트 위치로 사용하거나, 일정 비율의 스톱 ?? (예를 들어 0.5%) 를 추적한 후 평점 위치 .
이 전략의 장점은 중요한 최고/저가에서 돌파를 통해 트렌드 전환점을 판단하는 것이다. 돌파 통로는 가격을 집중적으로 추진하는 것을 나타낸다. 그러나 회수에서 너무 많은 무효 신호를 방지하는 것이 필요하다.
일반적으로, 핵심 가격 영역의 돌파구에 초점을 맞추는 것은 좀 더 고전적인 트렌드 추적 전략이다. 그러나 거래자는 여전히 다른 지표 확인을 보조하고 매개 변수를 최적화하여 이 전략을 최대한 활용해야 한다.
/*backtest
start: 2023-08-13 00:00:00
end: 2023-09-12 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// @version=4
// Based on Sort pseudo-array v2 by apozdnyakov https://www.tradingview.com/script/IUlIoSnA-Sort-pseudo-array-v2/
strategy(title="5 Day high/low breakout strategy", shorttitle="5 days range breakout", overlay=true)
entry_factor = input(title="Entry - % point above high/low", type=input.float, defval=0.3, minval=0, maxval=5)
profit_target = input(title="Profit Target %", type=input.float, defval=0.5, minval=0, maxval=5)
trade_type = input(defval = "BOTH", title = "Trade Type: LONG, SHORT, BOTH ( case sensitive )", type = input.string)
width = input(defval = 2, title = "High/Low line width (Enter 0 to hide )", type = input.integer, minval=0, maxval=5)
debug = input(defval= "NO", title = "Display sorted low/high: YES, NO ( case sensitive )", type = input.string)
high_day1 = security(syminfo.tickerid, "D", high[1], lookahead = barmerge.lookahead_on)
high_day2 = security(syminfo.tickerid, "D", high[2], lookahead = barmerge.lookahead_on)
high_day3 = security(syminfo.tickerid, "D", high[3], lookahead = barmerge.lookahead_on)
high_day4 = security(syminfo.tickerid, "D", high[4], lookahead = barmerge.lookahead_on)
high_day5 = security(syminfo.tickerid, "D", high[5], lookahead = barmerge.lookahead_on)
low_day1 = security(syminfo.tickerid, "D", low[1], lookahead = barmerge.lookahead_on)
low_day2 = security(syminfo.tickerid, "D", low[2], lookahead = barmerge.lookahead_on)
low_day3 = security(syminfo.tickerid, "D", low[3], lookahead = barmerge.lookahead_on)
low_day4 = security(syminfo.tickerid, "D", low[4], lookahead = barmerge.lookahead_on)
low_day5 = security(syminfo.tickerid, "D", low[5], lookahead = barmerge.lookahead_on)
// sorts a list of up to the fixed length
sort_all(type) =>
float s0 = na
float s1 = na
float s2 = na
float s3 = na
float s4 = na
h_val = security(syminfo.tickerid, "D", high, false)
float min = na
float last = na
for i = 0 to 4
float min_local = na
float last_local = na
float val = na
for l = 0 to 4
if type == "high"
val := l == 0 ? high_day1 : val
val := l == 1 ? high_day2 : val
val := l == 2 ? high_day3 : val
val := l == 3 ? high_day4 : val
val := l == 4 ? high_day5 : val
else
val := l == 0 ? low_day1 : val
val := l == 1 ? low_day2 : val
val := l == 2 ? low_day3 : val
val := l == 3 ? low_day4 : val
val := l == 4 ? low_day5 : val
if(na(min) or val > min or (val == min and l > last))
new_min_local = na(min_local) ? val : min(min_local, na(min) ? val : max(min, val))
if(na(min_local) or new_min_local != min_local)
last_local := l
min_local := new_min_local
min := min_local
last := last_local
s0 := i == 0 ? min : s0
s1 := i == 1 ? min : s1
s2 := i == 2 ? min : s2
s3 := i == 3 ? min : s3
s4 := i == 4 ? min : s4
[s0, s1, s2, s3, s4]
[high5, high4, high3, high2, high1] = sort_all("high")
[low1, low2, low3, low4, low5] = sort_all("low")
plot(high1, color = color.blue, style=plot.style_circles, linewidth=width)
plot(high2, color = color.red, style=plot.style_circles, linewidth=width)
plot(low1, color = color.blue, style=plot.style_circles, linewidth=width)
plot(low2, color = color.red, style=plot.style_circles, linewidth=width)
if close >= (high1 * (1 + entry_factor/100)) and strategy.position_size == 0 and hour <= 12
strategy.entry(id = "long_entry", long = true, qty = 1, stop = high2)
strategy.close(id = "long_entry", when = strategy.position_size != 0 and (close < high2 or close > high1 * (1 + (entry_factor + profit_target)/100)))
if close <= (low1 * (1 - entry_factor/100)) and strategy.position_size == 0 and hour <= 12
strategy.entry(id = "short_entry", long = false, qty = 1, stop = low2)
strategy.close(id = "short_entry", when = strategy.position_size != 0 and (close > low2 or close < low1 * (1 - (entry_factor + profit_target)/100)))
if (hour == 14)
strategy.close_all()
//No more than 1 order per day
// strategy.risk.max_intraday_filled_orders(2)
//Check whether this is the first bar of the day? If yes, display highs for last 5 days
// t = time("1440", session.regular)
// is_first = na(t[1]) and not na(t) or t[1] < t
// if (is_first and debug != "NO")
// label.new(bar_index, na, tostring(high1) + ", " + tostring(high2) + ", " + tostring(high3) + ", " + tostring(high4) + ", " + tostring(high5), style=label.style_cross, yloc=yloc.abovebar)
// label.new(bar_index, na, tostring(low1) + ", " + tostring(low2) + ", " + tostring(low3) + ", " + tostring(low4) + ", " + tostring(low5), style=label.style_cross, yloc=yloc.belowbar)