Bug de la boucle For ?

Viewing 13 posts - 1 through 13 (of 13 total)
  • Author
    Posts
  • #131913 quote
    Player
    Participant
    Average

    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

    Proscreener.jpg Proscreener.jpg
    #131918 quote
    robertogozzi
    Moderator
    Master

    Écrivez 253 à la ligne 9. Si vous écrivez 254 + 1 pour CLOSE [1], vous dépassez la limite maximale.

    #131929 quote
    robertogozzi
    Moderator
    Master

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

    #131952 quote
    Player
    Participant
    Average

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

    #131960 quote
    robertogozzi
    Moderator
    Master

    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.

    #131998 quote
    Player
    Participant
    Average

    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.

    #131999 quote
    robertogozzi
    Moderator
    Master

    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.

    #132001 quote
    Player
    Participant
    Average

    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")
    #132002 quote
    robertogozzi
    Moderator
    Master

    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.

    #132023 quote
    Player
    Participant
    Average

    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

    #132043 quote
    robertogozzi
    Moderator
    Master

    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")
    Nicolas and Player thanked this post
    x-10.jpg x-10.jpg
    #132067 quote
    Nicolas
    Keymaster
    Master

    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 ?

    Player thanked this post
    #132191 quote
    Player
    Participant
    Average

    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

Viewing 13 posts - 1 through 13 (of 13 total)
  • You must be logged in to reply to this topic.

Bug de la boucle For ?


ProScreener : Scanners de Marché & Détection

New Reply
Author
author-avatar
Player @player Participant
Summary

This topic contains 12 replies,
has 3 voices, and was last updated by Player
5 years, 9 months ago.

Topic Details
Forum: ProScreener : Scanners de Marché & Détection
Language: French
Started: 05/17/2020
Status: Active
Attachments: 2 files
Logo Logo
Loading...