Stratégie d'indicateur d'ouverture puissant et multidimensionnel des experts quantitatifs


Date de création: 2024-01-19 14:55:03 Dernière modification: 2024-01-19 14:55:03
Copier: 0 Nombre de clics: 699
1
Suivre
1617
Abonnés

Stratégie d’indicateur d’ouverture puissant et multidimensionnel des experts quantitatifs

Aperçu

Cette stratégie utilise une combinaison de plusieurs indicateurs de force tels que Aroon, MA, BB, Williams, %R, ADX, etc. pour créer un indicateur de force de prise de position multidimensionnel permettant une prise de position efficace lorsque la tendance est plus évidente.

Principe de stratégie

La stratégie consiste principalement à obtenir un signal d’ouverture de position fort grâce à une combinaison des indicateurs suivants:

  1. Indicateur d’Aroon: Calcule le prix le plus élevé et le prix le plus bas d’une période donnée, formant un indicateur de choc, qui détermine la direction de la tendance par une combinaison d’indicateurs d’Aroon de plusieurs périodes de longueur.

  2. Ligne moyenne de la MA: calcul de la moyenne de la MA des périodes courtes et longues pour déterminer le point de basculement de la tendance.

  3. BB Bollin: Signaux de vente lorsque le prix dépasse la Bollin.

  4. Indicateur Williams %R: l’indicateur forme un décalage dans les zones de survente et de survente, comme signal d’ouverture de position.

  5. Indice de mouvement directionnel moyen de l’ADX: pour juger de la force de la tendance, l’ADX génère un signal d’ouverture de position lorsqu’il est supérieur à une position.

Les indicateurs ci-dessus, à travers différents paramètres de longueur de cycle, forment un système de jugement multidimensionnel. Lorsqu’une tendance est plus évidente, plusieurs indicateurs peuvent former un signal d’ouverture de position puissant.

Les conditions d’achat sont les suivantes:

  1. Aroon_1 est inférieur à 85
  2. La ligne moyenne de MA se forme à la fourche
  3. Williams %R inférieur à -99
  4. ADX est supérieur à 14.
  5. Aroon_2 est supérieur à -39

Un signal d’achat fort est généré lorsque 3 des 5 conditions d’achat ci-dessus sont remplies.

Les conditions de vente sont similaires, il y a 5 conditions de vente, et lorsque 3 d’entre elles sont remplies, un signal de vente est généré.

Ainsi, la stratégie utilise une combinaison de plusieurs indicateurs différents pour générer un signal fort d’ouverture de position avec une grande certitude lorsque la tendance est évidente.

Analyse des avantages

Le plus grand avantage de cette stratégie réside dans la combinaison multidimensionnelle des signaux d’indicateurs, ce qui réduit considérablement la probabilité de signaux erronés causés par un seul indicateur, permettant ainsi de produire des signaux d’ouverture de position de haute qualité lorsque la tendance est plus évidente, ce qui est le plus grand avantage de cette stratégie.

Les autres avantages sont:

  1. Adaptation aux caractéristiques des différents marchés par ajustement des paramètres

  2. La définition des paramètres de l’indicateur est scientifiquement raisonnable, les paramètres sont robustes

  3. Une combinaison de plusieurs périodes permet une meilleure précision de jugement.

  4. La structure du code est claire, facile à comprendre et à réutiliser.

Analyse des risques

Cette stratégie présente aussi des risques:

  1. Bien que la combinaison de plusieurs indicateurs puisse améliorer la qualité des jugements, elle augmente la complexité des stratégies et élargit les risques de sur-optimisation

  2. Les paramètres ne sont pas parfaits à 100% et peuvent ne pas fonctionner dans certains marchés

  3. Il y a encore de la place pour l’optimisation des combinaisons d’indicateurs, et la logique de combinaison peut être affinée.

  4. Les opportunités d’ajustement à court terme pourraient être manquées

