|
|
// VIA: https://github.com/freqtrade/freqtrade-strategies/issues/30
function SuperTrend(r, period, multiplier) {
// atr
var atr = talib.ATR(r, period)
// baseUp , baseDown
var baseUp = []
var baseDown = []
for (var i = 0; i < r.length; i++) {
if (isNaN(atr)) {
baseUp.push(NaN)
baseDown.push(NaN)
continue
}
baseUp.push((r.High + r.Low) / 2 + multiplier * atr)
baseDown.push((r.High + r.Low) / 2 - multiplier * atr)
}
// fiUp , fiDown
var fiUp = []
var fiDown = []
var prevFiUp = 0
var prevFiDown = 0
for (var i = 0; i < r.length; i++) {
if (isNaN(baseUp)) {
fiUp.push(NaN)
} else {
fiUp.push(baseUp < prevFiUp || r[i - 1].Close > prevFiUp ? baseUp : prevFiUp)
prevFiUp = fiUp
}
if (isNaN(baseDown)) {
fiDown.push(NaN)
} else {
fiDown.push(baseDown > prevFiDown || r[i - 1].Close < prevFiDown ? baseDown : prevFiDown)
prevFiDown = fiDown
}
}
var st = []
var prevSt = NaN
for (var i = 0; i < r.length; i++) {
if (i < period) {
st.push(NaN)
continue
}
var nowSt = 0
if (((isNaN(prevSt) && isNaN(fiUp[i - 1])) || prevSt == fiUp[i - 1]) && r.Close <= fiUp) {
nowSt = fiUp
} else if (((isNaN(prevSt) && isNaN(fiUp[i - 1])) || prevSt == fiUp[i - 1]) && r.Close > fiUp) {
nowSt = fiDown
} else if (((isNaN(prevSt) && isNaN(fiDown[i - 1])) || prevSt == fiDown[i - 1]) && r.Close >= fiDown) {
nowSt = fiDown
} else if (((isNaN(prevSt) && isNaN(fiDown[i - 1])) || prevSt == fiDown[i - 1]) && r.Close < fiDown) {
nowSt = fiUp
}
st.push(nowSt)
prevSt = st
}
var up = []
var down = []
for (var i = 0; i < r.length; i++) {
if (isNaN(st)) {
up.push(st)
down.push(st)
}
if (r.Close < st) {
down.push(st)
up.push(NaN)
} else {
down.push(NaN)
up.push(st)
}
}
return [up, down]
}
// 测试指标用的main函数,并非交易策略
function main() {
while (1) {
var r = _C(exchange.GetRecords)
var st = SuperTrend(r, 10, 3)
$.PlotRecords(r, "K")
$.PlotLine("L", st[0][st[0].length - 2], r[r.length - 2].Time)
$.PlotLine("S", st[1][st[1].length - 2], r[r.length - 2].Time)
Sleep(2000)
}
}复制代码 |
|