Zapisz się na newsletter i obejrzyj jedno z moich szkoleń!

środa, 6 listopada 2013

AFL - tworzymy własny wskaźnik w programie Amibroker

Po opublikowaniu serii wpisów na temat testowania pomysłu na system inwestycyjny, odezwało się do mnie kilka osób z prośbą o poradę dotyczącą programowania w języku AFL, czyli Amibroker Formula Language. 

Oczywiście w miarę swoich możliwości staram się pomagać tym, którzy zgłaszają się do mnie z podobnymi kwestiami, ale nie zawsze jest to możliwe. Z drugiej jednak strony, profesjonalne oprogramowanie do analizy wykresów i testowania systemów inwestycyjnych na danych historycznych to na tyle fantastyczna sprawa, że postanowiłem pokazać Wam, do czego można je wykorzystać.

W poniższym nagraniu pokazuję sposób, w jaki piszę sobie w Amibrokerze różne rzeczy. Nie będzie to system inwestycyjny, a jedynie wskaźnik, który posłuży mi do sprawdzenia jednego z zachowań rynku. Zapewniam Was, że żaden z ogólnodostępnych programów do analizy technicznej nie posiada takiego właśnie wskaźnika. Nic zresztą dziwnego, skoro posłuży on tylko mi i to do zbadania jednej, konkretnej rzeczy.

To jest właśnie wielka zaleta tego oprogramowania, że sami możecie stworzyć sobie narzędzia, których potrzebujecie. Do tego potrzebna jest wiedza na temat posługiwania się językiem AFL. Czy łatwo jest ją zdobyć? Jak wszystko, wymaga to pracy, nakładu sił i czasu. Trzeba nie tylko nauczyć się tego języka, ale też orientować się w tematyce inwestycyjnej, gdyż bez tego cała nauka nie ma sensu.

Z tego co wiem, nie ma żadnego tutoriala dotyczącego nauki tego języka. Ja sam uczyłem się przy użyciu modułu "help", który zawiera opis wszystkich formuł oraz podstawową składnię. Wszystko powyżej tego poziomu to często metoda prób i błędów. A że nie jesteśmy w tym trudzie osamotnieni, prawdopodobnie gdzieś w internecie funkcjonuje forum skupiające osoby zainteresowane nauką AFL.

Zachęcam do obejrzenia poniższego nagrania. Nie obawiajcie się, nie jest to suchy wykład na temat kodu, ale pokazuję w nim od początku do końca proces tworzenia własnego wskaźnika. Od samej koncepcji, aż po wykonanie oraz próbę modyfikacji, z kiepskim niestety skutkiem.

Nagranie liczy sobie przeszło miesiąc, ale tak to już czasami jest, że w przypływie weny stworzę materiał, którego później nie ma jak wepchnąć w grafik na blogu :)

