Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Meine W52-Funktion gibt rätsel auf (http://www.expert-advisor.com/forum/showthread.php?t=6397)

stoffel 20.04.19 19:42

Meine W52-Funktion gibt rätsel auf
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin und Grüße @all,

ich schreibe gerade einen Indi der eine Liste mit Symbolen auslist und mir die 52 Wochen Hoch/Tief als Tooltip anzeigen soll. iHighest, iHigh etc. alles korrekt, habe ich händisch geprüft, aber wenn sie den %abstand berechnet kommt es zu unsinnigen Ergebnissen. Zusätzlich habe ich für den aktuellen Chart ein Label-objekt erstellt. Da werden die Ergebnisse korrekt angezeigt :eek:

Kling vllt etwas kompliziert ist es aber nicht. Ich hänge einen Screenshot an.

hier mal meine Funktion:

Code:

void w52Function()
{
  Print("Symbol set-file: ",Set_File," Anzahl Symbols: ",ArraySize(Symbols)," ",nCurrency);
    for(int i=0; i<nCurrency; i++)
      {
        Print("Start ",GetMicrosecondCount());
            ResetLastError();
        int w52iHighest = iHighest(Symbols[i], PERIOD_W1, MODE_HIGH, 52);
            if(w52iHighest == -1)Print("w52 ERROR w52iHighest ",w52iHighest," ",GetLastError()," ",ErrorDescription(GetLastError()));//
           
            ResetLastError();
        int w52iLowest =  iLowest( Symbols[i], PERIOD_W1, MODE_LOW, 52);
            if(w52iLowest == -1)Print("w52 ERROR w52iLowest ",w52iLowest," ",GetLastError()," ",ErrorDescription(GetLastError()));//
           
            ResetLastError();
        double w52High = iHigh(Symbols[i], PERIOD_W1,w52iHighest);
            if(w52High == 0)Print("w52 ERROR w52High ",w52High," ",GetLastError()," ",ErrorDescription(GetLastError()));//
           
            ResetLastError();
        double w52Low  = iLow(Symbols[i], PERIOD_W1,w52iLowest);
            if(w52Low == 0)Print("w52 ERROR w52Low ",w52Low," ",GetLastError()," ",ErrorDescription(GetLastError()));//
           
        double w52Prozent = (w52High-w52Low)/100;
        double w52HighProzent1 = NormalizeDouble(w52High-Close[0],2);
        double w52HighProzent  = NormalizeDouble(w52HighProzent1/w52Prozent,2);
            if(w52HighProzent > 100 || w52HighProzent < 0)Print("w52 ERROR w52HighProzent ",w52HighProzent," ",GetLastError()," ",ErrorDescription(GetLastError()));
           
        double w52LowProzent1  = NormalizeDouble(Close[0]-w52Low,2);
        double w52LowProzent  = NormalizeDouble(w52LowProzent1/w52Prozent,2);
            if(w52LowProzent > 100 || w52LowProzent < 0)Print("w52 ERROR w52LowProzent ",w52LowProzent," ",GetLastError()," ",ErrorDescription(GetLastError()));
           
        string getTooltip = ObjectGetString(0,Symbols[i],OBJPROP_TOOLTIP,0);
        ObjectSetString(0,Symbols[i],OBJPROP_TOOLTIP,getTooltip+"\n"+MarketClose+"\n"+Symbols[i]+" w52 High: "+w52HighProzent+"\n"+Symbols[i]+" w52 Low: "+w52LowProzent);
       
        if(  Symbols[i]==_Symbol)
        {
            ObjectDelete(0,"w52High");
            LabelCreate(0,"w52High",0,10,15,0,Symbols[i]+" W52 High: "+w52HighProzent+" %","Arial",10,clrGreen,0,0);
            ObjectDelete(0,"w52Low");           
            LabelCreate(0,"w52Low",0,10,30,0,Symbols[i]+" W52 Low: "+w52LowProzent+" %","Arial",10,clrRed,0,0);
        }
        /* while(GetMicrosecondCount()<ul+1000 && !IsStopped())
          {
            Print(Symbols[i]," GetMicrosecondCount() ",GetMicrosecondCount()," ul+1000 ",ul+1000);
          }*/
          Print("end ",GetMicrosecondCount());
          Print(Symbols[i],"w52Prozen: ",w52Prozent," W52 iHighest: ",w52iHighest," W52 High: ",w52High," W52 High % ",w52HighProzent);
          Print(Symbols[i]," W52 iLowest: ",w52iLowest," W52 Low: ",w52Low," W52 Low % ",w52LowProzent);
      }
}

Ich hoffe ich habe mich halbwegs klar ausgedrückt.

Im Screenshot unten kann man den Tooltip mit den W52 High/Low % sehen.

Hat jemand eine Idee warum die Berechnung für den aktuellen Chart korrekt ist, nicht aber bei den Tooltips

AVT 22.04.19 17:59

Zitat:

Zitat von stoffel (Beitrag 42375)
... aber wenn sie den %abstand berechnet kommt es zu unsinnigen Ergebnissen. Zusätzlich habe ich für den aktuellen Chart ein Label-objekt erstellt. Da werden die Ergebnisse korrekt angezeigt :eek:
Kling vllt etwas kompliziert ist es aber nicht. Ich hänge einen Screenshot an.
hier mal meine Funktion:
8< --- SNIP ---
Ich hoffe ich habe mich halbwegs klar ausgedrückt.
Im Screenshot unten kann man den Tooltip mit den W52 High/Low % sehen.
Hat jemand eine Idee warum die Berechnung für den aktuellen Chart korrekt ist, nicht aber bei den Tooltips

So ganz klar ist das nicht und Dein Bild sieht eher aus wie der Negekampf im Tunnel. Ich habe folgendes gemacht:
1. _Symbol eingesetzt, damit ich das zum Testen auf ein paar Paare schmeißen kann.
2. die w52Prozent erst mal als reinen Wert genommen
3. alle Berechnungen auf _Digit Wert Genauigkeit
4. dann beim Prozent die *100
5. ganz zum Schluß die 2-er Digits für die Prozente
Hier stimmt alles. Code:
Code:

        double w52Prozent = NormalizeDouble((w52High-w52Low),_Digits);
       
        double w52HighProzent1 = NormalizeDouble(w52High-Close[0],_Digits);
        double w52HighProzent  = NormalizeDouble(w52HighProzent1/w52Prozent*100,_Digits);
            if(w52HighProzent > 100 || w52HighProzent < 0)Print("w52 ERROR w52HighProzent ",w52HighProzent," ",GetLastError());
           
        double w52LowProzent1  = NormalizeDouble(Close[0]-w52Low,_Digits);
        double w52LowProzent  = NormalizeDouble(w52LowProzent1/w52Prozent*100,_Digits);
            if(w52LowProzent > 100 || w52LowProzent < 0)Print("w52 ERROR w52LowProzent ",w52LowProzent," ",GetLastError());

          //Print("end ",GetMicrosecondCount());
          Print(_Symbol," w52Prozent Range(100%): ",w52Prozent);
          Print(_Symbol," summ H%1+L%1: ",w52HighProzent1+w52LowProzent1);
          Print(_Symbol," W52 iHighest: ",w52iHighest," W52 High: ",w52High," W52 High % ",w52HighProzent);
          Print(_Symbol," W52 iLowest: ",w52iLowest," W52 Low: ",w52Low," W52 Low % ",w52LowProzent);
          Print(_Symbol," summ H%+L%: ",w52HighProzent+w52LowProzent);

LabelCreate(0,"Label",20,20,"text","Arial",12,clrYellow,0,1,"tooltip");       
ObjectSetString(0,"Label",OBJPROP_TOOLTIP,
                  "MarketClose="+DoubleToStr(Close[0],_Digits)
                +"\nw52 High="+DoubleToStr(w52High,_Digits)
                +"\nw52 Low ="+DoubleToStr(w52Low,_Digits)
                +"\nLow % ="+DoubleToStr(w52LowProzent,2)
                +"\nHigh %="+DoubleToStr(w52HighProzent,2)
              );

Vielleicht geht es so bei Dir. AVT

stoffel 22.04.19 19:23

leider nicht besser
 
Liste der Anhänge anzeigen (Anzahl: 1)
hallo AVT und frohe Ostern :)

