Plus Haut VS plus Bas
Forums › ProRealTime forum Français › Support ProBuilder › Plus Haut VS plus Bas
- This topic has 12 replies, 3 voices, and was last updated 3 years ago by Nicolas.
-
-
02/21/2021 at 5:17 PM #162242
Bonjour à tous, afin d’être le plus concis possible, je vais exposer ma problématique via un cas concret.
INTRODUCTION
L’option de protection contre les pertes qu’offre le brooker que j’utilise est le : STOP SUIVEUR (en % du dernier plus haut), exemple :
- achat prix/action = 10€, Stop = 10%, Seuil de protection intial = 9€
- plus tard, l’action fera un plus haut (mèche) à 15€, seuil réajusté = 13,50€
- au prochain plus haut = 20€, Seuil sera réajusté à 18€
GROS DEFAUT
Le gros défaut de ce système de protection est que toute mèche représentant un plus bas, peut facilement venir clôturer notre position, alors même que la tendance aurait été fortement haussière. Dans l’exemple précédent, une mèche à 17,90€ vendrait l’action. A moins de mettre un % très élevé, dans ce cas, le rôle de Stop Loss ne serait plus très bien assuré.
L’OBJECTIF
J’aimerais écrire un programme qui pour une action donnée sur une période donnée (ex: 6 mois) m’aide à rapidement visualiser le % de variation entre les plus hauts et plus bas successifs.
LE PROGRAMME
- Commencer à une date donnée (ex: 20200801)
- Trouver le prochain plus haut (ex: 10€)
- Trouver le prochain plus bas (ex: 8€)
- Calculer la variation (ex: 20%)
- Dés qu’un prochain plus haut est atteint on recommence tout.Cela pourrait ainsi donner :
Nouveau plus haut : 15€
Nouveau plus bas : 9€
Variation : 40% - La sortie de ce programme afficherait donc une courbe indiquant : 20, puis 40.
REMARQUES :
- Un nouveau plus haut, est par définition, plus haut que le précédent plus haut.
- Dès qu’il y a nouveau plus haut, le précédent plus bas n’est plus valide.
- Bien sûr, si plus aucun nouveau plus haut trouvé, la sortie restera ainsi : 20, 40.
- Cependant, si le programme devait boucler de nouveau, suite un nouveau plus haut, cela donnerait :
- Nouveau plus haut : 16€
- Nouveau plus bas : 12€
- Variation : 25%
- La sortie serait : 20, 40, 25.
MES TENTATIVES
- Pour détecter le plus haut j’ai écrit :
DETECTION DU PLUS HAUT123456789101112131415161718i = 10mini = low[i]maxi = high[i]while i > 0 doi = i - 1if high[i] > high[i-1] thenmaxi = high[i]if low[i] < low[i-1] thenmini = low [i]var = (maxi/mini-1)*100continueendifendifbreakwendreturn var- Rien que là, plusieurs problèmes :
- Le programme calcule la sortie pour les valeurs du graphique.
- Je ne sais pas lui dire de ne calculer que pour les valeurs après une date donnée.
- J’avais essayé de borner cela à 10 périodes grâce à mon compteur, mais il calcule pour toutes les valeurs quand-même.
- Ce programme affiche des plus hauts qui parfois, sont plus bas que le précédent (voir IMAGE_1 ci-jointe).
- Pour détecter le plus bas, j’ai utilisé le même principe de code, mais cela fonctionne encore moins bien.
- J’ai également essayé d’utiliser les commandes :
- RANGE : mais ça ne répond pas à mon besion qui cherche à regarder le plus haut vs plus bas des chandeliers suivants et non-pas plus vs plus-bas du même chanderlier.
- DATE: j’ai tenté la commande if date > 20200801, pour éviter que le calcule ne se fasse pour toutes les valeurs du graphique, mais uniquement entre le 01er Août 2020 et aujoud’hui… en vain.
CONCLUSION
Merci par avance pour votre support, j’ai tenté de nombreuses solutions, mais pour le moment j’ai passé des heures à m’arracher les cheveux.
02/21/2021 at 6:15 PM #162259Bonjour, une façon de faire sans boucle (donc économisant du temps de calcul), et en progressant en temps réel sans besoin de revenir en arrière (donc ne profitant pas de “connaitre le futur” pour faire les calculs à un point passé quelqconque) pourrait être ainsi:
12345678910111213141516171819startdate=20210203if opendate>=startdate thenif high>hh thenhh=highrefll=hhres1=0endifif high<hh thenrefll=min(refll, low)res1=(hh-refll)/hh*100endifendifif res1<res1[1] thenres2=res1[1]endif//return hh, refllreturn res1,0,res2startdate y étant la date de départ souhaitée au format YYYYMMDD
hh le plus haut qui s’actualise,
refll la progression du nouveau plus bas de référence à partir du plus haut le plus récent,
res1 (résultat 1) le pourcentage de baisse actualisé chaque fois que le plus bas descend, et remis à 0 quand un nouveau plus haut se forme,
et j’ai ajouté res2 la visualisation simplifiée de l’amplitude max atteinte par res1 si on ne veut voir que l’extrême et pas toute la progression.
1 user thanked author for this post.
02/22/2021 at 9:03 AM #16230303/15/2021 at 1:41 AM #164176Bonjour,
Merci pour ce rapide retour et les explications des différentes variables.
A commencer par le moyen de borner les calculs à une période donnée, finalement très simple, mais très utile :
Borner l'affichage / les calculs12startdate=20210203if opendate>=startdate thenJe n’ai cependant pas encore saisi toutes les autres subtilités, mais j’y travaille.
Je ne connais notamment pas cette syntaxe, où l’on affecte deux paramètres à min : refll=min(refll, low)
Les débuts sont toujours un peu laborieux, mais je trouve qu’avec ce language il faut parfois sortir un canon pour tuer une mouche… !
Par exemple, lui faire afficher quelque chose d’extra simple : la clôture maximum de l’année 2019… une syntaxe telle que : highest[2019](close), aurait été tellement la bienvenue !
Hélas non, il faut plusieurs variables, boucles, etc., etc., avant d’espèrer arriver au bon résultat… et encore même pas, car le code ci-dessous en fonctionne pas…
Tentative...123456789startdate = 20190101enddate = 20191231c1 = opendate > startdatec2 = opendate < enddateif c1 and c2 thenv1 = highest[52](close)endifreturn v103/15/2021 at 1:48 AM #16417703/15/2021 at 3:46 AM #164180En complément, cela aidera certainement à mieux cerner mes incompréhensions…
De ce que j’avais compris le close[1] devait renvoyer à l’avant dernier chandelier affiché, close[2] à l’avant-avant dernier chandelier affiché.
Autrement dit, si nous sommes en graphique journalier, et que nous étions le 10 du mois, close[1] devrait donner le prix de fermeture de la veille (le 09 du mois), close[2] d’avant-hier (le 08 du mois), close[5] de 5 jours auparavant, donc du 05 du mois.
Après une multitude de tentatives, voilà qu’il est maintenant 03h30 du matin passé, hélas, le tout se solde sur des échecs, ce n’est pas faute d’avoir essayé… C’est assez pénible que de constater que la toute simple et dernière tentative que je fais ne renvoie pas non-plus le résultat attendu.
Fermeture de la veille !12c1 = close[1]return c1Je demande la fermeture d’hier, en sortie je m’attend à un trait unique indiquant 40,98 ! et là, un graphique complet est affiché (cf. pièce jointe: Fermeture_de_la_veille.jpg)…
Encore merci à vous pour le support.
03/15/2021 at 9:15 AM #164192Sur ce dernier exemple, ton code est correct, tu retournes la valeur de la bougie n-1 à chaque bougie. Ton code est aussi lu et calculé dans l’historique, donc la valeur que tu affectes à c1 également.
Si tu veux tracer un élément graphique comme une ligne droite, utilises DRAWHLINE
1drawhline(c1)Si tu débutes en programmation, je te suggère les formations vidéos du site: Premiers pas avec la programmation pour ProRealTime
03/15/2021 at 9:16 AM #16419303/15/2021 at 12:54 PM #16421203/15/2021 at 1:06 PM #164213Re-bonjour,
Sur le principe, on demande au programme la valeur de clôture de la veille, je ne comprends pas pourquoi la sortie n’est pas uniquement une seule valeur…
Clôture de la veille1c1 = close[1]La côture de la veille, c’est en effet une seule et unique valeur, valeur de clôture de l’avant-dernier chandelier le plus à droite sur le graphique. Saurais-tu aider à comprendre pourquoi PRT trace une graphique pour toutes les valeurs svp ?
Concernant le programme, j’ai essayé, mais ça ne semble pas fonctionner (cf. Fermeture_de_la_veille_02.jpg).
03/15/2021 at 1:21 PM #164219La valeur entre crochet représente la quantité de bougie en arrière pour récupérer une valeur du passé. Donc Close[1] n’est pas le cours de la clôture de la veille au sens strict, mais celui de la bougie n-1 (peu importe l’UT), et cela peu importe où tu te trouves dans l’historique.
Prenons un exemple, si dans ton programme, tu aurais voulu tester “la clôture de la veille”, mais uniquement les Mardi, comment aurais-tu fait, si tu ne pouvais aller chercher dans les constantes de prix le Close du n-1 ?
Pour l’indicateur, tu ne vois rien car l’échelle ne s’adapte pas automatiquement aux “dessins” réalisés par les instructions graphiques. Dans le cas présent, tu dois remplacer la dernière ligne par celle-ci (on retourne la valeur de c1, mais on la cache avec une transparence totale)
1return c1 coloured(100,100,100,0)03/15/2021 at 6:26 PM #164248Bien noté pour la notion close[1], ça ne signifie pas le n-1 par rapport à la dernière bougie sur le graphique, mais le n-1 quel qu’il soit.
Au-delà de la notion graphique, ici si j’essayais d’otenir une valeur unique (une droite) en sortie, mon réel objectif était d’ajouter un nouveau paramètre à un de mes screeners.
Je voulais que ce screener, me liste les actions qui dans les 4 années passées, avaient eu un plus haut à 4x fois le cours actuel.
Difficile de mettre une condition telle que : (if A => B * 4 then) si je n’arrive pas à obtenir une constante pour A…
Merci.
03/16/2021 at 8:53 AM #164299Le cours actuel est Close[0]
Si tu écris une condition comme un booléen:
123maCondition = Close[0] > plushautscreener[maCondition]alors cette variable retournera 0 (faux) ou 1 (vrai) à chaque bougie, mais le screener lui attendra la fin de la lecture de l’historique pour t’informer, et donc la bougie courante.
-
AuthorPosts
Find exclusive trading pro-tools on