Bonjour Nicolas,
J’aurai besoin de ton aide concernant le code d’un backtest que j’essaie de mettre en place.
Je me casse la tête depuis une journée à essayer de comprendre pourquoi je n’arrive pas à avoir les ventes exécutées.
Les achats sont biens exécutés, mais pas la seconde partie au niveau de la vente. Peut-être que je n’utilise pas la bonne instruction.
Si tu pouvait m’indiquer où se localise mon erreur, sa me permettrait d’avancer.
Je te met mon code complet ci dessous:
merci pour ton aide.
Cordialement Sam.
//________________________________________________
// [ NOM DU BACKTEST : FRACTALES ]
//________________________________________________
// RATIO risque / gain = 1
// avec 1R max de perte et 1R de gain max
// Cumul des positions désactivé
DEFPARAM CumulateOrders = False
// J'annule tous les ordres en attente et ferme les positions après 17H30.
DEFPARAM FLATAFTER = 173000
// Empêche de rentrer en position avant 09H
noEntryBeforeTime = 090000
timeEnterBefore = time >= noEntryBeforeTime
// Empêche de rentrer en position après 17H15
noEntryAfterTime = 171500
timeEnterAfter = time < noEntryAfterTime
// Empêche de placer un ordre le samedi ou dimanche.
// Ordre posible seulement (lundi, mardi, mercredi, jeudi, vendredi)
daysForbiddenEntry = OpenDayOfWeek = 6 OR OpenDayOfWeek = 0
// Capital initial
//(le même que dans les paramètres du backtest)
capitalInitial = 10000
// Nombres de R max à aller chercher pour les gains
RGainMax = 1
// Nombres de R max à autoriser pour les pertes
RPerteMax = 1
// Filtrage avec le RSI
// Pour un achat le RSI doit être strictement supérieur à 50
rsiachat = RSI[14](close)>50
// Pour une vente le RSI doit être strictement inférieur à 50
rsivente = RSI[14](close)<50
// Filtrage avec une MME100
// Pour un achat mon prix doit être supérieur à la MME100
mme100achat = close > ExponentialAverage[100](close)
// Pour une vente mon prix doit être inférieur à la MME100
mme100vente = close < ExponentialAverage[100](close)
// Backtest appliqué sur un historique au minimum de 400 périodes pour les positions acheteuses
IF (BarIndex > 400) THEN
//
//// si je n'ai pas déjà de position ouverte à l'achat.
IF (NOT LONGONMARKET) THEN
//
//// Je déclare ma fractale haute
//// J'aurai pu déclarer un appel sur mon indicateur genre fractale = call "sam fractale"
////sur 5 bougies: la bougie du milieu bougie 2, le plus haut doit être > au plus haut de la bougie 0
c1=high[2]>high
//sur 5 bougies: la bougie du milieu, le plus haut doit être > au plus haut de la bougie 1
c2=high[2]>high[1]
//sur 5 bougies: la bougie du milieu, le plus haut doit être > au plus haut de la bougie 3
c3=high[2]>high[3]
//sur 5 bougies: la bougie du milieu, le plus haut doit être > au plus haut de la bougie 4
c4=high[2]>high[4]
//
////si toutes les conditions sont vrai alors j'ai 1 = présence d'une fractale haute.
fractalehaute = c1 and c2 and c3 and c4
//
//
//
//// si le plus haut actuel dépasse le plus haut de la fractale haute
IF (high > fractalehaute) AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry AND rsiachat AND mme100achat THEN//AND (time>timeEnterBefore AND time<timeEnterAfter AND daysForbiddenEntry) THEN
//
//
//// si j'ai un signal fractale haute et que je ne suis pas déjà acheteur
////achète tout ce qu'on peut avec le capital disponible
nbSharesToBuy = (capitalInitial + STRATEGYPROFIT) / close
BUY nbSharesToBuy SHARES AT MARKET
//
//// Perte max possible (1R)
perteMax = (close - min(low,low[1]))
//
//// Seuil vente défensive (stop loss)
seuilVenteDefensive = close - (perteMax * RPerteMax)
//
//// Seuil vente offensive (target profit)
seuilVenteOffensive = close + (perteMax * RGAinMax)
ENDIF
ELSE
//
//// je suis déjà en position acheteuse
//// alors je vérifie si je n'ai pas besoin de vendre
//// Vente défensive (STOP LOSS)
signalVenteDefensive = close <= seuilVenteDefensive
//
//// Vente offensive (TAKE PROFIT)
signalVenteOffensive = close >= seuilVenteOffensive
//
IF (signalVenteDefensive OR signalVenteOffensive) THEN
//// Si les conditions de vente défensive ou de la vente offensive sont réunies, alors je vend tout
SELL AT MARKET
//
////
////-- vente offensif (=take profit)
////
//// prix de la position à l'achat
////
////-- vente défensif (=stop loss)
////
//
ENDIF
ENDIF
// Backtest appliqué sur un historique au minimum de 400 périodes pour les positions vendeuses
IF (BarIndex > 400) THEN
// si je n'ai pas déjà de position ouverte à la vente
IF (NOT SHORTONMARKET) THEN
// Je déclare ma fractale haute
// J'aurai pu déclarer un appel sur mon indicateur genre fractale = call "sam fractale"
//sur 5 bougies: la bougie du milieu bougie 2, le plus bas doit être < au plus bas de la bougie 0
c5=low[2]<low
//sur 5 bougies: la bougie du milieu, le plus haut doit être < au plus bas de la bougie 1
c6=low[2]<low[1]
//sur 5 bougies: la bougie du milieu, le plus haut doit être < au plus bas de la bougie 3
c7=low[2]<low[3]
//sur 5 bougies: la bougie du milieu, le plus haut doit être < au plus bas de la bougie 4
c8=low[2]<low[4]
//si toutes les conditions sont vrai alors j'ai
// 1 = présence d'une fractale basse.
fractalebasse = c5 and c6 and c7 and c8
IF (low < fractalebasse)AND timeEnterBefore AND timeEnterAfter AND not daysForbiddenEntry AND rsivente AND mme100vente THEN //AND (time>timeEnterBefore AND time<timeEnterAfter AND daysForbiddenEntry) THEN
// Un signal fractale basse est détecté et je n'est pas déjà en position vendeuse
//alors je vend tout ce que je peut avec le capital disponible
nbSharesToSell = (capitalInitial + STRATEGYPROFIT) / close
//SELL nbSharesToSell SHARES AT MARKET
SELLSHORT nbSharesToSell SHARES AT MARKET
//SELLSHORT 1 CONTRACTS AT MARKET
// Perte max possible (1R)
perteMax = (max(high, high[1]) - close)
// Seuil achat défensive (stop loss)
seuilAchatDefensive = close + (perteMax * RPerteMax)
// Seuil achat offensive (target profit)
seuilAchatOffensive = close - (perteMax * RGAinMax)
ENDIF
ELSE
// Sinon je suis déjà en position de vente.
// je check si mon stop loss ou take profit est touché
// si oui j'achète pour cloturer ma position en vente.
// Achat défensive
signalAchatDefensive = close >= seuilAchatDefensive
// Achat offensive
signalAchatOffensive = close <= seuilAchatOffensive
IF (signalAchatDefensive OR signalAchatOffensive) THEN
//BUY AT MARKET
//BUY nbSharesToBuy SHARES AT MARKET
//
//-- achat défensif (=stop loss)
//
// prix de la position vente
//
//-- achat offensif (=take profit)
//
// si les conditions sont réunit je solde toute la position
EXITSHORT AT MARKET
ENDIF
ENDIF
ENDIF
ENDIF
Bonjour Nicolas,
J’aurai besoin de ton aide concernant le code d’un backtest que j’essaie de mettre en place.
Je me casse la tête depuis une journée à essayer de comprendre pourquoi je n’arrive pas à avoir les ventes exécutées.
Les achats sont biens exécutés, mais pas la seconde partie au niveau de la vente. Peut-être que je n’utilise pas la bonne instruction.
Si tu pouvait m’indiquer où se localise mon erreur, sa me permettrait d’avancer.
Je te met mon code complet ci dessous:
merci pour ton aide.
Cordialement Sam.
As-tu graph les conditions de vente dans ton backtest ?, c’est la seule façon de debugger ses variables.
Je peux supprimer l’autre sujet ? Il semble identique.
bonjour
apres un test rapide c’est ta fractalebasse le probleme.
tu enleve C5 par exemple et ca marche
cordialement
Merci d’avoir reposté en ayant utilisé le bouton “insert prt code”, je supprime le message identique mais non formaté qui a précédé
Est-ce que ça serait pas un “endif” à déplacer? Quand tu démarres la boucle qui s’occupe des longs en ligne 48 et ses sous-boucles, tu finis par 2 endif en lignes 110-111, alors que la boucle similaire qui s’occupe des shorts démarrant en ligne 114 et ses sous boucles, elle finit par 4 endif… En déplacer un des 4 pour le grouper avec ceux de 110-111 et ainsi faire 2 groupes de 3 endif devrait éviter que ta boucle short soit coincée dans la boucle long au lieu d’être à part?
Bonjour à tous,
Tout d’abord, je m’excuse pour le double post, c’est une erreur de ma part.
Pour le moment Nicolas, comme condition de vente je m’étais dit que je prendrais uniquement une ancienne fractale basse par exemple de “X” périodes en arrière et déclencher une vente selon la condition: Je vend si la fractale basse “X” périodes en arrière est dépassée par le prix actuel “bougie avec prix en clôture”. Je pensais faire de même pour la condition d’achat pour une fractale haute. J’ai eu se raisonnement sur la constatation que je ne peux pas me baser sur les dernières fractales (trop aléatoire) pour décider d’un achat ou d’une vente.
Pour le moment, je cherche, je test. Mais, je reste persuadé qu’il y a possibilité de faire de très belles choses sur cette base.
Je vais essayer de voir comment arranger tout ça avec d’autres conditions d’achat ou de vente.
Merci à tous pour votre aide.
Cordialement Sam.
Pour le breakout de fractals, je pense que tu peux partir sur cette base : Fractal breakout intraday Strategy EUR/USD 1H
Il doit sans doute beaucoup d’autres exemples sur le trading des fractals sur le forum ! Je te laisse chercher 😉