Problématiques de codage
Forums › ProRealTime forum Français › Discussions générales sur le Trading › Problématiques de codage
- This topic has 14 replies, 3 voices, and was last updated 10 months ago by davidguerreir.
-
-
02/02/2024 at 9:05 PM #227344
Bonjour la communauté PRC,
J’essaie de créer une fonction qui lorsque un évènements A se produit, alors la variable COO prend la valeur que la variable CO possède à ce moment précis (pour garder la donnée en mémoire)
Problème : en écrivant COO=CO, au lieu de donner la valeur de CO à COO, il enregistre que COO sera toujours équivalent à CO
En cherchant dans les connecteurs logiques proposés par PRT je n’arrive pas à trouver un moyen de faire passer les valeurs d’une variable à une autre…
J’en appel aux vétérans de la grande guerre du code!Ensemble nous vaincrons les machines et surmonterons toutes les courbes !
Merci par avance 🙂
02/03/2024 at 9:18 AM #227349Bonjour
ma proposition est d’introduire un test logique
if (evenement est VRAI) then
COO = CO
Endif
La variable COO ne sera ainsi réactualisé que lors du passage à vrai
Si l’évènement se reproduit et que vous ne voulez faire l’actualisation que sur la première occurence alors il faut specififier que c’est la première occurence de la série
if (evenement est VRAI) and (evenement[1] est Faux) then
COO = CO
Endif
J’espère avoir pu vous aider
Bonnes stratégies et bons trades à tous
1 user thanked author for this post.
02/04/2024 at 10:29 AM #227373Bonjour Pbourse et merci pour ta réponse,
Le problème de mon cas de figure c’est que si je met une égalité avec deux variables ex: “CO = COO”, au lieu de comprendre Valeur de “CO = Valeur de COO”, le logiciel à l’air de comprendre littéralement “Variable CO = Variable COO”
Il n’y a pas de configuration du style CO = Value COO ou bien des symboles pour isoler la valeur de la variable et non la variable comme CO = |COO] par exemple ?
Ce que je voudrais faire c’est prendre la valeur d’une variable au moment de son déclenchement et me servir de cette donnée pour modifier le comportement de ma stratégie sur ce signal donné.
Je n’ai toujours pas réussi à trouver encore si c’est possible. De la même manière je me demande s’il est possible de créer une table de valeur avec une variable créer, est-ce possible de créer une variable puis d’utiliser “variable[1], variable[2]” ?
Merci par avance la communauté
02/04/2024 at 12:04 PM #227377Si tu écris “CO = COO” dans une partie du code qui est lu à chaque lecture du code alors Co sera toujours égale à COO et c’est logique.
Si tu écris “CO = COO” suite à un test : “If évènements A se produit then” alors Co prendra la valeur de COO au moment où l’évènement A se produit, et si ensuite COO prend un autre valeur, CO restera égale à la valeur d’avant de COO…
Si tu veux t’en persuader, il suffit de faire :
If évènements A then
CO = COO
COO = 0
Endif
…
Return Co, COO
Et tu verras que CO et COO sont différents…Mais, il faut comprendre que le code ne prend en compte que les valeurs de clôtures (au moment où la bougie se clôture) et donc toutes les valeurs intermédiaires que prend ta variable en attendant la clôture de la bougie ne sont pas accessible dans la même timeframe… Il faut s placer dans un timeframe plus petite pour y avoir accès.
Timeframe (5 minutes,default)
If evenement A then
co = COO
endifTimeframe (60 minutes,default)
COO = …
…Dans ce cas là co pourra prendre une valeur intermédiaire que prend COO au court de la bougie 1h
1 user thanked author for this post.
02/04/2024 at 4:36 PM #227385Merci beaucoup pour ta réponse LucasBest,
Je pense que j’aurais dû être plus précis dès le début compte à la finalité de la manœuvre : créer une table des valeurs maximales que mon cours va suivre et permettre à ma stratégie d’établir une moyenne au fur et à mesure pour s’adapter.
En m’inspirant de ta méthode j’ai lancé le programme suivant :
CO=0 // J’ai d’abord mis une valeur nulle avant de procéder au changement car il me demandait une valeur pour CO sinon il ne voulait pas initialiser le test
IF evenement THEN // mémorisation de la position de CO au moment de l’évènement
CO1=CO
ELSIF (CO*CO)-(CO1*CO1)>0 THEN // création d’une table de valeurs pour analyse
CO2=CO1
ENDIFGRAPHONPRICE CO // je n’arrive pas à utlliser RETURN comme tu le fais, ça me met une erreur bizarrement, y a t’il un contexte spécifique pour l’utiliser ?
GRAPHONPRICE CO1
GRAPHONPRICE CO2J’ai obtenu une CO qui varie mais rien ne se passe sur CO1 et CO2
Cela dit entre temps j’ai découvert un post sur le forum ici : Disponibilité des variables de tableau dans ProRealTime – exemples et discussions : Forum Support ProBuilder – ProRealTime (prorealcode.com)
Il aborde la fonction “Array” souvent utilisée en codage et qui permet de créer des tables de valeurs utilisables pour adapter nos stratégies aux évènements qui ont eu lieu dans la stratégie pour s’adapter
En fin de compte il y a un symbole $ qui permet, un peu de la même façon que dans excel, de verrouiller des valeurs, ou encore de lire la valeur d’une variable au lieu de n’observer que la variable en tant que tellecette fonction va me permettre clairement de passer à un autre niveau d’adaptabilité de ma stratégie, j’espère que cet article pourra également vous être utile si vous ne connaissez pas encore cette possibilité la communauté =)
Au plaisir de vous lire
02/04/2024 at 6:00 PM #227402L’instruction “Return” ne s’applique qu’aux indicateurs (onglet Probuilder) et ne peut être utilisé dans une stratégie (Probacktest)
Les variables ne peuvent prendre qu’une valeur à chaque bougie (valeur calculée à la clôture de la bougie)
On peut accéder aux valeurs précédentes (des bougies précédentes) à l’aide des crochets : variable[1] fait référence ) la valeur de la variable à la clôture de la bougie précédente. Si le code ne modifie pas la valeur de la variable lors de la dernière lecture du code la variable conserve la valeur de la variable de la bougie précédente (les variables ne sont pas remises à zéro à chaque bougie). Par contre, à moins de déclarer une “première” valeur pour une variable avec “ONCE variable = 57”, toute variables débute avec la valeur 0.Les tableaux sont différents, car les valeurs de chaque case du tableaux ne sont pas liées à un numéro de bougie. On peut remplir un tableau de n cases à chaque nouvelle bougie si l’on veut… Ce sont des tableaux à une seule dimension pour l’instant. Donc une ligne ou un colonne de valeur.
02/04/2024 at 9:48 PM #227403Merci LucasBest pour ta réponse,
Effectivement c’est beaucoup plus clair, j’ai fais des tests avec la fonction index pour créer des tables de valeur, ça a fonctionné
Il suffit donc d’annoncer une variable M1 précédée de $ comme $M1 pour la variable mémoire de départ et d’ajouter [myindex] pour faire appel à un index “myindex” ensuite on capture la valeur souhaitée, on termine avec myindex=myindex+1 pour faire avancer l’index à la colonne suivante, prête à mémoriser une nouvelle donnée.
Ensuite on peut donner à une variable la valeur de la précédente valeur du tableau en faisant par exemple CO=$CO1[Lastset($CO1)]
ou CO=$CO1[1] si on veut la valeur de la première valeur mémoriséePour afficher la valeur sur le graphique principal et contrôler le résultat il n’y a qu’à utiliser la fonction GRAPHONPRICE M1=$M1 pour afficher les valeurs de l’index sous forme de courbe si j’ai compris
IF évènement THEN
$M1[myindex] = CO[0}
myindex=myindex+1
CO1= $CO1[LastSet($CO1)]
On peut créer autant d’index que l’on souhaite si j’ai compris je pourrais très bien faire comme suit ?
$M1[myindex1] = CO1[0}
$M1[myindex2] = CO2[0} …
ça ouvre beaucoup de possibilités en tout cas, je pense que c’est un gros must, j’ai hâte d’intégrer ça dans ma stratégie =)
02/05/2024 at 7:08 AM #227406Attention : “ou CO=$CO1[1] si on veut la valeur de la première valeur mémorisée”
=> La 1ère valeur mémorisée est normalement $CO1[0] (non pas $CO1[1])
Même si cela peut se faire : “CO1= $CO1[LastSet($CO1)]”
=> pour ne pas semer de doute et de confusion, mieux vaut utiliser des noms différents pour les variables et les tableaux
1 user thanked author for this post.
02/05/2024 at 8:21 PM #227441Merci beaucoup pour ta réponse LucasBest,
J’ai réussi à faire marcher un index avec le code suivant
IF … THEN
$CO1[myindex] = CO
myindex=myindex+1
CO1= $CO1[LastSet($CO1)]
ENDIFCependant quand j’essaie d’utiliser une deuxième un deuxième index :
IF … THEN
$CU1[myindex2] = CU
myindex2=myindex2+1
CU1= $CU1[LastSet($CU1)]
ENDIFLa valeur $CU1 utilise le même index que $CO1 tandis que j’ai tenté d’appeler ces deux index différemment respectivement Myindex2 et Myindex
Lorsque je pose la courbe GRAPHONPRICE CU1 j’ai les même valeurs que CO1Dois-je en déduire qu’on ne peut utiliser qu’un seul index ?
02/05/2024 at 8:46 PM #227442Correction
Je capture bien deux données différentes, je ne sais pas pourquoi je n’avais pas de signal pendant un moment, un de mes déclencheur ne devait pas être déclenché par la courbe que j’analysais
02/05/2024 at 8:54 PM #227443Ce que tu appelles l’index, ce n’est rien d’autre qu’une variable, tu peux en utiliser une ou plusieurs pour gérer le même tableau, voir aucune si ça n’est pas indispensable.
Si tu ne veux pas “gérer” dans ton code une variable qui pointe sur le dernier élément du tableau, c’est possible en utilisant l’instruction : LastSet($NomduTableau) qui renvoi vers le dernier élément entrer dans le tableau ou -1 s’il est vide.
Donc pour enregistrer un nouvel élément dans un tableau : (Ne pas oublier le “+1”!)
$NomduTableau1[LastSet($NomduTableau1)+1] = valeurdelavariablePour lire le dernier élément d’un tableau : (sans “+1”!)
variable = $NomduTableau1[LastSet($NomduTableau1)]1 user thanked author for this post.
02/05/2024 at 9:06 PM #22744402/09/2024 at 10:43 PM #227786Bonjour,
J’espère que vous allez bien la communauté PRT,
J’ai un petit soucis pour tracer mes bandes de Bollinger dans mes stratégies, dans les fonctions nous n’avons que les bandes + et bandes – et pas de paramètres pour régler l’écart type ou pour la centrer sur HULL par exemple comme nous pouvons le faire sur le graphique en dehors de la programmation, c’est dommage car la pertinence des bandes de Bollinger proposée dans les indicateurs de graphique (hors stratégie) est au top, j’aimerais arriver au même résultat dans mon code
Quelqu’un saurait comment intégrer cela?
Merci par avance
02/09/2024 at 11:48 PM #227788En cherchant j’ai trouvé cette base
// Bollinger Enveloppe
MoyEnv = Average[perEnv](close)
ETypeEnv = STD[perEnv](close)
ligneSup = MoyEnv + nbStdEnv * ETypeEnv
ligneInf = MoyEnv – nbStdEnv * ETypeEnvCela dit j’ai essayé et n’ai pas réussi à retrouver les paramètres que j’ai sur mon graphique
Ci-joint le screen pour mieux comprendre ma problématique :En violet j’ai le bandes de bollinger proposées parmi les indicateurs d’un graphique standard, avec un écart type de 2 et positionné sur une moyenne mobile de Hull [487]
En rouge j’ai tenté de faire la même chose en posant :hullS=HullAverage[487](open)
Bollmax=BollingerUp[487](HullAverage[487])
Bollmin=Bollingerdown[487](HullAverage[487])Cela dit je n’obtiens pas du tout la même chose, dans le premier cas tout est pertinent et le graphique vient correctement “attraper” les zones de sorties du graphique du cours et correctement centré autour de Hull
Dans le deuxième les écartes ne sont plus du tout aussi pertinents…02/10/2024 at 8:38 PM #227830Autre petite question :
Est-ce possible de se placer à l’échelle de la seconde et de superposer une courbe à l’echelle du mois qui utiliserait les unités comme des jours au lieu des secondes, pour observer sur deux échelles parfaitement indépendantes ?
-
AuthorPosts
Find exclusive trading pro-tools on