dexbot 1.5.1 → 1.5.3
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/CHANGELOG.md +35 -0
- package/analysis/ama_fitting/package.json +1 -1
- package/analysis/resolve_source.ts +3 -0
- package/analysis/results/ama_sweep_results_lp_pool_133_1h.json +2455 -0
- package/analysis/results/bot_fitting_results_lp_pool_133_1h.json +218 -0
- package/analysis/tradingview/README.md +5 -1
- package/analysis/tradingview/analyze_tradingview.ts +27 -1
- package/analysis/tradingview/h-bts_tradingview.html +1570 -0
- package/analysis/tradingview/t-bts_tradingview.html +1570 -0
- package/analysis/tradingview/tradingview_uplot_chart_generator.ts +351 -22
- package/analysis/trend_detection/package.json +1 -1
- package/claw/package.json +1 -1
- package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
- package/claw/runtimes/openclaw-plugin/package.json +1 -1
- package/claw/tests/test_claw_mcp_transport.ts +2 -2
- package/dist/analysis/resolve_source.d.ts.map +1 -1
- package/dist/analysis/resolve_source.js +3 -0
- package/dist/analysis/resolve_source.js.map +1 -1
- package/dist/analysis/tradingview/analyze_tradingview.d.ts +3 -0
- package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -1
- package/dist/analysis/tradingview/analyze_tradingview.js +27 -2
- package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -1
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +348 -22
- package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -1
- package/dist/dexbot.js +5 -5
- package/dist/dexbot.js.map +1 -1
- package/dist/market_adapter/core/asymmetric_bounds.d.ts +33 -1
- package/dist/market_adapter/core/asymmetric_bounds.d.ts.map +1 -1
- package/dist/market_adapter/core/asymmetric_bounds.js +38 -1
- package/dist/market_adapter/core/asymmetric_bounds.js.map +1 -1
- package/dist/modules/dexbot_class.d.ts +2 -18
- package/dist/modules/dexbot_class.d.ts.map +1 -1
- package/dist/modules/dexbot_cow_runtime.d.ts +38 -37
- package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_cow_runtime.js +722 -557
- package/dist/modules/dexbot_cow_runtime.js.map +1 -1
- package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_fill_runtime.js +7 -1
- package/dist/modules/dexbot_fill_runtime.js.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.js +31 -51
- package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
- package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_startup_runtime.js +42 -3
- package/dist/modules/dexbot_startup_runtime.js.map +1 -1
- package/dist/modules/order/accounting.d.ts.map +1 -1
- package/dist/modules/order/accounting.js +19 -2
- package/dist/modules/order/accounting.js.map +1 -1
- package/dist/modules/order/export.d.ts +122 -15
- package/dist/modules/order/export.d.ts.map +1 -1
- package/dist/modules/order/export.js +310 -46
- package/dist/modules/order/export.js.map +1 -1
- package/dist/modules/order/grid.d.ts.map +1 -1
- package/dist/modules/order/grid.js +29 -38
- package/dist/modules/order/grid.js.map +1 -1
- package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
- package/dist/modules/order/grid_reconcile.js +7 -3
- package/dist/modules/order/grid_reconcile.js.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.js +31 -33
- package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
- package/dist/modules/order/manager.d.ts +13 -6
- package/dist/modules/order/manager.d.ts.map +1 -1
- package/dist/modules/order/manager.js +22 -7
- package/dist/modules/order/manager.js.map +1 -1
- package/dist/modules/order/sync_engine.d.ts.map +1 -1
- package/dist/modules/order/sync_engine.js +231 -11
- package/dist/modules/order/sync_engine.js.map +1 -1
- package/dist/modules/order/utils/math.d.ts +38 -15
- package/dist/modules/order/utils/math.d.ts.map +1 -1
- package/dist/modules/order/utils/math.js +55 -16
- package/dist/modules/order/utils/math.js.map +1 -1
- package/dist/modules/order/utils/order.d.ts +116 -20
- package/dist/modules/order/utils/order.d.ts.map +1 -1
- package/dist/modules/order/utils/order.js +340 -35
- package/dist/modules/order/utils/order.js.map +1 -1
- package/dist/modules/order/utils/system.d.ts +1 -30
- package/dist/modules/order/utils/system.d.ts.map +1 -1
- package/dist/modules/order/utils/system.js +31 -98
- package/dist/modules/order/utils/system.js.map +1 -1
- package/dist/modules/order/utils/validate.d.ts +3 -2
- package/dist/modules/order/utils/validate.d.ts.map +1 -1
- package/dist/modules/order/utils/validate.js +49 -28
- package/dist/modules/order/utils/validate.js.map +1 -1
- package/dist/scripts/analyze-credit.d.ts.map +1 -1
- package/dist/scripts/analyze-credit.js +53 -33
- package/dist/scripts/analyze-credit.js.map +1 -1
- package/docs/DEXBOT_COMPARISON.md +3 -3
- package/docs/EVOLUTION.md +7 -5
- package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +1 -1
- package/docs/README.md +2 -2
- package/docs/WORKFLOW.md +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import { MARKET_ADAPTER } from '../../modules/constants.js';
|
|
4
|
-
import { escapeHtml, serializeJsonForScript, UPLOT_SHARED_SCRIPT } from '../chart_utils.js';
|
|
4
|
+
import { escapeHtml, serializeJsonForScript, UPLOT_SHARED_SCRIPT, embedFunctionSources } from '../chart_utils.js';
|
|
5
5
|
import { cursorCSS, uplotBgCSS } from '../chart_css.js';
|
|
6
6
|
import { zoomResetScript } from '../chart_ui.js';
|
|
7
7
|
import { normalizeCandle } from '../math_utils.js';
|
|
@@ -9,6 +9,9 @@ import { PATHS } from '../../modules/paths.js';
|
|
|
9
9
|
import { getStorage } from '../../modules/storage/index.js';
|
|
10
10
|
const { readJSON } = getStorage();
|
|
11
11
|
import { getErrorMessage } from '../../modules/utils/errors.js';
|
|
12
|
+
import { parseRelativeMultiplier } from '../../modules/order/utils/math.js';
|
|
13
|
+
import { computeAverageAmaSlopePct } from '../../market_adapter/core/strategies/dynamic_weight_series.js';
|
|
14
|
+
import { resolveBaseBounds, computeAsymmetricBoundsMetrics, applyAsymmetricBounds, applyNarrowingSideGuard, } from '../../market_adapter/core/asymmetric_bounds.js';
|
|
12
15
|
function inferBaseIntervalSeconds(candles, fallback = 3600) {
|
|
13
16
|
if (!Array.isArray(candles) || candles.length < 2)
|
|
14
17
|
return fallback;
|
|
@@ -103,6 +106,30 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
103
106
|
|| timeframes[0];
|
|
104
107
|
const marketProfiles = data.marketProfiles || loadMarketProfiles();
|
|
105
108
|
const defaultAmaConfig = resolveAmaDefaults({ meta, data, marketProfiles });
|
|
109
|
+
const rangeSlope = {
|
|
110
|
+
lookbackBars: MARKET_ADAPTER.DYNAMIC_WEIGHT_AMA_LOOKBACK_BARS,
|
|
111
|
+
maxSlopePct: MARKET_ADAPTER.DYNAMIC_WEIGHT_AMA_MAX_SLOPE_PCT,
|
|
112
|
+
neutralZonePct: MARKET_ADAPTER.DYNAMIC_WEIGHT_AMA_NEUTRAL_ZONE_PCT,
|
|
113
|
+
maxSlopeOffset: MARKET_ADAPTER.DYNAMIC_WEIGHT_ASYMMETRIC_OFFSET_CLAMP,
|
|
114
|
+
maxAsymmetryFactor: MARKET_ADAPTER.ASYMMETRIC_BOUNDS_MAX_ASYMMETRY_FACTOR,
|
|
115
|
+
minScaleSlots: MARKET_ADAPTER.ASYMMETRIC_BOUNDS_MIN_SCALE_SLOTS,
|
|
116
|
+
};
|
|
117
|
+
function defaultRangeSpan(input) {
|
|
118
|
+
const cli = Number(input.rangeSpan);
|
|
119
|
+
if (Number.isFinite(cli))
|
|
120
|
+
return Math.min(2, Math.max(1.25, cli));
|
|
121
|
+
const down = parseRelativeMultiplier(input.grid?.minPrice);
|
|
122
|
+
const up = parseRelativeMultiplier(input.grid?.maxPrice);
|
|
123
|
+
if (down != null && down > 1 && up != null && up > 1)
|
|
124
|
+
return Math.min(2, Math.max(1.25, (down + up) / 2));
|
|
125
|
+
const vd = Number(input.grid?.minPrice);
|
|
126
|
+
const vu = Number(input.grid?.maxPrice);
|
|
127
|
+
if (Number.isFinite(vd) && Number.isFinite(vu) && vd > 0 && vu > vd) {
|
|
128
|
+
const ref = Math.sqrt(vd * vu);
|
|
129
|
+
return Math.min(2, Math.max(1.25, (ref / vd + vu / ref) / 2));
|
|
130
|
+
}
|
|
131
|
+
return 1.55;
|
|
132
|
+
}
|
|
106
133
|
const defaults = {
|
|
107
134
|
smaPeriod: Math.max(1, Math.round(data.smaPeriod ?? 500)),
|
|
108
135
|
amaDefaults: defaultAmaConfig,
|
|
@@ -111,6 +138,21 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
111
138
|
vwapEnabled: data.vwapEnabled === true,
|
|
112
139
|
vwapBars: Math.max(5, Math.round(data.vwapBars ?? 500)),
|
|
113
140
|
priceScale: data.priceScale === 'linear' ? 'linear' : 'log',
|
|
141
|
+
rangeEnabled: data.rangeEnabled !== false,
|
|
142
|
+
rangeScaleEnabled: data.rangeScaleEnabled === true,
|
|
143
|
+
rangeWidthPct: Number.isFinite(Number(data.rangeWidthPct)) && Number(data.rangeWidthPct) > 0
|
|
144
|
+
? Number(data.rangeWidthPct)
|
|
145
|
+
: 2,
|
|
146
|
+
rangeSpan: defaultRangeSpan(data),
|
|
147
|
+
grid: data.grid && data.grid.minPrice != null && data.grid.maxPrice != null ? {
|
|
148
|
+
minPrice: data.grid.minPrice,
|
|
149
|
+
maxPrice: data.grid.maxPrice,
|
|
150
|
+
incrementPercent: Number(data.grid.incrementPercent) > 0 ? Number(data.grid.incrementPercent) : null,
|
|
151
|
+
maxAsymmetryFactor: Number.isFinite(Number(data.grid.maxAsymmetryFactor)) && Number(data.grid.maxAsymmetryFactor) > 0
|
|
152
|
+
? Number(data.grid.maxAsymmetryFactor)
|
|
153
|
+
: rangeSlope.maxAsymmetryFactor,
|
|
154
|
+
} : null,
|
|
155
|
+
rangeSlope,
|
|
114
156
|
};
|
|
115
157
|
const assetLabelA = meta.assetA?.symbol || meta.assetA?.id || 'Asset A';
|
|
116
158
|
const assetLabelB = meta.assetB?.symbol || meta.assetB?.id || 'Asset B';
|
|
@@ -132,6 +174,12 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
132
174
|
vwapEnabled: defaults.vwapEnabled,
|
|
133
175
|
vwapBars: defaults.vwapBars,
|
|
134
176
|
priceScale: defaults.priceScale,
|
|
177
|
+
rangeEnabled: defaults.rangeEnabled,
|
|
178
|
+
rangeScaleEnabled: defaults.rangeScaleEnabled,
|
|
179
|
+
rangeWidthPct: defaults.rangeWidthPct,
|
|
180
|
+
rangeSpan: defaults.rangeSpan,
|
|
181
|
+
grid: defaults.grid,
|
|
182
|
+
rangeSlope,
|
|
135
183
|
defaultPairMode,
|
|
136
184
|
assetLabelA,
|
|
137
185
|
assetLabelB,
|
|
@@ -174,7 +222,8 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
174
222
|
#brand { display: flex; flex-direction: column; gap: 4px; min-width: 240px; }
|
|
175
223
|
#title { font-size: 15px; font-weight: 700; color: #f5f8fb; }
|
|
176
224
|
#subtitle { font-size: 11px; color: #b9c6d4; text-transform: uppercase; letter-spacing: 0.6px; }
|
|
177
|
-
#toolbar { display: flex; flex-
|
|
225
|
+
#toolbar { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }
|
|
226
|
+
.toolbar-row { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px 12px; align-items: center; }
|
|
178
227
|
.group { display: inline-flex; align-items: center; gap: 8px; padding-left: 12px; border-left: 1px solid #263241; }
|
|
179
228
|
.group:first-child { padding-left: 0; border-left: 0; }
|
|
180
229
|
:root {
|
|
@@ -396,7 +445,8 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
396
445
|
${cursorCSS()}
|
|
397
446
|
@media (max-width: 980px) {
|
|
398
447
|
#topbar { flex-direction: column; align-items: flex-start; }
|
|
399
|
-
#toolbar {
|
|
448
|
+
#toolbar { align-items: flex-start; }
|
|
449
|
+
.toolbar-row { justify-content: flex-start; }
|
|
400
450
|
.group { padding-left: 0; border-left: 0; flex-wrap: wrap; }
|
|
401
451
|
#legend { min-width: 0; max-width: calc(100vw - 24px); }
|
|
402
452
|
}
|
|
@@ -410,9 +460,7 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
410
460
|
<div id="subtitle">${escapeHtml(poolLabel)} · ${escapeHtml(pairLabelNormal)} · ${escapeHtml(intervalLabel)} base · indicators from 1h · volume · uPlot</div>
|
|
411
461
|
</div>
|
|
412
462
|
<div id="toolbar">
|
|
413
|
-
<div class="
|
|
414
|
-
${timeframes.map((item) => `<button class="time-btn${item.label === defaultTimeframe.label ? ' active' : ''}" data-timeframe="${escapeHtml(item.label)}"${item.enabled ? '' : ' disabled'}>${escapeHtml(item.label)}</button>`).join('')}
|
|
415
|
-
</div>
|
|
463
|
+
<div class="toolbar-row">
|
|
416
464
|
<div class="group">
|
|
417
465
|
<div class="indicator">
|
|
418
466
|
<span class="tag">pair</span>
|
|
@@ -426,6 +474,11 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
426
474
|
<span class="tag">scale</span>
|
|
427
475
|
<button type="button" class="scale-toggle${defaults.priceScale === 'linear' ? ' is-linear' : ''}" id="scale-toggle" data-scale="${escapeHtml(defaults.priceScale)}" aria-label="Toggle price scale" title="Toggle price scale">${defaults.priceScale === 'linear' ? 'Linear' : 'Log'}</button>
|
|
428
476
|
</div>
|
|
477
|
+
</div>
|
|
478
|
+
<div class="group" id="tf-group">
|
|
479
|
+
${timeframes.map((item) => `<button class="time-btn${item.label === defaultTimeframe.label ? ' active' : ''}" data-timeframe="${escapeHtml(item.label)}"${item.enabled ? '' : ' disabled'}>${escapeHtml(item.label)}</button>`).join('')}
|
|
480
|
+
</div>
|
|
481
|
+
<div class="group">
|
|
429
482
|
<div class="indicator">
|
|
430
483
|
<label><input type="checkbox" id="sma-toggle"${defaults.smaEnabled ? ' checked' : ''}> SMA</label>
|
|
431
484
|
<span class="tag">period</span>
|
|
@@ -444,6 +497,10 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
444
497
|
<button type="button" class="step-btn" id="vwap-bars-dec">▼</button>
|
|
445
498
|
</span>
|
|
446
499
|
</div>
|
|
500
|
+
</div>
|
|
501
|
+
</div>
|
|
502
|
+
<div class="toolbar-row">
|
|
503
|
+
<div class="group">
|
|
447
504
|
<div class="indicator">
|
|
448
505
|
<label><input type="checkbox" id="ama-toggle"${defaults.amaEnabled ? ' checked' : ''}> AMA</label>
|
|
449
506
|
<span class="tag">er</span>
|
|
@@ -466,13 +523,22 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
466
523
|
</span>
|
|
467
524
|
<button type="button" class="reset-btn" id="ama-reset">Reset</button>
|
|
468
525
|
</div>
|
|
469
|
-
<div class="indicator"
|
|
526
|
+
<div class="indicator" title="Range min/max built only from the live AMA price (green above, red below); Scale sizes it by AMA slope like the grid build">
|
|
527
|
+
<label><input type="checkbox" id="range-toggle"${defaults.rangeEnabled ? ' checked' : ''}> Range</label>
|
|
528
|
+
<label title="Range Scaling: size the band by AMA slope like the grid build (trend side widens, opposite tightens) and fit the price axis to it"><input type="checkbox" id="range-scale-toggle"${defaults.rangeScaleEnabled ? ' checked' : ''}> Scale</label>
|
|
529
|
+
<span id="range-grid-wrap" style="display:${defaults.grid ? 'inline' : 'none'}" title="x-range around AMA (default = bot grid setting)">
|
|
530
|
+
<span class="tag">grid</span>
|
|
531
|
+
<input type="range" id="range-span" min="1.25" max="2" step="0.05" value="${defaults.rangeSpan.toFixed(2)}" style="width:90px;vertical-align:middle">
|
|
532
|
+
<span id="range-span-val" style="font-size:11px;color:#8b949e;width:40px;display:inline-block;text-align:right">${defaults.rangeSpan.toFixed(2)}x</span>
|
|
533
|
+
</span>
|
|
534
|
+
</div>
|
|
535
|
+
<div class="indicator">
|
|
470
536
|
<label><input type="checkbox" id="ama-init-offset-toggle"> Init Offset</label>
|
|
471
537
|
<input type="range" id="ama-init-offset" min="-50" max="50" value="0" step="1" style="width:120px;vertical-align:middle" disabled>
|
|
472
538
|
<span id="ama-init-offset-val" style="font-size:11px;color:#8b949e;width:32px;display:inline-block;text-align:right">0%</span>
|
|
473
539
|
</div>
|
|
474
540
|
</div>
|
|
475
|
-
|
|
541
|
+
</div>
|
|
476
542
|
</div>
|
|
477
543
|
</div>
|
|
478
544
|
<div id="chart-shell">
|
|
@@ -492,6 +558,7 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
492
558
|
<span class="legend-item"><span class="legend-dot" style="background:#a855f7"></span><span class="legend-label">AMA Off</span> <span class="legend-value" id="legend-ama-off">-</span></span>
|
|
493
559
|
|
|
494
560
|
<span class="legend-item"><span class="legend-dot" style="background:#93c5fd"></span><span class="legend-label">VWMA</span> <span class="legend-value" id="legend-vwap">-</span></span>
|
|
561
|
+
<span class="legend-item"><span class="legend-dot" id="legend-range-dot" style="background:#8b949e"></span><span class="legend-label">Range</span> <span class="legend-value" id="legend-range">-</span></span>
|
|
495
562
|
</div>
|
|
496
563
|
</div>
|
|
497
564
|
<div id="price-chart" title="Wheel: zoom time (ulos = tyhjaa tilaa datan ymparilla) · Drag: siirra aika- ja hintanakymaa · Wheel/drag hinta-akselilla: zoomaa hintaa · Double-click hinta-akselia: autofit"></div>
|
|
@@ -527,6 +594,14 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
527
594
|
: Number(payload.amaDefaults?.slowPeriod || ${MARKET_ADAPTER.AMAS.AMA3.slowPeriod});
|
|
528
595
|
let currentVwapEnabled = state.vwapEnabled ?? !!payload.vwapEnabled;
|
|
529
596
|
let currentVwapBars = Number.isFinite(state.vwapBars) ? state.vwapBars : Number(payload.vwapBars || 500);
|
|
597
|
+
let currentRangeEnabled = state.rangeEnabled ?? !!payload.rangeEnabled;
|
|
598
|
+
let currentRangeScaleEnabled = state.rangeScaleEnabled ?? !!payload.rangeScaleEnabled;
|
|
599
|
+
let currentRangeWidthPct = Number.isFinite(state.rangeWidthPct) && Number(state.rangeWidthPct) > 0
|
|
600
|
+
? Number(state.rangeWidthPct)
|
|
601
|
+
: (Number.isFinite(Number(payload.rangeWidthPct)) && Number(payload.rangeWidthPct) > 0 ? Number(payload.rangeWidthPct) : 2);
|
|
602
|
+
let currentRangeSpan = Number.isFinite(state.rangeSpan) && Number(state.rangeSpan) > 0
|
|
603
|
+
? Math.min(2, Math.max(1.25, Number(state.rangeSpan)))
|
|
604
|
+
: (Number.isFinite(Number(payload.rangeSpan)) && Number(payload.rangeSpan) > 0 ? Math.min(2, Math.max(1.25, Number(payload.rangeSpan))) : 1.55);
|
|
530
605
|
let currentAmaInitOffsetEnabled = false;
|
|
531
606
|
let currentAmaInitOffset = Number.isFinite(state.amaInitOffset) ? state.amaInitOffset : 0;
|
|
532
607
|
let currentPriceScale = state.priceScale || payload.priceScale || 'log';
|
|
@@ -548,6 +623,9 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
548
623
|
let currentSmaInit = [];
|
|
549
624
|
let currentSmaInitOff = [];
|
|
550
625
|
let currentAmaOff = [];
|
|
626
|
+
let currentRangeUpper = [];
|
|
627
|
+
let currentRangeLower = [];
|
|
628
|
+
let currentRangeTrend = [];
|
|
551
629
|
let priceChart = null;
|
|
552
630
|
let volumeChart = null;
|
|
553
631
|
let lastRenderedPriceScale = null;
|
|
@@ -746,6 +824,10 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
746
824
|
amaSlowPeriod: currentAmaSlowPeriod,
|
|
747
825
|
vwapEnabled: currentVwapEnabled,
|
|
748
826
|
vwapBars: currentVwapBars,
|
|
827
|
+
rangeEnabled: currentRangeEnabled,
|
|
828
|
+
rangeScaleEnabled: currentRangeScaleEnabled,
|
|
829
|
+
rangeWidthPct: currentRangeWidthPct,
|
|
830
|
+
rangeSpan: currentRangeSpan,
|
|
749
831
|
amaInitOffset: currentAmaInitOffset,
|
|
750
832
|
priceScale: currentPriceScale,
|
|
751
833
|
pairMode: currentPairMode,
|
|
@@ -1075,6 +1157,106 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1075
1157
|
vwapCache.set(cacheKey, out);
|
|
1076
1158
|
return out;
|
|
1077
1159
|
}
|
|
1160
|
+
// Bot-grid range band: min/max derive ONLY from the live AMA price.
|
|
1161
|
+
// All math below runs the canonical market_adapter/grid sources,
|
|
1162
|
+
// embedded verbatim (not hand-copied): computeAverageAmaSlopePct,
|
|
1163
|
+
// applyAsymmetricBounds (+ metrics/base), applyNarrowingSideGuard,
|
|
1164
|
+
// parseRelativeMultiplier. With Range Scaling on, the AMA slope sizes
|
|
1165
|
+
// the real range: trend side widens, opposite side tightens. Painted
|
|
1166
|
+
// symmetrically always: green [AMA, upper], red [lower, AMA].
|
|
1167
|
+
// Without usable grid shape falls back to a width% envelope around AMA.
|
|
1168
|
+
// Never reads candles, pair-display mapping, or axis/zoom state —
|
|
1169
|
+
// inversion and timeframe sampling apply to the AMA first.
|
|
1170
|
+
${embedFunctionSources([computeAverageAmaSlopePct, resolveBaseBounds, computeAsymmetricBoundsMetrics, applyAsymmetricBounds, applyNarrowingSideGuard, parseRelativeMultiplier])}
|
|
1171
|
+
function computeRangeBand(baseAma) {
|
|
1172
|
+
const n = Array.isArray(baseAma) ? baseAma.length : 0;
|
|
1173
|
+
const upper = new Array(n).fill(null);
|
|
1174
|
+
const lower = new Array(n).fill(null);
|
|
1175
|
+
const trend = new Array(n).fill(0);
|
|
1176
|
+
const slopeCfg = payload.rangeSlope || {};
|
|
1177
|
+
const gridCfg = payload.grid || null;
|
|
1178
|
+
const lookback = Math.max(1, Math.round(Number(slopeCfg.lookbackBars) || 9));
|
|
1179
|
+
const maxSlope = Number(slopeCfg.maxSlopePct) > 0 ? Number(slopeCfg.maxSlopePct) : 0.09;
|
|
1180
|
+
const neutral = Number(slopeCfg.neutralZonePct) >= 0 ? Number(slopeCfg.neutralZonePct) : 0;
|
|
1181
|
+
const maxSlopeOffset = Number(slopeCfg.maxSlopeOffset) > 0 ? Number(slopeCfg.maxSlopeOffset) : 0.5;
|
|
1182
|
+
const maxAsym = gridCfg && Number(gridCfg.maxAsymmetryFactor) > 0
|
|
1183
|
+
? Number(gridCfg.maxAsymmetryFactor)
|
|
1184
|
+
: (Number(slopeCfg.maxAsymmetryFactor) > 0 ? Number(slopeCfg.maxAsymmetryFactor) : 0.35);
|
|
1185
|
+
const widthPct = Number(currentRangeWidthPct) > 0 ? Number(currentRangeWidthPct) : 2;
|
|
1186
|
+
const inc = gridCfg && Number(gridCfg.incrementPercent) > 0 ? Number(gridCfg.incrementPercent) : null;
|
|
1187
|
+
const minSlots = Math.floor(Number(gridCfg && gridCfg.minScaleSlots) > 0 ? Number(gridCfg.minScaleSlots) : (Number(slopeCfg.minScaleSlots) || 0));
|
|
1188
|
+
// User x-range span (slider, default = bot grid ratio): the only
|
|
1189
|
+
// width input — min = AMA/span, max = AMA*span. Grid config only
|
|
1190
|
+
// selects the grid path vs the width% fallback, never a price.
|
|
1191
|
+
const span = Math.min(2, Math.max(1.25, Number(currentRangeSpan) > 0 ? Number(currentRangeSpan) : 1.55));
|
|
1192
|
+
const gMinN = Number(gridCfg && gridCfg.minPrice);
|
|
1193
|
+
const gMaxN = Number(gridCfg && gridCfg.maxPrice);
|
|
1194
|
+
const multOk = (v) => { const m = parseRelativeMultiplier(v); return m != null && m > 1; };
|
|
1195
|
+
const hasGridShape = gridCfg != null && (
|
|
1196
|
+
(multOk(gridCfg.minPrice) && multOk(gridCfg.maxPrice)) ||
|
|
1197
|
+
(Number.isFinite(gMinN) && Number.isFinite(gMaxN) && gMinN > 0 && gMaxN > gMinN));
|
|
1198
|
+
const slopeScaling = !!currentRangeScaleEnabled;
|
|
1199
|
+
if (!currentAmaEnabled || n === 0) return { upper, lower, trend };
|
|
1200
|
+
for (let i = 0; i < n; i++) {
|
|
1201
|
+
const ama = baseAma[i];
|
|
1202
|
+
const past = i - lookback >= 0 ? baseAma[i - lookback] : null;
|
|
1203
|
+
if (!Number.isFinite(ama) || ama <= 0 || !Number.isFinite(past) || past <= 0) continue;
|
|
1204
|
+
const slopePct = computeAverageAmaSlopePct(ama, past, lookback);
|
|
1205
|
+
if (slopePct == null || !Number.isFinite(slopePct)) continue;
|
|
1206
|
+
const dir = Math.abs(slopePct) <= neutral ? 0 : (slopePct > 0 ? 1 : -1);
|
|
1207
|
+
const strength = Math.min(Math.abs(slopePct) / maxSlope, 1);
|
|
1208
|
+
if (!hasGridShape) {
|
|
1209
|
+
// Width% envelope: symmetric around AMA; scaling sizes it
|
|
1210
|
+
// by slope strength ("real range"), otherwise full width.
|
|
1211
|
+
const w = slopeScaling ? strength * widthPct : widthPct;
|
|
1212
|
+
if (!(w > 0)) continue;
|
|
1213
|
+
const half = ama * w / 100;
|
|
1214
|
+
if (!Number.isFinite(half) || half <= 0) continue;
|
|
1215
|
+
upper[i] = ama + half;
|
|
1216
|
+
lower[i] = Math.max(ama - half, ama * 1e-6);
|
|
1217
|
+
trend[i] = dir;
|
|
1218
|
+
continue;
|
|
1219
|
+
}
|
|
1220
|
+
// Symmetric base from this bar's AMA and the user span —
|
|
1221
|
+
// no chart or config price level.
|
|
1222
|
+
let rMin = ama / span;
|
|
1223
|
+
let rMax = ama * span;
|
|
1224
|
+
if (slopeScaling && dir !== 0) {
|
|
1225
|
+
// Canonical tilt: ama_slope_model slope offset applied
|
|
1226
|
+
// through asymmetric_bounds, then the narrowing-side guard.
|
|
1227
|
+
const trendName = dir > 0 ? 'UP' : 'DOWN';
|
|
1228
|
+
const slopeOffset = clamp(slopePct / maxSlope, -1, 1) * maxSlopeOffset;
|
|
1229
|
+
const tilt = applyAsymmetricBounds({
|
|
1230
|
+
centerPrice: ama,
|
|
1231
|
+
minPrice: ama / span,
|
|
1232
|
+
maxPrice: ama * span,
|
|
1233
|
+
trend: trendName,
|
|
1234
|
+
slopeOffset,
|
|
1235
|
+
maxSlopeOffset,
|
|
1236
|
+
maxAsymmetryFactor: maxAsym,
|
|
1237
|
+
});
|
|
1238
|
+
const guard = applyNarrowingSideGuard({
|
|
1239
|
+
centerPrice: ama,
|
|
1240
|
+
minPrice: tilt.resolvedMinPrice,
|
|
1241
|
+
maxPrice: tilt.resolvedMaxPrice,
|
|
1242
|
+
trend: trendName,
|
|
1243
|
+
incrementPercent: inc,
|
|
1244
|
+
minScaleSlots: minSlots,
|
|
1245
|
+
});
|
|
1246
|
+
rMin = guard.minPrice;
|
|
1247
|
+
rMax = guard.maxPrice;
|
|
1248
|
+
}
|
|
1249
|
+
if (!Number.isFinite(rMin) || !Number.isFinite(rMax) || rMin <= 0 || rMax <= rMin) continue;
|
|
1250
|
+
upper[i] = rMax;
|
|
1251
|
+
lower[i] = rMin;
|
|
1252
|
+
trend[i] = dir;
|
|
1253
|
+
}
|
|
1254
|
+
return { upper, lower, trend };
|
|
1255
|
+
}
|
|
1256
|
+
function sampleTrendByIndex(series, idxs) {
|
|
1257
|
+
if (!Array.isArray(series) || !Array.isArray(idxs)) return [];
|
|
1258
|
+
return idxs.map((idx) => (Number.isFinite(idx) && series[idx] != null ? series[idx] : 0));
|
|
1259
|
+
}
|
|
1078
1260
|
function lowerBound(arr, value) {
|
|
1079
1261
|
let lo = 0;
|
|
1080
1262
|
let hi = arr.length;
|
|
@@ -1095,6 +1277,25 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1095
1277
|
let end = Math.min(xs.length, lowerBound(xs, maxX) + 2);
|
|
1096
1278
|
let min = Infinity;
|
|
1097
1279
|
let max = -Infinity;
|
|
1280
|
+
// Range scaling active: fit the price axis to the full envelope
|
|
1281
|
+
// (lower ↔ upper through AMA) instead of the candles, so the
|
|
1282
|
+
// switch visibly adjusts the range. Falls through to the candle
|
|
1283
|
+
// fit when the band has no finite values in view.
|
|
1284
|
+
if (currentRangeEnabled && currentRangeScaleEnabled && currentAmaEnabled) {
|
|
1285
|
+
let bmin = Infinity;
|
|
1286
|
+
let bmax = -Infinity;
|
|
1287
|
+
for (let i = start; i < end; i++) {
|
|
1288
|
+
const a = currentAma[i];
|
|
1289
|
+
const up = currentRangeUpper[i];
|
|
1290
|
+
const lo = currentRangeLower[i];
|
|
1291
|
+
if (Number.isFinite(a) && a > 0) { if (a < bmin) bmin = a; if (a > bmax) bmax = a; }
|
|
1292
|
+
if (Number.isFinite(up) && up > 0) { if (up < bmin) bmin = up; if (up > bmax) bmax = up; }
|
|
1293
|
+
if (Number.isFinite(lo) && lo > 0) { if (lo < bmin) bmin = lo; if (lo > bmax) bmax = lo; }
|
|
1294
|
+
}
|
|
1295
|
+
if (Number.isFinite(bmin) && Number.isFinite(bmax) && bmin > 0 && bmax > bmin) {
|
|
1296
|
+
return [bmin * 0.97, bmax * 1.03];
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1098
1299
|
for (let i = start; i < end; i++) {
|
|
1099
1300
|
const lo = currentLow[i];
|
|
1100
1301
|
const hi = currentHigh[i];
|
|
@@ -1171,11 +1372,24 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1171
1372
|
refreshLegend();
|
|
1172
1373
|
saveState();
|
|
1173
1374
|
}
|
|
1375
|
+
function hideRangeBandImmediate() {
|
|
1376
|
+
currentRangeUpper = new Array(currentCandles.length).fill(null);
|
|
1377
|
+
currentRangeLower = new Array(currentCandles.length).fill(null);
|
|
1378
|
+
currentRangeTrend = new Array(currentCandles.length).fill(0);
|
|
1379
|
+
// The band is a draw hook with no uPlot series: nothing else
|
|
1380
|
+
// repaints on hide, so redraw explicitly (stale pixels otherwise linger).
|
|
1381
|
+
if (priceChart && typeof priceChart.redraw === 'function') priceChart.redraw();
|
|
1382
|
+
refreshLegend();
|
|
1383
|
+
saveState();
|
|
1384
|
+
}
|
|
1174
1385
|
function hideAmaSeriesImmediate() {
|
|
1175
1386
|
currentAma = new Array(currentCandles.length).fill(null);
|
|
1176
1387
|
currentAmaOff = new Array(currentCandles.length).fill(null);
|
|
1177
1388
|
currentSmaInit = new Array(currentCandles.length).fill(null);
|
|
1178
1389
|
currentSmaInitOff = new Array(currentCandles.length).fill(null);
|
|
1390
|
+
currentRangeUpper = new Array(currentCandles.length).fill(null);
|
|
1391
|
+
currentRangeLower = new Array(currentCandles.length).fill(null);
|
|
1392
|
+
currentRangeTrend = new Array(currentCandles.length).fill(0);
|
|
1179
1393
|
if (Array.isArray(currentPriceData) && currentPriceData.length >= 11) {
|
|
1180
1394
|
currentPriceData[6] = currentAma;
|
|
1181
1395
|
currentPriceData[8] = currentSmaInit;
|
|
@@ -1216,6 +1430,18 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1216
1430
|
document.getElementById('legend-sma-init').textContent = Number.isFinite(currentSmaInit[idx]) ? fmtPrice(currentSmaInit[idx]) : '-';
|
|
1217
1431
|
document.getElementById('legend-off-init').textContent = Number.isFinite(currentSmaInitOff[idx]) ? fmtPrice(currentSmaInitOff[idx]) : '-';
|
|
1218
1432
|
document.getElementById('legend-ama-off').textContent = Number.isFinite(currentAmaOff[idx]) ? fmtPrice(currentAmaOff[idx]) : '-';
|
|
1433
|
+
const rangeDir = currentRangeTrend[idx];
|
|
1434
|
+
const rangeDot = document.getElementById('legend-range-dot');
|
|
1435
|
+
const rangeVal = document.getElementById('legend-range');
|
|
1436
|
+
if (rangeDot) rangeDot.style.background = rangeDir === 1 ? '#26a69a' : (rangeDir === -1 ? '#ef5350' : '#8b949e');
|
|
1437
|
+
if (rangeVal) {
|
|
1438
|
+
const ru = currentRangeUpper[idx];
|
|
1439
|
+
const rl = currentRangeLower[idx];
|
|
1440
|
+
const ama = currentAma[idx];
|
|
1441
|
+
if (currentRangeEnabled && currentAmaEnabled && Number.isFinite(ru) && ru > ama && Number.isFinite(rl) && rl > 0 && rl < ama && ama > 0) {
|
|
1442
|
+
rangeVal.textContent = '+' + ((ru - ama) / ama * 100).toFixed(1) + '% / -' + ((ama - rl) / ama * 100).toFixed(1) + '%';
|
|
1443
|
+
} else rangeVal.textContent = '-';
|
|
1444
|
+
}
|
|
1219
1445
|
document.getElementById('legend-vwap').textContent = Number.isFinite(currentVwap[idx]) ? fmtPrice(currentVwap[idx]) : '-';
|
|
1220
1446
|
}
|
|
1221
1447
|
function candlePlugin() {
|
|
@@ -1359,6 +1585,80 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1359
1585
|
hooks: { drawAxes: [drawVolumeBars] },
|
|
1360
1586
|
};
|
|
1361
1587
|
}
|
|
1588
|
+
function rangeBandPlugin() {
|
|
1589
|
+
function drawRangeBand(u) {
|
|
1590
|
+
if (!currentRangeEnabled || !currentAmaEnabled || !currentCandles.length) return;
|
|
1591
|
+
const xs = u.data[0];
|
|
1592
|
+
if (!Array.isArray(xs) || xs.length === 0) return;
|
|
1593
|
+
u.ctx.save();
|
|
1594
|
+
u.ctx.beginPath();
|
|
1595
|
+
u.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);
|
|
1596
|
+
u.ctx.clip();
|
|
1597
|
+
// Behind candles/AMA lines (same trick as the dynamic-weight signal background).
|
|
1598
|
+
u.ctx.globalCompositeOperation = 'destination-over';
|
|
1599
|
+
const UP_FILL = 'rgba(38,166,154,0.16)';
|
|
1600
|
+
const DOWN_FILL = 'rgba(239,83,80,0.16)';
|
|
1601
|
+
// Symmetric envelope, always both sides: green [AMA, upper]
|
|
1602
|
+
// plus red [lower, AMA] along the whole AMA, tilted by the
|
|
1603
|
+
// grid's range scaling. Paint per contiguous valid segment.
|
|
1604
|
+
let segTop = [];
|
|
1605
|
+
let segBot = [];
|
|
1606
|
+
const flush = () => {
|
|
1607
|
+
if (segTop.length > 1) {
|
|
1608
|
+
u.ctx.fillStyle = UP_FILL;
|
|
1609
|
+
u.ctx.beginPath();
|
|
1610
|
+
u.ctx.moveTo(segTop[0][0], segTop[0][1]);
|
|
1611
|
+
for (let k = 1; k < segTop.length; k++) u.ctx.lineTo(segTop[k][0], segTop[k][1]);
|
|
1612
|
+
for (let k = segTop.length - 1; k >= 0; k--) u.ctx.lineTo(segTop[k][0], segTop[k][2]);
|
|
1613
|
+
u.ctx.closePath();
|
|
1614
|
+
u.ctx.fill();
|
|
1615
|
+
}
|
|
1616
|
+
if (segBot.length > 1) {
|
|
1617
|
+
u.ctx.fillStyle = DOWN_FILL;
|
|
1618
|
+
u.ctx.beginPath();
|
|
1619
|
+
u.ctx.moveTo(segBot[0][0], segBot[0][1]);
|
|
1620
|
+
for (let k = 1; k < segBot.length; k++) u.ctx.lineTo(segBot[k][0], segBot[k][1]);
|
|
1621
|
+
for (let k = segBot.length - 1; k >= 0; k--) u.ctx.lineTo(segBot[k][0], segBot[k][2]);
|
|
1622
|
+
u.ctx.closePath();
|
|
1623
|
+
u.ctx.fill();
|
|
1624
|
+
}
|
|
1625
|
+
u.ctx.strokeStyle = 'rgba(38,166,154,0.55)';
|
|
1626
|
+
u.ctx.lineWidth = 1;
|
|
1627
|
+
u.ctx.beginPath();
|
|
1628
|
+
segTop.forEach((p, k) => { if (k === 0) u.ctx.moveTo(p[0], p[1]); else u.ctx.lineTo(p[0], p[1]); });
|
|
1629
|
+
u.ctx.stroke();
|
|
1630
|
+
u.ctx.strokeStyle = 'rgba(239,83,80,0.55)';
|
|
1631
|
+
u.ctx.beginPath();
|
|
1632
|
+
segBot.forEach((p, k) => { if (k === 0) u.ctx.moveTo(p[0], p[1]); else u.ctx.lineTo(p[0], p[1]); });
|
|
1633
|
+
u.ctx.stroke();
|
|
1634
|
+
segTop = [];
|
|
1635
|
+
segBot = [];
|
|
1636
|
+
};
|
|
1637
|
+
for (let i = 0; i < xs.length; i++) {
|
|
1638
|
+
const a = currentAma[i];
|
|
1639
|
+
const up = currentRangeUpper[i];
|
|
1640
|
+
const lo = currentRangeLower[i];
|
|
1641
|
+
if (!Number.isFinite(a) || a <= 0 || !Number.isFinite(up) || up <= a
|
|
1642
|
+
|| !Number.isFinite(lo) || lo <= 0 || lo >= a) {
|
|
1643
|
+
flush();
|
|
1644
|
+
continue;
|
|
1645
|
+
}
|
|
1646
|
+
const x = u.valToPos(xs[i], 'x', true);
|
|
1647
|
+
const yA = u.valToPos(a, 'y', true);
|
|
1648
|
+
const yU = u.valToPos(up, 'y', true);
|
|
1649
|
+
const yL = u.valToPos(lo, 'y', true);
|
|
1650
|
+
if (!Number.isFinite(x) || !Number.isFinite(yA) || !Number.isFinite(yU) || !Number.isFinite(yL)) {
|
|
1651
|
+
flush();
|
|
1652
|
+
continue;
|
|
1653
|
+
}
|
|
1654
|
+
segTop.push([x, yU, yA]);
|
|
1655
|
+
segBot.push([x, yL, yA]);
|
|
1656
|
+
}
|
|
1657
|
+
flush();
|
|
1658
|
+
u.ctx.restore();
|
|
1659
|
+
}
|
|
1660
|
+
return { hooks: { draw: [drawRangeBand] } };
|
|
1661
|
+
}
|
|
1362
1662
|
function buildData() {
|
|
1363
1663
|
const tf = timeframeMap.get(currentTimeframe) || timeframeMap.get(defaultTimeframe.label) || timeframes[0];
|
|
1364
1664
|
currentSeriesState = getSeriesState(currentPairMode);
|
|
@@ -1393,6 +1693,10 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1393
1693
|
currentSma = new Array(currentCandles.length).fill(null);
|
|
1394
1694
|
}
|
|
1395
1695
|
currentAma = currentAmaEnabled ? sampleSeriesByIndex(baseAma, aggregated.idxs) : new Array(currentCandles.length).fill(null);
|
|
1696
|
+
const baseRange = computeRangeBand(baseAma);
|
|
1697
|
+
currentRangeUpper = sampleSeriesByIndex(baseRange.upper, aggregated.idxs);
|
|
1698
|
+
currentRangeLower = sampleSeriesByIndex(baseRange.lower, aggregated.idxs);
|
|
1699
|
+
currentRangeTrend = sampleTrendByIndex(baseRange.trend, aggregated.idxs);
|
|
1396
1700
|
currentAmaOff = currentAmaEnabled && currentAmaInitOffset !== 0 ? sampleSeriesByIndex(baseAmaOff, aggregated.idxs) : new Array(currentCandles.length).fill(null);
|
|
1397
1701
|
currentVwap = currentVwapEnabled ? sampleSeriesByIndex(baseVwap, aggregated.idxs) : new Array(currentCandles.length).fill(null);
|
|
1398
1702
|
const amaCfg = currentAmaConfig();
|
|
@@ -1497,7 +1801,7 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1497
1801
|
|
|
1498
1802
|
const plugin = candlePlugin();
|
|
1499
1803
|
plugin.opts(null, priceOpts);
|
|
1500
|
-
priceOpts.plugins = [plugin];
|
|
1804
|
+
priceOpts.plugins = [rangeBandPlugin(), plugin];
|
|
1501
1805
|
if (!priceChart) priceChart = new uPlot(priceOpts, data.priceData, priceEl);
|
|
1502
1806
|
else priceChart.setData(data.priceData, false);
|
|
1503
1807
|
|
|
@@ -1654,12 +1958,11 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1654
1958
|
priceBounds = null;
|
|
1655
1959
|
return;
|
|
1656
1960
|
}
|
|
1657
|
-
const range = max - min;
|
|
1658
1961
|
// Uloszoomauksen rajat: alin naytettava hinta voi painua viimeistaan
|
|
1659
|
-
// ~35 % datan minimin alapuolelle, ylin ~1.6x datan maksimin
|
|
1660
|
-
// kokonaisvali saa olla enintaan ~1.6x datan hintahaarukasta —
|
|
1962
|
+
// ~35 % datan minimin alapuolelle, ylin ~1.6x datan maksimin —
|
|
1661
1963
|
// ei siis paase "lipsahtamaan" candleita nakyvasta kadottaen.
|
|
1662
|
-
|
|
1964
|
+
// Kokonaisvalille ei ole ylarajaa: pystyakselia saa zoomata ulos vapaasti.
|
|
1965
|
+
priceBounds = { min: min, max: max, floor: min * 0.35, ceil: max * 1.6 };
|
|
1663
1966
|
}
|
|
1664
1967
|
function applyYRange(chart, min, max) {
|
|
1665
1968
|
if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) return false;
|
|
@@ -1672,13 +1975,6 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1672
1975
|
if (priceBounds) {
|
|
1673
1976
|
let nMin = Math.max(min, priceBounds.floor);
|
|
1674
1977
|
let nMax = Math.min(max, priceBounds.ceil);
|
|
1675
|
-
if (nMax - nMin > priceBounds.maxSpan) {
|
|
1676
|
-
const c = (nMin + nMax) / 2;
|
|
1677
|
-
nMin = c - priceBounds.maxSpan / 2;
|
|
1678
|
-
nMax = c + priceBounds.maxSpan / 2;
|
|
1679
|
-
nMin = Math.max(nMin, priceBounds.floor);
|
|
1680
|
-
nMax = Math.min(nMax, priceBounds.ceil);
|
|
1681
|
-
}
|
|
1682
1978
|
if (nMax <= nMin) return false;
|
|
1683
1979
|
min = nMin;
|
|
1684
1980
|
max = nMax;
|
|
@@ -1762,6 +2058,11 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1762
2058
|
document.getElementById('ama-slow').value = currentAmaSlowPeriod.toFixed(1);
|
|
1763
2059
|
document.getElementById('vwap-toggle').checked = currentVwapEnabled;
|
|
1764
2060
|
document.getElementById('vwap-bars').value = String(currentVwapBars);
|
|
2061
|
+
document.getElementById('range-toggle').checked = currentRangeEnabled;
|
|
2062
|
+
document.getElementById('range-scale-toggle').checked = currentRangeScaleEnabled;
|
|
2063
|
+
document.getElementById('range-span').value = Number(currentRangeSpan).toFixed(2);
|
|
2064
|
+
document.getElementById('range-span-val').textContent = Number(currentRangeSpan).toFixed(2) + 'x';
|
|
2065
|
+
document.getElementById('range-grid-wrap').style.display = payload.grid ? 'inline' : 'none';
|
|
1765
2066
|
document.getElementById('ama-init-offset-toggle').checked = currentAmaInitOffsetEnabled;
|
|
1766
2067
|
document.getElementById('ama-init-offset').value = String(currentAmaInitOffset);
|
|
1767
2068
|
document.getElementById('ama-init-offset').disabled = !currentAmaInitOffsetEnabled;
|
|
@@ -1832,7 +2133,6 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1832
2133
|
|
|
1833
2134
|
setControls();
|
|
1834
2135
|
rerender(false);
|
|
1835
|
-
|
|
1836
2136
|
document.querySelectorAll('.time-btn').forEach((btn) => {
|
|
1837
2137
|
btn.addEventListener('click', () => {
|
|
1838
2138
|
if (btn.disabled) return;
|
|
@@ -1843,7 +2143,6 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1843
2143
|
rerender(true);
|
|
1844
2144
|
});
|
|
1845
2145
|
});
|
|
1846
|
-
|
|
1847
2146
|
const scaleToggle = document.getElementById('scale-toggle');
|
|
1848
2147
|
if (scaleToggle) {
|
|
1849
2148
|
scaleToggle.addEventListener('click', () => {
|
|
@@ -1876,6 +2175,9 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1876
2175
|
document.getElementById('ama-init-offset-val').textContent = currentAmaInitOffset + '%';
|
|
1877
2176
|
currentVwapEnabled = document.getElementById('vwap-toggle').checked;
|
|
1878
2177
|
currentVwapBars = clamp(Math.round(Number(document.getElementById('vwap-bars').value) || 500), 24, 2000);
|
|
2178
|
+
currentRangeEnabled = document.getElementById('range-toggle').checked;
|
|
2179
|
+
currentRangeScaleEnabled = document.getElementById('range-scale-toggle').checked;
|
|
2180
|
+
currentRangeSpan = Math.min(2, Math.max(1.25, Math.round((Number(document.getElementById('range-span').value) || 1.55) * 20) / 20));
|
|
1879
2181
|
setControls();
|
|
1880
2182
|
rerender(false);
|
|
1881
2183
|
};
|
|
@@ -1914,6 +2216,25 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1914
2216
|
rerender(false);
|
|
1915
2217
|
});
|
|
1916
2218
|
document.getElementById('ama-init-offset-toggle').addEventListener('change', syncInputs);
|
|
2219
|
+
document.getElementById('range-toggle').addEventListener('change', () => {
|
|
2220
|
+
const nextEnabled = document.getElementById('range-toggle').checked;
|
|
2221
|
+
if (currentRangeEnabled === nextEnabled) return;
|
|
2222
|
+
currentRangeEnabled = nextEnabled;
|
|
2223
|
+
setControls();
|
|
2224
|
+
if (!currentRangeEnabled) {
|
|
2225
|
+
hideRangeBandImmediate();
|
|
2226
|
+
return;
|
|
2227
|
+
}
|
|
2228
|
+
rerender(false);
|
|
2229
|
+
});
|
|
2230
|
+
document.getElementById('range-scale-toggle').addEventListener('change', () => {
|
|
2231
|
+
const nextEnabled = document.getElementById('range-scale-toggle').checked;
|
|
2232
|
+
if (currentRangeScaleEnabled === nextEnabled) return;
|
|
2233
|
+
currentRangeScaleEnabled = nextEnabled;
|
|
2234
|
+
manualYRange = null;
|
|
2235
|
+
setControls();
|
|
2236
|
+
rerender(false);
|
|
2237
|
+
});
|
|
1917
2238
|
['sma-period', 'ama-er', 'ama-fast', 'ama-slow', 'vwap-bars'].forEach((id) => {
|
|
1918
2239
|
document.getElementById(id).addEventListener('change', syncInputs);
|
|
1919
2240
|
document.getElementById(id).addEventListener('blur', syncInputs);
|
|
@@ -1965,6 +2286,11 @@ function generateHTML(data, title = 'TradingView Style Research') {
|
|
|
1965
2286
|
document.getElementById('ama-init-offset-val').textContent = snapped + '%';
|
|
1966
2287
|
syncInputs();
|
|
1967
2288
|
});
|
|
2289
|
+
document.getElementById('range-span').addEventListener('input', () => {
|
|
2290
|
+
const input = document.getElementById('range-span');
|
|
2291
|
+
document.getElementById('range-span-val').textContent = Number(input.value).toFixed(2) + 'x';
|
|
2292
|
+
syncInputs();
|
|
2293
|
+
});
|
|
1968
2294
|
|
|
1969
2295
|
window.addEventListener('resize', () => {
|
|
1970
2296
|
if (!charts.length) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tradingview_uplot_chart_generator.js","sourceRoot":"","sources":["../../../analysis/tradingview/tradingview_uplot_chart_generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tradingview_uplot_chart_generator.js","sourceRoot":"","sources":["../../../analysis/tradingview/tradingview_uplot_chart_generator.ts"],"names":[],"mappings":"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"}
|