Comportement DAY et DATE en ProOrder
Forums › ProRealTime forum Français › Support ProOrder › Comportement DAY et DATE en ProOrder
- This topic has 8 replies, 3 voices, and was last updated 6 days ago by PROPRO.
-
-
11/27/2024 at 5:20 PM #240811
Bonjour,
Je n’arrive pas à comprendre le comportement des instructions DAY et DATE en ProOrder.
Ci-dessous un petit code illustrant le problème. Je défini DEFPARAM preloadbars au début et j’utilise dans le code un tableau d’une taille donnée. La logique que j’ai mise pour exemple consiste à mettre des 1 et -1 dans les deux dernières cases du tableau en fonction de la parité du chiffre du jour (DAY). Ainsi, pour chacun des jours de la période d’exécution définie dans ProOrder, le code va regarder le n° du jour dans le mois et mettre des 1 et -1 (ou l’inverse selon la parité du n° de jour) dans les 2 dernières cases du tableau (indice Max et indice Max-1).
Un logique de passage d’ordre ACHAT/VENTE lit ensuite les 2 dernières cases du tableau et génère un ordre d’ACHAT ou de VENTE selon la parité du chiffre du jour.
Problème : si on défini une valeur de Preloadbars inférieure à la taille du tableau, la logique de swap ACHAT/VENTE ne commencera dans la période ProOrder qu’après un nombre de jours égal à (Longueur du tableau) – (valeur de PreLoadBars). Par exemple, si PreloadBars = 500 et longueur du tableau = 900, la logique ne s’exécutera correctement que 400 jours après le début de la période ProOrders. Sur les 400 premiers jours, la détection de la parité du chiffre du jour ne s’opère visiblement pas.
Je n’arrive pas à comprendre comment ca fonctionne sachant que je n’ai pas ce problème en probackTest .. bien que ce ne soit pas vraiment comparable puisqu’il n’y a pas de PreloadBars en ProBackTest.
Si quelqu’un peut m’éclairer sur l’explication de ce phénomène ?
Un grand merci par avance
Exemple de code à appliquer sur une Action en unité ‘jour’ sur début= 8 avril 2020 fin= 10 avril 2024 par exemple. Capital virtuel de 10 000 $ par exemple.
//**************************** LOGIQUE **********************************************
DEFPARAM CUMULATEORDERS= true
DEFPARAM PRELOADBARS= 600Longueur= 900 // taille du tableau utilisé
FOR i=0 TO Longueur DO // initialisation du tableau
$Tableau[i]=0
NEXTy=DAY[Longueur]
IF ROUND(y/2+0.1)*2 <> y THEN // si DAY renvoie un jour IMPAIR
$Tableau[Longueur]=-1
$Tableau[Longueur-1]=1
ELSIF ROUND(y/2+0.1)*2 = y THEN // si DAY renvoie un jour PAIR
$Tableau[Longueur]=1
$Tableau[Longueur-1]=-1
ENDIF//************************ LOGIQUE ORDRES MARCHE **************************************
IF $Tableau[Longueur] = $Tableau[Longueur-1] THEN // position conervée
IF COUNTOFPOSITION=0 AND $Tableau[Longueur]<>0 THEN // 1ere prise de position
IF $Tableau[Longueur] = 1 THEN // ordre ACHAT
BUY 1 SHARES AT MARKET
ELSIF $Tableau[Longueur] = -1 THEN // ordre VENTE
SELLSHORT 1 SHARES AT MARKET
ENDIFELSIF COUNTOFPOSITION=0 AND $Tableau[Longueur]=0 THEN // on prend pas de position
ENDIFELSIF $Tableau[Longueur] <> $Tableau[Longueur-1] THEN // inversion position
SELL AT MARKET // solde tous les LONG
EXITSHORT AT MARKET // solde tous les SHORT
IF $Tableau[Longueur] = 1 THEN // ordre ACHAT
BUY 1 SHARES AT MARKET
ELSIF $Tableau[Longueur] = -1 THEN // ordre VENTE
SELLSHORT 1 SHARES AT MARKET
ELSIF $Tableau[Longueur] = 0 THEN // on reste sans position
ENDIF
ENDIF
//********************************************************************************************11/27/2024 at 7:04 PM #240817J’en profite pour fournir un code dont la logique est basée sur le sens de la moyenne des 2 derniers jours : ca marche c’est à dire que la logique s’exécute bien sur la totalité de la période définie pour ProOrder, et donc les positions Achat/Vente et la courbe de gain s’affichent bien sur la totalité de la période même si on met une valeur de PreLoadBars inférieure à la longueur du tableau utilisé dans la logique.
C’est incompréhensible !
/******************************************************************************************************
DEFPARAM CUMULATEORDERS= true
DEFPARAM PRELOADBARS= 500Longueur= 1100 // longueur des tableaux
//*********************** CREATION TABLEAUX **************
//**********************************************************************
FOR i=0 TO Longueur DO
$Moyenne[i]=0
$Tableau[i]=0
NEXT//******* CHARGEMENT $CourbeClose avec la courbe de l’instrument ********
FOR i=0 TO (Longueur) DO
$CourbeClose[i]=Close[Longueur-i]
NEXT//********************** ALGORITHME ************************
$Moyenne[0]=$CourbeClose[0]
FOR i=1 TO Longueur DO
$Moyenne[i]= ($CourbeClose[i] + $CourbeClose[i-1]) /2
NEXT$Tableau[0]= 1
FOR i=1 TO Longueur DO
IF ($Moyenne[i] – $Moyenne[i-1]) > 0 THEN
$Tableau[i]= 1
$Tableau[i-1]=-1
ELSIF ($Moyenne[i] – $Moyenne[i-1]) <=0 THEN
$Tableau[i]= -1
$Tableau[i-1]=1
ENDIF
NEXT//********************* PASSAGE D’ORDRES **********************
//*******************************************************************IF $Tableau[Longueur] = $Tableau[Longueur-1] THEN
IF COUNTOFPOSITION=0 AND $Tableau[Longueur]<>0 THEN
IF $Tableau[Longueur] = 1 THEN // ACHAT
BUY 1 SHARES AT MARKET
ELSIF $Tableau[Longueur] = -1 THEN // VENTE
SELLSHORT 1 SHARES AT MARKET
ENDIFELSIF COUNTOFPOSITION=0 AND $Tableau[Longueur]=0 THEN // no position
ENDIFELSIF $Tableau[Longueur] <> $Tableau[Longueur-1] THEN // changement
SELL AT MARKET // solde tous les LONG
EXITSHORT AT MARKET // solde tous les SHORTIF $Tableau[Longueur] = 1 THEN // ACHAT
BUY 1 SHARES AT MARKET
ELSIF $Tableau[Longueur] = -1 THEN // VENTE
SELLSHORT 1 SHARES AT MARKET
ELSIF $Tableau[Longueur] = 0 THEN // OUT OF MARKET
ENDIFENDIF
11/29/2024 at 11:54 AM #240884Bonjour,
J’espère avoir bien compris ta question et je te remercie pour les détails fournis. Je vais tenter d’apporter une explication claire au phénomène que tu as décrit.
ProBacktest et DEFPARAM PRELOADBARS
Dans ProBacktest, il est possible de définir la quantité de barres historiques chargées avant l’exécution du code grâce à l’instruction DEFPARAM PRELOADBARS. Cela permet de s’assurer que toutes les données nécessaires sont disponibles pour initialiser correctement les variables ou les structures de données comme ton tableau (Longueur = 900 dans ton exemple).Cependant, si la valeur de PreloadBars est inférieure à la taille du tableau (par exemple, PreloadBars = 600), cela peut provoquer un problème lors de l’initialisation des dernières positions du tableau pendant les premiers jours de l’exécution. En conséquence, les calculs basés sur ces données (comme la parité des jours) ne seront pas corrects jusqu’à ce que suffisamment de barres aient été accumulées.
ProBuilder (Indicateurs)
Dans le module ProBuilder, utilisé pour créer des indicateurs, il n’existe pas d’instruction équivalente à DEFPARAM PRELOADBARS. Les indicateurs fonctionnent en temps réel en utilisant directement les données du graphique actif, sans avoir besoin de charger explicitement des barres historiques. C’est pour cette raison que ce problème n’apparaît pas lors de la construction d’indicateurs.J’espère que cette réponse éclaire le comportement que tu observes. N’hésite pas à poser d’autres questions si des points restent flous. 😊
11/29/2024 at 4:16 PM #240915Merci Ivan et Merci pour ta proposition de poursuivre mes questions car cela fait quelques semaines que j’essaie de comprendre le phénomène, sans succès. Ce n’est pas facile de faire des tests en ProBackTest car on n’a pas la main sur l’affichage.
Afin de procéder par étapes, pourrais-tu STP insérer tes réponses aux quelques questions ci-dessous ?– le code qu’on lance sur une période donnée (date début / date fin) s’exécute t’il bien en entier pour chaque barre depuis ‘date de début’ jusqu’à ‘date de fin’, donc de la gauche vers la droite ? Si c’est bien cela (ce que j’ai compris), à chaque exécution du code sur une barre, l’indice de la barre ou se fait l’exécution est-il bien systématiquement [0] ?
– la quantité de barres chargées grâce à DEFPARAM a lieu avant chaque exécution de barre (dans ce cas, le code dispose de ‘preloadbars’ d’historique de barres pour chaque exécution d’une barre) ou a t’elle lieu une seule fois au lancement du programme proBackTest ? dans ce dernier cas le nombre de jours de PreLoadBars comptent à partir d’où (de quelle date par rapport a date de début ou date de fin) ?
– la doc PRT dit que PreloadBars correspond au nombre de jours d’historique nécessaires pour que les indicateurs soient stables : j’avais interprété que,
1) ca ne concernait que les indicateurs fournis par PRT (ex : average) et pas les indicateurs qu’on code soit-même ??
2) on parlait des jours nécessaires à la constitution/stabilité de l’indicateur mais pas du nombre total de jours d’historique (ce que tu m’indiques) ??– normalement, les tableaux qui sont des structures de données définies par l’utilisateur sont indépendantes de la taille de l’historique de données ? par contre j’imagine qu’il faut faire attention lorsqu’on charge la structure d’un tableau avec des data, à ce que les data existent bien dans l’historique (valeur de preloadbars ..) ?
Un grand Merci par avance de ton aide
11/30/2024 at 5:50 PM #240944Bonjour,
Je pense avoir compris comment fonctionne les choses et donc ce qui posait probleme dans mes programmes proorders. Je reste néanmoins très intéressé par tes réponses à mes questions d’hier .. et je me permets si tu es OK 2 questions complémentaires :
- comment peut on connaître la valeur de Preloadbars dans le programme sans devoir la dupliquer manuellement dans une variable après le DEFPARAM Preloabars ?
- comment peut on obtenir dans un programme la date (jour, heure, mn) du début et de la fin de période définie au lancement de Probactest sans devoir la dupliquer manuellement en variable dans le code ?
Un grand Merci par avance
12/01/2024 at 4:08 PM #2409491. DEFPARAM PRELOADBARS est défini par défaut sur 2000 barres. Si vous choisissez un nombre différent, vous savez combien il y en a.
2. Vous savez quand le backtest se termine. Pour savoir quand il démarre, vous pouvez utiliser cet extrait:
1234IF BarIndex = 0 THENmyDate = OpenDatemyTime = OpenTimeENDIF1 user thanked author for this post.
12/01/2024 at 4:33 PM #240950Merci Roberto. En fait j’aurais besoin d’utiliser la valeur de PreloadBars dans mon code, si possible ‘automatiquement’, cad sans avoir à définir dans le code une variable ayant le meme nombre que preloadbars.
Idem pour la date de fin et de début : j’aurais besoin de connaître ‘automatiquement’ dans l’exécution de mon ProBackTest la date/heure de la 1ere barre et la date/heure de la dernière barre, sans avoir à les définir dans des variables. Le code que tu suggères permet de connaître la date/heure de la 1ere barre lors de l’itération de la 1ere barre mais est-ce que la valeur d’une variable est conservée d’une itération de barre à l’autre tant qu’on ne change pas la valeur de cette variable en proBackTest/ProOrder: autrement dit est-ce que ‘myDate’ et ‘myTime’ conservent leur valeur lorsque le code s’exécute sur la 2eme barre, la 3eme barre etc ?
Merci par avance
12/01/2024 at 9:54 PM #24095712/01/2024 at 11:22 PM #240958Thank you veru much Roberto
1 user thanked author for this post.
-
AuthorPosts
Find exclusive trading pro-tools on