var PSAR(var AF, var Max)
{
static var psar0;
static var psar1;
static int lng;
static var af;
static var ep;
static var hp;
static var lp;
if (is(INITRUN))
{
lng = 1; //assume long for initial conditions
af = AF; //init acelleration factor
psar0 = 0;
psar1 = 0;
ep = 0;
hp = 0;
lp = 0;
return; // do not run on bar 0
}
if (Bar == 1)
{
psar0 = priceClose(0); // initialise
psar1 = priceClose(0);
ep = priceHigh(0); // init extreme point as assuming long
hp = priceHigh(0);
lp = priceLow(0);
return psar0;
}
if (lng == 1) psar0 = psar1 + af * (hp - psar1);
else psar0 = psar1 + af * (lp - psar1);
int reverse = 0;
if (lng == 1) //check for reversal
{
if (priceLow(0) < psar0)
{
lng = 0;
reverse = 1; //reverse position to short
psar0 = hp;
lp = priceLow(0);
af = AF;
}
}
else
{
if (priceHigh(0) > psar0)
{
lng = 1;
reverse = 1; //reverse position to long
psar0 = lp;
hp = priceHigh(0);
af = AF;
}
}
if (reverse == 0)
{
if (lng == 1)
{
if (priceHigh(0) > hp)
{
hp = priceHigh(0);
af += AF;
af = min(af,Max);
}
psar0 = min(psar0, min(priceLow(1),priceLow(2)));
}
else
{
if (priceLow(0) < lp)
{
lp = priceLow(0);
af += AF;
af = min(af,Max);
}
psar0 = max(psar0,max(priceHigh(1),priceHigh(2)));
}
}
psar1 = psar0;
return psar0;
}