Stratégie de canal de prix de rupture haut-bas sur 5 jours


Date de création: 2023-09-13 17:05:43 Dernière modification: 2023-09-13 17:05:43
Copier: 0 Nombre de clics: 846
1
Suivre
1617
Abonnés

Cette stratégie est appelée la stratégie de canal de prix de rupture de 5 jours. La stratégie construit un canal de prix en calculant les plus hauts et les plus bas prix des 5 derniers jours de négociation et effectue des transactions de tendance lorsque le prix franchit le canal.

Les étapes sont les suivantes:

  1. Calculer le prix le plus élevé et le prix le plus bas des 5 derniers jours.

  2. Le plus élevé des deux prix les plus élevés est construit sur la voie, le plus bas des deux prix les plus bas sont construits sur la voie.

  3. Lorsque la hausse des prix dépasse une certaine proportion de la hausse des cours (par exemple 0,3%), un signal d’achat est généré.

  4. Un signal de vente est généré lorsque la baisse des prix dépasse une certaine proportion de la baisse.

  5. Il peut être utilisé comme un arrêt après l’entrée en utilisant le deuxième plus bas niveau comme point de perte, ou en suivant un certain pourcentage de stop loss (par exemple, 0,5%) et ensuite se mettre à plat.

L’avantage de cette stratégie est de juger le point de basculement de la tendance en détectant les prix les plus élevés/bas de la rupture. La rupture du canal représente une concentration des prix qui poussent le prix. Mais il faut éviter de générer trop de signaux inefficaces lors de la consolidation.

Dans l’ensemble, le fait de se concentrer sur les ruptures dans les zones de prix clés est une stratégie de suivi de tendance plus classique. Cependant, les traders doivent toujours aider à identifier d’autres indicateurs et à optimiser les paramètres pour tirer le meilleur parti de cette stratégie.

Code source de la stratégie
/*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)