Stratégie laser double pour trouver des tendances longues et courtes


Date de création: 2023-11-06 10:01:42 Dernière modification: 2023-11-06 10:01:42
Copier: 0 Nombre de clics: 587
1
Suivre
1617
Abonnés

Stratégie laser double pour trouver des tendances longues et courtes

Aperçu

La stratégie utilise trois indicateurs techniques, les courbes de Bryn, les canaux de Kentner et l’indicateur de force relative de l’adaptation, pour déterminer la direction de la tendance actuelle, en combinaison avec l’indicateur de SAR de la parallèle. Un signal de négociation est généré lorsque les résultats des trois indicateurs sont concordants. La stratégie est principalement déterminée par la direction de la tendance, en entrant dans le temps lorsque la tendance change et en visant à réaliser un profit.

Le principe

La stratégie utilise une combinaison de trois indicateurs techniques pour évaluer les tendances actuelles:

  1. SQUEEZE MOMENTUM INDICATOR: Calcule les courbes de Bryn et les canaux de Kentner, qui, lorsqu’ils sont superposés, produisent une compression, indiquant un changement de tendance imminent. L’indicateur retourne à l’état de compression et à l’inclinaison de la courbe de retour linéaire.

  2. RSI VOLUME WEIGHTED: le RSI pondéré par le volume est calculé en utilisant la ligne médiane pour juger de l’excédent d’achat et de l’excédent de vente. L’indicateur met l’accent sur la variation du volume.

  3. La rupture de la ligne de parallèle ((SAR): déterminer la relation entre le prix actuel et la position de la ligne de parallèle SAR, SAR baisse au-dessus du prix et SAR augmente au-dessous du prix.

La stratégie utilise les bandes de Brin pour déterminer la direction de la tendance, le canal de Kentner refine, le RSI détermine le surachat et la survente pour trouver des occasions de revirement, le SAR indique le moment d’entrée. La logique spécifique est la suivante:

  1. Calculer la courbe de Bryn, le canal de Kentner, l’indicateur de squiz.

  2. Le RSI est calculé en fonction du volume pondéré.

  3. Calculer la ligne de parallèle SAR. Le SAR est en hausse en dessous du prix et en baisse au-dessus.

  4. Synthétisez les trois indicateurs ci-dessus: lorsque le Squiz est compressé, le RSI est supérieur à la ligne médiane, le SAR génère un signal de tête multiple lorsque le prix est en dessous; lorsque le Squiz est compressé, le RSI est inférieur à la ligne médiane, le SAR génère un signal de tête vide lorsque le prix est en haut.

  5. Lorsqu’un signal est généré, on juge le résultat des trois indicateurs de la ligne K précédente et on produit un signal d’entrée s’il est contraire au jugement du signal actuel.

  6. Le système de stop loss est installé après l’entrée et le stop loss est suivi.

Les avantages

Cette stratégie présente les avantages suivants:

  1. Les indices de la paire de plusieurs indicateurs sont positifs ou négatifs, les jugements sont précis. L’indicateur Squiz est précis pour identifier les changements de tendance, le RSI est clair pour juger les surachats et les survente, le SAR indique le moment exact d’entrée sur le marché.

  2. La logique de l’indicateur est simple, claire et facile à comprendre.

  3. La confirmation par plusieurs indicateurs permet de filtrer les fausses brèches.

  4. Le système de blocage des pertes est installé pour bloquer les bénéfices et contrôler les risques.

  5. Les données de détection sont abondantes et fiables.

Les risques

Cette stratégie comporte aussi des risques:

  1. La logique d’entrée en jeu est similaire à celle de l’entrée en mode multi-tête et à celle de l’entrée en mode vide, mais les signaux de rétroaction peuvent être émis simultanément et nécessitent un filtre.

  2. Les trois indicateurs ont été optimisés par paramètres et peuvent être suradaptés.

  3. Le nombre de transactions peut être trop fréquent et il est nécessaire de contrôler raisonnablement le nombre de positions.

  4. Les paramètres d’arrêt de perte peuvent être trop rapprochés et faciles à percer.

Les solutions sont les suivantes:

  1. Augmenter la détermination de la continuité des résultats des indicateurs et éviter les fluctuations du signal.

  2. Utilisez l’analyse de marche avant pour ajuster les paramètres afin d’éviter les surcorrélations.

  3. Réglez la taille de la pyramide pour contrôler le nombre de détentions dans un sens unique.

  4. Test de différentes zones de rupture et optimisation de la position de rupture.

Direction d’optimisation

Cette stratégie peut être optimisée dans les directions suivantes:

  1. Optimiser les paramètres de l’indicateur pour améliorer la stabilité des paramètres. Les paramètres d’optimisation dynamique peuvent être considérés.

  2. Ajout de logiques de contrôle de position, telles que la taille de la position, la position moyenne, etc.

  3. Tester les différentes méthodes de stop, comme le stop oscillant, le stop linéaire, le retour à zéro.

  4. L’ajout de fonctions de gestion de l’argent, telles que les positions fixes, le taux d’utilisation des fonds fixes, etc.

  5. L’entrée et la sortie dynamiques sont réalisées en combinaison avec des algorithmes d’apprentissage automatique.

  6. Augmenter les mécanismes de couverture, faire plus de couverture de risque et réduire le risque systémique sur les marchés concernés.

  7. L’idée est d’ajouter plus d’indicateurs, de créer un mécanisme de vote et d’améliorer la précision des jugements.

Résumer

Cette stratégie est une stratégie de suivi de tendance plus stable. Grâce à l’optimisation des paramètres et à l’amélioration des mécanismes de contrôle des risques, de meilleurs indicateurs de retour et d’une meilleure efficacité du disque. Cette stratégie s’applique aux variétés où la tendance est plus évidente et peut également être considérée comme une opération sur des cycles relativement stables.

Code source de la stratégie
/*backtest
start: 2023-10-06 00:00:00
end: 2023-11-05 00:00:00
period: 1h
basePeriod: 15m
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/
// © XaviZ

//#####©ÉÉÉɶN###############################################
//####*..´´´´´´,,,»ëN########################################
//###ë..´´´´´´,,,,,,''%©#####################################
//###'´´´´´´,,,,,,,'''''?¶###################################
//##o´´´´´´,,,,,,,''''''''*©#################################
//##'´´´´´,,,,,,,'''''''^^^~±################################
//#±´´´´´,,,,,,,''''''''^í/;~*©####æ%;í»~~~~;==I±N###########
//#»´´´´,,,,,,'''''''''^;////;»¶X/í~~/~~~;=~~~~~~~~*¶########
//#'´´´,,,,,,''''''''^^;////;%I^~/~~/~~~=~~~;=?;~~~~;?ë######
//©´´,,,,,,,''''''''^^~/////X~/~~/~~/~~»í~~=~~~~~~~~~~^;É####
//¶´,,,,,,,''''''''^^^;///;%;~/~~;í~~»~í?~?~~~?I/~~~~?*=íÑ###
//N,,,,,,,'''''''^^^^^///;;o/~~;;~~;£=»í»;IX/=~~~~~~^^^^'*æ##
//#í,,,,,''''''''^^^^^;;;;;o~»~~~~íX//~/»~;í?IíI»~~^/*?'''=N#
//#%,,,'''''''''^^^^^^í;;;;£;~~~//»I»/£X/X/»í*&~~~^^^^'^*~'É#
//#©,,''''''''^^^^^^^^~;;;;&/~/////*X;í;o*í»~=*?*===^'''''*£#
//##&''''''''^^^^^^^^^^~;;;;X=í~~~»;;;/~;í»~»±;^^^^^';=''''É#
//##N^''''''^^^^^^^^^^~~~;;;;/£;~~/»~~»~~///o~~^^^^''''?^',æ#
//###Ñ''''^^^^^^^^^^^~~~~~;;;;;í*X*í»;~~IX?~~^^^^/?'''''=,=##
//####X'''^^^^^^^^^^~~~~~~~~;;íííííí~~í*=~~~~Ií^'''=''''^»©##
//#####£^^^^^^^^^^^~~~~~~~~~~~íííííí~~~~~*~^^^;/''''='',,N###
//######æ~^^^^^^^^~~~~~~~~~~~~~~íííí~~~~~^*^^^'=''''?',,§####
//########&^^^^^^~~~~~~~~~~~~~~~~~~~~~~~^^=^^''=''''?,íN#####
//#########N?^^~~~~~~~~~~~~~~~~~~~~~~~~^^^=^''^?''';í@#######
//###########N*~~~~~~~~~~~~~~~~~~~~~~~^^^*'''^='''/É#########
//##############@;~~~~~~~~~~~~~~~~~~~^^~='''~?'';É###########
//#################É=~~~~~~~~~~~~~~^^^*~'''*~?§##############
//#####################N§£I/~~~~~~»*?~»o§æN##################

//@version=4
strategy(title="M-SQUEEZE", overlay = true)

//study(title="M-SQUEEZE", overlay = true)

src = input(close, "SOURCE", type = input.source)

// ███▓▒░░ VARIABLES ░░▒▓███

var bool longCond = na, var bool shortCond = na
var int CondIni_long0 = 0, var int CondIni_short0 = 0
var int CondIni_long = 0, var int CondIni_short = 0
var float last_open_longCondition = na, var float last_open_shortCondition = na
var int last_longCondition0 = na, var int last_shortCondition0 = na
var int last_longCondition = na, var int last_shortCondition = na
var bool long_tp = na, var bool short_tp = na
var int last_long_tp = na, var int last_short_tp = na
var bool Final_Long_tp = na, var bool Final_Short_tp = na
var bool SMI_longCond = na, var bool SMI_shortCond = na
var bool RSI_longCond = na, var bool RSI_shortCond = na
var bool ADX_longCond = na, var bool ADX_shortCond = na
var bool SAR_longCond = na, var bool SAR_shortCond = na
var bool Final_longCondition0 = na, var bool Final_shortCondition0 = na
var bool Final_longCondition = na, var bool Final_shortCondition = na

// ███▓▒░░ SQUEEZE MOMENTUM INDICATOR ░░▒▓███

Act_SMI = input(true, "SQUEEZE MOMENTUM INDICATOR")
BB_length = input(85, title="BOLLINGER BANDS LENGTH", minval = 1)
BB_mult = input(2.1, title="BOLLINGER BANDS MULTI-FACTOR", minval = 0.1, step = 0.1)
KC_length = input(38, title="KELTNER CHANNEL LENGTH", minval = 1)
KC_mult = input(2.0, title="KELTNER CHANNEL MULTI-FACTOR", minval = 0.1, step = 0.1)

SQUEEZE_M(_src,_BB_length,_BB_mult,_KC_length,_KC_mult)=>

    // Calculate BB
    basis = sma(_src, _BB_length)
    dev = _BB_mult * stdev(_src, _BB_length)
    upperBB = basis + dev
    lowerBB = basis - dev
    // Calculate KC
    ma = sma(src, _KC_length)
    rangema = sma(tr, _KC_length)
    upperKC = ma + rangema * _KC_mult
    lowerKC = ma - rangema * _KC_mult
    // Squeeze
    sqzOn = lowerBB > lowerKC and upperBB < upperKC
    sqzOff = lowerBB < lowerKC and upperBB > upperKC
    nosqz = sqzOn == false and sqzOff == false
    // Linear Regression curve
    val = linreg(_src - avg(avg(highest(high, _KC_length), lowest(low, _KC_length)), sma(close, _KC_length)), _KC_length, 0)
    [nosqz,val]
    
[NOSQZ,VAL] = SQUEEZE_M(src,BB_length,BB_mult,KC_length,KC_mult)

barcolor(iff(VAL > 0, iff(VAL > nz(VAL[1]), color.lime, color.green), iff(VAL < nz(VAL[1]), color.red, color.maroon)))

// ███▓▒░░ SAR ░░▒▓███

Act_SAR = input(true, "PARABOLIC SAR")
Sst = input (0.73, "SAR STAR", step=0.01, minval = 0.01)
Sinc = input (0.5, "SAR INC", step=0.01, minval = 0.01)
Smax = input (0.06, "SAR MAX", step=0.01, minval = 0.01)

SAR = sar(Sst, Sinc, Smax)
plot(SAR, style = plot.style_cross, title = "SAR")

// ███▓▒░░ RSI VOLUME WEIGHTED ░░▒▓███

Act_RSI = input(true, "RSI VOLUME WEIGHTED")
RSI_len = input(22, "RSI LENGHT", minval = 1)
RSI_obos = input(45,title="RSI CENTER LINE", type=input.integer, minval = 1)

WiMA(_src, _length)=> 
    var float MA_s=0.0
    MA_s:=(_src + nz(MA_s[1] * (_length-1)))/_length
    MA_s

RSI_Volume(fv, length)=>	
	up=iff(fv>fv[1],abs(fv-fv[1])*volume,0)
	dn=iff(fv<fv[1],abs(fv-fv[1])*volume,0)
	upt=WiMA(up,length)
	dnt=WiMA(dn,length)
	100*(upt/(upt+dnt))

RSI_V = RSI_Volume(src, RSI_len)

// ███▓▒░░ STRATEGY ░░▒▓███

SMI_longCond := (Act_SMI ? (VAL > 0 and (VAL > nz(VAL[1])) and not NOSQZ) : RSI_longCond) 
RSI_longCond := (Act_RSI ? (RSI_V > RSI_obos) : SAR_longCond)
SAR_longCond := (Act_SAR ? (SAR < close) : SMI_longCond)

SMI_shortCond := (Act_SMI ? (VAL < 0 and (VAL < nz(VAL[1])) and not NOSQZ) : RSI_shortCond) 
RSI_shortCond := (Act_RSI ? (RSI_V < RSI_obos) : SAR_shortCond)
SAR_shortCond := (Act_SAR ? (SAR > close) : SMI_shortCond)

longCond := SMI_longCond and RSI_longCond and SAR_longCond
shortCond := SMI_shortCond and RSI_shortCond and SAR_shortCond

CondIni_long0 := longCond ? 1 : shortCond ? -1 : CondIni_long0[1]
CondIni_short0 := longCond ? 1 : shortCond ? -1 : CondIni_short0[1]

longCondition0 = (longCond and CondIni_long0[1] == -1)
shortCondition0 = (shortCond and CondIni_short0[1] == 1)

CondIni_long := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_long[1]
CondIni_short := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_short[1]

longCondition = (longCond[1] and CondIni_long[1] == -1)
shortCondition = (shortCond[1] and CondIni_short[1] == 1)

// ███▓▒░░ ALERTS & SIGNALS ░░▒▓███

plotshape(longCondition, title = "Long Signal", style = shape.triangleup, location = location.belowbar, color = color.blue, transp = 0, size = size.tiny)
plotshape(shortCondition, title = "Short Signal", style = shape.triangledown, location = location.abovebar, color = #FF0000, transp = 0, size = size.tiny)

//alertcondition(longCondition, title="Long Alert", message = "LONG") 
//alertcondition(shortCondition, title="Short Alert", message = "SHORT")

// ███▓▒░░ BACKTESTING ░░▒▓███

testStartYear = input(2018, "BACKTEST START YEAR", minval = 1980, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = input(2222, "BACKTEST STOP YEAR", minval=1980, maxval = 2222)
testStopMonth = input(12, "BACKTEST STOP MONTH", minval=1, maxval=12)
testStopDay = input(31, "BACKTEST STOP DAY", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod = time >= testPeriodStart and time <= testPeriodStop ? true : false

strategy.entry("Long", strategy.long, when = longCondition0 and testPeriod)
strategy.entry("Short", strategy.short, when = shortCondition0 and testPeriod)