Erreur d'execution sur la vente d'un backtest
Forums › ProRealTime forum Français › Support ProOrder › Erreur d'execution sur la vente d'un backtest
- This topic has 7 replies, 4 voices, and was last updated 5 years ago by Nicolas.
-
-
10/26/2019 at 9:10 PM #111292
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.
backtest fractals123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178//________________________________________________// [ 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 09HnoEntryBeforeTime = 090000timeEnterBefore = time >= noEntryBeforeTime// Empêche de rentrer en position après 17H15noEntryAfterTime = 171500timeEnterAfter = 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 gainsRGainMax = 1// Nombres de R max à autoriser pour les pertesRPerteMax = 1// Filtrage avec le RSI// Pour un achat le RSI doit être strictement supérieur à 50rsiachat = RSI[14](close)>50// Pour une vente le RSI doit être strictement inférieur à 50rsivente = RSI[14](close)<50// Filtrage avec une MME100// Pour un achat mon prix doit être supérieur à la MME100mme100achat = close > ExponentialAverage[100](close)// Pour une vente mon prix doit être inférieur à la MME100mme100vente = close < ExponentialAverage[100](close)// Backtest appliqué sur un historique au minimum de 400 périodes pour les positions acheteusesIF (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 0c1=high[2]>high//sur 5 bougies: la bougie du milieu, le plus haut doit être > au plus haut de la bougie 1c2=high[2]>high[1]//sur 5 bougies: la bougie du milieu, le plus haut doit être > au plus haut de la bougie 3c3=high[2]>high[3]//sur 5 bougies: la bougie du milieu, le plus haut doit être > au plus haut de la bougie 4c4=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 hauteIF (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 disponiblenbSharesToBuy = (capitalInitial + STRATEGYPROFIT) / closeBUY 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)ENDIFELSE////// 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 toutSELL AT MARKET//////////-- vente offensif (=take profit)//////// prix de la position à l'achat////////-- vente défensif (=stop loss)//////ENDIFENDIF// Backtest appliqué sur un historique au minimum de 400 périodes pour les positions vendeusesIF (BarIndex > 400) THEN// si je n'ai pas déjà de position ouverte à la venteIF (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 0c5=low[2]<low//sur 5 bougies: la bougie du milieu, le plus haut doit être < au plus bas de la bougie 1c6=low[2]<low[1]//sur 5 bougies: la bougie du milieu, le plus haut doit être < au plus bas de la bougie 3c7=low[2]<low[3]//sur 5 bougies: la bougie du milieu, le plus haut doit être < au plus bas de la bougie 4c8=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 c8IF (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 disponiblenbSharesToSell = (capitalInitial + STRATEGYPROFIT) / close//SELL nbSharesToSell SHARES AT MARKETSELLSHORT 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)ENDIFELSE// 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éfensivesignalAchatDefensive = close >= seuilAchatDefensive// Achat offensivesignalAchatOffensive = close <= seuilAchatOffensiveIF (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 positionEXITSHORT AT MARKETENDIFENDIFENDIFENDIF10/26/2019 at 9:11 PM #111293Bonjour 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.
10/27/2019 at 8:45 AM #11131310/27/2019 at 10:28 AM #11131810/27/2019 at 11:41 AM #11132410/27/2019 at 6:55 PM #111353Est-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?
10/29/2019 at 4:18 AM #111487Bonjour à 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.
10/29/2019 at 9:10 AM #111493Pour 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 😉
1 user thanked author for this post.
-
AuthorPosts
Find exclusive trading pro-tools on