Digits von selektiertem Symbol ermitteln (Schleife)

 

Hallo,

ich habe in der codebase einen EA gefunden (https://www.mql5.com/de/code/13181), der zu manuell erstellten Marketorders dieses Symbols  SL und TP ergänzt etc.

Diesen möchte ich auf alle Symbole erweitern, scheitere aber am Auslesen der Digits des jeweiligen, selektierten Symbols.

Das ist mein aktueller Stand:

Beim Schleifendurchlauf werden alle Orders im Pool selektiert und geprüft, ob Magic = 0 und ob SL/TP nicht vorhanden. Wenn die Bedingung erfüllt ist, werden SL/TP gesetzt.

Das Problem ist, dass unterschiedliche Symbole einen verschiedene Anzahl an Digits haben und deswegen SL/TP nicht im gewünschten Abstand platziert wird. Abhängig davon, in welchem Symbol der EA platziert ist, liegen SL/TP wie geplant, genau auf Einstand oder viel zu weit weg.

Die Ursache darin sehe ich darin, dass ich es nicht schaffe, vom jeweiligen, selektierten Symbol die Digits auszulesen um den notwendigen Multiplikator zur Berechnung zu finden.

Kann hier vielleicht jemand mit einem Hinweis unterstützen? Vielen Dank!


Gruß

Werner

void SetSLTP()
  {
//---
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))    // selektiert alle Orders im Pool
        { 
        //++++++++++   mein Versuch, funktioniert nicht  ++++++++++++++++++++++++++++          

         currentDigits = MarketInfo(OrderSymbol(),MODE_DIGITS);
         if (currentDigits == 2)  PipValue = 100;
         if (currentDigits == 3)  PipValue = 10;
         if (currentDigits == 5) PipValue  = 10;
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                
         if(OrderType()==OP_BUY && OrderMagicNumber() == 0 && (OrderStopLoss()==0 || OrderTakeProfit()==0))   // für manuell erstellte Orders ohne SL/TP mit Magic = 0
           {
            bool result1=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-stoploss*PipValue*Point,OrderOpenPrice()+takeprofit*PipValue*Point,0,Blue);
            if(result1==false)Print("Error in OrderModify BUY, setting SL and TP. Error code=",GetLastError());
           }
     ... etc ....
LacusTstopandBE
LacusTstopandBE
  • www.mql5.com
Dieser Expert Advisor ist für den manuellen Handel gedacht. Diese Expert Advisor platziert Stoploss und Takeprofit für Buy, Sell, BuyLimit, BuyStop, SellLimit und SellStop Aufträge. Es enthält sogar BreakEven und Trailingstop. Arbeitet mit 4 und 5 Digit-Brokern. Eingabeparameter: Stoploss: Stoploss in Punkten. Takeprofit: Takeprofit in...
 

Point bezieht sich immer auf das aktuelle Symbol. Der Wert sollte hier analog zu Digits abgefragt werden. (MarketInfo ist MQL 4 und wird in MQL 5 nicht mehr verwendet.)

double point=SymbolInfoDouble(OrderSymbol(),SYMBOL_POINT);
 

Geht doch ganz einfach mit _Digits: https://www.mql5.com/de/docs/check/digits

oder mit SymbolInfoInteger() https://www.mql5.com/en/docs/marketinformation/symbolinfointeger

Ist ganz einfach zu finden:

  1. oben auf Dokumentation klicken
  2. Dann aus MQL5 Funktionenliste klicken
  3. Zum Schluss mit Ctrl-F und "Digit" suchen => so findet man _Digits

oder man scrollt in der Funktionsliste gleich nach unten bis zu Symbol.. und such sich SymbolInfoInteger() aus, da die Dezimalstellen ja eine ganze Zahl sind...


Dokumentation zu MQL5: Zustandspruefung / Digits
Dokumentation zu MQL5: Zustandspruefung / Digits
  • www.mql5.com
Wert der Variable _Digits, in der die Anzahl der Dezimalzeichen aufbewahren wird, die die Genauigkeit der Preisberechnung des Symbols des laufenden Charts bestimmt.
 
lippmaje:

Point bezieht sich immer auf das aktuelle Symbol. Der Wert sollte hier analog zu Digits abgefragt werden. (MarketInfo ist MQL 4 und wird in MQL 5 nicht mehr verwendet.)

