Tutorial: How to use an Indicator in a Condition or Strategy in the AgenaTrader (Basic)

This tutorial will show you a basic example for indicators, conditions and strategies.

Download source codeĀ files

Indicator

In many cases we are starting with indicators because indicators are the easiest place to start on script development. You will get a quick indication if your trading idea is working and addionally you can screen your instruments of choice visually and verify if your trading idea will be profitable.

OnBarUpdate

Our main logic will be inside the OnBarUpdate() method. In our example, we are using the SMA to get long and short signals. If the SMA20 is crossing above the SMA50 we get a long signal. If the SMA20 is crossing below the SMA50 we create a short signal.

[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

Like in the indicator, the main logic is inside of the OnBarUpdate() method. Because our main logic is inside the indicator itself, we need to create an instance of this very indicator. So we are able to get the data from the indicator and set our “Occured” object.

[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”/]

Strategy

OnBarUpdate

Same procedure as in the condition. We create a fresh instance of the indicator and save the return value into a variable. Based on the return value we call the methods to create orders.

[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”/]

Miscellaneous

Bars required

Because of backtesting reasons: If we use the advanced mode we need at least two bars, but in our case we are using SMA50 so we need at least 50 bars. We set this in the Initialize() method.

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

Filenames and Class names

To import all scripts into AgenaTrader without any error we add “indicator”, “strategy”, “condition” or “alert” to the filename and also to the c# class name. This is important because if you like to use all files in your AgenaTrader the names must be different. It is not possible to have an indicator and condition with the same name, e.g. “SMA_CrossOver”. They must have unique names like “SMA_CrossOver_indicator” and “SMA_CrossOver_condition”!

 

DisplayName and ToString()

In each script we override the ToString() method and the DisplayName property to provide a readable string in AgenaTrader. So we do see a readable string instead of the class name in AgenaTrader. In parentheses we add and C for Condition, I for Indicator, A for Alert and S for Strategy to ensure that we can distinguish between the scripts (e.g. if we are editing on indicators or conditions in charts).

[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”/]