Amibroker AFL

      Danke, keine Ursache. Ein Forum besteht ja aus geben und nehmen. Nicht nur ein Forum. Auf jeden Fall wäre ein Forum ohne (sinnvollen) Input ein totes Forum. Und für ein Forum wie dieses, welches ich im dt. sprachigen Raum als vielleicht bestes in Sachen Trading und Börse betiteln würde, mache ich das gerne, wenn's die Zeit hergibt.
      "I'm a trader, baby. So, why don't you kill me?!"
      Zurück aus der Schänke und mit letzter Kraft zum Endspurt ... ;)

      Zum letzen Posting ist noch zu sagen, dass es so auf alle Fälle funktioniert und man ein grünes Connectzeichen unten rechts erhält (ich habe es extra zur Sicherheit noch mal frisch in einer VM ausprobiert, um zu überprüfen, ob ich was vergessen habe). Wenn es nicht funktionert hat, stimmte beim Er- und Einstellungsvorgang etwas nicht. Also noch mal überprüfen, vor allem die Configure DDE plugin Einstellungen. Beim ersten Mal des Startens beider Programme kann man so vorgehen, dass man zuerst Metatrader und danach AB startet, dann ersprart man sich den Connectvorgang unten rechts im AB, da er beim Starten diesen Vorgang automatisch ausführt und die Ampel auf grün schaltet. Zu erwähnen wäre noch, dass DDE Server in den MT4 settings aktiviert sein muss. Bei wem es absolut nicht klappen sollte, demjenigen kann ich auch eine Grund Database dafür hochladen, die nur noch erweitert und aktualisert werden muss.

      Nun zum Historienimport von MT4 Daten







      Die vorherigen Bilder waren alle selbsterklärend. Zu den letzten beiden Bildern wäre zu sagen, dass man nun beim nächsten Backfill nicht mehr den Wizard benötigt für den Mt4 Import, sondern nun geschieht das Ganze über die Import ASCII Funktion, denn wir haben ja eine Formatdatei dafür erstellt. Muss man das Ganze noch automatisieren? Könnte man sicherlich, aber es handelt sich ja hier im besten Falle nur um einen einmaligen Prozess am Tag, der in ein paar Sekunden erledigt ist. Für den Auto backfill gibt es, wie erwähnt, das Metatrader Plugin in der Files Section der AB Yahoogroups.



      Für das Erstellen anderen Formatdateien anderen Programme schaut einfach hier nach amibroker.com/guide/d_ascii.html , welche natürlich, wie vorher gesehen, auch über den Import Wizard erstellt werden können.

      PS: Import Wizard und Ascii import können auch über Tools>Customize>Command>File auf die Toolbar als Button gezogen werden, falls sie nicht schon by default dort sind, weiß ich nicht mehr. amibroker.com/video/CustomButton.html

      Nun noch zu ein paar Einstellungen in Tools>Preferences. Standardmäßig ist in den intraday Einstellungen als Aktualisierungsinterval 3 Sekunden eingestellt. Das muss also mit 0 ausgetauscht werden. Restliche Einstellungen


      Für FX und das Anzeigen aller 3 bis 5 Nachkommastellen, muss man hier noch die Werte austauschen.


      Sollte es bei irgendetwas Probleme geben, dann keine Scheu zu fragen.
      "I'm a trader, baby. So, why don't you kill me?!"
      Ich erkläre hier mal, wie man AB z.B. mit einer Datenquelle wie MT4 verbindet (über DDE).

      Zuerst müssen wir eine Database erstellen, siehe erstes Bildchen

      Nun klicken wir Browse, um einen Ordner (den wir eventuell schon vorher erstellt haben) auszuwählen.
      Dieser Ordner kann sich an einem beliebigen Ort auf der Festplatte befinden. Vollkommen egal wo.

      Wir wählen also nun unseren DDE Ordner aus.

      Hier war viel Platz im Bild. Frech wie ich bin, musste ich da gleich mehr reinschreiben.

      Nächstes Bild sollte klar sein. Auf Create klicken nicht vergessen, wenn alles fertig ist.

      Mit welcher Database beim Öffnen für AB gestartet werden soll, kann auch in den Preferences von AB jederzeit festgelegt werden.

      Number of bars 50000 ist hier nur ein Bsp.

      Im oberen Bild klicken wir nun auf Intraday Settings.
      Auch wenn die Auftrennung in Day session und Night session nicht gewählt ist, sollten Minuten von :30 auf :00 geändert werden, da sonst, auch wenn 24h ausgewählt ist, der Stundenchart von :30 - :29 läuft. Man will aber f. den Stundenchart eine normale volle Stunde von :00 - :59, normalerweise.
      Timeshift wird hier im Bsp für EST nach MEZ gleich +6 gewählt. MEZ nach MEZ natürlich gleich 0. Alles ok? Dann OK klicken.

      Wenn alles passt, klicken wir unten rechts noch auf Configure.

      Die nächsten zwei Bildchen sind wieder selbsterklärend.
      Die -6 gelten hier nur wieder für den Spezialfall andere Zeitzone der Datenquelle. Ansonsten steht dort 0.


      Da wir noch kein Underlying angegeben haben und AB somit nicht weiß, was er von der Quelle laden soll, müssen wir den Namen des Underlings in der AB Toolbar eingeben und mit Enter bestätigen. Der Name muss der selbe sein, wie er auch bei der Quelle lautet. Beim MT4 wäre das z.B. EURUSD als Bspname.

      nun noch bestätigen

      Hoppla, ja was denn nun? Ist ja garnichts drin. Kaputt? Ja, Historie kaputt = fehlend. Das interne DDE Plugin hat leider keinen Auto-Backfill. Ein Mt4 Plugin mit Auto-Backfill gäbe es in den Yahoo groups von Amibroker zuzüglich Rateserver. Mit jenem ist aber keine tick Auswahl möglich.


      Betreffs Export MT4 google.com/images?hl=en&q=expo…i&biw=1240&bih=863&sout=1

      Im nächsten Posting erkläre ich dann den Historienimport, bzw die Erstbefüllung. Sowie einen Trick für weitere Befüllungen (nur benötigt, wenn AB vorher geschlossen war und er somit keine Realtimedaten empfangen hat). Desweiteren gibt es noch eine Einstellung in den Preferences zu beachten, damit die Daten auch wirklich in Realtime ankommen.

      Also, etwas Geduld, da mir vom vielen Schwätzen der Mund trocken geworden ist und ich erst mal bei unserem User Shakesbeer in die Schänke einkehren muss.

      to be continued....
      "I'm a trader, baby. So, why don't you kill me?!"
      Forex Trades & Talk

      BB H1 mit T3 Filter, im Chart unten rot. Weiss wäre einfach SMA * 12 im 5er (5 * 12 = 60) und Mattblau der BB aus dem vorherigen Posting

      Quellcode

      1. _SECTION_BEGIN("Bollinger Bands H1 T3");
      2. function T3(array, periods) //T3
      3. {
      4. s = Param("T3 Constant",0.9,0,2,0.001,0);
      5. periods = 2/(periods+1);
      6. e1 = AMA(array, periods);
      7. e2 = AMA(e1,Periods);
      8. e3 = AMA(e2,Periods);
      9. e4 = AMA(e3,Periods);
      10. e5 = AMA(e4,Periods);
      11. e6 = AMA(e5,Periods);
      12. c1 = -s*s*s;
      13. c2 = 3*s*s+3*s*s*s;
      14. c3 = -6*s*s-3*s-3*s*s*s;
      15. c4 = 1+3*s+s*s*s+3*s*s;
      16. Ti3 = c1*e6+c2*e5+c3*e4+c4*e3;
      17. return ti3;
      18. }
      19. TimeFrameSet( inHourly); //Multi Time Frame 1-h Bollinger
      20. P = ParamField("Price field BB60", -1);
      21. Periods60 = Param("Periods BB60", 20, 2, 300, 1 );
      22. Width60 = Param("Width BB60", 2, 0, 10, 0.05 );
      23. BBTop60 = BBandTop(P, Periods60, Width60);
      24. BBBot60 = BBandBot(P, Periods60, Width60);
      25. TimeFrameRestore();
      26. Color60 = ParamColor("Color60", colorRed );
      27. Style60 = ParamStyle("Style60");
      28. T3P = Param("Period T3",12,1,50,1);
      29. Plot( T3(TimeFrameExpand( BBTop60, inHourly ), T3P ), "\n" + "BBTop60" + "(" + Periods60 + "," + Width60+ ")", Color60, Style60 );
      30. Plot( T3(TimeFrameExpand( BBBot60, inHourly ), T3P ), "\n" + "BBBot60" + "(" + Periods60 + "," + Width60+ ")", Color60, Style60 );
      31. _SECTION_END();
      Bilder
      • BBH1T3.png

        26,97 kB, 1.197×753, 292 mal angesehen
      "I'm a trader, baby. So, why don't you kill me?!"
      In Bezug auf Remon's Frage Forex Trades & Talk

      MTF BBs hier H1

      mit Hilfe von timeframeset(), timeframerestore() sowie timeframeexpand()

      Quellcode

      1. _SECTION_BEGIN("Bollinger Bands H1");
      2. TimeFrameSet(inHourly);
      3. P = ParamField("Price field BB60", -1);
      4. Periods60 = Param("Periods BB60", 20, 2, 300, 1 );
      5. Width60 = Param("Width BB60", 2, 0, 10, 0.05 );
      6. BBTop60 = BBandTop(P, Periods60, Width60);
      7. BBBot60 = BBandBot(P, Periods60, Width60);
      8. TimeFrameRestore();
      9. Color60 = ParamColor("Color BB60", colorRed );
      10. Style60 = ParamStyle("Style BB60");
      11. Plot( TimeFrameExpand( BBTop60, inHourly ), "\n" + "BBTop60" + "(" + Periods60 + "," + Width60+ ")", Color60, Style60 );
      12. Plot( TimeFrameExpand( BBBot60, inHourly ), "\n" + "BBBot60" + "(" + Periods60 + "," + Width60+ ")", Color60, Style60 );
      13. _SECTION_END();
      "I'm a trader, baby. So, why don't you kill me?!"
      Habe mal versucht, einen Spread Indikator zu erstellen, hier im Bsp um den O. Spread zu tracken. Gehen tut das hier über die Funktionen GetRTData sowie StaticVar. Mit AddToComposite() könnte man das dann speichern.
      Bilder
      • Spread.png

        13,48 kB, 1.197×795, 279 mal angesehen
      "I'm a trader, baby. So, why don't you kill me?!"
      Hi, mir ist nicht ganz klar, ob man mit der Gratis-Version von dem NET-Warper (erster Link) Daten-Plugins entwickeln kann, oder ob man dafür die Bezahl-Version braucht. Der zweite Link funktioniert bei mir nicht. Das Original-Ami SDK (dritter Link) scheint für C++ gedacht zu sein, da kann ich leider wenig beitragen (C++ ist mir zu anstrengend).

      An Tools verwende ich nur VisualStudio (die Gratis Express-Versionen sollten ausreichen).

      Mit Neoticker habe ich MBT verkuppelt, da die mehr History haben und ich sowieso der Meinung bin, das ein zweiter Datenfeed vorteilhaft ist (vor allem OTC). Ich verwende das nur für Charts und Tabellen, Orders schicke ich manuell ab. Mit Oanda wäre das das selbe in grün.

      Mit der Oanda API habe ich ein kleines Frontend zur manuellen Order-Aufgabe entwickelt. Das rechnet die Positionsgrösse lt. Stop aus, setzt Bounds-Einstellungen für jeden Order, verhindert idiotische Orders(z.B. Tippfehler) hat eine cxl und reverse Funktion, ein paar automatische Exit-Strategien, schreibt Statistiken für jede Transaktion, usw. Solche Sachen halt.

      Von der Oanda API bekommst du nur realtime-Daten, ein bischen History (genau gleichviel wie im offiziellen Java-Client), kannst Konto-Informationen abfragen bzw. wirst über Fills informiert und kannst Orders aufgeben. Alles andere muss man selbst entwickeln. Es gibt rudimentäre Dokumentation und ein paar Samples .

      Auf einem Screenshot wirst du nicht viel sehen, das MBT-plugin hat nur ein kleines Fenster mit ein bischen Text-Ausgabe. Screens von meinem Oanda-Teil kann ich dir schicken, wenn dich das interressiert. Code-Schnipsel bei konkreten Fragen kannst du auch haben. Ich weiss nicht, wie sinnvoll es ist, den ganzen Sourcecode zu posten, es ist ellenslang, und äh, sagen wir, es wurde schon eleganteres C# geschrieben :)

      Die Frage, wie schwierig es ist, so ein Datenfeed-Plugin zu entwickeln, ist nicht einfach zu beantworten. Wenn du die Programmiersprache deiner Wahl einigermassen drauf hasst, ist es keine Hexerei. Ich würde mal sagen, Grundkenntisse incl. Threading-Modell (auf Grund der asynchronen Natur von realtime-Daten) sollten ausreichen. Bei dem Neo<->MBT Teil hatte ich ein gutes Sample, und das beschleunigt die Arbeit schon enorm.
      Purri, danke, für die Info! Für Amibroker wäre dann das z.B. nützlich sites.google.com/site/dotnetsdkforab/
      Doc docs.google.com/viewer?a=v&pid…FmNGExYjYzZWNkZWQ2<br /> Oder von AB amibroker.com/devlog/2006/12/1…ow-available-to-everyone/

      Hast du Lust/Interesse, einen Neoticker Thread zu eröffnen (Oder im Oanda Thread?), in dem du die Verbindung mit dem Oanda API schilderst (mit eins zwei Screens?). Was bekommt man von Oanda und was muss man hinzuprogrammieren? Welche Tools hast du verwendet? Hast du viele Täler des Schweißes und dessen Perlen durchschreiten müssen oder ging es schnurstracks und auf Engelsflügeln darüber hinweg? Bekommt man z.B. auch eine Dokumentation plus Samples dazu? Handelst du auch über Neoticker Richtung Oanda? Ich stoppe mal hier.

      Servus Remon, nein, der Backfill wird auch über diese Bridge erledigt. Es muss also keine Fremdhistorie geladen werden.
      "I'm a trader, baby. So, why don't you kill me?!"
      @Trash

      Ich nehme mal an, du bekommst deine Forexdaten über DDE Link. Wie machst du das mit dem Backfill um ständig eine lückenlose Historie zu erhalten? Oder nutzt du einen anderen Anbieter, der schon historische Kurse mit liefert?
      Servus Goso,

      nope, hier via MT4 (MT4 Bridge) als Lieferant, siehe Toolsaufruf im Bild. Habe mir auch schon überlegt, es über Oanda API zum Laufen zu bringen, aber dafür sind meine Kenntnisse noch zu rudimentär, um sowas zurechtzubasteln. Es ließe sich dann sicher auch etwas programmieren, um über AB Oanda Trades zu tätigen. Man lernt ja ständig dazu, aufgeschoben ist nicht aufgehoben. Wofür ist Evolution sonst von Nutzen. Gibt's jemand, der das Oanda API verwendet bzw über ein Programm wie AB einbindet?
      "I'm a trader, baby. So, why don't you kill me?!"
      Habe noch einen Zusatz vergessen einzufügen.
      In Zeile 9 des Scripts in #59 könnt ihr diese Zeile einfügen:

      Quellcode

      1. papp = ParamToggle("Plot all historical pivots","Off|On",1);


      Und in/ab Zeile 61 (über "style = ..." und unter "s3 = ....") fügt ihr diese Zeilen ein:

      Quellcode

      1. if(papp == 1 ){
      2. PP = PP * (Day() == LastValue(Day()));
      3. PP = IIf(PP,PP,Null);
      4. R1 = R1 * (Day() == LastValue(Day()));
      5. R1 = IIf(R1,R1,Null);
      6. S1 = S1 * (Day() == LastValue(Day()));
      7. S1 = IIf(S1,S1,Null);
      8. R2 = R2 * (Day() == LastValue(Day()));
      9. R2 = IIf(R2,R2,Null);
      10. S2 = S2 * (Day() == LastValue(Day()));
      11. S2 = IIf(S2,S2,Null);
      12. R3 = R3 * (Day() == LastValue(Day()));
      13. R3 = IIf(R3,R3,Null);
      14. S3 = S3 * (Day() == LastValue(Day()));
      15. S3 = IIf(S3,S3,Null);
      16. }


      Damit könnt ihr dann die historischen Linien außer denen vom aktuellen Tag auf Knopfdruck an-/abschalten, falls sie jemand stören sollten.

      "I'm a trader, baby. So, why don't you kill me?!"
      Ich habe mal einen Multi-Zeitzonen-Pivotindikator (f. allg. Pivots) gebastelt, auch weil ich noch keinen gefunden habe.
      Wenn die lokale Zeitzone MEZ ist, dann müsst ihr für GMT auf 23:00 in den Parameters schalten, für EST auf 06:00, usw usf
      Wer Fehler oder Vereinfachungen findet, dann bitte die Patschhändchen heben.

      Ihr benötigt noch das DeDateTime Plugin von der Amibrokerseite amibroker.org/3rdparty/

      Quellcode

      1. _SECTION_BEGIN("pivots for multi time zones");
      2. //by trash
      3. SetBarsRequired(10000,10000);
      4. Tick = IIf(StrRight(Name(),3)=="JPY" OR StrLeft(Name(),3)=="XAG" OR StrLeft(Name(),3)=="XAU", 0.01, 0.0001);
      5. starttime = ParamTime("time shift","00:00");
      6. endtime = 235900;
      7. starttime2 = 000000;
      8. endtime2 = starttime-000100;
      9. tn = TimeNum();
      10. timecond = tn >= starttime AND tn <= endtime;
      11. timecond2 = tn >= starttime2 AND tn <= endtime2;
      12. firstBarOfDay = deFlagFirstBarOfDay( starttime );
      13. firstBarOfDay2 = deFlagFirstBarOfDay( starttime2 );
      14. myHigh = ValueWhen(timecond, HighestSince(firstBarOfDay,High));
      15. myHigh2 = ValueWhen(timecond2, HighestSince(firstBarOfDay2,High));
      16. myLow = ValueWhen(timecond, LowestSince(firstBarOfDay,Low));
      17. myLow2 = ValueWhen(timecond2, LowestSince(firstBarOfDay2,Low));
      18. myClose = ValueWhen(timecond2, Close);
      19. DH = TimeFrameCompress(myHigh, inDaily, compressLast);
      20. DH2 = TimeFrameCompress(myHigh2, inDaily, compressLast);
      21. DL = TimeFrameCompress(myLow, inDaily, compressLast);
      22. DL2 = TimeFrameCompress(myLow2, inDaily, compressLast);
      23. DC = TimeFrameCompress(myClose, inDaily, compressLast);
      24. DH = TimeFrameExpand(Ref(DH,-1),inDaily,expandFirst);
      25. DH2 = TimeFrameExpand(Ref(DH2,-0),inDaily,expandFirst);
      26. DL = TimeFrameExpand(Ref(DL,-1),inDaily,expandFirst);
      27. DL2 = TimeFrameExpand(Ref(DL2,-0),inDaily,expandFirst);
      28. DayC0 = TimeFrameExpand(Ref(DC,-0),inDaily,expandFirst);
      29. DayC = TimeFrameGetPrice("C", inDaily, -1);
      30. DayH = IIf(starttime == 000000, DH, IIf(DH>DH2,DH,DH2));
      31. DayL = IIf(starttime == 000000, DL, IIf(DL<DL2,DL,DL2));
      32. DayC = IIf(starttime == 000000, DayC, DayC0);
      33. PP = (DayL + DayH + DayC)/3 ;
      34. R1 = (2 * PP) - DayL;
      35. S1 = (2 * PP) - DayH;
      36. R2 = (PP - S1) + R1;
      37. S2 = PP - (R1 - S1);
      38. R3 = R1 +(DayH-DayL);
      39. S3 = S1 - (DayH-DayL);
      40. PP = IIf(timecond, PP, Null);
      41. PP = ValueWhen(timecond OR timecond2, PP);
      42. R1 = IIf(timecond, R1, Null);
      43. R1 = ValueWhen(timecond OR timecond2, R1);
      44. R2 = IIf(timecond, R2, Null);
      45. R2 = ValueWhen(timecond OR timecond2, R2);
      46. R3 = IIf(timecond, R3, Null);
      47. R3 = ValueWhen(timecond OR timecond2, R3);
      48. S1 = IIf(timecond, S1, Null);
      49. S1 = ValueWhen(timecond OR timecond2, S1);
      50. S2 = IIf(timecond, S2, Null);
      51. S2 = ValueWhen(timecond OR timecond2, S2);
      52. S3 = IIf(timecond, S3, Null);
      53. S3 = ValueWhen(timecond OR timecond2, S3);
      54. style = styleBar | styleNoRescale;
      55. rcolor = ParamColor("Color Resists",colorGreen);
      56. scolor = ParamColor("Color Supports",colorCustom10);
      57. pcolor = ParamColor("Color PP",colorTan);
      58. GraphXSpace = 5;
      59. SetChartOptions(0, chartShowDates);
      60. PlotText( "PP", BarCount+20, LastValue(pp)-tick, pcolor);
      61. Plot(PP, "", pcolor, style);
      62. PlotText( "R1", BarCount+20, LastValue(r1)-tick, rcolor);
      63. Plot(R1, "", rcolor, style);
      64. PlotText( "R2", BarCount+20, LastValue(r2)-tick, rcolor);
      65. Plot(R2, "", rcolor, style);
      66. PlotText( "R3", BarCount+20, LastValue(r3)-tick, rcolor);
      67. Plot(R3, "", rcolor, style);
      68. PlotText( "S1", BarCount+20, LastValue(s1)-tick, scolor);
      69. Plot(S1, "", scolor, style);
      70. PlotText( "S2", BarCount+20, LastValue(s2)-tick, scolor);
      71. Plot(S2, "", scolor, style);
      72. PlotText( "S3", BarCount+20, LastValue(s3)-tick, scolor);
      73. Plot(S3, "", scolor, style);
      74. _SECTION_END();
      Bilder
      • 1.png

        11,37 kB, 1.194×626, 319 mal angesehen
      • 2.png

        11,36 kB, 1.194×626, 265 mal angesehen
      "I'm a trader, baby. So, why don't you kill me?!"
      Na da schau her, da hatte ich ja bisher richtig große Tomaten auf den Augen. Das habe ich auch noch nicht gewusst, dass sich 'Ami' bei AB auf Amiga bezieht. Ich dachte immer an America. lol

      Ami = is from Amiga Commodore was one of the best software in Amiga those years. After that when Commodore close, the owner Tomasz Janeczko he turn to windows platform this wonderful technical analysis software and he turn it to one of the most powerful programs that i ever seen


      AB für Amiga kann man sich sogar noch kostenlos herunterladen mit geschenktem Key amibroker.com/amiga/. Würde mich mal interessieren, wie das aussah. Gibt's da gescheite Amiga Emulatoren für Windows? UAE oder WinUAE scheint einer sein. Aber man benötigt ja noch ein Amiga OS.

      Die Beta Version mit Multithreading Support ist übrigens absolut spitze. Neuer zusätzlicher Performance Gewinn. amibroker.com/devlog/2010/11/1…ker-5-34-0-beta-released/
      "I'm a trader, baby. So, why don't you kill me?!"
      kleiner Fehler

      dies

      Quellcode

      1. tbl = LLV(L,2);
      2. tbh = HHV(H,2);


      durch das

      Quellcode

      1. tbl = Ref(LLV(L,2),-1);
      2. tbh = Ref(HHV(H,2),-1);


      ersetzen. Denn die aktuelle Bar soll ja nicht einberechnet werden.
      Bilder
      • 2barrange.png

        11,71 kB, 1.183×784, 245 mal angesehen
      "I'm a trader, baby. So, why don't you kill me?!"