5-Stellen-Erkennung

 
double pointsPerPip(){
   string suffix = StringSubstr(Symbol(), 6);
   int digits = MarketInfo("EURUSD" + suffix, MODE_DIGITS);
   if (digits == 0){
      digits = MarketInfo("EURUSD", MODE_DIGITS);
   }
   if (digits == 0){
      return(1);
   }else{
      if (digits == 5){
         return(10);
      }
   }
   return(1);
}
Ich versuche gerade, die narrensicherste Methode zu finden, um zu erkennen, ob wir 1 oder 10 als Pip-Multiplikator benötigen. Die oben war meine erste Idee, einfach schauen, wie viele Ziffern der EURUSD hat. Es gibt Makler, wo dieses Symbol EURUSDm oder EURUSDiam oder anderen lustigen Unsinn von Maklern mit keinen anderen Grund als unseren Code zu brechen hinzugefügt wird und auch gibt es Symbol Namen, die nicht genau 6 Zeichen, wie GOLD oder GOLDm zum Beispiel haben und die oben kann NICHT mit diesem.

Hat jemand einen noch ausgefeilteren Algorithmus, um die richtigen Ziffern zu finden? Ich denke, es läuft alles auf das Problem hinaus, zuerst herauszufinden, wie genau der Symbolname von EURUSD lautet, und dann ist der Rest einfach. Gibt es zum Beispiel eine einfache Möglichkeit, alle verfügbaren Symbole aufzuzählen, so dass ich nach einem Namen suchen kann, der "EURUSD" enthält oder damit beginnt?
 

Normalerweise überprüfe ich sie nur einmal im Abschnitt init:

int mypoint;
int init()
{
if(MarketInfo(Symbol(), MODE_DIGITS)==3||MarketInfo(Symbol(), MODE_DIGITS)==5)
mypoint=10;
else mypoint=1;
}
...
 
Roger:

Normalerweise überprüfe ich sie nur einmal im Abschnitt init:

Ihr Code ist nicht narrensicher, es gibt Symbole mit 1 oder 2 (Gold) oder einer anderen Anzahl von Ziffern.

Ich habe einen besseren Weg gefunden (ich muss ihn noch mit einigen anderen Brokern testen). Er liest symbols.raw im History-Ordner, um den Namen von eurusd zu finden und verwendet dann MarketInfo();

/**
* determine the pip multiplier (1 or 10) depending on how many
* digits the EURUSD symbol has. This is done by first
* finding the exact name of this symbol in the symbols.raw
* file (it could be EURUSDm or EURUSDiam or any other stupid name
* the broker comes up with only to break other people's code) 
* and then usig MarketInfo() for determining the digits.
*/
double pointsPerPip(){
   int i;
   int digits;
   double ppp = 1;
   string symbol;
   int f = FileOpenHistory("symbols.raw", FILE_BIN | FILE_READ);
   int count = FileSize(f) / 1936;
   for (i=0; i<count; i++){ 
      symbol = FileReadString(f, 12);
      if (StringFind(symbol, "EURUSD") != -1){
         digits = MarketInfo(symbol, MODE_DIGITS);
         if (digits == 4){
            ppp = 1;
         }else{
            ppp = 10;
         }
         break;
      }
      FileSeek(f, 1924, SEEK_CUR);
   }
   FileClose(f);
   return (ppp);
}
 

Es war ein Code für nur eine Währung. Wenn Sie Ihren EA für mehrere Währungen verwenden möchten, müssen Sie ihn für jeden Fall separat berechnen.

 
7bit:
Ich habe einen besseren Weg gefunden (ich muss ihn noch mit einigen weiteren Brokern testen). Es liest symbols.raw im Ordner history, um den Namen von eurusd zu finden und dann MarketInfo() zu verwenden;

Dies würde nicht funktionieren, wenn sie jemals die symbols.raw-Datei ändern (und könnte nicht mit älteren Versionen von MT4 funktionieren... obwohl das wahrscheinlich kein Problem ist).

 
Ich verwende die gleiche Methode wie Roger, und sie hat mir noch keine Probleme bereitet.
Es wird für die meisten Fälle funktionieren. Wenn Sie eines finden, das nicht passt, dann überqueren Sie einfach diese Brücke, wenn Sie sie finden.

CB
 
//++++ These are adjusted for 5 digit brokers.
double  pips2points,    // slippage  3 pips    3=points    30=points
        pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int init() {
    if (Digits == 5 || Digits == 3) {   // Adjust for five (5) digit brokers.
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
 
WHRoeder:
if (Digits == 5 || Digits == 3) {   // Adjust for five (5) digit brokers.

Du wiederholst nur dasselbe, was ich bereits als unzureichend empfunden habe. Die Verwendung der Digits-Variable allein hilft dem Problem nicht (das Problem habe ich im ersten Posting definiert), da sie nicht berücksichtigt, auf welchem Symbol sie gerade läuft und wie viele Ziffern dieses Symbol haben sollte. Bei einigen exotischen Paaren kann es jede beliebige Anzahl von Ziffern von 0 bis 5 geben, nicht nur 5 oder 3 oder 4 oder 2. Wenn es so einfach wäre, hätte ich diesen Thread nicht eröffnet. Deshalb verwende ich jetzt einfach die Ziffern des Eurusd, egal auf welchem Paar er läuft. Den tatsächlichen Namen von eurusd zu finden war das größte Problem, und bis jetzt scheint die symbols.raw Methode die einfachste und zuverlässigste zu sein.
 
cloudbreaker:
Wenn Sie in Zukunft einen finden, der nicht passt, dann gehen Sie einfach über diese Brücke, wenn Sie sie finden.

Ich versuche, narrensicheren Code zu schreiben, der nicht kaputt geht. Wenn ich (wissentlich) fehlerhaften Code schreibe und warte, bis er kaputt geht, bevor ich ihn repariere, passt das nicht zu meiner Philosophie, wie Softwareentwicklung gemacht werden sollte.
 
7bit wrote >>
Ich versuche, narrensicheren Code zu schreiben, der nicht kaputt geht. (Wissentlich) fehlerhaften Code zu schreiben und zu warten, bis er kaputt geht, bevor ich ihn repariere, passt nicht zu meiner Philosophie, wie Softwareentwicklung gemacht werden sollte.


Ich würde nicht sagen, dass der obige Code 'fehlerhaft' ist - er hat lediglich... Einschränkungen, derer sich die Benutzer wohl bewusst sind.
Das Schöne an der Philosophie ist, dass sie asynchron mit der Praktikabilität laufen kann :)
-BB-
 
Ist es nicht eine einfache (vielleicht nicht ganz so einfache, mathematische) Angelegenheit, herauszufinden, was ein Punkt im Verhältnis zu einem bestimmten Preis ist, und dann zu entscheiden, in welcher Ziffer er im Vergleich zu den Ziffern des Preises liegt?
Ein einfacher Weg, dies zu erreichen, könnte darin bestehen, dass man einen Preis nimmt, einen Punkt hinzufügt und ihn mit dem Multiplikator + demselben Preis vergleicht, und wenn das Ergebnis nicht dasselbe ist, den Multiplikator in einer Schleife erhöht, bis sie übereinstimmen.