Bonjour,
Ça va faire plusieurs mois maintenant que j’essaye d’adapter ma stratégie en code, et plus j’avance plus j’obtiens des résultats positifs mais je reste loin d’être complètement satisfait. Aujourd’hui j’aimerais la partager avec vous pour obtenir votre aide, et si possible qu’on puisse la perfectionner ensemble ; car je ne sais pas si la stratégie a atteint sa limite ou si en gardant la logique de base on peut l’améliorer.
Ma stratégie repose sur 6 indicateurs :
– les bandes de bollinger ; – deux moyennes mobiles ; – le MACD ; – les stochastiques ; – la parabolique ; – le prix
et consiste à ce que :
– le plus haut (le plus bas) perce la bande sup (inf) de bollinger ; – la parabolique est inférieure (supérieure) à la bande moy de bollinger ; – les bandes sup et inf de bollinger divergent ou forment une parallèle mais ne convergent pas.
– non-croisement des moyennes mobiles à la hausse (baisse)
– non-croisement du MACD à la hausse (baisse)
– non-croisement des stochastiques à la hausse (baisse)
Voici pour la prise de position. Pour la sortie, il suffit d’avoir :
– MACD LINE < MACD LINE [1] (et inversement pour exitshort). Ou – Stoch K devient négatif sur 2 périodes consécutives.
Généralement les deux arrivent au même moment mais dans le doute je précise.
Dans le code j’ai rajouté plusieurs timeframes (libre à vous de les modifier) ce qui peut le rendre complexe à priori mais le code répète les mêmes règles et est très facile à déchiffrer :
// Définition des paramètres du code
DEFPARAM CumulateOrders = False // Cumul des positions désactivé
// Annule tous les ordres en attente et ferme toutes les positions à 0:00, puis empêche toute création d'ordre avant l'heure "FLATBEFORE".
DEFPARAM FLATBEFORE = 070000
// Annule tous les ordres en attente et ferme toutes les positions à l'heure "FLATAFTER"
DEFPARAM FLATAFTER = 201500
// Empêche le système de placer de nouveaux ordres sur les jours de la semaine spécifiés
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Conditions pour ouvrir une position acheteuse
timeframe (30minutes)
indicatora1 = BollingerUp[20](typicalPrice)
a1 = (high >= indicatora1)
indicatora2 = SAR[0.02,0.02,0.2]
indicatora3 = Average[20](typicalPrice)
a2 = (indicatora2 <= indicatora3)
indicatora4 = MACDline[9,19,6](close)
indicatora5 = MACDSignal[9,19,6](close)
a3 = (indicatora4 > indicatora5)
indicatora6 = WilderAverage[3](Stochastic[14,1](close))
indicatora7 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
a4 = (indicatora6 > indicatora7)
indicatora8 = Average[7](close)
indicatora9 = indicatora8
a5 = (indicatora8 > indicatora9[1])
indicatora10 = Average[23](close)
indicatora11 = indicatora10
a6 = (indicatora10 > indicatora11[1])
indicatora12 = BollingerUp[20](typicalPrice)
indicatora13 = indicatora12
a7 = (indicatora12 > indicatora13[1])
indicatora14 = BollingerDown[20](typicalPrice)
indicatora15 = indicatora14
a8 = (indicatora14 < indicatora15[1])
indicatora16 = MACDSignal[9,19,6](close)
a9 = (indicatora16 > indicatora16[1])
indicatora17 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
a10 = (indicatora17 > indicatora17[1])
indicatora18 = MACDline[9,19,6](close)
a11 = (indicatora18 > indicatora18[1])
indicatora19 = WilderAverage[3](Stochastic[14,1](close))
a12 = (indicatora19 > indicatora19[1])
indicatoraV = WilderAverage[3](Stochastic[14,1](close))
aV = indicatoraV < 80
ConditionsLONGA = ( a2 AND a3 AND a4 AND a5 AND a6 and a9 AND a10 AND a11 AND a12 )
timeframe(10 minutes)
indicator1 = BollingerUp[20](typicalPrice)
c1 = (high >= indicator1)
indicator2 = SAR[0.02,0.02,0.2]
indicator3 = Average[20](typicalPrice)
c2 = (indicator2 <= indicator3)
indicator4 = MACDline[9,19,6](close)
indicator5 = MACDSignal[9,19,6](close)
c3 = (indicator4 > indicator5)
indicator6 = WilderAverage[3](Stochastic[14,1](close))
indicator7 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
c4 = (indicator6 > indicator7)
indicator8 = Average[7](close)
indicator9 = indicator8
c5 = (indicator8 > indicator9[1])
indicator10 = Average[23](close)
indicator11 = indicator10
c6 = (indicator10 > indicator11[1])
indicator12 = BollingerUp[20](typicalPrice)
indicator13 = indicator12
c7 = (indicator12 > indicator13[1])
indicator14 = BollingerDown[20](typicalPrice)
indicator15 = indicator14
c8 = (indicator14 < indicator15[1])
indicator16 = MACDSignal[9,19,6](close)
c9 = (indicator16 > indicator16[1])
indicator17 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
c10 = (indicator17 > indicator17[1])
indicator18 = MACDline[9,19,6](close)
c11 = (indicator18 > indicator18[1])
indicator19 = WilderAverage[3](Stochastic[14,1](close))
c12 = (indicator19 > indicator19[1])
indicatorV = WilderAverage[3](Stochastic[14,1](close))
cV = indicatorV < 75
ConditionsLONG = (c1 AND c2 AND c3 AND c4 AND c5 AND c6 AND c7 AND c8 AND c9 AND c10 AND c11 AND c12) AND not daysForbiddenEntry
if ConditionsLONG and cS and ConditionsLONGA THEN
BUY 10 CONTRACT AT MARKET
SET STOP PTRAILING 12
ENDIF
timeframe(default)
indicatorS = WilderAverage[3](Stochastic[14,1](close))
cS = indicatorS < 60
// Conditions pour fermer une position acheteuse
indicator20 = MACDline[9,19,6](close)
c14 = (indicator20 < indicator20[1])
indicator21 = WilderAverage[3](Stochastic[14,1](close))
c15 = (indicator21 < indicator21[1])
IF c14 AND c15 THEN
SELL AT MARKET
ENDIF
// Conditions pour ouvrir une position vendeuse
timeframe(30 minutes)
// Conditions pour ouvrir une position en vente à découvert
indicatoras24 = BollingerDown[20](typicalPrice)
cas17 = (low <= indicatoras24)
indicatoras25 = SAR[0.02,0.02,0.2]
indicatoras26 = BollingerDown[20](typicalPrice)
cas18 = (indicatoras25 >= indicatoras26)
indicatoras27 = BollingerUp[20](typicalPrice)
indicatoras28 = BollingerUp[20](typicalPrice)
cas19 = (indicatoras27 > indicatoras28[1])
indicatoras29 = BollingerDown[20](typicalPrice)
indicatoras30 = BollingerDown[20](typicalPrice)
cas20 = (indicatoras29 < indicatoras30[1])
indicatoras31 = Average[7](close)
indicatoras32 = Average[7](close)
cas21 = (indicatoras31 < indicatoras32[1])
indicatoras33 = Average[23](close)
indicatoras34 = Average[23](close)
cas22 = (indicatoras33 < indicatoras34[1])
indicatoras35 = MACDSignal[9,19,6](close)
cas23 = (indicatoras35 < indicatoras35[1])
indicatoras36 = MACDline[9,19,6](close)
indicatoras37 = MACDSignal[9,19,6](close)
cas24 = (indicatoras36 < indicatoras37)
indicatoras38 = MACDline[9,19,6](close)
cas25 = (indicatoras38 < indicatoras38[1])
indicatoras39 = WilderAverage[3](Stochastic[14,1](close))
indicatoras40 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
cas26 = (indicatoras39 < indicatoras40)
indicatoras41 = WilderAverage[3](Stochastic[14,1](close))
cas27 = (indicatoras41 < indicatoras41[1])
indicatoras42 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
cas28 = (indicatoras42 < indicatoras42[1])
ConditionsSHORT60 = ( cas18 AND cas19 AND cas20 AND cas21 AND cas22 AND cas23 AND cas24 AND cas25 AND cas26 AND cas27 AND cas28)
timeframe(15 minutes)
// Conditions pour ouvrir une position en vente à découvert
indicatora24 = BollingerDown[20](typicalPrice)
ca17 = (low <= indicatora24)
indicatora25 = SAR[0.02,0.02,0.2]
indicatora26 = BollingerDown[20](typicalPrice)
ca18 = (indicatora25 >= indicatora26)
indicatora27 = BollingerUp[20](typicalPrice)
indicatora28 = BollingerUp[20](typicalPrice)
ca19 = (indicatora27 > indicatora28[1])
indicatora29 = BollingerDown[20](typicalPrice)
indicatora30 = BollingerDown[20](typicalPrice)
ca20 = (indicatora29 < indicatora30[1])
indicatora31 = Average[7](close)
indicatora32 = Average[7](close)
ca21 = (indicatora31 < indicatora32[1])
indicatora33 = Average[23](close)
indicatora34 = Average[23](close)
ca22 = (indicatora33 < indicatora34[1])
indicatora35 = MACDSignal[9,19,6](close)
ca23 = (indicatora35 < indicatora35[1])
indicatora36 = MACDline[9,19,6](close)
indicatora37 = MACDSignal[9,19,6](close)
ca24 = (indicatora36 < indicatora37)
indicatora38 = MACDline[9,19,6](close)
ca25 = (indicatora38 < indicatora38[1])
indicatora39 = WilderAverage[3](Stochastic[14,1](close))
indicatora40 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
ca26 = (indicatora39 < indicatora40)
indicatora41 = WilderAverage[3](Stochastic[14,1](close))
ca27 = (indicatora41 < indicatora41[1])
indicatora42 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
ca28 = (indicatora42 < indicatora42[1])
ConditionsSHORT30 = ( ca18 AND ca19 AND ca20 AND ca21 AND ca22 AND ca23 AND ca24 AND ca25 AND ca26 AND ca27 AND ca28)
timeframe(10 minutes)
indicator24 = BollingerDown[20](typicalPrice)
c17 = (low <= indicator24)
indicator25 = SAR[0.02,0.02,0.2]
indicator26 = BollingerDown[20](typicalPrice)
c18 = (indicator25 >= indicator26)
indicator27 = BollingerUp[20](typicalPrice)
indicator28 = BollingerUp[20](typicalPrice)
c19 = (indicator27 > indicator28[1])
indicator29 = BollingerDown[20](typicalPrice)
indicator30 = BollingerDown[20](typicalPrice)
c20 = (indicator29 < indicator30[1])
indicator31 = Average[7](close)
indicator32 = Average[7](close)
c21 = (indicator31 < indicator32[1])
indicator33 = Average[23](close)
indicator34 = Average[23](close)
c22 = (indicator33 < indicator34[1])
indicator35 = MACDSignal[9,19,6](close)
c23 = (indicator35 < indicator35[1])
indicator36 = MACDline[9,19,6](close)
indicator37 = MACDSignal[9,19,6](close)
c24 = (indicator36 < indicator37)
indicator38 = MACDline[9,19,6](close)
c25 = (indicator38 < indicator38[1])
indicator39 = WilderAverage[3](Stochastic[14,1](close))
indicator40 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
c26 = (indicator39 < indicator40)
indicator41 = WilderAverage[3](Stochastic[14,1](close))
c27 = (indicator41 < indicator41[1])
indicator42 = WilderAverage[3](WilderAverage[3](Stochastic[14,1](close)))
c28 = (indicator42 < indicator42[1])
ConditionsSHORT = (c17 AND c18 AND c19 AND c20 AND c21 AND c22 AND c23 AND c24 AND c25 AND c26 AND c27 AND c28) AND not daysForbiddenEntry
if ConditionsSHORT and ConditionsSHORT60 and cSA and ConditionsSHORT30 THEN
sellshort 10 CONTRACT AT MARKET
SET STOP PTRAILING 14
ENDIF
timeframe(default)
indicatorS = WilderAverage[3](Stochastic[14,1](close))
cSA = indicatorS > 45
//27 ou 45
// Conditions pour fermer une position en vente à découvert
indicator43 = MACDline[9,19,6](close)
c29 = (indicator43 >= indicator43[1])
indicator44 = WilderAverage[3](Stochastic[14,1](close))
c30 = (indicator44 >= indicator44[1])
IF c29 AND c30 THEN
EXITSHORT AT MARKET
ENDIF
J’espère quand voyant ce code vous le comprendrez :). Je travaille actuellement sur le Nasdaq 100 sur du 5 min mais je suppose qu’il peut fonctionner sur d’autres indices.
Si jamais je reste à votre disposition, je suis encore débutant et souhaite développer mes connaissances.
En vous remerciant pour votre bienveillance et votre compréhension 🙂