neuroalpha 0.3.17 → 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/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 +1 -4
- 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 +573 -66
- package/public/index.html +48 -21
- 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 +1014 -168
- 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/role.js +44 -0
- package/server/security.js +40 -0
- package/server/strategist/index.js +86 -47
- package/server/strategist/tools.js +231 -42
- 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
|
|
|
@@ -42,9 +43,7 @@
|
|
|
42
43
|
<div class="prompt-box" id="prompt-box">
|
|
43
44
|
<textarea id="chat-input" rows="2" placeholder="Спросите Стратега о прогнозе, портфеле или настройках счёта…"></textarea>
|
|
44
45
|
<div class="prompt-bar">
|
|
45
|
-
<div class="prompt-left">
|
|
46
|
-
<span class="muted small" style="padding:0 6px;user-select:none">🤖 ИИ-консультант и помощник по счетам</span>
|
|
47
|
-
</div>
|
|
46
|
+
<div class="prompt-left"></div>
|
|
48
47
|
<div class="prompt-right">
|
|
49
48
|
<div class="model-picker" id="model-picker">
|
|
50
49
|
<button type="button" id="chat-model-btn" class="ghost-select model-btn" title="Модель ИИ (настраивается в «Настройки → Модели ИИ»)">
|
|
@@ -94,7 +93,7 @@
|
|
|
94
93
|
</aside>
|
|
95
94
|
<div class="spane">
|
|
96
95
|
<section class="ssec" data-sec="brokers" id="brokers-trade-box">
|
|
97
|
-
<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>
|
|
98
97
|
<div class="scard spadded">
|
|
99
98
|
<div id="broker-form-slot">
|
|
100
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)">
|
|
@@ -104,19 +103,16 @@
|
|
|
104
103
|
<label><span>Название счёта</span><input name="name" placeholder="Например, Т-Банк основной"></label>
|
|
105
104
|
<label><span>Брокер</span>
|
|
106
105
|
<select name="broker" id="broker-select">
|
|
107
|
-
<optgroup label="
|
|
106
|
+
<optgroup label="Полная поддержка">
|
|
108
107
|
<option value="tbank">Т-Банк (T-Invest API)</option>
|
|
108
|
+
</optgroup>
|
|
109
|
+
<optgroup label="Бета: только с подтверждением заявок (нет защитных стопов, отмены и истории)">
|
|
109
110
|
<option value="finam">Финам (Finam Trade API)</option>
|
|
110
111
|
<option value="bcs">БКС Мир инвестиций (Trade API)</option>
|
|
111
112
|
<option value="alor">Алор Брокер (Alor OpenAPI v2)</option>
|
|
112
113
|
<option value="cifra">Цифра брокер (Tradernet API)</option>
|
|
113
114
|
<option value="iticapital">ITI Capital (OpenAPI)</option>
|
|
114
115
|
</optgroup>
|
|
115
|
-
<optgroup label="Подтверждение заявок (Telegram / MAX) или мост QUIK">
|
|
116
|
-
<option value="sber">СберИнвестиции (Сбербанк)</option>
|
|
117
|
-
<option value="vtb">ВТБ Мои Инвестиции</option>
|
|
118
|
-
<option value="alfa">Альфа-Инвестиции</option>
|
|
119
|
-
</optgroup>
|
|
120
116
|
</select>
|
|
121
117
|
</label>
|
|
122
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">
|
|
@@ -155,6 +151,8 @@
|
|
|
155
151
|
<label><span>Защитный отступ лимитной заявки, %</span><input name="limitOffsetPct" type="number" min="0" max="2" step="0.05" value="0.1"></label>
|
|
156
152
|
<label class="check"><span>Формировать заявки автоматически по закрытию свечи (с отправкой в Telegram / MAX)</span><input name="autoSchedule" type="checkbox" class="switch" checked></label>
|
|
157
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>
|
|
158
156
|
<label class="check"><span>Тестовый режим (песочница брокера — виртуальные деньги без риска)</span><input name="sandbox" type="checkbox" class="switch"></label>
|
|
159
157
|
<div class="row-gap" style="justify-content:space-between;flex-wrap:wrap;margin-top:4px">
|
|
160
158
|
<div class="row-gap">
|
|
@@ -171,9 +169,12 @@
|
|
|
171
169
|
</section>
|
|
172
170
|
|
|
173
171
|
<section class="ssec" data-sec="forecast" hidden>
|
|
174
|
-
<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>
|
|
175
173
|
<div class="scard spadded">
|
|
176
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>
|
|
177
178
|
</div>
|
|
178
179
|
</section>
|
|
179
180
|
|
|
@@ -215,6 +216,7 @@
|
|
|
215
216
|
<div class="kpis" id="kpis"></div>
|
|
216
217
|
<div class="muted small" id="sides" title="Вклад покупок и продаж в итог после комиссий, в % от стартовой суммы" hidden></div>
|
|
217
218
|
<div id="stability" class="stab-box" hidden></div>
|
|
219
|
+
<div id="stress" class="stab-box" hidden></div>
|
|
218
220
|
<div id="eq-chart" class="chart"></div>
|
|
219
221
|
<div class="legend" id="legend"></div>
|
|
220
222
|
<details id="periods-box" open hidden>
|
|
@@ -301,6 +303,31 @@
|
|
|
301
303
|
</div>
|
|
302
304
|
</div>
|
|
303
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
|
+
|
|
304
331
|
<!-- Модальное окно подписания Договора-оферты и Декларации о рисках -->
|
|
305
332
|
<div id="offer-modal" class="modal" hidden>
|
|
306
333
|
<div class="modal-box" style="max-width:680px">
|
|
@@ -312,9 +339,9 @@
|
|
|
312
339
|
<p style="margin-top:0"><b>1. Предмет договора:</b> Настоящая Публичная оферта регулирует предоставление доступа к облачной аналитической платформе «НейроАльфа» (PaaS/SaaS) согласно выбранному тарифному плану («Инвестор», «Профи», «VIP»).</p>
|
|
313
340
|
<p><b>2. Правовой статус (отсутствие ИИР и ДУ):</b> Сервис является исключительно программно-техническим средством (калькулятором статистических закономерностей). Исполнитель <b>не осуществляет инвестиционное консультирование</b>, не даёт индивидуальных инвестиционных рекомендаций (ФЗ № 39-ФЗ) и не осуществляет доверительное управление. Все сделки совершаются Пользователем самостоятельно на его личном брокерском счёте.</p>
|
|
314
341
|
<p><b>3. Параметры тарифов и предельные уровни доходности:</b>
|
|
315
|
-
<br>• <b>«Инвестор» (3 900 ₽/мес)</b> — 1 брокерский счёт, стартовый лимит до 1 000 000 ₽ (+ реинвестирование всей заработанной прибыли), торговля только от покупки («Только в рост (без шорта)»)
|
|
316
|
-
<br>• <b>«Профи» (9 900 ₽/мес)</b> — до 5 брокерских счетов, стартовый лимит до 1 000 000 ₽ на каждом счёте (+ реинвестирование всей заработанной прибыли), торговля в рост и в падение (с шортами)
|
|
317
|
-
<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> — количество счетов и начальная сумма торговли по согласованию, торговля в рост и в падение (с шортами).
|
|
318
345
|
</p>
|
|
319
346
|
<p><b>4. Запрет автоследования и ретрансляции сигналов:</b> Пользователю строго запрещается подключать к платформе счета, участвующие в сервисах автоследования или копирования сделок (как в роли ведущего/автора стратегии, так и в роли подписчика), а также передавать или перепродавать сигналы третьим лицам. При обнаружении признаков автоследования счёт автоматически блокируется.</p>
|
|
320
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>
|