8 komentarzy:

  1. Polecam CQG. Wg mnie najbardziej profesjonalny program do analizy technicznej:)

    OdpowiedzUsuń
  2. Prawdopodobnie chodziło Ci o
    Plot(a, "Stopa zwrotu", colorRed, styleHistogram | styleThick);
    A z gatunku grammarnazi: Liczba dni - dni są policzalne, humaniście nie przystoi ;)

    OdpowiedzUsuń
  3. przydatny byłby jeden lub kilka filmow na youtube dotczących omówienia współczynnikiów giełdowych. np. mam taki raport firmy http://bossa.pl/redir.do?aid=40458&name=Mercator_Medical_raport_IPO_23.10.2013.pdf

    no i sugestaia jak ocenić raport na co zwrócić uwagę.

    OdpowiedzUsuń
  4. Właściwie od dzisiaj zacząłem trochę ćwiczyć z AFL, natomiast trafiłem na taki problem - http://www.amibroker.com/guide_pl/h_studies.html
    Przykład wydaje się prosty jak linia trendu, ale nie pokazuje mi sygnału. Narysowałem linię trendu, którą wykres przebija - może źle przykład zrozumiałem.
    Sam język nie jest jakiś trudny, kilka przykładów, które pokazałeś, oraz to co do tej pory wyczytałem w helpie ugruntowuje w przekonaniu, że składnia jest podobna do wielu języków programowania.

    Na razie pozostaje przegryźć się przez kilka przykładów i samemu zacząć coś tworzyć.
    Czy lepiej używać 2 - 3 baz do pracy off i on line czy nie ma to znaczenia i można to robić dla jednej bazy. Z Twojego punktu widzenia jak jest wygodniej?

    OdpowiedzUsuń
    Odpowiedzi
    1. Do generowania sygnałów trzeba trochę więcej całą rzecz dopracować.

      A co do baz to testuję zawsze offline, ale na pełnej bazie. Czasami jedynie ustawia się filtry dla poszczególnych spółek.

      Usuń
  5. Radku, pozwolę sobie wrzucić link do mojego małego projektu http://pobieracz.stoploss.pl/, myślę że łatwy start w użytkowaniu AmiBrokera przyciągnie więcej ludzi do tego programu AT. Pierwszą rzeczą jaką starałem się osiągnąć to prostota ładowania danych do Ami. Mam nadzieję, że mój programik okaże się przydatny.

    OdpowiedzUsuń
  6. Czy można prosić o podpowiedź jak powinna wygladać formuła z warunkiem takim, aby amibroker po skanowaniu bazy pokazał spółki,których kurs wynosi poniżej 50 gr?.
    Czyli nie jest historycznie najmniejszy ale właśnie, że jest poniżej 50 gr na moment skanowania .
    Dziękuję.

    OdpowiedzUsuń
    Odpowiedzi
    1. Zobacz na to ogólne rozwiązanie, jednak z pytania wnioskuję, że brakuje Ci wiedzy.

      EMA1=EMA(O,7);
      EMA2=EMA(O,14);
      sl=H*0.9;
      Sell = False;
      Buy = Cross(EMA1,EMA2) AND C > 0.49 AND C < 300 AND EMA(V,15) >=5000 ;//filtr ceny i wolumenu
      Filter =EMA (V,15) >=5000;
      //Sell=Cross(HHV(sl,Buy),L);

      //2 linijki pod spodem będą rysować strzałki na wykresie bez backtestów
      //PlotShapes(shapeUpArrow*Buy,colorLime);
      //PlotShapes(shapeDownArrow*Sell,colorRed);

      Plot(EMA1,"EMA7",colorGreen,styleThick);
      Plot(EMA2,"EMA14",colorRed,styleThick);
      Plot(HHV(sl,Buy),"stop",colorWhite,styleThick);

      _SECTION_BEGIN("Price");
      SetChartOptions(0,chartShowArrows|chartShowDates);
      _N(Title = StrFormat("{{Name}} – {{Interval}} {{Date}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
      Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );

      SetOption("InitialEquity", 100000 );// dane potrfela poniżej
      SetTradeDelays(1,1,1,1);//kupno na następnej sesji po sygnale
      RoundLotSize = 1;
      posqty = Optimize("PosQty", 10, 5, 8, 1 );
      PositionSize = -100/posqty;
      PositionScore = 100-RSI(); // prefer stocks that have low RSI;
      PosQty = 10;//ilość pozycji w portfelu
      SetOption("MaxOpenPositions", PosQty );
      PositionSize = -100/PosQty;
      SetOption("futuresmode",False); //tryb futures wylaczony
      SetOption("Minposvalue",5500); //min pozycja za kwote 1400 ze wzgledu na prowizje
      SetOption("commissionmode",1); //rodzaj prowizji(procentowy)
      SetOption("commissionamount",0.39); //wartosc prowizji
      _SECTION_END();

      Ten system pochodzi z forum, może lepiej właśnie poszukać odpowiedniego forum gdzie jest więcej osób technicznie zajmującym się Ami.

      Usuń

LinkWithin

Related Posts with Thumbnails