---
title: Create an Indicator with Overbasic
description: "With Overbasic programming language you can create custom indicators (User-Indicators) to add to your charts and/or use within Overcharts where permitted. Once **created** and **compiled**, these indicators can also be used within other indicators or trading-systems. In charts, indicators are…"
url: "https://www.overcharts.com/en/helpcenter/docs/create-an-indicator-with-overbasic/"
updated: "2023-07-14"
category: Overbasic
---

# Create an Indicator with Overbasic

With Overbasic programming language you can create custom indicators (User-Indicators) to add to your charts and/or use within Overcharts where permitted. Once **created** and **compiled**, these indicators can also be used within other indicators or trading-systems.

In charts, indicators are drawn in the form of a continuous line (curve), histograms, or in the various forms provided for **standard** indicators. A standard indicator is represented by a data series (array). The number of items contained in the data series is equal to the number of periods/bars in the chart. In other words, for each bar of the chart there will be the corresponding value of the indicator.

## **Create a New Indicator**

Before starting the development of an indicator, we recommend you **carefully read** the **Overbasic language syntax documentation, keywords and available built-in functions**.

To create a new indicator:

1. Access **Developer** (the Overcharts development app):
   - from *Overcharts main window* > **Tools** menu > Developer
   - or from *Workspace window* > **Tools** menu > Developer
2. Create the indicator from:
   - *File* menu > **New** > *Indicator - Overbasic*
   - or press **New** button on the top toolbar
   - or from *Indicators* Tab > press '**+**' button on the left vertical toolbar
3. Define the indicator name. The name must comply with the following rules::
   - *can* consist of **letters** (both Uppercase and lowercase) or **numbers**
   - *cannot* contain spaces. The only separator character allowed is **underscore**: "**_**"
   - *cannot* contain special characters such as !"£$%&/()=?^|
   - *cannot* contain special letters (typical of some languages)
   - *cannot* be a number or start with a number
4. Press OK to confirm the name and create the indicator.

Once the indicator is created, the editor opens automatically.

Afterwards, you will be able to access the editor to edit the indicator from indicator list on the left:

- *by double clicking* the indicator name
- or by pressing the corresponding **Open** button next to the indicator name
- or by right clicking the indicator name > **Edit**

### **MAIN function**