vielen Danke für deine Antwort. Ich habe deinen Code eingefügt. Wie man am Screenshot sehen kann ist das Ergebnis leider auch nicht besser.

Die Berechnung ist an sich ja richtig wie man in meinem ersten Screenshot sehen kann. Das Problem ist das es nur für den aktuell offene chart richtig ist, nicht aber für alle anderen.

ich werde mal einen mini Indi mache mit dem man ein .set-file laden kann.

Mein Gedanke war, das es vllt ein Zeitproblem ist und habe verschiedene .set-files mit 1,3, und 5 Symbole ausprobiert. es ist immer das gleiche. Aktuell richtig, alle anderen falsch.

Vllt fällt dir noch was ein.

AVT 22.04.19 19:55

Zitat:

Zitat von stoffel (Beitrag 42379)
hallo AVT und frohe Ostern :)
vielen Danke für deine Antwort. Ich habe deinen Code eingefügt. Wie man am Screenshot sehen kann ist das Ergebnis leider auch nicht besser.

Die Berechnung ist an sich ja richtig wie man in meinem ersten Screenshot sehen kann. Das Problem ist das es nur für den aktuell offene chart richtig ist, nicht aber für alle anderen.

ich werde mal einen mini Indi mache mit dem man ein .set-file laden kann.

