Alles um Metatrader 4.0 - Handelsmethoden und Indikatoren

      One-Klick-Buttons selbstgemacht

      Nochmals zur MT4GUI. Ich habe die DLL nicht benutzen können oder wollen, und zwar nicht nur weil sie nicht Thread Safe ist, sondern weil der Code nicht einsehbar ist.

      Um jedoch MT4 zu einem Button zu verhelfen der den Klick sofort durchreicht, ohne das es erst einen Tick vom MT4 bedarf, ist eine DLL nötig die zwischen dem Programm schaltet. Diese habe ich dann doch noch im Netz finden können:
      forexfactory.com/showthread.php?t=361861

      Die DLL ist einsehbar und man kann, sofern man Lust hat, sie neukompilieren.

      Ich selbst habe den Indikatorcode einfach nach meinen Wünschen abgeändert, wichtig war halt die lbuttondown() Funktion um den Klick im Chart platzieren zu können. Dann sollte bei den Funktionen makeControls() und updateControls() die entsprechenden Labels und Buttons kreiert werden.

      Um die Buttons auf den Chart zu bringen habe ich eine Funktion benutzt die Wingdings verwendet:

      Quellcode

      1. void DrawCell(int nWindow, string nCellName, double nX, double nY, double nWidth, double nHeight, color nColor)
      2. {
      3. double iHeight, iWidth, iXSpace;
      4. int iSquares, i;
      5. if(nWidth > nHeight)
      6. {
      7. iSquares = MathCeil(nWidth/nHeight); // Number of squares used.
      8. iHeight = MathRound((nHeight*100)/77); // Real height size.
      9. iWidth = MathRound((nWidth*100)/77); // Real width size.
      10. iXSpace = iWidth/iSquares - ((iHeight/(9-(nHeight/100)))*2);
      11. for(i=0;i<iSquares;i++)
      12. {
      13. ObjectDelete(nCellName+i);
      14. ObjectCreate (nCellName+i, OBJ_LABEL,nWindow,0,0);
      15. ObjectSetText (nCellName+i, CharToStr(110),iHeight, "Wingdings", nColor);
      16. ObjectSet (nCellName+i, OBJPROP_CORNER, 1);
      17. ObjectSet (nCellName+i, OBJPROP_XDISTANCE,nX + iXSpace*i);
      18. ObjectSet (nCellName+i, OBJPROP_YDISTANCE,nY);
      19. ObjectSet (nCellName+i, OBJPROP_BACK, true);
      20. }
      21. }else{
      22. iSquares = MathCeil(nHeight/nWidth); // Number of squares used.
      23. iHeight = MathRound((nHeight*100)/77); // Real height size.
      24. iWidth = MathRound((nWidth*100)/77); // Real width size.
      25. iXSpace = iHeight/iSquares - ((iWidth/(9-(nWidth/100)))*2);
      26. for(i=0;i<iSquares;i++)
      27. {
      28. ObjectDelete(nCellName+i);
      29. ObjectCreate (nCellName+i, OBJ_LABEL,nWindow,0,0);
      30. ObjectSetText (nCellName+i, CharToStr(110),iWidth, "Wingdings", nColor);
      31. ObjectSet (nCellName+i, OBJPROP_CORNER, 1);
      32. ObjectSet (nCellName+i, OBJPROP_XDISTANCE,nX);
      33. ObjectSet (nCellName+i, OBJPROP_YDISTANCE,nY + iXSpace*i);
      34. ObjectSet (nCellName+i, OBJPROP_BACK, true);
      35. }
      36. }
      37. }


      Falls jemand fragen zur Herangehensweise hat, einfach hier im Forum melden. Ich werde dann soweit mir möglich Hilfestellung leisten.
      Bilder
      • 2013-02-14_152902.png

        12,36 kB, 916×504, 362 mal angesehen
      Dateien
      • Z.zip

        (34,31 kB, 213 mal heruntergeladen, zuletzt: )

      vikke schrieb:

      janson schrieb:

      Zwischenfrage bzgl. MQL:

      Wenn man nun als Programmieranfänger erste Erfahrungen in Python gesammelt hat, kann man sich dann gleich auf MQL stürzen oder besser noch kurz in die Basics von C einarbeiten?


      Also ich kann dir diese beiden Bücher empfehlen:

      amazon.de/C-Programmieren-Anfa…Erlenkötter/dp/3499600749

      amazon.de/Grundkurs-C-Programm…p_b_1/276-7351453-7030455

      Das erste Buch ist sehr einfach geschrieben, das zweite geht etwas mehr ins Detail, sind trotzdem beides Anfängerbücher. Mit täglich 2-3 Stunden sollte das erste Buch in 6 Wochen locker durch sein. Wolf erklärt die Sachen in seinem Buch dann teils anders, was zur weiteren Verständlichkeit beiträgt.

      Ich selbst habe jeweils nur die Hälfte durch und kann in MQL schon einiges mehr darstellen als ich mir es hätte glauben können.



      Danke, gebookmarkt.

      Lerne aber weniger über Bücher, sondern über MOOCs. Das klappt recht gut. Ein echtes Hardcoverbuch benutze ich nur als Art Handbuch (Ge-Packt) zum schnellen Nachschlagen und ansonsten einen eigenen Ordner mit Mitschriften aus den Vorlesungen.

      Ich schließe jetzt noch nen Kurs in Python ab und dann dachte ich mir, dass ich in die C-Programmierung mit dem CS50-Harvardkurs auf EDX.org einsteige. Meint ihr, dass die vermittelten Grundlagen (bis Woche sieben geht es nur um C-Programmierung) ausreicht um in AFL/MQL zurechtzukommen?


      EDIT: @vikke. für C# bieten sich auch die Informatikvorlesungen von Jörn Loviscach an. Der Mann kann hervorragend unterrichten. Sein Youtubekanal ist auch sonst sehr empfehlenswert. j3l7h.de/videos.html
      Hallo Krümel,

      danke für deine schnelle und prompte Hilfe. Der Indikator mit den Kästchen, ist mir zu bunt ich habe lieber freie Sicht
      mein Chartfenster.

      Jetzt mal testen, auf Tag und Woche gefällt er mir nicht so gut. Auf Monat auf Woche auch nicht, also kann ich das vergessen. Schade,
      sah vielversprechend aus. Vielleicht findet sich noch etwas.

      Ging ruckzuck mit der Hilfe, dafür habe ich mein "Like it" Button gedrückt!

      Jod

      Krümel schrieb:

      @JodS11Körnchen

      Besten Dank für die Namensgebung, aber ich hab's ja lediglich implementiert ;).


      Zu Deiner Frage:
      Du hast ja, wie ich sehe, den ersten Entwurf mit den Linien verwendet und nicht den Code mit den Flächen aus Post 2060. Ich hoffe, das ist beabsichtigt ;). Wie gesagt, das war ein erster Entwurf. Ich iteriere mich ja meist an die Endlösung ran.

      Und ja, größere Timeframes sollten ebenfalls möglich sein. Entweder die entsprechende PERIOD_ eingeben (siehe Bild1) oder die entsprechende Zahl. Die Hilfe zu einem Keyword findet man am schnellsten, wenn man mit der Maus auf ein Keyword klickt (z.B. Period_H1). Ansonsten navigiert man leider oft ewig bis man das Richtige findet.

      Bild 1
      candletalk.de/attachment/19581/


      Bild 2 (Anzeige mit Woche: PERIOD_W1 bzw. alternativ 10080)
      candletalk.de/attachment/19582/

      Andere Timeframes als in der Tabelle der Hilfe stehen bietet MT nicht an. Wenn man das möchte, muss man den Code umschreiben.
      Die wichtigsten 4 Tugenden eines Traders: Mut zum freiwilligen Verzicht, innere Ausgeglichenheit, Beständigkeit und Duplizierbarkeit.

      janson schrieb:

      Zwischenfrage bzgl. MQL:

      Wenn man nun als Programmieranfänger erste Erfahrungen in Python gesammelt hat, kann man sich dann gleich auf MQL stürzen oder besser noch kurz in die Basics von C einarbeiten?


      Also ich kann dir diese beiden Bücher empfehlen:

      amazon.de/C-Programmieren-Anfa…Erlenkötter/dp/3499600749

      amazon.de/Grundkurs-C-Programm…p_b_1/276-7351453-7030455

      Das erste Buch ist sehr einfach geschrieben, das zweite geht etwas mehr ins Detail, sind trotzdem beides Anfängerbücher. Mit täglich 2-3 Stunden sollte das erste Buch in 6 Wochen locker durch sein. Wolf erklärt die Sachen in seinem Buch dann teils anders, was zur weiteren Verständlichkeit beiträgt.

      Ich selbst habe jeweils nur die Hälfte durch und kann in MQL schon einiges mehr darstellen als ich mir es hätte glauben können.

      Re: C vor MQL lernen?

      Perfect Trader schrieb:

      Ob man sich dazu vorher noch C einzieht, hängt davon ab, wie aufgeschlossen man dem Lernen von Programmier-Sprachen gegenüber steht.

      Generell bin ich neuen Programmiersprachen sehr aufgeschlossen, möchte aber eben auch größere Umwege vermeiden. Genau die Frage ob nun C oder C# der effizientere nächste Schritt wäre, hat mich gestern die ganze Nacht beschäftigt.

      Ich würde gerne mit dem Amibroker als Backtestingsoftware arbeiten (den ich im Sommer nach einem Trial wieder verworfen hatte, weil als Chartsoftware nicht so effizient und simple wie der MT zu händeln ist) und als Chartingsoftware weiterhin den MT verwenden und in MQL muss auch nichts Großartiges programmiert werden. AFL und MQL basieren beide auf C, bei diesem Weg wäre also C die Lösung.

      Auf der anderen Seite ist C# als reine Programmiersprache an sich allgemein auch sicherlich nützlicher (weil universeller) und man müsste auch nicht extra spezielle Varianten von C# lernen (wie AFL und MQL als Varianten von C) um sie tradingtechnisch einsetzen zu können. Aber nach meiner Recherche ist die Kundenzufriedenheit bei AB um Welten besser als bei NT. Wealthlab habe ich bisher noch gar nicht in Betracht gezogen (werde ich nachholen).

      Andererseits ist wohl nicht viel verloren, wenn man mit C anfängt und sich dann doch für C# entscheiden sollte. Und Zeitdruck habe ich ja eigentlich nicht, wobei die Motivation durch sich einstellende Ergebnisse schon wichtig ist. Wahrscheinlich werden im Laufe der Zeit eh noch weitere Programmiersprachen folgen. Aktuell liegt die Idee mit AB + MT vorne.
      @JodS11Körnchen

      Besten Dank für die Namensgebung, aber ich hab's ja lediglich implementiert ;).


      Zu Deiner Frage:
      Du hast ja, wie ich sehe, den ersten Entwurf mit den Linien verwendet und nicht den Code mit den Flächen aus Post 2060. Ich hoffe, das ist beabsichtigt ;). Wie gesagt, das war ein erster Entwurf. Ich iteriere mich ja meist an die Endlösung ran.

      Und ja, größere Timeframes sollten ebenfalls möglich sein. Entweder die entsprechende PERIOD_<TF> eingeben (siehe Bild1) oder die entsprechende Zahl. Die Hilfe zu einem Keyword findet man am schnellsten, wenn man mit der Maus auf ein Keyword klickt (z.B. Period_H1). Ansonsten navigiert man leider oft ewig bis man das Richtige findet.

      Bild 1



      Bild 2 (Anzeige mit Woche: PERIOD_W1 bzw. alternativ 10080)


      Andere Timeframes als in der Tabelle der Hilfe stehen bietet MT nicht an. Wenn man das möchte, muss man den Code umschreiben.
      Hallo Krümel,

      Ich würde gerne höher als 1440 gehen, ist das auch möglich? Bei mir zeigt er wenn ich zweit Tage nehme, keine Daten mehr an. Sagst du mir, was ich im Code verändern muß, damit
      ich weiter mit ihm Test durchgehen kann, wäre sehr freundlich von dir. Besten Dank für deine Arbeit und Bemühungen.
      Ich habe den Indikator deinen Namen gegeben, KRÜMEL. ;)

      Jod.

      Mit Linien statt Flächen könnte ich es aktuell schon anbieten, aber als Fläche wehrt sich der Indikator noch. Kann sich nur noch um Stunden handeln. Ich merke auch grad wieder, warum ich so ungern MQL programmiere. Das ist immer so wie Ess-Stäbchen mit der Axt schnitzen. :S

      Krümel schrieb:




      Brainfuck-Quellcode

      1. //+------------------------------------------------------------------+
      2. //| TwoInOneTimeframesIndicator.mq4 |
      3. //| Krümel |
      4. //| www.candletalk.de |
      5. //+------------------------------------------------------------------+
      6. #property copyright "Krümel "
      7. #property link "www.candletalk.de"
      8. #property indicator_buffers 2
      9. #property indicator_chart_window
      10. #property indicator_color1 Red
      11. #property indicator_color2 Green
      12. #property indicator_width1 1
      13. #property indicator_width2 1
      14. //Verschieben der High/Low-Werte des übergeordneten TFs (pos. Werte schieben nach rechts)
      15. //Bsp. higherLevelTimeframeShift = 1 zeigt HL-Werte der vorangegangenen Periode an
      16. extern int higherLevelTimeframeShift =0;
      17. //Anzahl der Perioden des übergeordneten TFs, die zurückliegend angezeigt werden
      18. //sollen,.
      19. //Bsp. NBarsInHigherLevelTimeframe =1; zeigt nur die aktuelle (meist noch
      20. //unvollständige Periode
      21. extern int NBarsInHigherLevelTimeframe =5;
      22. //übergeordneter TF, s. Metatrader-Hilfe für die Konstanten, oder aber
      23. //Integers einsetzen, H1 = 60, M5 = 5, D1 = 1440 usw.
      24. extern int higherLevelTimeframe = PERIOD_H1;
      25. //Interne Buffers
      26. double highs[];
      27. double lows[];
      28. //+------------------------------------------------------------------+
      29. //| Custom indicator initialization function |
      30. //+------------------------------------------------------------------+
      31. int init()
      32. {
      33. //---- indicators
      34. SetIndexBuffer(0,highs);
      35. SetIndexBuffer(1,lows);
      36. SetIndexStyle(0,DRAW_LINE);
      37. SetIndexStyle(1,DRAW_LINE );
      38. //----
      39. return(0);
      40. }
      41. //+------------------------------------------------------------------+
      42. //| Custom indicator iteration function |
      43. //+------------------------------------------------------------------+
      44. int start()
      45. {
      46. int counted_bars=IndicatorCounted();
      47. //----
      48. int i=0;
      49. int shift=0;
      50. int time = 0;
      51. double timeframeFactor = (double) higherLevelTimeframe/ Period();
      52. double NBars = NBarsInHigherLevelTimeframe * timeframeFactor;
      53. //Reset für alte Daten
      54. for (i=Bars-1; i>= 0; i--) {
      55. highs[i]=EMPTY_VALUE;
      56. lows[i]= EMPTY_VALUE;
      57. }
      58. //Update
      59. for (i=NBars-1; i>=0; i--)
      60. {
      61. //aktuelle Zeit im untergéordneten TF
      62. time = Time[i];
      63. //dazugehörigen Bar der übergeordneten Zeiteinheit suchen
      64. shift=iBarShift(Symbol(),higherLevelTimeframe,Time[i])+higherLevelTimeframeShift;
      65. //wenn die max. Anzahl an Bars im übergeordneten TF abgearbeitet sind, dann abbrechen
      66. //kann der Fall sein bei angefangenen TFs
      67. if (shift < NBarsInHigherLevelTimeframe +higherLevelTimeframeShift) {
      68. //Highs und Lows übernehmen in die Indikatorbuffer
      69. highs[i]= iHigh(Symbol(),higherLevelTimeframe,shift) ;
      70. lows[i] = iLow(Symbol(),higherLevelTimeframe,shift) ;
      71. }
      72. }
      73. return(0);
      74. }
      75. //+------------------------------------------------------------------+


      Hab noch ein paar Parameter eingebaut (siehe Beschreibung im Code), damit es etwas universeller ist.

      Krümel schrieb:

      Mit Linien statt Flächen könnte ich es aktuell schon anbieten, aber als Fläche wehrt sich der Indikator noch. Kann sich nur noch um Stunden handeln. Ich merke auch grad wieder, warum ich so ungern MQL programmiere. Das ist immer so wie Ess-Stäbchen mit der Axt schnitzen. :S



      Brainfuck-Quellcode

      1. //+------------------------------------------------------------------+
      2. //| TwoInOneTimeframesIndicator.mq4 |
      3. //| Krümel |
      4. //| www.candletalk.de |
      5. //+------------------------------------------------------------------+
      6. #property copyright "Krümel "
      7. #property link "www.candletalk.de"
      8. #property indicator_buffers 2
      9. #property indicator_chart_window
      10. #property indicator_color1 Red
      11. #property indicator_color2 Green
      12. #property indicator_width1 1
      13. #property indicator_width2 1
      14. //Verschieben der High/Low-Werte des übergeordneten TFs (pos. Werte schieben nach rechts)
      15. //Bsp. higherLevelTimeframeShift = 1 zeigt HL-Werte der vorangegangenen Periode an
      16. extern int higherLevelTimeframeShift =0;
      17. //Anzahl der Perioden des übergeordneten TFs, die zurückliegend angezeigt werden
      18. //sollen,.
      19. //Bsp. NBarsInHigherLevelTimeframe =1; zeigt nur die aktuelle (meist noch
      20. //unvollständige Periode
      21. extern int NBarsInHigherLevelTimeframe =5;
      22. //übergeordneter TF, s. Metatrader-Hilfe für die Konstanten, oder aber
      23. //Integers einsetzen, H1 = 60, M5 = 5, D1 = 1440 usw.
      24. extern int higherLevelTimeframe = PERIOD_H1;
      25. //Interne Buffers
      26. double highs[];
      27. double lows[];
      28. //+------------------------------------------------------------------+
      29. //| Custom indicator initialization function |
      30. //+------------------------------------------------------------------+
      31. int init()
      32. {
      33. //---- indicators
      34. SetIndexBuffer(0,highs);
      35. SetIndexBuffer(1,lows);
      36. SetIndexStyle(0,DRAW_LINE);
      37. SetIndexStyle(1,DRAW_LINE );
      38. //----
      39. return(0);
      40. }
      41. //+------------------------------------------------------------------+
      42. //| Custom indicator iteration function |
      43. //+------------------------------------------------------------------+
      44. int start()
      45. {
      46. int counted_bars=IndicatorCounted();
      47. //----
      48. int i=0;
      49. int shift=0;
      50. int time = 0;
      51. double timeframeFactor = (double) higherLevelTimeframe/ Period();
      52. double NBars = NBarsInHigherLevelTimeframe * timeframeFactor;
      53. //Reset für alte Daten
      54. for (i=Bars-1; i>= 0; i--) {
      55. highs[i]=EMPTY_VALUE;
      56. lows[i]= EMPTY_VALUE;
      57. }
      58. //Update
      59. for (i=NBars-1; i>=0; i--)
      60. {
      61. //aktuelle Zeit im untergéordneten TF
      62. time = Time[i];
      63. //dazugehörigen Bar der übergeordneten Zeiteinheit suchen
      64. shift=iBarShift(Symbol(),higherLevelTimeframe,Time[i])+higherLevelTimeframeShift;
      65. //wenn die max. Anzahl an Bars im übergeordneten TF abgearbeitet sind, dann abbrechen
      66. //kann der Fall sein bei angefangenen TFs
      67. if (shift < NBarsInHigherLevelTimeframe +higherLevelTimeframeShift) {
      68. //Highs und Lows übernehmen in die Indikatorbuffer
      69. highs[i]= iHigh(Symbol(),higherLevelTimeframe,shift) ;
      70. lows[i] = iLow(Symbol(),higherLevelTimeframe,shift) ;
      71. }
      72. }
      73. return(0);
      74. }
      75. //+------------------------------------------------------------------+


      Hab noch ein paar Parameter eingebaut (siehe Beschreibung im Code), damit es etwas universeller ist.
      Die wichtigsten 4 Tugenden eines Traders: Mut zum freiwilligen Verzicht, innere Ausgeglichenheit, Beständigkeit und Duplizierbarkeit.
      @PT
      Na ja, ich seh schon, Du hast die Webinare nicht gesehen, daher muss ich wohl noch etwas weiter ausholen als erhofft ;). Herr Cene setzt den Indikator eher didaktisch ein (zumindest seh ich das so): er gibt sich ja wirklich allergrößte Mühe, den Leuten möglichst anschaulich die verschiedenen Konzepte zu erklären, auch wenn es immer einige geben wird, denen es nie perfekt genug sein kann (Schönen Gruß an dieser Stelle an meinen Ex-Prof).

      Und den MyDailyQuoteMoves nimmt er meist, um das Prinzip "Gewinne laufen lassen, Verluste reduzieren"- Konzept zu erläutern und auch, um die Zusammensetzung der getätigten Trades zu bestimmen, damit man nicht mit falschen Erwartungen rangeht. Ein Großteil der Trades sind kleine Gewinne/Verluste/Breakeventrades, die großen fiesen Gegenbewegungen (bei entsprechender Positionierung) müssen vermieden werden durch entsprechende Stoppwahl (Außenstab-Trailing, IR-Beibehaltung). Die relativ wenigen großen Bewegungen in die Traderichtung müssen/können (wenn man die Grundtechniken beherrscht und geübt hat) entsprechend durch Pyramidierung "gehebelt" werden. Letzlich kann man das natürlich auch mit Histogrammen und "wir schneiden an der einen Seite was ab usw". erklären, macht er halt aber nicht. Wichtig ist daher das "Durchhandeln" und nicht nach Lust und Laune mal auszusetzen, da man diese großen Bewegungen braucht, weil die für die Performance bedeutsam sind, wohingegen sich die Mehrheit der Trades mehr oder weniger aufheben.

      Außerdem kann man so auch seine Gewinnerwartungen für entsprechende Zeiträume relativieren. Im M15 wird man recht selten Bewegungen derselben Größe (in absoluten Werten) rausholen wie im Wochenchart bspw. Und ja, THEORETISCH kann man hier natürlich argumentieren, dass das ja bei Hurst gen 0 doch der Fall wäre (antipersistente Märkte), aber PRAKTISCH kenne ich keine Märkte, die er be/handelt, bei denen das der Fall ist. Und selbst wenn, würde man ja genau das mit dem Indikator sehen können, nämlich wenn die Bewegungen in den größeren TFs nicht größer werden (Skalierung mittels Hurst-EXPONENT) als in den kleineren TFs. Selbstähnlichkeit vorausgesetzt. Aber mangels Varianz-Stationarität (zumindest in den von mir untersuchten Werten) ist die Anwendung des Hurstexponenten sowieso nicht allzu trivial und irgendwas, womit man Anfänger überfordern müsste. Meines Erachtens gehst auch Du zu leichtfertig mit der Verletzung der mathematischen Voraussetzungen um, aber das will ich hier nicht vertiefend diskutieren, wenn es für Dich passt, ist es doch ok. Pi mal Daumen ist ja oft gut genug. Wer lange genug am Ball bleibt, interessiert sich vielleicht früher oder später auch für solche Themen, ich fürchte aber, die meisten erleben das eh nicht.

      zur Bedeutung des Open: Das ist schon korrekt, was Du angemerkt hast, Aber.... ganz großes Aber:
      der Open-Kurs ist bei dem von Erdal Cene vorgestelltem Ansatz schon bedeutsam, weil es der Trade-Entry/Exit (beim Umkehrkerzen-Close)-Zeitpunkt ist. Man wartet ja - außer in dem Falle, wo man ausgestoppt wird, stets die Close-Zeitpunkte ab und handelt DANN entsprechend. Der nächstmögliche Zeitpunkt ist nun mal der Open der Folgekerze. Dass die Open-Kurse mehr oder weniger arbiträr sind und schon allein durch die Bildung der Kerze durch den Provider schwanken können (Alpari Demo aggregiert 0-4, Saxo 1-5 im M5) ist aus didaktischen Gründen aus meiner Sicht irrelevant. Wie gesagt, der Indikator dient im Rahmen der Webinare eher als didaktisches Hilfsmittel.

      Erdal Cene verwendet in einigen Webinaren nachfolgenden Indikator, den ich mal nachprogrammiert habe. Er ist relativ einfach: der Open einer Kerze wird als "Null"-Linie gewertet und die nachfolgenden Werte entsprechend daran ausgerichtet. Man erkennt so relativ zügig, wie ich finde, was man so im jeweiligen Chart an Bewegungen erwarten kann - auch im Vergleich zu den Tagen zuvor bspw.

      Vielleicht kann ja jemand von Euch was damit anfangen ;).

      Dateien
      Hab leider eine Version zu früh hochgeladen, da waren die Farben noch fest reingecodet und nicht einstellbar. Daher nochmal schnell ein Update MIT konfigurierbaren Farben.


      (Ja, PT, Github wäre sicherlich eine bessere Lösung. Von dort müssten es sich die Leute aber auch mehrfach runterladen, von daher ist es in jedem Fall suboptimal gelaufen ;) ).
      Dateien