Amibroker AFL

      Krümel schrieb:

      Also ich bin jetzt sicherlich nicht der Oberchecker von AFL, aber in Ermangelung von @trash, der sich ja schon länger nicht mehr hier gemeldet hat, versuche ich mich mal an dem Problem. Da Du leider nicht den ganzen Code gepostet hast, muss ich leider raten, was Du schon berücksichtigt hast, aber nicht gepostet, oder was tatsächlich fehlt.
      Hallo Krümel, Danke für Deine Hilfe. Mehr Code ist es noch nicht. Habe etwas im Hinterkopf und wollte erst mal kleine Elemente und Funktionen für das Handling der Anwendung zusammen tragen. Habe es mit Deinem Tipp hin bekommen. StaticVarGet und StaticVarSet sind die Lösung oder besser
      StaticVarGetText und StaticVarSetText. Erstes Pärchen arbeitet nur mit Zahlen. Für Strings eignet sich das zweite. Zum prüfen, ob die Variable gesetzt ist, reicht das hier:

      Quellcode

      1. if( StaticVarGetText("ticker") == "" )
      2. {
      3. StaticVarSetText("ticker", "BAS.DE");
      4. }


      Als Eventhandler habe ich jetzt GetAsyncKeyState() im Einsatz. Damit kann man Tastenkombinationen zaubern. GetCursorMouseButtons kann man vergessen. Liegt evt. an meiner Mouse. Jefenfalls ändern sich alle Nase lang die Zustände. GfxSetOverlayMode(0) braucht man scheinbar nicht. GfxTextOut scheint da genügsam zu sein. Die Werteänderung wird aber nicht sofort angezeigt. Refresh mit F5 ist erforderlich.

      Quellcode

      1. // Werte der Tasten "Left" und "Space" zur Auswertung über GetAsyncKeyState
      2. vk_Left = 37;
      3. vk_Space = 32;
      4. // erste Initalisierung auf BAS.DE
      5. if( StaticVarGetText("ticker") == "" )
      6. {
      7. StaticVarSetText("ticker", "BAS.DE");
      8. }
      9. wert = StaticVarGetText("ticker");
      10. GfxTextOut( "Basiswert: " + wert, 10, 60 );
      11. // Left + Space
      12. if( GetAsyncKeyState( vk_Left ) < 0 and GetAsyncKeyState( vk_Space ) ){
      13. StaticVarSetText("ticker", Name());
      14. }
      15. Plot( C, "Close", ParamColor("Color", colorDefault ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );




      How to run certain piece of code only once
      amibroker.com/kb/2015/10/06/ho…-piece-of-code-only-once/

      StaticVarSetText
      - Sets the value of static string variable.
      amibroker.com/guide/afl/staticvarsettext.html

      GetAsyncKeyState
      - query the current state of keyboard keys
      amibroker.com/guide/afl/getasynckeystate.html


      ich raube, also bin ich....

      Mr. Moon schrieb:


      Dazu folgendes Bsp.:
      Mit Name() kann man den Ticker des Basiswerts ermitteln. Dann blende ich diesen mit GfxTextOut( "Basiswert: " basisWert, 10, 60 ); auf den Chart ein. Später will ich basisWert neue setzen. z.B. mit GetCursorMouseButtons() & 2 Damit der Code konsitent ist, wird zum Anfang basisWert = "" gesetzt. Ob ich später die linke Maustaste drücke (oben aufgeführte Event) oder nicht, es passiert nichts. Vermute mal, dass der Code immer und immer wieder durchlaufen wird und basisWert quasi sofort wieder auf "" gesetzt wird. Wie kann ich das vermeiden? Muss ich mit for( i = 1; i < BarCount; i++ ) arbeiten und die Variable außerhalb der Schleife definieren? Hier ein bisschen Code:

      Quellcode

      1. basisWert = "";
      2. GfxTextOut( "Basiswert: " + basisWert, 10, 60 );
      3. if( GetCursorMouseButtons() & 2 ){
      4. basisWert = Name();
      5. }


      Also ich bin jetzt sicherlich nicht der Oberchecker von AFL, aber in Ermangelung von @trash, der sich ja schon länger nicht mehr hier gemeldet hat, versuche ich mich mal an dem Problem. Da Du leider nicht den ganzen Code gepostet hast, muss ich leider raten, was Du schon berücksichtigt hast, aber nicht gepostet, oder was tatsächlich fehlt.

      1. Mouse-Button Links = Flag 1, nicht 2 laut AFL Referenz GetCursorMouseButtons
      (2 steht für rechte Mouse-Taste), zur Not auch mal in diesem Link das Beispiel durcharbeiten, das behandelt Click-Events und Abfragen von Mouse-Buttons. Zu debug-Zwecken würde ich auch die eingezeichneten Buttons drinlassen, dann hast Du ein visuelles Feedback, wie es funktionieren soll.

      2. Es sollte am Anfang vom Script auf jeden Fall ein Aufruf von GfxSetOverlayMode(0) erfolgen, damit tatsächlich etwas gezeichet wird.

      3. Nach dem Ändern der Variablen mittels

      Quellcode

      1. basisWert = Name();

      muss auf jeden Fall die Zeichenfunktion erneut aufgerufen werden, damit die Grafik aktualisiert werden kann.

      So in etwa:

      Quellcode

      1. ...
      2. if( GetCursorMouseButtons() & 1 ){
      3. basisWert = Name();
      4. GfxTextOut( "Basiswert: " + basisWert, 10, 60 );
      5. }

      4. Um den Wert den Wert der Variablen basiswert nicht immer wieder zu überschreiben, wenn er mittels Mouse-Event Call mal geändert wurde, würde ich mir an Deiner Stelle mal das Funktionspärchen StaticVarGet und StaticVarSet anschauen. Das liest sich für mich so, als könne es eine Lösung für Dein Problem des Überschreibens darstellen. Zu Beginn würde eine solche Variable auf Null vorinitialisiert und Du kannst bei späteren Wertabfragen immer auf Null (=noch nicht gesetzt) testen und ansonsten nur valide Werte nutzen. Mit der Get-Variante fragst Du den aktuellen Wert ab, mit der Set-Variante änderst Du ihn bei Bedarf. Theoretisch sollte diese Variable durchgeschleppt werden durch versch. Durchläufe. Ich benutze allerdings keinen Amibroker, deswegen kann ich das leider nicht testen.

      PS: "Ein bisschen Code" ist immer auch "ein bisschen Sch...". , denn man muss dann immer mit viel Phantasie die Wünsche und Ziele des anderen erraten bezüglich dessen, was das Programm eigentlich machen soll. Und am Ende ist der dann trotzdem unzufrieden, weil man nicht korrekt geraten hat :evil: .
      Das Hamsterrad sieht nur von innen aus wie eine Karriereleiter.
      Vielleicht ist jemand hier, der sich damit auskennt [ Huhu Trash... :) ] Der AFL-Code wird ja mehr fließend abgearbeitet. Jetzt mein Problem, ich muss ja den Wert einer Variable am Anfang festlegen. Im Laufe der Zeit ändere ich diesen. Wie vermeide ich, dass er bei dieser zum Anfang festgelegten, wie heist das, Initialisierung, wieder gesetzt wird?

      Dazu folgendes Bsp.:
      Mit Name() kann man den Ticker des Basiswerts ermitteln. Dann blende ich diesen mit GfxTextOut( "Basiswert: " basisWert, 10, 60 ); auf den Chart ein. Später will ich basisWert neue setzen. z.B. mit GetCursorMouseButtons() & 2 Damit der Code konsitent ist, wird zum Anfang basisWert = "" gesetzt. Ob ich später die linke Maustaste drücke (oben aufgeführte Event) oder nicht, es passiert nichts. Vermute mal, dass der Code immer und immer wieder durchlaufen wird und basisWert quasi sofort wieder auf "" gesetzt wird. Wie kann ich das vermeiden? Muss ich mit for( i = 1; i < BarCount; i++ ) arbeiten und die Variable außerhalb der Schleife definieren? Hier ein bisschen Code:

      Quellcode

      1. basisWert = "";
      2. GfxTextOut( "Basiswert: " + basisWert, 10, 60 );
      3. if( GetCursorMouseButtons() & 2 ){
      4. basisWert = Name();
      5. }

      ich raube, also bin ich....
      Deine trading-Formular gefällt mir. Sieht fast wie ninjatrader aus... :) Wie lange hast du gebraucht für den jetzigen Stand? Bist du Programmierer oder Hobby-coder? Wieviele Zeilen Quellcode sind zusammen gekommen?

      Clipboard ist für mich ok. Habe in php ein position-calculator gebastelt. Um schnell Daten zu übertragen wäre die Zwischenablage ok. Static variable schaue ich mir mal an...
      ich raube, also bin ich....
      Ja, ich habe es bei meinem Beispiel (siehe unten, interaktive Tradelinien) auch so in etwa gemacht in Sachen Maus+Tasten Kombi. Aber zum "Storing" würde ich nicht Clipboard sondern Static Variables verwenden. Diese haben ein extra Argument "persistent", bedeutet also, dass gesetzte nach Restart von AB oder OS erhalten bleiben. amibroker.com/guide/afl/staticvarset.html

      "I'm a trader, baby. So, why don't you kill me?!"
      Danke erstmal. Wollte mir was basteln um schnell TradeDaten zu ermitteln. Trade-IN, SL, jeweilige Level gleich in die Zwischenablage. Arrows wären dafür nicht schlecht. Allerdings einzeichnen und dann Study_ID ändern ist wieder ein Arbeitsschritt zu umständig.

      Was auch schnell gehen würde sind Mouseposition + Shortcuts. Aktive Taste wird mit GetAsyncKeyState() ermittelt. Mouseposition mit Gfx Low Level Funktionen. Dann mit ClipboardSet( ''Text'' ) in die Zwischenablage. Bsp. Shift gedrückt setzt das Level für Trade-IN gemäß Mausposition, danach Strg für Stop-Level. Vielleicht noch ein paar grafische Markierungen und gut ist.

      Quellcode

      1. vk_Shift = 16;
      2. if( GetAsyncKeyState( vk_Shift ) < 0 ) {
      3. Title = "Shift is pressed";
      4. PopupWindow("Current time is: " + Now(),"Alert", 2, 640*mtRandom(), 480*mtRandom());
      5. }

      ich raube, also bin ich....

      Mr. Moon schrieb:

      @trash
      Gibt es in Amibroker die Möglichkeit, von einem Study-Objekt ( z.B. lezter Arrow im Chart) die Koordinaten zu ermitteln? Wie werden Studies gespeichert? Gibs ein Array oder sowas? Ne Funktion, um darauf zuzugreifen, habe ich nicht gefunden.


      Die Toolbarstudy "Arrow" hat in den Properties keine Einstellung für StudyID, um sie mit der StudyID() Funktion zu verwenden.



      Aber du kannst via Gfx Low Level Grafik Programmierung deine eigenen Grafiken erstellen (z.B. Symbola Unicode (AB 6.0), Wingdings, .. ) und diese bewegbar über Maus (und Keyboard Tasten) machen.
      Mit Gfx Funktionen kann man praktisch alles Denkbare grafisch verwirklichen. "The only limit is your imgination".
      Zum Beispiel könnte man auch DOM on Chart programmieren (oder eine Kopie von Mona Lisa oder ... oder).

      Ok, hier eine Bsp mir bewegbarem Pfeil und Farbrückmeldung. Ebenso wird die jeweilige Pixelposition angegeben.
      x,y Pixelwerte kann man wiederrum in Bar/Preis Position umwandeln.

      "I'm a trader, baby. So, why don't you kill me?!"

      Mr. Moon schrieb:

      Von Amibroker ist jetzt die Version 6.0 frei gegeben worden. Bin am überlegen, ob ich auf die aktuelle Version upgraden soll. Hat jemand schon mit der aktuellen Version rum gespielt? Letztendlich sind für mich nur die ersten beiden Punkte interessant. Aktuell nutze ich noch die 5.6. Lohnt sich trotzdem das Update? Sind neue AFL-Befehle oder Funktionen dazu gekommen? Vielen Dank schonmal.

      AmiBroker - 6.0
      * massively parallel Multi-Threaded Charting and Rendering
      * Multi-Threaded Analysis module
      * multi-threaded unlimited-symbol True Portfolio-Level Backtesting and Optimization, now with Smart Evolutionary algorithms
      * One-click setup and update of US stocks listing with sector and industry assignments

      amibroker.com
      amibroker.com/devlog/


      Du bringst da etwas durcheinander. Die vier von dir aufgelisteten Punkte sind von der Amibroker Startseite. Diese Features (Multithreading) gibt es schon seit Jahren(!) angefangen mit Version 5.40.
      Für Neuerungen musst du ins Devlog schauen und nicht auf die AB Startseite. Dieses hast du ja selbst als zweiten Link angegeben. Jetzt ist die Frage, was du dazu noch wissen willst, wenn man nichts anderes tun muss, also dort (dem zweiten Link folgend) zu lesen. Aber wenn du für jede Version die Highlights und detaillierten Features aufgelistet erfahren willst, dann lade dir PDF-Versionen der Release notes aus den letzten acht Entwicklungszyklen von diesem 3rd party Userforum herunter amibrokerforum.proboards.com/t…9/amibroker-release-notes Aber lesen muss man die auch selbst.

      Lohnt sich trotzdem das Update?


      Devinitiv. Zwischen 6.0 und 5.60 liegen Welten.
      Wir reden hier von AmiBroker und nicht von Ninjatrader oder Metastock, wo entweder nichts passiert, nicht viel oder nur Versionen "gebumpt" werden.
      "I'm a trader, baby. So, why don't you kill me?!"
      Von Amibroker ist jetzt die Version 6.0 frei gegeben worden. Bin am überlegen, ob ich auf die aktuelle Version upgraden soll. Hat jemand schon mit der aktuellen Version rum gespielt? Letztendlich sind für mich nur die ersten beiden Punkte interessant. Aktuell nutze ich noch die 5.6. Lohnt sich trotzdem das Update? Sind neue AFL-Befehle oder Funktionen dazu gekommen? Vielen Dank schonmal.

      AmiBroker - 6.0
      * massively parallel Multi-Threaded Charting and Rendering
      * Multi-Threaded Analysis module
      * multi-threaded unlimited-symbol True Portfolio-Level Backtesting and Optimization, now with Smart Evolutionary algorithms
      * One-click setup and update of US stocks listing with sector and industry assignments

      amibroker.com
      amibroker.com/devlog/
      ich raube, also bin ich....

      Aktie X und Index Y in einem relativen Chart

      Im "Charts" Fenster gehe zu Basic Charts -> Relative Performance. Diesen AFL doppelklicken oder in ein vorhandenes leeres Chartfenster per Drag&Drop ziehen oder über Rechtsclick -> "insert" oder "Insert linked" einfügen.

      Allg. zum AFL Einfügen:
      Der Unterschied zwischen "insert" und "insert linked" ist, dass Ersteres eine AFL Kopie erstellt während Letzteres den Original AFL verwendet. "insert" macht das Selbe wie Doppelclick oder Drag&drop. Alle drei Methoden erstellen eine Kopie des Originals. Diese Kopien befinden sich im versteckten Ordner "Drag-drop" unter C:\...\AmiBroker\Formulas. Versteckte Windows Ordner kann man im Windowsexplorer unter Extras/Ordneroptionen/Ansicht/"Versteckte Dateien und Ordner anzeigen" sichtbar machen. Um Drag-Drop in "Charts" sichtbar zu machen -> Tools-Preferences-AFL -> Show hidden folders -> OK -> Neustart von AmiBroker.

      OK, das als kurze allg. Infos in Sachen AFLs in Charts anwenden.

      Der Relative Performace AFL von AB ist ein simples Bsp, um zu zeigen, wie das Vergleichen von Symbolen im slben Chartfenster unter Verwendung von "Foreign"-Funktionen (Foreign(), SetForeign()) grundsätzlich funktioniert. Diesen basic AFL kann man nicht für logarithmische Darstellungen verwenden, da die Ausgangspunkt bei Null beginnt. Und du weißt sicher selbst, was der Logarithmus von null bzw negativen Werten ausgibt (einfach im Taschenrechner versuchen). Deshalb ist es besser, man startet bei 100 oder 1. Wenn also ein Wert von 1 auf 4 steigt, hat er 300% zugelegt oder 1 auf 1.91 bedeutet 91% Zuwachs etc.

      Angefügt sind Chart und Relative Performance AFL, den ich erstellt habe. Dieser eignet sich nun auch für logarithmische Darstelllung. Man kann mit diesem zudem wählen, ob man Symbole aus einer Watchlist miteinander vergleichen will oder ob man vereinzelte Symbole manuell eingeben möchte (also selbe Methode wie bei AB's basic AFL). Standardmäßig verwendet der AFL QuickAFL, heißt, er verwendet die Bars, die im Chart sichtbar sind. Wenn du egal bei welchem Zoomfaktor immer von Bar 0 berechnen lassen willst, dann stattdessen fvb = 0; setzen und SetbarsRequired im Code auskommentieren. Man könnte z.B. auch ein fixes Start-Datum setzen (über ParamDate zum Bsp), wenn dir das lieber ist.
      Bilder
      • 01.png

        136,54 kB, 1.269×660, 812 mal angesehen
      • 02.png

        42,5 kB, 1.087×1.844, 852 mal angesehen

      Forex portfolio backesting, ..., ...

      Christoph123 schrieb:

      Ein Problem hab ich aber noch:

      Ich hab meine Strategie bis jetzt nur auf einzelne Währungspaare getestet, jetzt möchte ich sie aber gerne zusammen testen.

      Ich habe ein Bild angefügt indem man erkennt, dass mein SL erreicht wurde, und sich der Verlust auf ca. 350GBP beläuft. Wären es USD dann würde alles passen, denn mein Risikobetrag sind 3,5% des Kapitals.
      Aber da es sich um GBP handelt und der Wechselkurs zu USD zu der Zeit ca. bei 1,6500 lag, entspechen diese 350GBP ca. 580$ .........Also hat sich mein Risiko erhöht, was ich aber nicht möchte.

      Ich habe unter "Symbol" schon alles richtig eingetragen (Round Lot Size, Margin Deposit, usw.), und auch unter "Tools"->"Preferences" -> "Currencies" passt. m.W. nach alles (siehe Bild).


      Meine Lösung wäre: " SetPositonSize(aktuelle Positionsgröße / (GBPUSD), spsPerformanceofEquity);"

      Nur darf er das Fettgedruckte bei EURUSD nicht machen und z.b bei EURCHF müsste er " *(USDCHF) " schreiben ......

      Da gibt es doch sicher wieder ein viel einfachere und elegantere Lösung :P ?



      Here you go, PDF-Datei zum Herunterladen groups.yahoo.com/neo/groups/am…ersations/messages/184332