Danke, für Deine Antwort! Da werde ich mich erst mal einlesen müssen. Im Moment bin ich noch in MT4 unterwegs und habe noch einigen aufzuholen bevor ich zu MT5 wechsle.


Gruß

Werner

 
Carl Schreiber:

Geht doch ganz einfach mit _Digits: https://www.mql5.com/de/docs/check/digits

oder mit SymbolInfoInteger() https://www.mql5.com/en/docs/marketinformation/symbolinfointeger

Ist ganz einfach zu finden:

  1. oben auf Dokumentation klicken
  2. Dann aus MQL5 Funktionenliste klicken
  3. Zum Schluss mit Ctrl-F und "Digit" suchen => so findet man _Digits

oder man scrollt in der Funktionsliste gleich nach unten bis zu Symbol.. und such sich SymbolInfoInteger() aus, da die Dezimalstellen ja eine ganze Zahl sind...


Danke, Carl. 
SymbolInfoInteger() scheint die Lösung zu sein. Wenn ich die Referenz richtig verstanden habe, bezieht sich _Digits NUR auf das Symbol des ausgewählten Charts.

Ich kannte diese Möglichkeit bis jetzt nicht, wusste also auch nicht recht, wonach ich suchen sollte weil mir nicht einmal klar war, ob ich auf dem richtigen Weg bin.

Vielen Dank für Deine Antwort!

Gruß

Werner

 
fintrad0:

Danke, Carl. 
SymbolInfoInteger() scheint die Lösung zu sein. Wenn ich die Referenz richtig verstanden habe, bezieht sich _Digits NUR auf das Symbol des ausgewählten Charts.

Ich kannte diese Möglichkeit bis jetzt nicht, wusste also auch nicht recht, wonach ich suchen sollte weil mir nicht einmal klar war, ob ich auf dem richtigen Weg bin.

Vielen Dank für Deine Antwort!

Gruß

Werner

ich verwende auch diese Liste, wenn ich nicht mehr weiß wie eine Funktion hieß - funzt ganz gut als eine Art Schlüsselwortsuche.

 
fintrad0:

Hallo,

ich habe in der codebase einen EA gefunden (https://www.mql5.com/de/code/13181), der zu manuell erstellten Marketorders dieses Symbols  SL und TP ergänzt etc.

Diesen möchte ich auf alle Symbole erweitern, scheitere aber am Auslesen der Digits des jeweiligen, selektierten Symbols.

Das ist mein aktueller Stand:

Beim Schleifendurchlauf werden alle Orders im Pool selektiert und geprüft, ob Magic = 0 und ob SL/TP nicht vorhanden. Wenn die Bedingung erfüllt ist, werden SL/TP gesetzt.

Das Problem ist, dass unterschiedliche Symbole einen verschiedene Anzahl an Digits haben und deswegen SL/TP nicht im gewünschten Abstand platziert wird. Abhängig davon, in welchem Symbol der EA platziert ist, liegen SL/TP wie geplant, genau auf Einstand oder viel zu weit weg.

Die Ursache darin sehe ich darin, dass ich es nicht schaffe, vom jeweiligen, selektierten Symbol die Digits auszulesen um den notwendigen Multiplikator zur Berechnung zu finden.

Kann hier vielleicht jemand mit einem Hinweis unterstützen? Vielen Dank!


Gruß

Werner

Ich werd das nie verstehen, warum manche Progger das noch immer so machen. Es gab anno ddazumal noch Broker, die hatten nur 4 Digits bei EURUSD. In den letzten, sagen wir 10 Jahren, hatte ich allerdings keinen mehr davon gesehen.

Das gleiche gilt für die Berechnung der "Pips".

In meinen Augen, ist ein Pip die Änderung der letzen Kommastelle um 1, egal ob 3 oder 5 Digits, je nach Währung.

Bei den Eingaben von SL gebe ich das dann auch richtig vor, da steht dann halt 200 anstelle von 20. Das ist in der Programmierung viel einfacher, da ich mit der Konstanten _Point und _Digits arbeiten kann

 

Hallo amando,

ein Pip entspricht für mein Verständnis der 4. Nachkommastelle bei den meisten Währungspaaren. Bei Yen-Paaren ist das die 2. Nachkommastelle. Bei Indizes die 1. Stelle vor dem Komma usw.

Vielleicht kannst Du etwas näher erklären, was Du damit meinst, "warum Progger das noch immer so machen."

---

DIESER EA soll auf einem VPS laufen und für meine manuell (mit dem Smartphone) erstellten Orders das Ordermanagement übernehmen. Das können also Währungspaare sein (5-Digit, 3-Digit), Indizes (2-Digit), Gold und Öl.

Im Moment setzt ich SL/TP anhand eines fixen Parameters. Ich werde aber auch noch eine variablen, ATR-basierten SL/TP testen

---

Meine anderen EA's berechnen sich auch mit Point, also der letzten Stelle des jeweiligen Symbols. Das ist wesentlich unkomplizierter also jedesmal in Pips umzurechnen, da gebe ich Dir recht.

Wenn Du noch einen Vorschlag für eine Verbesserung hast, bin ich nicht böse darüber :-))

