@mathieuc/tradingview 3.0.1 → 3.3.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/.eslintrc.js +6 -0
- package/README.md +28 -2
- package/docs/DOCS.md +3 -0
- package/examples/AllPrivateIndicators.js +4 -4
- package/examples/BuiltInIndicator.js +1 -1
- package/examples/CustomChartType.js +1 -0
- package/examples/Errors.js +147 -153
- package/examples/FakeReplayMode.js +41 -0
- package/examples/GetDrawings.js +26 -0
- package/examples/PinePermManage.js +57 -0
- package/examples/ReplayMode.js +97 -0
- package/examples/UserLogin.js +16 -0
- package/main.js +2 -0
- package/package.json +6 -9
- package/src/FormData.js +36 -0
- package/src/chart/session.js +193 -17
- package/src/chart/study.js +68 -68
- package/src/classes/BuiltInIndicator.js +1 -0
- package/src/classes/PineIndicator.js +7 -7
- package/src/classes/PinePermManager.js +143 -0
- package/src/client.js +17 -10
- package/src/miscRequests.js +148 -103
- package/src/protocol.js +7 -1
- package/src/quote/session.js +1 -0
- package/src/request.js +37 -0
- package/src/types.js +6 -2
- package/src/utils.js +6 -0
- package/test.js +58 -147
- package/tests/1. Search.js +18 -0
- package/tests/2. QuoteSession.js +54 -0
- package/tests/3. SimpleChart.js +61 -0
- package/tests/4. Indicators.js +100 -0
- package/tests/5. BuiltInIndicator.js +41 -0
- package/tests/6. FakeReplayMode.js +59 -0
- package/tests/7. ReplayMode.js +51 -0
- package/tests/8. CustomChartTypes.js +115 -0
- package/tests/9. AllErrors.js +146 -0
- package/.github/FUNDING.yml +0 -1
- package/examples/CurrentTimeframe.js +0 -34
- package/examples/_RenkoIndicator.js +0 -41
- package/tests/alerts/discordWH.js +0 -76
- package/tests/alerts/drawings.js +0 -41
- package/tests/alerts/envLoader.js +0 -11
- package/tests/alerts/manualAlert.js +0 -77
- package/tests/alerts/sentNotifs.js +0 -16
- package/tests/alerts/strategyAlert.js +0 -94
- package/tests/analysis.js +0 -13
- package/tests/indicator.js +0 -42
- package/tests/prices.js +0 -33
- package/tests/strategy.js +0 -56
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
require('./envLoader');
|
|
2
|
-
const { getSentNotifs, addSentNotifs } = require('./sentNotifs');
|
|
3
|
-
const marketAPI = require('../../main');
|
|
4
|
-
const discordWH = require('./discordWH')(process.env.DISCORD_TOKEN);
|
|
5
|
-
|
|
6
|
-
const markets = [
|
|
7
|
-
{
|
|
8
|
-
symbol: 'EURUSD',
|
|
9
|
-
period: '1D',
|
|
10
|
-
settings: {
|
|
11
|
-
1: 21, // HMA 1 Length
|
|
12
|
-
3: 89, // HMA 2 Length
|
|
13
|
-
5: 7, // RSI Length
|
|
14
|
-
8: 2, // Stop Loss (%)
|
|
15
|
-
9: 1, // Take Profit (%)
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
symbol: 'GBPUSD',
|
|
20
|
-
period: '1D',
|
|
21
|
-
settings: {
|
|
22
|
-
1: 220, // HMA 1 Length
|
|
23
|
-
3: 150, // HMA 2 Length
|
|
24
|
-
5: 1, // RSI Length
|
|
25
|
-
8: 2, // Stop Loss (%)
|
|
26
|
-
9: 1, // Take Profit (%)
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
symbol: 'USDCAD',
|
|
31
|
-
period: '1D',
|
|
32
|
-
settings: {
|
|
33
|
-
1: 21, // HMA 1 Length
|
|
34
|
-
3: 89, // HMA 2 Length
|
|
35
|
-
5: 10, // RSI Length
|
|
36
|
-
8: 3, // Stop Loss (%)
|
|
37
|
-
9: 2, // Take Profit (%)
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
];
|
|
41
|
-
|
|
42
|
-
const market = marketAPI(false);
|
|
43
|
-
|
|
44
|
-
market.on('logged', () => {
|
|
45
|
-
markets.forEach((mrk) => {
|
|
46
|
-
console.log('Listen', mrk.symbol);
|
|
47
|
-
|
|
48
|
-
market.initChart({
|
|
49
|
-
symbol: mrk.symbol,
|
|
50
|
-
period: mrk.period || '1D',
|
|
51
|
-
range: mrk.range || 30,
|
|
52
|
-
timezone: mrk.timezone || 'Europe/Paris',
|
|
53
|
-
indicators: [
|
|
54
|
-
// My Magimix Indicator
|
|
55
|
-
{
|
|
56
|
-
name: 'MAGIMIX',
|
|
57
|
-
id: 'USER;d90a5e852ddc439b994db6beff14d702',
|
|
58
|
-
version: mrk.version || 'last',
|
|
59
|
-
settings: mrk.settings || [],
|
|
60
|
-
},
|
|
61
|
-
],
|
|
62
|
-
}, ({ 0: p }) => {
|
|
63
|
-
if (!p.MAGIMIX) return;
|
|
64
|
-
|
|
65
|
-
const signalType = p.MAGIMIX.Longsignal ? 'LONG' : 'SHORT';
|
|
66
|
-
const notifID = `${mrk.symbol}@MAGIMIX@${p.$time}@${signalType}`;
|
|
67
|
-
|
|
68
|
-
if (
|
|
69
|
-
(p.MAGIMIX.Longsignal || p.MAGIMIX.Shortsignal)
|
|
70
|
-
&& !getSentNotifs().includes(notifID)
|
|
71
|
-
) {
|
|
72
|
-
addSentNotifs(notifID);
|
|
73
|
-
console.log(mrk.symbol, 'SIGNAL', new Date(p.$time * 1000).toLocaleString());
|
|
74
|
-
|
|
75
|
-
discordWH({
|
|
76
|
-
content: process.env.DISCORD_MENTION,
|
|
77
|
-
embeds: [
|
|
78
|
-
{
|
|
79
|
-
title: `Magimix ${signalType} signal for ${mrk.symbol} !`,
|
|
80
|
-
color: p.MAGIMIX.Longsignal ? 3066993 : 15158332,
|
|
81
|
-
description: `Magimix ${signalType} signal for ${mrk.symbol} at ${p.$prices.close} !`,
|
|
82
|
-
url: `https://fr.tradingview.com/chart/?symbol=${mrk.symbol}`,
|
|
83
|
-
timestamp: new Date(p.$time * 1000),
|
|
84
|
-
footer: {
|
|
85
|
-
text: 'TradingView',
|
|
86
|
-
icon_url: 'https://tradingview.com/favicon.ico',
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
],
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
});
|
package/tests/analysis.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
const marketAPI = require('../main');
|
|
2
|
-
|
|
3
|
-
(async () => {
|
|
4
|
-
const market = marketAPI(false);
|
|
5
|
-
|
|
6
|
-
const searchBTC = (await market.search('bitcoin euro', 'crypto'))[0];
|
|
7
|
-
console.log('Found Bitcoin / Euro:', searchBTC);
|
|
8
|
-
|
|
9
|
-
const TA = await searchBTC.getTA();
|
|
10
|
-
console.log('Full technical analysis for Bitcoin:', TA);
|
|
11
|
-
|
|
12
|
-
// You can also use this way: await market.getTA('crypto', 'BINANCE:BTCEUR');
|
|
13
|
-
})();
|
package/tests/indicator.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
const marketAPI = require('../main');
|
|
2
|
-
|
|
3
|
-
const market = marketAPI(false);
|
|
4
|
-
|
|
5
|
-
market.on('logged', () => {
|
|
6
|
-
market.initChart({
|
|
7
|
-
symbol: 'COINBASE:BTCEUR',
|
|
8
|
-
period: '240',
|
|
9
|
-
range: 50,
|
|
10
|
-
indicators: [
|
|
11
|
-
{ name: 'ACCU_DISTRIB', id: 'STD;Accumulation_Distribution', version: '25' },
|
|
12
|
-
{ name: 'CIPHER_A', id: 'PUB;vrOJcNRPULteowIsuP6iHn3GIxBJdXwT', version: '1.0' },
|
|
13
|
-
{
|
|
14
|
-
name: 'CIPHER_B',
|
|
15
|
-
id: 'PUB;uA35GeckoTA2EfgI63SD2WCSmca4njxp',
|
|
16
|
-
settings: [ // Activate Stoch divergences
|
|
17
|
-
true, true, true, true, true, true, 9, 12,
|
|
18
|
-
'hlc3', 3, 53, 60, 100, -53, -60, -75, true,
|
|
19
|
-
true, true, 45, -65, true, 15, -40, true, 60,
|
|
20
|
-
150, 2.5, false, 'close', 14, 30, 60, false,
|
|
21
|
-
false, 60, 30, true, true, false, 'close', 14,
|
|
22
|
-
14, 3, 3, true, true, false, 'close', 10, 23,
|
|
23
|
-
50, 0.5, false, false, '720', 0, 0, 0, 0, 0, 0,
|
|
24
|
-
false, '60', '240', 0, 0, false, '240', false,
|
|
25
|
-
],
|
|
26
|
-
version: '15.0',
|
|
27
|
-
},
|
|
28
|
-
// Color Changing Moving Average
|
|
29
|
-
{ name: 'CCMA', id: 'PUB;5nawr3gCESvSHQfOhrLPqQqT4zM23w3X', version: '6.0' },
|
|
30
|
-
],
|
|
31
|
-
}, (periods) => {
|
|
32
|
-
if (!periods[0].CIPHER_B) return;
|
|
33
|
-
if (!periods[0].CCMA) return;
|
|
34
|
-
|
|
35
|
-
console.log('Last period:', {
|
|
36
|
-
price: periods[0].$prices.close,
|
|
37
|
-
moneyFlow: (periods[0].CIPHER_B.RSIMFIArea >= 0) ? 'POSITIVE' : 'NEGATIVE',
|
|
38
|
-
VWAP: periods[0].CIPHER_B.VWAP,
|
|
39
|
-
MA: (periods[0].CCMA.Plot <= periods[0].$prices.close) ? 'ABOVE' : 'UNDER',
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
});
|
package/tests/prices.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
const marketAPI = require('../main');
|
|
2
|
-
|
|
3
|
-
(async () => {
|
|
4
|
-
const market = marketAPI();
|
|
5
|
-
|
|
6
|
-
market.on('logged', async () => {
|
|
7
|
-
console.log('API LOGGED');
|
|
8
|
-
|
|
9
|
-
const searchBTC = (await market.search('bitcoin euro', 'crypto'))[0];
|
|
10
|
-
console.log('Found Bitcoin / Euro:', searchBTC);
|
|
11
|
-
market.subscribe(searchBTC.id);
|
|
12
|
-
|
|
13
|
-
const btcTA = (await market.getTA(searchBTC.type, searchBTC.id));
|
|
14
|
-
console.log('Technical Analysis for Bitcoin / Euro:', btcTA);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
market.on('price', (data) => {
|
|
18
|
-
console.log(data.symbol, '=>', data.price);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
const searchETH = (await market.search('ethereum euro', 'crypto'))[0];
|
|
22
|
-
console.log('Found Ethereum / Euro:', searchETH);
|
|
23
|
-
|
|
24
|
-
setTimeout(() => {
|
|
25
|
-
console.log('Subscribe to', searchETH.id);
|
|
26
|
-
market.subscribe(searchETH.id);
|
|
27
|
-
}, 10000);
|
|
28
|
-
|
|
29
|
-
setTimeout(() => {
|
|
30
|
-
console.log('Unsubscribe from', searchETH.id);
|
|
31
|
-
market.unsubscribe(searchETH.id);
|
|
32
|
-
}, 20000);
|
|
33
|
-
})();
|
package/tests/strategy.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
const marketAPI = require('../main');
|
|
2
|
-
|
|
3
|
-
const market = marketAPI(false);
|
|
4
|
-
|
|
5
|
-
market.on('logged', async () => {
|
|
6
|
-
const indicators = (await market.searchIndicator('strategy'))
|
|
7
|
-
.filter((st) => (st.type === 'strategy' && st.access !== 'invite_only'))
|
|
8
|
-
.map((st) => ({
|
|
9
|
-
name: st.name,
|
|
10
|
-
id: st.id,
|
|
11
|
-
version: st.version,
|
|
12
|
-
settings: {
|
|
13
|
-
commission_type: 'percent',
|
|
14
|
-
commission_value: 0,
|
|
15
|
-
initial_capital: 25000,
|
|
16
|
-
default_qty_value: 20,
|
|
17
|
-
default_qty_type: 'percent_of_equity',
|
|
18
|
-
currency: 'EUR',
|
|
19
|
-
pyramiding: 10,
|
|
20
|
-
},
|
|
21
|
-
}));
|
|
22
|
-
|
|
23
|
-
let total = indicators.length;
|
|
24
|
-
console.log('Found', indicators.length, 'strategies');
|
|
25
|
-
|
|
26
|
-
market.initChart({
|
|
27
|
-
symbol: 'COINBASE:BTCEUR',
|
|
28
|
-
period: '1D',
|
|
29
|
-
range: 0,
|
|
30
|
-
indicators,
|
|
31
|
-
}, (_, strategies) => {
|
|
32
|
-
const loaded = Object.keys(strategies).length;
|
|
33
|
-
console.log(`Loading... ${loaded}/${total}`);
|
|
34
|
-
|
|
35
|
-
if (loaded < total) return;
|
|
36
|
-
market.end();
|
|
37
|
-
|
|
38
|
-
console.log(
|
|
39
|
-
'Best strategies:',
|
|
40
|
-
Object.keys(strategies).map((stName) => ({
|
|
41
|
-
n: stName,
|
|
42
|
-
p: Math.round(strategies[stName].performance.all.netProfitPercent * 1000) / 1000,
|
|
43
|
-
})).sort((a, b) => b.p - a.p),
|
|
44
|
-
);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
market.on('error', (...data) => {
|
|
48
|
-
if (data[1].type === 'study_error') {
|
|
49
|
-
console.error('Error with study:', indicators[data[1].data]);
|
|
50
|
-
total -= 1;
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
console.error(...data);
|
|
55
|
-
});
|
|
56
|
-
});
|