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.
Files changed (94) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/analysis/ama_fitting/package.json +1 -1
  3. package/analysis/resolve_source.ts +3 -0
  4. package/analysis/results/ama_sweep_results_lp_pool_133_1h.json +2455 -0
  5. package/analysis/results/bot_fitting_results_lp_pool_133_1h.json +218 -0
  6. package/analysis/tradingview/README.md +5 -1
  7. package/analysis/tradingview/analyze_tradingview.ts +27 -1
  8. package/analysis/tradingview/h-bts_tradingview.html +1570 -0
  9. package/analysis/tradingview/t-bts_tradingview.html +1570 -0
  10. package/analysis/tradingview/tradingview_uplot_chart_generator.ts +351 -22
  11. package/analysis/trend_detection/package.json +1 -1
  12. package/claw/package.json +1 -1
  13. package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
  14. package/claw/runtimes/openclaw-plugin/package.json +1 -1
  15. package/claw/tests/test_claw_mcp_transport.ts +2 -2
  16. package/dist/analysis/resolve_source.d.ts.map +1 -1
  17. package/dist/analysis/resolve_source.js +3 -0
  18. package/dist/analysis/resolve_source.js.map +1 -1
  19. package/dist/analysis/tradingview/analyze_tradingview.d.ts +3 -0
  20. package/dist/analysis/tradingview/analyze_tradingview.d.ts.map +1 -1
  21. package/dist/analysis/tradingview/analyze_tradingview.js +27 -2
  22. package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
  23. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.d.ts.map +1 -1
  24. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js +348 -22
  25. package/dist/analysis/tradingview/tradingview_uplot_chart_generator.js.map +1 -1
  26. package/dist/dexbot.js +5 -5
  27. package/dist/dexbot.js.map +1 -1
  28. package/dist/market_adapter/core/asymmetric_bounds.d.ts +33 -1
  29. package/dist/market_adapter/core/asymmetric_bounds.d.ts.map +1 -1
  30. package/dist/market_adapter/core/asymmetric_bounds.js +38 -1
  31. package/dist/market_adapter/core/asymmetric_bounds.js.map +1 -1
  32. package/dist/modules/dexbot_class.d.ts +2 -18
  33. package/dist/modules/dexbot_class.d.ts.map +1 -1
  34. package/dist/modules/dexbot_cow_runtime.d.ts +38 -37
  35. package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
  36. package/dist/modules/dexbot_cow_runtime.js +722 -557
  37. package/dist/modules/dexbot_cow_runtime.js.map +1 -1
  38. package/dist/modules/dexbot_fill_runtime.d.ts.map +1 -1
  39. package/dist/modules/dexbot_fill_runtime.js +7 -1
  40. package/dist/modules/dexbot_fill_runtime.js.map +1 -1
  41. package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
  42. package/dist/modules/dexbot_maintenance_runtime.js +31 -51
  43. package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
  44. package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
  45. package/dist/modules/dexbot_startup_runtime.js +42 -3
  46. package/dist/modules/dexbot_startup_runtime.js.map +1 -1
  47. package/dist/modules/order/accounting.d.ts.map +1 -1
  48. package/dist/modules/order/accounting.js +19 -2
  49. package/dist/modules/order/accounting.js.map +1 -1
  50. package/dist/modules/order/export.d.ts +122 -15
  51. package/dist/modules/order/export.d.ts.map +1 -1
  52. package/dist/modules/order/export.js +310 -46
  53. package/dist/modules/order/export.js.map +1 -1
  54. package/dist/modules/order/grid.d.ts.map +1 -1
  55. package/dist/modules/order/grid.js +29 -38
  56. package/dist/modules/order/grid.js.map +1 -1
  57. package/dist/modules/order/grid_reconcile.d.ts.map +1 -1
  58. package/dist/modules/order/grid_reconcile.js +7 -3
  59. package/dist/modules/order/grid_reconcile.js.map +1 -1
  60. package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
  61. package/dist/modules/order/grid_reconcile_internal.js +31 -33
  62. package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
  63. package/dist/modules/order/manager.d.ts +13 -6
  64. package/dist/modules/order/manager.d.ts.map +1 -1
  65. package/dist/modules/order/manager.js +22 -7
  66. package/dist/modules/order/manager.js.map +1 -1
  67. package/dist/modules/order/sync_engine.d.ts.map +1 -1
  68. package/dist/modules/order/sync_engine.js +231 -11
  69. package/dist/modules/order/sync_engine.js.map +1 -1
  70. package/dist/modules/order/utils/math.d.ts +38 -15
  71. package/dist/modules/order/utils/math.d.ts.map +1 -1
  72. package/dist/modules/order/utils/math.js +55 -16
  73. package/dist/modules/order/utils/math.js.map +1 -1
  74. package/dist/modules/order/utils/order.d.ts +116 -20
  75. package/dist/modules/order/utils/order.d.ts.map +1 -1
  76. package/dist/modules/order/utils/order.js +340 -35
  77. package/dist/modules/order/utils/order.js.map +1 -1
  78. package/dist/modules/order/utils/system.d.ts +1 -30
  79. package/dist/modules/order/utils/system.d.ts.map +1 -1
  80. package/dist/modules/order/utils/system.js +31 -98
  81. package/dist/modules/order/utils/system.js.map +1 -1
  82. package/dist/modules/order/utils/validate.d.ts +3 -2
  83. package/dist/modules/order/utils/validate.d.ts.map +1 -1
  84. package/dist/modules/order/utils/validate.js +49 -28
  85. package/dist/modules/order/utils/validate.js.map +1 -1
  86. package/dist/scripts/analyze-credit.d.ts.map +1 -1
  87. package/dist/scripts/analyze-credit.js +53 -33
  88. package/dist/scripts/analyze-credit.js.map +1 -1
  89. package/docs/DEXBOT_COMPARISON.md +3 -3
  90. package/docs/EVOLUTION.md +7 -5
  91. package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +1 -1
  92. package/docs/README.md +2 -2
  93. package/docs/WORKFLOW.md +1 -1
  94. 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-wrap: wrap; justify-content: flex-end; gap: 8px 12px; align-items: center; }
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 { justify-content: flex-start; }
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="group" id="tf-group">
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" style="margin-top:4px">
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
- <div class="group"></div>
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, ja
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
- priceBounds = { min: min, max: max, floor: min * 0.35, ceil: max * 1.6, maxSpan: range * 1.6 };
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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"}