Tutorial: Wie benutzt man einen Indikator in einer Condition bzw. Strategie im AgenaTrader (Basic)

Dieses Tutorial zeigt ein Basisbeispiel für Indikatoren, Conditions und Strategien.

Download Quelltext Dateien

Indikator

In vielen Fällen starten wir mit dem Indikator, da der Indikator der leichteste Einstieg in die Scriptentwicklung ist. Man bekommt einen schnellen Einblick, ob die Tradingidee grundsätzlich funktioniert und zusätzlich kann man schnell und einfach weitere Instrumente visuell screenen und dadurch prüfen, ob die Idee gewinnträchtig wäre.

 

OnBarUpdate

Unsere Hauptlogik befindet sich in der OnBarUpdate() Methode. In unserem Beispiel benutzen wir den SMA um Long- bzw. Shortsignare zu generieren. Wenn der SMA20 von unten den SMA50 durchbricht, haben wir ein Longsignal. Wenn der SMA20 den SMA50 von oben durchbricht, haben wir ein Shortsignal.

[pastacode lang=“java“ manual=“protected%20override%20void%20OnBarUpdate()%0A%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fthe%20internal%20function%20CrossAbove%20checks%20if%20the%20two%20values%20are%20crossing%20above%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(CrossAbove(SMA(20)%2C%20SMA(50)%2C%200)%20%3D%3D%20true)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fset%20the%20value%20of%20the%20plot%20to%20%221%22%20to%20inidcate%20a%20long%20signal%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.SMA_CrossOver.Set(1)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fthe%20internal%20function%20CrossBelow%20checks%20if%20the%20two%20values%20are%20crossing%20below%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(CrossBelow(SMA(20)%2C%20SMA(50)%2C%200)%20%3D%3D%20true)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fset%20the%20value%20of%20the%20plot%20to%20%22-1%22%20to%20inidcate%20a%20short%20signal%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.SMA_CrossOver.Set(-1)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fset%20the%20value%20of%20the%20plot%20to%20%220%22%20to%20inidcate%20a%20flat%20signal%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.SMA_CrossOver.Set(0)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%7D“ message=“Tutorial Basic Indicator OnBarUpdate“ highlight=““ provider=“manual“/]

Condition

OnBarUpdate

Gleich wie in unserem Indikator, ist auch die Hauptlogik der Condition in der OnBarUpdate Methode definiert. Zusätzlich greifen wir aber auch auf die Logik des Indikators zu. Dies machen wir, indem wir eine Instanz des Indikator erzeugen und ihn somit im Zugriff haben. Dadurch können wir Daten aus dem Indikator auslesen und unser „Occured“ (=Signal aufgetreten) Objekt befüllen.

[pastacode lang=“java“ manual=“protected%20override%20void%20OnBarUpdate()%0A%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fget%20the%20indicator%0A%20%20%20%20%20%20%20%20%20%20%20%20Example_Indicator_SMA_CrossOver_Basic%20Example_Indicator_SMA_CrossOver_Basic%20%3D%20LeadIndicator.Example_Indicator_SMA_CrossOver_Basic()%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fget%20the%20value%0A%20%20%20%20%20%20%20%20%20%20%20%20double%20returnvalue%20%3D%20Example_Indicator_SMA_CrossOver_Basic%5B0%5D%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fset%20the%20value%0A%20%20%20%20%20%20%20%20%20%20%20%20Occurred.Set(returnvalue)%3B%0A%7D“ message=“Tutorial Basic Condition OnBarUpdate“ highlight=““ provider=“manual“/]

Strategie

OnBarUpdate

Analog zur Condition, erstellen wir auch in der Strategie eine Instanz des Indikators und speichern den im Indikator errechneten Wert in einer Variable. Basierend auf diesen vom Indikator stammenden Rückgabewert, können wir unsere Methoden zur Auftragserstellung rufen.

