Erreur d'execution sur la vente d'un backtest

Viewing 8 posts - 1 through 8 (of 8 total)
  • Author
    Posts
  • #111292 quote
    ScHaP
    Participant
    New

    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
    #111293 quote
    ScHaP
    Participant
    New

    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.

    #111313 quote
    Nicolas
    Keymaster
    Master

    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.

    #111318 quote
    fifi743
    Participant
    Master

    bonjour

    apres un test rapide c’est ta fractalebasse  le probleme.

    tu enleve C5 par exemple et ca marche

     

    cordialement

    #111324 quote
    JC_Bywan
    Moderator
    Master

    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é

    ScHaP thanked this post
    #111353 quote
    JC_Bywan
    Moderator
    Master

    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?

    #111487 quote
    ScHaP
    Participant
    New

    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.

    exemple.png exemple.png
    #111493 quote
    Nicolas
    Keymaster
    Master

    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 😉

    ScHaP thanked this post
Viewing 8 posts - 1 through 8 (of 8 total)
  • You must be logged in to reply to this topic.

Erreur d'execution sur la vente d'un backtest


ProOrder : Trading Automatique & Backtests

New Reply
Author
author-avatar
ScHaP @schap Participant
Summary

This topic contains 7 replies,
has 4 voices, and was last updated by Nicolas
6 years, 4 months ago.

Topic Details
Forum: ProOrder : Trading Automatique & Backtests
Language: French
Started: 10/26/2019
Status: Active
Attachments: 1 files
Logo Logo
Loading...