Since Super Trend Calculation depends on the (n-1)th row, how to do it for the 0th row…
Please find my js code below.
var calculateSTR = function(result, period) {
var multiplier = 3;
var csv_arr = [];
csv_arr.push("Date, Open, High, Low, Close, ATR , base up , base low , cur up, cur low, st , action");
var open = [];
var close = [];
var high = [];
var low = [];
_.map(result, function(item) {
open.push(item.open);
close.push(item.close);
high.push(item.high);
low.push(item.low);
});
var atr_result = ATR.calculate({ high: high, low: low, close: close, period: period });
/**
*
* Upper = ((high + low / 2) + Multiplier * ATR …Only if price < upper
Lower = ((high + low / 2) – Multiplier * ATR …Only if price > lower
*
*
*
*
* BASIC UPPERBAND = (HIGH + LOW) / 2 + Multiplier * ATR
BASIC LOWERBAND = (HIGH + LOW) / 2 - Multiplier * ATR
FINAL UPPERBAND = IF( (Current BASICUPPERBAND < Previous FINAL UPPERBAND) and (Previous Close > Previous FINAL UPPERBAND)) THEN (Current BASIC UPPERBAND) ELSE Previous FINALUPPERBAND)
FINAL LOWERBAND = IF( (Current BASIC LOWERBAND > Previous FINAL LOWERBAND) and (Previous Close < Previous FINAL LOWERBAND)) THEN (Current BASIC LOWERBAND) ELSE Previous FINAL LOWERBAND)
SUPERTREND = IF(Current Close <= Current FINAL UPPERBAND ) THEN Current FINAL UPPERBAND ELSE Current FINAL LOWERBAND
*/
//console.log(atr_result);
// console.log(atr_result);
var data_arr = _.last(result, atr_result.length);
var updown_arr = [];
var previous_fup = 0;
var previous_flow = 0;
var pre_close = result[period - 1].close;
console.log("Pre close:" + pre_close);
for (var i = 0; i < atr_result.length; i++) {
var tdata = result[i + period];
var atr = atr_result[i];
var high = tdata.high;
var low = tdata.low;
var bup = (((high + low) / 2) + (multiplier * atr));
var blow = (((high + low) / 2) - (multiplier * atr));
//console.log(`bup: ${bup} blow:${blow}`);
var fup = 0;
var flow = 0;
if (i !== 0) {
var pdata = result[i - 1];
previous_fup = pdata.fup;
previous_flow = pdata.flow;
pre_close = pdata.close;
}
//FINAL UPPERBAND = IF( (Current BASICUPPERBAND < Previous FINAL UPPERBAND) and (Previous Close > Previous FINAL UPPERBAND)) THEN (Current BASIC UPPERBAND) ELSE Previous FINALUPPERBAND)
if (bup < previous_fup && pre_close > previous_fup) {
fup = bup;
} else {
fup = previous_fup;
}
fup = fup === 0 ? bup : fup;
//FINAL LOWERBAND = IF( (Current BASIC LOWERBAND > Previous FINAL LOWERBAND) and (Previous Close < Previous FINAL LOWERBAND)) THEN (Current BASIC LOWERBAND) ELSE Previous FINAL LOWERBAND)
if (blow > previous_flow && pre_close < previous_flow) {
flow = blow;
} else {
flow = previous_flow;
}
flow = flow === 0 ? blow : flow;
//console.log(`fup:${fup} flow:${flow}`);
tdata.fup = fup;
tdata.flow = flow;
var st = tdata.close <= fup ? fup : flow;
var result_action;
if (tdata.close < st) {
result_action = "Sell";
} else {
result_action = "Buy";
}
//console.log(result_action+" :: " + tdata.date);
csv_arr.push([tdata.date, tdata.open, tdata.high, tdata.low, tdata.close, atr, bup, blow, fup, flow, st, result_action].join(','))
}
console.log(csv_arr.join("\n"));
};