[pastacode lang=“java“ manual=“protected%20override%20void%20OnBarUpdate()%0A%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20string%20uniqueOrderName%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fget%20the%20indicator%0A%20%20%20%20%20%20%20%20%20%20%20%20Example_Indicator_SMA_CrossOver_Basic%20Example_Indicator_SMA_CrossOver_Basic%20%3D%20LeadIndicator.Example_Indicator_SMA_CrossOver_Basic()%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fget%20the%20value%0A%20%20%20%20%20%20%20%20%20%20%20%20double%20returnvalue%20%3D%20Example_Indicator_SMA_CrossOver_Basic%5B0%5D%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FEntry%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(returnvalue%20%3D%3D%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fdefine%20a%20unique%20name%20for%20the%20order.%20in%20this%20example%20the%20current%20bars%20timestamp%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uniqueOrderName%20%3D%20%22Long_SMA_CrossOver%22%20%2B%20Bars%5B0%5D.Time.ToString()%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fcreate%20the%20long%20order%20with%20quantity%20%221%22%20and%20our%20unique%20OrderName%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IOrder%20_orderenterlong%20%3D%20EnterLong(1%2C%20uniqueOrderName)%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fset%20a%20stop%20loss%20for%20our%20order.%20we%20set%20it%201%25%20below%20the%20current%20price%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SetStopLoss(_orderenterlong.Name%2C%20CalculationMode.Price%2C%20Bars%5B0%5D.Close%20*%200.99%2C%20false)%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fset%20a%20target%20for%20our%20order.%20we%20set%20it%201%25%20above%20the%20current%20price%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SetProfitTarget(_orderenterlong.Name%2C%20CalculationMode.Price%2C%20Bars%5B0%5D.Close%20*%201.01)%3B%0A%20%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(returnvalue%20%3D%3D%20-1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fdefine%20a%20unique%20name%20for%20the%20order.%20in%20this%20example%20the%20current%20bars%20timestamp%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uniqueOrderName%20%3D%20%22Short_SMA_CrossOver%22%20%2B%20Bars%5B0%5D.Time.ToString()%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fcreate%20the%20short%20order%20with%20quantity%20%221%22%20and%20our%20unique%20OrderName%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IOrder%20_orderentershort%20%3D%20EnterShort(1%2C%20uniqueOrderName)%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fset%20a%20stop%20loss%20for%20our%20order.%20we%20set%20it%201%25%20above%20the%20current%20price%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SetStopLoss(_orderentershort.Name%2C%20CalculationMode.Price%2C%20Bars%5B0%5D.Close%20*%201.01%2C%20false)%3B%0A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fset%20a%20target%20for%20our%20order.%20we%20set%20it%201%25%20below%20the%20current%20price%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SetProfitTarget(_orderentershort.Name%2C%20CalculationMode.Price%2C%20Bars%5B0%5D.Close%20*%200.99)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%7D“ message=“Tutorial Basic Strategy OnBarUpdate“ highlight=““ provider=“manual“/]

Sonstiges

Bars required

Um kompatibel für den Backtester zu sein, müssen wir für den Einsatz des SMA50 mindestens 50 Bars bereitstellen. Dieser Wert wird in der Initialize() Methode gesetzt

[pastacode lang=“java“ manual=“this.BarsRequired%20%3D%2050%3B“ message=“this.BarsRequired = 50;“ highlight=““ provider=“manual“/]

Datei- und Klassennamen

Um alle Scripts im AgenaTrader ohne Fehler erstellen oder importieren zu können, haben wir jeweils die Postfixes „indicator“, „strategy“, „condition“ bzw. „alert“ zu den Dateinamen hinzugefügt. Das ist wichtig, da im AgenaTrader keine Dateinamen doppelt vorkommen dürfen! Es ist nicht möglich einen Indikator und eine Condition mit dem gleichen Namen, also beispielsweise „SMA_CrossOver“, zu speichern. Diese müssen eindeutige Namen besitzen, zB. „SMA_CrossOver_indicator“ und „SMA_CrossOver_condition“!

 

DisplayName und ToString()

In jedem Skript überschreiben wir die ToString() Methode und das DisplayName Attribut, um einen lesbaren Text im AgenaTrader anzeigen zu können. Dadurch wird ein lesbarer Text anstatt des Klassennamens im AgenaTrader angezeigt. In Klammer ergänzen wir „C“ für Condition, „I“ für Indikator, „A“ für Alarm und „S“ für Strategie um sicherzustellen, dass wir zwischen den Scripts unterscheiden können (zB wenn wir im Chart Indikatoren oder Conditions bearbeiten).

[pastacode lang=“java“ manual=“%2F%2F%2F%20%3Csummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20defines%20display%20name%20of%20indicator%20(e.g.%20in%20AgenaTrader%20chart%20window)%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3C%2Fsummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3Creturns%3E%3C%2Freturns%3E%0A%20%20%20%20%20%20%20%20public%20override%20string%20ToString()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%22Example%20SMA%20CrossOver%20Basic%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3Csummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20defines%20display%20name%20of%20indicator%20(e.g.%20in%20AgenaTrader%20indicator%20selection%20window)%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3C%2Fsummary%3E%0A%20%20%20%20%20%20%20%20public%20override%20string%20DisplayName%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20get%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%22Example%20SMA%20CrossOver%20Basic%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D“ message=“DisplayName and ToString()“ highlight=““ provider=“manual“/]