Strategi ini dinamakan Strategi Saluran Harga Penembusan Tinggi dan Rendah 5 Hari. Strategi ini membina saluran harga dengan mengkaji harga tertinggi dan terendah dalam 5 hari perdagangan terakhir dan melakukan perdagangan trend apabila harga menembusi saluran tersebut.
Langkah-langkahnya adalah seperti berikut:
Berhitung harga tertinggi dan terendah dalam 5 hari dagangan terakhir.
Pilih dua harga tertinggi untuk menaiki dan dua harga terendah untuk menaiki.
Apabila kenaikan harga melebihi peratusan tertentu (seperti 0.3%), ia menghasilkan isyarat beli.
Sinyal jual dihasilkan apabila harga turun melebihi peratusan tertentu.
Selepas masuk, anda boleh mengambil kedudukan terendah kedua sebagai titik henti, atau menjejaki peratusan tertentu untuk berhenti (seperti 0.5%).
Kelebihan strategi ini adalah untuk menilai titik peralihan trend dengan menembusi harga tertinggi / rendah yang kritikal. Saluran penembusan mewakili harga yang mendorong harga secara terpusat. Tetapi perlu mencegah terlalu banyak isyarat yang tidak berkesan dalam penyusunan.
Secara umum, fokus pada penembusan di kawasan harga utama adalah strategi trend-following yang lebih klasik. Tetapi peniaga masih perlu membantu pengesahan indikator lain dan mengoptimumkan parameter untuk memanfaatkan strategi ini dengan sebaik mungkin.
/*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)