
Cette stratégie est basée sur la dynamique des signaux de négociation de l’indicateur de la chaîne, qui génère des signaux d’achat et de vente en fonction de la montée et de la descente des prix de la chaîne de rupture. La stratégie ne fait que des transactions à plusieurs têtes, et si un signal de vente apparaît, la position est à plat à vide.
Cette stratégie utilise les moyennes SMA et l’amplitude de fluctuation réelle de l’ATR pour construire un canal de dynamique. Les voies de dynamique supérieure et inférieure sont:
On a donc le facteur SMA + ATR. La piste inférieure = SMA - ATR * facteur
Un signal de vente est généré lorsque le prix est en hausse. Un signal de vente est généré lorsque le prix est en baisse.
Comme il n’y a que des lots, si un signal de vente apparaît, l’ordre d’ouverture précédent est annulé et la position est levée à l’état de position vide.
La logique de la stratégie est la suivante:
Cette stratégie présente les avantages suivants:
Cette stratégie présente aussi des risques:
La réponse:
Cette stratégie peut être optimisée dans les domaines suivants:
Cette stratégie est basée sur des indicateurs de canaux dynamiques, capture les tendances du marché de manière simple et efficace. La logique de la stratégie est claire et compréhensible, génère des signaux de transaction par le biais d’une rupture de canal. Bien que le simple fait de faire plusieurs têtes et sans mécanisme de sortie soit insuffisant, il peut être amélioré par l’optimisation des paramètres, l’ajout d’un module de tête vide, l’ajout d’un stop-loss, etc.
/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Keltner Channel Strategy", overlay=true)
source = close
useTrueRange = input(true)
length = input(20, minval=1)
mult = input(1.0)
ma = sma(source, length)
range = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = crossover(source, upper)
crossLower = crossunder(source, lower)
bprice = 0.0
bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1])
sprice = 0.0
sprice := crossLower ? low -syminfo.mintick : nz(sprice[1])
crossBcond = false
crossBcond := crossUpper ? true
: na(crossBcond[1]) ? false : crossBcond[1]
crossScond = false
crossScond := crossLower ? true
: na(crossScond[1]) ? false : crossScond[1]
cancelBcond = crossBcond and (source < ma or high >= bprice )
cancelScond = crossScond and (source > ma or low <= sprice )
if (cancelBcond)
strategy.cancel("KltChLE")
if (crossUpper)
strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE")
if (cancelScond)
strategy.cancel("KltChSE")
if (crossLower)
strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE")
//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)