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)
-   -   Auslesen von Objekten (http://www.expert-advisor.com/forum/showthread.php?t=6496)

Gondiego 03.09.19 18:22

Auslesen von Objekten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

habe da nochmal eine Frage. Ich habe hier einen Indikator, welchen ich in einen EA einbinden möchte. Jedoch lässt sich das hier nicht mit iCustom bewerkstelligen, da dieser keine Werte ausgibt, sondern mit Farben arbeitet. Dieses Gebiet betrete ich dann aber zum ersten Mal...

Ich habe mir schonmal sagen lassen, dass man Objekte "auslesen" kann. Denke ich habe in der MQL4 Reference, das richtige gefunden, komme aber nicht so weit damit. Vielleicht habe ich auch ein Verständnisproblem.

Diese Zeile
Code:

color oldColor=ObjectGet("hline12", OBJPROP_COLOR);
ist denke ich mal, genau das, was ich brauche.

Nach meinem Verständnis müsste sie dann für meinen Inidi wie folgt aussehen
Code:

color T1=ObjectGet("FXVTF1", OBJPROP_COLOR);
Oder nicht? (für die anderen beiden dementsprechend auch)

Wollte das nun durch einen Print anzeigen lassen, sprich ob die Farbe nun auch ausgegeben wird (um dann damit weiter arbeiten zu können), doch es passiert nichts.

Wo liegt mein Fehler? Bin für jede Hilfe dankbar.


Grüße :)

traderdoc 03.09.19 18:43

Wenn das Object u.a. so heisst, dann wäre

Code:

color T1=ObjectGet("FXVTF1", OBJPROP_COLOR);
so richtig. Ich glaube jedoch, dass die Objecte alle unterschiedlich heißen oder wenigstens einen Basic-Namen haben und einen Zahlenzusatz, der sich im Laufe der Zeit von Object zu Object ändert.

traderdoc

Gondiego 03.09.19 19:50

Ja, richtig.

Visuell sind die Drei mit T1, T2 und T3 bezeichnet. Wenn man jedoch mit der Maus darüber zeigt, dann wird einem FXVTF1, FXVTF2 und FXVTF3 angezeigt. Ja, man sieht dann auch Werte dabei stehen, die sich jedes Mal verändern, wenn man den Mauszeiger wieder drüber hält. Scheinen wohl Werte aus anderen Timeframes zu sein.

Sollte mir denn bei einem Print nun die "ausgelesene" Farbe angezeigt werden?
Code:

Print(T1);
Wäre so doch richtig oder?

traderdoc 03.09.19 20:09

Nein, Werte anderer TFs sind das nicht.

Was gibt er denn aus bei Print(T1)?

Was stehen nach dem Drücken von Strg + b für Objekte in der Liste?

traderdoc

Gondiego 03.09.19 20:20

Liste der Anhänge anzeigen (Anzahl: 1)
Nichts. Das ist ja mein Problem, bzw. kann da noch nicht nachvollziehen warum.

Auf dem Bild ist zu sehen, was die Tabelle so hergibt.

traderdoc 03.09.19 20:31

Ok und wenn Du jetzt in dieser Tabelle mit der Maus z.B. auf eines der drei Objekte klickst und dann bei "Bearbeiten" danach auf den Reiter "Allgemein" gehst, was siehst Du da für eine Farbe rechts?

traderdoc

AVT 03.09.19 20:43

geht hier:
Code:

  string Rect1Name="FXVTF1"; //these are colored letters Wingdings "n"
  string Rect2Name="FXVTF2";
  string Rect3Name="FXVTF3";
 
  color TestBlue=clrBlue, TestRed=clrRed;
    Print(" Blue="+IntegerToString(TestBlue)+" Red="+IntegerToString(TestRed) ); //Get values
 
  long T1Color=ObjectGetInteger(0,Rect1Name,OBJPROP_COLOR);      //16711680 =Blue 255 =Red
    Print(" color "+Rect1Name+"="+IntegerToString(T1Color) );
  long T2Color=ObjectGetInteger(0,Rect2Name,OBJPROP_COLOR);      //16711680 =Blue 255 =Red
    Print(" color "+Rect2Name+"="+IntegerToString(T2Color) );
  long T3Color=ObjectGetInteger(0,Rect3Name,OBJPROP_COLOR);      //16711680 =Blue 255 =Red
    Print(" color "+Rect3Name+"="+IntegerToString(T3Color) );

