-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStrategy_SigmaChannel.js
67 lines (67 loc) · 3.07 KB
/
Strategy_SigmaChannel.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { CMA } from "./Indicator.js";
import { Param, paramType_Bool } from "./Param.js";
class CStrategy_SigmaChannel {
constructor() {
this.params = [
Param("период", { min: 2, step: 1, progressive: true }, 100, { start: 2, end: 10000 }),
Param("число сигм для открытия", { min: 1, step: 1 }, 2, { start: 1, end: 5 }),
Param("число сигм для закрытия", { min: 0, step: 1 }, 0, { start: 1, end: 5 }),
Param("только покупки", paramType_Bool, false),
//Param("Weighted", paramType_Bool, 0)
//{ name: "Period 1", type: paramType_Period, {min: 1, step: 1, progressive: true}),
//{ name: "Period 2", {min: 1, step: 1, progressive: true}),
];
this.name = "SigmaChannel";
}
getSignaller(param) {
const period = param[0];
const sigmasForOpen = param[1];
const sigmasForClose = Math.min(param[2], sigmasForOpen);
const onlyBuy = param[3] == 1;
let _ma = new CMA(period);
let _prices = [];
let _sigma;
let _signal;
let _highLevelInd = { value() { return _sigma != null ? _ma.value() + sigmasForOpen * _sigma : null; }, name: "High edge" };
let _lowLevelInd = { value() { return _sigma != null ? _ma.value() - sigmasForOpen * _sigma : null; }, name: "Low edge" };
return {
onNewBars(bars) {
let start = Math.max(bars.length - period, 0);
for (let i = start; i < bars.length; i++) {
let bar = bars[i];
_ma.push(bar.close);
_prices.push(bar.close);
if (_prices.length == period + 100)
_prices.splice(0, 100);
}
//_signal= undefined;
},
getSignal() {
//if (_signal!=undefined) return _signal;
let maValue = _ma.value();
if (maValue == null)
return null;
let sum = 0;
for (let i = _prices.length - period; i < _prices.length - 1; i++)
sum += (_prices[i] - maValue) ** 2;
let sigma = _sigma = Math.sqrt(sum / period);
let price = _prices[_prices.length - 1];
let offset = price - maValue;
if (_signal)
if (offset * Math.sign(_signal) >= sigma * sigmasForClose)
_signal = 0;
if (!_signal)
if (Math.abs(offset) >= sigma * sigmasForOpen)
_signal = -Math.sign(offset);
else
_signal = 0;
if (onlyBuy && _signal == -1)
_signal = 0;
return _signal;
},
minRequiredDepthBars: period,
indicators: [_ma, _highLevelInd, _lowLevelInd]
};
}
}
export const Strategy_SigmaChannel = new CStrategy_SigmaChannel;