# Linear Decay

## Function Prototype

/* Linear Decay */
/* Type: math */
/* Input arrays: 1    Options: 1    Output arrays: 1 */
/* Inputs: real */
/* Options: period */
/* Outputs: decay */
int ti_decay_start(TI_REAL const *options);
int ti_decay(int size,
TI_REAL const *const *inputs,
TI_REAL const *options,
TI_REAL *const *outputs);

## Description

This documentation is still a work in progress. It has omissions, and it probably has errors too. If you see any issues, or have any general feedback, please get in touch.

Decay is a simple function used to propagate signals from the past into the future. It is useful in conjunction with algorithm trading and machine learning functions.

$$decay_{t} = max(input_{t}, decay_{t-1} - \frac{1}{period}, 0)$$

For example, if you have an input array that represents when two moving averages %cross%, it might look like this:

$$\begin{bmatrix} 0 & 0 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 0 \end{bmatrix}$$

where each 1 represents a day where a crossover occurred. However, it is useful to know about how far back the most recent crossover was, so running that array through decay with a period of 4 produces:

\begin{bmatrix} 0 & 0 & 0 & 1 & .75 & .5 & .25 & 1 & .75 & .5 \end{bmatrix}

## Example Usage

### Calling From C

/* Example usage of Linear Decay */
/* Assuming that 'input' is a pre-loaded array of size 'in_size'. */
TI_REAL *inputs[] = {input};
TI_REAL options[] = {5}; /* period */
TI_REAL *outputs[1]; /* decay */

/* Determine how large the output size is for our options. */
const int out_size = in_size - ti_decay_start(options);

/* Allocate memory for output. */
outputs[0] = malloc(sizeof(TI_REAL) * out_size); assert(outputs[0] != 0); /* decay */

/* Run the actual calculation. */
const int ret = ti_decay(in_size, inputs, options, outputs);
assert(ret == TI_OKAY);


### Calling From Lua (with Tulip Chart bindings)

-- Example usage of Linear Decay
decay = ti.decay(input, 5)


## Example Calculation

period = 5

dateinputdecay
2005-11-0181.5981.59
2005-11-0281.0681.39
2005-11-0382.8782.87
2005-11-0483.0083.00
2005-11-0783.6183.61
2005-11-0883.1583.41
2005-11-0982.8483.21
2005-11-1083.9983.99
2005-11-1184.5584.55
2005-11-1484.3684.36
2005-11-1585.5385.53
2005-11-1686.5486.54
2005-11-1786.8986.89
2005-11-1887.7787.77
2005-11-2187.2987.57

## Other Indicators

Previous indicator: Chaikins Volatility

Next indicator: Double Exponential Moving Average

Random indicator: Vector Hyperbolic Sine