calSAMDatas method
dynamic
calSAMDatas(
- dynamic high,
- dynamic low,
- dynamic p1,
- dynamic p2,
SAM p1 = 2, p2 = 2
Implementation
calSAMDatas(high, low, p1, p2) {
p1 = p1 / 100;
p2 = p2 / 100;
num AfStep = p1, AfLimit = p2, oParClose = 0.0;
num Af = 0.0,
preAf = 0.0,
ParOpen = 0.0,
preParOpen = 0.0,
Position = 0.0,
prePosition = 0.0,
HHValue = 0.0,
preHHValue = 0.0,
LLValue = 0.0,
preLLValue = 0.0,
High = 0.0,
Low = 0.0;
int i = 0;
var sar = [], upsar = [], downsar = [], len = high.length;
for (i = 0; i < len; i++) {
High = high[i];
Low = low[i];
if (i == 0) {
//如果是第一根k线
Position = 1; //设置初始值 1
Af = AfStep; //设置初始值 等于步进值 0.02
HHValue = High; //设置初始值 第一根k线的最大值
LLValue = Low; //设置初始值 第一根k线的最小值
oParClose = LLValue;
ParOpen = oParClose + Af * (HHValue - oParClose); //计算上升sar 值
if (ParOpen > Low) {
ParOpen = Low;
}
} else {
HHValue = High > preHHValue ? High : preHHValue;
LLValue = Low < preLLValue ? Low : preLLValue;
if (prePosition == 1) {
//上一个position
if (Low <= preParOpen) {
Position = -1;
oParClose = HHValue;
HHValue = High;
LLValue = Low;
Af = AfStep;
ParOpen = oParClose + Af * (LLValue - oParClose);
ParOpen = ParOpen < High ? High : ParOpen;
ParOpen = ParOpen < high[i - 1] ? high[i - 1] : ParOpen;
} else {
Position = prePosition;
oParClose = preParOpen;
if (HHValue > preHHValue && preAf < AfLimit) {
Af = preAf + AfStep > AfLimit ? AfLimit : preAf + AfStep;
} else {
Af = preAf;
}
ParOpen = oParClose + Af * (HHValue - oParClose);
ParOpen = ParOpen > Low ? Low : ParOpen;
ParOpen = ParOpen > low[i - 1] ? low[i - 1] : ParOpen;
}
} else {
if (High >= preParOpen) {
Position = 1;
oParClose = LLValue;
HHValue = High;
LLValue = Low;
Af = AfStep;
ParOpen = oParClose + Af * (HHValue - oParClose);
ParOpen = ParOpen > Low ? Low : ParOpen;
ParOpen = ParOpen > low[i - 1] ? low[i - 1] : ParOpen;
} else {
Position = prePosition;
oParClose = preParOpen;
if (LLValue < preLLValue && preAf < AfLimit) {
Af = preAf + AfStep > AfLimit ? AfLimit : preAf + AfStep;
} else {
Af = preAf;
}
ParOpen = oParClose + Af * (LLValue - oParClose);
ParOpen = ParOpen < High ? High : ParOpen;
ParOpen = ParOpen < high[i - 1] ? high[i - 1] : ParOpen;
}
}
}
preLLValue = LLValue;
preHHValue = HHValue;
preAf = Af;
prePosition = Position;
preParOpen = ParOpen;
sar.add(oParClose);
if (oParClose > High) {
upsar.add(oParClose);
downsar.add("-"); //外面在绘制时会判断是否是数字 如果不是不绘制
} else {
downsar.add(oParClose);
upsar.add("-"); //外面在绘制时会判断是否是数字 如果不是不绘制
}
}
var obj = {};
obj['SAR'] = sar;
obj['UPSAR'] = upsar;
obj['DOWNSAR'] = downsar;
return obj;
}