La réponse:

  1. Augmentation de la robustesse des échantillons et des paramètres de test

  2. Adaptation de certains paramètres afin de les adapter à un plus grand nombre de marchés

  3. Optimiser l’intégration des indicateurs pour améliorer la qualité des jugements

  4. Réduire de manière appropriée certains paramètres de l’indicateur et augmenter la capture des ajustements à court terme

Direction d’optimisation

Les principales orientations d’optimisation de cette stratégie sont l’optimisation de la manière dont les indicateurs sont intégrés, notamment:

  1. Ajouter plus de différents types d’indicateurs pour former une forêt d’indicateurs, améliorant encore la précision des jugements

  2. Optimisation des paramètres de l’indicateur pour lui permettre de s’adapter automatiquement aux changements du marché

  3. Utiliser des méthodes telles que l’apprentissage automatique pour rechercher automatiquement les meilleures stratégies d’intégration des indicateurs

  4. Augmenter les stratégies de stop loss pour contrôler les risques

  5. Les paramètres d’ajustement dynamique, combinés à des indicateurs d’humeur, permettent de juger de la chaleur du marché.

Il est possible d’améliorer considérablement la qualité et la robustesse de la stratégie en intégrant davantage d’indicateurs, des paramètres d’optimisation automatique et des programmes d’intégration.

Résumer

La plus grande particularité de cette stratégie est l’intégration scientifique de plusieurs indicateurs, formant un signal d’ouverture de position puissant, dont l’effet est visible lorsque la tendance est évidente. Il y a encore beaucoup de place pour l’optimisation de cette stratégie d’intégration, qui peut devenir une stratégie de trading quantitative très puissante en introduisant plus d’indicateurs, ainsi qu’une optimisation intelligente des paramètres et de l’intégration.