The main component of an indicator (the only really mandatory) is the [**Main** function](https://www.overcharts.com/en/helpcenter/docs/overbasic-function/), i.e. the function containing indicator formula. **The result returned by Main function MUST be numeric.**

Main function is always run automatically by Overcharts. In particular:
- in calculating indicator **historical** values, Main function is called for each single bar of the chart and its result will be the value that the indicator will assume on that bar.
- in **real time** calculation, Main function is called for each new data.

**Example**:

The indicator below calculates the midpoint between High and Low for each bar. It will be drawn on chart as a curve passing through the midpoint of each bar.

```
Function Main()
    Return (High + Low) / 2
EndFunction
```

The Main function will be called for each bar of the chart and will return, using **[RETURN](https://www.overcharts.com/en/helpcenter/docs/overbasic-return/)** keyword, the indicator value for that bar.

In an indicator, the **Main function can return up to 10 results** which will correspond to 10 different curves on chart.

In an indicator, the Main function can return up to 10 results which will correspond to 10 different curves on chart. For example, it may be useful to return multiple values (and therefore multiple curves) in the same indicator instead of creating x different indicators, when formulas are very similar to each other or have a large part of the script in common. All curves will have the same Y-axis scale.

Let's add a second result to the Main function from the previous example:

```
Function Main()
    Return (High + Low) / 2 As HL2, (High + 0.1 * High) As SuperHigh
EndFunction
```

**Note**: When there are multiple results, it is mandatory to define a unique name for each result using **AS** keyword. For more information, refer to **[RETURN](https://www.overcharts.com/en/helpcenter/docs/overbasic-return/#1-toc-title)** keyword documentation.

### **PROPERTYs**

By defining one or more **[PROPERTY](https://www.overcharts.com/en/helpcenter/docs/overbasic-property/)**s, you can externally influence the indicator calculation. **[PROPERTY](https://www.overcharts.com/en/helpcenter/docs/overbasic-property/)**s are properties you can set in the indicator configuration on chart, or you can pass as an argument to the indicator function in case you use the indicator in the script of another indicator or trading-system.

We recommend you read **[PROPERTY](https://www.overcharts.com/en/helpcenter/docs/overbasic-property/)** documentation to learn more about PROPERTYs.

**Example**:

The indicator below represents the difference between two moving averages calculated over two different periods. Periods can be set externally using Period1 and Period2 properties.

```
Property Period1 As Numeric
    Range (5, 100)
    Default (20)
EndProperty

Property Period2 As Numeric
    Range (5, 100)
    Default (50)
EndProperty

Function Main()
    Return Mov(Close, Period1) - Mov(Close, Period2)
EndFunction
```

### **PRAGMAs**

A Pragma is a special parameter that allows you to influence the Indicator behavior.
Some Pragmas can be defined exclusively within the script, while others are used to set default values of properties accessible in the Indicator configuration window.

If you do not know what a **[PRAGMA](https://www.overcharts.com/en/helpcenter/docs/overbasic-pragma/)** is and how to use it, we recommend you read **[PRAGMA documentation](https://www.overcharts.com/en/helpcenter/docs/overbasic-pragma/)**.

Among the various pragmas available for indicators, we highlight two of them in importance:

- **USE_REFERENCE_OBJECT_SCALE_AS_DEFAULT**: allows to set the use of reference chart/indicator scale as default. Very useful for all indicators that need to be drawn in the same window as the reference chart/indicator such as, for example, a moving average.

**Example**:

```
Pragma ("USE_REFERENCE_OBJECT_SCALE_AS_DEFAULT", True)

Function Main()
    Return (High + Low) / 2
EndFunction
```

- **VALID_STARTING_FROM**: defines the bar from which to start drawing the indicator curve. In other words, it is the index of the first valid value in the indicator values series.

**Example**:

```
Pragma ("VALID_STARTING_FROM", Period2)

Property Period1 As Numeric
    Range (5, 100)
    Default (20)
EndProperty

Property Period2 As Numeric
    Range (5, 100)
    Default (50)
EndProperty

Function Main()
    Return Mov(Close, Period1) - Mov(Close, Period2)
EndFunction
```

### **Indicator Description**

You can define a description for the indicator using **[INFO](https://www.overcharts.com/en/helpcenter/docs/overbasic-info/)** keyword. Description will be shown, for example, in the available-indicators window.

**Example**:

```
Info "Bar Midpoint"
Pragma ("USE_REFERENCE_OBJECT_SCALE_AS_DEFAULT", True)

Function Main()
    Return (High + Low) / 2
EndFunction
```

### **Indicator on indicator**

To calculate an indicator based on another indicator, you need to define in the script an *Indicator*-type **PROPERTY**. Using this property you will be able to access the external indicator data-series and use it in the calculation.

**Example**:

Let's we calculate the difference between two indicators, both set externally in the indicator configuration window:

```
Property ExtInd1 As Indicator
EndProperty

Property ExtInd2 As Indicator
EndProperty

Function Main()
    Return ExtInd1 - ExtInd2
EndFunction
```

### **Compile/build the Indicator**

To use the indicator in Overcharts, you MUST compile it. Compiling an indicator means transforming the source code into a 'something' that the program understands.

In Developer, you can build a single indicator in one of the following ways:

- by pressing **Compile** button on toolbar inside the Editor window
- or by pressing 'Compile' icon (gear) next to indicator name in indicator list. The icon is ONLY visible if the indicator needs to be compiled.

You can massively compile multiple indicators, in one of the following ways:

- Developer main window > **Compile** menu > *Select which items to compile*
- Developer main window > press **Compile** button on main toolbar > **Select which items to compile**
- Indicator list > press **Compile** button on toolbar above the list > **Select which items to compile**

## **Using the indicator in an external script**

***My.User_indicator.Private*** category contains all user-indicator functions.

To use an indicator within the script of another indicator or trading-system:

1. **Create** and **Compile** the indicator
2. Use the indicator function in the external script. You can find the indicator function in ***My.User_Indicator.Private*** category. Function has the same name as the indicator. If present, it is also necessary to set indicator PROPERTYs by passing them as arguments to the function.

**Example**:

In the example below, *BarMiddleValue* function represents a previously created and compiled indicator. Arguments 10 and 5 are the values of 2 PROPERTYs defined in the *BarMiddleValue* indicator script.

```
Function Main()
    Return BarMiddleValue(10, 5)
EndFunction
```

**Note**: Usually, you can use the indicator function directly without specifying the full path: '*My. User_Indicator. Private*. *BarMiddleValue(10, 5)*'. You need to specify the full path only if exists another function with the same name as the indicator.
