Bonsoir,
Je test une stratégie et je veux qu’elle ne se lance qu’une fois par jour.
Alors oui il y a notamment:
https://www.prorealcode.com/topic/code-une-question/
Mais je veux pouvoir tester 2 fois par jour, 3 fois par jour etc…
...
ONCE iteration = 1
iterationMax = 2
ONCE jour = dayofweek
...
IF jour <> dayofweek THEN
iteration = 1
jour = dayofweek
ENDIF
...
IF timeAchat AND NOT ONMARKET AND ... AND iteration <= iterationMax THEN
SELLSHORT 3 LOT AT MARKET
set stop ploss 3
iteration = iteration + 1
ENDIF
GRAPH iteration
GRAPH jour
GRAPH dayofweek
Pour plus de clarté je n’ai pas mis mon script en entier juste ce qui pause problème.
Les GRAPH sont correct mais si je mets:
IF jour <> dayofweek THEN
iteration = 0
jour = dayofweek
ENDIF
C’est à dire “0” pour iteration à chaque changement de journée, en fait le GRAPH m’indique qu’il est à 0 tout le temps…
Dans l’exemple, iteration passe bien à 2 lors d’un achat, mais juste pour 1 bougie. Il revient aussitôt à 1 et donc, la condition ” iteration <= iterationMax” est à nouveau vrai alors qu’elle devrait être fausse jusqu’à 23h59.
Vous l’avez compris, l’objectif est de pouvoir changer “interationMax” comme je veux afin d’avoir autant d’achat que je veux.
Une idée svp ?
Tu n’as pas supprimé “ONCE iteration = 1″ en tête de ton code peut être ?
Mais le ONCE n’est effectué qu’une seule fois non ?
ou à chaque chargement du code ?
je croyais que c’était valable que pour le premier lancement du script et que pour les bougies suivantes ce n’était pas exécuté.
OLGParticipant
Junior
Si j’ai bien compris tu veux que ton système ne place qu’un seul ordre par jour ?
Si c’est ca alors tu peux simplifier ton code :
ONCE jour = 100 //utile uniquement pour que le jour où tu le lances il s'execute une fois
IF timeAchat AND NOT ONMARKET AND ... AND jour <> dayofweek THEN
jour = dayofweek
SELLSHORT 3 LOT AT MARKET
set stop ploss 3
ENDIF
GRAPH jour
GRAPH dayofweek
Et pour répondre à ta question, oui le code ONCE n’est exécuté qu’a la première itération de chaque lancement (si tu arrêtes et relances il se ré execute une fois)
oui je veux 1 ordre par jour, OU 2 ordres par jours, OU 3…
d’où la variable « iteration ».
Le ONCE n’est bien exécuté qu’à la toute première bougie ?
et ensuite il devrait être égale 2 tous le temps sauf en cas de changement de journée ? J’ai l’impression que le symbole « <> » ne fonctionne pas en fait.
OLGParticipant
Junior
Ok je n’avais pas compris, ton code me semble bon après une rapide itération de tête (même si pas optimisé), ce qui me fait dire que l’erreur vient du code que tu as supprimé pour plus de clarté.
Pour être le plus clair possible, le ONCE est exécuté à la première itération de ton code. Ton code est itéré (exécuté) à chaque clôture de bougie. Et ce sur l’historique que tu as sélectionné dans le cas d’un BackTest ou d’un indicateur.
ONCE est en effet utilisé qu’une seule fois à la première lecture du code (1ère bougie). J’ai fait la remarque car je ne savais pas si le problème était à la première itération ou sur toutes les autres également ? Comme le stipule OLG, il y a sans doute autre chose à creuser dans le code complet ?
DayOfWeek = tu devrais remplacer avec OpenDayOfWeek.
Pour le reset de variables au début d’une journée, j’ai l’habitude d’utiliser plutôt ceci :
if day<>day[1] OR intradaybarindex= 0 then //2 précautions !
var = 0 //reset
endif
Merci de vos réponses.
Je confirme que le problème vient, pour une raison que j’ignore, de:
IF jour <> dayofweek THEN
iteration = 1
jour = dayofweek
ENDIF
Car si je mets:
IF jour <> dayofweek THEN
iteration = 2
jour = dayofweek
ENDIF
Alors le graph me mets en 2 à après chaque fin de position.
ET:
Le problème est résolu en adoptant ta solution, Nicolas. Ce code fonctionne parfaitement, en remplacement du mien, sans rien toucher d’autre.
if day<>day[1] OR intradaybarindex= 0 then //2 précautions !
iteration = 1 //reset
endif
A croire que <> ne fonctionne pas et que le contenu est exécuté à chaque bougie. Pourtant graph bougie est bien différent de graph DayOfWeek.
Enfin bon c’est résolu, merci 😉
Si tu GRAPH dayofweek, tu y verras peut être plus clair. As-tu essayé OpenDayOfWeek, comme je te le faisait remarquer plus haut ?