Bonjour,
Je viens demander de l’aide car je ne comprends pas le comportement de ProBacktest dans le cas suivant :
J’effectue un simple achat à l’aide du code ci-après (stoppé aussitôt juste pour vérifier la fiabilité des signaux d’entrée). Achat dès que le signal de l’indicateur appelé passe à 1 (0 le reste du temps).
DEFPARAM Preloadbars = 2000
TLup, ignored, ignored = CALL "TrendLine Signal PRT"
IF not longonmarket AND TLup THEN
Buy 1 shares at market
SET STOP pLOSS 1
SET TARGET pPROFIT 1
ENDIF
Voici le code de l’indicateur appelé (trouvé à cet endroit sur le forum https://www.prorealcode.com/prorealtime-indicators/stair-step-moving-average/) :
once ssMA = close
MA = Average[200](close)
step = 10
if(MA > ssMA + step) THEN
ssMA = MA
tl = MA
ELSIF (MA < ssMA - step) THEN
ssMA = MA
tl = MA
ELSE
ssMA = ssMA
ENDIF
// Permet de connaître le sens de la tendance puisque ssMA sera égal au précédent la plupart du temps (tl ne prend en compte que le point de changement)
achat = tl > tl[1]
vente = tl < tl[1]
return achat, vente, ssMA
Le but ici étant d’acheter au marché dès que le signal d’achat passe à 1.
En pièce jointe l’exemple du Backtest qui montre clairement que les signaux ne sont pas pris au moment où le signal est envoyé (indicateur du signal d’achat en bas du graphique en histogramme vert et correspondant au code de l’indicateur ci-dessus). Il semble que le signal soit pris systématiquement avant… Il ne semble pas y avoir de période définie entre l’entrée probacktest et le signal émis non plus…
Ceci est une “Proof Of Concept” avec un code simple afin d’identifier le problème que je retrouve sur un plus gros algo…
J’ai bien sûr essayé différentes choses avant de poster ici mais rien ne fonctionne… J’imagine que le problème vient certainement de l’interface chaise-clavier… Si tel n’est pas le cas peut être est-ce un bug connu ou non ? Ou peut être une impossibilité de faire certaine chose ?
Merci d’avance pour l’aide qui me sera apporté. J’ai hâte de savoir ce qu’il en est…
Pour débugger une variable, faire un GRAPH, soit :
GRAPH TLup
La valeur du CALL est elle bien la même que celle de l’indicateur sur le graphique ?
En effet cette fonction va me faciliter la tâche. Merci pour votre réponse et votre réactivité.
Du coup, les signaux respectent en effet bien le “GRAPH” donc pas d’erreur à ce niveau. En revanche, pourquoi la ligne sur le GRAPH ne correspond pas à celle de l’indicateur ?
Je pense que la réponse vient du fait que l’on prend la première fois le close puis ensuite l’indicateur calcule les valeurs suivantes à partir de là, donc il semble que la première valeur soit différente si appelé dans ProBacktest ou ProBuilder. En effet, ProBuilder prend la première valeur de l’historique affiché, mais quelle valeur prend ProBacktest ?
Dans tous les cas, ceci n’est pas la bonne façon de calculer cette indicateur… Mais comment alors fiabiliser cet indicateur (https://www.prorealcode.com/prorealtime-indicators/stair-step-moving-average/) pour que le GRAPH et l’indicateur affiché sur le graphique correspondent ?
Tu peux essayer avec un preloadbars=0. Mais le principal reste le fait que l’indicateur soit bien calculé et que les signaux soient corrects vis à vis de celui-ci. Comme tu le remarques, ces valeurs en escalier sont issues d’un écart entre chaque marche, donc la valeur de cette moyenne mobile sera différente selon là où débute l’historique, un peu comme un graphique renko.
Oui en effet un preloadbars=0 fonctionne. Oui c’est ça… Je vais tout de même réfléchir à un moyen de commencer tout le temps au même moment sinon selon l’endroit où débute l’historique les signaux de trading seront différents, ce qui n’est pas l’idéal pour une stratégie automatique… Peut être preload suffisamment d’historique et faire commencer l’indicateur sur un signal caractéristique évident, je sais pas je vais voir mais en tout cas merci beaucoup pour ces réponses.
Cependant, on peut voir avec les 2 images jointes qu’il existe malgré tout une divergence de calcul. En effet, avec un preload à 0 l’indicateur et le tracé de son “graph” sont identique au départ, comme il se doit, mais diverge ensuite… Comment expliquer cela ? (je note ici une belle divergence sur le passage du 1er mai au 4 mai -visible sur la 2e image jointe- / on semble également dévier peu à peu dans la journée du 27 avril…)
Avec
GRAPHONPRICE TLup
l’indicateur sera aussi tracé sur le graphique et te permettra de mieux cerner où se trouve la divergence, à quel moment elle démarre.
En effet très pratique merci. Je vais lire toute la doc ProBacktest ce WE.
En revanche, ces décorrélations me paraissent anormal… Pour l’instant ce n’est bien sûr qu’un prémisse, mais je souhaite comprendre car il me sera impossible de faire confiance à un algo automatique ensuite dont les signaux ne correspondent pas…
Par exemple, avec un preload à 0 les 2 signaux ne commencent pas au même endroit (cf. Preload_NOK.png), l’indicateur en vert prend bien le close alors que le même indicateur appelé dans ProBacktest avec le call n’a pas la même valeur (nous appellerons ce dernier graph par la suite pour plus de simplicité). Après tests, il semblerait que l’indicateur graph prenne le close précédent… Est-ce un bug ou est-ce voulu ?
Ensuite en mettant une valeur de départ plutôt que le close l’indicateur et le graph sont bien corrélés au départ cette fois, mais diverge ensuite : souvent la décorrélation se produit le weekend, donc entre un vendredi et un lundi (cf. Decalage_WE.png), ou de manière plus aléatoire (et plus infime mais tout de même divergeant sans raison apparente…) comme le montre la dernière image (cf. Decorrelation.png). Auriez-vous une explication à cela ?
Pour info, mettre directement le code de l’indicateur dans ProBacktest sans passer par la fonction call produit le même résultat… Ce qui signifierait que, si bug il y a, il ne viendrait pas de la function mais du module ProBacktest.
Re-post première image qui ne s’est pas chargé…
Je pense que ton problème vient du fait que tu n’affiches pas les données du weekend, est-ce bien le cas ?
En effet, c’est bien le cas. Grand merci pour votre aide c’est parfait.
Dernière question avant de clore le sujet, je lis dans la doc : “Les données du week-end sont toujours prises en compte pour les backtests.” dois-je en conclure qu’il n’est pas possible d’appliquer un indicateur uniquement sur certains horaires ou en excluant les données du week-end ? Aucune option n’est prévue pour ça ?
Ne pas inclure les données du week end c’est purement visuel. ProOrder ne trade que les vrais données du marché et pas celles qu’on modifie visuellement.