Mauvais calcul du Stop Loss en Automatique

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

    Bonjour,

    Je cherche à faire fonctionner un petit code sur le mini France 40 en 1 min en automatique, chez IG. Les ordres sont bien déclenchés selon les critères fournis. Toutefois, à chaque fois ils sont rejetés, car le niveau du Stop Loss est calculé excessivement bas (7 ou 8 ou 9) ou excessivement haut (12412.7 …). Le niveau su Stop Loss est calculé d’après d’autres valeurs calculées dans le code : je vous le fournis en entier. Qu’est-ce qui, selon vous, donne un niveau de Stop Loss aussi erroné ? Merci pour votre retour.

    //30 Août 2022
    
    //Le haut du canal varie lorsque Fisher_Transform croise à la baisse son Trigger, le bas du canal varie lorsque le fisher_Transform croise à la baisse son Trigger.
    
    DEFPARAM CumulateOrders = false
    DEFPARAM FlatAfter = 223000
    
    HeureDebut = 063000
    HeureFin = 223000
    
    Plage = (time >= HeureDebut AND time <= HeureFin)
    
    //Calcul du Fisher_Transform :
    
    p = 20
    p1 = 4
    p2 = 4
    
    a1= customclose
    
    b1= highest[p](a1)
    b2=lowest[p](a1)
    
    IF BARINDEX > p+2 THEN
    vb=(a1-b2)/(b1-b2)
    v1 =exponentialaverage[p1](2*(vb - 0.5))
    f1 =exponentialaverage[p2]( 0.50*log((1+v1)/(1-v1) ))
    ENDIF
    
    Fisher = f1
    Trigger = f1[1]
    
    //Conditions pour Ligne_Haut
    
    condition1 = Fisher > 0 AND Trigger > 0
    condition2 = Fisher CROSSES UNDER Trigger
    
    //Conditions pour Ligne_Bas
    
    condition3 = Fisher < 0 AND Trigger < 0
    condition4 = fisher CROSSES OVER Trigger
    
    Hauta = condition1 AND condition2
    CrossHaut = (Fisher > 1 AND Trigger > 1)
    
    Basa = condition3 AND condition4
    CrossBas = (Fisher < -1 AND Trigger < -1)
    
    IF HAUTa AND CrossHaut THEN
    a = highest[2](high)
    ENDIF
    
    IF BASa AND CrossBas THEN
    b = lowest[2](low)
    ENDIF
    
    //Condition d'ACH
    condition5 = close > open //donc verte
    condition6 = open < a
    condition7 = close > a
    
    BreakACH = (condition5 AND condition6 AND condition7)
    
    //condition de VTE
    condition8 = close < open //donc rouge
    condition9 = open > b
    condition10 = close < b
    
    BreakVTE = (condition8 AND condition9 AND condition10)
    
    IF NOT ONMARKET AND BreakACH AND Plage THEN
    BUY 1 contract AT MARKET NextBarOpen
    ENDIF
    
    IF (TradePrice - b) < 10 THEN
    SET STOP pLOSS (b - 4)
    ELSIF (TradePrice - b) > 10 THEN
    SET STOP pLOSS b
    ENDIF
    
    conditionGainLong = (close - PositionPrice) >= 3
    
    IF LONGONMARKET AND conditionGainLong THEN
    SELL AT MARKET NextBarOpen
    ENDIF
    
    IF NOT ONMARKET AND BreakVTE AND Plage THEN
    SELLSHORT 1 contract AT MARKET NextBarOpen
    ENDIF
    
    IF (a - TradePrice) < 10 THEN
    SET STOP pLOSS (a + 4)
    ELSIF (a - TradePrice) > 10 THEN
    SET STOP pLOSS a
    ENDIF
    
    conditionGainShort = (PositionPrice - close) >= 3
    
    IF SHORTONMARKET AND conditionGainShort THEN
    EXITSHORT AT MARKET NextBarOpen
    ENDIF
    
    #199932 quote
    Nicolas
    Keymaster
    Master

    L’instruction SET STOP PLOSS attend une distance en pips et tu lui donnes un niveau de prix précis.

    Dans ton cas, tu devrais utiliser la nouvelle instruction SET STOP PRICE qui placera le stoploss sur un niveau de prix.

    #199937 quote
    Xavier61
    Participant
    New

    Merci pour cette nouvelle information et la rapidité de la réponse. Je vais essayer cela et le tester. Je reviendrai donner des nouvelles.

    #200000 quote
    Xavier61
    Participant
    New

    Bonjour Nicolas, j’ai apporté la modification recommandée : STOP LOSS en STOP PRICE, et précisé un ou 2 détails dans le code (ajout des lignes 53 et 59). Le système a bien fonctionné : bon calcul des Stop et exécution des ordres d’ouverture-clôture-stop. Merci beaucoup pour ton aide.

    Toutefois, le système ne fonctionne qu’en SHORT, alors que la rédaction pour des positions LONG est parfaitement symétrique : je l’ai relu x fois et je ne trouve pas d’erreur/différence entre les commandes Long et SHORT.

    Je joins à nouveau le code, si tu as l’opportunité de t’y pencher à nouveau 😉 Merci

    //30 Août 2022
    
    //Le haut du canal varie lorsque Fisher_Transform croise à la baisse son Trigger, le bas du canal varie lorsque le fisher_Transform croise à la baisse son Trigger.
    
    DEFPARAM CumulateOrders = false
    DEFPARAM FlatAfter = 223000
    
    HeureDebut = 080000
    HeureFin = 223000
    
    Plage = (time >= HeureDebut AND time <= HeureFin)
    
    //Calcul du Fisher_Transform :
    
    p = 20
    p1 = 4
    p2 = 4
    
    a1= customclose
    
    b1= highest[p](a1)
    b2=lowest[p](a1)
    
    IF BARINDEX > p+2 THEN
    vb=(a1-b2)/(b1-b2)
    v1 =exponentialaverage[p1](2*(vb - 0.5))
    f1 =exponentialaverage[p2]( 0.50*log((1+v1)/(1-v1) ))
    ENDIF
    
    Fisher = f1
    Trigger = f1[1]
    
    //Conditions pour Ligne_Haut
    
    condition1 = Fisher > 0 AND Trigger > 0
    condition2 = Fisher CROSSES UNDER Trigger
    
    //Conditions pour Ligne_Bas
    
    condition3 = Fisher < 0 AND Trigger < 0
    condition4 = fisher CROSSES OVER Trigger
    
    Hauta = condition1 AND condition2
    CrossHaut = (Fisher > 1 AND Trigger > 1)
    
    Basa = condition3 AND condition4
    CrossBas = (Fisher < -1 AND Trigger < -1)
    
    IF HAUTa AND CrossHaut THEN
    a = highest[2](high)
    ENDIF
    
    LigneHaut = a
    
    IF BASa AND CrossBas THEN
    b = lowest[2](low)
    ENDIF
    
    LigneBas = b
    
    //Condition d'ACH
    condition5 = close > open //donc verte
    condition6 = open < LigneHaut
    condition7 = close > LigneHaut
    
    BreakACH = (condition5 AND condition6 AND condition7)
    
    //condition de VTE
    condition8 = close < open //donc rouge
    condition9 = open > LigneBas
    condition10 = close < LigneBas
    
    BreakVTE = (condition8 AND condition9 AND condition10)
    
    IF NOT ONMARKET AND BreakACH AND Plage THEN
    BUY 1 contract AT MARKET NextBarOpen
    ENDIF
    
    IF (TradePrice - LigneBas) < 10 THEN
    SET STOP PRICE (LigneBas - 4)
    ELSIF (TradePrice - LigneBas) > 10 THEN
    SET STOP PRICE LigneBas
    ENDIF
    
    conditionGainLong = (close - PositionPrice) >= 3
    
    IF LONGONMARKET AND conditionGainLong THEN
    SELL AT MARKET NextBarOpen
    ENDIF
    
    IF NOT ONMARKET AND BreakVTE AND Plage THEN
    SELLSHORT 1 contract AT MARKET NextBarOpen
    ENDIF
    
    IF (LigneHaut - TradePrice) < 10 THEN
    SET STOP PRICE (LigneHaut + 4)
    ELSIF (LigneHaut - TradePrice) > 10 THEN
    SET STOP PRICE LigneHaut
    ENDIF
    
    conditionGainShort = (PositionPrice - close) >= 3
    
    IF SHORTONMARKET AND conditionGainShort THEN
    EXITSHORT AT MARKET NextBarOpen
    ENDIF
    
    #200018 quote
    Nicolas
    Keymaster
    Master

    Je pense que tu devrais encadrer tes modifications de stoploss (lignes 79 à 83 et lignes 95 à 99) avec des conditions pour savoir si tu es LONG ou SHORTONMARKET, pour ainsi utiliser ces instructions vraiment lorsque c’est utile.

    #200022 quote
    Xavier61
    Participant
    New

    Bonjour Nicolas, merci pour le conseil. J’y retravaillerai un peu plus tard et te redonnerai des nouvelles. En attendant, j’ai scindé mes systèmes en 2 “sous-systèmes” (un Long et un Short à chaque fois). Le travail a été un peu rébarbatif, mais les 2 fonctionnent bien dans les 2 sens. Cela invite à penser que ton idée doit être efficiente, puisqu’ainsi le système saura dans quel(s) cas et à quelle(s) condition(s) entrer/sortir/stopper.

    A bientôt

    #200189 quote
    Xavier61
    Participant
    New

    Bonjour Nicolas,

    J’ai apporté les modifications que tu m’as suggérées. L’ensemble fonctionne bien, il n’y a plus aucun blocage (sauf à cause d’une erreur de signe de ma part).

    J’ai maintenu des systèmes LONG et SHORT individualisés pour plus de sûreté. Bien sûr, cela augmente le nombre de systèmes, mais je vois que plusieurs personnes, sur les forums, rencontrent des incohérences (et donc des dysfonctionnements) entre leurs entrées LONG et leurs entrées SHORT, ainsi que pour le placement de leurs STOP.

    J’ai encore de mon côté plusieurs choses à améliorer je pense, afin d’optimiser, et pour que les pertes ne dépassent pas les gains. Ensuite, je compte adapter sur des sous-jacents variés.

    Merci encore pour ton aide efficace.

    Ci-joint un exemplaire d’un code, à dupliquer en symétrique pour les ACH et les VTE, les HAUT et les BAS.

    //30 Août 2022
    
    //Le haut du canal varie lorsque Fisher_Transform croise à la baisse son Trigger, le bas du canal varie lorsque le fisher_Transform croise à la baisse son Trigger.
    
    DEFPARAM CumulateOrders = false
    DEFPARAM FlatAfter = 223000
    
    HeureDebut = 080000
    HeureFin = 223000
    
    Plage = (time >= HeureDebut AND time <= HeureFin)
    
    //Calcul du Fisher_Transform :
    
    p = 20
    p1 = 4
    p2 = 4
    
    a1= customclose
    
    b1= highest[p](a1)
    b2=lowest[p](a1)
    
    IF BARINDEX > p+2 THEN
    vb=(a1-b2)/(b1-b2)
    v1 =exponentialaverage[p1](2*(vb - 0.5))
    f1 =exponentialaverage[p2]( 0.50*log((1+v1)/(1-v1) ))
    ENDIF
    
    Fisher = f1
    Trigger = f1[1]
    
    //Conditions pour Ligne_Haut
    
    condition1 = Fisher > 0 AND Trigger > 0
    condition2 = Fisher CROSSES UNDER Trigger
    
    //Conditions pour Ligne_Bas
    
    condition3 = Fisher < 0 AND Trigger < 0
    condition4 = fisher CROSSES OVER Trigger
    
    Hauta = condition1 AND condition2
    CrossHaut = (Fisher > 1 AND Trigger > 1)
    
    Basa = condition3 AND condition4
    CrossBas = (Fisher < -1 AND Trigger < -1)
    
    IF HAUTa AND CrossHaut THEN
    a = highest[2](high)
    ENDIF
    
    LigneHaut = a
    
    IF BASa AND CrossBas THEN
    b = lowest[2](low)
    ENDIF
    
    LigneBas = b
    
    //Condition d'ACH
    condition5 = close > open //donc verte
    condition6 = open < LigneBas
    condition7 = close > LigneBas
    
    BreakACH = (condition5 AND condition6 AND condition7)
    
    IF NOT ONMARKET AND BreakACH AND Plage THEN
    op = open
    BUY 1 contract AT MARKET NextBarOpen
    ENDIF
    
    TP = TradePrice
    
    IF LONGONMARKET AND (TP - LigneBas) < 10 THEN
    SET STOP PRICE (LigneBas - 4)
    ELSIF LONGONMARKET AND (TP - LigneBas) > 20 THEN
    SET STOP PRICE (TP - 20)
    ENDIF
    
    conditionGainLong = (close - PositionPrice) >= 3
    
    IF LONGONMARKET AND conditionGainLong THEN
    SELL AT MARKET NextBarOpen
    ENDIF
    
    condition8 = open >= TP OR open <= TP
    condition9 = close < LigneBas OR (close < LigneBas AND close < op)
    
    //STOP sur Reverse Immédiat
    
    StopRev = condition8 AND condition9
    
    IF LONGONMARKET AND StopRev THEN
    SELL AT MARKET NextBarOpen
    ENDIF
    
    #200191 quote
    Nicolas
    Keymaster
    Master

    Merci pour le retour et le partage. Bonne continuation et bon courage 🙂

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

Mauvais calcul du Stop Loss en Automatique


ProOrder : Trading Automatique & Backtests

New Reply
Author
author-avatar
Xavier61 @xavier61 Participant
Summary

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

Topic Details
Forum: ProOrder : Trading Automatique & Backtests
Language: French
Started: 08/30/2022
Status: Active
Attachments: No files
Logo Logo
Loading...