Gruß

Werner

 
fintrad0:

Hallo amando,

ein Pip entspricht für mein Verständnis der 4. Nachkommastelle bei den meisten Währungspaaren. Bei Yen-Paaren ist das die 2. Nachkommastelle. Bei Indizes die 1. Stelle vor dem Komma usw.

Vielleicht kannst Du etwas näher erklären, was Du damit meinst, "warum Progger das noch immer so machen."

---

DIESER EA soll auf einem VPS laufen und für meine manuell (mit dem Smartphone) erstellten Orders das Ordermanagement übernehmen. Das können also Währungspaare sein (5-Digit, 3-Digit), Indizes (2-Digit), Gold und Öl.

Im Moment setzt ich SL/TP anhand eines fixen Parameters. Ich werde aber auch noch eine variablen, ATR-basierten SL/TP testen

---

Meine anderen EA's berechnen sich auch mit Point, also der letzten Stelle des jeweiligen Symbols. Das ist wesentlich unkomplizierter also jedesmal in Pips umzurechnen, da gebe ich Dir recht.

Wenn Du noch einen Vorschlag für eine Verbesserung hast, bin ich nicht böse darüber :-))

Gruß

Werner

Wie gesagt, ich halte diese unterscheidung bei den kommastellen für ein historisches relikt


angenommen du willst 10 pips von der 4 nachkommastelle, das wären dann 100 von der 5ten

da brauch ich keinen großen code um die nachkommastellen zu definieren, weil dann bin ich mit _Point immer richtg. Egal ob jpy paare, eur oder usd pairs bzw indizes


das unterscheiden kommt meiner Einschätzung nach noch aus zeiten, wo es 4 und 5 digit broker gab. Die 4 digit gibts aber nicht mehr und wenn das einer anbietet, dann finger weg

 
amando:

Wie gesagt, ich halte diese unterscheidung bei den kommastellen für ein historisches relikt


angenommen du willst 10 pips von der 4 nachkommastelle, das wären dann 100 von der 5ten

da brauch ich keinen großen code um die nachkommastellen zu definieren, weil dann bin ich mit _Point immer richtg. Egal ob jpy paare, eur oder usd pairs bzw indizes


das unterscheiden kommt meiner Einschätzung nach noch aus zeiten, wo es 4 und 5 digit broker gab. Die 4 digit gibts aber nicht mehr und wenn das einer anbietet, dann finger weg

amando, wie könnte man also einen EA mit sinnvollem, festen SL/TP von, sagen wir mal, 30 PIPS, sowohl für EURUSD, also auch für den DAX etc. verwenden ohne vorher zu wissen, auf welches Symbol er als nächstes angewendet wird um den SL/TP zu setzen?

Beim

EURUSD sind 30 Pips = 300 Points,

beim DAX sind 30 Pips = 3000 Points.

Es geht hier um diesen speziellen Fall eben darum, dass das Symbol vorher nicht feststeht, demnach ein SL/TP in festen Points ein vollkommen verschiedenes Ergebnis liefert.

Wie würdest Du die Situation mit Points lösen?


Gruß

Werner

 

https://www.mql5.com/de/docs/marketinformation

hier sind alle infos drin, wenn du es auslesen tust, in rechne immer über den tickwert, alles andere verzerrt die kalkulation

und dann kommt bei dem obigen code noch dazu, manche index oder cfd haben nur eine kommastelle, das schliesst du dann gleich mit ein

Dokumentation zu MQL5: Marktinformation erhalten
Dokumentation zu MQL5: Marktinformation erhalten
  • www.mql5.com
Marktinformation erhalten - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
Grund der Beschwerde: