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.
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).
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; }
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.
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. (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.
Das Schöne an der Philosophie ist, dass sie asynchron mit der Praktikabilität laufen kann :)
-BB-
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.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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?