
A estratégia é uma estratégia de ruptura que combina vários intervalos de tempo (minuto 1, 5 minutos, 15 minutos, hora 1 e 4 horas) e detecta áreas de apoio e resistência no gráfico.
A estratégia usa a faixa de Brin e o canal de preços para determinar as áreas de suporte e resistência. Primeiro, calcula a média móvel simples (SMA) e o desvio padrão (STDEV) com base no preço de fechamento de cada período de tempo para determinar o caminho para cima e para baixo. Em seguida, detecta o bloco de ruptura de um pentagrama, que é determinado com base na ruptura do preço do nível de suporte ou resistência e no volume de transação.
Uma vez detectado um bloco de ruptura, um sinal de compra é gerado se o preço for abaixo da trajetória; Se a ruptura for acima da trajetória, um sinal de venda será gerado. A estratégia também traça um canal de preços para cada período de tempo, indicando níveis de suporte e resistência.
Além disso, a estratégia define um nível de limite de stop-loss para cada período de tempo. Isso significa que o nível de preço designado para a posição deve ser liquidado de forma lucrativa.
O risco pode ser evitado ainda mais através da otimização dos parâmetros da faixa de Bryn, aumentando o tempo de detenção ou definindo um stop loss.
A estratégia pode ser melhorada em vários aspectos:
Optimizar os parâmetros das faixas de Bryn para que as trajectórias ascendentes e descendentes reflitam melhor o real nível de suporte e resistência
Aumentar os algoritmos de aprendizagem de máquina para determinar a direção e a intensidade da ruptura
Aumentar os índices de volatilidade das ações para determinar o melhor momento para comprar e vender
Combinando mais indicadores como MACD, KD e outros para avaliar tendências e energia
A estratégia integra a análise de indicadores técnicos de vários intervalos de tempo, gerenciando o risco por meio de negociações de ruptura, parada e perda, uma estratégia de negociação de sistema de ruptura flexível e confiável. No entanto, a configuração de parâmetros e o controle de risco ainda precisam ser testados e otimizados de acordo com o mercado real.
/*backtest
start: 2023-12-05 00:00:00
end: 2024-01-04 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("DZ Strategy ICT", overlay=true)
// Paramètres de l'indicateur
length1 = input.int(14, minval=1, title='Longueur 1 min')
deviations1 = input.float(2.0, title='Déviations 1 min')
multiplier1 = input.float(1.0, minval=0.1, maxval=10, title='Multiplicateur 1 min')
fibonacciLevel1 = input.float(0.618, title='Niveau de Fibonacci 1 min')
displacement1 = input.int(3, minval=1, title='Décalage de Displacement 1 min')
volumeThreshold1 = input.float(1.0, minval=0, title='Seuil de Volume 1 min')
fibLevelInput1 = input.float(0.0, "Niveau de Limite de Profit 1 min", minval=0.0)
length5 = input.int(14, minval=1, title='Longueur 5 min')
deviations5 = input.float(2.0, title='Déviations 5 min')
multiplier5 = input.float(1.0, minval=0.1, maxval=10, title='Multiplicateur 5 min')
fibonacciLevel5 = input.float(0.618, title='Niveau de Fibonacci 5 min')
displacement5 = input.int(3, minval=1, title='Décalage de Displacement 5 min')
volumeThreshold5 = input.float(1.0, minval=0, title='Seuil de Volume 5 min')
fibLevelInput5 = input.float(0.0, "Niveau de Limite de Profit 5 min", minval=0.0)
length15 = input.int(14, minval=1, title='Longueur 15 min')
deviations15 = input.float(2.0, title='Déviations 15 min')
multiplier15 = input.float(1.0, minval=0.1, maxval=10, title='Multiplicateur 15 min')
fibonacciLevel15 = input.float(0.618, title='Niveau de Fibonacci 15 min')
displacement15 = input.int(3, minval=1, title='Décalage de Displacement 15 min')
volumeThreshold15 = input.float(1.0, minval=0, title='Seuil de Volume 15 min')
fibLevelInput15 = input.float(0.0, "Niveau de Limite de Profit 15 min", minval=0.0)
length60 = input.int(14, minval=1, title='Longueur 1 h')
deviations60 = input.float(2.0, title='Déviations 1 h')
multiplier60 = input.float(1.0, minval=0.1, maxval=10, title='Multiplicateur 1 h')
fibonacciLevel60 = input.float(0.618, title='Niveau de Fibonacci 1 h')
displacement60 = input.int(3, minval=1, title='Décalage de Displacement 1 h')
volumeThreshold60 = input.float(1.0, minval=0, title='Seuil de Volume 1 h')
fibLevelInput60 = input.float(0.0, "Niveau de Limite de Profit 1 h", minval=0.0)
length240 = input.int(14, minval=1, title='Longueur 4 h')
deviations240 = input.float(2.0, title='Déviations 4 h')
multiplier240 = input.float(1.0, minval=0.1, maxval=10, title='Multiplicateur 4 h')
fibonacciLevel240 = input.float(0.618, title='Niveau de Fibonacci 4 h')
displacement240 = input.int(3, minval=1, title='Décalage de Displacement 4 h')
volumeThreshold240 = input.float(1.0, minval=0, title='Seuil de Volume 4 h')
fibLevelInput240 = input.float(0.0, "Niveau de Limite de Profit 4 h", minval=0.0)
// Calcul des supports et résistances pour chaque plage de temps
basis1 = ta.sma(close, length1)
range_1 = multiplier1 * ta.stdev(close, length1)
upper1 = basis1 + deviations1 * range_1
lower1 = basis1 - deviations1 * range_1
basis5 = ta.sma(close, length5)
range_5 = multiplier5 * ta.stdev(close, length5)
upper5 = basis5 + deviations5 * range_5
lower5 = basis5 - deviations5 * range_5
basis15 = ta.sma(close, length15)
range_15 = multiplier15 * ta.stdev(close, length15)
upper15 = basis15 + deviations15 * range_15
lower15 = basis15 - deviations15 * range_15
basis60 = ta.sma(close, length60)
range_60 = multiplier60 * ta.stdev(close, length60)
upper60 = basis60 + deviations60 * range_60
lower60 = basis60 - deviations60 * range_60
basis240 = ta.sma(close, length240)
range_240 = multiplier240 * ta.stdev(close, length240)
upper240 = basis240 + deviations240 * range_240
lower240 = basis240 - deviations240 * range_240
// Calcul du volume moyen sur chaque période donnée
averageVolume1 = ta.sma(volume, length1)
averageVolume5 = ta.sma(volume, length5)
averageVolume15 = ta.sma(volume, length15)
averageVolume60 = ta.sma(volume, length60)
averageVolume240 = ta.sma(volume, length240)
// Détection du Breaker Block en fonction du déplacement et du volume pour chaque plage de temps
breakerBlock1 = ta.crossover(close[displacement1], lower1) and volume > volumeThreshold1 * averageVolume1
breakerBlock1 := breakerBlock1 or (ta.crossunder(close[displacement1], upper1) and volume > volumeThreshold1 * averageVolume1)
breakerBlock5 = ta.crossover(close[displacement5], lower5) and volume > volumeThreshold5 * averageVolume5
breakerBlock5 := breakerBlock5 or (ta.crossunder(close[displacement5], upper5) and volume > volumeThreshold5 * averageVolume5)
breakerBlock15 = ta.crossover(close[displacement15], lower15) and volume > volumeThreshold15 * averageVolume15
breakerBlock15 := breakerBlock15 or (ta.crossunder(close[displacement15], upper15) and volume > volumeThreshold15 * averageVolume15)
breakerBlock60 = ta.crossover(close[displacement60], lower60) and volume > volumeThreshold60 * averageVolume60
breakerBlock60 := breakerBlock60 or (ta.crossunder(close[displacement60], upper60) and volume > volumeThreshold60 * averageVolume60)
breakerBlock240 = ta.crossover(close[displacement240], lower240) and volume > volumeThreshold240 * averageVolume240
breakerBlock240 := breakerBlock240 or (ta.crossunder(close[displacement240], upper240) and volume > volumeThreshold240 * averageVolume240)
// Affichage du Breaker Block sur le graphique
bgcolor(breakerBlock1 ? color.new(color.yellow, 70) : na)
bgcolor(breakerBlock5 ? color.new(color.yellow, 70) : na)
bgcolor(breakerBlock15 ? color.new(color.yellow, 70) : na)
bgcolor(breakerBlock60 ? color.new(color.yellow, 70) : na)
bgcolor(breakerBlock240 ? color.new(color.yellow, 70) : na)
// Définition de la zone limite de l'ordre de profit pour chaque plage de temps
fibLevel1 = basis1 * fibonacciLevel1
fibLevel5 = basis5 * fibonacciLevel5
fibLevel15 = basis15 * fibonacciLevel15
fibLevel60 = basis60 * fibonacciLevel60
fibLevel240 = basis240 * fibonacciLevel240
// Signal d'achat modifié en fonction du Breaker Block et du déplacement pour chaque plage de temps
buySignal1 = ta.crossover(close[displacement1], lower1) and volume > volumeThreshold1 * averageVolume1
buySignal5 = ta.crossover(close[displacement5], lower5) and volume > volumeThreshold5 * averageVolume5
buySignal15 = ta.crossover(close[displacement15], lower15) and volume > volumeThreshold15 * averageVolume15
buySignal60 = ta.crossover(close[displacement60], lower60) and volume > volumeThreshold60 * averageVolume60
buySignal240 = ta.crossover(close[displacement240], lower240) and volume > volumeThreshold240 * averageVolume240
// Signal de vente modifié en fonction du Breaker Block et du déplacement pour chaque plage de temps
sellSignal1 = ta.crossunder(close[displacement1], upper1) and volume > volumeThreshold1 * averageVolume1
sellSignal5 = ta.crossunder(close[displacement5], upper5) and volume > volumeThreshold5 * averageVolume5
sellSignal15 = ta.crossunder(close[displacement15], upper15) and volume > volumeThreshold15 * averageVolume15
sellSignal60 = ta.crossunder(close[displacement60], upper60) and volume > volumeThreshold60 * averageVolume60
sellSignal240 = ta.crossunder(close[displacement240], upper240) and volume > volumeThreshold240 * averageVolume240
// Tracé des niveaux de limite de profit pour chaque plage de temps
hline(fibLevelInput1, color=color.green, linestyle=hline.style_dashed, title="Niveau de Limite de Profit 1 min")
hline(fibLevelInput5, color=color.green, linestyle=hline.style_dashed, title="Niveau de Limite de Profit 5 min")
hline(fibLevelInput15, color=color.green, linestyle=hline.style_dashed, title="Niveau de Limite de Profit 15 min")
hline(fibLevelInput60, color=color.green, linestyle=hline.style_dashed, title="Niveau de Limite de Profit 1 h")
hline(fibLevelInput240, color=color.green, linestyle=hline.style_dashed, title="Niveau de Limite de Profit 4 h")
// Définition des ordres de vente et d'achat pour chaque plage de temps
if buySignal1
strategy.entry("Achat 1 min", strategy.long)
if sellSignal1
strategy.entry("Vente 1 min", strategy.short)
if buySignal5
strategy.entry("Achat 5 min", strategy.long)
if sellSignal5
strategy.entry("Vente 5 min", strategy.short)
if buySignal15
strategy.entry("Achat 15 min", strategy.long)
if sellSignal15
strategy.entry("Vente 15 min", strategy.short)
if buySignal60
strategy.entry("Achat 1 h", strategy.long)
if sellSignal60
strategy.entry("Vente 1 h", strategy.short)
if buySignal240
strategy.entry("Achat 4 h", strategy.long)
if sellSignal240
strategy.entry("Vente 4 h", strategy.short)
// Configuration des ordres de sortie (Take Profit) pour chaque plage de temps
profitRatio = 2
stopLossRatio = 1
stopLossLevel1 = strategy.position_avg_price * (1 - stopLossRatio / (stopLossRatio + profitRatio))
stopLossLevel5 = strategy.position_avg_price * (1 - stopLossRatio / (stopLossRatio + profitRatio))
stopLossLevel15 = strategy.position_avg_price * (1 - stopLossRatio / (stopLossRatio + profitRatio))
stopLossLevel60 = strategy.position_avg_price * (1 - stopLossRatio / (stopLossRatio + profitRatio))
stopLossLevel240 = strategy.position_avg_price * (1 - stopLossRatio / (stopLossRatio + profitRatio))
strategy.exit("Stop Loss 1 min", "Achat 1 min", stop=stopLossLevel1)
strategy.exit("Stop Loss 1 min", "Vente 1 min", stop=stopLossLevel1)
strategy.exit("Stop Loss 5 min", "Achat 5 min", stop=stopLossLevel5)
strategy.exit("Stop Loss 5 min", "Vente 5 min", stop=stopLossLevel5)
strategy.exit("Stop Loss 15 min", "Achat 15 min", stop=stopLossLevel15)
strategy.exit("Stop Loss 15 min", "Vente 15 min", stop=stopLossLevel15)
strategy.exit("Stop Loss 1 h", "Achat 1 h", stop=stopLossLevel60)
strategy.exit("Stop Loss 1 h", "Vente 1 h", stop=stopLossLevel60)