calcSAR static method
Implementation
static void calcSAR(List<KLineEntity> dataList) {
const List<double> params = [2, 2, 20]; //calcParams default
final startAf = params[0] / 100;
final step = params[1] / 100;
final maxAf = params[2] / 100;
// Acceleration factor
double af = startAf;
// Extreme point
double ep = -100;
// Determine trend direction — false: downtrend
bool isIncreasing = false;
double sar = 0;
for (int i = 0; i < dataList.length; ++i) {
// the previous period SAR
final preSar = sar;
final high = dataList[i].high;
final low = dataList[i].low;
if (isIncreasing) {
// Uptrend
if (ep == -100 || ep < high) {
// Reinitialize parameters
ep = high;
af = min(af + step, maxAf);
}
sar = preSar + af * (ep - preSar);
final lowMin = min(dataList[max(1, i) - 1].low, low);
if (sar > dataList[i].low) {
sar = ep;
// Reinitialize parameters
af = startAf;
ep = -100;
isIncreasing = !isIncreasing;
} else if (sar > lowMin) {
sar = lowMin;
}
} else {
if (ep == -100 || ep > low) {
// Reinitialize parameters
ep = low;
af = min(af + step, maxAf);
}
sar = preSar + af * (ep - preSar);
final highMax = max(dataList[max(1, i) - 1].high, high);
if (sar < dataList[i].high) {
sar = ep;
// Reinitialize parameters
af = 0;
ep = -100;
isIncreasing = !isIncreasing;
} else if (sar < highMax) {
sar = highMax;
}
}
dataList[i].sar = sar;
}
}