Travail sur plusieurs UT et appel de programmes
Forums › ProRealTime forum Français › Support ProBuilder › Travail sur plusieurs UT et appel de programmes
- This topic has 6 replies, 3 voices, and was last updated 3 months ago by Strix.
-
-
08/02/2024 at 8:15 AM #236054
Bonjour,
Je souhaite transposer ma stratégie de trading dans un programme, mais j’ai quelques difficultés avec la programmation sur plusieurs unités de temps. Une partie de ma stratégie consiste à déterminer la tendance de l’action selon la moyenne mobile exponentielle 200 (EMA200) sur plusieurs unités de temps : 1 min, 15 min, 1 heure. Le code ci-dessous me permet de le faire séparément pour chaque graphique (par commodité, je fais mes tests en créant des indicateurs, mais à terme, j’utiliserai ProOrder pour automatiser mes trades) :
12345678910111213MME200 = ExponentialAverage[200](close)IF High [0] < MME200 AND High [1] < MME200 THENresultat1Hour = -1ELSIF Close [0] > MME200 AND Close [1] > MME200 THENresultat1Hour = 1ELSEresultat1Hour = 0ENDIFRETURN resultat1Hour AS "resultat1Hour"Ce que j’aimerais, c’est combiner les résultats de ces codes sur mon 1 min de telle sorte que lorsque tous les indicateurs indiquent une tendance haussière, une quatrième variable contienne 1, et -1 pour une tendance baissière. Malheureusement, si j’importe mon code dans un TimeFrame sur le 1 min, le résultat est complètement faussé, car le logiciel ne peut pas calculer la MME200 en 1h faute d’un nombre suffisant de bougies chargées (le logiciel considère chaque bougie du graphique en minute et non chaque bougie du graphique en heure comme je l’espérais).
Est-ce possible de faire appel aux résultats d’un autre programme dans ProRealTime ? Par exemple que pour chacune des bougies en minute, le programme regarde l’état de la bougie horaire correspondante et renvoie une valeur sans refaire les calculs. Pour les bougies en minute de 14h00 à 14h59, la bougie en heure vaut 1, donc chacune d’elle vaut 1.
Y a-t-il une meilleure méthode d’entreprendre mon programme ?
Merci d’avance
08/02/2024 at 10:26 AM #236057Bonjour, vous pouvez utiliser le délai d'instruction pour calculer l'EMA sur différentes périodes. Assurez-vous de charger suffisamment de barres pour le calcul de l'énergie en 1 heure.
1234567891011121314151617181920212223242526272829303132timeframe(1h)MME2001h = ExponentialAverage[200](close)IF High < MME2001h AND High [1] < MME2001h THENresultat1Hour = -1ELSIF Close > MME2001h AND Close [1] > MME2001h THENresultat1H = 1ELSEresultat1H = 0ENDIFtimeframe(15mn)MME20015mn = ExponentialAverage[200](close)IF High < MME20015mn AND High [1] < MME20015mn THENresultat15mn = -1ELSIF Close > MME20015mn AND Close [1] > MME20015mn THENresultat15mn = 1ELSEresultat15mn = 0ENDIFtimeframe(1mn)MME2001mn = ExponentialAverage[200](close)IF High < MME2001mn AND High [1] < MME2001mn THENresultat1mn = -1ELSIF Close > MME2001mn AND Close [1] > MME2001mn THENresultat1mn = 1ELSEresultat1mn = 0ENDIFresultat = resultat1H + resultat15mn + resultat1mnRETURN resultat as "Resultat"08/02/2024 at 1:16 PM #236066Merci pour votre réponse Iván,
Malheureusement cela ne fonctionne pas. J’ai eu la même idée précédemment, et la partie de code qui vérifie la tendance du 1H renvoie systématiquement 0, alors que la même portion de code appliquée en indicateur sur le graphique 1H fonctionne parfaitement.
De la même façon, la partie de code qui vérifie la tendance du 15mn a un comportement erratique, en particulier lorsque les bougies du 15mn sont proches de la MME200. Le reste du temps, l’indicateur fonctionne mieux que le 1H, mais sans êtrte fiable pour autant.À mon avis, le logiciel ProRealTime prend en compte la dernière bougie de l’intervalle utilisé dans TimeFrame pour faire les calculs, et non les valeurs exprimées dans le graphique en 15mn. Je m’explique :
La bougie 14h00 (Time vaut donc 140100) en 15mn est constituée de plusieurs bougies en 1mn s’étalant de 134600 (13h45) jusqu’à 140100 (14h00).
Sur le graphique en 15mn, des fonctions invisibles pour l’utilisateur enregistrent le cours d’ouverture, le cours de clôture, le high et le low de chaque bougie 15mn. Quand un programme s’exécute sur le 15mn il fait appel à ces valeurs.
Lors de l’utilisation de TimeFrame 15mn sur un graphique en 1mn, le programme prend les valeurs de la dernière bougie 1mn constituant la bougie en 15mn, qui n’a donc pas les mêmes valeurs Close Open High Low que la bougie 15mn.
De fait, le programma devient faussé.Je ne suis pas certain s’il s’agit d’un bug du programme ou s’il a été conçu exprès de cette manière. Et je ne sais pas si une bougie en 15mn chargée via TimeFrame en 1mn s’appuie véritablement sur la dernière bougie en 1mn la constituant ou s’il s’appuie sur la première, des recherches plus approfondies me donneront sûrement la réponse.
De là, je vois plusieurs solutions, mais je ne sais pas si ProRealTime embarque les fonctions nécessaires pour les rendre concrètes.
1. Utiliser des variables super globales. En programmation “classique”, ce sont des variables accessibles depuis n’importe quel endroit du code. Ainsi un indicateur dans un graphique 15mn pourrait générer une variable SuperGlobal = x, et je pourrais faire appel à cette variable dans le code d’un autre indicateur sur un autre graphique, par exemple dans le 1mn : IF SuperGlobal > 2 THEN…
2. Écrire les valeurs de l’indicateur du graphique en 15mn dans un fichier, puis lire ce fichier depuis un autre programme.
3. Trouver le moyen d’appeler un autre programme depuis mon programme principal ou de faire fonctionner TimeFrame correctement.
4. Ne travailler que dans le graphique en 1mn, et reconstituer à la main les calculs faits dans les autres graphiques. Cela implique de créer des fonctions pour repérer les Open Close High Low de chaque tranche horaire et de les stocker dans un array, puis de faire pareil pour les 15mn, puis de recalculer les MME200 selon ces tableaux, etc. J’aimerais éviter d’employer cette méthode beaucoup plus chronophage.Si vous avez des informations, même partielles, à propos des solutions que j’ai évoquées, je vous serai infiniment reconnaissant de me les partager.
08/02/2024 at 1:45 PM #23606808/02/2024 at 2:12 PM #23607008/05/2024 at 8:35 AM #236130Cette solution est basée sur les instructions
updateonclose
https://www.prorealcode.com/documentation/timeframe-probacktest-proorder/1234567891011121314151617181920212223242526272829303132timeframe(1h,updateonclose)MME2001h = ExponentialAverage[200](close)IF High < MME2001h AND High [1] < MME2001h THENresultat1Hour = -1ELSIF Close > MME2001h AND Close [1] > MME2001h THENresultat1H = 1ELSEresultat1H = 0ENDIFtimeframe(15mn,updateonclose)MME20015mn = ExponentialAverage[200](close)IF High < MME20015mn AND High [1] < MME20015mn THENresultat15mn = -1ELSIF Close > MME20015mn AND Close [1] > MME20015mn THENresultat15mn = 1ELSEresultat15mn = 0ENDIFtimeframe(1mn)MME2001mn = ExponentialAverage[200](close)IF High < MME2001mn AND High [1] < MME2001mn THENresultat1mn = -1ELSIF Close > MME2001mn AND Close [1] > MME2001mn THENresultat1mn = 1ELSEresultat1mn = 0ENDIFresultat = resultat1H + resultat15mn + resultat1mnRETURN resultat as "Resultat"1 user thanked author for this post.
08/14/2024 at 10:12 AM #236389 -
AuthorPosts
Find exclusive trading pro-tools on