Bonjour,
Je souhaite savoir si PRC peut se souvenir d’une variable d’une itération à l’autre (d’une bougie à l’autre).
Voici ce que je fais :
defparam preloadbars=10000
if barindex>=10000 then
for i=1 to 10000
if condition then
count=count+1
endif
next
endif
Le temps de calcul est extrêmement long car à chaque barre je refais des calculs déjà fait avant, et je souhaite raccourcir en faisant :
defparam preloadbars=10000
//calcul du count pour les 10 000 barres préchargées
if barindex=10000 then
for i=1 to 10000
if condition then
count=count+1
endif
next
endif
//mise à jour de la valeur de count au fur et à mesure du backtest
if barindex>10000 then
if condition then
count=count+1
endif
endif
Est ce que de cette façon, PRC peut retenir la valeur de “count” et l’actualiser ?
L’avantage est aussi que ça me permet d’avoir un historique plus long pour le calcul de count.
Merci d’avance pour votre aide.
Pourquoi ne pas faire une somme des booléens avec SUMMATION, pour éviter les boucles :
count = summation[10000](condition)
La variable count se remplira à chaque nouvelle bougie d’une nouvelle valeur et tu pourras donc accéder à toutes ses valeurs passés avec un offset entre crochet, exemple le count d’il y a 10 barres auparavant :
var = count[10]
Merci beaucoup pour ta réponse Nicolas.
J’ai volontairement simplifié le code pour plus de clarté.
Ma condition ressemble en réalité à ça :
defparam preloadbars=10000
if barindex>=10000 then
for i=1 to 10000
if open[i-1-x]/open[i-1]-1>0 then
count=count+1
endif
next
endif
Je cherche à calculer la performance en t+x d’une condition réalisée en t
En gros je fais des calculs forward dans le passé, et je pense que la fonction summation est insuffisante dans ce cas, à moins que je me trompe ?
Est-ce qu’il y a une raison particulière pour faire le test en avant ? et pourquoi pas l’inverse ? Tu cherches à connaître le futur pour recalculer le passé ou non ?
Tu as raison , il faut que j’inverse…et avec des summation ça devrait être bon
Mon cerveau était bloqué sur ma manière de faire
Je teste ça !
Merci beaucoup
Bon en fait je bloque encore, il y a un problème de temps.
Je vais préciser :
Je souhaite regarder si ma condition dans le passé s’est avérée rentable en ayant pris position et en étant resté dans le marché pendant x barres.
L’idée est d’ignorer cette condition si elle n’est pas assez rentable.
defparam preloadbars=10000
condition=close>close[10]
x=5 // nb de barres ou je reste en position
if barindex>=10000 then
compteurOccurences=summation[10000](condition)
compteurTradesRentables=compteurOccurences[x] .......
Et là je retrouve mon problème de calcul de performance en forward.
En résumé tu veux savoir si lorsque tu détectes ‘condition’, en rentrant au marché et en sortant 5 barres plus loin, cela est rentable ? Si oui, uniquement sur la dernière occurrence ou sur toutes celles rencontrées en faisant une moyenne ?
Oui c’est ça.
Sur toutes celles rencontrées, en comptant le nombre de trades gagnant et de trades perdant.
Ok, mais alors je ne comprends pas pourquoi tu veux faire une boucle dans le passé pour connaître ces résultats, puisque tu ne peux plus y intervenir … dans le passé 🙂
Bref, si on comptabilise les résultats tout en laissant passer le temps, on peut y arriver :
condition=close>close[10]
x=5 // nb de barres ou je reste en position
if condition and barindex-startbar>x then //si condition et aucun ordre en cours
startbar=barindex
startprice=close
endif
if barindex-startbar=x then //gain ou perte après X bar
if close>startprice then
gain=gain+1 //gagné !
else
perte=perte+1 //perdu :(
endif
endif
return gain coloured(0,255,0), perte coloured(255,0,0)
Je pense que c’est l’idée, à tester en tant qu’indicateur pour voir si j’ai bien compris.
Merci je vais regarder et tester ça !