# ALMA Long Only Trading System – Amibroker AFL Code

ALMA (Arnaud Legoux Moving Average) is a technical indicator designed to smooth out the price data. It reduces lag and improves smoothness compared to traditional moving averages. ALMA applies a Gaussian filter to give more weight to the middle of the price window, which can be adjusted to favor recent prices more heavily.

ALMA can be considered a type of FIR filter (Finite Impulse response filter) because it applies a series of weights to a set of data points to produce a smoothed value. The Gaussian distribution used in ALMA shares conceptual similarities with the coefficients used in FIR filters to determine the output.

ALMA Input Parameters

### Parameters:

Window Size (N): Defines how many periods back the average will consider.

Sigma (σ): Determines the width of the Gaussian curve (how quickly the weights decrease).

Offset (M): Shifts the highest weight point from the center. It’s usually set to a value slightly less than (N−1)/2 to compensate for the non-symmetric nature of stock prices.

Long Entry: If ALMA moving average changes from declining mode to inclining mode and RSI(14)>50 and Close Price should be above EMA 20.

Long Exit: If ALMA moving average changes from inclining mode to declining mode.

ALMA Trading System – Amibroker AFL Code

``````_SECTION_BEGIN("Alma Trend Reveral Trading System");

//input parameter controls
windowsize = param("Window Size",5, 5, 30 , 1);
sigma = param("Sigma",2,1,10,1);
offset = Param("Offset",0.85,0.05,1,0.5);

//calculating alma

//Declaring the Function
function alma(source, windowsize, offset, sigma)
{

local m , im, s, coeff;
m = floor(offset * (windowsize - 1));
s = windowsize/sigma;

for(i=0;i<Min(windowsize,BarCount);i++)
{

im = i-m;
coeff[i] = exp(-(im*im)/(2*s*s));

}

result = FIR(source,coeff,windowsize);

return result;

}

//calling the function
mov = alma(Close,windowsize,offset,sigma);

color = IIf(mov > Ref(mov,-1), colorGreen, colorRed);

//plotting alma
Plot(mov,"Alma",color,styleThick);

Buy = mov > Ref(mov,-1) AND Close > EMA(Close,20) AND RSI()>50;
Sell = mov < Ref(mov,-1);

//execution logic
SellPrice = ValueWhen(Sell,Close);

SetPositionSize(1*RoundLotSize,spsShares);

/* Plot Buy and Sell Signal Arrows */
PlotShapes(IIf(Buy, shapeSquare, shapeNone),colorGreen, 0, L, Offset=-40);
PlotShapes(IIf(Sell, shapeSquare, shapeNone),colorRed, 0, H, Offset=40);
PlotShapes(IIf(Sell, shapeSquare, shapeNone),colorOrange, 0,H, Offset=50);
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone),colorWhite, 0,H, Offset=-45);

_SECTION_END();

_SECTION_END();

_SECTION_BEGIN("Candlestick Charts with Date & Time Axis");

//Enable the Date & Time Axis
SetChartOptions(0, chartShowArrows | chartShowDates);

//Plotting Candlestick charts
Plot(Close,"Candle",colorDefault,styleCandle);

_SECTION_END();
``````

Backtesting Metrics

Backtesting Period : Jan 2011 to Nov 2023

Position Size: 1 Lot

Timeframe : Daily

Equity Curve

Equity Curve

Profit Table

## Mini Certification Course on Algorithmic Trading

Welcome to the Mini Certification on Algorithmic Trading using Amibroker and OpenAlgo! This comprehensive 4-part series is designed to equip you with the knowledge...

## Pivot Reversal Strategy – Tradingview Pinescript to Amibroker AFL…

Pivot Reversal Strategy is a popular in-built strategy in Tradingview Platform. Here I had attempted to convert the pinescript v5 to Amibroker AFL Code....