Code source de la stratégie
/*backtest
start: 2023-12-19 00:00:00
end: 2024-01-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Aroon+Williams+MA2+ADX+Aroon Str.", shorttitle="Aroon+Williams+MA2+ADX+Aroon Str.", overlay=true)
//https://cafe.naver.com/watchbot/1945
//<<빙썸 매각 기념>> 바이낸스 이오스 복합지표	

//Aroon_1
length_1 = input(264, minval=1, title="Length Aroon_1")
upper_1 = 100 * (highestbars(high, length_1+1) + length_1)/length_1
lower_1 = 100 * (lowestbars(low, length_1+1) + length_1)/length_1
midp_1 = 0
oscillator_1 = upper_1 - lower_1
//osc_1 = plot(oscillator_1, color=red)

//Aroon_2
length_2 = input(72, minval=1, title="Length Aroon_2")
upper_2 = 100 * (highestbars(high, length_2+1) + length_2)/length_2
lower_2 = 100 * (lowestbars(low, length_2+1) + length_2)/length_2
midp_2 = 0
oscillator_2 = upper_2 - lower_2
//osc_2 = plot(oscillator_2, color=red)

//Aroon_3
length_3 = input(137, minval=1, title="Length Aroon_3")
upper_3 = 100 * (highestbars(high, length_3+1) + length_3)/length_3
lower_3 = 100 * (lowestbars(low, length_3+1) + length_3)/length_3
midp_3 = 0
oscillator_3 = upper_3 - lower_3
//osc_3 = plot(oscillator_3, color=red)

//Aroon_4
length_4 = input(62, minval=1, title="Length Aroon_4")
upper_4 = 100 * (highestbars(high, length_4+1) + length_4)/length_4
lower_4 = 100 * (lowestbars(low, length_4+1) + length_4)/length_4
midp_4 = 0
oscillator_4 = upper_4 - lower_4
//osc_4 = plot(oscillator_4, color=red)

//Ma double
short_ma_1 = sma(close, 9)
long_ma_1 = sma(close, 21)
// plot(short_ma_1, color = red)
// plot(long_ma_1, color = green)
// plot(cross(short_ma_1, long_ma_1) ? short_ma_1 : na, style = cross, linewidth = 4)

short_ma_2 = sma(close, 9)
long_ma_2 = sma(close, 21)
// plot(short_ma_2, color = red)
// plot(long_ma_2, color = green)
plot(cross(short_ma_2, long_ma_2) ? short_ma_2 : na, transp= 100, title = "ma cross_2", style = cross, linewidth = 4)

//BB
length_bb = input(270, minval=1, title="BB length")
src_bb = input(close, title="Source")
mult_bb = input(2.0, minval=0.001, maxval=50, title="BB mult")
basis_bb = sma(src_bb, length_bb)
dev_bb = mult_bb * stdev(src_bb, length_bb)
upper_bb = basis_bb + dev_bb
lower_bb = basis_bb - dev_bb
// plot(basis_bb, color=red)
// p1 = plot(upper_bb, color=blue)
// p2 = plot(lower_bb, color=blue)
// fill(p1, p2)

//Williams
length_wil = input(130, minval=1, title="Length Williams %R")
upper_wil = highest(length_wil)
lower_wil = lowest(length_wil)
out_wil = 100 * (close - upper_wil) / (upper_wil - lower_wil)
// plot(out_wil)
// band1 = hline(-20)
// band0 = hline(-80)
// fill(band1, band0)



//ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(145, title="DI Length")
dirmov(len) =>
	up_adx = change(high)
	down_adx = -change(low)
	plusDM = na(up_adx) ? na : (up_adx > down_adx and up_adx > 0 ? up_adx : 0)
    minusDM = na(down_adx) ? na : (down_adx > up_adx and down_adx > 0 ? down_adx : 0)
	truerange = rma(tr, len)
	plus_adx = fixnan(100 * rma(plusDM, len) / truerange)
	minus_adx = fixnan(100 * rma(minusDM, len) / truerange)
	[plus_adx, minus_adx]

adx(dilen, adxlen) =>
	[plus_adx, minus_adx] = dirmov(dilen)
	sum_adx = plus_adx + minus_adx
	adx = 100 * rma(abs(plus_adx - minus_adx) / (sum_adx == 0 ? 1 : sum_adx), adxlen)

sig_adx = adx(dilen, adxlen)

// plot(sig_adx, color=red, title="ADX")


//ADX 2
adxlen_2 = input(14, title="ADX Smoothing")
dilen_2 = input(150, title="DI Length")
dirmov_2(len) =>
	up_adx_2 = change(high)
	down_adx_2 = -change(low)
	plusDM_2 = na(up_adx_2) ? na : (up_adx_2 > down_adx_2 and up_adx_2 > 0 ? up_adx_2 : 0)
    minusDM_2 = na(down_adx_2) ? na : (down_adx_2 > up_adx_2 and down_adx_2 > 0 ? down_adx_2 : 0)
	truerange_2 = rma(tr, len)
	plus_adx_2 = fixnan(100 * rma(plusDM_2, len) / truerange_2)
	minus_adx_2 = fixnan(100 * rma(minusDM_2, len) / truerange_2)
	[plus_adx_2, minus_adx_2]

adx_2(dilen_2, adxlen_2) =>
	[plus_adx_2, minus_adx_2] = dirmov_2(dilen_2)
	sum_adx_2 = plus_adx_2 + minus_adx_2
	adx_2 = 100 * rma(abs(plus_adx_2 - minus_adx_2) / (sum_adx_2 == 0 ? 1 : sum_adx_2), adxlen_2)

sig_adx_2 = adx(dilen_2, adxlen_2)

// plot(sig_adx_2, color=red, title="ADX_2")

//Input Position
//buy position
pos_aroon1 = input(-85, title="Aroon_1 Position Index_Down")
pos_madouble1_short = input(117, title="ma double_1 wma_Short")
pos_madouble1_long =  input(86, title="ma double_1 sma_Long")
pos_wil = input(-99, title="Williams Position Index_Down")
pos_adx= input(14, title="ADX Position Index_Up")
pos_aroon2 = input(-39, title="Aroon_2 Position Index_Up")

//sell position
pos_bb = input(120, title="BB Position Index_Up")
pos_aroon_3 = input(99, title="Aroon_3 Position Index_Up")
pos_madouble2_short= input(88, title="ma double_2 ema_Short")
pos_madouble2_long= input(96, title="ma double_2 sma_Long")
pos_adx_2= input(9, title="ADX_2 Position Index_Up")
pos_aroon_4 = input(35, title="Aroon_4 Position Index_Down")

//Condition
longCondition_aroon_1 = (oscillator_1 <= pos_aroon1)
longCondition_ma2 = (pos_madouble1_short > pos_madouble1_long)
longCondition_wil = (out_wil <= pos_wil)
longCondition_adx = (sig_adx >= pos_adx)
longCondition_aroon_2 = (oscillator_2 >= pos_aroon2)

shortCondition_bb = (close > basis_bb)
shortCondition_aroon_3 = (oscillator_3 >= pos_aroon_3)
shortCondition_ma2 = (pos_madouble2_short < pos_madouble2_long)
shortCondition_adx = (sig_adx_2 >= pos_adx_2)
shortCondition_aroon_4 = (oscillator_4 <= pos_aroon_4)

vl_aroon_1 = 0
vl_ma2 = 0
vl_wil = 0
vl_adx = 0
vl_aroon_2 = 0

if longCondition_aroon_1
    vl_aroon_1 := 1
    
if longCondition_ma2
    vl_ma2 := 3

if longCondition_wil
    vl_wil := 1
    
if longCondition_adx
    vl_adx := -1

if longCondition_aroon_2
    vl_aroon_2 := -1
	

vs_bb = 0
vs_aroon_3 = 0
vs_ma2 = 0
vs_adx = 0
vs_aroon_4 = 0

if shortCondition_bb
    vs_bb := 1

if shortCondition_aroon_3
    vs_aroon_3 := 1
    
if shortCondition_ma2
    vs_ma2 := 3

if shortCondition_adx
    vs_adx := -2

if shortCondition_aroon_4
    vs_aroon_4 := -1

// plotshape(vl_aroon_1, title= "vl_aroon_1", location=location.belowbar, color=green, text="vl_aroon_1")
// plotshape(vl_ma2, title= "vl_ma2", location=location.belowbar, color=green, text="\nvl_ma2")
// plotshape(vl_wil, title= "vl_wil", location=location.belowbar, color=green, text="\n\nvl_wil")
// plotshape(vl_adx, title= "vl_adx", location=location.belowbar, color=green, text="\n\n\nvl_adx")
// plotshape(vl_aroon_2, title= "vl_aroon_2", location=location.belowbar, color=green, text="\n\n\n\nvl_aroon_2")

// plotshape(vs_bb, title= "vs_bb", location=location.abovebar, color=orange, text="vs_bb")
// plotshape(vs_aroon_3, title= "vs_aroon_3", location=location.abovebar, color=orange, text="vs_aroon_3\n")
// plotshape(vs_ma2, title= "vs_ma2", location=location.abovebar, color=orange, text="vs_ma2\n\n")
// plotshape(vs_adx, title= "vs_adx", location=location.abovebar, color=orange, text="vs_adx\n\n\n")
// plotshape(vs_aroon_4, title= "vs_aroon_4", location=location.abovebar, color=orange, text="vs_aroon_4\n\n\n\n")

longCondition = (vl_aroon_1 + vl_ma2 + vl_wil + vl_adx + vl_aroon_2) >= 3 ? true : na
shortCondition = (vs_bb + vs_aroon_3 + vs_ma2 + vs_adx + vs_aroon_4) >= 3 ? true : na

buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na

// plotshape(buy, title= "buy", location=location.bottom, color=green, text="buy")
// plotshape(sell, title= "sell", location=location.top, color=orange, text="sell")


// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

strategy.entry("L", strategy.long, when=(buy))
strategy.close("L", when=(sell))
// strategy.entry("S", strategy.short, when=(sell and (time >= timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59))))
// strategy.close("S", when=(buy and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59))))