
Il s’agit d’une stratégie de négociation qui utilise plusieurs échelles de temps pour déterminer les points d’entrée et de sortie. L’idée principale de la stratégie est de déterminer la direction de la tendance sur une échelle de temps plus longue pour trouver le moment d’entrée; sur une échelle de temps plus courte pour déterminer le renversement de la tendance et trouver le moment d’exit.
La stratégie utilise principalement le concept de la voie tangentielle. La voie tangentielle est composée de lignes supérieures, inférieures et moyennes. La largeur de la voie varie avec l’échelle du temps.
La logique d’entrée: la période d’entrée est jugée multiple lorsque le prix franchit la ligne supérieure d’un canal à échelle plus longue. Afin d’éviter les fausses ruptures, nous demandons qu’au moins une des 3 lignes K les plus récentes ait un prix de clôture de la ligne K supérieur à la ligne supérieure de ce canal. Cela évite les fausses ruptures causées par une expansion excessive à court terme.
La logique de sortie: le moment de la sortie est jugé à l’équilibre lorsque le prix tombe en dessous d’un canal à échelle de temps plus courte. Nous demandons également qu’au moins une des 3 dernières lignes K se termine en dessous du canal de cette ligne K, afin de confirmer la validité de la rupture et d’éviter d’être piégé.
Cette stratégie combine les avantages du suivi des tendances et du trading de retournement. Les échelles de temps plus longues déterminent la direction de la tendance et les échelles de temps plus courtes déterminent les retournements locaux, qui, combinées, permettent de capturer les fluctuations locales dans la tendance.
L’analyse à plusieurs échelles de temps permet de mieux gérer le problème des fausses percées, ce qui rend les entrées et sorties plus claires et plus efficaces.
L’optimisation des paramètres permet de s’adapter à différentes variétés et environnements de marché.
Cette stratégie est sensible aux paramètres et peut donner des résultats très différents pour des paramètres différents. Il est nécessaire de tester et d’optimiser suffisamment pour trouver la meilleure combinaison de paramètres.
Dans une situation de choc, la stratégie peut générer un grand nombre de signaux de trading, entraînant des transactions excessives. Les pertes individuelles peuvent être contrôlées par la configuration d’un stop-loss.
Les stratégies ne tiennent pas compte de la logique de jugement des tendances à grande échelle et peuvent échouer au moment de la conversion haussière ou baissière. Les autres indicateurs peuvent être combinés pour juger des tendances à grande échelle.
Optimiser les paramètres pour trouver la meilleure combinaison de paramètres. Paramètres tels que la longueur du cycle d’optimisation, le type de canal.
Augmentation de la logique d’arrêt des pertes. Configuration d’un arrêt mobile raisonnable et contrôle des pertes individuelles.
Combiner avec d’autres indicateurs pour juger des tendances à grande échelle. Par exemple, EMA, K-Line Channel, MAC, etc. Évitez les défaillances aux points de basculement critiques.
Cette stratégie est généralement une stratégie typique de rupture de canal à plusieurs échelles temporelles. Elle intègre bien les avantages du suivi de la tendance et du trading inversé, permettant de capturer les fluctuations locales dans la tendance grâce à des jugements de canal à différentes échelles temporelles.
/*backtest
start: 2023-02-20 00:00:00
end: 2024-02-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © venkyrocker7777
//@version=5
strategy('Donchain channel based investment strategy', shorttitle='Donchain channel strategy', overlay=true)
Length = input.int(21, minval=1)
xPrice = close
xvnoise = math.abs(xPrice - xPrice[1])
nAMA = 0.0
nfastend = 0.666
nslowend = 0.0645
nsignal = math.abs(xPrice - xPrice[Length])
nnoise = math.sum(xvnoise, Length)
nefratio = nnoise != 0 ? nsignal / nnoise : 0
nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2)
nAMA := nz(nAMA[1]) + nsmooth * (xPrice - nz(nAMA[1]))
plot(nAMA, color=color.new(color.blue, 0), title='KAMA')
// Function to get Lower Channel, Upper Channel, Middle Channel for a period length
getLCUCMC(PeriodLength) =>
lowestValueInThePeriod = ta.lowest(PeriodLength) // LC
highestValueInThePeriod = ta.highest(PeriodLength) // UC
middleChannelInTheperiod = math.avg(highestValueInThePeriod, lowestValueInThePeriod) // MC
// Returns Lower Channel, Upper Channel, Middle Channel for a period length
[lowestValueInThePeriod, highestValueInThePeriod, middleChannelInTheperiod]
// Longer time frame for entry
longerPeriod = 52
// Shorter time frame for exit
shorterPeriod = 12
if timeframe.period == 'D'
// Longer time frame for entry
longerPeriod := 52 * 5
// Shorter time frame for exit
shorterPeriod := 12 * 5
shorterPeriod
if timeframe.period == 'M'
// Longer time frame for entry
longerPeriod := 12
// Shorter time frame for exit
shorterPeriod := 3
shorterPeriod
// Get Lower Channel, Upper Channel, Middle Channel for longerPeriod, shorterPeriod
[lowestValueInTheLongerPeriodLength, highestValueInTheLongerPeriodLength, middleChannelInLongerperiod] = getLCUCMC(longerPeriod)
[lowestValueInTheShorterPeriodLength, highestValueInTheShorterPeriodLength, middleChannelInShorterperiod] = getLCUCMC(shorterPeriod)
// Plot Upper Channel of longerPeriod in dark green
plot(highestValueInTheLongerPeriodLength, 'highestValueInTheLongerPeriodLength', color=color.new(color.green, 0))
// Plot Lower Channel of shorterPeriod in dark red
plot(lowestValueInTheShorterPeriodLength, 'lowestValueInTheShorterPeriodLength', color=color.new(color.red, 0))
// Entry Plan
// Will start to see if we can enter when high crosses up longer period high (high >= highestValueInTheLongerPeriodLength)
// Check if any of the three past candles and enter when any of the 3 past candles satisfy
// 1) high of that candle >= highestValueInTheLongerPeriodLength of that candle (high[i] >= highestValueInTheLongerPeriodLength[i])
// 2) close of entry point consideration candle is above close of that candle (close > close[i])
isThisPointAnEntry() =>
// Check last 3 bars
isThisPointAnEntry = false
offset = 0
for i = 1 to 3 by 1
isCurrentCandleALongerPeriodHigh = high >= highestValueInTheLongerPeriodLength
isCurrentCandleCloseGreaterThanPreiousIthOne = close > close[i]
isPreviousIthCandleAlsoALongerPeriodHigh = high[i] >= highestValueInTheLongerPeriodLength[i]
isThisPointAnEntry := isCurrentCandleALongerPeriodHigh and isCurrentCandleCloseGreaterThanPreiousIthOne and isPreviousIthCandleAlsoALongerPeriodHigh
if isThisPointAnEntry
offset := -i
break
[isThisPointAnEntry, offset]
// Exit Plan - same as entry plan, with things reversed and also on a shorter time frame
// Will start to see if we should exit when low crosses down longer period low (low <= lowestValueInTheShorterPeriodLength)
// Check if any of the three past candles and exit when any of the 3 past candles satisfy
// 1) low of that candle <= highestValueInTheLongerPeriodLength of that candle (low[i] <= lowestValueInTheShorterPeriodLength[i])
// 2) close of exit point consideration candle is below close of that candle (close < close[i])
isThisPointAnExit() =>
// Check last 3 bars
isThisPointAnExit = false
for i = 1 to 3 by 1
isCurrentCandleAShorterPeriodLow = low <= lowestValueInTheShorterPeriodLength
isCurrentCandleCloseLesserThanPreiousIthOne = close < close[i]
isPreviousIthCandleAlsoAShorterPeriodLow = low[i] <= lowestValueInTheShorterPeriodLength[i]
isThisPointAnExit := isCurrentCandleAShorterPeriodLow and isCurrentCandleCloseLesserThanPreiousIthOne and isPreviousIthCandleAlsoAShorterPeriodLow
break
isThisPointAnExit
[isEntry, offset] = isThisPointAnEntry()
if isEntry
strategy.entry('Buy', strategy.long)
strategy.close_all(when=isThisPointAnExit() == true)
if year(timenow) == year(time) and month(timenow) == month(time) and dayofmonth(timenow) - 2 == dayofmonth(time)
strategy.close_all()