Skip to content

Commit 718d573

Browse files
committed
Merge branch 'dev'
* dev: Апдейт версии Фикс размеров виджетов: #76 Добавлена цветовая индикация для short float / volume Добавил новые поля: Insider Own, Inst Own, Beta, Short Interest #94 Bump express-rate-limit from 5.5.0 to 5.5.1 Bump eslint from 8.1.0 to 8.2.0 Bump finvizor from 1.0.8 to 1.0.9 Bump shortsqueeze from 1.0.5 to 1.0.6 Bump axios from 0.23.0 to 0.24.0 Bump eslint from 8.0.1 to 8.1.0 Bump p-timeout from 5.0.0 to 5.0.2 Bump nodemon from 2.0.13 to 2.0.14 Bump eslint from 7.32.0 to 8.0.1 Bump axios from 0.22.0 to 0.23.0 Bump express-rate-limit from 5.4.1 to 5.5.0 Bump express-rate-limit from 5.4.0 to 5.4.1 Bump axios from 0.21.4 to 0.22.0
2 parents 073d7ea + bb2d529 commit 718d573

File tree

9 files changed

+441
-786
lines changed

9 files changed

+441
-786
lines changed

doc/img/01.png

277 KB
Loading

package-lock.json

Lines changed: 345 additions & 756 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
{
22
"name": "short-fork",
33
"description": "Stock market helper: display a Short Float & Volume percentage indicator from three different data sources in one place.",
4-
"version": "1.3.5",
4+
"version": "1.3.6",
55
"type": "module",
66
"main": "index.mjs",
77
"exports": "./index.mjs",
88
"dependencies": {
9-
"axios": "^0.21.4",
9+
"axios": "^0.24.0",
1010
"barchart-dot-com": "^1.0.5",
1111
"compression": "^1.7.4",
1212
"express": "^4.17.1",
1313
"express-handlebars": "^5.3.4",
14-
"express-rate-limit": "^5.3.0",
15-
"finvizor": "^1.0.8",
14+
"express-rate-limit": "^5.5.1",
15+
"finvizor": "^1.0.9",
1616
"helmet": "^4.6.0",
1717
"mongoose": "^5.13.9",
1818
"node-schedule": "^2.0.0",
19-
"p-timeout": "^5.0.0",
20-
"shortsqueeze": "^1.0.5",
19+
"p-timeout": "^5.0.2",
20+
"shortsqueeze": "^1.0.6",
2121
"tinkoff-api-securities": "^1.0.4"
2222
},
2323
"devDependencies": {
2424
"dotenv": "^10.0.0",
25-
"eslint": "^7.32.0",
26-
"nodemon": "^2.0.13"
25+
"eslint": "^8.2.0",
26+
"nodemon": "^2.0.14"
2727
},
2828
"engines": {
2929
"node": ">=16.0.0"

public/css/styles.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ a.tag:hover {
127127
/* Tradingview */
128128

129129
.tradingview_tech {
130-
height: 430px;
130+
height: 580px;
131131
overflow: hidden;
132132
}
133133

public/js/Tag.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class Tag {
4343
break
4444

4545
default:
46-
format = this._value
46+
format = `${this._value}${this.sign ? ' ' + this.sign : ''}`
4747
break
4848
}
4949
return format

public/js/apex.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const chartVolume = new ApexCharts(document.getElementById('chartVolume'), {
1010
data: []
1111
}],
1212
chart: {
13-
height: 210,
13+
height: 285,
1414
width: '100%',
1515
type: 'area',
1616
group: 'synced-charts',
@@ -70,7 +70,7 @@ const chartShortPercent = new ApexCharts(document.getElementById('chartShortPerc
7070
data: []
7171
}],
7272
chart: {
73-
height: 210,
73+
height: 285,
7474
width: '100%',
7575
type: 'line',
7676
group: 'synced-charts',

public/js/app.js

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ let pageObj = {
136136
}),
137137
short_flow: new Tag('resp_finviz', 0, {
138138
sign: '%',
139-
isShort: true
139+
best: [0, 3],
140+
danger: [20, Infinity]
140141
}),
141142
peg: new Tag('resp_peg', 0, {
142143
best: [0, 1],
@@ -154,6 +155,22 @@ let pageObj = {
154155
rsi: new Tag('resp_finviz_rsi', 0, {
155156
best: [0, 30],
156157
danger: [70, Infinity]
158+
}),
159+
instOwn: new Tag('resp_instown', 0, {
160+
sign: '%',
161+
isInfo: true
162+
}),
163+
insiderOwn: new Tag('resp_insiderown', 0, {
164+
sign: '%',
165+
isInfo: true
166+
}),
167+
beta: new Tag('resp_beta', 0, {
168+
isInfo: true
169+
}),
170+
shortRatio: new Tag('resp_shortratio', 0, {
171+
sign: 'дн.',
172+
best: [0, 4],
173+
danger: [10, Infinity]
157174
})
158175
}
159176
},
@@ -202,13 +219,15 @@ let pageObj = {
202219
tightshorts: {
203220
current_short_volume: new Tag('resp_tight', 0, {
204221
sign: '%',
205-
isShort: true
222+
best: [0, 30],
223+
danger: [70, 100]
206224
})
207225
},
208226
shortsqueeze: {
209227
short_flow: new Tag('resp_squeeze', 0, {
210228
sign: '%',
211-
isShort: true
229+
best: [0, 3],
230+
danger: [20, Infinity]
212231
})
213232
},
214233
insidersDeals: document.getElementById('resp_insidersDeals_tbody'),
@@ -380,7 +399,7 @@ const clearTags = () => {
380399
}
381400

382401
// Set links and SEC filings
383-
const setLinks = ( quote = '', exchange = '', country = '') => {
402+
const setLinks = (quote = '', exchange = '', country = '') => {
384403
const setChild = (name, link) => {
385404
const a = document.createElement('a')
386405
a.textContent = name
@@ -411,7 +430,7 @@ const setLinks = ( quote = '', exchange = '', country = '') => {
411430
const filingsWrapper = document.getElementById('sec_filings')
412431
const filings = Array.from(filingsWrapper.children)
413432

414-
if(country.toLowerCase() === 'usa') {
433+
if (country.toLowerCase() === 'usa') {
415434
filingsWrapper.classList.remove('is-crossed-out')
416435
filings[0].setAttribute('href', `https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=${quote_alt}&type=10-K&dateb=&owner=exclude&count=40`)
417436
filings[1].setAttribute('href', `https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=${quote_alt}&type=10-Q&dateb=&owner=exclude&count=40`)
@@ -494,22 +513,25 @@ form.addEventListener('submit', async (e) => {
494513
document.title = `Short fork: ${quote}`
495514

496515
// Set earnings date
497-
const earnings = new Date(response.finviz.earnings.date)
498-
const earningsTimeFrame = earnings - new Date()
499-
const marketTime = response.finviz.earnings.marketTime
500-
if (earningsTimeFrame < 63072000000 && earningsTimeFrame > 0) {
501-
document.getElementById('earnings').classList.remove('is-hidden')
502-
document.getElementById('earnings-date').textContent =
503-
`${earnings.toLocaleDateString('ru-RU')} ${marketTime === 'BMO'? 'до открытия рынка': ''}${marketTime === 'AMC'? 'после закрытия рынка': ''}`
504-
}
516+
if (response.finviz.earnings) {
517+
const earnings = new Date(response.finviz.earnings.date)
518+
const earningsTimeFrame = earnings - new Date()
519+
const marketTime = response.finviz.earnings.marketTime
520+
if (earningsTimeFrame < 63072000000 && earningsTimeFrame > 0) {
521+
document.getElementById('earnings').classList.remove('is-hidden')
522+
document.getElementById('earnings-date').textContent =
523+
`${earnings.toLocaleDateString('ru-RU')} ${marketTime === 'BMO'? 'до открытия рынка': ''}${marketTime === 'AMC'? 'после закрытия рынка': ''}`
524+
}
505525

506-
// Set next earnings report
507-
if (earnings > new Date()) {
508-
document.getElementById('resp_report').textContent = earnings.toLocaleDateString('ru-RU')
509-
} else {
510-
document.getElementById('resp_report').textContent = '-'
526+
// Set next earnings report
527+
if (earnings > new Date()) {
528+
document.getElementById('resp_report').textContent = earnings.toLocaleDateString('ru-RU')
529+
} else {
530+
document.getElementById('resp_report').textContent = '-'
531+
}
511532
}
512533

534+
513535
isLoading(false)
514536

515537
} catch (error) {

src/models/finviz.mjs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,22 @@ const finvizSchema = mongoose.Schema({
8686
type: Number,
8787
default: null
8888
},
89+
instOwn: {
90+
type: Number,
91+
default: null
92+
},
93+
insiderOwn: {
94+
type: Number,
95+
default: null
96+
},
97+
beta: {
98+
type: Number,
99+
default: null
100+
},
101+
shortRatio: {
102+
type: Number,
103+
default: null
104+
},
89105
insidersDeals: {
90106
type: Array
91107
},
@@ -137,6 +153,10 @@ finvizSchema.statics.getFromSource = async function (ticker) {
137153
[k]: v
138154
} : b, {})], []),
139155
earnings: fin.earnings,
156+
instOwn: fin.instOwn,
157+
insiderOwn: fin.insiderOwn,
158+
beta: fin.beta,
159+
shortRatio: fin.shortRatio,
140160
_ttl: process.env.TTL_FINVIZ
141161
}
142162
} catch (error) {

src/routers/web-tags.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@
4747
"id": "resp_debteq",
4848
"fullname": "Debt to Equity ratio",
4949
"text": "отражает соотношение долга к собственному капиталу в активах компании. Если мультипликатор Debt/Equity компании выше 1, это означает, что ее активы составляет преимущественно долг, и наоборот, если он меньше 1 - основную часть активов компании составляет собственный капитал. Отсюда же следует вывод, что чем больше значение Debt to Equity ratio, тем выше долговая нагрузка, а значит и риски банкротства у компании."
50+
},
51+
{
52+
"name": "Inst Own",
53+
"id": "resp_instown",
54+
"fullname": "Процент владения институционалами",
55+
"text": "Число акций во владении у институционалов поделённое на общее количество акций в обращении (в процентном соотношении)."
56+
},
57+
{
58+
"name": "Insider Own",
59+
"id": "resp_insiderown",
60+
"fullname": "Процент владения инсайдерами",
61+
"text": "Число акций во владении у инсайдеров поделённое на общее количество акций в обращении (в процентном соотношении)."
5062
}
5163
],
5264
"right": [{
@@ -61,6 +73,12 @@
6173
"fullname": "Дивиденды",
6274
"text": "это часть прибыли или свободного денежного потока (FCF), которую компания выплачивает акционерам."
6375
},
76+
{
77+
"name": "Beta",
78+
"id": "resp_beta",
79+
"fullname": "Бета-коэффициент (Beta) волатильности",
80+
"text": "Если Бета равна единице, это значит, что акция колеблется вместе с рынком и ее риск эквивалентен общерыночному. Значение больше чем 1 указывает на то, что цена ценной бумаги будет более волатильной, чем рынок."
81+
},
6482
{
6583
"name": "SV за 1 день",
6684
"id": "resp_tight",
@@ -79,6 +97,12 @@
7997
"fullname": "Finviz Short Float",
8098
"text": "это процентный показатель, он считается от общего количества акций в свободном обращении и показывает какое количество акций сейчас торгуется в шорт (по данным finviz.com). Если в акции Short Float равен например 30% (это сравнительно большой объем) и по ней выходит хорошая новость - велика вероятность шортсквиза. Шортисты начнут фиксировать прибыль или убыток, что повлечет за собой еще больший рост котировок. Продавцы начнут покупать. Значения приводятся с разных ресурсов, так как у них отличаются источники данных."
8199
},
100+
{
101+
"name": "Short Ratio",
102+
"id": "resp_shortratio",
103+
"fullname": "Short-Interest Ratio",
104+
"text": "Количество акций в шорте (short float) поделённые на средний дневной торговый объём. Представляет собой среднее количество дней необходимое шортистам для покрытия позиций."
105+
},
82106
{
83107
"name": "В Тинькофф",
84108
"id": "resp_tinkoff",

0 commit comments

Comments
 (0)