Die Zahlen sind irgendwelche Farbumwandlungen von HEX zu sonstwas. AVT

Gondiego 04.09.19 18:25

Erstmal eine Danke @traderdoc und @AVT für die Hilfe.

Werde heute wahrscheinlich nicht mehr dazu kommen, das auszuprobieren bzw. muss erst mal sehen, was da in dem Code genau passiert bzw. wie ich damit jetzt weiter arbeiten kann.

Wollte aber zumindest schonmal einen Dank dalassen.

Grüße

Gondiego 05.09.19 18:19

Danke nochmal für den Code @AVT

Mich irretieren jetzt noch was die Zahlen in den Kommentaren. Muss ich diese nutzen wenn ich eine if-Abfrage der Farbe starte oder kann ich da mit TestBlue und TestRed arbeiten?

Letztendlich ist mein Ziel, immer alle drei in betracht zu ziehen, spriche wenn alle drei blau sind, soll es ein UP-Trend sein, wenn alle rot, dann ein DOWN-Trend.

Grüße

AVT 05.09.19 18:57

Zitat:

Zitat von Gondiego (Beitrag 42826)
Mich irretieren jetzt noch was die Zahlen in den Kommentaren. Muss ich diese nutzen wenn ich eine if-Abfrage der Farbe starte oder kann ich da mit TestBlue und TestRed arbeiten?

Die TestBlue und TestRed sind dazu da, um herauszufinden, welche "Farbzahl" herauskommt, wenn die Farbe "clrBlue" oder "clrRed" heißt. Das sind die Vorgabewerte aus dem Indikator. (Solltest Du die mal ändern, also statt "Blue" z.B. "YellowGreen" einstellen, wird sich auch die "Farbzahl" ändern).

Um die Farbe eines Objektes zu auszulesen, nimmt man ObjectGetInteger(...), man erfragt also eine Integer-Zahl (genau gesagt sind die "Farbzahlen" vom Typ long integer). Da es aber keine (jedenfalls ist mir so was nicht bekannt) Umwandlung von IntegerToColor oder sowas gibt, ist das einfachste mit dem Zahlwert zu arbeiten.

Zitat:

Zitat von Gondiego (Beitrag 42826)
Letztendlich ist mein Ziel, immer alle drei in betracht zu ziehen, spriche wenn alle drei blau sind, soll es ein UP-Trend sein, wenn alle rot, dann ein DOWN-Trend.

Dann brauchst Du trotzdem die beiden unterschiedlichen Zahlen, damit Du weißt, ob Du grad blau oder rot zu fassen hast. Wenn Du diese Farben vom Indikator nie änderst, dann kannst Du deren Zahlwerte vorher festlegen, der Rest ist dann die Bedingung
Code:

long UpColor=16711680; // Blue
long DnColor=255; // Red

if(  ObjectGetInteger(0,FXVTF1,OBJPROP_COLOR)==UpColor
  && ObjectGetInteger(0,FXVTF2,OBJPROP_COLOR)==UpColor
  && ObjectGetInteger(0,FXVTF3,OBJPROP_COLOR)==UpColor )
{
  //dann kaufen
}

ungetestet, sollte aber eigentlich :p so funktionieren. AVT

Gondiego 05.09.19 20:21

Zitat:

Die TestBlue und TestRed sind dazu da, um herauszufinden, welche "Farbzahl" herauskommt, wenn die Farbe "clrBlue" oder "clrRed" heißt. Das sind die Vorgabewerte aus dem Indikator. (Solltest Du die mal ändern, also statt "Blue" z.B. "YellowGreen" einstellen, wird sich auch die "Farbzahl" ändern).

Um die Farbe eines Objektes zu auszulesen, nimmt man ObjectGetInteger(...), man erfragt also eine Integer-Zahl (genau gesagt sind die "Farbzahlen" vom Typ long integer). Da es aber keine (jedenfalls ist mir so was nicht bekannt) Umwandlung von IntegerToColor oder sowas gibt, ist das einfachste mit dem Zahlwert zu arbeiten.
Hab ich verstanden, klasse. Danke für die Erleuterung!

Zitat:

