Bonjour,
Je reprends ma question d’ici:
https://www.prorealcode.com/topic/probleme-de-condition-avec-le-symbole-different/
Puisque j’ai identifié la cause et qui m’amène à une autre question…
… et c’est encore un TF.
Voici un code d’exemple:
defparam cumulateorders=false
timeAchat = TIME > 090000 AND TIME < 171500
indicator1 = Average[7](close)
indicator2 = Average[15](close)
ONCE iteration = 1
iterationMax = 1
if day<>day[1] OR intradaybarindex= 0 then //2 précautions !
iteration = 1 //reset
endif
CA1 = indicator1 CROSSES UNDER indicator2
IF timeAchat AND NOT ONMARKET AND CA1 AND iteration <= iterationMax THEN
iteration = iteration + 1
SELLSHORT 1 LOT AT MARKET
set target Pprofit 4
set stop ploss 2
ENDIF
Sur DAX en 10 secondes. On a bien une transaction par jour.
Voici le même code avec TF M1:
defparam cumulateorders=false
TIMEFRAME(1 minute)
timeAchat = TIME > 090000 AND TIME < 171500
indicator1 = Average[7](close)
indicator2 = Average[15](close)
ONCE iteration = 1
iterationMax = 1
if day<>day[1] OR intradaybarindex= 0 then //2 précautions !
iteration = 1 //reset
endif
CA1 = indicator1 CROSSES UNDER indicator2
IF timeAchat AND NOT ONMARKET AND CA1 AND iteration <= iterationMax THEN
iteration = iteration + 1
SELLSHORT 1 LOT AT MARKET
set target Pprofit 4
set stop ploss 2
ENDIF
Pourquoi as-t-on parfois plus de 10 transactions ?
D’ailleurs sur le code sans TF qui fonctionne, je note un bug car le système indique 2,11 ordres par jours: mais il n’y en a QUE 2.
D’où sort le “,11” ?
Merci de vos réponses. J’ai vraiment du mal avec le TF… on dirait qu’il remet le ONCE à zéro à chaque itération…
Pour le deuxième code, tu le lances dans quel TF ? Si tu veux qu’il fonctionne en TF 1-minute, et que le code ne comporte qu’une seule instruction TIMEFRAME, il est inutile de la déclarer. Il suffit simplement de lancer la stratégie dans le TF désiré qu’on choisit dans la liste déroulante des UT du graphique.
Oui il ne comporte pour l’instant qu’une instruction. C’est un TF M1 lancé sur du 10 sec.
évidemment je pourrais enlever le TF mais ce n’est pas la réponse… normalement je ne devrais pas avoir d’autres résultats que le même sans TF. C’est là le problème.
et je n’aborde pas le fait que les achats ventes sont totalement différentes dans d’autres test avec le meme type de tests 😉
Personne n’a de solution pour ce bug très gênant ?
Cette partie est une portion de code d’une stratégie qui bug. J’ai réussi à isoler le problème qui est le TF sans trouver de solution…
J’ai un peu de mal à suivre désolé .. 🙂
J’essai de comprendre pourquoi le comportement est différent, la variable “iteration” ne devrait pas se reset à 1 dés qu’un ordre est passé (voir image jointe), je vais me renseigner.
Par ailleurs cette version du code fonctionne: (utilisation de timeframe(default)) :
defparam cumulateorders=false
defparam preloadbars=0
TIMEFRAME(1 minute)
timeAchat = TIME > 090000 AND TIME < 171500
indicator1 = Average[7](close)
indicator2 = Average[15](close)
//ONCE iteration = 1
iterationMax = 1
CA1 = indicator1 CROSSES UNDER indicator2
timeframe(default)
if day<>day[1] OR intradaybarindex= 0 then //2 précautions !
iteration = 1 //reset
endif
IF timeAchat AND NOT ONMARKET AND CA1 AND iteration <= iterationMax THEN
iteration = iteration + 1
SELLSHORT 1 LOT AT MARKET
set target Pprofit 4
set stop ploss 2
ENDIF
graph iteration
graph day<>day[1] OR intradaybarindex= 0 coloured(255,0,0)
defparam cumulateorders=false
defparam preloadbars=0
TIMEFRAME(1 minute)
timeAchat = TIME > 090000 AND TIME < 171500
indicator1 = Average[7](close)
indicator2 = Average[15](close)
//ONCE iteration = 1
iterationMax = 1
CA1 = indicator1 CROSSES UNDER indicator2
if day<>day[1] OR intradaybarindex= 0 then //2 précautions !
iteration = 1 //reset
endif
IF timeAchat AND NOT ONMARKET AND CA1 AND iteration <= iterationMax THEN
iteration = iteration + 1
SELLSHORT 1 LOT AT MARKET
set target Pprofit 4
set stop ploss 2
ENDIF
graph iteration
//graph day<>day[1] OR intradaybarindex= 0 coloured(255,0,0)
Merci Nicolas,
oui je me doute que c’est bizarre et sur le multi TF je te raconte pas les écarts que j’ai pu observer.
ca fait un moment que je tourne en rond sans avoir identifié le bug mais avec ce code très simple, on s’en rend mieux compte.
j’attends ton retour.
Non, en fait ça n’est pas un bug, mais le fonctionnement normal d’une variable dans PRT. J’aurai du identifier cela dés le début ^^ 🙄
En effet, sur la bougie courante, les valeurs de variable ne sont pas historisées. Ici, les valeurs calculées dans la bougie M1 ne seront pas fixées tant que la bougie n’est pas clôturée, donc ta variable “iteration” ne s’incrémentera qu’une seule fois à la lecture du code (à la fin de la bougie du TF sur lequel tu as lancé le programme), puis se resettera.
Il faut bien intégrer que : à chaque tick reçu, dans la bougie courante, les variables sont réinitialisées.
Donc avec un code TF M1 et TF 10sec ; les variables dans le TF M1 (sans updateonclose), sont réinitialisées 6 fois (6 x 10 = 60 sec = 1 minute).
Il y a 2 solutions:
- les calculs sont faits dans le TF default (comme dans la version “correct” que j’ai posté dans le précédent message)
- soit tu utilises des variables de type array, puisque celles-ci ne sont pas ré-initialiser dans la barre courante
Alors, honnêtement, je crois que je vrai prendre un dafalgan pour la tête 😉
non pas que ton explication ne soit pas compréhensible, mais c’est tellement bourré (j’ai l’impression) de subtilité que pour un néophyte comme moi, c’est ces concepts sont difficiles à appréhender.
J’ai bien remarqué une réinitialisation des variables puisqu’à chaque fois que iteration passait à 1, à la bougie suivante ça repassait à zéro.
Ce qui pourrait être utile (mais ça existe peut-être déjà), c’est un post explicatif en deux parties par ex:
– Ce qui est exécuté pendant la création d’une bougie c-a-d entre le open et le close (lecture du close en cours, opération mathématique à chaque tick…)
– Ce qui est exécuté à l’open de la bougie suivante (les achats, les ventes, donc les mises à jours des variables…)
Et pour finir donc quand tu dis: “chaque tick reçu, dans la bougie courante, les variables sont réinitialisées.” ça veut dire que le ONCE est exécuté à chaque fois ?
Un bête exemple avec un indicateur :
if close > last then
count=count+1
last = close
endif
return count
Si le prix en cours est supérieur au dernier prix enregistré dans la variable “last” alors on incrémente “count”. En live, si tu observes la bougie courante, tu verras que “count” ne s’incrémente pas. Puisque à chaque fois que le code est lu dans la bougie, tout est remis à zéro et c’est ce qui se passe exactement de la même façon dans ta stratégie.
Ok, je vais regarder cela et voir du côté des array comme tu me conseils.
Merci de tes précieuses réponses.