@tradecanvas/chart 1.4.0 → 1.7.0

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 (195) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +910 -858
  3. package/dist/Chart.d.ts +606 -23
  4. package/dist/Chart.d.ts.map +1 -1
  5. package/dist/DataManager.d.ts +5 -0
  6. package/dist/DataManager.d.ts.map +1 -1
  7. package/dist/HistoryPager.d.ts +58 -0
  8. package/dist/HistoryPager.d.ts.map +1 -0
  9. package/dist/LayoutSession-CTZB90NX.cjs +2 -0
  10. package/dist/LayoutSession-CTZB90NX.cjs.map +1 -0
  11. package/dist/LayoutSession-CWn3sdbs.js +3967 -0
  12. package/dist/LayoutSession-CWn3sdbs.js.map +1 -0
  13. package/dist/ThemeManager.d.ts +5 -1
  14. package/dist/ThemeManager.d.ts.map +1 -1
  15. package/dist/chartA11y.d.ts +59 -0
  16. package/dist/chartA11y.d.ts.map +1 -0
  17. package/dist/charts/ChartTypeStrategy.d.ts +5 -4
  18. package/dist/charts/ChartTypeStrategy.d.ts.map +1 -1
  19. package/dist/grid/ChartGrid.d.ts +6 -1
  20. package/dist/grid/ChartGrid.d.ts.map +1 -1
  21. package/dist/i18n-CiQ8EDVs.js +1469 -0
  22. package/dist/i18n-CiQ8EDVs.js.map +1 -0
  23. package/dist/i18n-WsLA9SmD.cjs +2 -0
  24. package/dist/i18n-WsLA9SmD.cjs.map +1 -0
  25. package/dist/index.cjs +1 -1
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.ts +22 -3
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +31 -31
  30. package/dist/index.js.map +1 -1
  31. package/dist/indicatorLabel.d.ts +7 -0
  32. package/dist/indicatorLabel.d.ts.map +1 -0
  33. package/dist/layout/LayoutManager.d.ts +50 -0
  34. package/dist/layout/LayoutManager.d.ts.map +1 -1
  35. package/dist/layout/priceAxisWidth.d.ts +2 -0
  36. package/dist/layout/priceAxisWidth.d.ts.map +1 -1
  37. package/dist/regularHours.d.ts +10 -0
  38. package/dist/regularHours.d.ts.map +1 -0
  39. package/dist/state/LayoutSession.d.ts +101 -0
  40. package/dist/state/LayoutSession.d.ts.map +1 -0
  41. package/dist/state/layoutStorage.d.ts +46 -0
  42. package/dist/state/layoutStorage.d.ts.map +1 -0
  43. package/dist/trading/wireExecution.d.ts +7 -3
  44. package/dist/trading/wireExecution.d.ts.map +1 -1
  45. package/dist/widget/ChartWidget.d.ts +219 -10
  46. package/dist/widget/ChartWidget.d.ts.map +1 -1
  47. package/dist/widget/ChartWidgetGrid.d.ts +166 -0
  48. package/dist/widget/ChartWidgetGrid.d.ts.map +1 -0
  49. package/dist/widget/DrawingTemplateStore.d.ts +29 -8
  50. package/dist/widget/DrawingTemplateStore.d.ts.map +1 -1
  51. package/dist/widget/WatchlistStore.d.ts +65 -0
  52. package/dist/widget/WatchlistStore.d.ts.map +1 -0
  53. package/dist/widget/WidgetAccountPanel.d.ts +72 -0
  54. package/dist/widget/WidgetAccountPanel.d.ts.map +1 -0
  55. package/dist/widget/WidgetAlertsPanel.d.ts +50 -3
  56. package/dist/widget/WidgetAlertsPanel.d.ts.map +1 -1
  57. package/dist/widget/WidgetBracketBar.d.ts +3 -1
  58. package/dist/widget/WidgetBracketBar.d.ts.map +1 -1
  59. package/dist/widget/WidgetChartNav.d.ts +36 -0
  60. package/dist/widget/WidgetChartNav.d.ts.map +1 -0
  61. package/dist/widget/WidgetCommandPalette.d.ts +3 -1
  62. package/dist/widget/WidgetCommandPalette.d.ts.map +1 -1
  63. package/dist/widget/WidgetContextMenu.d.ts +40 -0
  64. package/dist/widget/WidgetContextMenu.d.ts.map +1 -0
  65. package/dist/widget/WidgetDataWindow.d.ts +3 -1
  66. package/dist/widget/WidgetDataWindow.d.ts.map +1 -1
  67. package/dist/widget/WidgetDepthLadder.d.ts +3 -1
  68. package/dist/widget/WidgetDepthLadder.d.ts.map +1 -1
  69. package/dist/widget/WidgetDrawingSettings.d.ts +108 -0
  70. package/dist/widget/WidgetDrawingSettings.d.ts.map +1 -0
  71. package/dist/widget/WidgetDrawingSidebar.d.ts +14 -1
  72. package/dist/widget/WidgetDrawingSidebar.d.ts.map +1 -1
  73. package/dist/widget/WidgetDrawingStyle.d.ts +3 -1
  74. package/dist/widget/WidgetDrawingStyle.d.ts.map +1 -1
  75. package/dist/widget/WidgetDropdown.d.ts.map +1 -1
  76. package/dist/widget/WidgetGoToDate.d.ts +5 -4
  77. package/dist/widget/WidgetGoToDate.d.ts.map +1 -1
  78. package/dist/widget/WidgetHistoryPill.d.ts +23 -0
  79. package/dist/widget/WidgetHistoryPill.d.ts.map +1 -0
  80. package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -1
  81. package/dist/widget/WidgetIndicatorLegend.d.ts +31 -1
  82. package/dist/widget/WidgetIndicatorLegend.d.ts.map +1 -1
  83. package/dist/widget/WidgetIndicatorSettings.d.ts +62 -7
  84. package/dist/widget/WidgetIndicatorSettings.d.ts.map +1 -1
  85. package/dist/widget/WidgetIntervalInput.d.ts +34 -0
  86. package/dist/widget/WidgetIntervalInput.d.ts.map +1 -0
  87. package/dist/widget/WidgetLayoutsDialog.d.ts +39 -0
  88. package/dist/widget/WidgetLayoutsDialog.d.ts.map +1 -0
  89. package/dist/widget/WidgetLayoutsUI.d.ts +37 -0
  90. package/dist/widget/WidgetLayoutsUI.d.ts.map +1 -0
  91. package/dist/widget/WidgetNamePrompt.d.ts +31 -0
  92. package/dist/widget/WidgetNamePrompt.d.ts.map +1 -0
  93. package/dist/widget/WidgetObjectTree.d.ts +21 -3
  94. package/dist/widget/WidgetObjectTree.d.ts.map +1 -1
  95. package/dist/widget/WidgetOrderTicket.d.ts +49 -0
  96. package/dist/widget/WidgetOrderTicket.d.ts.map +1 -0
  97. package/dist/widget/WidgetReplayBar.d.ts +15 -0
  98. package/dist/widget/WidgetReplayBar.d.ts.map +1 -1
  99. package/dist/widget/WidgetSettings.d.ts +13 -1
  100. package/dist/widget/WidgetSettings.d.ts.map +1 -1
  101. package/dist/widget/WidgetStatusBar.d.ts +3 -0
  102. package/dist/widget/WidgetStatusBar.d.ts.map +1 -1
  103. package/dist/widget/WidgetStyles.d.ts +3 -1
  104. package/dist/widget/WidgetStyles.d.ts.map +1 -1
  105. package/dist/widget/WidgetSymbolInfo.d.ts +64 -0
  106. package/dist/widget/WidgetSymbolInfo.d.ts.map +1 -0
  107. package/dist/widget/WidgetSymbolSearch.d.ts +26 -5
  108. package/dist/widget/WidgetSymbolSearch.d.ts.map +1 -1
  109. package/dist/widget/WidgetToolbar.d.ts +30 -1
  110. package/dist/widget/WidgetToolbar.d.ts.map +1 -1
  111. package/dist/widget/WidgetWatchlist.d.ts +53 -13
  112. package/dist/widget/WidgetWatchlist.d.ts.map +1 -1
  113. package/dist/widget/chartMenu.d.ts +40 -0
  114. package/dist/widget/chartMenu.d.ts.map +1 -0
  115. package/dist/widget/drawingMenu.d.ts +21 -0
  116. package/dist/widget/drawingMenu.d.ts.map +1 -0
  117. package/dist/widget/focusTrap.d.ts +8 -0
  118. package/dist/widget/focusTrap.d.ts.map +1 -0
  119. package/dist/widget/i18n.d.ts +20 -89
  120. package/dist/widget/i18n.d.ts.map +1 -1
  121. package/dist/widget/iconSet.d.ts.map +1 -1
  122. package/dist/widget/index.cjs +4294 -3028
  123. package/dist/widget/index.cjs.map +1 -1
  124. package/dist/widget/index.d.ts +15 -1
  125. package/dist/widget/index.d.ts.map +1 -1
  126. package/dist/widget/index.js +6326 -1185
  127. package/dist/widget/index.js.map +1 -1
  128. package/dist/widget/indicatorTemplates.d.ts +24 -0
  129. package/dist/widget/indicatorTemplates.d.ts.map +1 -0
  130. package/dist/widget/keyTarget.d.ts +11 -0
  131. package/dist/widget/keyTarget.d.ts.map +1 -0
  132. package/dist/widget/legendValues.d.ts +11 -6
  133. package/dist/widget/legendValues.d.ts.map +1 -1
  134. package/dist/widget/locales/ar.d.ts +4 -0
  135. package/dist/widget/locales/ar.d.ts.map +1 -0
  136. package/dist/widget/locales/de.d.ts +4 -0
  137. package/dist/widget/locales/de.d.ts.map +1 -0
  138. package/dist/widget/locales/en.d.ts +722 -0
  139. package/dist/widget/locales/en.d.ts.map +1 -0
  140. package/dist/widget/locales/es.d.ts +4 -0
  141. package/dist/widget/locales/es.d.ts.map +1 -0
  142. package/dist/widget/locales/fr.d.ts +4 -0
  143. package/dist/widget/locales/fr.d.ts.map +1 -0
  144. package/dist/widget/locales/he.d.ts +4 -0
  145. package/dist/widget/locales/he.d.ts.map +1 -0
  146. package/dist/widget/locales/id.d.ts +4 -0
  147. package/dist/widget/locales/id.d.ts.map +1 -0
  148. package/dist/widget/locales/index.cjs +2 -0
  149. package/dist/widget/locales/index.cjs.map +1 -0
  150. package/dist/widget/locales/index.d.ts +33 -0
  151. package/dist/widget/locales/index.d.ts.map +1 -0
  152. package/dist/widget/locales/index.js +10089 -0
  153. package/dist/widget/locales/index.js.map +1 -0
  154. package/dist/widget/locales/ja.d.ts +4 -0
  155. package/dist/widget/locales/ja.d.ts.map +1 -0
  156. package/dist/widget/locales/ko.d.ts +4 -0
  157. package/dist/widget/locales/ko.d.ts.map +1 -0
  158. package/dist/widget/locales/pt.d.ts +4 -0
  159. package/dist/widget/locales/pt.d.ts.map +1 -0
  160. package/dist/widget/locales/ru.d.ts +4 -0
  161. package/dist/widget/locales/ru.d.ts.map +1 -0
  162. package/dist/widget/locales/th.d.ts +4 -0
  163. package/dist/widget/locales/th.d.ts.map +1 -0
  164. package/dist/widget/locales/tr.d.ts +4 -0
  165. package/dist/widget/locales/tr.d.ts.map +1 -0
  166. package/dist/widget/locales/vi.d.ts +4 -0
  167. package/dist/widget/locales/vi.d.ts.map +1 -0
  168. package/dist/widget/locales/zh.d.ts +4 -0
  169. package/dist/widget/locales/zh.d.ts.map +1 -0
  170. package/dist/widget/locales/zhHant.d.ts +4 -0
  171. package/dist/widget/locales/zhHant.d.ts.map +1 -0
  172. package/dist/widget/orderTicket.d.ts +27 -0
  173. package/dist/widget/orderTicket.d.ts.map +1 -0
  174. package/dist/widget/settingsControls.d.ts +24 -0
  175. package/dist/widget/settingsControls.d.ts.map +1 -0
  176. package/dist/widget/types.d.ts +182 -6
  177. package/dist/widget/types.d.ts.map +1 -1
  178. package/dist/widget/widgetConfig.d.ts.map +1 -1
  179. package/dist/widget/widgetLayout.d.ts +22 -0
  180. package/dist/widget/widgetLayout.d.ts.map +1 -0
  181. package/dist/widget/widgetLocales.d.ts +17 -0
  182. package/dist/widget/widgetLocales.d.ts.map +1 -0
  183. package/dist/widget/widgetTimeframes.d.ts +8 -0
  184. package/dist/widget/widgetTimeframes.d.ts.map +1 -1
  185. package/dist/widget/widgetTimezones.d.ts +32 -0
  186. package/dist/widget/widgetTimezones.d.ts.map +1 -0
  187. package/dist/widget/widgetUI.d.ts +126 -0
  188. package/dist/widget/widgetUI.d.ts.map +1 -0
  189. package/package.json +8 -3
  190. package/dist/DragDropImporter-C5kgfbET.cjs +0 -2
  191. package/dist/DragDropImporter-C5kgfbET.cjs.map +0 -1
  192. package/dist/DragDropImporter-Dd9Mud5J.js +0 -2099
  193. package/dist/DragDropImporter-Dd9Mud5J.js.map +0 -1
  194. package/dist/charts/IndicatorPriceRange.d.ts +0 -20
  195. package/dist/charts/IndicatorPriceRange.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-WsLA9SmD.cjs","names":[],"sources":["../src/widget/locales/en.ts","../src/widget/locales/vi.ts","../src/widget/i18n.ts"],"sourcesContent":["/**\r\n * English, the source of every ChartWidget string key. Other languages\r\n * translate these keys; a missing one falls back to English.\r\n */\r\nexport const EN_MESSAGES = {\r\n // Toolbar\r\n 'toolbar.indicators': 'Indicators',\r\n 'toolbar.indicators.popular': 'Popular',\r\n 'toolbar.indicators.all': 'All',\r\n 'indicatorType.overlay': 'overlay',\r\n 'indicatorType.panel': 'panel',\r\n 'toolbar.replay': 'Bar replay',\r\n 'replay.selectHint': 'Click a bar to start the replay',\r\n 'replay.random': 'Random bar',\r\n 'replay.realtime': 'Back to realtime',\r\n 'replay.barsPerSecond': 'bars/s',\r\n 'replay.play': 'Play',\r\n 'replay.pause': 'Pause',\r\n 'replay.stepBack': 'Step back (Shift+←)',\r\n 'replay.stepForward': 'Step forward (Shift+→)',\r\n 'toolbar.longBracket': 'Long bracket',\r\n 'toolbar.shortBracket': 'Short bracket',\r\n 'toolbar.depthLadder': 'Depth ladder',\r\n 'toolbar.objects': 'Objects',\r\n 'toolbar.priceAlerts': 'Price alerts',\r\n 'toolbar.screenshot': 'Screenshot',\r\n 'toolbar.settings': 'Chart Settings',\r\n 'toolbar.toggleTheme': 'Toggle theme',\r\n 'toolbar.timeframes': 'Timeframes',\r\n 'toolbar.timeframes.pin': 'Pin to toolbar',\r\n 'toolbar.timeframes.custom': 'Custom interval, e.g. 7m, 90m, 2h, 3D',\r\n 'toolbar.timeframes.add': 'Add interval',\r\n 'toolbar.timeframes.remove': 'Remove interval',\r\n 'toolbar.timeframes.invalid': 'Type a number and a unit: 7m, 2h, 3D, 1W, 2M',\r\n 'toolbar.fullscreen': 'Fullscreen',\r\n 'legend.show': 'Show',\r\n 'legend.hide': 'Hide',\r\n 'legend.settings': 'Settings',\r\n 'legend.remove': 'Remove',\r\n 'legend.collapse': 'Collapse indicators',\r\n 'legend.expand': 'Show indicators',\r\n 'indicatorSettings.title': '{name} settings',\r\n 'indicatorSettings.tab.inputs': 'Inputs',\r\n 'indicatorSettings.tab.style': 'Style',\r\n 'indicatorSettings.tab.levels': 'Levels',\r\n 'indicatorSettings.noInputs': 'This indicator has no adjustable parameters.',\r\n 'indicatorSettings.source.prices': 'Price',\r\n 'indicatorSettings.source.indicators': 'Indicators',\r\n 'indicatorSettings.lineWidth': 'Line width',\r\n 'indicatorSettings.scale': 'Price scale',\r\n 'indicatorSettings.scale.right': 'Right (price)',\r\n 'indicatorSettings.scale.left': 'Left (own range)',\r\n 'indicatorSettings.up': 'up',\r\n 'indicatorSettings.down': 'down',\r\n 'indicatorSettings.addLevel': 'Add level',\r\n 'indicatorSettings.removeLevel': 'Remove level',\r\n 'indicatorSettings.noLevels': 'No levels.',\r\n 'indicatorSettings.level': 'Level',\r\n 'indicatorSettings.close': 'Close',\r\n 'toolbar.exitFullscreen': 'Exit fullscreen',\r\n 'range.presets': 'Visible range',\r\n 'range.all': 'All',\r\n 'range.goTo': 'Go to date',\r\n 'range.goToSubmit': 'Go to',\r\n 'range.date': 'Date',\r\n 'range.time': 'Time',\r\n 'range.cancel': 'Cancel',\r\n 'range.beforeData': 'Showing the earliest loaded bar',\r\n\r\n // Chart types\r\n 'chartType.candlestick': 'Candlestick',\r\n 'chartType.line': 'Line',\r\n 'chartType.area': 'Area',\r\n 'chartType.bar': 'Bar',\r\n 'chartType.heikinAshi': 'Heikin-Ashi',\r\n 'chartType.hollowCandle': 'Hollow Candle',\r\n 'chartType.baseline': 'Baseline',\r\n 'chartType.volumeCandles': 'Volume Candles',\r\n 'chartType.equivolume': 'Equivolume',\r\n 'chartType.hlcArea': 'HLC Area',\r\n 'chartType.stepLine': 'Step Line',\r\n 'chartType.lineWithMarkers': 'Line + Markers',\r\n 'chartType.hiLo': 'High-Low',\r\n 'chartType.renko': 'Renko',\r\n 'chartType.lineBreak': 'Line Break',\r\n 'chartType.kagi': 'Kagi',\r\n 'chartType.pointAndFigure': 'Point & Figure',\r\n 'chartType.rangeBars': 'Range Bars',\r\n\r\n // Watchlist\r\n 'watchlist.title': 'Watchlist',\r\n 'watchlist.lists': 'Lists',\r\n 'watchlist.newList': 'New list…',\r\n 'watchlist.rename': 'Rename list…',\r\n 'watchlist.deleteList': 'Delete list',\r\n 'watchlist.confirmDelete': 'Delete “{name}”? Click again',\r\n 'watchlist.add': 'Add symbol',\r\n 'watchlist.remove': 'Remove {symbol}',\r\n 'watchlist.empty': 'No symbols yet. Add one with +.',\r\n 'watchlist.listName': 'List name',\r\n\r\n // Symbol info\r\n 'symbolInfo.title': 'Symbol info',\r\n 'symbolInfo.open': 'Market open',\r\n 'symbolInfo.closed': 'Market closed',\r\n 'symbolInfo.always': 'Trades around the clock',\r\n 'symbolInfo.closesIn': 'closes {when}',\r\n 'symbolInfo.opensIn': 'opens {when}',\r\n 'symbolInfo.prevClose': 'Prev. close',\r\n 'symbolInfo.bid': 'Bid',\r\n 'symbolInfo.ask': 'Ask',\r\n 'symbolInfo.tick': 'Tick size',\r\n 'symbolInfo.currency': 'Currency',\r\n 'symbolInfo.timezone': 'Time zone',\r\n 'symbolInfo.hours': 'Trading hours',\r\n 'symbolInfo.news': 'News',\r\n 'symbolInfo.noNews': 'No news for this symbol.',\r\n 'symbolInfo.newsFailed': 'News could not be loaded.',\r\n 'symbolInfo.loading': 'Loading…',\r\n 'action.symbolInfo': 'Symbol info',\r\n\r\n // Navigation over the chart\r\n 'nav.label': 'Chart navigation',\r\n 'nav.zoomIn': 'Zoom in',\r\n 'nav.zoomOut': 'Zoom out',\r\n 'nav.scrollLeft': 'Scroll left',\r\n 'nav.scrollRight': 'Scroll right',\r\n 'nav.reset': 'Reset chart view',\r\n\r\n // Screen readers\r\n 'a11y.role': 'chart',\r\n 'a11y.summary': '{what}. Last price {close}.',\r\n 'a11y.empty': 'Chart, no data.',\r\n 'a11y.view': 'Showing {count} bars, {from} to {to}. High {high}, low {low}.',\r\n 'a11y.bar': '{time}: open {open}, high {high}, low {low}, close {close}, volume {volume}.',\r\n 'a11y.keys': 'Arrow keys scroll and zoom, Home and End go to the start and the end. Comma and period read the bars one at a time.',\r\n\r\n // Status bar / connection\r\n 'status.connecting': 'Connecting...',\r\n 'status.live': 'Live',\r\n 'status.connectionFailed': 'Connection failed',\r\n 'status.loading': 'Loading chart...',\r\n 'history.loading': 'Loading history…',\r\n 'history.failed': 'Could not load older bars',\r\n\r\n // Settings panel\r\n 'settings.title': 'Chart Settings',\r\n 'settings.tab.style': 'style',\r\n 'settings.tab.display': 'display',\r\n 'settings.tab.scale': 'scale',\r\n 'settings.resetToDefaults': 'Reset to defaults',\r\n 'settings.done': 'Done',\r\n 'settings.section.candleColors': 'Candle Colors',\r\n 'settings.section.background': 'Background',\r\n\r\n // Hotkey sheet\r\n 'hotkeys.title': 'Keyboard shortcuts',\r\n 'hotkeys.footer': 'Press ? anytime to show this sheet',\r\n 'hotkeys.close': 'Close',\r\n 'hotkeys.gotIt': 'Got it',\r\n 'hotkeys.group.searchNavigation': 'Search & navigation',\r\n 'hotkeys.group.chartManipulation': 'Chart manipulation',\r\n 'hotkeys.group.touch': 'Touch (mobile / tablet)',\r\n 'hotkeys.group.keyboard': 'Keyboard',\r\n 'hotkeys.group.drawing': 'Drawing',\r\n\r\n // Common\r\n 'common.close': 'Close',\r\n 'common.cancel': 'Cancel',\r\n 'common.save': 'Save',\r\n 'common.show': 'Show',\r\n 'common.hide': 'Hide',\r\n 'common.lock': 'Lock',\r\n 'common.unlock': 'Unlock',\r\n 'common.navigate': 'Navigate',\r\n 'common.open': 'Open',\r\n 'common.select': 'Select',\r\n\r\n // Settings rows\r\n 'settings.upBody': 'Up body',\r\n 'settings.downBody': 'Down body',\r\n 'settings.upWick': 'Up wick',\r\n 'settings.downWick': 'Down wick',\r\n 'settings.background': 'Background',\r\n 'settings.grid': 'Grid',\r\n 'settings.gridLines': 'Grid lines',\r\n 'settings.volume': 'Volume',\r\n 'settings.volumeProfile': 'Volume profile',\r\n 'settings.marketProfile': 'Market profile (TPO)',\r\n 'settings.marketProfileSplit': 'Market profile per session',\r\n 'settings.marketProfileLetters': 'Market profile letters',\r\n 'settings.marketProfileBuckets': 'Market profile rows',\r\n 'settings.marketProfileOpacity': 'Market profile opacity',\r\n 'settings.depthHeatmap': 'Liquidity heatmap',\r\n 'settings.depthHeatmapOpacity': 'Heatmap opacity',\r\n 'settings.swingMarkers': 'Swing markers',\r\n 'settings.swingStrength': 'Swing strength',\r\n 'settings.swingStructure': 'Swing structure (HH/HL)',\r\n 'settings.sessionShading': 'Session shading',\r\n 'settings.periodLevels': 'Prior-period levels',\r\n 'settings.periodLevelsBasis': 'Prior period',\r\n 'settings.priorDay': 'Prior day (PDH/PDL)',\r\n 'settings.priorWeek': 'Prior week (PWH/PWL)',\r\n 'settings.ohlcLegend': 'OHLC legend',\r\n 'settings.indicatorValues': 'Indicator values on scale',\r\n 'settings.barCountdown': 'Bar countdown',\r\n 'settings.crosshairMode': 'Crosshair',\r\n 'settings.crosshair.magnet': 'Magnet',\r\n 'settings.crosshair.normal': 'Normal',\r\n 'settings.crosshair.hidden': 'Hidden',\r\n 'settings.timezone': 'Timezone',\r\n 'settings.timezone.local': 'Local',\r\n 'settings.timezone.exchange': 'Exchange',\r\n 'settings.numberLocale': 'Number format',\r\n 'settings.autoScale': 'Auto scale',\r\n 'settings.invertScale': 'Invert scale (Alt+I)',\r\n 'settings.leftScale': 'Left price scale',\r\n 'settings.priceScale': 'Price scale',\r\n 'settings.mainSeries': 'Main series',\r\n 'settings.highLowLines': 'High and low lines',\r\n 'settings.extendedHours': 'Extended hours',\r\n 'settings.boxSize': 'Box size',\r\n 'settings.atrPeriod': 'ATR length',\r\n 'settings.lineBreakLines': 'Lines to break',\r\n 'settings.reversal': 'Reversal',\r\n 'settings.reversalType': 'Reversal in',\r\n 'settings.reversalType.percent': 'Percent',\r\n 'settings.reversalType.price': 'Price',\r\n 'settings.reversalBoxes': 'Reversal boxes',\r\n 'settings.barRange': 'Range',\r\n 'settings.auto': 'Auto',\r\n 'settings.scale.regular': 'Regular',\r\n 'settings.scale.logarithmic': 'Logarithmic',\r\n 'settings.scale.percentage': 'Percentage',\r\n 'settings.scale.indexedTo100': 'Indexed to 100',\r\n\r\n // Alerts panel\r\n 'alerts.title': 'Price alerts',\r\n 'alerts.close': 'Close alerts',\r\n 'alerts.value': 'Value',\r\n 'alerts.note': 'Note (optional)',\r\n 'alerts.add': 'Add alert',\r\n 'alerts.empty': 'No alerts yet. Add one above, or right-click the chart.',\r\n 'alerts.delete': 'Delete alert',\r\n 'alerts.triggered': 'triggered',\r\n 'alerts.source.price': 'Price',\r\n 'alerts.condition.crossing': 'Crossing',\r\n 'alerts.condition.crossingUp': 'Crossing up',\r\n 'alerts.condition.crossingDown': 'Crossing down',\r\n 'alerts.condition.greaterThan': 'Greater than',\r\n 'alerts.condition.lessThan': 'Less than',\r\n 'alerts.fired': 'Alert: {text}',\r\n\r\n // Object tree\r\n 'objects.title': 'Objects',\r\n 'objects.close': 'Close objects',\r\n 'objects.indicators': 'Indicators',\r\n 'objects.drawings': 'Drawings',\r\n 'objects.compare': 'Compare',\r\n 'objects.addCompare': 'Add a symbol to compare',\r\n 'objects.noIndicators': 'No indicators',\r\n 'objects.noDrawings': 'No drawings',\r\n 'objects.noComparisons': 'No comparisons',\r\n 'objects.indicatorSettings': 'Indicator settings',\r\n 'objects.removeIndicator': 'Remove indicator',\r\n 'objects.removeDrawing': 'Remove drawing',\r\n 'objects.removeComparison': 'Remove comparison',\r\n\r\n // Drawing sidebar and style panel\r\n 'drawing.cursor': 'Cursor',\r\n 'drawing.style': 'Drawing style & templates',\r\n 'drawing.magnet': 'Magnet',\r\n 'drawing.magnetOn': 'Magnet on',\r\n 'drawing.magnetOff': 'Magnet off',\r\n 'drawing.eraser': 'Eraser: click a drawing to remove it',\r\n 'drawing.zoomArea': 'Zoom: drag a box to zoom into it',\r\n 'drawing.magnetStrong': 'Magnet: strong (always snaps)',\r\n 'drawing.stay': 'Stay in drawing mode',\r\n 'drawing.undo': 'Undo',\r\n 'drawing.redo': 'Redo',\r\n 'drawing.clearAll': 'Clear all',\r\n 'drawing.pinHint': 'Right-click a tool to pin it',\r\n 'drawingStyle.title': 'Drawing style',\r\n 'drawingStyle.templates': 'Templates',\r\n 'drawingStyle.templateName': 'Template name',\r\n 'drawingStyle.noTemplates': 'No saved templates',\r\n 'drawingStyle.deleteTemplate': 'Delete template',\r\n 'drawingSettings.tab.style': 'Style',\r\n 'drawingSettings.tab.options': 'Properties',\r\n 'drawingSettings.tab.coordinates': 'Coordinates',\r\n 'drawingSettings.ok': 'OK',\r\n 'drawingSettings.color': 'Color',\r\n 'drawingSettings.lineWidth': 'Line width',\r\n 'drawingSettings.lineStyle': 'Line style',\r\n 'drawingSettings.lineStyle.solid': 'Solid',\r\n 'drawingSettings.lineStyle.dashed': 'Dashed',\r\n 'drawingSettings.lineStyle.dotted': 'Dotted',\r\n 'drawingSettings.fill': 'Fill',\r\n 'drawingSettings.opacity': 'Opacity (%)',\r\n 'drawingSettings.text': 'Text',\r\n 'drawingSettings.fontSize': 'Font size',\r\n 'drawingSettings.saveDefault': 'Save as default',\r\n 'drawingSettings.defaultSaved': 'Saved as the default for {name}',\r\n 'drawingSettings.levelVisible': 'Show this level',\r\n 'drawingSettings.levelValue': 'Level',\r\n 'drawingSettings.levelColor': 'Level color',\r\n 'drawingSettings.removeLevel': 'Remove level',\r\n 'drawingSettings.addLevel': 'Add level',\r\n 'drawingSettings.point': 'Point {n}',\r\n 'drawingSettings.date': 'Date',\r\n 'drawingSettings.time': 'Time',\r\n 'drawingSettings.price': 'Price',\r\n 'drawingOption.extendLeft': 'Extend left',\r\n 'drawingOption.extendRight': 'Extend right',\r\n 'drawingOption.middleLine': 'Middle line',\r\n 'drawingOption.levels': 'Levels',\r\n 'drawingOption.reverse': 'Reverse',\r\n 'drawingOption.showLevels': 'Show levels',\r\n 'drawingOption.showPrices': 'Show prices',\r\n 'drawingOption.labelPosition': 'Labels',\r\n 'drawingOption.labelPosition.left': 'Left',\r\n 'drawingOption.labelPosition.right': 'Right',\r\n 'drawingOption.background': 'Background',\r\n 'objects.drawingSettings': 'Drawing settings',\r\n 'objects.renameGroup': 'Rename group',\r\n 'drawingMenu.label': 'Drawing',\r\n 'drawingMenu.settings': 'Settings…',\r\n 'drawingMenu.front': 'Bring to front',\r\n 'drawingMenu.forward': 'Bring forward',\r\n 'drawingMenu.backward': 'Send backward',\r\n 'drawingMenu.back': 'Send to back',\r\n 'drawingMenu.group': 'Group',\r\n 'drawingMenu.ungroup': 'Ungroup',\r\n 'drawingMenu.duplicate': 'Duplicate',\r\n 'drawingMenu.delete': 'Delete',\r\n 'chartMenu.label': 'Chart',\r\n 'chartMenu.addAlert': 'Add alert at {price}',\r\n 'chartMenu.alertAdded': 'Alert added at {price}',\r\n 'chartMenu.buyLimit': 'Buy limit at {price}',\r\n 'chartMenu.buyStop': 'Buy stop at {price}',\r\n 'chartMenu.sellLimit': 'Sell limit at {price}',\r\n 'chartMenu.sellStop': 'Sell stop at {price}',\r\n 'chartMenu.horizontalLine': 'Horizontal line at {price}',\r\n 'chartMenu.resetView': 'Reset chart view',\r\n 'chartMenu.resetTimeScale': 'Reset time scale',\r\n 'chartMenu.hideDrawings': 'Hide drawings',\r\n 'chartMenu.showDrawings': 'Show drawings',\r\n 'chartMenu.removeDrawings': 'Remove drawings',\r\n 'chartMenu.settings': 'Settings…',\r\n 'chartMenu.invertScale': 'Invert scale',\r\n 'chartMenu.goToDate': 'Go to date…',\r\n 'toolbar.account': 'Account: positions, orders, history',\r\n 'chartMenu.orderTicket': 'New order…',\r\n 'account.title': 'Account',\r\n 'account.positions': 'Positions',\r\n 'account.orders': 'Orders',\r\n 'account.history': 'History',\r\n 'account.newOrder': 'New order',\r\n 'account.close': 'Close the account panel',\r\n 'account.side': 'Side',\r\n 'account.long': 'Long',\r\n 'account.short': 'Short',\r\n 'account.quantity': 'Qty',\r\n 'account.entry': 'Entry',\r\n 'account.price': 'Price',\r\n 'account.pnl': 'P&L',\r\n 'account.stopLoss': 'SL',\r\n 'account.takeProfit': 'TP',\r\n 'account.actions': 'Actions',\r\n 'account.time': 'Time',\r\n 'account.reason': 'Reason',\r\n 'account.reason.order': 'Order',\r\n 'account.reason.close': 'Closed',\r\n 'account.reason.reverse': 'Reversed',\r\n 'account.reason.stopLoss': 'Stop-loss',\r\n 'account.reason.takeProfit': 'Take-profit',\r\n 'account.reverse': 'Reverse position',\r\n 'account.closePosition': 'Close position',\r\n 'account.cancelOrder': 'Cancel order',\r\n 'account.noPositions': 'No open positions',\r\n 'account.noOrders': 'No working orders',\r\n 'account.noFills': 'No trades yet',\r\n 'account.realised': 'Realised P&L: {pnl}',\r\n 'ticket.title': 'New order',\r\n 'ticket.buy': 'Buy',\r\n 'ticket.sell': 'Sell',\r\n 'ticket.type': 'Type',\r\n 'ticket.type.market': 'Market',\r\n 'ticket.type.limit': 'Limit',\r\n 'ticket.type.stop': 'Stop',\r\n 'ticket.quantity': 'Quantity',\r\n 'ticket.price': 'Price',\r\n 'ticket.stopLoss': 'Stop-loss',\r\n 'ticket.takeProfit': 'Take-profit',\r\n 'ticket.timeInForce': 'Time in force',\r\n 'ticket.tif.gtc': 'Good till cancelled',\r\n 'ticket.tif.day': 'Day',\r\n 'ticket.riskReward': 'Reward:risk {rr}',\r\n 'ticket.placeBuy': 'Place buy order',\r\n 'ticket.placeSell': 'Place sell order',\r\n 'ticket.sent': 'Order sent: {side} {quantity} @ {price}',\r\n 'ticket.problem.quantity': 'Enter a quantity above 0.',\r\n 'ticket.problem.price': 'Enter a price above 0.',\r\n 'ticket.problem.market': 'There is no market price yet.',\r\n 'ticket.problem.stopLoss': 'Enter a stop-loss price above 0.',\r\n 'ticket.problem.takeProfit': 'Enter a take-profit price above 0.',\r\n 'ticket.problem.stopLossSide': 'The stop-loss goes below the entry for a buy, above it for a sell.',\r\n 'ticket.problem.takeProfitSide': 'The take-profit goes above the entry for a buy, below it for a sell.',\r\n 'ticket.problem.limitSide': 'A buy limit goes below the market and a sell limit above it.',\r\n 'ticket.problem.stopSide': 'A buy stop goes above the market and a sell stop below it.',\r\n 'toolbar.layouts': 'Layout',\r\n 'layouts.unnamed': 'Unnamed',\r\n 'layouts.unsavedChanges': 'unsaved changes',\r\n 'layouts.save': 'Save layout',\r\n 'layouts.saveAs': 'Save as…',\r\n 'layouts.rename': 'Rename…',\r\n 'layouts.autoSave': 'Auto-save',\r\n 'layouts.open': 'Open layout…',\r\n 'layouts.saved': 'Layout saved: {name}',\r\n 'layouts.saveFailed': 'Couldn\\'t save the layout',\r\n 'layouts.openFailed': 'Couldn\\'t open the layout',\r\n 'layouts.deleteFailed': 'Couldn\\'t delete the layout',\r\n 'layouts.saveAsTitle': 'Save layout as',\r\n 'layouts.renameTitle': 'Rename layout',\r\n 'layouts.renameSubmit': 'Rename',\r\n 'layouts.copyName': '{name} (copy)',\r\n 'layouts.name': 'Name',\r\n 'layouts.namePlaceholder': 'My layout',\r\n 'layouts.dialogTitle': 'Layouts',\r\n 'layouts.search': 'Search layouts',\r\n 'layouts.empty': 'No saved layouts yet',\r\n 'layouts.noMatch': 'No layouts match',\r\n 'layouts.current': 'Open',\r\n 'layouts.updated': 'saved {time}',\r\n 'layouts.renameNamed': 'Rename {name}',\r\n 'layouts.deleteNamed': 'Delete {name}',\r\n 'layouts.deleteConfirm': 'Delete',\r\n 'grid.bar': 'Charts',\r\n 'grid.layout': 'Chart layout',\r\n 'grid.single': 'One chart',\r\n 'grid.layoutOption': '{count} charts, {cols} across and {rows} down',\r\n 'grid.chart': 'Chart {n}',\r\n 'grid.sync': 'Sync',\r\n 'grid.sync.symbol': 'Symbol',\r\n 'grid.sync.interval': 'Interval',\r\n 'grid.sync.crosshair': 'Crosshair',\r\n 'grid.sync.time': 'Time',\r\n 'grid.sync.drawings': 'Drawings',\r\n 'grid.sync.replay': 'Replay',\r\n 'grid.sync.symbol.hint': 'Change the symbol on every chart together',\r\n 'grid.sync.interval.hint': 'Change the interval on every chart together',\r\n 'grid.sync.crosshair.hint': 'Show the crosshair’s time on every chart',\r\n 'grid.sync.time.hint': 'Scroll and zoom every chart to the same time',\r\n 'grid.sync.drawings.hint': 'Copy drawings to the charts of the same symbol',\r\n 'grid.sync.replay.hint': 'Replay every chart to the same time',\r\n 'legend.more': 'More',\r\n 'legend.moveUp': 'Move to pane above',\r\n 'legend.moveDown': 'Move to pane below',\r\n 'legend.moveNew': 'Move to new pane',\r\n 'legend.movePrice': 'Move to price pane',\r\n 'pane.moveUp': 'Move pane up',\r\n 'pane.moveDown': 'Move pane down',\r\n 'pane.collapse': 'Collapse pane',\r\n 'pane.expand': 'Expand pane',\r\n 'pane.maximize': 'Maximize pane',\r\n 'pane.restore': 'Restore panes',\r\n 'toolbar.indicators.templates': 'Templates',\r\n 'templates.save': 'Save indicators as template…',\r\n 'templates.saveTitle': 'Save indicator template',\r\n 'templates.namePlaceholder': 'My indicators',\r\n 'templates.saved': 'Template saved: {name}',\r\n 'templates.applied': 'Template applied: {name}',\r\n 'templates.delete': 'Delete template {name}',\r\n 'templates.nothing': 'There are no indicators to save',\r\n 'templates.saveFailed': 'Couldn\\'t save the template',\r\n 'interval.title': 'Change interval',\r\n 'interval.hint': '5, 15m, 1h, 1D — Enter to apply',\r\n 'interval.invalid': 'Not an interval this chart can show',\r\n 'alerts.condition.movesUp': 'Moves up',\r\n 'alerts.condition.movesDown': 'Moves down',\r\n 'alerts.source': 'Watch',\r\n 'alerts.conditionLabel': 'Condition',\r\n 'alerts.compareWith': 'Compared with',\r\n 'alerts.compare.value': 'A value',\r\n 'alerts.percent': 'Percent',\r\n 'alerts.bars': 'Bars',\r\n 'alerts.moveSummary': '{percent}% within {bars} bars',\r\n 'alerts.onBarClose': 'Only on bar close',\r\n 'alerts.onClose': 'on bar close',\r\n 'alerts.expires': 'Expires',\r\n 'alerts.expires.never': 'Never expires',\r\n 'alerts.expires.hour': 'Expires in 1 hour',\r\n 'alerts.expires.day': 'Expires in 1 day',\r\n 'alerts.expires.week': 'Expires in 1 week',\r\n 'alerts.expires.month': 'Expires in 30 days',\r\n 'alerts.until': 'until {time}',\r\n 'alerts.expired': 'Expired',\r\n 'alerts.expiredToast': 'Alert expired: {text}',\r\n 'alerts.invalid': 'These alert settings don’t fit together',\r\n 'replay.step': 'Step',\r\n 'replay.step.bar': 'Bar',\r\n 'replay.stepsFailed': 'Couldn\\'t load the finer bars: replaying bar by bar',\r\n 'markers.neutral': 'Neutral',\r\n 'markers.confidence': 'confidence {pct}%',\r\n 'chartMenu.paneLog': 'Logarithmic scale',\r\n 'chartMenu.paneInvert': 'Invert scale',\r\n 'chartMenu.panePercent': 'Percent scale',\r\n 'chartMenu.exportData': 'Export data (CSV)',\r\n 'compare.percent': 'Percent change, on this scale',\r\n 'compare.ownScale': 'Price, on its own scale',\r\n 'compare.ownPane': 'Price, in a pane of its own',\r\n 'compare.spread': 'Spread: {main} − {other}',\r\n 'compare.ratio': 'Ratio: {main} ÷ {other}',\r\n 'drawingSettings.addAlert': 'Add alert',\r\n 'drawingSettings.alertAdded': 'Alert added: price crossing {name}',\r\n 'drawingOption.rewardRatio': 'Reward:risk',\r\n 'drawingOption.accountSize': 'Account size',\r\n 'drawingOption.riskMode': 'Risk as',\r\n 'drawingOption.riskMode.percent': 'Percent of account',\r\n 'drawingOption.riskMode.amount': 'Amount',\r\n 'drawingOption.risk': 'Risk',\r\n 'drawingOption.qtyDecimals': 'Quantity decimals',\r\n 'drawingOption.showLabels': 'Show labels',\r\n 'drawingOption.showText': 'Show text',\r\n 'drawingOption.direction': 'Direction',\r\n 'drawingOption.direction.up': 'Up',\r\n 'drawingOption.direction.down': 'Down',\r\n 'drawingOption.direction.left': 'Left',\r\n 'drawingOption.direction.right': 'Right',\r\n 'drawingOption.size': 'Size',\r\n 'drawingOption.glyph': 'Icon',\r\n 'drawingOption.glyph.star': 'Star',\r\n 'drawingOption.glyph.heart': 'Heart',\r\n 'drawingOption.glyph.check': 'Check',\r\n 'drawingOption.glyph.cross': 'Cross',\r\n 'drawingOption.glyph.circle': 'Circle',\r\n 'drawingOption.glyph.triangleUp': 'Triangle up',\r\n 'drawingOption.glyph.triangleDown': 'Triangle down',\r\n 'drawingOption.glyph.bolt': 'Bolt',\r\n 'drawingOption.arrowEnd': 'Arrow at the end',\r\n 'drawingOption.fullCircles': 'Full circles',\r\n 'drawingOption.clockwise': 'Clockwise',\r\n 'drawingOption.arcs': 'Arcs',\r\n 'drawingOption.degree': 'Degree',\r\n 'drawingOption.degree.primary': 'Primary',\r\n 'drawingOption.degree.intermediate': 'Intermediate',\r\n 'drawingOption.degree.minor': 'Minor',\r\n 'drawingOption.degree.minute': 'Minute',\r\n 'drawingOption.mode': 'Show as',\r\n 'drawingOption.mode.bars': 'Bars',\r\n 'drawingOption.mode.line': 'Line',\r\n 'drawingOption.mode.highLow': 'High-low',\r\n 'drawingOption.mirrored': 'Mirrored',\r\n 'drawingOption.flipped': 'Flipped',\r\n\r\n // Drawing tool groups\r\n 'toolGroup.lines': 'Lines',\r\n 'toolGroup.horizontalVertical': 'Horizontal/Vertical',\r\n 'toolGroup.channels': 'Channels',\r\n 'toolGroup.fibonacci': 'Fibonacci',\r\n 'toolGroup.shapes': 'Shapes',\r\n 'toolGroup.gannPitchforks': 'Gann & Pitchforks',\r\n 'toolGroup.patterns': 'Patterns',\r\n 'toolGroup.measure': 'Measure',\r\n 'toolGroup.annotation': 'Annotation',\r\n 'toolGroup.forecasting': 'Forecasting',\r\n 'toolGroup.brushes': 'Brushes',\r\n 'toolGroup.cycles': 'Cycles',\r\n 'toolGroup.elliott': 'Elliott Waves',\r\n\r\n // Drawing tools\r\n 'tool.trendLine': 'Trend Line',\r\n 'tool.ray': 'Ray',\r\n 'tool.extendedLine': 'Extended Line',\r\n 'tool.infoLine': 'Info Line',\r\n 'tool.trendAngle': 'Trend Angle',\r\n 'tool.horizontalLine': 'Horizontal Line',\r\n 'tool.horizontalRay': 'Horizontal Ray',\r\n 'tool.verticalLine': 'Vertical Line',\r\n 'tool.crossLine': 'Cross Line',\r\n 'tool.parallelChannel': 'Parallel Channel',\r\n 'tool.regressionChannel': 'Regression Channel',\r\n 'tool.fibRetracement': 'Fib Retracement',\r\n 'tool.fibExtension': 'Fib Extension',\r\n 'tool.fibChannel': 'Fib Channel',\r\n 'tool.fibTimeZones': 'Fib Time Zones',\r\n 'tool.fibSpeedResistanceFan': 'Fib Speed Resistance Fan',\r\n 'tool.rectangle': 'Rectangle',\r\n 'tool.circle': 'Circle',\r\n 'tool.ellipse': 'Ellipse',\r\n 'tool.triangle': 'Triangle',\r\n 'tool.pitchfork': 'Pitchfork',\r\n 'tool.schiffPitchfork': 'Schiff Pitchfork',\r\n 'tool.modifiedSchiffPitchfork': 'Modified Schiff Pitchfork',\r\n 'tool.gannFan': 'Gann Fan',\r\n 'tool.gannBox': 'Gann Box',\r\n 'tool.cyclicLines': 'Cyclic Lines',\r\n 'tool.xabcdPattern': 'XABCD Pattern',\r\n 'tool.abcdPattern': 'ABCD Pattern',\r\n 'tool.headAndShoulders': 'Head and Shoulders',\r\n 'tool.elliottWave': 'Elliott Wave',\r\n 'tool.priceRange': 'Price Range',\r\n 'tool.dateRange': 'Date Range',\r\n 'tool.dateAndPriceRange': 'Date and Price Range',\r\n 'tool.measure': 'Measure',\r\n 'tool.text': 'Text',\r\n 'tool.priceLabel': 'Price Label',\r\n 'tool.arrow': 'Arrow',\r\n 'tool.riskReward': 'Long/Short Position',\r\n 'tool.anchoredVWAP': 'Anchored VWAP',\r\n 'tool.volumeProfileRange': 'Fixed Range Volume Profile',\r\n 'tool.note': 'Note',\r\n 'tool.callout': 'Callout',\r\n 'tool.flag': 'Flag Mark',\r\n 'tool.arrowMark': 'Arrow Mark',\r\n 'tool.icon': 'Icon',\r\n 'tool.brush': 'Brush',\r\n 'tool.highlighter': 'Highlighter',\r\n 'tool.path': 'Path',\r\n 'tool.polyline': 'Polyline',\r\n 'tool.curve': 'Curve',\r\n 'tool.arc': 'Arc',\r\n 'tool.fibCircles': 'Fib Circles',\r\n 'tool.fibSpiral': 'Fib Spiral',\r\n 'tool.fibArcs': 'Fib Speed Resistance Arcs',\r\n 'tool.fibWedge': 'Fib Wedge',\r\n 'tool.pitchfan': 'Pitchfan',\r\n 'tool.gannSquare': 'Gann Square',\r\n 'tool.elliottImpulse': 'Elliott Impulse Wave',\r\n 'tool.elliottCorrection': 'Elliott Correction Wave',\r\n 'tool.elliottTriangle': 'Elliott Triangle Wave',\r\n 'tool.elliottDoubleCombo': 'Elliott Double Combo Wave',\r\n 'tool.elliottTripleCombo': 'Elliott Triple Combo Wave',\r\n 'tool.threeDrives': 'Three Drives Pattern',\r\n 'tool.cypherPattern': 'Cypher Pattern',\r\n 'tool.timeCycles': 'Time Cycles',\r\n 'tool.sineLine': 'Sine Line',\r\n 'tool.forecast': 'Forecast',\r\n 'tool.projection': 'Projection',\r\n 'tool.barsPattern': 'Bars Pattern',\r\n\r\n // Replay bar\r\n 'replay.label': 'Replay',\r\n 'replay.position': 'Replay position',\r\n 'replay.speed': 'Speed',\r\n\r\n // Symbol search and command palette\r\n 'symbolSearch.placeholder': 'Search symbol… (e.g. BTC, ETH, AAPL)',\r\n 'symbolSearch.empty': 'No symbols match',\r\n 'symbolSearch.searching': 'Searching…',\r\n 'symbolSearch.failed': 'Search failed',\r\n 'palette.placeholder': 'Search indicators, chart types, tools…',\r\n 'palette.empty': 'No results found',\r\n 'palette.group.indicator': 'Indicators',\r\n 'palette.group.chartType': 'Chart types',\r\n 'palette.group.drawing': 'Drawing tools',\r\n 'palette.group.timeframe': 'Timeframes',\r\n 'palette.group.action': 'Actions',\r\n 'action.screenshot': 'Screenshot',\r\n 'action.copyImage': 'Copy chart image',\r\n 'action.toggleTheme': 'Toggle theme',\r\n 'action.settings': 'Settings',\r\n 'action.shareView': 'Share view (copy link)',\r\n 'action.autoFib': 'Auto Fibonacci (visible swing)',\r\n 'action.dataWindow': 'Toggle data window',\r\n 'action.clearDrawings': 'Clear all drawings',\r\n\r\n // Depth ladder and data window\r\n 'ladder.title': 'Depth ladder',\r\n 'ladder.bid': 'Bid',\r\n 'ladder.price': 'Price',\r\n 'ladder.ask': 'Ask',\r\n 'ladder.empty': 'No order-book data',\r\n 'ladder.sellAt': 'Sell @ {price}',\r\n 'ladder.buyAt': 'Buy @ {price}',\r\n 'dataWindow.title': 'Data window',\r\n 'dataWindow.hover': 'Hover the chart',\r\n 'dataWindow.open': 'Open',\r\n 'dataWindow.high': 'High',\r\n 'dataWindow.low': 'Low',\r\n 'dataWindow.close': 'Close',\r\n 'dataWindow.change': 'Change',\r\n 'dataWindow.volume': 'Volume',\r\n\r\n // Brackets and orders\r\n 'bracket.place': 'Place',\r\n 'bracket.hint': 'drag lines to adjust',\r\n 'bracket.longPlaced': 'Long bracket placed · {rr}R',\r\n 'bracket.shortPlaced': 'Short bracket placed · {rr}R',\r\n 'order.buyLimit': 'Buy limit @ {price}',\r\n 'order.sellLimit': 'Sell limit @ {price}',\r\n 'order.buyStop': 'Buy stop @ {price}',\r\n 'order.sellStop': 'Sell stop @ {price}',\r\n\r\n // Toasts\r\n 'toast.pinned': 'Pinned to favorites',\r\n 'toast.unpinned': 'Unpinned',\r\n 'sidebar.unpinHint': '{tool} (right-click to unpin)',\r\n 'toast.imageCopied': 'Chart image copied',\r\n 'toast.imageCopyFailed': 'Copy failed — image clipboard unavailable',\r\n 'toast.linkCopied': 'Share link copied',\r\n 'toast.copyFailed': 'Copy failed — clipboard unavailable',\r\n 'toast.compareNeedsAdapter': 'Comparison needs a live data adapter',\r\n 'toast.comparing': 'Comparing {symbol}',\r\n 'toast.loadFailed': 'failed to load',\r\n 'toast.autoFibAdded': 'Auto Fibonacci added',\r\n 'toast.noSwing': 'No clear swing in view',\r\n 'toast.fullscreenUnavailable': 'Fullscreen is not available',\r\n 'toast.fileLoaded': 'Loaded {count} bars from {file}',\r\n 'toast.fileSkipped': '{count} skipped',\r\n\r\n // Hotkey sheet\r\n 'hotkeys.commandPalette': 'Command palette',\r\n 'hotkeys.symbolSearch': 'Symbol search',\r\n 'hotkeys.goToDate': 'Go to date',\r\n 'hotkeys.invertScale': 'Invert price scale',\r\n 'hotkeys.showSheet': 'Show this sheet',\r\n 'hotkeys.saveLayout': 'Save the layout',\r\n 'hotkeys.typeInterval': 'Type a number to change the interval',\r\n 'hotkeys.pan': 'Pan — past the last bar into empty future space',\r\n 'hotkeys.boxSelect': 'Select drawings in a box',\r\n 'hotkeys.toggleSelect': 'Add / remove a drawing from the selection',\r\n 'hotkeys.measure': 'Measure tool (bars × price Δ)',\r\n 'hotkeys.scalePrice': 'Compress / expand vertical scale',\r\n 'hotkeys.zoomTime': 'Zoom time axis',\r\n 'hotkeys.autoScale': 'Re-enable auto-scale',\r\n 'hotkeys.fit': 'Fit content',\r\n 'hotkeys.zoomCursor': 'Zoom around cursor',\r\n 'hotkeys.touchPan': 'Pan / move crosshair',\r\n 'hotkeys.pinch': 'Zoom around midpoint',\r\n 'hotkeys.longPress': 'Pin OHLC tooltip at bar',\r\n 'hotkeys.touchAxis': 'Scale price / time axis',\r\n 'hotkeys.panBar': 'Pan one bar',\r\n 'hotkeys.zoomInOut': 'Zoom in / out',\r\n 'hotkeys.toStart': 'Scroll to start',\r\n 'hotkeys.toEnd': 'Scroll to end (live edge)',\r\n 'hotkeys.undo': 'Undo',\r\n 'hotkeys.redo': 'Redo',\r\n 'hotkeys.cancelDrawing': 'Cancel active drawing',\r\n 'hotkeys.copy': 'Copy selected drawings',\r\n 'hotkeys.paste': 'Paste drawings (into any chart on the page)',\r\n 'key.drag': 'Drag',\r\n 'key.click': 'Click',\r\n 'key.doubleClick': 'Double-click',\r\n 'key.scroll': 'Scroll',\r\n 'key.priceAxis': 'Price axis',\r\n 'key.timeAxis': 'Time axis',\r\n 'key.oneFinger': '1 finger',\r\n 'key.twoFingers': '2 fingers',\r\n 'key.pinch': 'Pinch',\r\n 'key.longPress': 'Long-press',\r\n 'key.axisStrip': 'Axis strip',\r\n 'hotkeys.drawingMenu': 'A drawing\\'s menu (on the drawing)',\r\n 'hotkeys.drawingSettings': 'A drawing\\'s settings (on the drawing)',\r\n 'hotkeys.group': 'Group the selected drawings',\r\n 'hotkeys.ungroup': 'Ungroup the selected drawings',\r\n 'hotkeys.orderStep': 'Bring forward / send backward',\r\n 'hotkeys.orderEnd': 'Bring to front / send to back',\r\n 'hotkeys.finishPath': 'Finish a path or polyline',\r\n 'key.rightClick': 'Right-click',\r\n} as const;\r\n\r\nexport type MessageKey = keyof typeof EN_MESSAGES;\r\n\r\n/** A language's strings, one per key. */\r\nexport type WidgetMessages = Record<MessageKey, string>;\r\n","import type { WidgetMessages } from './en.js';\r\n\r\n/** Tiếng Việt. */\r\nexport const VI_MESSAGES: WidgetMessages = {\r\n 'toolbar.indicators': 'Chỉ báo',\r\n 'toolbar.indicators.popular': 'Phổ biến',\r\n 'toolbar.indicators.all': 'Tất cả',\r\n 'indicatorType.overlay': 'phủ lên',\r\n 'indicatorType.panel': 'bảng riêng',\r\n 'toolbar.replay': 'Phát lại',\r\n 'replay.selectHint': 'Bấm vào một nến để bắt đầu phát lại',\r\n 'replay.random': 'Nến ngẫu nhiên',\r\n 'replay.realtime': 'Về thời gian thực',\r\n 'replay.barsPerSecond': 'nến/giây',\r\n 'replay.play': 'Phát',\r\n 'replay.pause': 'Tạm dừng',\r\n 'replay.stepBack': 'Lùi một nến (Shift+←)',\r\n 'replay.stepForward': 'Tiến một nến (Shift+→)',\r\n 'toolbar.longBracket': 'Lệnh Long',\r\n 'toolbar.shortBracket': 'Lệnh Short',\r\n 'toolbar.depthLadder': 'Sổ lệnh',\r\n 'toolbar.objects': 'Đối tượng',\r\n 'toolbar.priceAlerts': 'Cảnh báo giá',\r\n 'toolbar.screenshot': 'Chụp màn hình',\r\n 'toolbar.settings': 'Cài đặt biểu đồ',\r\n 'toolbar.toggleTheme': 'Đổi giao diện',\r\n 'toolbar.timeframes': 'Khung thời gian',\r\n 'toolbar.timeframes.pin': 'Ghim lên thanh công cụ',\r\n 'toolbar.timeframes.custom': 'Khung tuỳ chỉnh, ví dụ 7m, 90m, 2h, 3D',\r\n 'toolbar.timeframes.add': 'Thêm khung',\r\n 'toolbar.timeframes.remove': 'Xoá khung',\r\n 'toolbar.timeframes.invalid': 'Nhập số và đơn vị: 7m, 2h, 3D, 1W, 2M',\r\n 'toolbar.fullscreen': 'Toàn màn hình',\r\n 'legend.show': 'Hiện',\r\n 'legend.hide': 'Ẩn',\r\n 'legend.settings': 'Cài đặt',\r\n 'legend.remove': 'Xoá',\r\n 'legend.collapse': 'Thu gọn chỉ báo',\r\n 'legend.expand': 'Hiện chỉ báo',\r\n 'indicatorSettings.title': 'Cài đặt {name}',\r\n 'indicatorSettings.tab.inputs': 'Thông số',\r\n 'indicatorSettings.tab.style': 'Kiểu',\r\n 'indicatorSettings.tab.levels': 'Mức',\r\n 'indicatorSettings.noInputs': 'Chỉ báo này không có thông số để chỉnh.',\r\n 'indicatorSettings.source.prices': 'Giá',\r\n 'indicatorSettings.source.indicators': 'Chỉ báo',\r\n 'indicatorSettings.lineWidth': 'Độ dày nét',\r\n 'indicatorSettings.scale': 'Thang giá',\r\n 'indicatorSettings.scale.right': 'Phải (thang giá)',\r\n 'indicatorSettings.scale.left': 'Trái (dải riêng)',\r\n 'indicatorSettings.up': 'tăng',\r\n 'indicatorSettings.down': 'giảm',\r\n 'indicatorSettings.addLevel': 'Thêm mức',\r\n 'indicatorSettings.removeLevel': 'Xoá mức',\r\n 'indicatorSettings.noLevels': 'Chưa có mức nào.',\r\n 'indicatorSettings.level': 'Mức',\r\n 'indicatorSettings.close': 'Đóng',\r\n 'toolbar.exitFullscreen': 'Thoát toàn màn hình',\r\n 'range.presets': 'Khoảng hiển thị',\r\n 'range.all': 'Tất cả',\r\n 'range.goTo': 'Đi tới ngày',\r\n 'range.goToSubmit': 'Đi tới',\r\n 'range.date': 'Ngày',\r\n 'range.time': 'Giờ',\r\n 'range.cancel': 'Huỷ',\r\n 'range.beforeData': 'Đang hiện nến sớm nhất đã tải',\r\n\r\n 'chartType.candlestick': 'Nến',\r\n 'chartType.line': 'Đường',\r\n 'chartType.area': 'Vùng',\r\n 'chartType.bar': 'Thanh',\r\n 'chartType.heikinAshi': 'Heikin-Ashi',\r\n 'chartType.hollowCandle': 'Nến rỗng',\r\n 'chartType.baseline': 'Đường cơ sở',\r\n 'chartType.volumeCandles': 'Nến khối lượng',\r\n 'chartType.equivolume': 'Equivolume',\r\n 'chartType.hlcArea': 'Vùng HLC',\r\n 'chartType.stepLine': 'Đường bậc thang',\r\n 'chartType.lineWithMarkers': 'Đường + điểm đánh dấu',\r\n 'chartType.hiLo': 'Cao-Thấp',\r\n 'chartType.renko': 'Renko',\r\n 'chartType.lineBreak': 'Line Break',\r\n 'chartType.kagi': 'Kagi',\r\n 'chartType.pointAndFigure': 'Point & Figure',\r\n 'chartType.rangeBars': 'Nến theo biên độ',\r\n\r\n 'watchlist.title': 'Danh mục theo dõi',\r\n 'watchlist.lists': 'Danh sách',\r\n 'watchlist.newList': 'Danh sách mới…',\r\n 'watchlist.rename': 'Đổi tên danh sách…',\r\n 'watchlist.deleteList': 'Xoá danh sách',\r\n 'watchlist.confirmDelete': 'Xoá “{name}”? Bấm lần nữa',\r\n 'watchlist.add': 'Thêm mã',\r\n 'watchlist.remove': 'Bỏ {symbol}',\r\n 'watchlist.empty': 'Chưa có mã nào. Thêm bằng nút +.',\r\n 'watchlist.listName': 'Tên danh sách',\r\n\r\n // Symbol info\r\n 'symbolInfo.title': 'Thông tin mã',\r\n 'symbolInfo.open': 'Thị trường mở cửa',\r\n 'symbolInfo.closed': 'Thị trường đóng cửa',\r\n 'symbolInfo.always': 'Giao dịch suốt ngày đêm',\r\n 'symbolInfo.closesIn': 'đóng cửa {when}',\r\n 'symbolInfo.opensIn': 'mở cửa {when}',\r\n 'symbolInfo.prevClose': 'Đóng cửa phiên trước',\r\n 'symbolInfo.bid': 'Giá mua',\r\n 'symbolInfo.ask': 'Giá bán',\r\n 'symbolInfo.tick': 'Bước giá',\r\n 'symbolInfo.currency': 'Tiền tệ',\r\n 'symbolInfo.timezone': 'Múi giờ',\r\n 'symbolInfo.hours': 'Giờ giao dịch',\r\n 'symbolInfo.news': 'Tin tức',\r\n 'symbolInfo.noNews': 'Chưa có tin về mã này.',\r\n 'symbolInfo.newsFailed': 'Không tải được tin tức.',\r\n 'symbolInfo.loading': 'Đang tải…',\r\n 'action.symbolInfo': 'Thông tin mã',\r\n\r\n // Navigation over the chart\r\n 'nav.label': 'Điều hướng biểu đồ',\r\n 'nav.zoomIn': 'Phóng to',\r\n 'nav.zoomOut': 'Thu nhỏ',\r\n 'nav.scrollLeft': 'Cuộn sang trái',\r\n 'nav.scrollRight': 'Cuộn sang phải',\r\n 'nav.reset': 'Đặt lại khung nhìn',\r\n\r\n // Screen readers\r\n 'a11y.role': 'biểu đồ',\r\n 'a11y.summary': '{what}. Giá cuối {close}.',\r\n 'a11y.empty': 'Biểu đồ, chưa có dữ liệu.',\r\n 'a11y.view': 'Đang hiện {count} nến, từ {from} đến {to}. Cao nhất {high}, thấp nhất {low}.',\r\n 'a11y.bar': '{time}: mở {open}, cao {high}, thấp {low}, đóng {close}, khối lượng {volume}.',\r\n 'a11y.keys': 'Phím mũi tên để cuộn và phóng to thu nhỏ, Home và End để về đầu và cuối. Dấu phẩy và dấu chấm đọc từng nến một.',\r\n\r\n 'status.connecting': 'Đang kết nối...',\r\n 'status.live': 'Trực tiếp',\r\n 'status.connectionFailed': 'Kết nối thất bại',\r\n 'status.loading': 'Đang tải biểu đồ...',\r\n 'history.loading': 'Đang tải dữ liệu cũ…',\r\n 'history.failed': 'Không tải được dữ liệu cũ',\r\n\r\n 'settings.title': 'Cài đặt biểu đồ',\r\n 'settings.tab.style': 'Giao diện',\r\n 'settings.tab.display': 'Hiển thị',\r\n 'settings.tab.scale': 'Thang giá',\r\n 'settings.resetToDefaults': 'Khôi phục mặc định',\r\n 'settings.done': 'Xong',\r\n 'settings.section.candleColors': 'Màu nến',\r\n 'settings.section.background': 'Nền',\r\n\r\n 'hotkeys.title': 'Phím tắt',\r\n 'hotkeys.footer': 'Nhấn ? bất cứ lúc nào để mở bảng này',\r\n 'hotkeys.close': 'Đóng',\r\n 'hotkeys.gotIt': 'Đã hiểu',\r\n 'hotkeys.group.searchNavigation': 'Tìm kiếm & điều hướng',\r\n 'hotkeys.group.chartManipulation': 'Thao tác biểu đồ',\r\n 'hotkeys.group.touch': 'Cảm ứng (di động / máy tính bảng)',\r\n 'hotkeys.group.keyboard': 'Bàn phím',\r\n 'hotkeys.group.drawing': 'Vẽ',\r\n\r\n 'common.close': 'Đóng',\r\n 'common.cancel': 'Huỷ',\r\n 'common.save': 'Lưu',\r\n 'common.show': 'Hiện',\r\n 'common.hide': 'Ẩn',\r\n 'common.lock': 'Khoá',\r\n 'common.unlock': 'Mở khoá',\r\n 'common.navigate': 'Di chuyển',\r\n 'common.open': 'Mở',\r\n 'common.select': 'Chọn',\r\n\r\n 'settings.upBody': 'Thân nến tăng',\r\n 'settings.downBody': 'Thân nến giảm',\r\n 'settings.upWick': 'Râu nến tăng',\r\n 'settings.downWick': 'Râu nến giảm',\r\n 'settings.background': 'Nền',\r\n 'settings.grid': 'Lưới',\r\n 'settings.gridLines': 'Đường lưới',\r\n 'settings.volume': 'Khối lượng',\r\n 'settings.volumeProfile': 'Hồ sơ khối lượng',\r\n 'settings.marketProfile': 'Hồ sơ thị trường (TPO)',\r\n 'settings.marketProfileSplit': 'Hồ sơ thị trường theo phiên',\r\n 'settings.marketProfileLetters': 'Chữ cái hồ sơ thị trường',\r\n 'settings.marketProfileBuckets': 'Số hàng hồ sơ thị trường',\r\n 'settings.marketProfileOpacity': 'Độ mờ hồ sơ thị trường',\r\n 'settings.depthHeatmap': 'Bản đồ nhiệt thanh khoản',\r\n 'settings.depthHeatmapOpacity': 'Độ mờ bản đồ nhiệt',\r\n 'settings.swingMarkers': 'Điểm đảo chiều',\r\n 'settings.swingStrength': 'Độ mạnh điểm đảo chiều',\r\n 'settings.swingStructure': 'Cấu trúc đỉnh đáy (HH/HL)',\r\n 'settings.sessionShading': 'Tô màu phiên',\r\n 'settings.periodLevels': 'Mức của kỳ trước',\r\n 'settings.periodLevelsBasis': 'Kỳ trước',\r\n 'settings.priorDay': 'Ngày trước (PDH/PDL)',\r\n 'settings.priorWeek': 'Tuần trước (PWH/PWL)',\r\n 'settings.ohlcLegend': 'Chú thích OHLC',\r\n 'settings.indicatorValues': 'Giá trị chỉ báo trên trục',\r\n 'settings.barCountdown': 'Đếm ngược nến',\r\n 'settings.crosshairMode': 'Con trỏ chữ thập',\r\n 'settings.crosshair.magnet': 'Hút vào giá',\r\n 'settings.crosshair.normal': 'Thường',\r\n 'settings.crosshair.hidden': 'Ẩn',\r\n 'settings.timezone': 'Múi giờ',\r\n 'settings.timezone.local': 'Giờ máy',\r\n 'settings.timezone.exchange': 'Theo sàn',\r\n 'settings.numberLocale': 'Định dạng số',\r\n 'settings.autoScale': 'Tự co giãn thang',\r\n 'settings.invertScale': 'Đảo ngược thang (Alt+I)',\r\n 'settings.leftScale': 'Thang giá bên trái',\r\n 'settings.priceScale': 'Thang giá',\r\n 'settings.mainSeries': 'Chuỗi giá chính',\r\n 'settings.highLowLines': 'Đường cao nhất và thấp nhất',\r\n 'settings.extendedHours': 'Giờ giao dịch mở rộng',\r\n 'settings.boxSize': 'Kích thước ô',\r\n 'settings.atrPeriod': 'Độ dài ATR',\r\n 'settings.lineBreakLines': 'Số đường cần phá',\r\n 'settings.reversal': 'Mức đảo chiều',\r\n 'settings.reversalType': 'Đảo chiều theo',\r\n 'settings.reversalType.percent': 'Phần trăm',\r\n 'settings.reversalType.price': 'Giá',\r\n 'settings.reversalBoxes': 'Số ô đảo chiều',\r\n 'settings.barRange': 'Biên độ',\r\n 'settings.auto': 'Tự động',\r\n 'settings.scale.regular': 'Thường',\r\n 'settings.scale.logarithmic': 'Logarit',\r\n 'settings.scale.percentage': 'Phần trăm',\r\n 'settings.scale.indexedTo100': 'Quy về 100',\r\n\r\n 'alerts.title': 'Cảnh báo giá',\r\n 'alerts.close': 'Đóng cảnh báo',\r\n 'alerts.value': 'Giá trị',\r\n 'alerts.note': 'Ghi chú (không bắt buộc)',\r\n 'alerts.add': 'Thêm cảnh báo',\r\n 'alerts.empty': 'Chưa có cảnh báo nào. Thêm ở trên, hoặc bấm chuột phải vào biểu đồ.',\r\n 'alerts.delete': 'Xoá cảnh báo',\r\n 'alerts.triggered': 'đã kích hoạt',\r\n 'alerts.source.price': 'Giá',\r\n 'alerts.condition.crossing': 'Cắt qua',\r\n 'alerts.condition.crossingUp': 'Cắt lên',\r\n 'alerts.condition.crossingDown': 'Cắt xuống',\r\n 'alerts.condition.greaterThan': 'Lớn hơn',\r\n 'alerts.condition.lessThan': 'Nhỏ hơn',\r\n 'alerts.fired': 'Cảnh báo: {text}',\r\n\r\n 'objects.title': 'Đối tượng',\r\n 'objects.close': 'Đóng danh sách đối tượng',\r\n 'objects.indicators': 'Chỉ báo',\r\n 'objects.drawings': 'Hình vẽ',\r\n 'objects.compare': 'So sánh',\r\n 'objects.addCompare': 'Thêm mã để so sánh',\r\n 'objects.noIndicators': 'Chưa có chỉ báo',\r\n 'objects.noDrawings': 'Chưa có hình vẽ',\r\n 'objects.noComparisons': 'Chưa so sánh mã nào',\r\n 'objects.indicatorSettings': 'Cài đặt chỉ báo',\r\n 'objects.removeIndicator': 'Xoá chỉ báo',\r\n 'objects.removeDrawing': 'Xoá hình vẽ',\r\n 'objects.removeComparison': 'Bỏ so sánh',\r\n\r\n 'drawing.cursor': 'Con trỏ',\r\n 'drawing.style': 'Kiểu vẽ & mẫu',\r\n 'drawing.magnet': 'Hút vào giá',\r\n 'drawing.magnetOn': 'Đang hút vào giá',\r\n 'drawing.magnetOff': 'Tắt hút vào giá',\r\n 'drawing.eraser': 'Tẩy: nhấp vào hình vẽ để xoá',\r\n 'drawing.zoomArea': 'Phóng to: kéo một khung để phóng to vùng đó',\r\n 'drawing.magnetStrong': 'Nam châm: mạnh (luôn bắt điểm)',\r\n 'drawing.stay': 'Giữ công cụ vẽ',\r\n 'drawing.undo': 'Hoàn tác',\r\n 'drawing.redo': 'Làm lại',\r\n 'drawing.clearAll': 'Xoá tất cả',\r\n 'drawing.pinHint': 'Bấm chuột phải vào công cụ để ghim',\r\n 'drawingStyle.title': 'Kiểu vẽ',\r\n 'drawingStyle.templates': 'Mẫu',\r\n 'drawingStyle.templateName': 'Tên mẫu',\r\n 'drawingStyle.noTemplates': 'Chưa lưu mẫu nào',\r\n 'drawingStyle.deleteTemplate': 'Xoá mẫu',\r\n 'drawingSettings.tab.style': 'Kiểu',\r\n 'drawingSettings.tab.options': 'Thuộc tính',\r\n 'drawingSettings.tab.coordinates': 'Toạ độ',\r\n 'drawingSettings.ok': 'OK',\r\n 'drawingSettings.color': 'Màu',\r\n 'drawingSettings.lineWidth': 'Độ dày nét',\r\n 'drawingSettings.lineStyle': 'Kiểu nét',\r\n 'drawingSettings.lineStyle.solid': 'Liền',\r\n 'drawingSettings.lineStyle.dashed': 'Gạch',\r\n 'drawingSettings.lineStyle.dotted': 'Chấm',\r\n 'drawingSettings.fill': 'Màu nền',\r\n 'drawingSettings.opacity': 'Độ đậm (%)',\r\n 'drawingSettings.text': 'Chữ',\r\n 'drawingSettings.fontSize': 'Cỡ chữ',\r\n 'drawingSettings.saveDefault': 'Lưu làm mặc định',\r\n 'drawingSettings.defaultSaved': 'Đã lưu làm mặc định cho {name}',\r\n 'drawingSettings.levelVisible': 'Hiện mức này',\r\n 'drawingSettings.levelValue': 'Mức',\r\n 'drawingSettings.levelColor': 'Màu của mức',\r\n 'drawingSettings.removeLevel': 'Xoá mức',\r\n 'drawingSettings.addLevel': 'Thêm mức',\r\n 'drawingSettings.point': 'Điểm {n}',\r\n 'drawingSettings.date': 'Ngày',\r\n 'drawingSettings.time': 'Giờ',\r\n 'drawingSettings.price': 'Giá',\r\n 'drawingOption.extendLeft': 'Kéo dài sang trái',\r\n 'drawingOption.extendRight': 'Kéo dài sang phải',\r\n 'drawingOption.middleLine': 'Đường giữa',\r\n 'drawingOption.levels': 'Các mức',\r\n 'drawingOption.reverse': 'Đảo chiều',\r\n 'drawingOption.showLevels': 'Hiện mức',\r\n 'drawingOption.showPrices': 'Hiện giá',\r\n 'drawingOption.labelPosition': 'Vị trí nhãn',\r\n 'drawingOption.labelPosition.left': 'Trái',\r\n 'drawingOption.labelPosition.right': 'Phải',\r\n 'drawingOption.background': 'Tô nền',\r\n 'objects.drawingSettings': 'Cài đặt hình vẽ',\r\n 'objects.renameGroup': 'Đổi tên nhóm',\r\n 'drawingMenu.label': 'Hình vẽ',\r\n 'drawingMenu.settings': 'Cài đặt…',\r\n 'drawingMenu.front': 'Đưa lên trên cùng',\r\n 'drawingMenu.forward': 'Đưa lên một lớp',\r\n 'drawingMenu.backward': 'Đưa xuống một lớp',\r\n 'drawingMenu.back': 'Đưa xuống dưới cùng',\r\n 'drawingMenu.group': 'Nhóm lại',\r\n 'drawingMenu.ungroup': 'Bỏ nhóm',\r\n 'drawingMenu.duplicate': 'Nhân bản',\r\n 'drawingMenu.delete': 'Xoá',\r\n 'chartMenu.label': 'Biểu đồ',\r\n 'chartMenu.addAlert': 'Thêm cảnh báo tại {price}',\r\n 'chartMenu.alertAdded': 'Đã thêm cảnh báo tại {price}',\r\n 'chartMenu.buyLimit': 'Mua giới hạn tại {price}',\r\n 'chartMenu.buyStop': 'Mua dừng tại {price}',\r\n 'chartMenu.sellLimit': 'Bán giới hạn tại {price}',\r\n 'chartMenu.sellStop': 'Bán dừng tại {price}',\r\n 'chartMenu.horizontalLine': 'Đường ngang tại {price}',\r\n 'chartMenu.resetView': 'Đặt lại khung nhìn',\r\n 'chartMenu.resetTimeScale': 'Đặt lại trục thời gian',\r\n 'chartMenu.hideDrawings': 'Ẩn hình vẽ',\r\n 'chartMenu.showDrawings': 'Hiện hình vẽ',\r\n 'chartMenu.removeDrawings': 'Xoá hình vẽ',\r\n 'chartMenu.settings': 'Cài đặt…',\r\n 'chartMenu.invertScale': 'Đảo ngược thang',\r\n 'chartMenu.goToDate': 'Đi tới ngày…',\r\n 'toolbar.account': 'Tài khoản: vị thế, lệnh, lịch sử',\r\n 'chartMenu.orderTicket': 'Lệnh mới…',\r\n 'account.title': 'Tài khoản',\r\n 'account.positions': 'Vị thế',\r\n 'account.orders': 'Lệnh',\r\n 'account.history': 'Lịch sử',\r\n 'account.newOrder': 'Lệnh mới',\r\n 'account.close': 'Đóng bảng tài khoản',\r\n 'account.side': 'Chiều',\r\n 'account.long': 'Mua',\r\n 'account.short': 'Bán',\r\n 'account.quantity': 'KL',\r\n 'account.entry': 'Giá vào',\r\n 'account.price': 'Giá',\r\n 'account.pnl': 'Lãi/lỗ',\r\n 'account.stopLoss': 'SL',\r\n 'account.takeProfit': 'TP',\r\n 'account.actions': 'Thao tác',\r\n 'account.time': 'Thời gian',\r\n 'account.reason': 'Lý do',\r\n 'account.reason.order': 'Lệnh',\r\n 'account.reason.close': 'Đóng',\r\n 'account.reason.reverse': 'Đảo chiều',\r\n 'account.reason.stopLoss': 'Cắt lỗ',\r\n 'account.reason.takeProfit': 'Chốt lời',\r\n 'account.reverse': 'Đảo chiều vị thế',\r\n 'account.closePosition': 'Đóng vị thế',\r\n 'account.cancelOrder': 'Huỷ lệnh',\r\n 'account.noPositions': 'Không có vị thế mở',\r\n 'account.noOrders': 'Không có lệnh chờ',\r\n 'account.noFills': 'Chưa có giao dịch',\r\n 'account.realised': 'Lãi/lỗ đã chốt: {pnl}',\r\n 'ticket.title': 'Lệnh mới',\r\n 'ticket.buy': 'Mua',\r\n 'ticket.sell': 'Bán',\r\n 'ticket.type': 'Loại lệnh',\r\n 'ticket.type.market': 'Thị trường',\r\n 'ticket.type.limit': 'Giới hạn',\r\n 'ticket.type.stop': 'Dừng',\r\n 'ticket.quantity': 'Khối lượng',\r\n 'ticket.price': 'Giá',\r\n 'ticket.stopLoss': 'Cắt lỗ',\r\n 'ticket.takeProfit': 'Chốt lời',\r\n 'ticket.timeInForce': 'Hiệu lực',\r\n 'ticket.tif.gtc': 'Đến khi huỷ',\r\n 'ticket.tif.day': 'Trong ngày',\r\n 'ticket.riskReward': 'Tỷ lệ lời:lỗ {rr}',\r\n 'ticket.placeBuy': 'Đặt lệnh mua',\r\n 'ticket.placeSell': 'Đặt lệnh bán',\r\n 'ticket.sent': 'Đã gửi lệnh: {side} {quantity} @ {price}',\r\n 'ticket.problem.quantity': 'Nhập khối lượng lớn hơn 0.',\r\n 'ticket.problem.price': 'Nhập giá lớn hơn 0.',\r\n 'ticket.problem.market': 'Chưa có giá thị trường.',\r\n 'ticket.problem.stopLoss': 'Nhập giá cắt lỗ lớn hơn 0.',\r\n 'ticket.problem.takeProfit': 'Nhập giá chốt lời lớn hơn 0.',\r\n 'ticket.problem.stopLossSide': 'Cắt lỗ phải dưới giá vào với lệnh mua, trên giá vào với lệnh bán.',\r\n 'ticket.problem.takeProfitSide': 'Chốt lời phải trên giá vào với lệnh mua, dưới giá vào với lệnh bán.',\r\n 'ticket.problem.limitSide': 'Lệnh mua giới hạn đặt dưới giá thị trường, lệnh bán giới hạn đặt trên.',\r\n 'ticket.problem.stopSide': 'Lệnh mua dừng đặt trên giá thị trường, lệnh bán dừng đặt dưới.',\r\n 'toolbar.layouts': 'Bố cục',\r\n 'layouts.unnamed': 'Chưa đặt tên',\r\n 'layouts.unsavedChanges': 'có thay đổi chưa lưu',\r\n 'layouts.save': 'Lưu bố cục',\r\n 'layouts.saveAs': 'Lưu thành…',\r\n 'layouts.rename': 'Đổi tên…',\r\n 'layouts.autoSave': 'Tự động lưu',\r\n 'layouts.open': 'Mở bố cục…',\r\n 'layouts.saved': 'Đã lưu bố cục: {name}',\r\n 'layouts.saveFailed': 'Không lưu được bố cục',\r\n 'layouts.openFailed': 'Không mở được bố cục',\r\n 'layouts.deleteFailed': 'Không xoá được bố cục',\r\n 'layouts.saveAsTitle': 'Lưu bố cục thành',\r\n 'layouts.renameTitle': 'Đổi tên bố cục',\r\n 'layouts.renameSubmit': 'Đổi tên',\r\n 'layouts.copyName': '{name} (bản sao)',\r\n 'layouts.name': 'Tên',\r\n 'layouts.namePlaceholder': 'Bố cục của tôi',\r\n 'layouts.dialogTitle': 'Các bố cục',\r\n 'layouts.search': 'Tìm bố cục',\r\n 'layouts.empty': 'Chưa có bố cục nào được lưu',\r\n 'layouts.noMatch': 'Không có bố cục nào khớp',\r\n 'layouts.current': 'Đang mở',\r\n 'layouts.updated': 'lưu lúc {time}',\r\n 'layouts.renameNamed': 'Đổi tên {name}',\r\n 'layouts.deleteNamed': 'Xoá {name}',\r\n 'layouts.deleteConfirm': 'Xoá',\r\n 'grid.bar': 'Các biểu đồ',\r\n 'grid.layout': 'Cách chia biểu đồ',\r\n 'grid.single': 'Một biểu đồ',\r\n 'grid.layoutOption': '{count} biểu đồ, {cols} cột và {rows} hàng',\r\n 'grid.chart': 'Biểu đồ {n}',\r\n 'grid.sync': 'Đồng bộ',\r\n 'grid.sync.symbol': 'Mã',\r\n 'grid.sync.interval': 'Khung',\r\n 'grid.sync.crosshair': 'Con trỏ',\r\n 'grid.sync.time': 'Thời gian',\r\n 'grid.sync.drawings': 'Hình vẽ',\r\n 'grid.sync.replay': 'Phát lại',\r\n 'grid.sync.symbol.hint': 'Đổi mã trên mọi biểu đồ cùng lúc',\r\n 'grid.sync.interval.hint': 'Đổi khung thời gian trên mọi biểu đồ cùng lúc',\r\n 'grid.sync.crosshair.hint': 'Hiện thời điểm của con trỏ trên mọi biểu đồ',\r\n 'grid.sync.time.hint': 'Cuộn và phóng mọi biểu đồ tới cùng khoảng thời gian',\r\n 'grid.sync.drawings.hint': 'Chép hình vẽ sang các biểu đồ cùng mã',\r\n 'grid.sync.replay.hint': 'Phát lại mọi biểu đồ đến cùng một thời điểm',\r\n 'legend.more': 'Thêm',\r\n 'legend.moveUp': 'Chuyển lên pane trên',\r\n 'legend.moveDown': 'Chuyển xuống pane dưới',\r\n 'legend.moveNew': 'Chuyển sang pane mới',\r\n 'legend.movePrice': 'Chuyển về pane giá',\r\n 'pane.moveUp': 'Đưa pane lên',\r\n 'pane.moveDown': 'Đưa pane xuống',\r\n 'pane.collapse': 'Thu gọn pane',\r\n 'pane.expand': 'Mở rộng pane',\r\n 'pane.maximize': 'Phóng to pane',\r\n 'pane.restore': 'Trả lại các pane',\r\n 'toolbar.indicators.templates': 'Mẫu',\r\n 'templates.save': 'Lưu indicator thành mẫu…',\r\n 'templates.saveTitle': 'Lưu mẫu indicator',\r\n 'templates.namePlaceholder': 'Bộ indicator của tôi',\r\n 'templates.saved': 'Đã lưu mẫu: {name}',\r\n 'templates.applied': 'Đã áp dụng mẫu: {name}',\r\n 'templates.delete': 'Xoá mẫu {name}',\r\n 'templates.nothing': 'Chưa có indicator nào để lưu',\r\n 'templates.saveFailed': 'Không lưu được mẫu',\r\n 'interval.title': 'Đổi khung thời gian',\r\n 'interval.hint': '5, 15m, 1h, 1D — Enter để áp dụng',\r\n 'interval.invalid': 'Không phải khung thời gian biểu đồ này hiển thị được',\r\n 'alerts.condition.movesUp': 'Tăng',\r\n 'alerts.condition.movesDown': 'Giảm',\r\n 'alerts.source': 'Theo dõi',\r\n 'alerts.conditionLabel': 'Điều kiện',\r\n 'alerts.compareWith': 'So với',\r\n 'alerts.compare.value': 'Một giá trị',\r\n 'alerts.percent': 'Phần trăm',\r\n 'alerts.bars': 'Số nến',\r\n 'alerts.moveSummary': '{percent}% trong {bars} nến',\r\n 'alerts.onBarClose': 'Chỉ khi đóng nến',\r\n 'alerts.onClose': 'khi đóng nến',\r\n 'alerts.expires': 'Hết hạn',\r\n 'alerts.expires.never': 'Không hết hạn',\r\n 'alerts.expires.hour': 'Hết hạn sau 1 giờ',\r\n 'alerts.expires.day': 'Hết hạn sau 1 ngày',\r\n 'alerts.expires.week': 'Hết hạn sau 1 tuần',\r\n 'alerts.expires.month': 'Hết hạn sau 30 ngày',\r\n 'alerts.until': 'đến {time}',\r\n 'alerts.expired': 'Đã hết hạn',\r\n 'alerts.expiredToast': 'Cảnh báo đã hết hạn: {text}',\r\n 'alerts.invalid': 'Các thiết lập cảnh báo này không dùng chung được',\r\n 'replay.step': 'Bước',\r\n 'replay.step.bar': 'Nến',\r\n 'replay.stepsFailed': 'Không tải được nến khung nhỏ: replay theo từng nến',\r\n 'markers.neutral': 'Trung lập',\r\n 'markers.confidence': 'độ tin cậy {pct}%',\r\n 'chartMenu.paneLog': 'Thang logarit',\r\n 'chartMenu.paneInvert': 'Đảo ngược thang',\r\n 'chartMenu.panePercent': 'Thang phần trăm',\r\n 'chartMenu.exportData': 'Xuất dữ liệu (CSV)',\r\n 'compare.percent': 'Thay đổi phần trăm, trên thang này',\r\n 'compare.ownScale': 'Giá, trên thang riêng',\r\n 'compare.ownPane': 'Giá, trong pane riêng',\r\n 'compare.spread': 'Chênh lệch: {main} − {other}',\r\n 'compare.ratio': 'Tỷ lệ: {main} ÷ {other}',\r\n 'drawingSettings.addAlert': 'Thêm cảnh báo',\r\n 'drawingSettings.alertAdded': 'Đã thêm cảnh báo: giá cắt {name}',\r\n 'drawingOption.rewardRatio': 'Tỷ lệ lời:lỗ',\r\n 'drawingOption.accountSize': 'Vốn tài khoản',\r\n 'drawingOption.riskMode': 'Tính rủi ro theo',\r\n 'drawingOption.riskMode.percent': 'Phần trăm vốn',\r\n 'drawingOption.riskMode.amount': 'Số tiền',\r\n 'drawingOption.risk': 'Rủi ro',\r\n 'drawingOption.qtyDecimals': 'Số lẻ của khối lượng',\r\n 'drawingOption.showLabels': 'Hiện nhãn',\r\n 'drawingOption.showText': 'Hiện chữ',\r\n 'drawingOption.direction': 'Hướng',\r\n 'drawingOption.direction.up': 'Lên',\r\n 'drawingOption.direction.down': 'Xuống',\r\n 'drawingOption.direction.left': 'Trái',\r\n 'drawingOption.direction.right': 'Phải',\r\n 'drawingOption.size': 'Kích thước',\r\n 'drawingOption.glyph': 'Biểu tượng',\r\n 'drawingOption.glyph.star': 'Ngôi sao',\r\n 'drawingOption.glyph.heart': 'Trái tim',\r\n 'drawingOption.glyph.check': 'Dấu tích',\r\n 'drawingOption.glyph.cross': 'Dấu chéo',\r\n 'drawingOption.glyph.circle': 'Hình tròn',\r\n 'drawingOption.glyph.triangleUp': 'Tam giác lên',\r\n 'drawingOption.glyph.triangleDown': 'Tam giác xuống',\r\n 'drawingOption.glyph.bolt': 'Tia sét',\r\n 'drawingOption.arrowEnd': 'Mũi tên ở cuối',\r\n 'drawingOption.fullCircles': 'Vẽ cả vòng tròn',\r\n 'drawingOption.clockwise': 'Theo chiều kim đồng hồ',\r\n 'drawingOption.arcs': 'Cung',\r\n 'drawingOption.degree': 'Cấp sóng',\r\n 'drawingOption.degree.primary': 'Primary',\r\n 'drawingOption.degree.intermediate': 'Intermediate',\r\n 'drawingOption.degree.minor': 'Minor',\r\n 'drawingOption.degree.minute': 'Minute',\r\n 'drawingOption.mode': 'Hiển thị dạng',\r\n 'drawingOption.mode.bars': 'Nến',\r\n 'drawingOption.mode.line': 'Đường',\r\n 'drawingOption.mode.highLow': 'Cao-thấp',\r\n 'drawingOption.mirrored': 'Đảo chiều thời gian',\r\n 'drawingOption.flipped': 'Lật ngược',\r\n\r\n 'toolGroup.lines': 'Đường',\r\n 'toolGroup.horizontalVertical': 'Ngang/Dọc',\r\n 'toolGroup.channels': 'Kênh',\r\n 'toolGroup.fibonacci': 'Fibonacci',\r\n 'toolGroup.shapes': 'Hình',\r\n 'toolGroup.gannPitchforks': 'Gann & Pitchfork',\r\n 'toolGroup.patterns': 'Mô hình',\r\n 'toolGroup.measure': 'Đo',\r\n 'toolGroup.annotation': 'Chú thích',\r\n 'toolGroup.forecasting': 'Dự báo',\r\n 'toolGroup.brushes': 'Bút vẽ',\r\n 'toolGroup.cycles': 'Chu kỳ',\r\n 'toolGroup.elliott': 'Sóng Elliott',\r\n\r\n 'tool.trendLine': 'Đường xu hướng',\r\n 'tool.ray': 'Tia',\r\n 'tool.extendedLine': 'Đường kéo dài',\r\n 'tool.infoLine': 'Đường thông tin',\r\n 'tool.trendAngle': 'Góc xu hướng',\r\n 'tool.horizontalLine': 'Đường ngang',\r\n 'tool.horizontalRay': 'Tia ngang',\r\n 'tool.verticalLine': 'Đường dọc',\r\n 'tool.crossLine': 'Đường chữ thập',\r\n 'tool.parallelChannel': 'Kênh song song',\r\n 'tool.regressionChannel': 'Kênh hồi quy',\r\n 'tool.fibRetracement': 'Fibonacci thoái lui',\r\n 'tool.fibExtension': 'Fibonacci mở rộng',\r\n 'tool.fibChannel': 'Kênh Fibonacci',\r\n 'tool.fibTimeZones': 'Vùng thời gian Fibonacci',\r\n 'tool.fibSpeedResistanceFan': 'Quạt tốc độ Fibonacci',\r\n 'tool.rectangle': 'Hình chữ nhật',\r\n 'tool.circle': 'Hình tròn',\r\n 'tool.ellipse': 'Hình elip',\r\n 'tool.triangle': 'Tam giác',\r\n 'tool.pitchfork': 'Pitchfork',\r\n 'tool.schiffPitchfork': 'Pitchfork Schiff',\r\n 'tool.modifiedSchiffPitchfork': 'Pitchfork Schiff cải tiến',\r\n 'tool.gannFan': 'Quạt Gann',\r\n 'tool.gannBox': 'Hộp Gann',\r\n 'tool.cyclicLines': 'Đường chu kỳ',\r\n 'tool.xabcdPattern': 'Mô hình XABCD',\r\n 'tool.abcdPattern': 'Mô hình ABCD',\r\n 'tool.headAndShoulders': 'Vai đầu vai',\r\n 'tool.elliottWave': 'Sóng Elliott',\r\n 'tool.priceRange': 'Khoảng giá',\r\n 'tool.dateRange': 'Khoảng thời gian',\r\n 'tool.dateAndPriceRange': 'Khoảng giá và thời gian',\r\n 'tool.measure': 'Đo',\r\n 'tool.text': 'Chữ',\r\n 'tool.priceLabel': 'Nhãn giá',\r\n 'tool.arrow': 'Mũi tên',\r\n 'tool.riskReward': 'Vị thế Long/Short',\r\n 'tool.anchoredVWAP': 'VWAP neo',\r\n 'tool.volumeProfileRange': 'Hồ sơ khối lượng theo khoảng',\r\n 'tool.note': 'Ghi chú',\r\n 'tool.callout': 'Chú thích',\r\n 'tool.flag': 'Cờ đánh dấu',\r\n 'tool.arrowMark': 'Mũi tên đánh dấu',\r\n 'tool.icon': 'Biểu tượng',\r\n 'tool.brush': 'Bút vẽ',\r\n 'tool.highlighter': 'Bút dạ quang',\r\n 'tool.path': 'Đường nhiều điểm',\r\n 'tool.polyline': 'Đa giác',\r\n 'tool.curve': 'Đường cong',\r\n 'tool.arc': 'Cung tròn',\r\n 'tool.fibCircles': 'Vòng tròn Fib',\r\n 'tool.fibSpiral': 'Xoắn ốc Fib',\r\n 'tool.fibArcs': 'Cung kháng cự tốc độ Fib',\r\n 'tool.fibWedge': 'Nêm Fib',\r\n 'tool.pitchfan': 'Quạt Pitchfork',\r\n 'tool.gannSquare': 'Hình vuông Gann',\r\n 'tool.elliottImpulse': 'Sóng đẩy Elliott',\r\n 'tool.elliottCorrection': 'Sóng điều chỉnh Elliott',\r\n 'tool.elliottTriangle': 'Sóng tam giác Elliott',\r\n 'tool.elliottDoubleCombo': 'Sóng kết hợp kép Elliott',\r\n 'tool.elliottTripleCombo': 'Sóng kết hợp ba Elliott',\r\n 'tool.threeDrives': 'Mô hình ba nhịp',\r\n 'tool.cypherPattern': 'Mô hình Cypher',\r\n 'tool.timeCycles': 'Chu kỳ thời gian',\r\n 'tool.sineLine': 'Đường hình sin',\r\n 'tool.forecast': 'Dự báo',\r\n 'tool.projection': 'Phóng chiếu',\r\n 'tool.barsPattern': 'Mẫu nến',\r\n\r\n 'replay.label': 'Phát lại',\r\n 'replay.position': 'Vị trí phát lại',\r\n 'replay.speed': 'Tốc độ',\r\n\r\n 'symbolSearch.placeholder': 'Tìm mã… (ví dụ BTC, ETH, AAPL)',\r\n 'symbolSearch.empty': 'Không có mã nào khớp',\r\n 'symbolSearch.searching': 'Đang tìm…',\r\n 'symbolSearch.failed': 'Không tìm được',\r\n 'palette.placeholder': 'Tìm chỉ báo, loại biểu đồ, công cụ…',\r\n 'palette.empty': 'Không tìm thấy kết quả',\r\n 'palette.group.indicator': 'Chỉ báo',\r\n 'palette.group.chartType': 'Loại biểu đồ',\r\n 'palette.group.drawing': 'Công cụ vẽ',\r\n 'palette.group.timeframe': 'Khung thời gian',\r\n 'palette.group.action': 'Thao tác',\r\n 'action.screenshot': 'Chụp màn hình',\r\n 'action.copyImage': 'Sao chép ảnh biểu đồ',\r\n 'action.toggleTheme': 'Đổi giao diện',\r\n 'action.settings': 'Cài đặt',\r\n 'action.shareView': 'Chia sẻ góc nhìn (sao chép liên kết)',\r\n 'action.autoFib': 'Fibonacci tự động (sóng đang hiện)',\r\n 'action.dataWindow': 'Bật/tắt cửa sổ dữ liệu',\r\n 'action.clearDrawings': 'Xoá mọi hình vẽ',\r\n\r\n 'ladder.title': 'Sổ lệnh',\r\n 'ladder.bid': 'Mua',\r\n 'ladder.price': 'Giá',\r\n 'ladder.ask': 'Bán',\r\n 'ladder.empty': 'Chưa có dữ liệu sổ lệnh',\r\n 'ladder.sellAt': 'Bán @ {price}',\r\n 'ladder.buyAt': 'Mua @ {price}',\r\n 'dataWindow.title': 'Cửa sổ dữ liệu',\r\n 'dataWindow.hover': 'Rê chuột lên biểu đồ',\r\n 'dataWindow.open': 'Mở cửa',\r\n 'dataWindow.high': 'Cao',\r\n 'dataWindow.low': 'Thấp',\r\n 'dataWindow.close': 'Đóng cửa',\r\n 'dataWindow.change': 'Thay đổi',\r\n 'dataWindow.volume': 'Khối lượng',\r\n\r\n 'bracket.place': 'Đặt lệnh',\r\n 'bracket.hint': 'kéo các đường để chỉnh',\r\n 'bracket.longPlaced': 'Đã đặt lệnh Long kèm SL/TP · {rr}R',\r\n 'bracket.shortPlaced': 'Đã đặt lệnh Short kèm SL/TP · {rr}R',\r\n 'order.buyLimit': 'Mua giới hạn @ {price}',\r\n 'order.sellLimit': 'Bán giới hạn @ {price}',\r\n 'order.buyStop': 'Mua dừng @ {price}',\r\n 'order.sellStop': 'Bán dừng @ {price}',\r\n\r\n 'toast.pinned': 'Đã ghim vào mục yêu thích',\r\n 'toast.unpinned': 'Đã bỏ ghim',\r\n 'sidebar.unpinHint': '{tool} (chuột phải để bỏ ghim)',\r\n 'toast.imageCopied': 'Đã sao chép ảnh biểu đồ',\r\n 'toast.imageCopyFailed': 'Không sao chép được — trình duyệt không cho chép ảnh',\r\n 'toast.linkCopied': 'Đã sao chép liên kết',\r\n 'toast.copyFailed': 'Không sao chép được — trình duyệt không cho dùng clipboard',\r\n 'toast.compareNeedsAdapter': 'So sánh cần một nguồn dữ liệu trực tiếp',\r\n 'toast.comparing': 'Đang so sánh với {symbol}',\r\n 'toast.loadFailed': 'không tải được',\r\n 'toast.autoFibAdded': 'Đã thêm Fibonacci tự động',\r\n 'toast.noSwing': 'Không thấy sóng rõ ràng trong khung nhìn',\r\n 'toast.fullscreenUnavailable': 'Không mở được chế độ toàn màn hình',\r\n 'toast.fileLoaded': 'Đã nạp {count} nến từ {file}',\r\n 'toast.fileSkipped': 'bỏ qua {count}',\r\n\r\n 'hotkeys.commandPalette': 'Bảng lệnh',\r\n 'hotkeys.symbolSearch': 'Tìm mã',\r\n 'hotkeys.goToDate': 'Đi tới ngày',\r\n 'hotkeys.invertScale': 'Đảo ngược thang giá',\r\n 'hotkeys.showSheet': 'Hiện bảng này',\r\n 'hotkeys.saveLayout': 'Lưu bố cục',\r\n 'hotkeys.typeInterval': 'Gõ số để đổi khung thời gian',\r\n 'hotkeys.pan': 'Kéo — qua cả nến cuối, vào vùng tương lai trống',\r\n 'hotkeys.boxSelect': 'Chọn các hình vẽ trong một khung',\r\n 'hotkeys.toggleSelect': 'Thêm / bỏ một hình vẽ khỏi vùng chọn',\r\n 'hotkeys.measure': 'Công cụ đo (số nến × chênh lệch giá)',\r\n 'hotkeys.scalePrice': 'Co / giãn thang dọc',\r\n 'hotkeys.zoomTime': 'Phóng to trục thời gian',\r\n 'hotkeys.autoScale': 'Bật lại tự co giãn thang',\r\n 'hotkeys.fit': 'Vừa khít dữ liệu',\r\n 'hotkeys.zoomCursor': 'Phóng to quanh con trỏ',\r\n 'hotkeys.touchPan': 'Kéo / di chuyển con trỏ',\r\n 'hotkeys.pinch': 'Phóng to quanh điểm giữa',\r\n 'hotkeys.longPress': 'Ghim chú thích OHLC tại nến',\r\n 'hotkeys.touchAxis': 'Co giãn trục giá / thời gian',\r\n 'hotkeys.panBar': 'Dời một nến',\r\n 'hotkeys.zoomInOut': 'Phóng to / thu nhỏ',\r\n 'hotkeys.toStart': 'Về đầu dữ liệu',\r\n 'hotkeys.toEnd': 'Về cuối (nến mới nhất)',\r\n 'hotkeys.undo': 'Hoàn tác',\r\n 'hotkeys.redo': 'Làm lại',\r\n 'hotkeys.cancelDrawing': 'Huỷ hình đang vẽ',\r\n 'hotkeys.copy': 'Sao chép hình vẽ đang chọn',\r\n 'hotkeys.paste': 'Dán hình vẽ (vào bất kỳ biểu đồ nào trên trang)',\r\n 'key.drag': 'Kéo',\r\n 'key.click': 'Bấm',\r\n 'key.doubleClick': 'Bấm đúp',\r\n 'key.scroll': 'Cuộn',\r\n 'key.priceAxis': 'Trục giá',\r\n 'key.timeAxis': 'Trục thời gian',\r\n 'key.oneFinger': '1 ngón',\r\n 'key.twoFingers': '2 ngón',\r\n 'key.pinch': 'Chụm',\r\n 'key.longPress': 'Nhấn giữ',\r\n 'key.axisStrip': 'Dải trục',\r\n 'hotkeys.drawingMenu': 'Menu của hình vẽ (trên hình)',\r\n 'hotkeys.drawingSettings': 'Cài đặt hình vẽ (trên hình)',\r\n 'hotkeys.group': 'Nhóm các hình đang chọn',\r\n 'hotkeys.ungroup': 'Bỏ nhóm các hình đang chọn',\r\n 'hotkeys.orderStep': 'Đưa lên / xuống một lớp',\r\n 'hotkeys.orderEnd': 'Đưa lên trên cùng / xuống dưới cùng',\r\n 'hotkeys.finishPath': 'Kết thúc đường nhiều điểm hoặc đa giác',\r\n 'key.rightClick': 'Chuột phải',\r\n};\r\n","/**\r\n * i18n for ChartWidget's own chrome: toolbar, legend, settings, drawing tools,\r\n * panels, dialogs, hotkey sheet and toasts. Indicator names stay as they are\r\n * (mostly acronyms). English and Vietnamese are built in; other languages\r\n * come from `@tradecanvas/chart/widget/locales` — pass one as `messages`, or\r\n * register it once with `registerWidgetLocale`.\r\n */\r\nimport { EN_MESSAGES, type MessageKey, type WidgetMessages } from './locales/en.js';\r\nimport { VI_MESSAGES } from './locales/vi.js';\r\n\r\nexport { EN_MESSAGES, VI_MESSAGES };\r\nexport type { MessageKey, WidgetMessages };\r\n\r\nconst registry = new Map<string, Partial<WidgetMessages>>([\r\n ['en', EN_MESSAGES],\r\n ['vi', VI_MESSAGES],\r\n]);\r\n\r\n/** The locales registered so far: English, Vietnamese and any added with `registerWidgetLocale`. */\r\nexport const BUILTIN_LOCALES: Readonly<Record<string, Partial<WidgetMessages>>> = new Proxy({}, {\r\n get: (_t, key) => (typeof key === 'string' ? registry.get(key.toLowerCase()) : undefined),\r\n has: (_t, key) => typeof key === 'string' && registry.has(key.toLowerCase()),\r\n ownKeys: () => [...registry.keys()],\r\n getOwnPropertyDescriptor: (_t, key) =>\r\n typeof key === 'string' && registry.has(key.toLowerCase())\r\n ? { enumerable: true, configurable: true, value: registry.get(key.toLowerCase()) }\r\n : undefined,\r\n});\r\n\r\n/**\r\n * Make a language available to `locale` on every ChartWidget, e.g.\r\n * `registerWidgetLocale('ja', ja)` with `ja` from\r\n * `@tradecanvas/chart/widget/locales`. Codes match case-insensitively.\r\n */\r\nexport function registerWidgetLocale(code: string, messages: Partial<WidgetMessages>): void {\r\n registry.set(code.toLowerCase(), messages);\r\n}\r\n\r\n/** Codes to try for `locale`, most specific first: `zh-TW` → `zh-tw`, `zh-hant`, `zh`. */\r\nfunction localeCandidates(locale: string): string[] {\r\n const lower = locale.toLowerCase().replace('_', '-');\r\n const out = [lower];\r\n if (/^zh-(tw|hk|mo|hant)/.test(lower)) out.push('zh-hant');\r\n const language = lower.split('-')[0];\r\n if (language !== lower) out.push(language);\r\n return out;\r\n}\r\n\r\n/** The table for `locale`, if one is registered for it or its language. */\r\nexport function findWidgetLocale(locale: string): Partial<WidgetMessages> | undefined {\r\n for (const code of localeCandidates(locale)) {\r\n const table = registry.get(code);\r\n if (table) return table;\r\n }\r\n return undefined;\r\n}\r\n\r\nconst warned = new Set<string>();\r\n\r\n/**\r\n * Resolve the widget's message table: built-in English as the base, the\r\n * table for `locale` (or its language) on top, falling back key by key to\r\n * English, then the host's `messages` last so they always win.\r\n */\r\nexport function resolveMessages(\r\n locale: string | undefined,\r\n overrides: Partial<WidgetMessages> | undefined,\r\n): WidgetMessages {\r\n const base: WidgetMessages = { ...EN_MESSAGES };\r\n const table = locale ? findWidgetLocale(locale) : undefined;\r\n if (table) Object.assign(base, table);\r\n else if (locale && !overrides && !warned.has(locale)) {\r\n warned.add(locale);\r\n console.warn(\r\n `[ChartWidget] No strings for locale \"${locale}\"; showing English. `\r\n + \"Import the language from '@tradecanvas/chart/widget/locales' and pass it as `messages`.\",\r\n );\r\n }\r\n if (overrides) Object.assign(base, overrides);\r\n return base;\r\n}\r\n\r\nexport type Translator = (key: MessageKey) => string;\r\n\r\nexport function createTranslator(messages: WidgetMessages): Translator {\r\n return (key: MessageKey) => messages[key] ?? EN_MESSAGES[key] ?? key;\r\n}\r\n\r\n/** English strings, for components used without a widget. */\r\nexport const EN_TRANSLATOR: Translator = createTranslator(EN_MESSAGES);\r\n\r\n/** Fill `{name}` placeholders: `fill('Comparing {symbol}', { symbol: 'ETH' })`. */\r\nexport function fill(template: string, values: Record<string, string | number>): string {\r\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => (name in values ? String(values[name]) : match));\r\n}\r\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./DragDropImporter-C5kgfbET.cjs`);let t=require(`@tradecanvas/commons`),n=require(`@tradecanvas/core`);var r={"1x1":{cols:1,rows:1},"1x2":{cols:2,rows:1},"2x1":{cols:1,rows:2},"2x2":{cols:2,rows:2},"1x3":{cols:3,rows:1},"3x1":{cols:1,rows:3},"2x3":{cols:3,rows:2},"3x2":{cols:2,rows:3}},i=class{root;cells=[];layout;options;destroyed=!1;syncing=!1;constructor(e,t={}){this.options=t,this.layout=t.layout??`2x2`,this.root=document.createElement(`div`),this.root.style.cssText=`display:grid;width:100%;height:100%;overflow:hidden;`,e.appendChild(this.root),this.applyLayout(),this.createCells()}applyLayout(){let{cols:e,rows:t}=r[this.layout],n=this.options.gap??1;this.root.style.gridTemplateColumns=`repeat(${e}, 1fr)`,this.root.style.gridTemplateRows=`repeat(${t}, 1fr)`,this.root.style.gap=`${n}px`}createCells(){let{cols:e,rows:t}=r[this.layout],n=e*t;for(let e=0;e<n;e++)this.cells.push(this.createCell(e))}createCell(t){let n=this.options.cells?.[t]??{},r=document.createElement(`div`);r.style.cssText=`position:relative;overflow:hidden;min-width:0;min-height:0;`,this.root.appendChild(r);let i=new e.r(r,{chartType:`candlestick`,autoScale:!0,features:{crosshair:!0,keyboard:!0,volume:!0,legend:!0,priceAxis:!0,timeAxis:!0,grid:!0},...this.options.chartOptions,...n.chartOptions,theme:this.options.theme}),a={container:r,chart:i,symbol:n.symbol??`Chart ${t+1}`,timeframe:n.timeframe??`5m`};return this.options.syncCrosshair!==!1&&(i.on(`crosshairMove`,e=>{let t=e.payload.bar?.time;if(t!==void 0)for(let e of this.cells)e.chart!==i&&e.chart.setCrosshairTime(t)}),i.on(`crosshairLeave`,()=>{for(let e of this.cells)e.chart!==i&&e.chart.setCrosshairTime(null)})),this.options.syncTimeAxis!==!1&&i.on(`visibleRangeChange`,e=>{if(this.syncing)return;this.syncing=!0;let{from:t,to:n}=e.payload,r=i.getData();if(r.length>0&&t>=0&&n<r.length){let e=r[t]?.time,a=r[n]?.time;if(e&&a)for(let t of this.cells)t.chart!==i&&t.chart.setVisibleRange(e,a)}this.syncing=!1}),a}setLayout(e){if(e===this.layout)return;let t=this.cells.length,{cols:n,rows:i}=r[e],a=n*i;if(a<t)for(let e=t-1;e>=a;e--){let t=this.cells[e];t.chart.destroy(),t.container.remove(),this.cells.pop()}this.layout=e,this.applyLayout();for(let e=t;e<a;e++)this.cells.push(this.createCell(e))}getChart(e){return this.cells[e]?.chart??null}getCharts(){return this.cells.map(e=>e.chart)}getCellCount(){return this.cells.length}setData(e,t){this.cells[e]?.chart.setData(t)}setAllData(e){for(let t of this.cells)t.chart.setData(e)}async connectCell(e,t){let n=this.cells[e];n&&(n.symbol=t.symbol,n.timeframe=t.timeframe,await n.chart.connect(t))}async connectAll(e,t,n,r=500){let i=[];for(let a=0;a<this.cells.length&&a<t.length;a++)i.push(this.connectCell(a,{adapter:e,symbol:t[a],timeframe:n,historyLimit:r}));await Promise.all(i)}setTheme(e){for(let t of this.cells)t.chart.setTheme(e)}destroy(){if(!this.destroyed){this.destroyed=!0;for(let e of this.cells)e.chart.destroy(),e.container.remove();this.cells=[],this.root.remove()}}},a=class extends n.BaseFinanceChart{options;constructor(e,t){super(e,t.theme),this.options=t,this.requestRender()}renderChart(e,t,r,i){(0,n.renderSparkline)(e,t,r,this.options,i)}update(e){this.options={...this.options,data:e},this.requestRender()}setOptions(e){this.options={...this.options,...e},this.requestRender()}},o=class extends n.BaseFinanceChart{options;crosshair=null;constructor(e,t){super(e,t.theme),this.options=t,t.crosshair!==!1&&(this.crosshair=new n.FinanceCrosshair(this.canvas,()=>this.requestRender())),this.requestRender()}renderChart(e,t,r,i){let a=this.crosshair?.getPosition()??null;(0,n.renderDepthChart)(e,t,r,this.options,i,a)}update(e){this.options={...this.options,data:e},this.requestRender()}setOptions(e){this.options={...this.options,...e},this.requestRender()}destroy(){this.crosshair?.destroy(),super.destroy()}},s=class extends n.BaseFinanceChart{options;crosshair=null;constructor(e,t){super(e,t.theme),this.options=t,t.crosshair!==!1&&(this.crosshair=new n.FinanceCrosshair(this.canvas,()=>this.requestRender())),this.requestRender()}renderChart(e,t,r,i){let a=this.crosshair?.getPosition()??null;(0,n.renderEquityCurve)(e,t,r,this.options,i,a)}update(e,t){this.options={...this.options,data:e},t!==void 0&&(this.options={...this.options,benchmark:t}),this.requestRender()}setOptions(e){this.options={...this.options,...e},this.requestRender()}destroy(){this.crosshair?.destroy(),super.destroy()}},c=class extends n.BaseFinanceChart{options;crosshair=null;cachedRects=[];currentData=[];lastLayoutWidth=0;lastLayoutHeight=0;handleClick=null;constructor(e,t){super(e,t.theme),this.options=t,this.currentData=t.data??[],t.crosshair!==!1&&(this.crosshair=new n.FinanceCrosshair(this.canvas,()=>this.requestRender())),t.onCellClick&&(this.handleClick=e=>{let t=this.canvas.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;this.onCanvasClick(n,r)},this.canvas.addEventListener(`click`,this.handleClick)),this.recomputeLayout(),this.requestRender()}recomputeLayout(){let e={x:0,y:0,width:this.width,height:this.height},t=this.options.cellPadding??2;if(this.lastLayoutWidth=this.width,this.lastLayoutHeight=this.height,this.options.weighted){let r=this.currentData.map(e=>({id:e.id,weight:e.weight??(Math.abs(e.value)||1)}));this.cachedRects=(0,n.layoutSquarifiedTreemap)(r,e,t)}else this.cachedRects=(0,n.layoutUniformGrid)(this.currentData.map(e=>({id:e.id})),e,t)}onCanvasClick(e,t){if(this.options.onCellClick)for(let n of this.cachedRects){let r=n.rect;if(e>=r.x&&e<=r.x+r.width&&t>=r.y&&t<=r.y+r.height){let e=this.currentData.find(e=>e.id===n.id);e&&this.options.onCellClick(e);return}}}renderChart(e,t,r,i){(t!==this.lastLayoutWidth||r!==this.lastLayoutHeight)&&this.recomputeLayout();let a=this.crosshair?.getPosition()??null;(0,n.renderHeatmap)(e,t,r,this.currentData,this.cachedRects,this.options,i,a)}update(e){this.currentData=e,this.options={...this.options,data:e},this.recomputeLayout(),this.requestRender()}setOptions(e){this.options={...this.options,...e},e.data&&(this.currentData=e.data),this.recomputeLayout(),this.requestRender()}destroy(){this.crosshair?.destroy(),this.handleClick&&this.canvas.removeEventListener(`click`,this.handleClick),super.destroy()}},l=class extends n.BaseFinanceChart{options;crosshair=null;constructor(e,t){super(e,t.theme),this.options=t,t.crosshair!==!1&&(this.crosshair=new n.FinanceCrosshair(this.canvas,()=>this.requestRender())),this.requestRender()}renderChart(e,t,r,i){let a=this.crosshair?.getPosition()??null;(0,n.renderWaterfall)(e,t,r,this.options,i,a)}update(e){this.options={...this.options,data:e},this.requestRender()}setOptions(e){this.options={...this.options,...e},this.requestRender()}destroy(){this.crosshair?.destroy(),super.destroy()}},u=500;function d(e){let t=1-e;return 1-t*t*t}var f=class extends n.BaseFinanceChart{options;currentValue;targetValue;animationStart=null;animationFrom=0;animationFrameId=null;constructor(e,t){super(e,t.theme),this.options=t,this.currentValue=t.value,this.targetValue=t.value,this.requestRender()}renderChart(e,t,r,i){(0,n.renderGauge)(e,t,r,this.options,i,this.currentValue)}setValue(e){if(this.options.animate===!1){this.cancelAnimation(),this.currentValue=e,this.targetValue=e,this.options={...this.options,value:e},this.requestRender();return}this.targetValue=e,this.animationFrom=this.currentValue,this.animationStart=performance.now(),this.options={...this.options,value:e},this.startAnimationLoop()}setOptions(e){let t={...this.options,...e};if(e.value!==void 0&&e.value!==this.targetValue){this.options=t,this.setValue(e.value);return}this.options=t,this.requestRender()}startAnimationLoop(){if(this.animationFrameId!==null)return;let e=()=>{if(this.animationFrameId=null,this.animationStart===null)return;let t=this.options.animationDuration??u,n=performance.now()-this.animationStart,r=Math.min(1,n/Math.max(1,t)),i=d(r);this.currentValue=this.animationFrom+(this.targetValue-this.animationFrom)*i,this.requestRender(),r<1?this.animationFrameId=requestAnimationFrame(e):(this.currentValue=this.targetValue,this.animationStart=null)};this.animationFrameId=requestAnimationFrame(e)}cancelAnimation(){this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.animationStart=null}destroy(){this.cancelAnimation(),super.destroy()}},p=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function m(e){return e.map(e=>({time:e.time,value:e.equity}))}function h(e){let t=-1/0;return e.map(e=>{e.equity>t&&(t=e.equity);let n=t>0?(e.equity/t-1)*100:0;return{time:e.time,value:n}})}function g(e){if(e.length===0)return[];let n=[];for(let r of e){let e=(0,t.timeframeBucketStart)(r.time,`1M`),i=n[n.length-1];i&&i.key===e?i.close=r.equity:n.push({key:e,close:r.equity})}let r=e[0].equity,i=[];for(let e of n){let t=r===0?1:r,n=(e.close/t-1)*100;r=e.close;let a=new Date(e.key),o=a.getUTCFullYear(),s=a.getUTCMonth();i.push({id:`${o}-${String(s+1).padStart(2,`0`)}`,label:p[s],group:String(o),value:n})}return i}function _(e){return`${e>0?`+`:``}${e.toFixed(2)}%`}function v(e){return e>0?`positive`:e<0?`negative`:`neutral`}function y(e){return[{label:`Total Return`,value:_(e.totalReturnPct),tone:v(e.totalReturnPct)},{label:`CAGR`,value:_(e.cagr*100),tone:v(e.cagr)},{label:`Sharpe`,value:e.sharpe.toFixed(2),tone:v(e.sharpe)},{label:`Sortino`,value:e.sortino.toFixed(2),tone:v(e.sortino)},{label:`Max Drawdown`,value:_(e.maxDrawdownPct),tone:`negative`},{label:`Win Rate`,value:`${(e.winRate*100).toFixed(1)}%`,tone:`neutral`},{label:`Profit Factor`,value:Number.isFinite(e.profitFactor)?e.profitFactor.toFixed(2):`∞`,tone:v(e.profitFactor-1)},{label:`Trades`,value:String(e.trades),tone:`neutral`}]}function b(e){return!e||e===`dark`?t.DARK_THEME:e===`light`?t.LIGHT_THEME:e}var x=class{options;theme;root;equityChart=null;drawdownChart=null;heatmap=null;constructor(e,t){this.options=t,this.theme=b(t.theme),this.root=document.createElement(`div`),this.build(),e.appendChild(this.root)}build(){let e=this.theme,{result:t,title:n,subtitle:r}=this.options,i=this.panelBackground(),a=e.grid;if(this.root.style.cssText=[`display:flex`,`flex-direction:column`,`gap:14px`,`width:100%`,`box-sizing:border-box`,`padding:16px`,`background:${e.background}`,`color:${e.text}`,`font-family:${e.font.family}`].join(`;`),n||r){let t=document.createElement(`div`);if(n){let r=document.createElement(`div`);r.textContent=n,r.style.cssText=`font-size:${e.font.sizeLarge}px;font-weight:600;letter-spacing:-0.01em;`,t.appendChild(r)}if(r){let n=document.createElement(`div`);n.textContent=r,n.style.cssText=`font-size:${e.font.sizeSmall}px;color:${e.textSecondary};margin-top:2px;`,t.appendChild(n)}this.root.appendChild(t)}this.root.appendChild(this.buildStatsStrip(y(t.metrics),i,a));let o=document.createElement(`div`);o.style.cssText=[`display:grid`,`grid-template-columns:repeat(auto-fit, minmax(280px, 1fr))`,`grid-auto-rows:220px`,`gap:14px`].join(`;`),this.root.appendChild(o);let l=this.buildPanel(`Equity Curve`,i,a);l.wrap.style.gridColumn=`1 / -1`,o.appendChild(l.wrap),this.equityChart=new s(l.body,{data:m(t.equityCurve),theme:e,lineColor:e.candleUp,fillArea:!0,crosshair:!0});let u=this.buildPanel(`Drawdown`,i,a);o.appendChild(u.wrap),this.drawdownChart=new s(u.body,{data:h(t.equityCurve),theme:e,lineColor:e.candleDown,fillArea:!0,crosshair:!0,valueFormat:e=>`${e.toFixed(1)}%`});let d=g(t.equityCurve),f=this.buildPanel(`Monthly Returns`,i,a);o.appendChild(f.wrap),this.heatmap=new c(f.body,{data:d,theme:e,showValues:!0,valueFormat:e=>`${e>=0?`+`:``}${e.toFixed(1)}`,colorScale:{negative:e.candleDown,zero:i,positive:e.candleUp}})}buildStatsStrip(e,t,n){let r=document.createElement(`div`);r.style.cssText=[`display:grid`,`grid-template-columns:repeat(auto-fit, minmax(120px, 1fr))`,`gap:10px`].join(`;`);let i=this.theme;for(let a of e){let e=document.createElement(`div`);e.style.cssText=[`background:${t}`,`border:1px solid ${n}`,`border-radius:10px`,`padding:10px 12px`,`display:flex`,`flex-direction:column`,`gap:4px`].join(`;`);let o=document.createElement(`div`);o.textContent=a.label,o.style.cssText=`font-size:${i.font.sizeSmall}px;color:${i.textSecondary};text-transform:uppercase;letter-spacing:0.04em;`;let s=document.createElement(`div`);s.textContent=a.value;let c=a.tone===`positive`?i.candleUp:a.tone===`negative`?i.candleDown:i.text;s.style.cssText=`font-size:${i.font.sizeLarge}px;font-weight:600;color:${c};font-variant-numeric:tabular-nums;`,e.appendChild(o),e.appendChild(s),r.appendChild(e)}return r}buildPanel(e,t,n){let r=this.theme,i=document.createElement(`div`);i.style.cssText=[`background:${t}`,`border:1px solid ${n}`,`border-radius:10px`,`overflow:hidden`,`display:flex`,`flex-direction:column`].join(`;`);let a=document.createElement(`div`);a.textContent=e,a.style.cssText=[`font-size:${r.font.sizeSmall}px`,`font-weight:600`,`color:${r.textSecondary}`,`padding:8px 12px`,`border-bottom:1px solid ${n}`,`text-transform:uppercase`,`letter-spacing:0.04em`].join(`;`);let o=document.createElement(`div`);return o.style.cssText=`flex:1;min-height:0;position:relative;`,i.appendChild(a),i.appendChild(o),{wrap:i,body:o}}panelBackground(){return this.theme.name===`light`?`rgba(0,0,0,0.02)`:`rgba(255,255,255,0.03)`}update(e){this.options={...this.options,result:e},this.destroyCharts(),this.root.replaceChildren(),this.build()}setTheme(e){this.theme=b(e),this.options={...this.options,theme:e},this.destroyCharts(),this.root.replaceChildren(),this.build()}destroyCharts(){this.equityChart?.destroy(),this.drawdownChart?.destroy(),this.heatmap?.destroy(),this.equityChart=null,this.drawdownChart=null,this.heatmap=null}destroy(){this.destroyCharts(),this.root.remove()}};Object.defineProperty(exports,`AlertManager`,{enumerable:!0,get:function(){return n.AlertManager}}),Object.defineProperty(exports,`Animator`,{enumerable:!0,get:function(){return n.Animator}}),Object.defineProperty(exports,`BarCountdown`,{enumerable:!0,get:function(){return n.BarCountdown}}),Object.defineProperty(exports,`BinanceAdapter`,{enumerable:!0,get:function(){return n.BinanceAdapter}}),Object.defineProperty(exports,`BybitAdapter`,{enumerable:!0,get:function(){return n.BybitAdapter}}),exports.Chart=e.r,exports.ChartGrid=i,Object.defineProperty(exports,`ChartLegend`,{enumerable:!0,get:function(){return n.ChartLegend}}),Object.defineProperty(exports,`ChartStateManager`,{enumerable:!0,get:function(){return n.ChartStateManager}}),Object.defineProperty(exports,`CoinbaseAdapter`,{enumerable:!0,get:function(){return n.CoinbaseAdapter}}),Object.defineProperty(exports,`CompareRenderer`,{enumerable:!0,get:function(){return n.CompareRenderer}}),Object.defineProperty(exports,`CrosshairTooltip`,{enumerable:!0,get:function(){return n.CrosshairTooltip}}),Object.defineProperty(exports,`CurrentPriceLine`,{enumerable:!0,get:function(){return n.CurrentPriceLine}}),Object.defineProperty(exports,`DARK_TERMINAL`,{enumerable:!0,get:function(){return t.DARK_TERMINAL}}),Object.defineProperty(exports,`DARK_THEME`,{enumerable:!0,get:function(){return t.DARK_THEME}}),Object.defineProperty(exports,`DEFAULT_DRAWING_STYLE`,{enumerable:!0,get:function(){return t.DEFAULT_DRAWING_STYLE}}),Object.defineProperty(exports,`DEFAULT_LEGEND_CONFIG`,{enumerable:!0,get:function(){return n.DEFAULT_LEGEND_CONFIG}}),Object.defineProperty(exports,`DEFAULT_RECONNECT`,{enumerable:!0,get:function(){return t.DEFAULT_RECONNECT}}),Object.defineProperty(exports,`DEFAULT_SESSION_HOURS`,{enumerable:!0,get:function(){return n.DEFAULT_SESSION_HOURS}}),Object.defineProperty(exports,`DEFAULT_SIGNAL_STYLE`,{enumerable:!0,get:function(){return t.DEFAULT_SIGNAL_STYLE}}),Object.defineProperty(exports,`DEFAULT_STREAM_CONFIG`,{enumerable:!0,get:function(){return t.DEFAULT_STREAM_CONFIG}}),Object.defineProperty(exports,`DEFAULT_TIMEFRAME_FAVORITES`,{enumerable:!0,get:function(){return t.DEFAULT_TIMEFRAME_FAVORITES}}),Object.defineProperty(exports,`DEFAULT_TRADE_ZONE_STYLE`,{enumerable:!0,get:function(){return t.DEFAULT_TRADE_ZONE_STYLE}}),Object.defineProperty(exports,`DEFAULT_TRADING_CONFIG`,{enumerable:!0,get:function(){return t.DEFAULT_TRADING_CONFIG}}),Object.defineProperty(exports,`DataExporter`,{enumerable:!0,get:function(){return n.DataExporter}}),exports.DataManager=e.m,exports.DepthChart=o,exports.DragDropImporter=e.t,Object.defineProperty(exports,`DrawingBase`,{enumerable:!0,get:function(){return n.DrawingBase}}),Object.defineProperty(exports,`Easing`,{enumerable:!0,get:function(){return n.Easing}}),exports.EquityCurveChart=s,exports.GaugeChart=f,exports.HeatmapChart=c,Object.defineProperty(exports,`IndicatorBase`,{enumerable:!0,get:function(){return n.IndicatorBase}}),Object.defineProperty(exports,`IndicatorValueMap`,{enumerable:!0,get:function(){return n.IndicatorValueMap}}),Object.defineProperty(exports,`KeyboardHandler`,{enumerable:!0,get:function(){return n.KeyboardHandler}}),Object.defineProperty(exports,`KrakenAdapter`,{enumerable:!0,get:function(){return n.KrakenAdapter}}),Object.defineProperty(exports,`LIGHT_THEME`,{enumerable:!0,get:function(){return t.LIGHT_THEME}}),exports.LayoutManager=e.f,Object.defineProperty(exports,`MARKET_CRYPTO`,{enumerable:!0,get:function(){return t.MARKET_CRYPTO}}),Object.defineProperty(exports,`MARKET_HNX`,{enumerable:!0,get:function(){return t.MARKET_HNX}}),Object.defineProperty(exports,`MARKET_HOSE`,{enumerable:!0,get:function(){return t.MARKET_HOSE}}),Object.defineProperty(exports,`MARKET_NYSE`,{enumerable:!0,get:function(){return t.MARKET_NYSE}}),Object.defineProperty(exports,`MARKET_UPCOM`,{enumerable:!0,get:function(){return t.MARKET_UPCOM}}),Object.defineProperty(exports,`MockAdapter`,{enumerable:!0,get:function(){return n.MockAdapter}}),exports.PLUGIN_API_VERSION=e.l,Object.defineProperty(exports,`PaperExecutionAdapter`,{enumerable:!0,get:function(){return n.PaperExecutionAdapter}}),exports.PerformanceDashboard=x,exports.PluginManager=e.i,Object.defineProperty(exports,`PollingAdapter`,{enumerable:!0,get:function(){return n.PollingAdapter}}),Object.defineProperty(exports,`RANGE_PRESETS`,{enumerable:!0,get:function(){return n.RANGE_PRESETS}}),Object.defineProperty(exports,`ReplayManager`,{enumerable:!0,get:function(){return n.ReplayManager}}),Object.defineProperty(exports,`Screenshot`,{enumerable:!0,get:function(){return n.Screenshot}}),Object.defineProperty(exports,`SessionBreaks`,{enumerable:!0,get:function(){return n.SessionBreaks}}),Object.defineProperty(exports,`SessionShading`,{enumerable:!0,get:function(){return n.SessionShading}}),Object.defineProperty(exports,`SignalMarkerManager`,{enumerable:!0,get:function(){return n.SignalMarkerManager}}),exports.SparklineChart=a,Object.defineProperty(exports,`StreamManager`,{enumerable:!0,get:function(){return n.StreamManager}}),Object.defineProperty(exports,`TC_PALETTE`,{enumerable:!0,get:function(){return t.TC_PALETTE}}),Object.defineProperty(exports,`TC_SERIES_COLORS`,{enumerable:!0,get:function(){return t.TC_SERIES_COLORS}}),Object.defineProperty(exports,`TIMEFRAMES_CRYPTO`,{enumerable:!0,get:function(){return t.TIMEFRAMES_CRYPTO}}),Object.defineProperty(exports,`TIMEFRAMES_FOREX`,{enumerable:!0,get:function(){return t.TIMEFRAMES_FOREX}}),Object.defineProperty(exports,`TIMEFRAMES_STOCK`,{enumerable:!0,get:function(){return t.TIMEFRAMES_STOCK}}),exports.ThemeManager=e.p,Object.defineProperty(exports,`TickAggregator`,{enumerable:!0,get:function(){return n.TickAggregator}}),Object.defineProperty(exports,`TradeZoneManager`,{enumerable:!0,get:function(){return n.TradeZoneManager}}),Object.defineProperty(exports,`UndoRedoManager`,{enumerable:!0,get:function(){return n.UndoRedoManager}}),Object.defineProperty(exports,`VN_COLORS`,{enumerable:!0,get:function(){return t.VN_COLORS}}),Object.defineProperty(exports,`VolumeRenderer`,{enumerable:!0,get:function(){return n.VolumeRenderer}}),exports.WaterfallChart=l,Object.defineProperty(exports,`Watermark`,{enumerable:!0,get:function(){return n.Watermark}}),Object.defineProperty(exports,`WebSocketAdapter`,{enumerable:!0,get:function(){return n.WebSocketAdapter}}),exports.clearGlobalPlugins=e.a,exports.computeDrawdownCurve=h,exports.computeMonthlyReturns=g,Object.defineProperty(exports,`computePriceLimits`,{enumerable:!0,get:function(){return t.computePriceLimits}}),Object.defineProperty(exports,`createVNTheme`,{enumerable:!0,get:function(){return t.createVNTheme}}),Object.defineProperty(exports,`formatNumber`,{enumerable:!0,get:function(){return t.formatNumber}}),Object.defineProperty(exports,`formatTooltipTime`,{enumerable:!0,get:function(){return n.formatTooltipTime}}),Object.defineProperty(exports,`formatVND`,{enumerable:!0,get:function(){return t.formatVND}}),Object.defineProperty(exports,`formatVolumeLoc`,{enumerable:!0,get:function(){return t.formatVolumeLoc}}),Object.defineProperty(exports,`getCurrentSession`,{enumerable:!0,get:function(){return t.getCurrentSession}}),exports.getGlobalPlugins=e.o,Object.defineProperty(exports,`getLocale`,{enumerable:!0,get:function(){return t.getLocale}}),Object.defineProperty(exports,`lttbDownsample`,{enumerable:!0,get:function(){return n.lttbDownsample}}),Object.defineProperty(exports,`lttbVisibleIndices`,{enumerable:!0,get:function(){return n.lttbVisibleIndices}}),Object.defineProperty(exports,`normalizeBar`,{enumerable:!0,get:function(){return t.normalizeBar}}),Object.defineProperty(exports,`normalizeBarTime`,{enumerable:!0,get:function(){return t.normalizeBarTime}}),exports.overlaysForLayer=e.u,exports.parseOHLCV=e.n,exports.pluginKey=e.d,Object.defineProperty(exports,`rangePresetStart`,{enumerable:!0,get:function(){return n.rangePresetStart}}),Object.defineProperty(exports,`registerLocale`,{enumerable:!0,get:function(){return t.registerLocale}}),exports.registerPlugin=e.s,exports.selectKeyStats=y,Object.defineProperty(exports,`setLocale`,{enumerable:!0,get:function(){return t.setLocale}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return t.t}}),exports.toEquityPoints=m,Object.defineProperty(exports,`toHeikinAshi`,{enumerable:!0,get:function(){return n.toHeikinAshi}}),Object.defineProperty(exports,`toKagi`,{enumerable:!0,get:function(){return n.toKagi}}),Object.defineProperty(exports,`toLineBreak`,{enumerable:!0,get:function(){return n.toLineBreak}}),Object.defineProperty(exports,`toPointAndFigure`,{enumerable:!0,get:function(){return n.toPointAndFigure}}),Object.defineProperty(exports,`toRangeBars`,{enumerable:!0,get:function(){return n.toRangeBars}}),Object.defineProperty(exports,`toRenko`,{enumerable:!0,get:function(){return n.toRenko}}),exports.unregisterPlugin=e.c;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./LayoutSession-CTZB90NX.cjs`);let t=require(`@tradecanvas/commons`),n=require(`@tradecanvas/core`);var r={"1x1":{cols:1,rows:1},"1x2":{cols:2,rows:1},"2x1":{cols:1,rows:2},"2x2":{cols:2,rows:2},"1x3":{cols:3,rows:1},"3x1":{cols:1,rows:3},"2x3":{cols:3,rows:2},"3x2":{cols:2,rows:3}},i=class{root;cells=[];layout;options;destroyed=!1;syncing=!1;constructor(e,t={}){this.options=t,this.layout=t.layout??`2x2`,this.root=document.createElement(`div`),this.root.style.cssText=`display:grid;width:100%;height:100%;overflow:hidden;`,e.appendChild(this.root),this.applyLayout(),this.createCells()}applyLayout(){let{cols:e,rows:t}=r[this.layout],n=this.options.gap??1;this.root.style.gridTemplateColumns=`repeat(${e}, 1fr)`,this.root.style.gridTemplateRows=`repeat(${t}, 1fr)`,this.root.style.gap=`${n}px`}createCells(){let{cols:e,rows:t}=r[this.layout],n=e*t;for(let e=0;e<n;e++)this.cells.push(this.createCell(e))}createCell(t){let n=this.options.cells?.[t]??{},r=document.createElement(`div`);r.style.cssText=`position:relative;overflow:hidden;min-width:0;min-height:0;`,this.root.appendChild(r);let i=new e.c(r,{chartType:`candlestick`,autoScale:!0,features:{crosshair:!0,keyboard:!0,volume:!0,legend:!0,priceAxis:!0,timeAxis:!0,grid:!0},...this.options.chartOptions,...n.chartOptions,theme:this.options.theme}),a={container:r,chart:i,symbol:n.symbol??`Chart ${t+1}`,timeframe:n.timeframe??`5m`};return this.options.syncCrosshair!==!1&&(i.on(`crosshairMove`,e=>{let t=e.payload.bar?.time;if(t!==void 0)for(let e of this.cells)e.chart!==i&&e.chart.setCrosshairTime(t)}),i.on(`crosshairLeave`,()=>{for(let e of this.cells)e.chart!==i&&e.chart.setCrosshairTime(null)})),this.options.syncTimeAxis!==!1&&i.on(`visibleRangeChange`,e=>{if(this.syncing)return;this.syncing=!0;let{from:t,to:n}=e.payload,r=i.getData();if(r.length>0&&t>=0&&n<r.length){let e=r[t]?.time,a=r[n]?.time;if(e&&a)for(let t of this.cells)t.chart!==i&&t.chart.setVisibleRange(e,a)}this.syncing=!1}),a}setLayout(e){if(e===this.layout)return;let t=this.cells.length,{cols:n,rows:i}=r[e],a=n*i;if(a<t)for(let e=t-1;e>=a;e--){let t=this.cells[e];t.chart.destroy(),t.container.remove(),this.cells.pop()}this.layout=e,this.applyLayout();for(let e=t;e<a;e++)this.cells.push(this.createCell(e))}getChart(e){return this.cells[e]?.chart??null}getCharts(){return this.cells.map(e=>e.chart)}getCellCount(){return this.cells.length}setData(e,t){this.cells[e]?.chart.setData(t)}setAllData(e){for(let t of this.cells)t.chart.setData(e)}async connectCell(e,t){let n=this.cells[e];n&&(n.symbol=t.symbol,n.timeframe=t.timeframe,await n.chart.connect(t))}async connectAll(e,t,n,r=500){let i=[];for(let a=0;a<this.cells.length&&a<t.length;a++)i.push(this.connectCell(a,{adapter:typeof e==`function`?e(t[a],a):e,symbol:t[a],timeframe:n,historyLimit:r}));await Promise.all(i)}setTheme(e){for(let t of this.cells)t.chart.setTheme(e)}destroy(){if(!this.destroyed){this.destroyed=!0;for(let e of this.cells)e.chart.destroy(),e.container.remove();this.cells=[],this.root.remove()}}},a=class extends n.BaseFinanceChart{options;constructor(e,t){super(e,t.theme),this.options=t,this.requestRender()}renderChart(e,t,r,i){(0,n.renderSparkline)(e,t,r,this.options,i)}update(e){this.options={...this.options,data:e},this.requestRender()}setOptions(e){this.options={...this.options,...e},this.requestRender()}},o=class extends n.BaseFinanceChart{options;crosshair=null;constructor(e,t){super(e,t.theme),this.options=t,t.crosshair!==!1&&(this.crosshair=new n.FinanceCrosshair(this.canvas,()=>this.requestRender())),this.requestRender()}renderChart(e,t,r,i){let a=this.crosshair?.getPosition()??null;(0,n.renderDepthChart)(e,t,r,this.options,i,a)}update(e){this.options={...this.options,data:e},this.requestRender()}setOptions(e){this.options={...this.options,...e},this.requestRender()}destroy(){this.crosshair?.destroy(),super.destroy()}},s=class extends n.BaseFinanceChart{options;crosshair=null;constructor(e,t){super(e,t.theme),this.options=t,t.crosshair!==!1&&(this.crosshair=new n.FinanceCrosshair(this.canvas,()=>this.requestRender())),this.requestRender()}renderChart(e,t,r,i){let a=this.crosshair?.getPosition()??null;(0,n.renderEquityCurve)(e,t,r,this.options,i,a)}update(e,t){this.options={...this.options,data:e},t!==void 0&&(this.options={...this.options,benchmark:t}),this.requestRender()}setOptions(e){this.options={...this.options,...e},this.requestRender()}destroy(){this.crosshair?.destroy(),super.destroy()}},c=class extends n.BaseFinanceChart{options;crosshair=null;cachedRects=[];currentData=[];lastLayoutWidth=0;lastLayoutHeight=0;handleClick=null;constructor(e,t){super(e,t.theme),this.options=t,this.currentData=t.data??[],t.crosshair!==!1&&(this.crosshair=new n.FinanceCrosshair(this.canvas,()=>this.requestRender())),t.onCellClick&&(this.handleClick=e=>{let t=this.canvas.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;this.onCanvasClick(n,r)},this.canvas.addEventListener(`click`,this.handleClick)),this.recomputeLayout(),this.requestRender()}recomputeLayout(){let e={x:0,y:0,width:this.width,height:this.height},t=this.options.cellPadding??2;if(this.lastLayoutWidth=this.width,this.lastLayoutHeight=this.height,this.options.weighted){let r=this.currentData.map(e=>({id:e.id,weight:e.weight??(Math.abs(e.value)||1)}));this.cachedRects=(0,n.layoutSquarifiedTreemap)(r,e,t)}else this.cachedRects=(0,n.layoutUniformGrid)(this.currentData.map(e=>({id:e.id})),e,t)}onCanvasClick(e,t){if(this.options.onCellClick)for(let n of this.cachedRects){let r=n.rect;if(e>=r.x&&e<=r.x+r.width&&t>=r.y&&t<=r.y+r.height){let e=this.currentData.find(e=>e.id===n.id);e&&this.options.onCellClick(e);return}}}renderChart(e,t,r,i){(t!==this.lastLayoutWidth||r!==this.lastLayoutHeight)&&this.recomputeLayout();let a=this.crosshair?.getPosition()??null;(0,n.renderHeatmap)(e,t,r,this.currentData,this.cachedRects,this.options,i,a)}update(e){this.currentData=e,this.options={...this.options,data:e},this.recomputeLayout(),this.requestRender()}setOptions(e){this.options={...this.options,...e},e.data&&(this.currentData=e.data),this.recomputeLayout(),this.requestRender()}destroy(){this.crosshair?.destroy(),this.handleClick&&this.canvas.removeEventListener(`click`,this.handleClick),super.destroy()}},l=class extends n.BaseFinanceChart{options;crosshair=null;constructor(e,t){super(e,t.theme),this.options=t,t.crosshair!==!1&&(this.crosshair=new n.FinanceCrosshair(this.canvas,()=>this.requestRender())),this.requestRender()}renderChart(e,t,r,i){let a=this.crosshair?.getPosition()??null;(0,n.renderWaterfall)(e,t,r,this.options,i,a)}update(e){this.options={...this.options,data:e},this.requestRender()}setOptions(e){this.options={...this.options,...e},this.requestRender()}destroy(){this.crosshair?.destroy(),super.destroy()}},u=500;function d(e){let t=1-e;return 1-t*t*t}var f=class extends n.BaseFinanceChart{options;currentValue;targetValue;animationStart=null;animationFrom=0;animationFrameId=null;constructor(e,t){super(e,t.theme),this.options=t,this.currentValue=t.value,this.targetValue=t.value,this.requestRender()}renderChart(e,t,r,i){(0,n.renderGauge)(e,t,r,this.options,i,this.currentValue)}setValue(e){if(this.options.animate===!1){this.cancelAnimation(),this.currentValue=e,this.targetValue=e,this.options={...this.options,value:e},this.requestRender();return}this.targetValue=e,this.animationFrom=this.currentValue,this.animationStart=performance.now(),this.options={...this.options,value:e},this.startAnimationLoop()}setOptions(e){let t={...this.options,...e};if(e.value!==void 0&&e.value!==this.targetValue){this.options=t,this.setValue(e.value);return}this.options=t,this.requestRender()}startAnimationLoop(){if(this.animationFrameId!==null)return;let e=()=>{if(this.animationFrameId=null,this.animationStart===null)return;let t=this.options.animationDuration??u,n=performance.now()-this.animationStart,r=Math.min(1,n/Math.max(1,t)),i=d(r);this.currentValue=this.animationFrom+(this.targetValue-this.animationFrom)*i,this.requestRender(),r<1?this.animationFrameId=requestAnimationFrame(e):(this.currentValue=this.targetValue,this.animationStart=null)};this.animationFrameId=requestAnimationFrame(e)}cancelAnimation(){this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.animationStart=null}destroy(){this.cancelAnimation(),super.destroy()}},p=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`];function m(e){return e.map(e=>({time:e.time,value:e.equity}))}function h(e){let t=-1/0;return e.map(e=>{e.equity>t&&(t=e.equity);let n=t>0?(e.equity/t-1)*100:0;return{time:e.time,value:n}})}function g(e){if(e.length===0)return[];let n=[];for(let r of e){let e=(0,t.timeframeBucketStart)(r.time,`1M`),i=n[n.length-1];i&&i.key===e?i.close=r.equity:n.push({key:e,close:r.equity})}let r=e[0].equity,i=[];for(let e of n){let t=r===0?1:r,n=(e.close/t-1)*100;r=e.close;let a=new Date(e.key),o=a.getUTCFullYear(),s=a.getUTCMonth();i.push({id:`${o}-${String(s+1).padStart(2,`0`)}`,label:p[s],group:String(o),value:n})}return i}function _(e){return`${e>0?`+`:``}${e.toFixed(2)}%`}function v(e){return e>0?`positive`:e<0?`negative`:`neutral`}function y(e){return[{label:`Total Return`,value:_(e.totalReturnPct),tone:v(e.totalReturnPct)},{label:`CAGR`,value:_(e.cagr*100),tone:v(e.cagr)},{label:`Sharpe`,value:e.sharpe.toFixed(2),tone:v(e.sharpe)},{label:`Sortino`,value:e.sortino.toFixed(2),tone:v(e.sortino)},{label:`Max Drawdown`,value:_(e.maxDrawdownPct),tone:`negative`},{label:`Win Rate`,value:`${(e.winRate*100).toFixed(1)}%`,tone:`neutral`},{label:`Profit Factor`,value:Number.isFinite(e.profitFactor)?e.profitFactor.toFixed(2):`∞`,tone:v(e.profitFactor-1)},{label:`Trades`,value:String(e.trades),tone:`neutral`}]}function b(e){return!e||e===`dark`?t.DARK_THEME:e===`light`?t.LIGHT_THEME:e}var x=class{options;theme;root;equityChart=null;drawdownChart=null;heatmap=null;constructor(e,t){this.options=t,this.theme=b(t.theme),this.root=document.createElement(`div`),this.build(),e.appendChild(this.root)}build(){let e=this.theme,{result:t,title:n,subtitle:r}=this.options,i=this.panelBackground(),a=e.grid;if(this.root.style.cssText=[`display:flex`,`flex-direction:column`,`gap:14px`,`width:100%`,`box-sizing:border-box`,`padding:16px`,`background:${e.background}`,`color:${e.text}`,`font-family:${e.font.family}`].join(`;`),n||r){let t=document.createElement(`div`);if(n){let r=document.createElement(`div`);r.textContent=n,r.style.cssText=`font-size:${e.font.sizeLarge}px;font-weight:600;letter-spacing:-0.01em;`,t.appendChild(r)}if(r){let n=document.createElement(`div`);n.textContent=r,n.style.cssText=`font-size:${e.font.sizeSmall}px;color:${e.textSecondary};margin-top:2px;`,t.appendChild(n)}this.root.appendChild(t)}this.root.appendChild(this.buildStatsStrip(y(t.metrics),i,a));let o=document.createElement(`div`);o.style.cssText=[`display:grid`,`grid-template-columns:repeat(auto-fit, minmax(280px, 1fr))`,`grid-auto-rows:220px`,`gap:14px`].join(`;`),this.root.appendChild(o);let l=this.buildPanel(`Equity Curve`,i,a);l.wrap.style.gridColumn=`1 / -1`,o.appendChild(l.wrap),this.equityChart=new s(l.body,{data:m(t.equityCurve),theme:e,lineColor:e.candleUp,fillArea:!0,crosshair:!0});let u=this.buildPanel(`Drawdown`,i,a);o.appendChild(u.wrap),this.drawdownChart=new s(u.body,{data:h(t.equityCurve),theme:e,lineColor:e.candleDown,fillArea:!0,crosshair:!0,valueFormat:e=>`${e.toFixed(1)}%`});let d=g(t.equityCurve),f=this.buildPanel(`Monthly Returns`,i,a);o.appendChild(f.wrap),this.heatmap=new c(f.body,{data:d,theme:e,showValues:!0,valueFormat:e=>`${e>=0?`+`:``}${e.toFixed(1)}`,colorScale:{negative:e.candleDown,zero:i,positive:e.candleUp}})}buildStatsStrip(e,t,n){let r=document.createElement(`div`);r.style.cssText=[`display:grid`,`grid-template-columns:repeat(auto-fit, minmax(120px, 1fr))`,`gap:10px`].join(`;`);let i=this.theme;for(let a of e){let e=document.createElement(`div`);e.style.cssText=[`background:${t}`,`border:1px solid ${n}`,`border-radius:10px`,`padding:10px 12px`,`display:flex`,`flex-direction:column`,`gap:4px`].join(`;`);let o=document.createElement(`div`);o.textContent=a.label,o.style.cssText=`font-size:${i.font.sizeSmall}px;color:${i.textSecondary};text-transform:uppercase;letter-spacing:0.04em;`;let s=document.createElement(`div`);s.textContent=a.value;let c=a.tone===`positive`?i.candleUp:a.tone===`negative`?i.candleDown:i.text;s.style.cssText=`font-size:${i.font.sizeLarge}px;font-weight:600;color:${c};font-variant-numeric:tabular-nums;`,e.appendChild(o),e.appendChild(s),r.appendChild(e)}return r}buildPanel(e,t,n){let r=this.theme,i=document.createElement(`div`);i.style.cssText=[`background:${t}`,`border:1px solid ${n}`,`border-radius:10px`,`overflow:hidden`,`display:flex`,`flex-direction:column`].join(`;`);let a=document.createElement(`div`);a.textContent=e,a.style.cssText=[`font-size:${r.font.sizeSmall}px`,`font-weight:600`,`color:${r.textSecondary}`,`padding:8px 12px`,`border-bottom:1px solid ${n}`,`text-transform:uppercase`,`letter-spacing:0.04em`].join(`;`);let o=document.createElement(`div`);return o.style.cssText=`flex:1;min-height:0;position:relative;`,i.appendChild(a),i.appendChild(o),{wrap:i,body:o}}panelBackground(){return this.theme.name===`light`?`rgba(0,0,0,0.02)`:`rgba(255,255,255,0.03)`}update(e){this.options={...this.options,result:e},this.destroyCharts(),this.root.replaceChildren(),this.build()}setTheme(e){this.theme=b(e),this.options={...this.options,theme:e},this.destroyCharts(),this.root.replaceChildren(),this.build()}destroyCharts(){this.equityChart?.destroy(),this.drawdownChart?.destroy(),this.heatmap?.destroy(),this.equityChart=null,this.drawdownChart=null,this.heatmap=null}destroy(){this.destroyCharts(),this.root.remove()}};Object.defineProperty(exports,`AlertManager`,{enumerable:!0,get:function(){return n.AlertManager}}),Object.defineProperty(exports,`Animator`,{enumerable:!0,get:function(){return n.Animator}}),Object.defineProperty(exports,`BarCountdown`,{enumerable:!0,get:function(){return n.BarCountdown}}),Object.defineProperty(exports,`BinanceAdapter`,{enumerable:!0,get:function(){return n.BinanceAdapter}}),Object.defineProperty(exports,`BybitAdapter`,{enumerable:!0,get:function(){return n.BybitAdapter}}),exports.Chart=e.c,exports.ChartGrid=i,Object.defineProperty(exports,`ChartLegend`,{enumerable:!0,get:function(){return n.ChartLegend}}),Object.defineProperty(exports,`ChartStateManager`,{enumerable:!0,get:function(){return n.ChartStateManager}}),Object.defineProperty(exports,`CoinbaseAdapter`,{enumerable:!0,get:function(){return n.CoinbaseAdapter}}),Object.defineProperty(exports,`CompareRenderer`,{enumerable:!0,get:function(){return n.CompareRenderer}}),Object.defineProperty(exports,`CrosshairTooltip`,{enumerable:!0,get:function(){return n.CrosshairTooltip}}),Object.defineProperty(exports,`CurrentPriceLine`,{enumerable:!0,get:function(){return n.CurrentPriceLine}}),Object.defineProperty(exports,`DARK_TERMINAL`,{enumerable:!0,get:function(){return t.DARK_TERMINAL}}),Object.defineProperty(exports,`DARK_THEME`,{enumerable:!0,get:function(){return t.DARK_THEME}}),Object.defineProperty(exports,`DEFAULT_DRAWING_STYLE`,{enumerable:!0,get:function(){return t.DEFAULT_DRAWING_STYLE}}),exports.DEFAULT_HISTORY_PAGE_SIZE=e.b,Object.defineProperty(exports,`DEFAULT_LEGEND_CONFIG`,{enumerable:!0,get:function(){return n.DEFAULT_LEGEND_CONFIG}}),Object.defineProperty(exports,`DEFAULT_RECONNECT`,{enumerable:!0,get:function(){return t.DEFAULT_RECONNECT}}),Object.defineProperty(exports,`DEFAULT_SESSION_HOURS`,{enumerable:!0,get:function(){return n.DEFAULT_SESSION_HOURS}}),Object.defineProperty(exports,`DEFAULT_SIGNAL_STYLE`,{enumerable:!0,get:function(){return t.DEFAULT_SIGNAL_STYLE}}),Object.defineProperty(exports,`DEFAULT_STREAM_CONFIG`,{enumerable:!0,get:function(){return t.DEFAULT_STREAM_CONFIG}}),Object.defineProperty(exports,`DEFAULT_TIMEFRAME_FAVORITES`,{enumerable:!0,get:function(){return t.DEFAULT_TIMEFRAME_FAVORITES}}),Object.defineProperty(exports,`DEFAULT_TRADE_ZONE_STYLE`,{enumerable:!0,get:function(){return t.DEFAULT_TRADE_ZONE_STYLE}}),Object.defineProperty(exports,`DEFAULT_TRADING_CONFIG`,{enumerable:!0,get:function(){return t.DEFAULT_TRADING_CONFIG}}),Object.defineProperty(exports,`DataExporter`,{enumerable:!0,get:function(){return n.DataExporter}}),exports.DataManager=e.S,exports.DepthChart=o,exports.DragDropImporter=e.o,Object.defineProperty(exports,`DrawingBase`,{enumerable:!0,get:function(){return n.DrawingBase}}),exports.EXCHANGE_TIMEZONE=e.l,Object.defineProperty(exports,`Easing`,{enumerable:!0,get:function(){return n.Easing}}),exports.EquityCurveChart=s,exports.GaugeChart=f,exports.HISTORY_RETRY_MS=e.x,exports.HeatmapChart=c,Object.defineProperty(exports,`IndicatorBase`,{enumerable:!0,get:function(){return n.IndicatorBase}}),Object.defineProperty(exports,`IndicatorValueMap`,{enumerable:!0,get:function(){return n.IndicatorValueMap}}),Object.defineProperty(exports,`KeyboardHandler`,{enumerable:!0,get:function(){return n.KeyboardHandler}}),Object.defineProperty(exports,`KrakenAdapter`,{enumerable:!0,get:function(){return n.KrakenAdapter}}),Object.defineProperty(exports,`LIGHT_THEME`,{enumerable:!0,get:function(){return t.LIGHT_THEME}}),exports.LayoutManager=e.v,exports.LayoutSession=e.t,Object.defineProperty(exports,`MARKET_CRYPTO`,{enumerable:!0,get:function(){return t.MARKET_CRYPTO}}),Object.defineProperty(exports,`MARKET_HNX`,{enumerable:!0,get:function(){return t.MARKET_HNX}}),Object.defineProperty(exports,`MARKET_HOSE`,{enumerable:!0,get:function(){return t.MARKET_HOSE}}),Object.defineProperty(exports,`MARKET_NYSE`,{enumerable:!0,get:function(){return t.MARKET_NYSE}}),Object.defineProperty(exports,`MARKET_UPCOM`,{enumerable:!0,get:function(){return t.MARKET_UPCOM}}),Object.defineProperty(exports,`MAX_ALERT_BARS`,{enumerable:!0,get:function(){return n.MAX_ALERT_BARS}}),exports.MAX_LAYOUT_NAME=e.n,Object.defineProperty(exports,`MIN_ALERT_BARS`,{enumerable:!0,get:function(){return n.MIN_ALERT_BARS}}),Object.defineProperty(exports,`MockAdapter`,{enumerable:!0,get:function(){return n.MockAdapter}}),exports.PLUGIN_API_VERSION=e.h,Object.defineProperty(exports,`PRICE_SOURCES`,{enumerable:!0,get:function(){return t.PRICE_SOURCES}}),Object.defineProperty(exports,`PaperExecutionAdapter`,{enumerable:!0,get:function(){return n.PaperExecutionAdapter}}),exports.PerformanceDashboard=x,exports.PluginManager=e.u,Object.defineProperty(exports,`PollingAdapter`,{enumerable:!0,get:function(){return n.PollingAdapter}}),Object.defineProperty(exports,`RANGE_PRESETS`,{enumerable:!0,get:function(){return n.RANGE_PRESETS}}),Object.defineProperty(exports,`ReplayManager`,{enumerable:!0,get:function(){return n.ReplayManager}}),Object.defineProperty(exports,`ResamplingAdapter`,{enumerable:!0,get:function(){return n.ResamplingAdapter}}),Object.defineProperty(exports,`Screenshot`,{enumerable:!0,get:function(){return n.Screenshot}}),Object.defineProperty(exports,`SessionBreaks`,{enumerable:!0,get:function(){return n.SessionBreaks}}),Object.defineProperty(exports,`SessionShading`,{enumerable:!0,get:function(){return n.SessionShading}}),Object.defineProperty(exports,`SignalMarkerManager`,{enumerable:!0,get:function(){return n.SignalMarkerManager}}),exports.SparklineChart=a,Object.defineProperty(exports,`StreamManager`,{enumerable:!0,get:function(){return n.StreamManager}}),Object.defineProperty(exports,`TC_PALETTE`,{enumerable:!0,get:function(){return t.TC_PALETTE}}),Object.defineProperty(exports,`TC_SERIES_COLORS`,{enumerable:!0,get:function(){return t.TC_SERIES_COLORS}}),Object.defineProperty(exports,`TIMEFRAMES_CRYPTO`,{enumerable:!0,get:function(){return t.TIMEFRAMES_CRYPTO}}),Object.defineProperty(exports,`TIMEFRAMES_FOREX`,{enumerable:!0,get:function(){return t.TIMEFRAMES_FOREX}}),Object.defineProperty(exports,`TIMEFRAMES_STOCK`,{enumerable:!0,get:function(){return t.TIMEFRAMES_STOCK}}),exports.ThemeManager=e.y,Object.defineProperty(exports,`TickAggregator`,{enumerable:!0,get:function(){return n.TickAggregator}}),Object.defineProperty(exports,`TickBarAdapter`,{enumerable:!0,get:function(){return n.TickBarAdapter}}),Object.defineProperty(exports,`TickBarBuilder`,{enumerable:!0,get:function(){return n.TickBarBuilder}}),Object.defineProperty(exports,`TradeZoneManager`,{enumerable:!0,get:function(){return n.TradeZoneManager}}),Object.defineProperty(exports,`UndoRedoManager`,{enumerable:!0,get:function(){return n.UndoRedoManager}}),Object.defineProperty(exports,`VN_COLORS`,{enumerable:!0,get:function(){return t.VN_COLORS}}),Object.defineProperty(exports,`VolumeRenderer`,{enumerable:!0,get:function(){return n.VolumeRenderer}}),exports.WaterfallChart=l,Object.defineProperty(exports,`Watermark`,{enumerable:!0,get:function(){return n.Watermark}}),Object.defineProperty(exports,`WebSocketAdapter`,{enumerable:!0,get:function(){return n.WebSocketAdapter}}),exports.cleanLayoutName=e.r,exports.clearGlobalPlugins=e.d,exports.computeDrawdownCurve=h,exports.computeMonthlyReturns=g,Object.defineProperty(exports,`computePriceLimits`,{enumerable:!0,get:function(){return t.computePriceLimits}}),Object.defineProperty(exports,`createVNTheme`,{enumerable:!0,get:function(){return t.createVNTheme}}),Object.defineProperty(exports,`formatFraction`,{enumerable:!0,get:function(){return t.formatFraction}}),Object.defineProperty(exports,`formatNumber`,{enumerable:!0,get:function(){return t.formatNumber}}),Object.defineProperty(exports,`formatTooltipTime`,{enumerable:!0,get:function(){return n.formatTooltipTime}}),Object.defineProperty(exports,`formatVND`,{enumerable:!0,get:function(){return t.formatVND}}),Object.defineProperty(exports,`formatVolumeLoc`,{enumerable:!0,get:function(){return t.formatVolumeLoc}}),Object.defineProperty(exports,`fractionTick`,{enumerable:!0,get:function(){return t.fractionTick}}),Object.defineProperty(exports,`getCurrentSession`,{enumerable:!0,get:function(){return t.getCurrentSession}}),exports.getGlobalPlugins=e.f,Object.defineProperty(exports,`getLocale`,{enumerable:!0,get:function(){return t.getLocale}}),Object.defineProperty(exports,`indicatorSource`,{enumerable:!0,get:function(){return t.indicatorSource}}),Object.defineProperty(exports,`isPriceLevelAlert`,{enumerable:!0,get:function(){return n.isPriceLevelAlert}}),Object.defineProperty(exports,`isPriceSource`,{enumerable:!0,get:function(){return t.isPriceSource}}),Object.defineProperty(exports,`isTimeFrame`,{enumerable:!0,get:function(){return t.isTimeFrame}}),Object.defineProperty(exports,`isValidTimeZone`,{enumerable:!0,get:function(){return t.isValidTimeZone}}),exports.localStorageLayouts=e.i,Object.defineProperty(exports,`lttbDownsample`,{enumerable:!0,get:function(){return n.lttbDownsample}}),Object.defineProperty(exports,`lttbVisibleIndices`,{enumerable:!0,get:function(){return n.lttbVisibleIndices}}),Object.defineProperty(exports,`marketStatus`,{enumerable:!0,get:function(){return t.marketStatus}}),exports.memoryLayouts=e.a,Object.defineProperty(exports,`normalizeBar`,{enumerable:!0,get:function(){return t.normalizeBar}}),Object.defineProperty(exports,`normalizeBarTime`,{enumerable:!0,get:function(){return t.normalizeBarTime}}),Object.defineProperty(exports,`offsetAt`,{enumerable:!0,get:function(){return t.offsetAt}}),exports.overlaysForLayer=e.g,Object.defineProperty(exports,`parseIndicatorSource`,{enumerable:!0,get:function(){return t.parseIndicatorSource}}),exports.parseOHLCV=e.s,Object.defineProperty(exports,`parseTimeframe`,{enumerable:!0,get:function(){return t.parseTimeframe}}),Object.defineProperty(exports,`pickBaseTimeframe`,{enumerable:!0,get:function(){return t.pickBaseTimeframe}}),exports.pluginKey=e._,Object.defineProperty(exports,`priceFormatterFor`,{enumerable:!0,get:function(){return t.priceFormatterFor}}),Object.defineProperty(exports,`rangePresetStart`,{enumerable:!0,get:function(){return n.rangePresetStart}}),Object.defineProperty(exports,`rankSymbols`,{enumerable:!0,get:function(){return t.rankSymbols}}),Object.defineProperty(exports,`readNews`,{enumerable:!0,get:function(){return t.readNews}}),Object.defineProperty(exports,`readQuote`,{enumerable:!0,get:function(){return t.readQuote}}),Object.defineProperty(exports,`registerLocale`,{enumerable:!0,get:function(){return t.registerLocale}}),exports.registerPlugin=e.p,Object.defineProperty(exports,`resampleBars`,{enumerable:!0,get:function(){return t.resampleBars}}),exports.selectKeyStats=y,Object.defineProperty(exports,`servesTimeframe`,{enumerable:!0,get:function(){return n.servesTimeframe}}),Object.defineProperty(exports,`setLocale`,{enumerable:!0,get:function(){return t.setLocale}}),Object.defineProperty(exports,`sourcePrice`,{enumerable:!0,get:function(){return t.sourcePrice}}),Object.defineProperty(exports,`stepDecimals`,{enumerable:!0,get:function(){return t.stepDecimals}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return t.t}}),Object.defineProperty(exports,`tickBarCount`,{enumerable:!0,get:function(){return t.tickBarCount}}),Object.defineProperty(exports,`timeframeToMs`,{enumerable:!0,get:function(){return t.timeframeToMs}}),exports.toEquityPoints=m,Object.defineProperty(exports,`toHeikinAshi`,{enumerable:!0,get:function(){return n.toHeikinAshi}}),Object.defineProperty(exports,`toKagi`,{enumerable:!0,get:function(){return n.toKagi}}),Object.defineProperty(exports,`toLineBreak`,{enumerable:!0,get:function(){return n.toLineBreak}}),Object.defineProperty(exports,`toPointAndFigure`,{enumerable:!0,get:function(){return n.toPointAndFigure}}),Object.defineProperty(exports,`toRangeBars`,{enumerable:!0,get:function(){return n.toRangeBars}}),Object.defineProperty(exports,`toRenko`,{enumerable:!0,get:function(){return n.toRenko}}),exports.unregisterPlugin=e.m,Object.defineProperty(exports,`wallToUtc`,{enumerable:!0,get:function(){return t.wallToUtc}}),Object.defineProperty(exports,`withResampling`,{enumerable:!0,get:function(){return n.withResampling}}),Object.defineProperty(exports,`withTickBars`,{enumerable:!0,get:function(){return n.withTickBars}}),Object.defineProperty(exports,`zoneOffsetMinutes`,{enumerable:!0,get:function(){return t.zoneOffsetMinutes}});
2
2
  //# sourceMappingURL=index.cjs.map