Dann brauchst Du trotzdem die beiden unterschiedlichen Zahlen, damit Du weißt, ob Du grad blau oder rot zu fassen hast. Wenn Du diese Farben vom Indikator nie änderst, dann kannst Du deren Zahlwerte vorher festlegen, der Rest ist dann die Bedingung
Code:

long UpColor=16711680; // Blue
long DnColor=255; // Red

if( ObjectGetInteger(0,FXVTF1,OBJPROP_COLOR)==UpColor
&& ObjectGetInteger(0,FXVTF2,OBJPROP_COLOR)==UpColor
&& ObjectGetInteger(0,FXVTF3,OBJPROP_COLOR)==UpColor )
{
//dann kaufen
}

ungetestet, sollte aber eigentlich so funktionieren. AVT
Das werde ich dann bei Gelegenheit mal ausprobieren, wird aber sicherlich genau das sein, was ich brauche.
Nochmal vielen vielen Danke!

Grüße

Gondiego 07.09.19 17:13

Ich habe das ganze nun mal in eine Funktion gepackt (mache ich zunmindest immer so) aber ich bekomme immer noch kein "Ergebnis", im Sinne eines Prints, geschweige denn, wenn ich mit "Trend" weiterarbeite.

Code:

string Trend;
string up, down;
string Rect1Name = "FXVTF1";
string Rect2Name = "FXVTF2";
string Rect3Name = "FXVTF3";
long UpColor = 16711680; 
long DnColor = 255;       
string FXVTF()
  {
      if(  ObjectGetInteger(0,Rect1Name,OBJPROP_COLOR) == UpColor
        && ObjectGetInteger(0,Rect2Name,OBJPROP_COLOR) == UpColor
        && ObjectGetInteger(0,Rect3Name,OBJPROP_COLOR) == UpColor)
            {
              Trend = up;
            }
      if(  ObjectGetInteger(0,Rect1Name,OBJPROP_COLOR) == DnColor
        && ObjectGetInteger(0,Rect2Name,OBJPROP_COLOR) == DnColor
        && ObjectGetInteger(0,Rect3Name,OBJPROP_COLOR) == DnColor)
            {
              Trend = down;
            }
      else Trend = "";
       
      Print(Trend);
       
      return(Trend);     
  }

Habe ich doch noch was falsch verstanden?

Grüße

AVT 07.09.19 22:29

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Gondiego (Beitrag 42832)
Ich habe das ganze nun mal in eine Funktion gepackt (mache ich zunmindest immer so) aber ich bekomme immer noch kein "Ergebnis", im Sinne eines Prints, geschweige denn, wenn ich mit "Trend" weiterarbeite.

Code:

string Trend; //Variable ohne Anfangswert
string up, down; //2 weitere Variablen ohne Anfangswert
string FXVTF()
{
  if( ... ) Trend = up; //Trend bekommt den Wert von Variable up
  if( ... ) Trend = down; //Trend bekommt den Wert von Variable down
  else    Trend = ""; //Trend bekommt den Wert Leer
       
  Print(Trend);
  return(Trend);     
}

Habe ich doch noch was falsch verstanden?

Sieh Dir mal an, was mit Deinen Variablen passiert. Zum Vergleich mal eine Version angehängt (da Wochenende ist, ist ein Aufruf in OnInit). AVT

Gondiego 08.09.19 12:37

Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die Anmekungen.
Aber auch mit deinem Watcher erhalte ich nichts...:confused:

Steh ich jetzt komplett auf dem Schlauch?

AVT 08.09.19 13:25

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Gondiego (Beitrag 42835)
Danke für die Anmekungen.
Aber auch mit deinem Watcher erhalte ich nichts...:confused:
Steh ich jetzt komplett auf dem Schlauch?

Ich auch, ich habe Dir mal ein Bild angehängt wie das bei mir aussieht. Geladen: nur der VXDA1.ex4 Indikator und dann der FXDA1watcher.ex4. Sobald der zweite auf den Chart gezogen wird, erscheinen unter "Experten" die Print Meldungen. Du mußt unter "Experten" nachsehen und nicht unter "Journal". AVT

Gondiego 08.09.19 14:05

Liste der Anhänge anzeigen (Anzahl: 1)
Super, danke dir.

Hoffentlich letzte Frage, wie zu sehen ist jetzt beim zweiten kein Trend (none) vorhanden, trotz das alle rot sind. Kann es daran liegen,dass Wochenende ist? Nur zum Verständnis für mich.

