@tradingaction/indicators 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +24 -0
- package/README.md +5 -0
- package/lib/calculator/atr.d.ts +18 -0
- package/lib/calculator/atr.js +51 -0
- package/lib/calculator/atr.js.map +1 -0
- package/lib/calculator/bollingerband.d.ts +14 -0
- package/lib/calculator/bollingerband.js +72 -0
- package/lib/calculator/bollingerband.js.map +1 -0
- package/lib/calculator/change.d.ts +14 -0
- package/lib/calculator/change.js +30 -0
- package/lib/calculator/change.js.map +1 -0
- package/lib/calculator/compare.d.ts +10 -0
- package/lib/calculator/compare.js +50 -0
- package/lib/calculator/compare.js.map +1 -0
- package/lib/calculator/defaultOptionsForComputation.d.ts +91 -0
- package/lib/calculator/defaultOptionsForComputation.js +100 -0
- package/lib/calculator/defaultOptionsForComputation.js.map +1 -0
- package/lib/calculator/elderRay.d.ts +23 -0
- package/lib/calculator/elderRay.js +69 -0
- package/lib/calculator/elderRay.js.map +1 -0
- package/lib/calculator/ema.d.ts +12 -0
- package/lib/calculator/ema.js +73 -0
- package/lib/calculator/ema.js.map +1 -0
- package/lib/calculator/forceIndex.d.ts +12 -0
- package/lib/calculator/forceIndex.js +27 -0
- package/lib/calculator/forceIndex.js.map +1 -0
- package/lib/calculator/heikinAshi.d.ts +4 -0
- package/lib/calculator/heikinAshi.js +30 -0
- package/lib/calculator/heikinAshi.js.map +1 -0
- package/lib/calculator/index.d.ts +19 -0
- package/lib/calculator/index.js +20 -0
- package/lib/calculator/index.js.map +1 -0
- package/lib/calculator/kagi.d.ts +11 -0
- package/lib/calculator/kagi.js +200 -0
- package/lib/calculator/kagi.js.map +1 -0
- package/lib/calculator/macd.d.ts +18 -0
- package/lib/calculator/macd.js +57 -0
- package/lib/calculator/macd.js.map +1 -0
- package/lib/calculator/pointAndFigure.d.ts +10 -0
- package/lib/calculator/pointAndFigure.js +215 -0
- package/lib/calculator/pointAndFigure.js.map +1 -0
- package/lib/calculator/renko.d.ts +12 -0
- package/lib/calculator/renko.js +170 -0
- package/lib/calculator/renko.js.map +1 -0
- package/lib/calculator/rsi.d.ts +12 -0
- package/lib/calculator/rsi.js +87 -0
- package/lib/calculator/rsi.js.map +1 -0
- package/lib/calculator/sar.d.ts +12 -0
- package/lib/calculator/sar.js +87 -0
- package/lib/calculator/sar.js.map +1 -0
- package/lib/calculator/sma.d.ts +12 -0
- package/lib/calculator/sma.js +27 -0
- package/lib/calculator/sma.js.map +1 -0
- package/lib/calculator/smoothedForceIndex.d.ts +13 -0
- package/lib/calculator/smoothedForceIndex.js +40 -0
- package/lib/calculator/smoothedForceIndex.js.map +1 -0
- package/lib/calculator/sto.d.ts +19 -0
- package/lib/calculator/sto.js +91 -0
- package/lib/calculator/sto.js.map +1 -0
- package/lib/calculator/tma.d.ts +12 -0
- package/lib/calculator/tma.js +66 -0
- package/lib/calculator/tma.js.map +1 -0
- package/lib/calculator/wma.d.ts +12 -0
- package/lib/calculator/wma.js +33 -0
- package/lib/calculator/wma.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/indicator/algorithm.d.ts +10 -0
- package/lib/indicator/algorithm.js +35 -0
- package/lib/indicator/algorithm.js.map +1 -0
- package/lib/indicator/atr.d.ts +26 -0
- package/lib/indicator/atr.js +27 -0
- package/lib/indicator/atr.js.map +1 -0
- package/lib/indicator/baseIndicator.d.ts +16 -0
- package/lib/indicator/baseIndicator.js +59 -0
- package/lib/indicator/baseIndicator.js.map +1 -0
- package/lib/indicator/bollingerBand.d.ts +24 -0
- package/lib/indicator/bollingerBand.js +27 -0
- package/lib/indicator/bollingerBand.js.map +1 -0
- package/lib/indicator/change.d.ts +24 -0
- package/lib/indicator/change.js +25 -0
- package/lib/indicator/change.js.map +1 -0
- package/lib/indicator/compare.d.ts +24 -0
- package/lib/indicator/compare.js +29 -0
- package/lib/indicator/compare.js.map +1 -0
- package/lib/indicator/defaultOptionsForAppearance.d.ts +105 -0
- package/lib/indicator/defaultOptionsForAppearance.js +77 -0
- package/lib/indicator/defaultOptionsForAppearance.js.map +1 -0
- package/lib/indicator/elderImpulse.d.ts +7 -0
- package/lib/indicator/elderImpulse.js +61 -0
- package/lib/indicator/elderImpulse.js.map +1 -0
- package/lib/indicator/elderRay.d.ts +24 -0
- package/lib/indicator/elderRay.js +29 -0
- package/lib/indicator/elderRay.js.map +1 -0
- package/lib/indicator/ema.d.ts +24 -0
- package/lib/indicator/ema.js +29 -0
- package/lib/indicator/ema.js.map +1 -0
- package/lib/indicator/forceIndex.d.ts +24 -0
- package/lib/indicator/forceIndex.js +29 -0
- package/lib/indicator/forceIndex.js.map +1 -0
- package/lib/indicator/heikinAshi.d.ts +3 -0
- package/lib/indicator/heikinAshi.js +28 -0
- package/lib/indicator/heikinAshi.js.map +1 -0
- package/lib/indicator/index.d.ts +23 -0
- package/lib/indicator/index.js +24 -0
- package/lib/indicator/index.js.map +1 -0
- package/lib/indicator/kagi.d.ts +11 -0
- package/lib/indicator/kagi.js +13 -0
- package/lib/indicator/kagi.js.map +1 -0
- package/lib/indicator/macd.d.ts +24 -0
- package/lib/indicator/macd.js +32 -0
- package/lib/indicator/macd.js.map +1 -0
- package/lib/indicator/pointAndFigure.d.ts +10 -0
- package/lib/indicator/pointAndFigure.js +13 -0
- package/lib/indicator/pointAndFigure.js.map +1 -0
- package/lib/indicator/renko.d.ts +12 -0
- package/lib/indicator/renko.js +13 -0
- package/lib/indicator/renko.js.map +1 -0
- package/lib/indicator/rsi.d.ts +24 -0
- package/lib/indicator/rsi.js +29 -0
- package/lib/indicator/rsi.js.map +1 -0
- package/lib/indicator/sar.d.ts +24 -0
- package/lib/indicator/sar.js +29 -0
- package/lib/indicator/sar.js.map +1 -0
- package/lib/indicator/sma.d.ts +24 -0
- package/lib/indicator/sma.js +29 -0
- package/lib/indicator/sma.js.map +1 -0
- package/lib/indicator/stochasticOscillator.d.ts +24 -0
- package/lib/indicator/stochasticOscillator.js +27 -0
- package/lib/indicator/stochasticOscillator.js.map +1 -0
- package/lib/indicator/tma.d.ts +24 -0
- package/lib/indicator/tma.js +29 -0
- package/lib/indicator/tma.js.map +1 -0
- package/lib/indicator/wma.d.ts +24 -0
- package/lib/indicator/wma.js +29 -0
- package/lib/indicator/wma.js.map +1 -0
- package/lib/utils/functor.d.ts +1 -0
- package/lib/utils/functor.js +4 -0
- package/lib/utils/functor.js.map +1 -0
- package/lib/utils/identity.d.ts +1 -0
- package/lib/utils/identity.js +2 -0
- package/lib/utils/identity.js.map +1 -0
- package/lib/utils/index.d.ts +8 -0
- package/lib/utils/index.js +9 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/mappedSlidingWindow.d.ts +15 -0
- package/lib/utils/mappedSlidingWindow.js +77 -0
- package/lib/utils/mappedSlidingWindow.js.map +1 -0
- package/lib/utils/merge.d.ts +11 -0
- package/lib/utils/merge.js +70 -0
- package/lib/utils/merge.js.map +1 -0
- package/lib/utils/path.d.ts +1 -0
- package/lib/utils/path.js +15 -0
- package/lib/utils/path.js.map +1 -0
- package/lib/utils/rebind.d.ts +1 -0
- package/lib/utils/rebind.js +18 -0
- package/lib/utils/rebind.js.map +1 -0
- package/lib/utils/slidingWindow.d.ts +19 -0
- package/lib/utils/slidingWindow.js +111 -0
- package/lib/utils/slidingWindow.js.map +1 -0
- package/lib/utils/zipper.d.ts +7 -0
- package/lib/utils/zipper.js +36 -0
- package/lib/utils/zipper.js.map +1 -0
- package/package.json +49 -0
- package/src/calculator/atr.ts +88 -0
- package/src/calculator/bollingerband.ts +102 -0
- package/src/calculator/change.ts +53 -0
- package/src/calculator/compare.ts +68 -0
- package/src/calculator/defaultOptionsForComputation.ts +117 -0
- package/src/calculator/elderRay.ts +90 -0
- package/src/calculator/ema.ts +92 -0
- package/src/calculator/forceIndex.ts +43 -0
- package/src/calculator/heikinAshi.ts +38 -0
- package/src/calculator/index.ts +19 -0
- package/src/calculator/kagi.ts +249 -0
- package/src/calculator/macd.ts +90 -0
- package/src/calculator/pointAndFigure.ts +255 -0
- package/src/calculator/renko.ts +227 -0
- package/src/calculator/rsi.ts +114 -0
- package/src/calculator/sar.ts +117 -0
- package/src/calculator/sma.ts +41 -0
- package/src/calculator/smoothedForceIndex.ts +53 -0
- package/src/calculator/sto.ts +118 -0
- package/src/calculator/tma.ts +82 -0
- package/src/calculator/wma.ts +49 -0
- package/src/index.ts +1 -0
- package/src/indicator/algorithm.ts +53 -0
- package/src/indicator/atr.ts +58 -0
- package/src/indicator/baseIndicator.ts +97 -0
- package/src/indicator/bollingerBand.ts +55 -0
- package/src/indicator/change.ts +51 -0
- package/src/indicator/compare.ts +57 -0
- package/src/indicator/defaultOptionsForAppearance.ts +77 -0
- package/src/indicator/elderImpulse.ts +73 -0
- package/src/indicator/elderRay.ts +56 -0
- package/src/indicator/ema.ts +58 -0
- package/src/indicator/forceIndex.ts +57 -0
- package/src/indicator/heikinAshi.ts +35 -0
- package/src/indicator/index.ts +25 -0
- package/src/indicator/kagi.ts +18 -0
- package/src/indicator/macd.ts +60 -0
- package/src/indicator/pointAndFigure.ts +18 -0
- package/src/indicator/renko.ts +18 -0
- package/src/indicator/rsi.ts +58 -0
- package/src/indicator/sar.ts +56 -0
- package/src/indicator/sma.ts +57 -0
- package/src/indicator/stochasticOscillator.ts +56 -0
- package/src/indicator/tma.ts +57 -0
- package/src/indicator/wma.ts +58 -0
- package/src/utils/functor.ts +3 -0
- package/src/utils/identity.ts +1 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/mappedSlidingWindow.ts +95 -0
- package/src/utils/merge.ts +93 -0
- package/src/utils/path.ts +16 -0
- package/src/utils/rebind.ts +19 -0
- package/src/utils/slidingWindow.ts +142 -0
- package/src/utils/zipper.ts +45 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { mean } from "d3-array";
|
|
2
|
+
import { slidingWindow } from "../utils";
|
|
3
|
+
import { SMA as defaultOptions } from "./defaultOptionsForComputation";
|
|
4
|
+
export default function () {
|
|
5
|
+
let options = defaultOptions;
|
|
6
|
+
const calculator = (data) => {
|
|
7
|
+
const { windowSize, sourcePath } = options;
|
|
8
|
+
const average = slidingWindow()
|
|
9
|
+
.windowSize(windowSize)
|
|
10
|
+
.sourcePath(sourcePath)
|
|
11
|
+
.accumulator((values) => mean(values));
|
|
12
|
+
return average(data);
|
|
13
|
+
};
|
|
14
|
+
calculator.undefinedLength = () => {
|
|
15
|
+
const { windowSize } = options;
|
|
16
|
+
return windowSize - 1;
|
|
17
|
+
};
|
|
18
|
+
calculator.options = (newOptions) => {
|
|
19
|
+
if (newOptions === undefined) {
|
|
20
|
+
return options;
|
|
21
|
+
}
|
|
22
|
+
options = Object.assign(Object.assign({}, defaultOptions), newOptions);
|
|
23
|
+
return calculator;
|
|
24
|
+
};
|
|
25
|
+
return calculator;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sma.js","sourceRoot":"","sources":["../../src/calculator/sma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,GAAG,IAAI,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAOvE,MAAM,CAAC,OAAO;IACV,IAAI,OAAO,GAAG,cAAc,CAAC;IAE7B,MAAM,UAAU,GAAG,CAAC,IAAW,EAAE,EAAE;QAC/B,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE3C,MAAM,OAAO,GAAG,aAAa,EAAE;aAC1B,UAAU,CAAC,UAAU,CAAC;aACtB,UAAU,CAAC,UAAU,CAAC;aACtB,WAAW,CAAC,CAAC,MAAa,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAElD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,UAAU,CAAC,eAAe,GAAG,GAAG,EAAE;QAC9B,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE/B,OAAO,UAAU,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,UAAU,CAAC,OAAO,GAAG,CAAC,UAAuB,EAAE,EAAE;QAC7C,IAAI,UAAU,KAAK,SAAS,EAAE;YAC1B,OAAO,OAAO,CAAC;SAClB;QAED,OAAO,mCAAQ,cAAc,GAAK,UAAU,CAAE,CAAC;QAE/C,OAAO,UAAU,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,UAAU,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default function (): {
|
|
2
|
+
(data: any[]): {
|
|
3
|
+
force: unknown;
|
|
4
|
+
smoothed: unknown;
|
|
5
|
+
}[];
|
|
6
|
+
undefinedLength(): number;
|
|
7
|
+
options(newOptions?: any): {
|
|
8
|
+
sourcePath: string;
|
|
9
|
+
volumePath: string;
|
|
10
|
+
smoothingType: string;
|
|
11
|
+
smoothingWindow: number;
|
|
12
|
+
} | any;
|
|
13
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { zip } from "d3-array";
|
|
2
|
+
import { SmoothedForceIndex as defaultOptions } from "./defaultOptionsForComputation";
|
|
3
|
+
import ema from "./ema";
|
|
4
|
+
import forceIndex from "./forceIndex";
|
|
5
|
+
import sma from "./sma";
|
|
6
|
+
export default function () {
|
|
7
|
+
const underlyingAlgorithm = forceIndex();
|
|
8
|
+
let options = defaultOptions;
|
|
9
|
+
const calculator = (data) => {
|
|
10
|
+
const { smoothingType, smoothingWindow } = options;
|
|
11
|
+
const { sourcePath, volumePath } = options;
|
|
12
|
+
const algo = underlyingAlgorithm.options({ sourcePath, volumePath });
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
const force = algo(data);
|
|
15
|
+
const ma = smoothingType === "ema" ? ema() : sma();
|
|
16
|
+
const forceMA = ma.options({
|
|
17
|
+
windowSize: smoothingWindow,
|
|
18
|
+
sourcePath: undefined,
|
|
19
|
+
});
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
const smoothed = forceMA(force);
|
|
22
|
+
return zip(force, smoothed).map((d) => ({
|
|
23
|
+
force: d[0],
|
|
24
|
+
smoothed: d[1],
|
|
25
|
+
}));
|
|
26
|
+
};
|
|
27
|
+
calculator.undefinedLength = () => {
|
|
28
|
+
const { smoothingWindow } = options;
|
|
29
|
+
return underlyingAlgorithm.undefinedLength() + smoothingWindow - 1;
|
|
30
|
+
};
|
|
31
|
+
calculator.options = (newOptions) => {
|
|
32
|
+
if (newOptions === undefined) {
|
|
33
|
+
return options;
|
|
34
|
+
}
|
|
35
|
+
options = Object.assign(Object.assign({}, defaultOptions), newOptions);
|
|
36
|
+
return calculator;
|
|
37
|
+
};
|
|
38
|
+
return calculator;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=smoothedForceIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoothedForceIndex.js","sourceRoot":"","sources":["../../src/calculator/smoothedForceIndex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,kBAAkB,IAAI,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,GAAG,MAAM,OAAO,CAAC;AAExB,MAAM,CAAC,OAAO;IACV,MAAM,mBAAmB,GAAG,UAAU,EAAE,CAAC;IAEzC,IAAI,OAAO,GAAG,cAAc,CAAC;IAE7B,MAAM,UAAU,GAAG,CAAC,IAAW,EAAE,EAAE;QAC/B,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;QACnD,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE3C,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QAErE,aAAa;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzB,MAAM,EAAE,GAAG,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;YACvB,UAAU,EAAE,eAAe;YAC3B,UAAU,EAAE,SAAS;SACxB,CAAC,CAAC;QAEH,aAAa;QACb,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACX,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;SACjB,CAAC,CAAC,CAAC;IACR,CAAC,CAAC;IAEF,UAAU,CAAC,eAAe,GAAG,GAAG,EAAE;QAC9B,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;QAEpC,OAAO,mBAAmB,CAAC,eAAe,EAAE,GAAG,eAAe,GAAG,CAAC,CAAC;IACvE,CAAC,CAAC;IAEF,UAAU,CAAC,OAAO,GAAG,CAAC,UAAgB,EAAE,EAAE;QACtC,IAAI,UAAU,KAAK,SAAS,EAAE;YAC1B,OAAO,OAAO,CAAC;SAClB;QAED,OAAO,mCAAQ,cAAc,GAAK,UAAU,CAAE,CAAC;QAE/C,OAAO,UAAU,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,UAAU,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface STOOptions {
|
|
2
|
+
readonly windowSize: number;
|
|
3
|
+
readonly kWindowSize: number;
|
|
4
|
+
readonly dWindowSize: number;
|
|
5
|
+
}
|
|
6
|
+
export default function (): {
|
|
7
|
+
(data: any[]): {
|
|
8
|
+
K: any;
|
|
9
|
+
D: any;
|
|
10
|
+
}[];
|
|
11
|
+
undefinedLength(): number;
|
|
12
|
+
source(newSource?: any): ((d: any) => {
|
|
13
|
+
open: any;
|
|
14
|
+
high: any;
|
|
15
|
+
low: any;
|
|
16
|
+
close: any;
|
|
17
|
+
}) | any;
|
|
18
|
+
options(newOptions?: any): STOOptions | any;
|
|
19
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/*
|
|
2
|
+
https://github.com/ScottLogic/d3fc/blob/master/src/indicator/algorithm/calculator/stochasticOscillator.js
|
|
3
|
+
|
|
4
|
+
The MIT License (MIT)
|
|
5
|
+
|
|
6
|
+
Copyright (c) 2014-2015 Scott Logic Ltd.
|
|
7
|
+
|
|
8
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
in the Software without restriction, including without limitation the rights
|
|
11
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
furnished to do so, subject to the following conditions:
|
|
14
|
+
|
|
15
|
+
The above copyright notice and this permission notice shall be included in
|
|
16
|
+
all copies or substantial portions of the Software.
|
|
17
|
+
|
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
24
|
+
THE SOFTWARE.
|
|
25
|
+
*/
|
|
26
|
+
import { max, mean, min, zip } from "d3-array";
|
|
27
|
+
import { slidingWindow } from "../utils";
|
|
28
|
+
import { FullStochasticOscillator as defaultOptions } from "./defaultOptionsForComputation";
|
|
29
|
+
export default function () {
|
|
30
|
+
let options = defaultOptions;
|
|
31
|
+
let source = (d) => ({ open: d.open, high: d.high, low: d.low, close: d.close });
|
|
32
|
+
const calculator = (data) => {
|
|
33
|
+
const { windowSize, kWindowSize, dWindowSize } = options;
|
|
34
|
+
const high = (d) => source(d).high;
|
|
35
|
+
const low = (d) => source(d).low;
|
|
36
|
+
const close = (d) => source(d).close;
|
|
37
|
+
const kWindow = slidingWindow()
|
|
38
|
+
.windowSize(windowSize)
|
|
39
|
+
.accumulator((values) => {
|
|
40
|
+
const highestHigh = max(values, high);
|
|
41
|
+
if (highestHigh === undefined) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
const lowestLow = min(values, low);
|
|
45
|
+
if (lowestLow === undefined) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const currentClose = close(values[values.length - 1]);
|
|
49
|
+
const k = ((currentClose - lowestLow) / (highestHigh - lowestLow)) * 100;
|
|
50
|
+
return k;
|
|
51
|
+
});
|
|
52
|
+
const kSmoothed = slidingWindow()
|
|
53
|
+
.skipInitial(windowSize - 1)
|
|
54
|
+
.windowSize(kWindowSize)
|
|
55
|
+
.accumulator((values) => mean(values));
|
|
56
|
+
const dWindow = slidingWindow()
|
|
57
|
+
.skipInitial(windowSize - 1 + kWindowSize - 1)
|
|
58
|
+
.windowSize(dWindowSize)
|
|
59
|
+
.accumulator((values) => mean(values));
|
|
60
|
+
const kData = kSmoothed(kWindow(data));
|
|
61
|
+
const dData = dWindow(kData);
|
|
62
|
+
// @ts-ignore
|
|
63
|
+
const indicatorData = zip(kData, dData).map((d) => {
|
|
64
|
+
return {
|
|
65
|
+
K: d[0],
|
|
66
|
+
D: d[1],
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
return indicatorData;
|
|
70
|
+
};
|
|
71
|
+
calculator.undefinedLength = () => {
|
|
72
|
+
const { windowSize, kWindowSize, dWindowSize } = options;
|
|
73
|
+
return windowSize + kWindowSize + dWindowSize;
|
|
74
|
+
};
|
|
75
|
+
calculator.source = (newSource) => {
|
|
76
|
+
if (newSource === undefined) {
|
|
77
|
+
return source;
|
|
78
|
+
}
|
|
79
|
+
source = newSource;
|
|
80
|
+
return calculator;
|
|
81
|
+
};
|
|
82
|
+
calculator.options = (newOptions) => {
|
|
83
|
+
if (newOptions === undefined) {
|
|
84
|
+
return options;
|
|
85
|
+
}
|
|
86
|
+
options = Object.assign(Object.assign({}, defaultOptions), newOptions);
|
|
87
|
+
return calculator;
|
|
88
|
+
};
|
|
89
|
+
return calculator;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=sto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sto.js","sourceRoot":"","sources":["../../src/calculator/sto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface TMAOptions {
|
|
2
|
+
readonly sourcePath?: string;
|
|
3
|
+
readonly windowSize: number;
|
|
4
|
+
}
|
|
5
|
+
export default function (): {
|
|
6
|
+
(data: any[]): any[];
|
|
7
|
+
undefinedLength(): number;
|
|
8
|
+
options(newOptions?: TMAOptions): {
|
|
9
|
+
sourcePath: string;
|
|
10
|
+
windowSize: number;
|
|
11
|
+
} | any;
|
|
12
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*
|
|
2
|
+
TRIMA (Triangular Moving Average).
|
|
3
|
+
|
|
4
|
+
The Triangular Moving Average can be used like any other Moving Average, to
|
|
5
|
+
obtain a smoother representation of the underlying data.
|
|
6
|
+
It is important to note that the Triangular Moving Average is typically much
|
|
7
|
+
smoother than other moving averages.
|
|
8
|
+
|
|
9
|
+
Triangular moving averages give greater weight to prices at the centre of the
|
|
10
|
+
chosen period andi it is calculated as double smoothed SMA (simple moving average).
|
|
11
|
+
|
|
12
|
+
Examples:
|
|
13
|
+
For TimeSerie={a,b,c,d,e,f...} ('a' is the older price)
|
|
14
|
+
|
|
15
|
+
1st value for TMA 4-Period is: ((1*a)+(2*b)+(2*c)+(1*d)) / 6
|
|
16
|
+
2nd value for TMA 4-Period is: ((1*b)+(2*c)+(2*d)+(1*e)) / 6
|
|
17
|
+
|
|
18
|
+
1st value for TMA 5-Period is: ((1*a)+(2*b)+(3*c)+(2*d)+(1*e)) / 9
|
|
19
|
+
2nd value for TMA 5-Period is: ((1*b)+(2*c)+(3*d)+(2*e)+(1*f)) / 9
|
|
20
|
+
|
|
21
|
+
Using algebra, it can be demonstrated that the TMA is equivalent to
|
|
22
|
+
doing a SMA of a SMA. The following explain the rules:
|
|
23
|
+
|
|
24
|
+
(1) When the period is even, TMA(x,period)=SMA(SMA(x,period/2),(period/2)+1)
|
|
25
|
+
(2) When the period is odd, TMA(x,period)=SMA(SMA(x,(period+1)/2),(period+1)/2)
|
|
26
|
+
|
|
27
|
+
In other word:
|
|
28
|
+
(1) A period of 4 becomes TMA(x,4) = SMA( SMA( x, 2), 3 )
|
|
29
|
+
(2) A period of 5 becomes TMA(x,5) = SMA( SMA( x, 3), 3 )
|
|
30
|
+
|
|
31
|
+
The SMA of a SMA is the algorithm generally found in books.
|
|
32
|
+
*/
|
|
33
|
+
import { sum } from "d3-array";
|
|
34
|
+
import { slidingWindow } from "../utils";
|
|
35
|
+
import { TMA as defaultOptions } from "./defaultOptionsForComputation";
|
|
36
|
+
export default function () {
|
|
37
|
+
let options = defaultOptions;
|
|
38
|
+
const calculator = (data) => {
|
|
39
|
+
const { windowSize, sourcePath } = options;
|
|
40
|
+
const n = Math.floor(windowSize / 2);
|
|
41
|
+
const weight = windowSize % 2 === 0 ? n * (n + 1) : (n + 1) * (n + 1);
|
|
42
|
+
const triaverage = slidingWindow()
|
|
43
|
+
.windowSize(windowSize)
|
|
44
|
+
.sourcePath(sourcePath)
|
|
45
|
+
.accumulator((values) => {
|
|
46
|
+
const total = sum(values, (v, i) => {
|
|
47
|
+
return i < n ? (i + 1) * v : (windowSize - i) * v;
|
|
48
|
+
});
|
|
49
|
+
return total / weight;
|
|
50
|
+
});
|
|
51
|
+
return triaverage(data);
|
|
52
|
+
};
|
|
53
|
+
calculator.undefinedLength = () => {
|
|
54
|
+
const { windowSize } = options;
|
|
55
|
+
return windowSize - 1;
|
|
56
|
+
};
|
|
57
|
+
calculator.options = (newOptions) => {
|
|
58
|
+
if (newOptions === undefined) {
|
|
59
|
+
return options;
|
|
60
|
+
}
|
|
61
|
+
options = Object.assign(Object.assign({}, defaultOptions), newOptions);
|
|
62
|
+
return calculator;
|
|
63
|
+
};
|
|
64
|
+
return calculator;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=tma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tma.js","sourceRoot":"","sources":["../../src/calculator/tma.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BE;AAEF,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,GAAG,IAAI,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAOvE,MAAM,CAAC,OAAO;IACV,IAAI,OAAO,GAAG,cAAc,CAAC;IAE7B,MAAM,UAAU,GAAG,CAAC,IAAW,EAAE,EAAE;QAC/B,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE3C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtE,MAAM,UAAU,GAAG,aAAa,EAAE;aAC7B,UAAU,CAAC,UAAU,CAAC;aACtB,UAAU,CAAC,UAAU,CAAC;aACtB,WAAW,CAAC,CAAC,MAAgB,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YACH,OAAO,KAAK,GAAG,MAAM,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEP,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,UAAU,CAAC,eAAe,GAAG,GAAG,EAAE;QAC9B,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE/B,OAAO,UAAU,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,UAAU,CAAC,OAAO,GAAG,CAAC,UAAuB,EAAE,EAAE;QAC7C,IAAI,UAAU,KAAK,SAAS,EAAE;YAC1B,OAAO,OAAO,CAAC;SAClB;QAED,OAAO,mCAAQ,cAAc,GAAK,UAAU,CAAE,CAAC;QAE/C,OAAO,UAAU,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,UAAU,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface WMAOptions {
|
|
2
|
+
sourcePath?: string;
|
|
3
|
+
windowSize: number;
|
|
4
|
+
}
|
|
5
|
+
export default function (): {
|
|
6
|
+
(data: any[]): any[];
|
|
7
|
+
undefinedLength(): number;
|
|
8
|
+
options(newOptions?: WMAOptions): {
|
|
9
|
+
sourcePath: string;
|
|
10
|
+
windowSize: number;
|
|
11
|
+
} | any;
|
|
12
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { sum } from "d3-array";
|
|
2
|
+
import { slidingWindow } from "../utils";
|
|
3
|
+
import { WMA as defaultOptions } from "./defaultOptionsForComputation";
|
|
4
|
+
export default function () {
|
|
5
|
+
let options = defaultOptions;
|
|
6
|
+
const calculator = (data) => {
|
|
7
|
+
const { windowSize, sourcePath } = options;
|
|
8
|
+
const weight = (windowSize * (windowSize + 1)) / 2;
|
|
9
|
+
const waverage = slidingWindow()
|
|
10
|
+
.windowSize(windowSize)
|
|
11
|
+
.sourcePath(sourcePath)
|
|
12
|
+
.accumulator((values) => {
|
|
13
|
+
const total = sum(values, (v, i) => {
|
|
14
|
+
return (i + 1) * v;
|
|
15
|
+
});
|
|
16
|
+
return total / weight;
|
|
17
|
+
});
|
|
18
|
+
return waverage(data);
|
|
19
|
+
};
|
|
20
|
+
calculator.undefinedLength = () => {
|
|
21
|
+
const { windowSize } = options;
|
|
22
|
+
return windowSize - 1;
|
|
23
|
+
};
|
|
24
|
+
calculator.options = (newOptions) => {
|
|
25
|
+
if (newOptions === undefined) {
|
|
26
|
+
return options;
|
|
27
|
+
}
|
|
28
|
+
options = Object.assign(Object.assign({}, defaultOptions), newOptions);
|
|
29
|
+
return calculator;
|
|
30
|
+
};
|
|
31
|
+
return calculator;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=wma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wma.js","sourceRoot":"","sources":["../../src/calculator/wma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,GAAG,IAAI,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAOvE,MAAM,CAAC,OAAO;IACV,IAAI,OAAO,GAAG,cAAc,CAAC;IAE7B,MAAM,UAAU,GAAG,CAAC,IAAW,EAAE,EAAE;QAC/B,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE3C,MAAM,MAAM,GAAG,CAAC,UAAU,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,aAAa,EAAE;aAC3B,UAAU,CAAC,UAAU,CAAC;aACtB,UAAU,CAAC,UAAU,CAAC;aACtB,WAAW,CAAC,CAAC,MAAgB,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC/B,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,OAAO,KAAK,GAAG,MAAM,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEP,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,UAAU,CAAC,eAAe,GAAG,GAAG,EAAE;QAC9B,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE/B,OAAO,UAAU,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,UAAU,CAAC,OAAO,GAAG,CAAC,UAAuB,EAAE,EAAE;QAC7C,IAAI,UAAU,KAAK,SAAS,EAAE;YAC1B,OAAO,OAAO,CAAC;SAClB;QAED,OAAO,mCAAQ,cAAc,GAAK,UAAU,CAAE,CAAC;QAE/C,OAAO,UAAU,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,UAAU,CAAC;AACtB,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./indicator";
|
package/lib/index.js
ADDED
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface Algorithm {
|
|
2
|
+
(data: any[]): any;
|
|
3
|
+
accumulator(): any;
|
|
4
|
+
accumulator(newAccumulator: any): Algorithm;
|
|
5
|
+
windowSize(): number;
|
|
6
|
+
windowSize(windowSize: number): Algorithm;
|
|
7
|
+
merge(): any;
|
|
8
|
+
merge(newMerge: any): Algorithm;
|
|
9
|
+
}
|
|
10
|
+
export default function (): Algorithm;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { identity, merge, slidingWindow } from "../utils";
|
|
2
|
+
export default function () {
|
|
3
|
+
let windowSize = 1;
|
|
4
|
+
let accumulator = identity;
|
|
5
|
+
let mergeAs = identity;
|
|
6
|
+
function algorithm(data) {
|
|
7
|
+
const defaultAlgorithm = slidingWindow().windowSize(windowSize).accumulator(accumulator);
|
|
8
|
+
const calculator = merge().algorithm(defaultAlgorithm).merge(mergeAs);
|
|
9
|
+
const newData = calculator(data);
|
|
10
|
+
return newData;
|
|
11
|
+
}
|
|
12
|
+
algorithm.accumulator = (newAccumulator) => {
|
|
13
|
+
if (newAccumulator === undefined) {
|
|
14
|
+
return accumulator;
|
|
15
|
+
}
|
|
16
|
+
accumulator = newAccumulator;
|
|
17
|
+
return algorithm;
|
|
18
|
+
};
|
|
19
|
+
algorithm.windowSize = (newWindowSize) => {
|
|
20
|
+
if (newWindowSize === undefined) {
|
|
21
|
+
return windowSize;
|
|
22
|
+
}
|
|
23
|
+
windowSize = newWindowSize;
|
|
24
|
+
return algorithm;
|
|
25
|
+
};
|
|
26
|
+
algorithm.merge = (newMerge) => {
|
|
27
|
+
if (newMerge === undefined) {
|
|
28
|
+
return mergeAs;
|
|
29
|
+
}
|
|
30
|
+
mergeAs = newMerge;
|
|
31
|
+
return algorithm;
|
|
32
|
+
};
|
|
33
|
+
return algorithm;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=algorithm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algorithm.js","sourceRoot":"","sources":["../../src/indicator/algorithm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAY1D,MAAM,CAAC,OAAO;IACV,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,QAAQ,CAAC;IAC3B,IAAI,OAAO,GAAG,QAAQ,CAAC;IAEvB,SAAS,SAAS,CAAC,IAAW;QAC1B,MAAM,gBAAgB,GAAG,aAAa,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAEzF,MAAM,UAAU,GAAG,KAAK,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAEjC,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,WAAW,GAAG,CAAC,cAAoB,EAAE,EAAE;QAC7C,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,OAAO,WAAW,CAAC;SACtB;QACD,WAAW,GAAG,cAAc,CAAC;QAC7B,OAAO,SAAS,CAAC;IACrB,CAAC,CAAC;IAEF,SAAS,CAAC,UAAU,GAAG,CAAC,aAAsB,EAAE,EAAE;QAC9C,IAAI,aAAa,KAAK,SAAS,EAAE;YAC7B,OAAO,UAAU,CAAC;SACrB;QACD,UAAU,GAAG,aAAa,CAAC;QAC3B,OAAO,SAAS,CAAC;IACrB,CAAC,CAAC;IAEF,SAAS,CAAC,KAAK,GAAG,CAAC,QAAc,EAAE,EAAE;QACjC,IAAI,QAAQ,KAAK,SAAS,EAAE;YACxB,OAAO,OAAO,CAAC;SAClB;QACD,OAAO,GAAG,QAAQ,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO,SAAsB,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ATROptions } from "../calculator/atr";
|
|
2
|
+
interface ATRIndicator {
|
|
3
|
+
(data: any[], options?: {
|
|
4
|
+
merge: boolean;
|
|
5
|
+
}): any;
|
|
6
|
+
id(): number;
|
|
7
|
+
id(x: number): ATRIndicator;
|
|
8
|
+
accessor(): any;
|
|
9
|
+
accessor(x: any): ATRIndicator;
|
|
10
|
+
stroke(): string | any;
|
|
11
|
+
stroke(x: string | any): ATRIndicator;
|
|
12
|
+
fill(): string | any;
|
|
13
|
+
fill(x: string | any): ATRIndicator;
|
|
14
|
+
echo(): any;
|
|
15
|
+
echo(x: any): ATRIndicator;
|
|
16
|
+
type(): string;
|
|
17
|
+
type(x: string): ATRIndicator;
|
|
18
|
+
merge(): any;
|
|
19
|
+
merge(newMerge: any): ATRIndicator;
|
|
20
|
+
options(): ATROptions;
|
|
21
|
+
options(newOptions: ATROptions): ATRIndicator;
|
|
22
|
+
skipUndefined(): boolean;
|
|
23
|
+
skipUndefined(newSkipUndefined: boolean): ATRIndicator;
|
|
24
|
+
}
|
|
25
|
+
export default function (): ATRIndicator;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { atr } from "../calculator";
|
|
2
|
+
import { merge, rebind } from "../utils";
|
|
3
|
+
import baseIndicator from "./baseIndicator";
|
|
4
|
+
const ALGORITHM_TYPE = "ATR";
|
|
5
|
+
export default function () {
|
|
6
|
+
const base = baseIndicator().type(ALGORITHM_TYPE);
|
|
7
|
+
const underlyingAlgorithm = atr();
|
|
8
|
+
const mergedAlgorithm = merge()
|
|
9
|
+
.algorithm(underlyingAlgorithm)
|
|
10
|
+
.merge((datum, i) => {
|
|
11
|
+
datum.atr = i;
|
|
12
|
+
});
|
|
13
|
+
const indicator = (data, options = { merge: true }) => {
|
|
14
|
+
if (options.merge) {
|
|
15
|
+
if (!base.accessor()) {
|
|
16
|
+
throw new Error(`Set an accessor to ${ALGORITHM_TYPE} before calculating`);
|
|
17
|
+
}
|
|
18
|
+
return mergedAlgorithm(data);
|
|
19
|
+
}
|
|
20
|
+
return underlyingAlgorithm(data);
|
|
21
|
+
};
|
|
22
|
+
rebind(indicator, base, "id", "accessor", "stroke", "fill", "echo", "type");
|
|
23
|
+
rebind(indicator, underlyingAlgorithm, "options");
|
|
24
|
+
rebind(indicator, mergedAlgorithm, "merge", "skipUndefined");
|
|
25
|
+
return indicator;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=atr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atr.js","sourceRoot":"","sources":["../../src/indicator/atr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,MAAM,cAAc,GAAG,KAAK,CAAC;AAwB7B,MAAM,CAAC,OAAO;IACV,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAElD,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC;IAElC,MAAM,eAAe,GAAG,KAAK,EAAE;SAC1B,SAAS,CAAC,mBAAmB,CAAC;SAC9B,KAAK,CAAC,CAAC,KAAU,EAAE,CAAS,EAAE,EAAE;QAC7B,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,CAAC,IAAW,EAAE,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QACzD,IAAI,OAAO,CAAC,KAAK,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBAClB,MAAM,IAAI,KAAK,CAAC,sBAAsB,cAAc,qBAAqB,CAAC,CAAC;aAC9E;YAED,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;SAChC;QAED,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5E,MAAM,CAAC,SAAS,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAE7D,OAAO,SAAyB,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface BaseIndicator {
|
|
2
|
+
(): () => void;
|
|
3
|
+
id(): number;
|
|
4
|
+
id(x: number): BaseIndicator;
|
|
5
|
+
accessor(): any;
|
|
6
|
+
accessor(x: any): BaseIndicator;
|
|
7
|
+
stroke(): string | any;
|
|
8
|
+
stroke(x: string | any): BaseIndicator;
|
|
9
|
+
fill(): string | any;
|
|
10
|
+
fill(x: string | any): BaseIndicator;
|
|
11
|
+
echo(): any;
|
|
12
|
+
echo(x: any): BaseIndicator;
|
|
13
|
+
type(): string;
|
|
14
|
+
type(x: string): BaseIndicator;
|
|
15
|
+
}
|
|
16
|
+
export default function (): BaseIndicator;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { scaleOrdinal } from "d3-scale";
|
|
2
|
+
const defaultColors = ["#F44336", "#2196F3", "#8BC34A", "#FF5722", "#3F51B5", "#03A9F4", "#9C27B0", "#4CAF50"];
|
|
3
|
+
let i = 0;
|
|
4
|
+
const overlayColors = scaleOrdinal(defaultColors);
|
|
5
|
+
export default function () {
|
|
6
|
+
let id = i++;
|
|
7
|
+
let accessor;
|
|
8
|
+
let stroke;
|
|
9
|
+
let fill;
|
|
10
|
+
let echo;
|
|
11
|
+
let type;
|
|
12
|
+
const baseIndicator = () => () => {
|
|
13
|
+
/** Do Nothing */
|
|
14
|
+
};
|
|
15
|
+
baseIndicator.id = (newId) => {
|
|
16
|
+
if (newId === undefined) {
|
|
17
|
+
return id;
|
|
18
|
+
}
|
|
19
|
+
id = newId;
|
|
20
|
+
return baseIndicator;
|
|
21
|
+
};
|
|
22
|
+
baseIndicator.accessor = (newAccessor) => {
|
|
23
|
+
if (newAccessor === undefined) {
|
|
24
|
+
return accessor;
|
|
25
|
+
}
|
|
26
|
+
accessor = newAccessor;
|
|
27
|
+
return baseIndicator;
|
|
28
|
+
};
|
|
29
|
+
baseIndicator.stroke = (newStroke) => {
|
|
30
|
+
if (newStroke === undefined) {
|
|
31
|
+
return !stroke ? (stroke = overlayColors(id)) : stroke;
|
|
32
|
+
}
|
|
33
|
+
stroke = newStroke;
|
|
34
|
+
return baseIndicator;
|
|
35
|
+
};
|
|
36
|
+
baseIndicator.fill = (newFill) => {
|
|
37
|
+
if (newFill === undefined) {
|
|
38
|
+
return !fill ? (fill = overlayColors(id)) : fill;
|
|
39
|
+
}
|
|
40
|
+
fill = newFill;
|
|
41
|
+
return baseIndicator;
|
|
42
|
+
};
|
|
43
|
+
baseIndicator.echo = (newEcho) => {
|
|
44
|
+
if (newEcho === undefined) {
|
|
45
|
+
return echo;
|
|
46
|
+
}
|
|
47
|
+
echo = newEcho;
|
|
48
|
+
return baseIndicator;
|
|
49
|
+
};
|
|
50
|
+
baseIndicator.type = (newType) => {
|
|
51
|
+
if (newType === undefined) {
|
|
52
|
+
return type;
|
|
53
|
+
}
|
|
54
|
+
type = newType;
|
|
55
|
+
return baseIndicator;
|
|
56
|
+
};
|
|
57
|
+
return baseIndicator;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=baseIndicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseIndicator.js","sourceRoot":"","sources":["../../src/indicator/baseIndicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAE/G,IAAI,CAAC,GAAG,CAAC,CAAC;AACV,MAAM,aAAa,GAAG,YAAY,CAAiB,aAAa,CAAC,CAAC;AAkBlE,MAAM,CAAC,OAAO;IACV,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;IACb,IAAI,QAAa,CAAC;IAClB,IAAI,MAAoB,CAAC;IACzB,IAAI,IAAkB,CAAC;IACvB,IAAI,IAAS,CAAC;IACd,IAAI,IAAY,CAAC;IAEjB,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE;QAC7B,iBAAiB;IACrB,CAAC,CAAC;IAEF,aAAa,CAAC,EAAE,GAAG,CAAC,KAAc,EAAE,EAAE;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,OAAO,EAAE,CAAC;SACb;QAED,EAAE,GAAG,KAAK,CAAC;QAEX,OAAO,aAAa,CAAC;IACzB,CAAC,CAAC;IAEF,aAAa,CAAC,QAAQ,GAAG,CAAC,WAAiB,EAAE,EAAE;QAC3C,IAAI,WAAW,KAAK,SAAS,EAAE;YAC3B,OAAO,QAAQ,CAAC;SACnB;QAED,QAAQ,GAAG,WAAW,CAAC;QAEvB,OAAO,aAAa,CAAC;IACzB,CAAC,CAAC;IAEF,aAAa,CAAC,MAAM,GAAG,CAAC,SAAwB,EAAE,EAAE;QAChD,IAAI,SAAS,KAAK,SAAS,EAAE;YACzB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;SAC1D;QAED,MAAM,GAAG,SAAS,CAAC;QAEnB,OAAO,aAAa,CAAC;IACzB,CAAC,CAAC;IAEF,aAAa,CAAC,IAAI,GAAG,CAAC,OAAsB,EAAE,EAAE;QAC5C,IAAI,OAAO,KAAK,SAAS,EAAE;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SACpD;QAED,IAAI,GAAG,OAAO,CAAC;QAEf,OAAO,aAAa,CAAC;IACzB,CAAC,CAAC;IAEF,aAAa,CAAC,IAAI,GAAG,CAAC,OAAa,EAAE,EAAE;QACnC,IAAI,OAAO,KAAK,SAAS,EAAE;YACvB,OAAO,IAAI,CAAC;SACf;QAED,IAAI,GAAG,OAAO,CAAC;QAEf,OAAO,aAAa,CAAC;IACzB,CAAC,CAAC;IAEF,aAAa,CAAC,IAAI,GAAG,CAAC,OAAgB,EAAE,EAAE;QACtC,IAAI,OAAO,KAAK,SAAS,EAAE;YACvB,OAAO,IAAI,CAAC;SACf;QAED,IAAI,GAAG,OAAO,CAAC;QAEf,OAAO,aAAa,CAAC;IACzB,CAAC,CAAC;IAEF,OAAO,aAA8B,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BollingerBandOptions } from "../calculator/bollingerband";
|
|
2
|
+
interface BollingerBandIndicator {
|
|
3
|
+
(data: any[], options?: {
|
|
4
|
+
merge: boolean;
|
|
5
|
+
}): any;
|
|
6
|
+
id(): number;
|
|
7
|
+
id(x: number): BollingerBandIndicator;
|
|
8
|
+
accessor(): any;
|
|
9
|
+
accessor(x: any): BollingerBandIndicator;
|
|
10
|
+
stroke(): string | any;
|
|
11
|
+
stroke(x: string | any): BollingerBandIndicator;
|
|
12
|
+
fill(): string | any;
|
|
13
|
+
fill(x: string | any): BollingerBandIndicator;
|
|
14
|
+
echo(): any;
|
|
15
|
+
echo(x: any): BollingerBandIndicator;
|
|
16
|
+
type(): string;
|
|
17
|
+
type(x: string): BollingerBandIndicator;
|
|
18
|
+
merge(): any;
|
|
19
|
+
merge(newMerge: any): BollingerBandIndicator;
|
|
20
|
+
options(): BollingerBandOptions;
|
|
21
|
+
options(newOptions: BollingerBandOptions): BollingerBandIndicator;
|
|
22
|
+
}
|
|
23
|
+
export default function (): BollingerBandIndicator;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { merge, rebind } from "../utils";
|
|
2
|
+
import { bollingerband } from "../calculator";
|
|
3
|
+
import baseIndicator from "./baseIndicator";
|
|
4
|
+
const ALGORITHM_TYPE = "BollingerBand";
|
|
5
|
+
export default function () {
|
|
6
|
+
const base = baseIndicator().type(ALGORITHM_TYPE);
|
|
7
|
+
const underlyingAlgorithm = bollingerband();
|
|
8
|
+
const mergedAlgorithm = merge()
|
|
9
|
+
.algorithm(underlyingAlgorithm)
|
|
10
|
+
.merge((datum, i) => {
|
|
11
|
+
datum.bollingerBand = i;
|
|
12
|
+
});
|
|
13
|
+
const indicator = (data, options = { merge: true }) => {
|
|
14
|
+
if (options.merge) {
|
|
15
|
+
if (!base.accessor()) {
|
|
16
|
+
throw new Error(`Set an accessor to ${ALGORITHM_TYPE} before calculating`);
|
|
17
|
+
}
|
|
18
|
+
return mergedAlgorithm(data);
|
|
19
|
+
}
|
|
20
|
+
return underlyingAlgorithm(data);
|
|
21
|
+
};
|
|
22
|
+
rebind(indicator, base, "id", "accessor", "stroke", "fill", "echo", "type");
|
|
23
|
+
rebind(indicator, underlyingAlgorithm, "options");
|
|
24
|
+
rebind(indicator, mergedAlgorithm, "merge", "skipUndefined");
|
|
25
|
+
return indicator;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=bollingerBand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bollingerBand.js","sourceRoot":"","sources":["../../src/indicator/bollingerBand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,MAAM,cAAc,GAAG,eAAe,CAAC;AAsBvC,MAAM,CAAC,OAAO;IACV,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAElD,MAAM,mBAAmB,GAAG,aAAa,EAAE,CAAC;IAE5C,MAAM,eAAe,GAAG,KAAK,EAAE;SAC1B,SAAS,CAAC,mBAAmB,CAAC;SAC9B,KAAK,CAAC,CAAC,KAAU,EAAE,CAAS,EAAE,EAAE;QAC7B,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,CAAC,IAAW,EAAE,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QACzD,IAAI,OAAO,CAAC,KAAK,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBAClB,MAAM,IAAI,KAAK,CAAC,sBAAsB,cAAc,qBAAqB,CAAC,CAAC;aAC9E;YAED,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;SAChC;QACD,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5E,MAAM,CAAC,SAAS,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAE7D,OAAO,SAAmC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ChangeOptions } from "../calculator/change";
|
|
2
|
+
interface ChangeIndicator {
|
|
3
|
+
(data: any[], options?: {
|
|
4
|
+
merge: boolean;
|
|
5
|
+
}): any;
|
|
6
|
+
id(): number;
|
|
7
|
+
id(x: number): ChangeIndicator;
|
|
8
|
+
accessor(): any;
|
|
9
|
+
accessor(x: any): ChangeIndicator;
|
|
10
|
+
stroke(): string | any;
|
|
11
|
+
stroke(x: string | any): ChangeIndicator;
|
|
12
|
+
fill(): string | any;
|
|
13
|
+
fill(x: string | any): ChangeIndicator;
|
|
14
|
+
echo(): any;
|
|
15
|
+
echo(x: any): ChangeIndicator;
|
|
16
|
+
type(): string;
|
|
17
|
+
type(x: string): ChangeIndicator;
|
|
18
|
+
merge(): any;
|
|
19
|
+
merge(newMerge: any): ChangeIndicator;
|
|
20
|
+
options(): ChangeOptions;
|
|
21
|
+
options(newOptions: ChangeOptions): ChangeIndicator;
|
|
22
|
+
}
|
|
23
|
+
export default function (): ChangeIndicator;
|
|
24
|
+
export {};
|