Mein Gedanke war, das es vllt ein Zeitproblem ist und habe verschiedene .set-files mit 1,3, und 5 Symbole ausprobiert. es ist immer das gleiche. Aktuell richtig, alle anderen falsch.

Vllt fällt dir noch was ein.

Frohe Ostern :D auf dem Bild sehe ich wenigstens was :D
Am .set liegt es nicht, das holt ja nur alle benötigten Symbole in Deine Liste der aktiven.
Zu welchem Objekt gehört Tooltip, zu der 52er HighLinie?
Hat die einen eindeutigen Namen?
Und eigentlich sollte der Wert im aktuellen Chart dann richtig sein.
Was heißt das, aktuell richtig und alle anderen falsch?
Erwartest Du, daß im eur/usd Chart ein Tooltip für usd/jpy kommt?
Das verstehe ich noch nicht. AVT

stoffel 22.04.19 20:21

hier der mini-indi
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tooltip gehört zu den einzelnen Symbolen im Indikatorfenster, siehe Screenshot 1.

Die Label in Chart dienen nur der Kontrolle, Da ist das Ergebnis korrekt. Aber der Tooltip der einzelnen Symbolnamen im Indi-fenster sind nicht korrekt obwohl sie der gleichen Berechnung entstammen. Genau das ist mein Problem.

habe mal einen mini-indi geschrieben. Einfach eins .set-file mit Symbolnamen erstellen un unter \MQL4\files ablegen. Die Symbolnamen müssen so geschrieben werden wie sie im MarketWatch angezeigt werden. Pro Zeile ein Symbol.

Schon mal vielen Dank für deine Mühe

Ps Im mini-indi sind die Label im Chart anklick bar, dann öffnet sich der angeklickte Chart

AVT 22.04.19 21:21

Ich hab ne Idee woran es liegen könnte: Die w52High und w52Low Berechnungen werden explizit über Symbols[i] gemacht, also für jedes Symbol extra, dann wird damit weitergemacht, für die Berechnungen ist die Schleife meiner Meinung nach ok.
Aber wenn Du dann z.B. das Label (das liegt in der Schleife) machst, dann benutzt nur diesen einen Schleifenwert - das heißt jedesmal wenn er die Schleife durchläuft, wird der Labelwert wieder auf den neuen Schleifenwert angepaßt. AVT

stoffel 22.04.19 21:37

Die Werte für die Label werden am Ende der Schleife verwendet. Schon vorher wird der Tooltip mit diesen Werten zusammen gefügt. Von daher sollten die Tooltips für die Symbolnamen im indi-Fenster eigentlich auch richtig sein.

Danke für deine Mühe.
Muss für heute Schluss machen. Melde mich morgen wieder. Guts Nächtle

AVT 23.04.19 00:47

ersetze:
Code:

Close[0] durch iClose(Symbols[i],PERIOD_M1,0)
Mein Handcode zeigt jetzt alle Werte korrekt an. Close[0] bezieht sich immer auf den aktuellen Chart, das kann natürlich nicht gut gehen. Hoffentlich war's das :rolleyes: AVT

stoffel 23.04.19 06:06

Super, klappt
 
Moin AVT,

manchmal sieht man den Wald vor lauter Bäumen nicht. Eigentlich klar das dass nicht so klappen kann. Super das du das bemerkt hast.

Jetzt kann es endlich weiter gehen :)

Ich werde mich sicher noch öfters melden. Aber bis dahin vielen Dank für deine Mühe und noch happy Trading

Gruß
stoffel


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:26 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum