Amibroker AFL

      Was ich bei AFL durchaus recht hilfreich finde, ist, dass kein Wert darauf gelegt wird, ob ein Variablenname an einer Stelle mit Großbuchstabe beginnt und an anderer Stelle im Code nicht mehr. (Bei MQL z.B. ist das glaube ich nicht so. Dort kommt dann eine Fehlermeldung beim Kompilieren)

      Z.B. kann ich es (leicht übertrieben) so schreiben:

      Quellcode

      1. CoNdiTioN1 = C > MA(C, 50);
      2. Buy = condition1;


      ohne einen Fehler zu erhalten. Condition1 wird erkannt, egal ob in einem Fall mit verschiedenen Großbuchstaben geschrieben und dann beim Wiederaufruf komplett klein geschrieben etc. Es zählt nur die Zeichenkette.

      trash schrieb:

      Die Frage ist eigentlich schon ohne Support beantwortet.
      Für N-bar Stop hat Exitatstop nur zwei Optionen, 0 (False) oder 1 (True). Bei allen anderen Stops hat es 3 Optionen mit unterschiedlicher Bedeutung als bei N-bar.

      wie gesagt, ich hatte was drüber gelesen, aber leider nicht raus gelesen das der wert bei den unterschiedlichen stopps andere beteutung hat. hatte bei einem anderen programm genau das problem das der N-Bar stop vor der anderen kam und wollte es da umstellen und hatte daher danach gesucht.
      Die Wissenden reden nicht viel,die Redenden wissen nicht viel.

      klaus-m.blogspot.com/
      In der AFL Version fehlt noch die Option volatile.



      "volatile -
      decides if amount (or distance) (3rd parameter) is sampled at the trade entry and remains fixed during the trade (Volatile = FALSE - old behaviour) or if can vary during the trade (Volatile = TRUE) (allows single line Chandelier exit implementation)"

      Option volatile gilt auch nur für BaktestRegular Mode.

      trash schrieb:

      Ich müßte mal beim Support nachfragen, ob es ExitAtStop = 2 für N-bar stop überhaupt gibt. Ich glaube, da gibt es nur 0 und 1 mit unterschiedlicher Bedeutung (Priorität ja oder nein) als bei normalen Stops.


      Die Frage ist eigentlich schon ohne Support beantwortet.
      Für N-bar Stop hat Exitatstop nur zwei Optionen, 0 (False) oder 1 (True). Bei allen anderen Stops hat es 3 Optionen mit unterschiedlicher Bedeutung als bei N-bar.

      Die Applystop-Funktion ist ja nichts anderes als das Setzen der Stops aus den Backtest Settings über AFL.
      Und wenn du dort in den Backtest Settings nachschaust, gibt es auch nur diese Priority Option bei N-bar:

      "Default" Settings


      "Default" Settings über AFL, die das Selbe machen wie oben in den Backtest Settings


      Auch hier gilt: jede Änderung über AFL überschreibt die jeweilige gesetzte Einstellung aus dem Backtest Settingsfenster (erstes Bild)!

      ibelieve schrieb:

      trash schrieb:

      Ich müßte mal beim Support nachfragen, ob es ExitAtStop = 2 für N-bar stop überhaupt gibt. Ich glaube, da gibt es nur 0 und 1 mit unterschiedlicher Bedeutung (Priorität ja oder nein) als bei normalen Stops.


      danke,
      ich hatte was über die Priorität beim N-Bar stop gelesen. Konnte aber nichts mit anfangen weil ich nicht fand wo man es setzt.


      Bei setzen von ExitAtStop = 0 hat n-bar stop kleinste Priorität ( "... so if for example profit target stop is hit on the same bar then profit target is evaluated first")
      Bei setzen von ExitAtStop = 1 hat n-bar stop höchste Priorität (".. is evaluated before all other stops").

      trash schrieb:

      Ich müßte mal beim Support nachfragen, ob es ExitAtStop = 2 für N-bar stop überhaupt gibt. Ich glaube, da gibt es nur 0 und 1 mit unterschiedlicher Bedeutung (Priorität ja oder nein) als bei normalen Stops.


      danke,
      ich hatte was über die Priorität beim N-Bar stop gelesen. Konnte aber nichts mit anfangen weil ich nicht fand wo man es setzt.
      Die Wissenden reden nicht viel,die Redenden wissen nicht viel.

      klaus-m.blogspot.com/

      trash schrieb:


      goso schrieb:

      Ich weiss nicht wie "empfindlich" AB auf fehlende Zwischenräume reagiert, aber in deinem Code fehlt der Leerraum zwischen SellPrice und dem = Zeichen.

      Reagiert auf solche Sachen vollkommen unempfindlich. Gibt es Programme, die darauf reagieren?
      Es gibt aber andere Bsp, wo auf Leerzeichen reagiert wird, z.B bei AND oder OR. Aber das merkt man sofort, da, wenn kein Leerzeichen vorhanden ist, von fett und Auto-Großschrift auf standard umgeschaltet wird.



      Modifizierter Fall mit Klammer, dann wird es wieder nebensächlich. Klammer wie Leerzeichen etc. dienen als Worttrenner.

      Betrifft aber nicht nur AND oder OR sondern auch sonstige keywords oder Funktionen. Im Prinzip logisch, dass man ein Leerzeichen setzen sollte, da es ohne zusätzliche Hilfsmittel zu einem Wort gehören würde, dass zudem noch nicht definiert (außer durch Zufall) wurde und somit eine Fehlermeldung ergeben würde.

      ibelieve schrieb:

      habe ich alles durch probiert



      leider ohne erfolg.
      es wäre mir auch lieber wenn ich es im Code stehen hätte damit nachher jeder auf das gleiche Ergebnis kommt wenn ich Ihn den mal weiter geben sollte, bzw. damit ich selber immer auf das gleiche Ergebnis komme ohne alle Settings zu kontrollieren.


      Du verwendest backtestRegularRawMulti. In der Hilfe steht, dass SellPrice/CoverPrice bei Verwendung von ApplyStop nur in BacktestRegular Mode über AFL gesetzt werden können. Diese müssten also in deinem Fall in den Settings gesetzt werden und nicht über AFL.

      Mache es so


      Und im AFL Code überschreibst du Buy Price -> Open aus den Settings mit BuyPrice = Close;
      (Ich würde aber alles auf Open setzen und SetTradeDelays alles auf 1)

      Quellcode

      1. //kaufregeln
      2. Buy = H > Ref(H,-1);
      3. BuyPrice = C;
      4. //Verkauf
      5. Sell = 0;
      6. StopLevel = Param("N-bars", 5, 1, 100, 0 );
      7. ApplyStop( stopTypeNBar, stopModeBars, StopLevel, 2 );
      8. Short = Cover = 0;
      9. //Grundeinstellungen
      10. PositionSize = 10000; // Positionsgroesse = 10000
      11. SetOption( "initialequity", 1000000 ); // Startkapital
      12. //Backtestregeln
      13. SetBacktestMode( backtestRegularRawMulti );
      14. SetTradeDelays(0, 1, 0, 1);
      15. SetOption("AllowSameBarExit", True); // Handel inerhalb eines Tages erlauben
      16. SetOption("MaxOpenPositions", 100); //maximale offene Positionen
      17. SetOption("ActivateStopsImmediately", True); //alle Stopps sollen sofort aktiv sein
      18. SetOption("PriceBoundChecking", True);

      Ich müßte mal beim Support nachfragen, ob es ExitAtStop = 2 für N-bar stop überhaupt gibt. Ich glaube, da gibt es nur 0 und 1 mit unterschiedlicher Bedeutung (Priorität ja oder nein) als bei normalen Stops.

      goso schrieb:

      Ich weiss nicht wie "empfindlich" AB auf fehlende Zwischenräume reagiert, aber in deinem Code fehlt der Leerraum zwischen SellPrice und dem = Zeichen.

      Reagiert auf solche Sachen vollkommen unempfindlich. Gibt es Programme, die darauf reagieren?
      Es gibt aber andere Bsp, wo auf Leerzeichen reagiert wird, z.B bei AND oder OR. Aber das merkt man sofort, da, wenn kein Leerzeichen vorhanden ist, von fett und Auto-Großschrift auf standard umgeschaltet wird.

      moin,
      ich schon wieder Sonntags :rolleyes:

      sollte eigentlich ganz simpel sein, komme aber leider trotzdem nicht drauf.

      Quellcode

      1. //kaufregeln
      2. Buy = H > Ref(H,-1);
      3. BuyPrice = Max(Ref(H,-1), O);
      4. //Verkauf
      5. Sell = 0;
      6. StopLevel = Param("N-bars", 5, 1, 100, 0 );
      7. ApplyStop( stopTypeNBar, stopModeBars, StopLevel,2 );
      8. SellPrice= Open;
      9. //Grundeinstellungen
      10. PositionSize = 10000; // Positionsgroesse = 10000
      11. SetOption( "initialequity", 1000000 ); // Startkapital
      12. //Backtestregeln
      13. SetBacktestMode( backtestRegularRawMulti );//kauf / verkaufe auch weitere Positionen
      14. SetTradeDelays(0,1,0,1);
      15. SetOption("AllowSameBarExit", True); // Handel inerhalb eines Tages erlauben
      16. SetOption("MaxOpenPositions",100 ); //maximale offene Positionen
      17. SetOption("ActivateStopsImmediately",True); //alle Stopps sollen sofort aktiv sein
      18. SetOption("PriceBoundChecking",True);


      es wird ja einfach gekauft wenn wir das hoch von gestern überbieten.
      verkauft nach X Bars.

      so weit so gut.
      Jetzt rechnet er immer mit dem Close Preis, ich will aber den Open als Price.

      Jetzt steht in der Beschreibung,
      "Trade price set to open"
      Aber ich finde nichts dazu wie ich das mache muss.

      Wenn es eine Antwort ohne viel Arbeit gibt, wäre ich dankbar.
      Ansonsten ist es auch nicht schlimm weil ich auch mit dem Close Price leben kann.
      Die Wissenden reden nicht viel,die Redenden wissen nicht viel.

      klaus-m.blogspot.com/

      trash schrieb:

      @Ibelieve,
      probiere mal das ...
      Folgende Procedure pastie.org/4702144 kannst du in den Include Ordner abspeichern als Sell_Cover_Proc.afl
      Und dies dein System Code pastie.org/4702157


      ich danke Dir noch mal für die Arbeit.
      bin jetzt erst da zu gekommen es mir mal an zu schauen.
      weis zwar noch nicht ob es genau das macht was ich wirklich will, aber von der Optik her sieht es sehr gut aus.
      hab jetzt zumindest wieder einiges an Programm was ich durch arbeiten kann um zu lernen.
      Die Wissenden reden nicht viel,die Redenden wissen nicht viel.

      klaus-m.blogspot.com/
      Es gibt im AB Forum im 'Files' Bereich übrigens ein nettes neues Statistik Plugin (32-bit u. 64-bit) mit zig Funktionen von einem Finnen erstellt, mit dem man einige Grafiken sehr schnell und simpel erstellen kann. Diese Wochen will er noch eine Plugin Update mit Zusätzen hochladen. Das Plugin greift nach der Kalkulation auf Gnuplot zu und so kann man dann bspw Box&Whisker Charts oder Histogrammcharts oder Efficient Frontier Charts oder oder erstellen. Schon getestet, klappt einwandfrei. Gnuplot ist übrigens Freeware. Den Gnuplot Code kann man auch über AFL erstellen mit der Funktion fputs. Das Englisch in der PDF Hilfe ist etwas sehr stark finnisch, aber man versteht es nüchtern trotzdem. :)

      Unten von mir drei Bsp hochgeladen. Wie gesagt, innerhalb eines Wimpernschlages erstellt.
      Bilder
      • Boxplot.png

        30,85 kB, 560×840, 316 mal angesehen
      • Histo.png

        8,52 kB, 800×600, 270 mal angesehen
      • efront.png

        13,29 kB, 800×600, 284 mal angesehen

      ibelieve schrieb:

      trash schrieb:

      Und bitte auch noch mal an dich der Tip, setze Mehrfachcalls von Funktionen in eine Variable. Sowas fällt schon beim ersten Blick auf. Zum Bsp bei deinem Mehrfachaufruf von ATR() ... da bekomme ich Migräne.


      brachte jetzt eine verbesserung von 46 sek backtest auf 15 sek.

      aber wenn man nur alle paar jahre mal so was macht vergisst man halt schnell kleinigkeiten.


      Am Ende musst du wissen, was besser ist. Aber ich sage halt nur offen meine Meinung, wenn etwas stört oder auffällt. Hört sich vielleicht etwas barsch an, soll es aber eigentlich nicht. Ich möchte ja nur, dass du das Optimum herausholst und keine Zeit verschwendest, wenn man schon mit einem schnellen Biest arbeitet. Schlechter Code ist dann nun mal wie Sand im Getriebe. Und so prägt man es sich eventuell auch für die Zukunft besser ein. "Ich mache es lieber gleich besser, bevor trash lieb "meckert" ..." :cursing:

      ;)

      Wie ich sehe, verwendest du noch die alte Version ohne multi-threading. Wenn du es für Portfoliolevel-Backtesting dank Multi-threading noch schneller haben willst, dann probiere mal die New Auto Analysis ab Vers 5.50. Sollte um die 30%-40% Performacegewinn bringen oder mehr. So kommst du am Ende gegenüber vorher zu einem Zeitgewinn von vielleicht 80%. Das ist schon happig. Bei Optimierungen wirkt sich das dann noch mehr aus, wenn es um Stunden gehen kann.

      Zu Multi-Threading auch noch mal eine Info Seite Efficient use of multithreading