Comportement DAY et DATE en ProOrder

Forums ProRealTime forum Français Support ProOrder Comportement DAY et DATE en ProOrder

Viewing 9 posts - 1 through 9 (of 9 total)
  • #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= 600
    Longueur= 900 // taille du tableau utilisé
    FOR i=0 TO Longueur DO  // initialisation du tableau
    $Tableau[i]=0
    NEXT
    y=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
    ENDIF
    ELSIF COUNTOFPOSITION=0 AND $Tableau[Longueur]=0 THEN // on prend pas de position
    ENDIF
    ELSIF $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
    //********************************************************************************************
    #240817

    J’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= 500

    Longueur= 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
    ENDIF

    ELSIF COUNTOFPOSITION=0 AND $Tableau[Longueur]=0 THEN // no position
    ENDIF

    ELSIF $Tableau[Longueur] <> $Tableau[Longueur-1] THEN // changement
    SELL AT MARKET // solde tous les LONG
    EXITSHORT AT MARKET // solde tous les SHORT

    IF $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
    ENDIF

    ENDIF

     

     

    #240884

    Bonjour,

    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. 😊

    #240915

    Merci 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

     

     

     

     

     

    #240944

    Bonjour,

     

    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

     

    #240949

    1. 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:

    1 user thanked author for this post.
    #240950

    Merci 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

    #240957

    Cet extrait de code modifié signalera à la fois le début et la fin du backtest.

    2 users thanked author for this post.
    #240958

    Thank you veru much Roberto

    1 user thanked author for this post.
Viewing 9 posts - 1 through 9 (of 9 total)

Create your free account now and post your request to benefit from the help of the community
Register or Login