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.
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
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.
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…
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"
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.
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é!
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.
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"