Bonjour,
J’ai créé ce screener qui fonctionne pour la 1ère clause et la deuxième mais lorsque je rajoute la 3ème j’ai un message d’erreur qui me dit que ma boucle est sans fin.
Je pensais que c’était ma 3ème clause qui posait problème, mais si je supprime la deuxième, donc en n’en laissant que 2, je n’ai plus de message d’erreur:
Once Distance=100
TimeFrame(Weekly)
HIghWeek=High[1]
MedianWeek=(Open[1]+Close[1])/2
LowWeek=Low[1]
TimeFrame(4Hours)
for barre=1 to 254 Do
//Premier Calcul
HautHigh=HIghWeek[Barre]
Ecart1=100/Max(HautHigh,Close[1])*(Max(HautHigh,Close[1])-Min(HautHigh,Close[1]))
If Ecart1<Distance Then
Distance=Ecart1
EndIf
//Deuxième Calcul
HautLow=LowWeek[Barre]
Ecart2=100/Max(HautLow,Close[1])*(Max(HautLow,Close[1])-Min(HautLow,Close[1]))
If Ecart2<Distance Then
Distance=Ecart2
EndIf
//Troisième Calcul. A partir d'ici j'ai le message d'erreur
HautMedian=MedianWeek[Barre]
Ecart3=100/Max(HautMedian,Close[1])*(Max(HautMedian,Close[1])-Min(HautMedian,Close[1]))
If Ecart3<Distance Then
Distance=Ecart3
EndIf
Next
SCREENER(Distance as "Distance")
Merci par avance pour vos retours.
Marc
Écrivez 253 à la ligne 9. Si vous écrivez 254 + 1 pour CLOSE [1], vous dépassez la limite maximale.
Non, je pense que le problème en est un autre. Peut-être.
Aux lignes 12, 19 et 26, vous faites référence à [barres] qui est un index à l’intérieur du TF 4H, mais vous l’appliquez à une donnée appartenant au TF Weekly (MedianWeek).
Ce qui veut dire qu’on ne peut pas mélanger des TimeFrame ?
Pourtant c’est l’idée de base, comparer une valeur d’une unité supérieure dans une unité inférieure.
Ce qui est étrange c’est que ça marche pour les 2 premiers calcul, puis lors de l’ajout du troisième ça plante..
Entre la ligne 8 et 9, ajoutez:
HW=HighWeek
MW=MedianWeek
LW=LowWeek
puis, à la ligne 12, remplacez HIghWeek [ Barre ] par HW [Barre], à la ligne 19, remplacez LowWeek [Barre] par LW [Barre] et à la ligne 26, remplacez MedianWeek [Barre] par MW [Barre].
Je pense que ça pourrait marcher.
Il faut utiliser également 253 ou 252 au lieu de 254.
Vous aviez raison à ce sujet :
Aux lignes 12, 19 et 26, vous faites référence à [barres] qui est un index à l’intérieur du TF 4H, mais vous l’appliquez à une donnée appartenant au TF Weekly (MedianWeek).
Alors j’ai réécrit mon code :
Once Distance=100
TimeFrame(4Hours)
Cloture=Close[1]
TimeFrame(Weekly)
For Barre=1 To 253
HIghWeek=High[Barre]
MedianWeek=(Open[Barre]+Close[Barre])/2
LowWeek=Low[Barre]
//Premier Calcul
If HighWeek>Cloture Then
MaxVal=HighWeek
MinVal=Cloture
Else
MaxVal=Cloture
MinVal=HighWeek
EndIf
Ecart1=100/MaxVal*(MaxVal-MinVal)
If Ecart1<Distance Then
Distance=Ecart1
EndIf
//Deuxième Calcul
If LowWeek>Cloture Then
MaxVal=LowWeek
MinVal=Cloture
Else
MaxVal=Cloture
MinVal=LowWeek
EndIf
Ecart2=100/MaxVal*(MaxVal-MinVal)
If Ecart2<Distance Then
Distance=Ecart2
EndIf
//Troisième Calcul
If MedianWeek>Cloture Then
MaxVal=MedianWeek
MinVal=Cloture
Else
MaxVal=Cloture
MinVal=MedianWeek
EndIf
Ecart3=100/MaxVal*(MaxVal-MinVal)
If Ecart3<Distance Then
Distance=Ecart3
EndIf
Next
SCREENER[1=1](Distance as "Distance")
Plus propre et j’ai enlevé les Max et Min pensant que cela était le problème.
Mais pareil. Mon Code fonctionne lorsque je met seulement 2 Blocs de calcul, mais dès que j’insère le 3ème Bloc ça plante
En fait je viens de m’apercevoir que c’est ce 3 ème bloc qui pose problème
If MedianWeek>Cloture Then
MaxVal=MedianWeek
MinVal=Cloture
Else
MaxVal=Cloture
MinVal=MedianWeek
EndIf
Si je ne fait que 2 comparaison cela fonctionne. Mais dès que j’insère la 3ème comparaison, c’est le plantage.
Essayez de supprimer ONCE de la ligne 1, cela a déjà causé des problèmes avec ProScreener.
Si ce n’est pas le problème, essayez de créer 3 boucles FOR … NEXT différentes, au lieu de faire 3 calculs en un seul cycle.
Code réécrit avec ajout de boucle For et suppression de Once au début, mais le problème persiste
TimeFrame(4Hours)
Cloture=Close[1]
TimeFrame(Weekly)
For Barre=1 To 253
HIghWeek=High[Barre]
//Premier Calcul
If HighWeek>Cloture Then
MaxVal=HighWeek
MinVal=Cloture
Else
MaxVal=Cloture
MinVal=HighWeek
EndIf
Ecart1=100/MaxVal*(MaxVal-MinVal)
If Ecart1<Distance Then
Distance=Ecart1
EndIf
Next
For Barre=1 To 253
LowWeek=Low[Barre]
//Deuxième Calcul
If LowWeek>Cloture Then
MaxVal=LowWeek
MinVal=Cloture
Else
MaxVal=Cloture
MinVal=LowWeek
EndIf
Ecart2=100/MaxVal*(MaxVal-MinVal)
If Ecart2<Distance Then
Distance=Ecart2
EndIf
Next
For Barre=1 To 253
MedianWeek=(Open[Barre]+Close[Barre])/2
//Troisième Calcul
If MedianWeek>Cloture Then
MaxVal=MedianWeek
MinVal=Cloture
Else
MaxVal=Cloture
MinVal=MedianWeek
EndIf
Ecart3=100/MaxVal*(MaxVal-MinVal)
If Ecart3<Distance Then
Distance=Ecart3
EndIf
Next
SCREENER[1=1](Cloture as "Distance")
C’est le dernier problème auquel je peux penser.
En une semaine, il y a 30 bougies de 4 heures, donc quand vous arrivez à la répétition n. 9 (30×9 = 270) dépasse la limite de 254 TF bar à 4 heures. Mais je doute que ce soit une erreur même avec un seul cycle!
Essayez de remplacer 253 par 5, puis d’augmenter de 5 à 5 pour vérifier s’il existe une limite interne.
Effectivement Roberto, c’était un problème de Seuil. En incrémentant mon programme de 5 à chaque fois, celui-ci cesse de fonctionner à 215
Par contre, ce que je ne comprend plus c’est qu’il devrait me retourner un écart en pourcentage mais à chaque fois il me retourne Zéro sur l’ensemble des résultats.
Je comprendrais qu’il y a quelques fois où la clôture serait égal au plus haut, un produit par zéro serait retourné dans ce cas Ecart1=100/MaxVal*(MaxVal-MinVal) mais pas tous mes résultats
Surtout que j’ai mis un garde fou : If Ecart1<Distance And Ecart1<>0
Once Distance=100
TimeFrame(4Hours)
Cloture=Close[1]
TimeFrame(Weekly)
For Barre=1 To 210
HIghWeek=High[Barre]
rem MedianWeek=(Open[Barre]+Close[Barre])/2
rem LowWeek=Low[Barre]
//Premier Calcul
If HighWeek>Cloture Then
MaxVal=HighWeek
MinVal=Cloture
Else
MaxVal=Cloture
MinVal=HighWeek
EndIf
Ecart1=100/MaxVal*(MaxVal-MinVal)
If Ecart1<Distance And Ecart1<>0 Then
Distance=Ecart1
EndIf
Next
SCREENER(Distance as "Distance")
Je vois vraiment pas où ça cloche
Votre premier message, avec 174 sur la ligne 9, fonctionne parfaitement.
Il ne renvoie pas de valeur car la dernière ligne est incomplète, la condition est manquante. Essayez avec:
SCREENER[Distance > 0.03](Distance as "Distance")
Si il n’y a pas de condition entre crochets, logiquement ProScreener devrait restituer l’ensemble des valeurs de la liste, et je pense que c’est ce que @Player cherche à faire ?
Effectivement je recherche toutes les valeurs.
Votre premier message, avec 174 sur la ligne 9, fonctionne parfaitement.
Merci à toi Roberto pour l’idée.
Je vais prendre prendre mon calcul de ma première fonction pour l’intégrer à mon nouveau code dont la boucle For est de meilleure performance et le code me semble plus logique.
Merci pour le temps consacré..
Marc