neuroalpha 0.3.16 → 0.5.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/README.md +0 -1
- package/config/certs/russian_trusted_root_ca.pem +33 -0
- package/docs//320/224/320/225/320/237/320/233/320/236/320/231.md +4 -4
- package/docs//320/230/320/235/320/241/320/242/320/240/320/243/320/232/320/246/320/230/320/257.md +2 -6
- package/docs//320/234/320/225/320/245/320/220/320/235/320/230/320/232/320/220_/320/230_/320/237/320/220/320/240/320/220/320/234/320/225/320/242/320/240/320/253.md +2 -2
- package/package.json +60 -53
- package/public/activate.html +36 -0
- package/public/activate.js +33 -0
- package/public/admin.html +126 -7
- package/public/app.js +608 -182
- package/public/index.html +57 -47
- package/public/landing.html +106 -37
- package/public/legal.html +4 -4
- package/public/styles.css +152 -36
- package/server/api/routes.js +308 -37
- package/server/auth/index.js +79 -15
- package/server/brokers/index.js +1022 -172
- package/server/build-info.js +7 -0
- package/server/config.js +13 -6
- package/server/data/moex.js +6 -4
- package/server/db.js +22 -18
- package/server/desktop-entry.js +103 -0
- package/server/hub.js +28 -14
- package/server/index.js +82 -12
- package/server/instance/agent.js +259 -0
- package/server/instance/central.js +491 -0
- package/server/instance/identity.js +79 -0
- package/server/instance/provision.js +166 -0
- package/server/instance/signing.js +71 -0
- package/server/model/edge.js +19 -0
- package/server/model/forecast.js +107 -57
- package/server/model/live.js +1 -1
- package/server/model/models.js +12 -3
- package/server/model/research.js +218 -30
- package/server/notify/index.js +51 -16
- package/server/params-meta.js +3 -3
- package/server/role.js +44 -0
- package/server/security.js +40 -0
- package/server/strategist/index.js +462 -488
- package/server/strategist/tools.js +675 -532
- package/server/tls-ca.js +32 -0
package/public/index.html
CHANGED
|
@@ -6,21 +6,22 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
7
7
|
<title>Рынок как язык · Мосбиржа</title>
|
|
8
8
|
<link rel="stylesheet" href="styles.css">
|
|
9
|
-
<script src="https://unpkg.com/lightweight-charts@4.2.3/dist/lightweight-charts.standalone.production.js"></script>
|
|
10
|
-
<script src="https://unpkg.com/marked@12.0.2/marked.min.js"></script>
|
|
9
|
+
<script src="https://unpkg.com/lightweight-charts@4.2.3/dist/lightweight-charts.standalone.production.js" integrity="sha384-stKllnUqA9AD0gsKCuUtf5XlqAW7PwIgDagoNsTWkjkBmJ/GZ/uHTgEBxdLV2VSK" crossorigin="anonymous"></script>
|
|
10
|
+
<script src="https://unpkg.com/marked@12.0.2/marked.min.js" integrity="sha384-/TQbtLCAerC3jgaim+N78RZSDYV7ryeoBCVqTuzRrFec2akfBkHS7ACQ3PQhvMVi" crossorigin="anonymous"></script>
|
|
11
|
+
<script src="https://unpkg.com/dompurify@3.2.6/dist/purify.min.js" integrity="sha384-JEyTNhjM6R1ElGoJns4U2Ln4ofPcqzSsynQkmEc/KGy6336qAZl70tDLufbkla+3" crossorigin="anonymous"></script>
|
|
11
12
|
</head>
|
|
12
13
|
<body>
|
|
13
14
|
<header>
|
|
14
15
|
<div class="brand">
|
|
15
|
-
<button id="btn-chat-toggle" type="button" class="
|
|
16
|
+
<button id="btn-chat-toggle" type="button" class="hdr-btn" title="Показать или скрыть панель чата с ИИ-Стратегом">💬 Стратег</button>
|
|
16
17
|
<span class="logo">◈</span><b>НейроАльфа</b><span class="muted">· Рынок как язык · Мосбиржа</span>
|
|
17
18
|
</div>
|
|
18
19
|
<div class="hright">
|
|
19
|
-
<a href="/landing" class="
|
|
20
|
-
<button id="btn-user" type="button" class="
|
|
20
|
+
<a href="/landing" class="hdr-btn" title="Публичная витрина и тарифы">Витрина</a>
|
|
21
|
+
<button id="btn-user" type="button" class="hdr-btn" title="Профиль, подписка и боты Telegram / MAX">Профиль</button>
|
|
21
22
|
<span id="st" class="dot" title="Подключение…"></span>
|
|
22
|
-
<button id="btn-theme" class="icon" title="Светлая / тёмная тема">☀</button>
|
|
23
|
-
<button id="btn-help" class="icon" title="Справка">?</button>
|
|
23
|
+
<button id="btn-theme" class="hdr-btn icon-only" title="Светлая / тёмная тема">☀</button>
|
|
24
|
+
<button id="btn-help" class="hdr-btn icon-only" title="Справка">?</button>
|
|
24
25
|
</div>
|
|
25
26
|
</header>
|
|
26
27
|
|
|
@@ -30,7 +31,7 @@
|
|
|
30
31
|
<b>Стратег</b>
|
|
31
32
|
<span id="chat-status" class="muted small"></span>
|
|
32
33
|
<span class="grow"></span>
|
|
33
|
-
<button id="chat-new" class="icon small" title="Начать новый
|
|
34
|
+
<button id="chat-new" class="icon small" title="Начать новый диалог со Стратегом">+ Новый диалог</button>
|
|
34
35
|
<button id="chat-hide" class="icon small" title="Свернуть панель чата со Стратегом">◀</button>
|
|
35
36
|
</div>
|
|
36
37
|
<div class="feed-wrap">
|
|
@@ -40,31 +41,9 @@
|
|
|
40
41
|
<div class="composer">
|
|
41
42
|
<div id="suggest" class="suggest"></div>
|
|
42
43
|
<div class="prompt-box" id="prompt-box">
|
|
43
|
-
<textarea id="chat-input" rows="2" placeholder="
|
|
44
|
+
<textarea id="chat-input" rows="2" placeholder="Спросите Стратега о прогнозе, портфеле или настройках счёта…"></textarea>
|
|
44
45
|
<div class="prompt-bar">
|
|
45
|
-
<div class="prompt-left">
|
|
46
|
-
<div class="mode-picker" id="mode-picker">
|
|
47
|
-
<button type="button" id="chat-mode-btn" class="ghost-select" title="Режим работы Стратега">
|
|
48
|
-
<span id="chat-mode-ico" class="g-ico"></span>
|
|
49
|
-
<span id="chat-mode-lbl">Авто</span>
|
|
50
|
-
<svg class="caret-svg" width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 4.5L6 7.5L9 4.5"/></svg>
|
|
51
|
-
</button>
|
|
52
|
-
<div id="mode-menu" class="pop-menu mode-menu" hidden>
|
|
53
|
-
<button type="button" class="model-opt" data-mode-val="autopilot">
|
|
54
|
-
<span class="m-name">⚡ Авто</span>
|
|
55
|
-
<span class="muted small">сам ставит эксперименты</span>
|
|
56
|
-
</button>
|
|
57
|
-
<button type="button" class="model-opt" data-mode-val="advisor">
|
|
58
|
-
<span class="m-name">✋ С согласия</span>
|
|
59
|
-
<span class="muted small">спрашивает перед запуском</span>
|
|
60
|
-
</button>
|
|
61
|
-
<button type="button" class="model-opt" data-mode-val="discuss">
|
|
62
|
-
<span class="m-name">💬 Обсуждение</span>
|
|
63
|
-
<span class="muted small">только анализ и беседа</span>
|
|
64
|
-
</button>
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
46
|
+
<div class="prompt-left"></div>
|
|
68
47
|
<div class="prompt-right">
|
|
69
48
|
<div class="model-picker" id="model-picker">
|
|
70
49
|
<button type="button" id="chat-model-btn" class="ghost-select model-btn" title="Модель ИИ (настраивается в «Настройки → Модели ИИ»)">
|
|
@@ -109,13 +88,12 @@
|
|
|
109
88
|
<button type="button" data-sec="news" id="nnav-news">Новости рынка</button>
|
|
110
89
|
<div class="ssep"></div>
|
|
111
90
|
<button type="button" data-sec="overview" id="nnav-overview" hidden>Эксперименты</button>
|
|
112
|
-
<button type="button" data-sec="g0" id="snav-costs">Издержки и новости</button>
|
|
113
91
|
<button type="button" data-sec="cloud" id="snav-cloud">Подписка и уведомления</button>
|
|
114
92
|
<button type="button" data-sec="llm" id="snav-llm">Модели ИИ</button>
|
|
115
93
|
</aside>
|
|
116
94
|
<div class="spane">
|
|
117
95
|
<section class="ssec" data-sec="brokers" id="brokers-trade-box">
|
|
118
|
-
<div class="stitle bar"><span>Брокерские счета</span><button id="btn-broker-add" class="primary" type="button">+ Добавить счёт</button></div>
|
|
96
|
+
<div class="stitle bar"><span>Брокерские счета</span><div class="row-gap" style="align-items:center"><button id="btn-broker-stop-all" type="button" title="Аварийно: поставить авто-торговлю на всех счетах на паузу и снять все активные заявки у брокера. Защитные стопы по открытым позициям продолжат работать">⛔ Остановить всё</button><button id="btn-broker-add" class="primary" type="button">+ Добавить счёт</button></div></div>
|
|
119
97
|
<div class="scard spadded">
|
|
120
98
|
<div id="broker-form-slot">
|
|
121
99
|
<div id="broker-add-box" hidden style="margin-bottom:14px;padding:14px 16px;border:1px solid var(--accent);border-radius:10px;background:var(--bg)">
|
|
@@ -125,19 +103,16 @@
|
|
|
125
103
|
<label><span>Название счёта</span><input name="name" placeholder="Например, Т-Банк основной"></label>
|
|
126
104
|
<label><span>Брокер</span>
|
|
127
105
|
<select name="broker" id="broker-select">
|
|
128
|
-
<optgroup label="
|
|
106
|
+
<optgroup label="Полная поддержка">
|
|
129
107
|
<option value="tbank">Т-Банк (T-Invest API)</option>
|
|
108
|
+
</optgroup>
|
|
109
|
+
<optgroup label="Бета: только с подтверждением заявок (нет защитных стопов, отмены и истории)">
|
|
130
110
|
<option value="finam">Финам (Finam Trade API)</option>
|
|
131
111
|
<option value="bcs">БКС Мир инвестиций (Trade API)</option>
|
|
132
112
|
<option value="alor">Алор Брокер (Alor OpenAPI v2)</option>
|
|
133
113
|
<option value="cifra">Цифра брокер (Tradernet API)</option>
|
|
134
114
|
<option value="iticapital">ITI Capital (OpenAPI)</option>
|
|
135
115
|
</optgroup>
|
|
136
|
-
<optgroup label="Подтверждение заявок (Telegram / MAX) или мост QUIK">
|
|
137
|
-
<option value="sber">СберИнвестиции (Сбербанк)</option>
|
|
138
|
-
<option value="vtb">ВТБ Мои Инвестиции</option>
|
|
139
|
-
<option value="alfa">Альфа-Инвестиции</option>
|
|
140
|
-
</optgroup>
|
|
141
116
|
</select>
|
|
142
117
|
</label>
|
|
143
118
|
<div class="row-gap" style="align-items:center;justify-content:space-between;background:rgba(59,130,246,0.08);border:1px solid rgba(59,130,246,0.3);border-radius:8px;padding:8px 12px">
|
|
@@ -176,6 +151,8 @@
|
|
|
176
151
|
<label><span>Защитный отступ лимитной заявки, %</span><input name="limitOffsetPct" type="number" min="0" max="2" step="0.05" value="0.1"></label>
|
|
177
152
|
<label class="check"><span>Формировать заявки автоматически по закрытию свечи (с отправкой в Telegram / MAX)</span><input name="autoSchedule" type="checkbox" class="switch" checked></label>
|
|
178
153
|
<label class="check"><span>Не торговать в первые и последние 10 минут сессии</span><input name="skipEdgeMinutes" type="checkbox" class="switch" checked></label>
|
|
154
|
+
<label class="check" id="broker-stops-row" title="Т-Банк: на каждую позицию стратегии выставляется стоп-лосс у брокера (−2,6% для покупок, +2,2% для шортов от средней цены). Он сработает, даже если машина выключена. Перед закрытием позиции стратегией стоп снимается автоматически. Бета: проверьте на небольшой позиции"><span>Защитные стоп-заявки у брокера <span class="tag mid">бета</span></span><input name="brokerStops" type="checkbox" class="switch"></label>
|
|
155
|
+
<label class="check" id="broker-cash-sweep-row" title="Т-Банк: когда сигналов на покупку и шорт нет, свободные рубли сверх 3% резерва размещаются в фонд денежного рынка LQDT (~16–18% годовых). При появлении сигнала нужное число паёв LQDT автоматически продаётся в том же пакете перед входом в акции. Ваши начальные паи LQDT (если были на счёте до включения) не затрагиваются"><span>Свободные рубли в фонд денежного рынка LQDT <span class="tag ok">+доход на кэш</span></span><input name="cashSweep" type="checkbox" class="switch"></label>
|
|
179
156
|
<label class="check"><span>Тестовый режим (песочница брокера — виртуальные деньги без риска)</span><input name="sandbox" type="checkbox" class="switch"></label>
|
|
180
157
|
<div class="row-gap" style="justify-content:space-between;flex-wrap:wrap;margin-top:4px">
|
|
181
158
|
<div class="row-gap">
|
|
@@ -192,14 +169,23 @@
|
|
|
192
169
|
</section>
|
|
193
170
|
|
|
194
171
|
<section class="ssec" data-sec="forecast" hidden>
|
|
195
|
-
<div class="stitle bar"><span id="fc-title">Прогноз на ближайшие часы</span><div class="row-gap" style="align-items:center"><
|
|
172
|
+
<div class="stitle bar"><span id="fc-title">Прогноз на ближайшие часы</span><div class="row-gap" style="align-items:center"><button id="btn-refresh-forecast" type="button" title="Обновить живые котировки и пересчитать прогноз прямо сейчас">↻ Обновить</button><button id="btn-ask-forecast" type="button" title="Попросить Стратега разобрать текущий прогноз">💬 Спросить Стратега</button></div></div>
|
|
196
173
|
<div class="scard spadded">
|
|
197
174
|
<div id="forecast" class="muted">Стратегия обучится на последних месяцах и скажет, какие акции, по её мнению, будут сильнее или слабее рынка в ближайшие часы и под чьим влиянием.</div>
|
|
175
|
+
<div style="margin-top:10px;padding-top:8px;border-top:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap">
|
|
176
|
+
<span id="fc-live-badge" class="tag ok" title="Прогноз автоматически пересчитывается каждые 15 секунд по живым котировкам Мосбиржи">● авто-радар</span>
|
|
177
|
+
</div>
|
|
198
178
|
</div>
|
|
199
179
|
</section>
|
|
200
180
|
|
|
201
181
|
<section class="ssec" data-sec="news" id="news-box" hidden>
|
|
202
|
-
<div class="stitle"
|
|
182
|
+
<div class="stitle bar">
|
|
183
|
+
<span>Новости и раскрытия компаний</span>
|
|
184
|
+
<label class="row-gap small" style="cursor:pointer;font-weight:500;color:var(--text)" title="Не покупать бумагу на сильном негативе и не шортить на сильном позитиве за последние 6 часов">
|
|
185
|
+
<span>Блокировать сделки против важных свежих новостей</span>
|
|
186
|
+
<input id="chk-news-filter" type="checkbox" class="switch">
|
|
187
|
+
</label>
|
|
188
|
+
</div>
|
|
203
189
|
<div class="scard spadded">
|
|
204
190
|
<div id="news-list" class="muted">Свежих размеченных новостей пока нет.</div>
|
|
205
191
|
</div>
|
|
@@ -230,6 +216,7 @@
|
|
|
230
216
|
<div class="kpis" id="kpis"></div>
|
|
231
217
|
<div class="muted small" id="sides" title="Вклад покупок и продаж в итог после комиссий, в % от стартовой суммы" hidden></div>
|
|
232
218
|
<div id="stability" class="stab-box" hidden></div>
|
|
219
|
+
<div id="stress" class="stab-box" hidden></div>
|
|
233
220
|
<div id="eq-chart" class="chart"></div>
|
|
234
221
|
<div class="legend" id="legend"></div>
|
|
235
222
|
<details id="periods-box" open hidden>
|
|
@@ -255,8 +242,6 @@
|
|
|
255
242
|
</div>
|
|
256
243
|
</section>
|
|
257
244
|
|
|
258
|
-
<form id="params"></form>
|
|
259
|
-
|
|
260
245
|
<section class="ssec" data-sec="cloud" id="cloud-box" hidden>
|
|
261
246
|
<div class="stitle">Подписка, лицензия и уведомления (Telegram / MAX)</div>
|
|
262
247
|
<div class="scard spadded" id="cloud-pane"></div>
|
|
@@ -318,6 +303,31 @@
|
|
|
318
303
|
</div>
|
|
319
304
|
</div>
|
|
320
305
|
|
|
306
|
+
<!-- Журнал исполнения по счёту: отправленные заявки, ошибки, стопы, ручные действия -->
|
|
307
|
+
<div id="events-modal" class="modal" hidden>
|
|
308
|
+
<div class="modal-box stock-modal-box" role="dialog" aria-labelledby="events-title">
|
|
309
|
+
<div class="modal-head" style="gap:10px">
|
|
310
|
+
<b id="events-title">Журнал исполнения</b>
|
|
311
|
+
<span class="grow"></span>
|
|
312
|
+
<button id="events-close" class="icon" title="Закрыть (Esc)" aria-label="Закрыть">✕</button>
|
|
313
|
+
</div>
|
|
314
|
+
<div id="events-body" class="stock-modal-body">Загрузка…</div>
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
|
|
318
|
+
<!-- Модальное окно досье акции (прогнозы, соседи по карте, график, дивиденды, бизнес-профиль, сделки, новости) -->
|
|
319
|
+
<div id="stock-modal" class="modal" hidden>
|
|
320
|
+
<div class="modal-box stock-modal-box">
|
|
321
|
+
<div class="modal-head" style="gap:10px;flex-wrap:wrap">
|
|
322
|
+
<div id="stock-modal-title" style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:16px"><b>Досье инструмента</b></div>
|
|
323
|
+
<span class="grow"></span>
|
|
324
|
+
<button id="btn-stock-ask" type="button" class="small" title="Попросить Стратега разобрать эту акцию">💬 Спросить Стратега</button>
|
|
325
|
+
<button id="stock-close" class="icon" title="Закрыть (Esc)">✕</button>
|
|
326
|
+
</div>
|
|
327
|
+
<div id="stock-modal-body" class="stock-modal-body">Загрузка…</div>
|
|
328
|
+
</div>
|
|
329
|
+
</div>
|
|
330
|
+
|
|
321
331
|
<!-- Модальное окно подписания Договора-оферты и Декларации о рисках -->
|
|
322
332
|
<div id="offer-modal" class="modal" hidden>
|
|
323
333
|
<div class="modal-box" style="max-width:680px">
|
|
@@ -329,9 +339,9 @@
|
|
|
329
339
|
<p style="margin-top:0"><b>1. Предмет договора:</b> Настоящая Публичная оферта регулирует предоставление доступа к облачной аналитической платформе «НейроАльфа» (PaaS/SaaS) согласно выбранному тарифному плану («Инвестор», «Профи», «VIP»).</p>
|
|
330
340
|
<p><b>2. Правовой статус (отсутствие ИИР и ДУ):</b> Сервис является исключительно программно-техническим средством (калькулятором статистических закономерностей). Исполнитель <b>не осуществляет инвестиционное консультирование</b>, не даёт индивидуальных инвестиционных рекомендаций (ФЗ № 39-ФЗ) и не осуществляет доверительное управление. Все сделки совершаются Пользователем самостоятельно на его личном брокерском счёте.</p>
|
|
331
341
|
<p><b>3. Параметры тарифов и предельные уровни доходности:</b>
|
|
332
|
-
<br>• <b>«Инвестор» (3 900 ₽/мес)</b> — 1 брокерский счёт, стартовый лимит до 1 000 000 ₽ (+ реинвестирование всей заработанной прибыли), торговля только от покупки («Только в рост (без шорта)»)
|
|
333
|
-
<br>• <b>«Профи» (9 900 ₽/мес)</b> — до 5 брокерских счетов, стартовый лимит до 1 000 000 ₽ на каждом счёте (+ реинвестирование всей заработанной прибыли), торговля в рост и в падение (с шортами)
|
|
334
|
-
<br>• <b>«VIP» (по индивидуальному согласованию)</b> — количество счетов и начальная сумма торговли по согласованию, торговля в рост и в падение (с шортами)
|
|
342
|
+
<br>• <b>«Инвестор» (3 900 ₽/мес)</b> — 1 брокерский счёт, стартовый лимит до 1 000 000 ₽ (+ реинвестирование всей заработанной прибыли), торговля только от покупки («Только в рост (без шорта)»);
|
|
343
|
+
<br>• <b>«Профи» (9 900 ₽/мес)</b> — до 5 брокерских счетов, стартовый лимит до 1 000 000 ₽ на каждом счёте (+ реинвестирование всей заработанной прибыли), торговля в рост и в падение (с шортами);
|
|
344
|
+
<br>• <b>«VIP» (по индивидуальному согласованию)</b> — количество счетов и начальная сумма торговли по согласованию, торговля в рост и в падение (с шортами).
|
|
335
345
|
</p>
|
|
336
346
|
<p><b>4. Запрет автоследования и ретрансляции сигналов:</b> Пользователю строго запрещается подключать к платформе счета, участвующие в сервисах автоследования или копирования сделок (как в роли ведущего/автора стратегии, так и в роли подписчика), а также передавать или перепродавать сигналы третьим лицам. При обнаружении признаков автоследования счёт автоматически блокируется.</p>
|
|
337
347
|
<p style="margin-bottom:0"><b>5. Декларация о рисках:</b> Торговля ценными бумагами сопряжена с риском потери части или всего инвестированного капитала. Результаты на исторических данных не гарантируют доходности в будущем. Полный текст документа: <a href="/legal" target="_blank" style="color:var(--accent)">открыть /legal →</a></p>
|
package/public/landing.html
CHANGED
|
@@ -335,7 +335,7 @@
|
|
|
335
335
|
</nav>
|
|
336
336
|
<div style="display:flex;gap:10px" id="nav-auth">
|
|
337
337
|
<button class="btn" id="btn-login-open">Войти</button>
|
|
338
|
-
<a class="btn primary" href="#pricing" id="btn-nav-cta"
|
|
338
|
+
<a class="btn primary" href="#pricing" id="btn-nav-cta">Тарифы и подключение →</a>
|
|
339
339
|
</div>
|
|
340
340
|
</div>
|
|
341
341
|
</header>
|
|
@@ -381,7 +381,7 @@
|
|
|
381
381
|
<div class="term-top">
|
|
382
382
|
<div class="dots"><i style="background:#f43f5e"></i><i style="background:#f59e0b"></i><i style="background:#10b981"></i></div>
|
|
383
383
|
<span style="color:var(--muted)">НейроАльфа · Прогноз на 2 часа · Самообучение: вкл.</span>
|
|
384
|
-
<span
|
|
384
|
+
<span style="font-weight:700;color:var(--muted)">пример экрана</span>
|
|
385
385
|
</div>
|
|
386
386
|
<div class="sig-row">
|
|
387
387
|
<b>LKOH</b>
|
|
@@ -484,13 +484,13 @@
|
|
|
484
484
|
</div>
|
|
485
485
|
<div class="bcard">
|
|
486
486
|
<div class="bicon">2</div>
|
|
487
|
-
<h3>Выберите
|
|
488
|
-
<p
|
|
487
|
+
<h3>Выберите тариф</h3>
|
|
488
|
+
<p>«Инвестор» — только покупки и один счёт; «Профи» — покупки и шорты, до 5 счетов; «VIP» — индивидуальные лимиты и установка на свой компьютер по договору.</p>
|
|
489
489
|
</div>
|
|
490
490
|
<div class="bcard">
|
|
491
491
|
<div class="bicon">3</div>
|
|
492
492
|
<h3>Торгуйте с жёсткими предохранителями</h3>
|
|
493
|
-
<p>Подключите счёт
|
|
493
|
+
<p>Подключите счёт Т-Банка в режиме «Подтверждение в 1 клик в Telegram / MAX» или «Полный автомат» с защитой стартового портфеля. БКС, Финам и Алор — в бета-режиме, только с подтверждением заявок.</p>
|
|
494
494
|
</div>
|
|
495
495
|
</div>
|
|
496
496
|
</section>
|
|
@@ -542,7 +542,7 @@
|
|
|
542
542
|
<li><b>1 брокерский счёт</b> (Т-Банк, БКС, Финам, Алор и др.)</li>
|
|
543
543
|
<li>Лимит стартового капитала: <b>до 1 000 000 ₽</b> (+ 100% реинвестирование всей прибыли)</li>
|
|
544
544
|
<li>Режим <b>«Только в рост (без шорта)»</b>, также доступен тестовый контур (песочница брокера)</li>
|
|
545
|
-
<li
|
|
545
|
+
<li>Дневной стоп по просадке, лимит суммы и защитные стопы</li>
|
|
546
546
|
<li>Подтверждение заявок в 1 клик в <b>Telegram и MAX</b></li>
|
|
547
547
|
</ul>
|
|
548
548
|
<button class="btn primary" data-buy="investor">Оформить «Инвестор»</button>
|
|
@@ -557,7 +557,7 @@
|
|
|
557
557
|
<li>До <b>5 брокерских счетов</b> параллельно</li>
|
|
558
558
|
<li>Лимит стартового капитала: <b>до 1 000 000 ₽</b> на каждом счёте (+ 100% реинвестирование всей прибыли)</li>
|
|
559
559
|
<li>Режим <b>«В рост и в падение (с шортом)»</b> с адаптацией к тренду индекса</li>
|
|
560
|
-
<li
|
|
560
|
+
<li>Защитные стоп-заявки у брокера (Т-Банк, бета)</li>
|
|
561
561
|
<li>Поддержка боевого и тестового (песочница) режимов на каждом счёте</li>
|
|
562
562
|
</ul>
|
|
563
563
|
<button class="btn primary" data-buy="pro">Оформить «Профи»</button>
|
|
@@ -566,14 +566,14 @@
|
|
|
566
566
|
|
|
567
567
|
<div class="plan-vip-wide">
|
|
568
568
|
<div>
|
|
569
|
-
<span class="pop-ribbon" style="position:static;display:inline-block;margin-bottom:8px;background:linear-gradient(135deg,#d97706,#f59e0b)"
|
|
569
|
+
<span class="pop-ribbon" style="position:static;display:inline-block;margin-bottom:8px;background:linear-gradient(135deg,#d97706,#f59e0b)">Индивидуальные условия</span>
|
|
570
570
|
<h3 style="font-size:24px;margin-bottom:6px">👑 Тариф VIP</h3>
|
|
571
571
|
<div class="plan-desc" style="margin-bottom:10px">Индивидуальное количество счетов и начальная сумма торговли по согласованию</div>
|
|
572
572
|
<div style="font-size:26px;font-weight:800;color:#fbbf24">По согласованию</div>
|
|
573
573
|
</div>
|
|
574
574
|
<ul>
|
|
575
575
|
<li><b>Количество брокерских счетов и начальная сумма торговли</b> — по индивидуальному согласованию</li>
|
|
576
|
-
<li
|
|
576
|
+
<li>Облачная машина или <b>установка на свой компьютер</b> (Windows, Linux, Docker) по договору</li>
|
|
577
577
|
<li>Режим <b>«В рост и в падение (с шортом)»</b> с повышенной концентрацией слота</li>
|
|
578
578
|
<li>Персональный VIP-токен активации от администратора платформы</li>
|
|
579
579
|
</ul>
|
|
@@ -655,10 +655,10 @@
|
|
|
655
655
|
<div style="background:#070b14;border:1px solid var(--line);border-radius:10px;padding:14px 16px;max-height:260px;overflow-y:auto;font-size:13px;line-height:1.55;color:#cbd5e1;margin-bottom:14px">
|
|
656
656
|
<p style="margin-top:0"><b>1. Предмет договора:</b> Настоящая Публичная оферта регулирует предоставление доступа к облачной аналитической платформе «НейроАльфа» (PaaS/SaaS) согласно выбранному тарифному плану («Инвестор», «Профи», «VIP»).</p>
|
|
657
657
|
<p><b>2. Правовой статус (отсутствие ИИР и ДУ):</b> Сервис является исключительно программно-техническим средством (калькулятором статистических закономерностей). Исполнитель <b>не осуществляет инвестиционное консультирование</b>, не даёт индивидуальных инвестиционных рекомендаций (ФЗ № 39-ФЗ) и не осуществляет доверительное управление. Все сделки совершаются Пользователем самостоятельно на его личном брокерском счёте.</p>
|
|
658
|
-
<p><b>3. Параметры
|
|
659
|
-
<br>• <b>«Инвестор» (3 900 ₽/мес)</b> — 1 брокерский счёт, стартовый лимит до 1 000 000 ₽ (+ реинвестирование
|
|
660
|
-
<br>• <b>«Профи» (9 900 ₽/мес)</b> — до 5 брокерских счетов, стартовый лимит до 1 000 000 ₽ на каждом (+ реинвестирование
|
|
661
|
-
<br>• <b>«VIP»</b> — по индивидуальному
|
|
658
|
+
<p><b>3. Параметры тарифов</b> (тарифы различаются возможностями платформы; доходность не гарантируется и тарифом не определяется):
|
|
659
|
+
<br>• <b>«Инвестор» (3 900 ₽/мес)</b> — 1 брокерский счёт, стартовый лимит до 1 000 000 ₽ (+ реинвестирование прибыли), торговля только от покупки («Только в рост (без шорта)»);
|
|
660
|
+
<br>• <b>«Профи» (9 900 ₽/мес)</b> — до 5 брокерских счетов, стартовый лимит до 1 000 000 ₽ на каждом (+ реинвестирование прибыли), торговля в рост и в падение (с шортами);
|
|
661
|
+
<br>• <b>«VIP»</b> — по индивидуальному договору: количество счетов, сумма торговли, облачная машина или установка на компьютер.
|
|
662
662
|
</p>
|
|
663
663
|
<p><b>4. Запрет автоследования и ретрансляции сигналов:</b> Пользователю строго запрещается подключать к платформе счета, участвующие в сервисах автоследования или копирования сделок (как в роли ведущего/автора стратегии, так и в роли подписчика), а также передавать или перепродавать сигналы третьим лицам. При обнаружении признаков автоследования счёт автоматически блокируется.</p>
|
|
664
664
|
<p style="margin-bottom:0"><b>5. Декларация о рисках:</b> Торговля ценными бумагами сопряжена с риском потери части или всего инвестированного капитала. Результаты на исторических данных не гарантируют доходности в будущем. Полный текст: <a href="/legal" target="_blank" style="color:#93c5fd">открыть в новой вкладке →</a></p>
|
|
@@ -684,7 +684,7 @@
|
|
|
684
684
|
<div class="modal" id="vip-modal" hidden>
|
|
685
685
|
<div class="modal-box" style="max-width:480px">
|
|
686
686
|
<h3>Тариф VIP · Индивидуальные условия</h3>
|
|
687
|
-
<p style="font-size:13.5px;color:var(--muted);margin:0 0 14px">Тариф VIP
|
|
687
|
+
<p style="font-size:13.5px;color:var(--muted);margin:0 0 14px">Тариф VIP — индивидуальные условия по договору: число счетов, объём торгового капитала, облачная машина или установка на свой компьютер.</p>
|
|
688
688
|
<form id="vip-req-form" style="margin-bottom:18px;padding-bottom:16px;border-bottom:1px solid var(--line)">
|
|
689
689
|
<div style="font-size:13px;font-weight:600;color:#f59e0b">1. Оставить заявку на согласование условий VIP:</div>
|
|
690
690
|
<input name="name" placeholder="Ваше имя" style="width:100%;padding:10px 12px;border-radius:9px;border:1px solid var(--line);background:var(--bg);color:var(--text)">
|
|
@@ -816,14 +816,16 @@
|
|
|
816
816
|
return;
|
|
817
817
|
}
|
|
818
818
|
cab.hidden = false;
|
|
819
|
+
const escH = (s) => String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
|
|
820
|
+
// Терминал клиента работает на его машине (облако naXXXXXX.odant.org или свой компьютер) — см. блок «Где работать»
|
|
819
821
|
const navCta = document.getElementById('btn-nav-cta');
|
|
820
822
|
if (navCta) {
|
|
821
823
|
if (currentUser.role === 'admin') {
|
|
822
824
|
navCta.href = '/admin';
|
|
823
825
|
navCta.textContent = 'Панель админа →';
|
|
826
|
+
navCta.hidden = false;
|
|
824
827
|
} else {
|
|
825
|
-
navCta.
|
|
826
|
-
navCta.textContent = 'Открыть терминал →';
|
|
828
|
+
navCta.hidden = true;
|
|
827
829
|
}
|
|
828
830
|
}
|
|
829
831
|
const untilStr = currentUser.planUntil > Date.now()
|
|
@@ -832,16 +834,13 @@
|
|
|
832
834
|
const capLim = currentUser.limits?.maxCapitalPerAccountRub
|
|
833
835
|
? (currentUser.limits.maxCapitalPerAccountRub >= 100000000 ? 'без ограничений' : `до ${(currentUser.limits.maxCapitalPerAccountRub / 1000000).toLocaleString('ru-RU')} млн ₽/счёт`)
|
|
834
836
|
: 'демо-режим';
|
|
835
|
-
const retLim = currentUser.limits?.maxAnnualReturnPct > 0
|
|
836
|
-
? `до ${currentUser.limits.maxAnnualReturnPct}% годовых`
|
|
837
|
-
: 'без ограничений (VIP-форсаж)';
|
|
838
837
|
cab.innerHTML = `<div class="cab-card">
|
|
839
838
|
<div class="cab-grid">
|
|
840
839
|
<div>
|
|
841
840
|
<div class="sec-tag" style="margin-bottom:4px">Личный кабинет PaaS · Аккаунт активен</div>
|
|
842
|
-
<h3 style="margin:0 0 8px;font-size:22px">${currentUser.name} <span style="color:var(--muted);font-weight:400;font-size:15px">(${currentUser.email})</span></h3>
|
|
841
|
+
<h3 style="margin:0 0 8px;font-size:22px">${escH(currentUser.name)} <span style="color:var(--muted);font-weight:400;font-size:15px">(${escH(currentUser.email)})</span></h3>
|
|
843
842
|
<div style="margin-bottom:14px;font-size:14.5px;color:#cbd5e1">
|
|
844
|
-
Тариф: <b class="pos">${currentUser.planName}</b> (${untilStr}) · Брокерских счетов: до <b>${currentUser.limits?.maxBrokerAccounts ?? 0}</b> (${capLim}) ·
|
|
843
|
+
Тариф: <b class="pos">${currentUser.planName}</b> (${untilStr}) · Брокерских счетов: до <b>${currentUser.limits?.maxBrokerAccounts ?? 0}</b> (${capLim}) · Режим: <b>${currentUser.limits?.allowShorts ? 'в рост и в падение (с шортом)' : 'только в рост (без шорта)'}</b>.
|
|
845
844
|
</div>
|
|
846
845
|
<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center">
|
|
847
846
|
<input id="cab-promo-in" placeholder="Промокод или VIP-токен" style="padding:8px 12px;border-radius:9px;border:1px solid var(--line);background:var(--bg);color:var(--text);font-size:13.5px;width:220px">
|
|
@@ -849,14 +848,15 @@
|
|
|
849
848
|
</div>
|
|
850
849
|
</div>
|
|
851
850
|
<div style="display:flex;flex-direction:column;gap:10px">
|
|
852
|
-
<a class="btn primary lg" href="/" style="justify-content:center">Перейти в торговый терминал →</a>
|
|
853
851
|
<div style="display:flex;gap:10px;flex-wrap:wrap">
|
|
854
852
|
<a class="btn" href="#pricing" style="flex:1">Сменить / продлить тариф</a>
|
|
855
853
|
${currentUser.role === 'admin' ? '<a class="btn" href="/admin">Консоль админа →</a>' : ''}
|
|
856
854
|
</div>
|
|
857
855
|
</div>
|
|
858
856
|
</div>
|
|
857
|
+
<div id="cab-workspace" style="margin-top:18px;padding-top:16px;border-top:1px solid var(--line)"></div>
|
|
859
858
|
</div>`;
|
|
859
|
+
renderWorkspace();
|
|
860
860
|
|
|
861
861
|
document.getElementById('cab-promo-btn')?.addEventListener('click', () => {
|
|
862
862
|
const code = document.getElementById('cab-promo-in')?.value.trim();
|
|
@@ -876,6 +876,76 @@
|
|
|
876
876
|
});
|
|
877
877
|
}
|
|
878
878
|
|
|
879
|
+
// ---------- «Где работать»: облачная машина или установка на свой компьютер (VIP по договору) ----------
|
|
880
|
+
async function renderWorkspace() {
|
|
881
|
+
const box = document.getElementById('cab-workspace');
|
|
882
|
+
if (!box || !currentUser) return;
|
|
883
|
+
const escH = (s) => String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
|
|
884
|
+
let me = null;
|
|
885
|
+
try { me = await (await fetch('/api/auth/me')).json(); } catch { /* ignore */ }
|
|
886
|
+
const list = me?.user?.instances || [];
|
|
887
|
+
const dl = me?.downloads || {};
|
|
888
|
+
const paid = currentUser.plan && currentUser.plan !== 'none' && currentUser.plan !== 'free';
|
|
889
|
+
const canDesktop = Boolean(currentUser.limits?.allowDesktop);
|
|
890
|
+
const ago = (ts) => {
|
|
891
|
+
if (!ts) return 'ещё не выходила на связь';
|
|
892
|
+
const s = Math.round((Date.now() - ts) / 1000);
|
|
893
|
+
return s < 120 ? `${s} с назад` : s < 7200 ? `${Math.round(s / 60)} мин назад` : `${Math.round(s / 3600)} ч назад`;
|
|
894
|
+
};
|
|
895
|
+
const card = (title, body) => `<div style="flex:1 1 300px;border:1px solid var(--line);border-radius:12px;padding:14px 16px;background:var(--bg)"><div style="font-weight:700;margin-bottom:8px">${title}</div>${body}</div>`;
|
|
896
|
+
|
|
897
|
+
const clouds = list.filter((i) => i.kind === 'cloud');
|
|
898
|
+
const cloudBody = clouds.length
|
|
899
|
+
? clouds.map((i) => {
|
|
900
|
+
const state = i.online ? '<span class="pos">работает</span>'
|
|
901
|
+
: ['pending', 'deploying', 'deployed'].includes(i.provisionState) ? 'готовится к запуску (обычно 2–5 минут)'
|
|
902
|
+
: i.provisionState === 'error' ? 'идёт повторное развёртывание' : `нет связи (${ago(i.lastSeen)})`;
|
|
903
|
+
return `<div style="font-size:14px;margin-bottom:8px">Адрес: <b>${escH(i.host)}</b> · ${state}</div>
|
|
904
|
+
<a class="btn primary" href="/api/instances/open?i=${encodeURIComponent(i.id)}">Перейти в терминал →</a>
|
|
905
|
+
<div style="font-size:12.5px;color:var(--muted);margin-top:8px">Можно добавить адрес в закладки: вход через этот кабинет выполняется автоматически.</div>`;
|
|
906
|
+
}).join('<hr style="border:0;border-top:1px solid var(--line);margin:10px 0">')
|
|
907
|
+
: paid
|
|
908
|
+
? '<div style="font-size:14px;color:var(--muted)">Машина создаётся автоматически после оплаты — обновите страницу через пару минут.</div>'
|
|
909
|
+
: '<div style="font-size:14px;color:var(--muted)">Оформите тариф — персональная облачная машина с ИИ будет создана автоматически.</div><a class="btn" href="#pricing" style="margin-top:8px">Выбрать тариф</a>';
|
|
910
|
+
|
|
911
|
+
const desks = list.filter((i) => i.kind === 'desktop');
|
|
912
|
+
let deskBody;
|
|
913
|
+
if (!canDesktop) {
|
|
914
|
+
deskBody = '<div style="font-size:14px;color:var(--muted)">Установка на свой компьютер (Windows, Linux или Docker) — по индивидуальному договору на тарифе VIP.</div><a class="btn" href="#pricing" style="margin-top:8px">Обсудить VIP</a>';
|
|
915
|
+
} else {
|
|
916
|
+
const links = [
|
|
917
|
+
dl.windows ? `<a class="btn" href="${escH(dl.windows)}">⬇ Windows</a>` : '',
|
|
918
|
+
dl.linux ? `<a class="btn" href="${escH(dl.linux)}">⬇ Linux</a>` : '',
|
|
919
|
+
].filter(Boolean).join(' ');
|
|
920
|
+
const bound = desks.filter((i) => i.installBound);
|
|
921
|
+
deskBody = `${links ? `<div style="display:flex;gap:8px;flex-wrap:wrap;margin-bottom:8px">${links}</div>` : '<div style="font-size:13px;color:var(--muted);margin-bottom:8px">Ссылки на установщик пришлёт ваш менеджер.</div>'}
|
|
922
|
+
${dl.docker ? `<div style="font-size:12.5px;color:var(--muted);margin-bottom:8px">Docker: <code>docker run -d -p 127.0.0.1:3000:3000 -v neuroalpha:/data ${escH(dl.docker)}</code></div>` : ''}
|
|
923
|
+
${bound.map((i) => `<div style="font-size:13.5px;margin:6px 0">💻 <b>${escH(i.hostname || i.id)}</b> · ${i.online ? '<span class="pos">на связи</span>' : ago(i.lastSeen)}${i.version ? ` · v${escH(i.version)}` : ''}
|
|
924
|
+
<a class="btn" href="/api/instances/open?i=${encodeURIComponent(i.id)}" style="padding:4px 10px;font-size:12.5px">Открыть</a>
|
|
925
|
+
<button type="button" class="btn" data-unbind="${escH(i.id)}" style="padding:4px 10px;font-size:12.5px">Отвязать</button></div>`).join('')}
|
|
926
|
+
<button type="button" class="btn primary" id="cab-desktop-code">Получить код активации</button>
|
|
927
|
+
<div id="cab-desktop-code-out" style="margin-top:8px;font-size:14px"></div>`;
|
|
928
|
+
}
|
|
929
|
+
box.innerHTML = `<div class="sec-tag" style="margin-bottom:10px">Где работать</div>
|
|
930
|
+
<div style="display:flex;gap:14px;flex-wrap:wrap">${card('☁ В облаке', cloudBody)}${card('💻 На своём компьютере', deskBody)}</div>`;
|
|
931
|
+
|
|
932
|
+
document.getElementById('cab-desktop-code')?.addEventListener('click', async () => {
|
|
933
|
+
const out = document.getElementById('cab-desktop-code-out');
|
|
934
|
+
try {
|
|
935
|
+
const r = await fetch('/api/instances/desktop-code', { method: 'POST', headers: { 'Content-Type': 'application/json' } });
|
|
936
|
+
const j = await r.json();
|
|
937
|
+
if (!r.ok) throw new Error(j.error || `Ошибка ${r.status}`);
|
|
938
|
+
out.innerHTML = `Код: <b style="font-family:monospace;font-size:18px;letter-spacing:1px">${escH(j.code)}</b> — введите его в программе на компьютере в течение 10 минут.`;
|
|
939
|
+
} catch (e) { out.textContent = e.message; }
|
|
940
|
+
});
|
|
941
|
+
box.querySelectorAll('[data-unbind]').forEach((b) => b.addEventListener('click', async () => {
|
|
942
|
+
if (!confirm('Отвязать этот компьютер? Программа на нём перестанет торговать, на новом компьютере понадобится новый код активации.')) return;
|
|
943
|
+
const r = await fetch(`/api/instances/${encodeURIComponent(b.dataset.unbind)}/unbind`, { method: 'POST', headers: { 'Content-Type': 'application/json' } });
|
|
944
|
+
if (!r.ok) alert((await r.json().catch(() => ({}))).error || 'Ошибка');
|
|
945
|
+
renderWorkspace();
|
|
946
|
+
}));
|
|
947
|
+
}
|
|
948
|
+
|
|
879
949
|
document.getElementById('oauth-btns')?.addEventListener('click', (e) => {
|
|
880
950
|
const b = e.target.closest('button[data-oauth]');
|
|
881
951
|
if (!b) return;
|
|
@@ -982,16 +1052,13 @@
|
|
|
982
1052
|
const years = Math.max(0.5, (till - from) / (365.25 * 86400000));
|
|
983
1053
|
const ret = Number(r.metrics.returnPct || 0);
|
|
984
1054
|
const cagr = years >= 0.25 && ret > -99 ? ((Math.pow(1 + ret / 100, 1 / years) - 1) * 100) : (ret / years);
|
|
985
|
-
const mktPct = Number(r.metrics.marketPct
|
|
986
|
-
const isLong = r.params.modelDirection === 'long'
|
|
987
|
-
const
|
|
988
|
-
const
|
|
989
|
-
const
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
: isPro
|
|
993
|
-
? 'Заработок на росте и падении акций (с шортами) · потолок тарифа до 100% годовых · до 10 млн ₽/счёт'
|
|
994
|
-
: 'Полная мощность без потолка доходности · форсаж H/2 + концентрация слота Conviction Sizing');
|
|
1055
|
+
const mktPct = Number.isFinite(Number(r.metrics.marketPct)) ? Number(r.metrics.marketPct) : null;
|
|
1056
|
+
const isLong = r.params.modelDirection === 'long';
|
|
1057
|
+
const tColor = r.tierColor || (isLong ? 'blue' : 'indigo');
|
|
1058
|
+
const tBadge = r.tierBadge || (isLong ? 'Для тарифа «Инвестор»' : 'Для тарифов «Профи» и «VIP»');
|
|
1059
|
+
const tNote = r.tierNote || (isLong ? 'Только покупки (без шорта)' : 'Покупки и продажи без покрытия (шорт)');
|
|
1060
|
+
// Главная цифра — реалистичная оценка стресс-теста (исполнение как в живом контуре, издержки 0,10% на сторону)
|
|
1061
|
+
const rl = r.realistic;
|
|
995
1062
|
const badgeStyle = tColor === 'gold'
|
|
996
1063
|
? 'background:rgba(245,158,11,0.18);border:1px solid rgba(245,158,11,0.5);color:#fbbf24'
|
|
997
1064
|
: tColor === 'indigo'
|
|
@@ -1009,16 +1076,18 @@
|
|
|
1009
1076
|
<div style="font-size:12.5px;color:var(--muted);margin-top:3px">${tNote}</div>
|
|
1010
1077
|
</div>
|
|
1011
1078
|
<div style="text-align:right;flex:none">
|
|
1012
|
-
|
|
1013
|
-
<div style="font-size:12px;color:var(--muted)"
|
|
1079
|
+
${rl ? `<div class="sc-ret ${rl.cagrPct >= 0 ? 'pos' : 'neg'}">${fmt(rl.cagrPct, 1)}% <span style="font-size:13px;font-weight:600">/ год</span></div>
|
|
1080
|
+
<div style="font-size:12px;color:var(--muted)">реалистичная оценка на истории за ${years.toFixed(1).replace('.', ',')} г.</div>`
|
|
1081
|
+
: `<div style="font-size:13px;color:var(--muted)">реалистичная оценка<br>ещё не рассчитана</div>`}
|
|
1014
1082
|
</div>
|
|
1015
1083
|
</div>
|
|
1016
1084
|
${sparkSvg(r.curve, r.marketCurve, idx)}
|
|
1017
1085
|
<div class="sc-kpis">
|
|
1018
|
-
<div><span class="muted">Индекс Мосбиржи</span><b class="${mktPct >= 0 ? 'pos' : 'neg'}">${fmt(mktPct, 1)}
|
|
1019
|
-
<div><span class="muted">Макс. просадка</span><b>${fmt(r.metrics.maxDrawdownPct, 1).replace('+','')}%</b></div>
|
|
1020
|
-
<div><span class="muted">На 1 ₽ убытка</span><b>${fmt(r.metrics.profitFactor, 2).replace('+','')} ₽</b></div>
|
|
1086
|
+
<div><span class="muted">Индекс Мосбиржи</span><b class="${(mktPct ?? 0) >= 0 ? 'pos' : 'neg'}">${mktPct === null ? '—' : `${fmt(mktPct, 1)}%`}</b></div>
|
|
1087
|
+
<div><span class="muted">Макс. просадка</span><b>${fmt(rl ? rl.maxDrawdownPct : r.metrics.maxDrawdownPct, 1).replace('+','')}%</b></div>
|
|
1088
|
+
<div><span class="muted">На 1 ₽ убытка</span><b>${fmt(rl ? rl.profitFactor : r.metrics.profitFactor, 2).replace('+','')} ₽</b></div>
|
|
1021
1089
|
</div>
|
|
1090
|
+
<div style="font-size:11.5px;color:var(--muted);line-height:1.45;margin:6px 0 10px">Историческая проверка (бэктест) с учётом реальных издержек 0,10% на сторону, задержки исполнения и ликвидности. График — модельный расчёт без этих поправок. Результаты в прошлом не гарантируют доходность в будущем; возможны убытки.</div>
|
|
1022
1091
|
<a class="btn" href="#pricing">Выбрать этот профиль в облаке →</a>
|
|
1023
1092
|
</div>`;
|
|
1024
1093
|
}).join('');
|
package/public/legal.html
CHANGED
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
|
|
50
50
|
<h3>1.2. Тарифные планы и технические параметры мощности</h3>
|
|
51
51
|
<ul>
|
|
52
|
-
<li><b>Тариф «Инвестор»:</b> позволяет подключить 1 брокерский счёт со стартовым лимитом капитала до 1 000 000 ₽ (+ реинвестирование всей заработанной прибыли), работающий исключительно в режиме покупок («Только в рост (без шорта)»)
|
|
53
|
-
<li><b>Тариф «Профи»:</b> позволяет подключить до 5 брокерских счетов со стартовым лимитом капитала до 1 000 000 ₽ на каждом счёте (+ реинвестирование всей заработанной прибыли), включает режим работы на росте и падении акций («В рост и в падение (с шортом)»)
|
|
54
|
-
<li><b>Тариф «VIP»:</b> предоставляется по индивидуальному согласованию с Администрацией платформы (через персональный VIP-токен), количество счетов и начальная сумма торговли определяются по согласованию, включает работу с
|
|
52
|
+
<li><b>Тариф «Инвестор»:</b> позволяет подключить 1 брокерский счёт со стартовым лимитом капитала до 1 000 000 ₽ (+ реинвестирование всей заработанной прибыли), работающий исключительно в режиме покупок («Только в рост (без шорта)»).</li>
|
|
53
|
+
<li><b>Тариф «Профи»:</b> позволяет подключить до 5 брокерских счетов со стартовым лимитом капитала до 1 000 000 ₽ на каждом счёте (+ реинвестирование всей заработанной прибыли), включает режим работы на росте и падении акций («В рост и в падение (с шортом)»).</li>
|
|
54
|
+
<li><b>Тариф «VIP»:</b> предоставляется по индивидуальному согласованию с Администрацией платформы (через персональный VIP-токен), количество счетов и начальная сумма торговли определяются по согласованию, включает работу с шортами.</li>
|
|
55
55
|
</ul>
|
|
56
56
|
|
|
57
57
|
<h3>1.3. Запрет использования автоследования и ретрансляции сигналов</h3>
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
|
|
71
71
|
<h3>1.5. Ограничение ответственности</h3>
|
|
72
72
|
<ul>
|
|
73
|
-
<li>Программное обеспечение предоставляется по принципу «как есть» (as is). Исполнитель не гарантирует достижения какой-либо положительной доходности при использовании аналитических расчётов программы.
|
|
73
|
+
<li>Программное обеспечение предоставляется по принципу «как есть» (as is). Исполнитель не гарантирует достижения какой-либо положительной доходности при использовании аналитических расчётов программы. Тарифы различаются возможностями платформы (число счетов, лимиты, торговля с шортами) и не определяют доходность. Результаты исторических проверок (бэктестов) являются модельными расчётами, не гарантируют доходности в будущем; возможна потеря части или всего капитала.</li>
|
|
74
74
|
<li>Пользователь самостоятельно задаёт параметры стратегии, лимиты суммы, пороги дневного стопа и несёт полную имущественную ответственность за результаты сделок, совершаемых через подключённые им API-токены брокеров.</li>
|
|
75
75
|
</ul>
|
|
76
76
|
</section>
|