AgenaScriptAgenaTraderDeutsch

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.

protected override void OnBarUpdate()
{
            //the internal function CrossAbove checks if the two values are crossing above
            if (CrossAbove(SMA(20), SMA(50), 0) == true)
            {
                //set the value of the plot to "1" to inidcate a long signal
                this.SMA_CrossOver.Set(1);
            }
            //the internal function CrossBelow checks if the two values are crossing below
            else if (CrossBelow(SMA(20), SMA(50), 0) == true)
            {
                //set the value of the plot to "-1" to inidcate a short signal
                this.SMA_CrossOver.Set(-1);
            }
            else
            {
             //set the value of the plot to "0" to inidcate a flat signal
                this.SMA_CrossOver.Set(0);
            }
}
Tutorial Basic Indicator OnBarUpdate

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.

protected override void OnBarUpdate()
{
            //get the indicator
            Example_Indicator_SMA_CrossOver_Basic Example_Indicator_SMA_CrossOver_Basic = LeadIndicator.Example_Indicator_SMA_CrossOver_Basic();
 
            //get the value
            double returnvalue = Example_Indicator_SMA_CrossOver_Basic[0];
 
            //set the value
            Occurred.Set(returnvalue);
}
Tutorial Basic Condition OnBarUpdate

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.

protected override void OnBarUpdate()
{
            string uniqueOrderName;
 
            //get the indicator
            Example_Indicator_SMA_CrossOver_Basic Example_Indicator_SMA_CrossOver_Basic = LeadIndicator.Example_Indicator_SMA_CrossOver_Basic();
 
            //get the value
            double returnvalue = Example_Indicator_SMA_CrossOver_Basic[0];
 
            //Entry
            if (returnvalue == 1)
            {  
                //define a unique name for the order. in this example the current bars timestamp
                uniqueOrderName = "Long_SMA_CrossOver" + Bars[0].Time.ToString();
 
                //create the long order with quantity "1" and our unique OrderName
                IOrder _orderenterlong = EnterLong(1, uniqueOrderName);
 
                //set a stop loss for our order. we set it 1% below the current price
                SetStopLoss(_orderenterlong.Name, CalculationMode.Price, Bars[0].Close * 0.99, false);
 
                //set a target for our order. we set it 1% above the current price
                SetProfitTarget(_orderenterlong.Name, CalculationMode.Price, Bars[0].Close * 1.01);
 
 
            }
            else if (returnvalue == -1)
            {
                //define a unique name for the order. in this example the current bars timestamp
                uniqueOrderName = "Short_SMA_CrossOver" + Bars[0].Time.ToString();
 
                //create the short order with quantity "1" and our unique OrderName
                IOrder _orderentershort = EnterShort(1, uniqueOrderName);
 
                //set a stop loss for our order. we set it 1% above the current price
                SetStopLoss(_orderentershort.Name, CalculationMode.Price, Bars[0].Close * 1.01, false);
 
                //set a target for our order. we set it 1% below the current price
                SetProfitTarget(_orderentershort.Name, CalculationMode.Price, Bars[0].Close * 0.99);
            }
}
Tutorial Basic Strategy OnBarUpdate

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

this.BarsRequired = 50;
this.BarsRequired = 50;

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).

/// <summary>
        /// defines display name of indicator (e.g. in AgenaTrader chart window)
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return "Example SMA CrossOver Basic";
        }
 
        /// <summary>
        /// defines display name of indicator (e.g. in AgenaTrader indicator selection window)
        /// </summary>
        public override string DisplayName
        {
            get
            {
                return "Example SMA CrossOver Basic";
            }
        }
DisplayName and ToString()
Share