# def

## Syntax

`def <variable_name>=<expression>;`

or

`def <variable_name>;`

`<variable_name>=<expression>;`

## Description

Defines a variable you would like to work with.

## Example 1. Non-recursive usage

`def base = Average(close, 12);plot UpperBand = base * 1.1;plot LowerBand = base * 0.9;`

This example shows a simplified SMAEnvelope study, where the `def` reserved word is used to define the base. The rationale of defining this variable is to avoid double calculations (increase performance) in UpperBand and LowerBand plots, because `def` variable values are cached (by means of increasing memory usage).

You can separate the variable definition from its value assignment. Consider the following example:

```declare lower;

input index = {default SPX, "Nasdaq Composite", NDX};

def data;
switch (index) {
case SPX:
data = close("SPX");
case "Nasdaq Composite":
data = close("COMP");
case NDX:
data = close("NDX");
}

plot IndexCorrelation = Correlation(close, data, 10);
```

This example script plots the correlation between the current instrument's data and the data of a specified index. Values of the `data` variable are controlled by the selected `index` input parameter via the switch command.

## Example 2. Recursive usage

`def C = C[1] + volume;plot CumulativeVolume = C;`

This example script illustrates how `def` variable "C" references its own historical values, i.e., "C" designates a recursive variable. Here, the plot will represent cumulative volume starting from the beginning of time period.

## Example 3. Non-recursive and recursive enumerations

You can define a variable as having a limited number of possible values (in which case this variable is called enumeration):

`def trend = {default bullish, bearish};if close > Average(close, 10) {    trend = trend.bullish;} else {    trend = trend.bearish;}AssignBackgroundColor(if trend == trend.bullish then Color.UPTICK else if trend == trend.bearish then Color.DOWNTICK else Color.CURRENT);`

This example script defines variable `trend` as having two possible values: bullish or bearish. The first value is assigned to this variable when the Close price is greater than its 10 period simple moving average and the second value otherwise. This variable controls the color of the background: it is filled with Uptick color when the value is "bullish" and Downtick otherwise. Note that enumerations can only use string values.

The example above shows non-recursive usage of enumerations, however, these can be used recursively:

`def a = {default neutral, up, down};	### line 1: declaration of a def enumerationa = if (close == close[1]) then a.neutral		### line 2: assignment of the values    else if (close > close[1]) then a.up    else if (close < close[1]) then a.down    else a[1];plot q;							### line 6: plot declarationswitch (a) {						### line 7: switch statementcase up:    q = low;case down:    q = high;case neutral:    q = close;}`

The first line of the script is a declaration of a def enumeration `a` having values `neutral`, `up`, and `down`. The `default` keyword indicates the default value of the enumeration. If a value is not assigned to the declared variable, it will always be equal to its default neutral value. The value is assigned to the variable in the second line, followed by plot declaration. Enumerations can only have one assignment statement. Command `switch` defines what should be plotted based on the value of variable `a`.

Note that enumerations are not interchangeable. This means that you cannot assign same values to two different enumerations. Note also that both sides of statements in the enumeration assignment should be of the same type:

`def a = {q, w, e, default r, t, y};def b = {q, w, e, default r, t, y};a = a.q;b = b.q;plot z = a[1] == a.q;plot x = a == z;                                                  ### error in this lineplot y = a != if (1==2) then a else a.q;plot w = if (1==2) then a else a.q != if (1==2) then b else b.q;  ### error in this line`