|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Meine W52-Funktion gibt rätsel auf
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 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); } } 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 |
|
|||
Zitat:
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) ); |
|
|||
leider nicht besser
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. |
|
|||
Zitat:
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 |
|
|||
hier der mini-indi
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 |
|
|||
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 |
|
|||
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 |
|
|||
ersetze:
Code:
Close[0] durch iClose(Symbols[i],PERIOD_M1,0) |
|
|||
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 |
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|