
Il s’agit d’une stratégie de trading pyramidale basée sur plusieurs indicateurs Supertrend. Il identifie les opportunités de trading à haute probabilité en définissant l’indicateur Supertrend avec trois périodes et multiplicateurs différents. La stratégie adopte une méthode d’ajout de position pyramidale dynamique, autorise jusqu’à trois entrées et combine un stop loss dynamique et des conditions de sortie flexibles pour atteindre la maximisation des bénéfices et le contrôle des risques.
La stratégie utilise l’indicateur Supertrend avec trois paramètres différents : rapide, moyen et lent. Le signal d’entrée est basé sur l’intersection de ces trois indicateurs et la direction de la tendance, en utilisant un style pyramidal à trois couches pour ajouter des positions : la première couche entre sur le marché lorsque l’indicateur rapide est à la baisse, l’indicateur moyen est à la hausse et l’indicateur lent L’indicateur est en baisse ; la deuxième couche entre sur le marché lorsque l’indicateur rapide est en hausse. Entrez sur le marché par une percée lorsque l’indicateur de vitesse moyenne et l’indicateur de vitesse moyenne se déplacent ensemble vers le bas ; le troisième niveau entre sur le marché par une percée lorsque le marché atteint un nouveau sommet. La sortie adopte plusieurs mécanismes tels que le stop loss dynamique, le stop loss à prix moyen et l’inversion de tendance globale.
Cette stratégie capture les opportunités de tendance grâce à plusieurs indicateurs Supertrend et méthodes d’ajout de pyramide, et contrôle les risques avec un stop-loss dynamique et des mécanismes de sortie flexibles. Bien qu’il existe certaines limites, grâce à une optimisation continue et à un contrôle strict des risques, cette stratégie a une bonne valeur d’application pratique.
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy('4Vietnamese 3x Supertrend', overlay=true, max_bars_back=1000, initial_capital = 10000000000, slippage = 2, commission_type = strategy.commission.percent, commission_value = 0.013, default_qty_type=strategy.percent_of_equity, default_qty_value = 33.33, pyramiding = 3, margin_long = 0, margin_short = 0)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Inputs
// Supertrend Settings
STATRLENGTH1 = input.int(10, title='Fast Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT1 = input.float(1, title='Fast Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH2 = input.int(11, title='Medium Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT2 = input.float(2, title='Medium Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH3 = input.int(12, title='Slow Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT3 = input.float(3, title='Slow Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
isUseHighestOf2RedCandleSetup = input.bool(false, group = "Setup Filters")
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculations
[superTrend1, dir1] = ta.supertrend(STATRMULT1, STATRLENGTH1)
[superTrend2, dir2] = ta.supertrend(STATRMULT2, STATRLENGTH2)
[superTrend3, dir3] = ta.supertrend(STATRMULT3, STATRLENGTH3)
// directionST1 = dir1 == 1 and dir1[1] == 1 ? false : dir1 == -1 and dir1[1] == -1 ? true : false
// directionST2 = dir2 == 1 and dir2[1] == 1 ? false : dir2 == -1 and dir2[1] == -1 ? true : false
// directionST3 = dir3 == 1 and dir3[1] == 1 ? false : dir3 == -1 and dir3[1] == -1 ? true : false
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculate highest from supertrend1 uptrend
var float highestGreen = 0
if dir1 < 0 and highestGreen == 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
highestGreen := high
if highestGreen > 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
if high > highestGreen
highestGreen := high
if dir1 >= 0
highestGreen := 0
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry SL
var entrySL4Long1 = false
var entrySL4Long2 = false
var entrySL4Long3 = false
isUseEntrySL = input.bool(true, group = "Entry SL Option")
dataToCalculate = input.source(low, group = "Entry SL Option")
if isUseEntrySL and (dir1 > 0 and dir2 < 0 and dir3 < 0)
if strategy.opentrades >= 1
if dataToCalculate > strategy.opentrades.entry_price(0)
entrySL4Long1 := true
else
entrySL4Long1 := false
if entrySL4Long1 and close > strategy.opentrades.entry_price(0)
strategy.exit('exit1', from_entry = 'long1', stop = strategy.opentrades.entry_price(0))
if strategy.opentrades >= 2
if dataToCalculate > strategy.opentrades.entry_price(1)
entrySL4Long2 := true
else
entrySL4Long2 := false
if entrySL4Long2 and close > strategy.opentrades.entry_price(1)
strategy.exit('exit2', from_entry = 'long2', stop = strategy.opentrades.entry_price(1))
if strategy.opentrades >= 3
if dataToCalculate > strategy.opentrades.entry_price(2)
entrySL4Long3 := true
else
entrySL4Long3 := false
if entrySL4Long3 and close > strategy.opentrades.entry_price(2)
strategy.exit('exit3', from_entry = 'long3', stop = strategy.opentrades.entry_price(2))
if strategy.closedtrades > strategy.closedtrades[1]
if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit3'
entrySL4Long3 := false
if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit2'
entrySL4Long2 := false
if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit1'
entrySL4Long1 := false
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry
if dir3 < 0
if dir2 > 0 and dir1 < 0
strategy.entry('long1', strategy.long)
else if dir2 < 0
strategy.entry('long2', strategy.long, stop=superTrend1)
else
if dir1 < 0 and highestGreen > 0
strategy.entry('long3', strategy.long, stop=highestGreen)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Exit
isUseAllDowntrendExit = input.bool(true, group = "Exit Type")
if isUseAllDowntrendExit and dir3 > 0 and dir2 > 0 and dir1 > 0 and close < open
strategy.close_all()
isUseAvgPriceInLoss = input.bool(true, group = "Exit Type")
if isUseAvgPriceInLoss and strategy.position_avg_price > close //and strategy.position_avg_price <= close[1]
// and (dir1 > 0 or dir2 > 0 or dir3 > 0)
// and strategy.opentrades >= 1
// and strategy.opentrades >= 3
strategy.close_all()
isUseAllPositionsInLoss = input.bool(false, group = "Exit Type")
if isUseAllPositionsInLoss
and (
false
or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close))
or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close))
or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close)
and ((not na(strategy.opentrades.entry_price(2))) and strategy.opentrades.entry_price(2) > close))
)
strategy.close_all()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Plot
plot(superTrend1, title='Fast Supertrend', color=dir1 == 1 and dir1[1] == 1 ? color.red : dir1 == -1 and dir1[1] == -1 ? color.green : na)
plot(superTrend2, title='Medium Supertrend', color=dir2 == 1 and dir2[1] == 1 ? color.red : dir2 == -1 and dir2[1] == -1 ? color.green : na)
plot(superTrend3, title='Slow Supertrend', color=dir3 == 1 and dir3[1] == 1 ? color.red : dir3 == -1 and dir3[1] == -1 ? color.green : na)