AVT 11.09.19 14:46

Zitat:

Zitat von Gondiego (Beitrag 42838)
Hoffentlich letzte Frage, wie zu sehen ist jetzt beim zweiten kein Trend (none) vorhanden, trotz das alle rot sind. Kann es daran liegen,dass Wochenende ist? Nur zum Verständnis für mich.

Tschuldigung, war unterwegs. Ne, eigentlich sollte der im Init schon den korrekten Wert anzeigen, aber das tut er hier selbst im OnCalculate nicht, ich krieg momentan ein "none" obwohl down ist.
Jetzt weiß ich auch nicht mehr weiter, sorry ich bin nicht nur mit meinem Latein am Ende, sondern auch mit Griechisch und Germanisch :confused: AVT

Gondiego 13.09.19 16:43

Zitat:

Tschuldigung, war unterwegs. Ne, eigentlich sollte der im Init schon den korrekten Wert anzeigen, aber das tut er hier selbst im OnCalculate nicht, ich krieg momentan ein "none" obwohl down ist.
Jetzt weiß ich auch nicht mehr weiter, sorry ich bin nicht nur mit meinem Latein am Ende, sondern auch mit Griechisch und Germanisch AVT
Oha...das heißt ja dann schon was :eek:
Dann muss ich wohl mal gucken, ob ich das irgendwie anders bewerkstelligt bekomme bzw. ob ich den Indi durch einen anderen ersetzen kann.

Trotzdem danke nochmal.

Grüße

Gondiego 15.09.19 12:03

Zitat:

Tschuldigung, war unterwegs. Ne, eigentlich sollte der im Init schon den korrekten Wert anzeigen, aber das tut er hier selbst im OnCalculate nicht, ich krieg momentan ein "none" obwohl down ist.
Jetzt weiß ich auch nicht mehr weiter, sorry ich bin nicht nur mit meinem Latein am Ende, sondern auch mit Griechisch und Germanisch AVT
@AVT, ich kann dich beruhigen, du bist nicht mit deinem Latein, Griechisch oder Germanisch am Ende...du hast einfach den Wald vor lauter Bäumen nicht mehr gesehen.

Ich bin bisher nicht dazu gekommen meinen EA live zu testen und habe bei dem auftretenden "Fehler", komischerweise, immer in meinem EA geguckt, wo der Fehler liegen könnte. Habe es da aber tatsächlich richitg geschrieben. Wenn du jetzt nochmal in deinen FXDA1watcher reingucken wirst, wirst du jetzt wahrscheinlich schnell feststellen, dass du bei beiden Bedingungen das Gleiche reingeschrieben hast :)

Code:

if(        ObjectGetInteger(0,Rect1Name,OBJPROP_COLOR)==UpColor
              && ObjectGetInteger(0,Rect2Name,OBJPROP_COLOR)==UpColor
              && ObjectGetInteger(0,Rect3Name,OBJPROP_COLOR)==UpColor)
             
        Trend = "up";
       
      else if(  ObjectGetInteger(0,Rect1Name,OBJPROP_COLOR)==UpColor
              && ObjectGetInteger(0,Rect2Name,OBJPROP_COLOR)==UpColor
              && ObjectGetInteger(0,Rect3Name,OBJPROP_COLOR)==UpColor)
       
        Trend = "down"

Kann dann ja logischerweise kein "down" erfüllt werden.
Funktioniert also einwandfrei ;)

Grüße und schönen Sonntag noch

AVT 15.09.19 19:22

Zitat:

Zitat von Gondiego (Beitrag 42857)
@AVT, ich kann dich beruhigen, du bist nicht mit deinem Latein, Griechisch oder Germanisch am Ende...du hast einfach den Wald vor lauter Bäumen nicht mehr gesehen.

Wenn du jetzt nochmal in deinen FXDA1watcher reingucken wirst, wirst du jetzt wahrscheinlich schnell feststellen, dass du bei beiden Bedingungen das Gleiche reingeschrieben hast :)

Kann dann ja logischerweise kein "down" erfüllt werden.
Funktioniert also einwandfrei ;)

Suuuper, daß Du das gesehen hast :D:D dann ist ja meine Welt wieder im Lot! Danke und erfolgreiche nächste Woche. AVT


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:10 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