Aide pour création code Proorder avec RSI

Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #186821 quote
    jpm380
    Participant
    New

    Bonjour,

    Je poste ce message pour avoir de l’aide sur la creation d’un code sur une stratégie assez simple avec indicateur RSI 14, dont voici les caractéristiques :

    Stratégie uniquement basé sur ACHAT de 5 mini lot FRANCE 40 lorsque RSI <30 à la fin de la bougie (achat sur ouverture bougie suivante).

    Si cours diminue de 40 points, alors achat de 5 lots supplémentaire
    Si cours diminue de 80 points, alors achat de 5 lots supplémentaire
    Si cours diminue de 120 points, alors achat de 5 lots supplémentaire.

    Si cours diminue de 160 points, alors fermeture des 3 positions en perte.

    Limite = RSI croise 70 immédiatement

     

    Merci pour votre aide.

    Bonne journée.

    #187207 quote
    JC_Bywan
    Moderator
    Master

    Bonjour,

    à tester, avec beaucoup de méfiance, pas seulement en cas de mauvaise interprétation de ma part, ou d’erreur de codage, mais aussi parce que ce genre de système “semble” rapporter sur certaines phases favorables, mais cause des pertes conséquentes sur phases défavorables qui peuvent aller jusqu’à vider un compte. Il n’est pas dit que le bilan sera toujours positif. Pour se faire une idée du bilan global, et ne pas vider le compte “avant” qu’éventuellement ça rapporte (et si ça rapporte), la prudence impose de beaucoup backtester sur toutes sortes d’UT et de phases de marché.

    Un léger doute lié à 4 entrées (une en ouverture de bougie quand RSI passe sous 30 + les 3 renforts) contre mention de coupure de “3 ^psitions en perte”, dans le doute j’ai codé pour sortir les 4 (annotée “A” ligne 43) et ajouté en commentaires les lignes 45 à 48 qui correspondent à en couper seulement 3 (“B”).

    defparam CUMULATEORDERS=true
    //
    achat0=5
    //
    chute1=40
    achat1=5
    //
    chute2=80
    achat2=5
    //
    chute3=120
    achat3=5
    //
    chutestop=160
    //
    indi=RSI[14](close)
    //
    if indi crosses under 30 and startlevel=0 then
    startlevel=close
    IF NOT LongOnMarket THEN
    BUY achat0 CONTRACTS AT MARKET
    ENDIF
    endif
    
    if startlevel<>0 then
    level1=startlevel-chute1*pipsize
    level2=startlevel-chute2*pipsize
    level3=startlevel-chute3*pipsize
    stoplevel=startlevel-chutestop*pipsize
    
    if onmarket and countofposition<=achat0 then
    BUY achat1 CONTRACTS AT level1 limit
    BUY achat2 CONTRACTS AT level2 limit
    BUY achat3 CONTRACTS AT level3 limit
    elsif onmarket and countofposition<=achat0+achat1 then
    BUY achat2 CONTRACTS AT level2 limit
    BUY achat3 CONTRACTS AT level3 limit
    elsif onmarket and countofposition<=achat0+achat1+achat2 then
    BUY achat3 CONTRACTS AT level3 limit
    endif
    
    //Choisir si stop sur 4 positions, ou 3 sur 4
    SELL AT stoplevel STOP // A - 4 positions coupées
    
    //trois=achat1+achat2+achat3// B - 3 dernières sur 4 positions coupées
    //if countofposition>=trois then// B - 3 dernières sur 4 positions coupées
    //SELL trois CONTRACTS AT stoplevel STOP// B - 3 dernières sur 4 positions coupées
    //endif// B - 3 dernières sur 4 positions coupées
    
    endif
    
    
    IF  indi crosses under 30 and startlevel=0 THEN
    BUY achat0 CONTRACTS AT MARKET
    ENDIF
    
    If LongOnMarket AND indi crosses over 70 THEN
    SELL AT MARKET
    ENDIF
    
    if indi crosses over 70 or close<startlevel-chutestop*pipsize then
    startlevel=0
    endif
    jpm380 thanked this post
    #187242 quote
    jpm380
    Participant
    New

    Bonjour JC_Bywan,

    Je vous remercie beaucoup pour votre aide et votre temps pour ce code.

    Je sais qu’il doit être optimisé avant de le mettre en réel, mais je voudrai tester plusieurs paramètres avant.

    J’ai une erreur sur la ligne 3 apparemment lorsque je lance le backtest, et je constate qu’il n’ouvre pas une 2eme, ni 3eme  position si le cours tombe de 40 points.

    Ou est l’erreur?

    Pour info il y a max 3 positions ouvertes et fermetures sur -160 points.

    #187287 quote
    JC_Bywan
    Moderator
    Master

    Là je suis perdu 2 fois, la première parce que ça ne me renvoie pas d’erreur en ligne 3, et la 2e parce qu’autant j’avais un doute sur s’il fallait en fermer 3 ou 4 sur les 4, autant je n’ai pas compris du tout qu’il n’y en a que 3 en tout. J’essaye de relire le post de départ en ce sens, mais j’en compte une (de 5) dès que rsi passe sous 30, puis si chute de 40 la requête parle de 5 supplémentaires (donc le mot supplémentaire qui confirme qu’on en est à une 2ème de 5), puis encore 2 autres fois 5 supplémentaires, j’en suis à 4. S’il n’y en a que 3, et en supposant que celle de trop n’est pas celle de 40 de chute ni celle de 80, faut-il supprimer la première dès que RSI<30 ou la quatrième quand chute de 120? Quelque chose me dit que c’est probablement la première quand rsi passe sous 30 avant chute de 40 points qui n’en est pas une et que c’est le mot “supplémentaire” qui est de trop sur la chute à 40 et l’a fait passer pour une 2ème au lieu d’une première, mais bon, je préfèrerais en être sûr avant de revoir le code…

    #187315 quote
    jpm380
    Participant
    New
    Bonjour JC_Bywan,
    Effectivement mon explication n’était pas très claire, je m’en excuse. J’ai revu mon texte, et je vous ai mis 3 exemples ci-dessous pour que ce soit plus clair:
    Stratégie uniquement basé sur ACHAT de 5 mini lot FRANCE 40 lorsque RSI <30 à la fin de la bougie (achat sur ouverture bougie suivante).
    1/ Achat 1 position 5 lots sur bougie suivante dès que RSI ferme en dessous de 30.
    2/ Si cours diminue de 40 points, alors achat de 5 lots supplémentaire
    3/ Si cours diminue de 80 points, alors achat de 5 lots supplémentaire
    4/ Si cours diminue de 120 points, alors achat de 5 lots supplémentaire.
    5/ Si cours diminue de 160 points : FERMETURE DE TOUTES LES POSITIONS EN PERTE
    Fermeture de toutes les positions = RSI croise 70 immédiatement
    Exemple 1:
    Bougie X minutes ferme avec RSI < 30. Sur Bougie suivante ouverture position 5 unités (à 7160 points par exemple).
    Si cours descend à 7120 points, alors ouverture 2ème position de 5 unités.
    Si cours descend à 7080 points, alors ouverture 3ème position de 5 unités
    Si cours descend à 7040 points, alors ouverture 4ème position de 5 unités
    Si cours descend à 7000 points : FERMETURE EN PERTE DE TOUTES LE POSITIONS
    Dans tous les cas, fermeture immédiate de 1 ou toutes les positions dès que RSI croise 70. (Et non à la fin de la bougie)
    Exemple 2:
    Bougie X minutes ferme avec RSI < 30.
    Sur Bougie suivante ouverture position 5 unités (à 7160 points par exemple).
    Si cours descend à 7120 points, alors ouverture 2ème position de 5 unités.
    Si cours remonte et RSI croise 70 à 7250 points alors fermeture immédiate des postions 1 + 2 à 7250 points.
    Exemple 3:
    Bougie X minutes ferme avec RSI < 30.
    Sur Bougie suivante ouverture position 5 unités (à 7160 points par exemple).
    Si cours descend à 7120 points, alors ouverture 2ème position de 5 unités.
    Si cours descend à 7080 points, alors ouverture 3ème position de 5 unités.
    Si cours remonte  RSI croise 70 à 7250 points alors fermeture immédiate des postions 1 + 2 + 3 à 7250 points.
    #187720 quote
    JC_Bywan
    Moderator
    Master

    Bonjour, sauf erreur que je ne vois pas (je veux bien un contre exemple graphique pour avoir une point de départ permettant de chercher l’erreur), le code proposé faisait toutes les ouvertures de position décrites, ainsi que le stop. La seule différence est la sortie, le code d’une stratégie automatique étant lu en fin de chaque bougie pour placer des ordres à éxécuter en ouverture de bougie suivante (hors éventuel slippage), le code envoie donc un ordre au marché en fin de bougie et non pas en cas de touchette 70 intra-bougie. On pourrait s’amuser à contourner la contrainte de fin de bougie en anticipant mathématiquement le niveau de cours nécessaire à un rsi à 70 et envoyer des pending orders en avance valable pendant une bougie à renouveler à chaque fois, mais ce serait beaucoup d’efforts pour pas grand chose car grande proba de se voir le pending order refusé par IG de toute façon à chaque fois que posé à moins de la distance minimale requise par IG, et donc rater la sortie.

    Ci-joint exemple pour Dax 5 minutes où les 5 et 6 janvier on a consécutivement un exemple 1 à 4 positions fermées en perte et un exemple 2 à 2 positions fermées en gain.

    Je remets le code avec les “graphonprice” rajoutés pour voir les niveaux et une modif de la ligne 61 à impact uniquement graphique (ne change pas le comportement des ordres par rapport au premier code):

    defparam CUMULATEORDERS=true
    //
    achat0=5
    //
    chute1=40
    achat1=5
    //
    chute2=80
    achat2=5
    //
    chute3=120
    achat3=5
    //
    chutestop=160
    //
    indi=RSI[14](close)
    //
    if indi crosses under 30 and startlevel=0 then
    startlevel=close
    IF NOT LongOnMarket THEN
    BUY achat0 CONTRACTS AT MARKET
    ENDIF
    endif
    
    if startlevel<>0 then
    level1=startlevel-chute1*pipsize
    level2=startlevel-chute2*pipsize
    level3=startlevel-chute3*pipsize
    stoplevel=startlevel-chutestop*pipsize
    
    if onmarket and countofposition<=achat0 then
    BUY achat1 CONTRACTS AT level1 limit
    BUY achat2 CONTRACTS AT level2 limit
    BUY achat3 CONTRACTS AT level3 limit
    elsif onmarket and countofposition<=achat0+achat1 then
    BUY achat2 CONTRACTS AT level2 limit
    BUY achat3 CONTRACTS AT level3 limit
    elsif onmarket and countofposition<=achat0+achat1+achat2 then
    BUY achat3 CONTRACTS AT level3 limit
    endif
    
    //Choisir si stop sur 4 positions, ou 3 sur 4
    SELL AT stoplevel STOP // A - 4 positions coupées
    
    //trois=achat1+achat2+achat3// B - 3 dernières sur 4 positions coupées
    //if countofposition>=trois then// B - 3 dernières sur 4 positions coupées
    //SELL trois CONTRACTS AT stoplevel STOP// B - 3 dernières sur 4 positions coupées
    //endif// B - 3 dernières sur 4 positions coupées
    
    endif
    
    
    IF  indi crosses under 30 and startlevel=0 THEN
    BUY achat0 CONTRACTS AT MARKET
    ENDIF
    
    If LongOnMarket AND indi crosses over 70 THEN
    SELL AT MARKET
    ENDIF
    
    if indi crosses over 70 or low<=startlevel-chutestop*pipsize then
    startlevel=0
    level1=0
    level2=0
    level3=0
    endif
    
    graphonprice startlevel as "premier in"
    graphonprice level1 as "chute 40"
    graphonprice level2 as "chute 80"
    graphonprice level3 as "chute 120"
    graphonprice stoplevel as "chutestop"
    PRCrsi30in4fois.png PRCrsi30in4fois.png
    #188304 quote
    jpm38
    Participant
    New

    Bonjour JC,

    Je ne suis pas revenu vers vous de suite car je voulais laisser tourner l’algo pour voir les résultats.

    Merci encore pour le code, ça fonctionne très bien et conforme à mon besoin.

    Cependant, l’algo a de moins bon résultats en phase de baisse. Pour cela je voudrai insérer un filtre dans le code qui empêche toutes ouvertures de positions en phase de baisse.

    Est-il possible de rajouter au code un blocage (ou non ouverture de positions) quand le cours ferme en dessous de la Moyenne mobile 50 sur unité de temps 1 heure ? (et inversement redémarre dès que le cours clôture au dessus de la Moyenne mobile 50 1H )

    Merci par avance.

    #188444 quote
    Nicolas
    Keymaster
    Master

    En utilisant le dernier code fournit par Noobywan, voici la version avec le filtre de la moyenne mobile 50 sur l’unité de temps H1:

    defparam CUMULATEORDERS=true
    timeframe(1 hour,updateonclose)
    filtre = close>average[50]
    
    timeframe(default)
    //
    achat0=5
    //
    chute1=40
    achat1=5
    //
    chute2=80
    achat2=5
    //
    chute3=120
    achat3=5
    //
    chutestop=160
    //
    indi=RSI[14](close)
    //
    if indi crosses under 30 and startlevel=0 and filtre then
    startlevel=close
    IF NOT LongOnMarket  THEN
    BUY achat0 CONTRACTS AT MARKET
    ENDIF
    endif
    
    if startlevel<>0 then
    level1=startlevel-chute1*pipsize
    level2=startlevel-chute2*pipsize
    level3=startlevel-chute3*pipsize
    stoplevel=startlevel-chutestop*pipsize
    
    if onmarket and countofposition<=achat0 then
    BUY achat1 CONTRACTS AT level1 limit
    BUY achat2 CONTRACTS AT level2 limit
    BUY achat3 CONTRACTS AT level3 limit
    elsif onmarket and countofposition<=achat0+achat1 then
    BUY achat2 CONTRACTS AT level2 limit
    BUY achat3 CONTRACTS AT level3 limit
    elsif onmarket and countofposition<=achat0+achat1+achat2 then
    BUY achat3 CONTRACTS AT level3 limit
    endif
    
    //Choisir si stop sur 4 positions, ou 3 sur 4
    SELL AT stoplevel STOP // A - 4 positions coupées
    
    //trois=achat1+achat2+achat3// B - 3 dernières sur 4 positions coupées
    //if countofposition>=trois then// B - 3 dernières sur 4 positions coupées
    //SELL trois CONTRACTS AT stoplevel STOP// B - 3 dernières sur 4 positions coupées
    //endif// B - 3 dernières sur 4 positions coupées
    
    endif
    
    
    IF  indi crosses under 30 and startlevel=0 THEN
    BUY achat0 CONTRACTS AT MARKET
    ENDIF
    
    If LongOnMarket AND indi crosses over 70 THEN
    SELL AT MARKET
    ENDIF
    
    if indi crosses over 70 or low<=startlevel-chutestop*pipsize then
    startlevel=0
    level1=0
    level2=0
    level3=0
    endif
    
    graphonprice startlevel as "premier in"
    graphonprice level1 as "chute 40"
    graphonprice level2 as "chute 80"
    graphonprice level3 as "chute 120"
    graphonprice stoplevel as "chutestop"

    Non testé!

    #188465 quote
    jpm38
    Participant
    New

    Bonjour Nicolas,

    Je vous remercie pour votre aide. En revanche, avec la ligne “filtre <span class=”crayon-o”>=</span> <span class=”crayon-st”>close</span><span class=”crayon-o”>></span><span class=”crayon-r”>average</span><span class=”crayon-o”>[</span><span class=”crayon-cn”>50</span><span class=”crayon-o”>]” cela ferme toutes les positions dès que le cours croise/atteint la MM50.</span>

    Mon souhait serait différent: Je voudrai que le système fonctionne (ouverture de positions) quand le cours est au dessus de MM50 H1, et inversement s’arrête (aucune ouverture de positions)  lorsque le cours est en dessous de MM50 H1, et cela sans incidence sur la fermeture de positions.

    Les positions se fermeront comme précédemment, lorsque le RSI touchera la zone 70.

    Cela revient à un ON/OFF pour les ouvertures de positions en dessous de MM50 H1 et garde les positions ouvertes précédemment.

    Merci par avance.

    #188668 quote
    JC_Bywan
    Moderator
    Master

    Bonjour, à tester:

    defparam CUMULATEORDERS=true
    timeframe(1 hour,updateonclose)
    filtre = close>average[50]
     
    timeframe(default)
    //
    achat0=5
    //
    chute1=40
    achat1=5
    //
    chute2=80
    achat2=5
    //
    chute3=120
    achat3=5
    //
    chutestop=160
    //
    indi=RSI[14](close)
    //
    if indi crosses under 30 and startlevel=0 then
    startlevel=close
    IF NOT LongOnMarket and filtre THEN
    BUY achat0 CONTRACTS AT MARKET
    ENDIF
    endif
    
    if startlevel<>0 then
    level1=startlevel-chute1*pipsize
    level2=startlevel-chute2*pipsize
    level3=startlevel-chute3*pipsize
    stoplevel=startlevel-chutestop*pipsize
    
    if filtre then
    if longonmarket and countofposition<=achat0 then
    BUY achat1 CONTRACTS AT level1 limit
    BUY achat2 CONTRACTS AT level2 limit
    BUY achat3 CONTRACTS AT level3 limit
    elsif longonmarket and countofposition<=achat0+achat1 then
    BUY achat2 CONTRACTS AT level2 limit
    BUY achat3 CONTRACTS AT level3 limit
    elsif longonmarket and countofposition<=achat0+achat1+achat2 then
    BUY achat3 CONTRACTS AT level3 limit
    endif
    endif
    
    if longonmarket then
    SELL AT stoplevel STOP
    endif
    endif
    
    If longOnMarket AND indi crosses over 70 THEN
    SELL AT MARKET
    ENDIF
    
    if indi crosses over 70 or low<=startlevel-chutestop*pipsize then
    startlevel=0
    level1=0
    level2=0
    level3=0
    endif
    
    graphonprice startlevel as "premier in"
    graphonprice level1 as "chute 40"
    graphonprice level2 as "chute 80"
    graphonprice level3 as "chute 120"
    graphonprice stoplevel as "chutestop"
    
    //graph startlevel as "premier in"
    //graph level1 as "chute 40"
    //graph level2 as "chute 80"
    //graph level3 as "chute 120"
    //graph stoplevel as "chutestop"
Viewing 10 posts - 1 through 10 (of 10 total)
  • You must be logged in to reply to this topic.

Aide pour création code Proorder avec RSI


ProOrder : Trading Automatique & Backtests

New Reply
Author
author-avatar
jpm380 @jpm380 Participant
Summary

This topic contains 9 replies,
has 4 voices, and was last updated by JC_Bywan
4 years ago.

Topic Details
Forum: ProOrder : Trading Automatique & Backtests
Language: French
Started: 01/28/2022
Status: Active
Attachments: 1 files
Logo Logo
Loading...