이 전략은 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)