Alles um Metatrader 4.0 - Handelsmethoden und Indikatoren

      Da sich das Resultat eines unzutreffenden Algorithmus mit der Implementationssprache bei äquivalenter Implementation nicht ändern kann, ist das Resultat natürlich auch mit MT4 FALSCH.

      Da muss nicht nur 1-2-fix auf irgendein Datum gesehen werden, sondern ein Test-Szenario existieren, welches die gewünschten Daten den real erhaltenen gegenüber stellt. Das Herausholen der Originaldaten mittels einfachem FileWrite und die externe Sortierung mit einem x-beliebigem Sortierprogramm sollten kein Problem sein.

      Mit einem zusätzlichem ArrayInitialize(Result, 0.0); in Zeile 11 sieht es noch viel schlechter aus, da bleiben von 256 Input-Monaten nur 40 übrig.

      Aber die Aufgabe ist dank der fertigen Sortierfunktionen ohnehin obsolet.

      Quellcode

      1. #define FILE_NAME_BEFORE "Test_Vikke_sort.original.dat"
      2. #define FILE_NAME_AFTER "Test_Vikke_sort.processed.dat"
      3. int start()
      4. { double CloseCopy[];
      5. double Result[];
      6. ArrayCopy(CloseCopy, Close);
      7. ArrayCopy(Result , Close);
      8. writeArray(FILE_NAME_BEFORE, CloseCopy);
      9. sort_arr(CloseCopy, Result);
      10. writeArray(FILE_NAME_AFTER, Result);
      11. return(0);
      12. }
      13. void sort_arr(double & input[], double & output[])
      14. { for ( int k = 0; k < ArraySize(input); k ++ )
      15. { if ( input[k] > output[0] )
      16. output[0] = input[k];
      17. for ( int j = 1; j < ArraySize(output); j ++ )
      18. if ( input[k] >= output[j] && input[k] < output[j - 1] )
      19. output[j] = input[k];
      20. } }
      21. void writeArray(string fileName, double & series[])
      22. { int output = FileOpen(fileName, FILE_WRITE | FILE_CSV);
      23. for ( int seriesIndex = 0; seriesIndex < ArraySize(series); seriesIndex ++ )
      24. FileWrite(output, series[seriesIndex]);
      25. FileClose(output);
      26. }
      Bilder
      • Fehlerhaft.png

        13,78 kB, 647×581, 335 mal angesehen

      Arrays sortieren

      Dazu könnten die bereits standardmäßig im MT enthaltenen Funktionen nutzbar sein:Zeitreihen-Arrays müssen dazu leider in gewöhnliche Arrays konvertiert werden, was die Nützlichkeit möglicherweise eingrenzen könnte.

      Wenn auch die selbst gefertige Lösung wegen o. g. Links vielleicht gar nicht gebraucht wird, gibt es noch folgende Anmerkungen:
      1. Der gezeigte Quelltext ist von einer Sortierung etwas entfernt, da fehlt irgendein ganzer Schritt, nicht nur ein Mikro- Bugfix. (Wegen der Befürchtung, das im Kopf nicht genug zu überblicken, gab es sogar eine Nachimplementation in C++. Der Algorithmus ist aber von Sortierung wirklich entfernt.)
      2. Für das Sortieren größerer Felder sind triviale Algorithmen ungeeignet, die die Felder in allen Kombinationen vollständig durchgehen, da sie in Abhängigkeit von der Länge n des zu sortierenden Array eine quadratische Kompexität n ^ 2 haben, wobei qualifizierte Sortier-Algorithmen nur eine Komplexität n * log(n) haben.
      3. Ehe das Rad völlig neu zu erfinden, schlägt man am besten in einer der diversen Quellen für Sortier-Algorithmen nach, die eine der gängigsten Studienaufgaben für IT-Leute sind und daher im Übermaß vorhanden sind.
      Bilder
      • vikke_sort.png

        10,87 kB, 684×311, 321 mal angesehen
      Steh heute Abend irgendwie auf dem Schlauch.... diese Sortier-Funktion will net wie ich will. Bei der Array-Ausgabe werden gleiche Werte nicht ausgegeben, sondern weggelassen, sodass die Anzahl der Ergebnisse verkürzt wird. Ich brauche jedoch auch die doppelt vorhandenen Werte. Kann da mal jemand rüberschauen?

      Quellcode

      1. void sort_arr(double &input[], double &output[])
      2. {
      3. for(int k=0; k<ArraySize(input); k++)
      4. {
      5. if(input[k] > output[0])
      6. output[0] = input[k];
      7. for(int j = 1; j<ArraySize(output); j++)
      8. {
      9. if(input[k] >= output[j] && input[k] < output[j-1])
      10. output[j] = input[k];
      11. }
      12. }
      13. }
      Ich habe es mir jetzt auch noch mal genauer angesehen. Irgendwas funktionierte mit den schon vorhanden Indikatoren nicht. Nach dem Entfernen und Neueinfügen in den Navigator funktionierte es wieder. Möglicherweise hat ist da beim MT4-Update mit den größeren Änderungen vor einiger Zeit irgendein File nicht richtig gepflegt worden. Über den Wechsel zu MT5 empfehle ich aber trotzdem nachzudenken.
      Hm, grad mit JFD und ActivTrades getestet, klappt wie gewohnt.
      Der Autor ist in den besprochenen Werten zumeist selbst investiert. Traden auf eigene Gefahr, Signale sind aktuell großteils experimentell zwecks Challenge "In 30 Tagen zur Trading Strategie".
      Plane deinen Trade, trade deinen Plan!
      If it´s not a HELL YES, it´s a NO!

      Zeit zum Wechsel auf MT5

      Beim Test meines einzig noch verbliebenen MT4 kann ich nicht mal mehr einen EA aktivieren. Das ist mir noch gar nicht aufgefallen, da ich nur noch den MT5 nutze, weil da die Konditionen des Anbieters besser sind (dass sogar sehr kurzfristiges Trading funktioniert) und die Programmiersprache viel leistungsfähiger ist.

      Mehr MT4-Terminals habe ich nicht mehr zur Verfügung, da ich allerlei getestete Anbieter verworfen habe. Ob das eine allgemeine Erscheinung ist oder ob das in der anbieterspezifischen Anpassung des MT4-Terminals festgelegt werden kann, weiß ich nicht. Es könnte (ohne jeden Ansatz der Behauptung einer Tatsache) darüber gemutmaßt werden, ob es wirklich auszuschließen sei, dass seitens des Softwareherstellers vielleicht einige Anreize geboten werden, von der aus ihrer Sicht sicherlich ungeliebten Altsoftware (die durch Kapazitätsbindung Kosten erzeugt) weg zu kommen.

      Re: Indikatorenwerte an Excel senden

      Das aus trash's Post # 1748 (etwas lesefreundlicher formatierte, aber nicht getestete und auch nicht auf Syntaxfehler geprüfte) Skript war:

      Brainfuck-Quellcode

      1. // -------------------------------------------------------------------
      2. // Indicators_to_File.mq4
      3. // Copyright © 2007, MetaQuotes Software Corp.
      4. // http://www.metaquotes.ru/
      5. //
      6. // minimal reformatting 2013-11-23 by NG
      7. // -------------------------------------------------------------------
      8. #property copyright "Copyright © 2007, MetaQuotes Software Corp."
      9. #property link "http://www.metaquotes.ru/"
      10. #property show_inputs
      11. string SymbolsArray[13] =
      12. { "", "EURUSD", "EURJPY", "GBPUSD", "USDJPY", "USDCAD", "AUDUSD"
      13. , "EURGBP", "EURAUD", "EURCHF", "EURCAD", "GBPJPY", "GBPCHF"
      14. };
      15. IndicatorDigits(Digits + 5);
      16. int PeriodNumber(int number)
      17. { int period_min;
      18. switch ( number )
      19. { case 0 : period_min = PERIOD_M1 ; break;
      20. case 1 : period_min = PERIOD_M5 ; break;
      21. case 2 : period_min = PERIOD_M15; break;
      22. case 3 : period_min = PERIOD_M30; break;
      23. case 4 : period_min = PERIOD_H1 ; break;
      24. case 5 : period_min = PERIOD_H4 ; break;
      25. case 6 : period_min = PERIOD_D1 ; break;
      26. default: period_min = PERIOD_D1 ; break;
      27. }
      28. return(period_min);
      29. }
      30. void Indicators_output(string SymbolName, int PeriodMinutes)
      31. { int size = iBars(SymbolName, PeriodMinutes);
      32. if ( size == 0 )
      33. return;
      34. int handle = FileOpen(SymbolName + PeriodMinutes + "_Indicators.csv", FILE_WRITE | FILE_CSV);
      35. if ( handle < 0 )
      36. return;
      37. FileWrite(handle, "Time seconds;Time;Open;Low;High;Close;Volume;ATR");
      38. for ( int i = size - 1; i >= 0; i -- )
      39. { FileWrite(handle
      40. , iTime (SymbolName, PeriodMinutes, i), TimeToStr(iTime(SymbolName, PeriodMinutes, i))
      41. , iOpen (SymbolName, PeriodMinutes, i)
      42. , iLow (SymbolName, PeriodMinutes, i)
      43. , iHigh (SymbolName, PeriodMinutes, i)
      44. , iClose (SymbolName, PeriodMinutes, i)
      45. , iVolume(SymbolName, PeriodMinutes, i)
      46. , iATR (SymbolName, PeriodMinutes, 14, i));
      47. }
      48. FileClose(handle);
      49. }
      50. int start()
      51. { int SymbolCounter, PeriodCounter;
      52. for ( SymbolCounter = 1; SymbolCounter < 13; SymbolCounter ++ )
      53. for ( PeriodCounter = 2; PeriodCounter <= 6; PeriodCounter ++ )
      54. Indicators_output(SymbolsArray[SymbolCounter], PeriodNumber(PeriodCounter));
      55. return(0);
      56. }

      Entsprechend der in MQL4 vorgegebenen Bedeutung der Event-Funktionen kann die oben definierte Funktion start() nur beim Einsatz als Skript einen vernünftig brauchbaren Output liefern. Bei einem Skript wird die Funktion start() nur einmal abgearbeitet, es wird also nichts fortlaufend aktualisiert.

      Dazu wäre ein Customindikator nötig, bei dem die Funktion start() bei jedem neuen Tick von MT4 automatisch erneut aufgerufen wird. Die jetzt in start() definierte Ausgabe der Werte für die schon in der History gespeicherten "alten" Ticks wäre in einem Customindikator besser in der Funktion init() aufgehoben.

      Die erforderliche Machart zur Ausgabe von Indikatoren zeigt sich in Zeile 58, die die explizit ausprogrammierte Ausgabe eines einzelnen Indikatorwertes bewirkt und für jeden anderen Indikator oder jede andere Parametrisierung des Indikators hinzugefügt werden müßte.

      Indikatorenwerte an Excel senden

      Hallo, unter der Postnummer 1748 hat trash ein Skript gepostet, welches wohl dazu dienen soll die Werte von Indikatoren in Excel zu übernehmen, meine Frage hierzu war nur ob dies sich auch alleine aktualisiert, ja nach angebener Zeiteinstellung. Hat jemand Erfahrung oder arbeitet mit diesem oder auch einem anderen Skript ?

      Gruß Mike

      Re: Indikatorenwerte vom MT4 in Excel exportieren

      Die MT4-History (.hst-Files in den Unterordnern von <MT4-Installationsverzeichnis>\history) speichert nur OHLCV-Daten und keine Indikatoren. Eine kundenspezifische Konfiguration für weitere zu speichernde Daten ist nicht vorgesehen.

      Das ist kein Mangel, da Indikatoren in späteren Backtests oft modifiziert und neu kombiniert werden und dazu aus den zu Grunde liegenden Kursdaten ohne Probleme neu errechnet werden können.

      Wenn die Speicherung von Indikatoren in Files gewünscht ist, muß diese in MQL4 selbst programmiert werden. In vielen Fällen dürfte aber die vollständige Ausführung der gesamten Auswertung innerhalb der MT4-Umgebung eine pragmatischere Wahl sein.

      Die Daten in den entsprechenden Files im Filesordner werden genau so aktualisiert, wie man es programmiert hat (ggf. ein unmittelbares Schreiben mit FileFlush() erzwingen). Bei der Nutzung in Realtime ist noch ein wenig Code hinzufügen, um nur die gewünschten Werte einmal pro aufzuzeichnender Periode in das File zu schreiben, da Indikatoren bei jedem Tick neu berechnet werden, so aber - bis auf wenige spezielle Anwendungsfälle - wohl eher nicht gespeichert werden sollen.

      Indikatorenwerte vom MT4 in Excel exportieren

      Hallo Leute,

      weiter hinten habe ich gelesen das sich mit diesem Thema schon beschäftig wurde, meine Frage ist aktualisieren
      sich die Daten in den Filesordner automatisch, so das immer der aktuelle Stand von einem Indikator angezeigt wird oder kommen immer nur die bis dahin historischen Daten da rein, denn ich habe das Problem das sich da nichts automatisch ändert, für einen kleinen Tip wäre ich dankbar

      Gruß Mike
      Der zweite gepostete Indikator liest sich extrem nützlich, vor allem weil er auch die Delay-Time misst! Allerdings kann ich selbst nach Registrierung dort weder das Attachement downloaden, noch ein Posting verfassen um diese Einschränkungen aufzuheben. Haben wir einen User der sich dort schon bewährt hat und mir diesen Indikator schicken könnte bitte?
      Der Autor ist in den besprochenen Werten zumeist selbst investiert. Traden auf eigene Gefahr, Signale sind aktuell großteils experimentell zwecks Challenge "In 30 Tagen zur Trading Strategie".
      Plane deinen Trade, trade deinen Plan!
      If it´s not a HELL YES, it´s a NO!