@363045841yyt/klinechart 0.6.5 → 0.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/index.cjs +13 -12
- package/dist/index.js +3796 -2671
- package/dist/klinechart.css +1 -1
- package/dist/src/config/chartSettings.d.ts +7 -1
- package/dist/src/core/indicators/indicator.worker.d.ts +5 -0
- package/dist/src/core/indicators/indicatorRuntime.d.ts +71 -0
- package/dist/src/core/indicators/scheduler.d.ts +62 -209
- package/dist/src/core/indicators/stateComposer.d.ts +65 -0
- package/dist/src/core/indicators/workerProtocol.d.ts +189 -0
- package/dist/src/core/renderers/Indicator/ene.d.ts +1 -2
- package/dist/src/core/renderers/Indicator/macd.d.ts +3 -2
- package/dist/src/core/renderers/Indicator/macdLegend.d.ts +5 -3
- package/dist/src/core/renderers/webgl/candleSurface.d.ts +19 -0
- package/dist/src/core/utils/zoom.d.ts +2 -2
- package/dist/src/debug/canvasProfiler.d.ts +6 -0
- package/dist/src/utils/dateFormat.d.ts +10 -8
- package/package.json +11 -9
package/dist/klinechart.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.kline-tooltip[data-v-d0fe85e6]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:200px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.kline-tooltip__title[data-v-d0fe85e6]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-d0fe85e6]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-d0fe85e6]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-d0fe85e6]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.kline-tooltip.use-anchor[data-v-d0fe85e6]{position-anchor:--kline-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.kline-tooltip.use-anchor.anchor-right-bottom[data-v-d0fe85e6]{transform:translate(14px,14px)}.kline-tooltip.use-anchor.anchor-left-bottom[data-v-d0fe85e6]{transform:translate(calc(-100% - 14px),14px)}}.marker-tooltip[data-v-5574cc25]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:180px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.marker-tooltip__title[data-v-5574cc25]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-5574cc25]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-5574cc25]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-5574cc25]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.marker-tooltip.use-anchor[data-v-5574cc25]{position-anchor:--marker-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.marker-tooltip.use-anchor.anchor-right-bottom[data-v-5574cc25]{transform:translate(12px,12px)}.marker-tooltip.use-anchor.anchor-left-bottom[data-v-5574cc25]{transform:translate(calc(-100% - 12px),12px)}}.params-overlay[data-v-bb1d1eb3]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.indicator-params[data-v-bb1d1eb3]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;width:90vw;min-width:340px;max-width:420px;overflow:hidden;box-shadow:0 8px 40px #00000026}.params-header[data-v-bb1d1eb3]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-bb1d1eb3]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-bb1d1eb3]{align-items:center;gap:8px;display:flex}.params-title[data-v-bb1d1eb3]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-bb1d1eb3]{color:#999;font-size:11px}.toggle-desc-btn[data-v-bb1d1eb3]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:all .2s;display:flex}.toggle-desc-btn[data-v-bb1d1eb3]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-bb1d1eb3]{width:14px;height:14px}.params-close[data-v-bb1d1eb3]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:background .15s,color .15s,border-color .15s;display:flex}.params-close[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-bb1d1eb3]{width:14px;height:14px}.indicator-description[data-v-bb1d1eb3]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-bb1d1eb3]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-bb1d1eb3]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-bb1d1eb3]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-bb1d1eb3]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-bb1d1eb3]{padding:10px 14px 8px}.param-header[data-v-bb1d1eb3]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-bb1d1eb3]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-bb1d1eb3]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-bb1d1eb3]{color:#999;font-size:11px}.param-description[data-v-bb1d1eb3]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-bb1d1eb3]{background:#fff;border:1px solid #d0d0d0;border-radius:7px;align-items:stretch;height:32px;transition:border-color .2s;display:flex;overflow:hidden}.input-wrapper[data-v-bb1d1eb3]:focus-within{border-color:#999}.stepper-btn[data-v-bb1d1eb3]{cursor:pointer;color:#666;background:#f0f0f0;border:none;flex-shrink:0;justify-content:center;align-items:center;width:28px;font-size:15px;font-weight:400;line-height:1;transition:background .15s,color .15s;display:flex}.stepper-btn[data-v-bb1d1eb3]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-bb1d1eb3]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-bb1d1eb3]{text-align:center;color:#1a1a1a;appearance:textfield;background:0 0;border:none;border-left:1px solid #e8e8e8;border-right:1px solid #e8e8e8;width:60px;font-size:13px;font-weight:600}.param-input[data-v-bb1d1eb3]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]:focus{outline:none}.params-footer[data-v-bb1d1eb3]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-bb1d1eb3]{gap:8px;display:flex}.params-btn[data-v-bb1d1eb3]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 14px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.params-btn svg[data-v-bb1d1eb3]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-bb1d1eb3]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-bb1d1eb3]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-bb1d1eb3]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-bb1d1eb3],.overlay-leave-active[data-v-bb1d1eb3]{transition:opacity .2s}.overlay-enter-from[data-v-bb1d1eb3],.overlay-leave-to[data-v-bb1d1eb3]{opacity:0}.modal-enter-active[data-v-bb1d1eb3]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-bb1d1eb3]{transition:all .16s ease-in}.modal-enter-from[data-v-bb1d1eb3]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-bb1d1eb3]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-bb1d1eb3],.slide-leave-active[data-v-bb1d1eb3]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-bb1d1eb3],.slide-leave-to[data-v-bb1d1eb3]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-f3fbebbd]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-f3fbebbd]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-f3fbebbd]::-webkit-scrollbar{display:none}.indicator-list[data-v-f3fbebbd]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-f3fbebbd]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-f3fbebbd]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-f3fbebbd],.indicator-item.draggable .indicator-btn[data-v-f3fbebbd],.indicator-item.draggable[data-v-f3fbebbd]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-f3fbebbd]{cursor:move}.indicator-item.is-dragging[data-v-f3fbebbd]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-f3fbebbd]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-f3fbebbd]{position:relative}.indicator-btn[data-v-f3fbebbd]{color:#666;cursor:pointer;white-space:nowrap;background:#fff;border:1px solid #e0e0e0;border-radius:16px;flex-shrink:0;justify-content:center;align-items:center;gap:4px;padding:6px 16px;font-size:13px;font-weight:500;transition:all .3s;display:flex;position:relative;overflow:hidden}.indicator-btn[data-v-f3fbebbd]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-f3fbebbd]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-f3fbebbd]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-f3fbebbd]{z-index:1;position:relative}.param-hint[data-v-f3fbebbd]{opacity:.85;font-size:11px}.hover-overlay[data-v-f3fbebbd]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2;background:#ffffffd9;border-radius:16px;justify-content:center;align-items:center;gap:4px;display:flex;position:absolute;inset:0}.action-btn[data-v-f3fbebbd]{color:#666;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:all .2s;display:flex}.action-btn[data-v-f3fbebbd]:hover{color:#333;background:#0000000f}.settings-btn[data-v-f3fbebbd]:hover{color:#1a1a1a}.remove-btn[data-v-f3fbebbd]:hover{color:#ff4d4f}.divider[data-v-f3fbebbd]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-f3fbebbd]{anchor-name:--indicator-add-btn;color:#999;cursor:pointer;background:0 0;border:1px dashed #d9d9d9;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;padding:0;transition:all .3s;display:flex}.add-btn[data-v-f3fbebbd]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-f3fbebbd]{white-space:nowrap;z-index:9999;background:#fff;border-radius:8px;padding:8px 0;position:fixed;transform:translate(-50%);box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.add-menu.use-anchor[data-v-f3fbebbd]{position-anchor:--indicator-add-btn;left:anchor(center);top:anchor(top);max-width:calc(100vw - 16px);position:fixed;transform:translate(-50%,calc(-100% - 8px))}}.menu-section[data-v-f3fbebbd]{padding:4px 0}.menu-section[data-v-f3fbebbd]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-f3fbebbd]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-f3fbebbd]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-f3fbebbd]{text-align:left;color:#333;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:8px 16px;font-size:13px;transition:background .2s;display:flex}.menu-item[data-v-f3fbebbd]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-f3fbebbd]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-f3fbebbd]{color:#999;font-size:11px}.active-tag[data-v-f3fbebbd]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-f3fbebbd],.fade-leave-active[data-v-f3fbebbd]{transition:opacity .2s}.fade-enter-from[data-v-f3fbebbd],.fade-leave-to[data-v-f3fbebbd]{opacity:0}.slide-enter-active[data-v-f3fbebbd],.slide-leave-active[data-v-f3fbebbd]{transition:all .2s}.slide-enter-from[data-v-f3fbebbd],.slide-leave-to[data-v-f3fbebbd]{opacity:0;transform:translate(-50%)translateY(8px)}.drawing-style-toolbar[data-v-92699cb2]{-webkit-backdrop-filter:blur(8px);z-index:100;-webkit-user-select:none;user-select:none;pointer-events:auto;background:#fafbfce0;border:1px solid #e5e7eb;border-radius:6px;align-items:center;gap:6px;height:32px;padding:4px 8px;display:flex;position:absolute;top:8px;left:50%;transform:translate(-50%);box-shadow:0 1px 3px #0000000f}.toolbar-item[data-v-92699cb2]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-92699cb2]{width:24px;height:24px;position:relative}.color-swatch[data-v-92699cb2]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-92699cb2]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-92699cb2]{color:#374151;cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:4px;outline:none;height:24px;padding:0 4px;font-size:12px}.toolbar-select[data-v-92699cb2]:hover{border-color:#9ca3af}.toolbar-btn[data-v-92699cb2]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex}.toolbar-btn[data-v-92699cb2]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-92699cb2]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-92699cb2]{width:14px;height:14px}.left-toolbar[data-v-3bc8355a]{box-sizing:border-box;-webkit-user-select:none;user-select:none;background:#fafbfc;border:1px solid #e5e7eb;border-radius:6px;flex-direction:column;flex:0 0 40px;align-items:center;gap:6px;padding:8px 5px;display:flex;box-shadow:0 1px 3px #0000000f}.left-toolbar__group[data-v-3bc8355a]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-3bc8355a]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-3bc8355a]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex;position:relative}.left-toolbar__button[data-v-3bc8355a]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-3bc8355a]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-3bc8355a]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-3bc8355a]{width:16px;height:16px}.corner-indicator[data-v-3bc8355a]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-3bc8355a]:after{content:"";opacity:.45;border-bottom:5px solid;border-left:5px solid #0000;width:0;height:0;transition:opacity .15s;position:absolute;bottom:0;right:0}.left-toolbar__button:hover .corner-indicator[data-v-3bc8355a]:after,.left-toolbar__button.active .corner-indicator[data-v-3bc8355a]:after{opacity:.7}.corner-indicator.open[data-v-3bc8355a]:after{opacity:.8}.tool-dropdown[data-v-3bc8355a]{-webkit-backdrop-filter:blur(8px);box-sizing:border-box;z-index:100;background:#fafbfcd1;border:1px solid #e5e7eb;border-radius:6px;flex-direction:row;align-items:center;gap:4px;height:40px;padding:0 5px;display:flex;position:absolute;top:50%;left:calc(100% + 13px);transform:translateY(-50%);box-shadow:0 1px 3px #0000000f}.tool-item[data-v-3bc8355a]{position:relative}.dropdown-enter-active[data-v-3bc8355a],.dropdown-leave-active[data-v-3bc8355a]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-3bc8355a],.dropdown-leave-to[data-v-3bc8355a]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-3bc8355a]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-3bc8355a]{gap:3px}.left-toolbar__button[data-v-3bc8355a]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-3bc8355a]{width:16px}.corner-indicator[data-v-3bc8355a]{width:7px;height:7px}.corner-indicator[data-v-3bc8355a]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-3bc8355a]{height:36px}}.settings-overlay[data-v-3bc8355a]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.settings-modal[data-v-3bc8355a]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;width:90vw;min-width:340px;max-width:420px;overflow:hidden;box-shadow:0 8px 40px #00000026}.settings-header[data-v-3bc8355a]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-3bc8355a]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-3bc8355a]{align-items:center;gap:8px;display:flex}.settings-title[data-v-3bc8355a]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-3bc8355a]{color:#999;font-size:11px}.settings-close[data-v-3bc8355a]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:background .15s,color .15s,border-color .15s;display:flex}.settings-close[data-v-3bc8355a]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-3bc8355a]{width:14px;height:14px}.settings-body[data-v-3bc8355a]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-3bc8355a]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-3bc8355a]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-3bc8355a]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-section-divider[data-v-3bc8355a]{align-items:center;gap:8px;margin-top:4px;display:flex}.settings-section-divider[data-v-3bc8355a]:before,.settings-section-divider[data-v-3bc8355a]:after{content:"";border-top:1px solid #e0e0e0;flex:1}.settings-section-label[data-v-3bc8355a]{color:#999;white-space:nowrap;font-size:11px}.settings-item.experimental[data-v-3bc8355a]{background:#fdf8f3;border-color:#f0e0d0}.settings-footer[data-v-3bc8355a]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-3bc8355a]{gap:8px;display:flex}.settings-btn[data-v-3bc8355a]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 14px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.settings-btn svg[data-v-3bc8355a]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-3bc8355a]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-3bc8355a]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-3bc8355a]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-3bc8355a]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-3bc8355a]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-3bc8355a]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-3bc8355a]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-e5d29a39]{--kmap-height:var(--kmap-chart-height,100%);--kmap-width:var(--kmap-chart-width,100%);width:var(--kmap-width);height:var(--kmap-height);flex-direction:column;justify-content:center;align-items:center;min-height:300px;display:flex}.chart-stage[data-v-e5d29a39]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-e5d29a39]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-e5d29a39]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-e5d29a39]{opacity:1;box-sizing:border-box;border-top:1px solid #e5e7eb;height:0;transition:border-top-color .12s,border-top-width .12s,margin-top .12s,opacity .12s;position:absolute;left:0;right:0}.pane-separator-line.is-active[data-v-e5d29a39]{border-top-width:2px;border-top-color:#3b82f6;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-e5d29a39],.chart-stage.is-hovering-pane-separator[data-v-e5d29a39]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-e5d29a39]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-e5d29a39]{cursor:ns-resize}.chart-stage.is-dragging[data-v-e5d29a39]{cursor:grabbing}.chart-container[data-v-e5d29a39]{height:100%;min-height:inherit;scrollbar-width:none;-ms-overflow-style:none;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-right:0;border-radius:6px 0 0 6px;flex:auto;position:relative;overflow:auto hidden}.chart-container[data-v-e5d29a39]::-webkit-scrollbar{display:none}.chart-container[data-v-e5d29a39]:hover{cursor:crosshair}.chart-stage.is-resizing-pane .chart-container[data-v-e5d29a39],.chart-stage.is-hovering-pane-separator .chart-container[data-v-e5d29a39]{cursor:ns-resize}.chart-stage.is-hovering-kline .chart-container[data-v-e5d29a39]{cursor:pointer}.chart-stage.is-dragging .chart-container[data-v-e5d29a39]{cursor:grabbing}.right-axis-host[data-v-e5d29a39]{height:100%;min-height:inherit;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-top-right-radius:6px;border-bottom-right-radius:6px;flex:none;position:relative;overflow:visible}.scroll-content[data-v-e5d29a39]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-e5d29a39]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-e5d29a39]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-e5d29a39]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-e5d29a39]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-e5d29a39]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-e5d29a39]{gap:6px}}.plot-canvas{display:block;position:absolute;top:0;left:0}.right-axis{display:block;position:absolute;left:0}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:0;left:0}.right-axis{z-index:15}
|
|
1
|
+
.kline-tooltip[data-v-d0fe85e6]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:200px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.kline-tooltip__title[data-v-d0fe85e6]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.kline-tooltip__grid[data-v-d0fe85e6]{grid-template-columns:1fr;gap:2px;display:grid}.kline-tooltip__grid .row[data-v-d0fe85e6]{justify-content:space-between;gap:10px;display:flex}.kline-tooltip__grid .row span[data-v-d0fe85e6]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.kline-tooltip.use-anchor[data-v-d0fe85e6]{position-anchor:--kline-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.kline-tooltip.use-anchor.anchor-right-bottom[data-v-d0fe85e6]{transform:translate(14px,14px)}.kline-tooltip.use-anchor.anchor-left-bottom[data-v-d0fe85e6]{transform:translate(calc(-100% - 14px),14px)}}.marker-tooltip[data-v-5574cc25]{z-index:10;color:#000000c7;pointer-events:none;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#ffffffeb;border:1px solid #0000001f;border-radius:8px;min-width:180px;max-width:260px;padding:10px 12px;font-size:12px;line-height:1.4;position:absolute;box-shadow:0 6px 18px #0000001f}.marker-tooltip__title[data-v-5574cc25]{justify-content:space-between;gap:10px;margin-bottom:6px;font-weight:600;display:flex}.marker-tooltip__content[data-v-5574cc25]{grid-template-columns:1fr;gap:2px;display:grid}.marker-tooltip__content .row[data-v-5574cc25]{justify-content:space-between;gap:10px;display:flex}.marker-tooltip__content .row span[data-v-5574cc25]:first-child{color:#0000008f}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.marker-tooltip.use-anchor[data-v-5574cc25]{position-anchor:--marker-tooltip-anchor;left:anchor(left);top:anchor(top);position:absolute}.marker-tooltip.use-anchor.anchor-right-bottom[data-v-5574cc25]{transform:translate(12px,12px)}.marker-tooltip.use-anchor.anchor-left-bottom[data-v-5574cc25]{transform:translate(calc(-100% - 12px),12px)}}.params-overlay[data-v-bb1d1eb3]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.indicator-params[data-v-bb1d1eb3]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;width:90vw;min-width:340px;max-width:420px;overflow:hidden;box-shadow:0 8px 40px #00000026}.params-header[data-v-bb1d1eb3]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-bb1d1eb3]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-bb1d1eb3]{align-items:center;gap:8px;display:flex}.params-title[data-v-bb1d1eb3]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.params-subtitle[data-v-bb1d1eb3]{color:#999;font-size:11px}.toggle-desc-btn[data-v-bb1d1eb3]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:all .2s;display:flex}.toggle-desc-btn[data-v-bb1d1eb3]:hover{color:#555;background:#f0f0f0;border-color:#ccc}.toggle-desc-btn.active[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.toggle-desc-btn svg[data-v-bb1d1eb3]{width:14px;height:14px}.params-close[data-v-bb1d1eb3]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:background .15s,color .15s,border-color .15s;display:flex}.params-close[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.params-close svg[data-v-bb1d1eb3]{width:14px;height:14px}.indicator-description[data-v-bb1d1eb3]{background:#f0f7ff;border-bottom:1px solid #d6e8f5;padding:12px 20px}.indicator-description p[data-v-bb1d1eb3]{color:#2c5282;margin:0;font-size:12px;line-height:1.6}.params-body[data-v-bb1d1eb3]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.param-item[data-v-bb1d1eb3]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:10px 14px;transition:border-color .2s}.param-item[data-v-bb1d1eb3]:has(.param-input:focus){border-color:#bbb}.param-item.has-desc[data-v-bb1d1eb3]{padding:10px 14px 8px}.param-header[data-v-bb1d1eb3]{justify-content:space-between;align-items:center;gap:16px;display:flex}.param-label[data-v-bb1d1eb3]{flex-direction:column;gap:3px;display:flex}.param-label-text[data-v-bb1d1eb3]{color:#333;font-size:13px;font-weight:500}.param-range[data-v-bb1d1eb3]{color:#999;font-size:11px}.param-description[data-v-bb1d1eb3]{color:#666;border-top:1px dashed #e0e0e0;margin-top:8px;padding-top:8px;font-size:11px;line-height:1.5}.input-wrapper[data-v-bb1d1eb3]{background:#fff;border:1px solid #d0d0d0;border-radius:7px;align-items:stretch;height:32px;transition:border-color .2s;display:flex;overflow:hidden}.input-wrapper[data-v-bb1d1eb3]:focus-within{border-color:#999}.stepper-btn[data-v-bb1d1eb3]{cursor:pointer;color:#666;background:#f0f0f0;border:none;flex-shrink:0;justify-content:center;align-items:center;width:28px;font-size:15px;font-weight:400;line-height:1;transition:background .15s,color .15s;display:flex}.stepper-btn[data-v-bb1d1eb3]:hover:not(:disabled){color:#333;background:#e0e0e0}.stepper-btn[data-v-bb1d1eb3]:disabled{color:#ccc;cursor:not-allowed}.param-input[data-v-bb1d1eb3]{text-align:center;color:#1a1a1a;appearance:textfield;background:0 0;border:none;border-left:1px solid #e8e8e8;border-right:1px solid #e8e8e8;width:60px;font-size:13px;font-weight:600}.param-input[data-v-bb1d1eb3]::-webkit-inner-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]::-webkit-outer-spin-button{-webkit-appearance:none}.param-input[data-v-bb1d1eb3]:focus{outline:none}.params-footer[data-v-bb1d1eb3]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-bb1d1eb3]{gap:8px;display:flex}.params-btn[data-v-bb1d1eb3]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 14px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.params-btn svg[data-v-bb1d1eb3]{flex-shrink:0;width:12px;height:12px}.params-btn.reset[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.reset[data-v-bb1d1eb3]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.params-btn.cancel[data-v-bb1d1eb3]{color:#666;background:0 0;border-color:#d0d0d0}.params-btn.cancel[data-v-bb1d1eb3]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.params-btn.confirm[data-v-bb1d1eb3]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.params-btn.confirm[data-v-bb1d1eb3]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.params-btn.confirm[data-v-bb1d1eb3]:active{box-shadow:none;transform:translateY(0)}.overlay-enter-active[data-v-bb1d1eb3],.overlay-leave-active[data-v-bb1d1eb3]{transition:opacity .2s}.overlay-enter-from[data-v-bb1d1eb3],.overlay-leave-to[data-v-bb1d1eb3]{opacity:0}.modal-enter-active[data-v-bb1d1eb3]{transition:all .22s cubic-bezier(.34,1.56,.64,1)}.modal-leave-active[data-v-bb1d1eb3]{transition:all .16s ease-in}.modal-enter-from[data-v-bb1d1eb3]{opacity:0;transform:scale(.88)translateY(-16px)}.modal-leave-to[data-v-bb1d1eb3]{opacity:0;transform:scale(.94)translateY(8px)}.slide-enter-active[data-v-bb1d1eb3],.slide-leave-active[data-v-bb1d1eb3]{transition:all .2s;overflow:hidden}.slide-enter-from[data-v-bb1d1eb3],.slide-leave-to[data-v-bb1d1eb3]{opacity:0;max-height:0;margin-top:0;padding-top:0;padding-bottom:0}.indicator-selector[data-v-f3fbebbd]{width:80%;margin:20px;position:relative}.indicator-scroll-container[data-v-f3fbebbd]{scrollbar-width:none;-webkit-overflow-scrolling:touch;text-align:center;width:100%;overflow:auto hidden}.indicator-scroll-container[data-v-f3fbebbd]::-webkit-scrollbar{display:none}.indicator-list[data-v-f3fbebbd]{gap:8px;margin:0 auto;padding:2px;display:inline-flex}.indicator-divider[data-v-f3fbebbd]{background:#d9d9d9;align-self:center;width:1px;height:20px}.indicator-item[data-v-f3fbebbd]{align-items:center;gap:4px;display:flex}.indicator-item.draggable[data-v-f3fbebbd],.indicator-item.draggable .indicator-btn[data-v-f3fbebbd],.indicator-item.draggable[data-v-f3fbebbd]:hover,.indicator-item.draggable:hover .indicator-btn[data-v-f3fbebbd]{cursor:move}.indicator-item.is-dragging[data-v-f3fbebbd]{opacity:.6}.indicator-item.drag-over .indicator-btn[data-v-f3fbebbd]{border-color:#1a1a1a;box-shadow:0 0 0 2px #1a1a1a1f}.indicator-btn-wrapper[data-v-f3fbebbd]{position:relative}.indicator-btn[data-v-f3fbebbd]{color:#666;cursor:pointer;white-space:nowrap;background:#fff;border:1px solid #e0e0e0;border-radius:16px;flex-shrink:0;justify-content:center;align-items:center;gap:4px;padding:6px 16px;font-size:13px;font-weight:500;transition:all .3s;display:flex;position:relative;overflow:hidden}.indicator-btn[data-v-f3fbebbd]:hover:not(.hovering){color:#333;background:#f8f8f8;border-color:#ccc}.indicator-btn.active[data-v-f3fbebbd]{color:#1a1a1a;background:#f8f8f8;border-color:#1a1a1a}.indicator-btn.active[data-v-f3fbebbd]:hover:not(.hovering){background:#f0f0f0;border-color:#333}.btn-content[data-v-f3fbebbd]{z-index:1;position:relative}.param-hint[data-v-f3fbebbd]{opacity:.85;font-size:11px}.hover-overlay[data-v-f3fbebbd]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:2;background:#ffffffd9;border-radius:16px;justify-content:center;align-items:center;gap:4px;display:flex;position:absolute;inset:0}.action-btn[data-v-f3fbebbd]{color:#666;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:all .2s;display:flex}.action-btn[data-v-f3fbebbd]:hover{color:#333;background:#0000000f}.settings-btn[data-v-f3fbebbd]:hover{color:#1a1a1a}.remove-btn[data-v-f3fbebbd]:hover{color:#ff4d4f}.divider[data-v-f3fbebbd]{background:#e0e0e0;width:1px;height:14px}.add-btn[data-v-f3fbebbd]{anchor-name:--indicator-add-btn;color:#999;cursor:pointer;background:0 0;border:1px dashed #d9d9d9;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;padding:0;transition:all .3s;display:flex}.add-btn[data-v-f3fbebbd]:hover{color:#1a1a1a;background:#1a1a1a0a;border-color:#1a1a1a}.add-menu[data-v-f3fbebbd]{white-space:nowrap;z-index:9999;background:#fff;border-radius:8px;padding:8px 0;position:fixed;transform:translate(-50%);box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d}@supports (anchor-name:--kmap-anchor) and (position-anchor:--kmap-anchor){.add-menu.use-anchor[data-v-f3fbebbd]{position-anchor:--indicator-add-btn;left:anchor(center);top:anchor(top);max-width:calc(100vw - 16px);position:fixed;transform:translate(-50%,calc(-100% - 8px))}}.menu-section[data-v-f3fbebbd]{padding:4px 0}.menu-section[data-v-f3fbebbd]:not(:last-child){border-bottom:1px solid #f0f0f0}.menu-title[data-v-f3fbebbd]{color:#999;padding:4px 16px;font-size:12px;font-weight:500}.menu-items[data-v-f3fbebbd]{flex-direction:column;gap:2px;display:flex}.menu-item[data-v-f3fbebbd]{text-align:left;color:#333;cursor:pointer;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:8px 16px;font-size:13px;transition:background .2s;display:flex}.menu-item[data-v-f3fbebbd]:hover:not(.disabled){background:#f5f5f5}.menu-item.disabled[data-v-f3fbebbd]{color:#999;cursor:not-allowed}.menu-item .param-hint[data-v-f3fbebbd]{color:#999;font-size:11px}.active-tag[data-v-f3fbebbd]{color:#1a1a1a;align-items:center;margin-left:auto;display:flex}.fade-enter-active[data-v-f3fbebbd],.fade-leave-active[data-v-f3fbebbd]{transition:opacity .2s}.fade-enter-from[data-v-f3fbebbd],.fade-leave-to[data-v-f3fbebbd]{opacity:0}.slide-enter-active[data-v-f3fbebbd],.slide-leave-active[data-v-f3fbebbd]{transition:all .2s}.slide-enter-from[data-v-f3fbebbd],.slide-leave-to[data-v-f3fbebbd]{opacity:0;transform:translate(-50%)translateY(8px)}.drawing-style-toolbar[data-v-92699cb2]{-webkit-backdrop-filter:blur(8px);z-index:100;-webkit-user-select:none;user-select:none;pointer-events:auto;background:#fafbfce0;border:1px solid #e5e7eb;border-radius:6px;align-items:center;gap:6px;height:32px;padding:4px 8px;display:flex;position:absolute;top:8px;left:50%;transform:translate(-50%);box-shadow:0 1px 3px #0000000f}.toolbar-item[data-v-92699cb2]{justify-content:center;align-items:center;display:inline-flex}.color-item[data-v-92699cb2]{width:24px;height:24px;position:relative}.color-swatch[data-v-92699cb2]{cursor:pointer;border:1px solid #d1d5db;border-radius:4px;width:100%;height:100%;display:block}.color-input[data-v-92699cb2]{opacity:0;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.toolbar-select[data-v-92699cb2]{color:#374151;cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:4px;outline:none;height:24px;padding:0 4px;font-size:12px}.toolbar-select[data-v-92699cb2]:hover{border-color:#9ca3af}.toolbar-btn[data-v-92699cb2]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:24px;height:24px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex}.toolbar-btn[data-v-92699cb2]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.delete-btn[data-v-92699cb2]:hover{color:#dc2626;background:#fef2f2;border-color:#fca5a5}.delete-icon[data-v-92699cb2]{width:14px;height:14px}.left-toolbar[data-v-c2895763]{box-sizing:border-box;-webkit-user-select:none;user-select:none;background:#fafbfc;border:1px solid #e5e7eb;border-radius:6px;flex-direction:column;flex:0 0 40px;align-items:center;gap:6px;padding:8px 5px;display:flex;box-shadow:0 1px 3px #0000000f}.left-toolbar__group[data-v-c2895763]{flex-direction:column;gap:4px;display:flex}.left-toolbar__divider[data-v-c2895763]{background:#e5e7eb;width:18px;height:1px}.left-toolbar__button[data-v-c2895763]{color:#6b7280;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:border-color .15s,background .15s,color .15s;display:inline-flex;position:relative}.left-toolbar__button[data-v-c2895763]:hover{color:#374151;background:#f3f4f6;border-color:#d1d5db}.left-toolbar__button.active[data-v-c2895763]{color:#1f2937;background:#e5e7eb;border-color:#9ca3af}.left-toolbar__button[data-v-c2895763]:focus-visible{border-color:#6b7280;outline:none}.tool-icon[data-v-c2895763]{width:16px;height:16px}.corner-indicator[data-v-c2895763]{cursor:pointer;width:8px;height:8px;position:absolute;bottom:0;right:0;overflow:hidden}.corner-indicator[data-v-c2895763]:after{content:"";opacity:.45;border-bottom:5px solid;border-left:5px solid #0000;width:0;height:0;transition:opacity .15s;position:absolute;bottom:0;right:0}.left-toolbar__button:hover .corner-indicator[data-v-c2895763]:after,.left-toolbar__button.active .corner-indicator[data-v-c2895763]:after{opacity:.7}.corner-indicator.open[data-v-c2895763]:after{opacity:.8}.tool-dropdown[data-v-c2895763]{-webkit-backdrop-filter:blur(8px);box-sizing:border-box;z-index:100;background:#fafbfcd1;border:1px solid #e5e7eb;border-radius:6px;flex-direction:row;align-items:center;gap:4px;height:40px;padding:0 5px;display:flex;position:absolute;top:50%;left:calc(100% + 13px);transform:translateY(-50%);box-shadow:0 1px 3px #0000000f}.tool-item[data-v-c2895763]{position:relative}.dropdown-enter-active[data-v-c2895763],.dropdown-leave-active[data-v-c2895763]{transition:opacity .15s,transform .15s}.dropdown-enter-from[data-v-c2895763],.dropdown-leave-to[data-v-c2895763]{opacity:0;transform:translateY(-50%)translate(-6px)}@media (width<=768px),(height<=640px){.left-toolbar[data-v-c2895763]{border-radius:5px;flex-basis:36px;gap:5px;padding:6px 4px}.left-toolbar__group[data-v-c2895763]{gap:3px}.left-toolbar__button[data-v-c2895763]{border-radius:3px;width:26px;height:26px}.left-toolbar__divider[data-v-c2895763]{width:16px}.corner-indicator[data-v-c2895763]{width:7px;height:7px}.corner-indicator[data-v-c2895763]:after{border-bottom-width:4px;border-left-width:4px}.tool-dropdown[data-v-c2895763]{height:36px}}.settings-overlay[data-v-c2895763]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.settings-modal[data-v-c2895763]{background:#fff;border:1px solid #e0e0e0;border-radius:12px;width:90vw;min-width:340px;max-width:420px;overflow:hidden;box-shadow:0 8px 40px #00000026}.settings-header[data-v-c2895763]{background:#f8f8f8;border-bottom:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.header-left[data-v-c2895763]{align-items:baseline;gap:8px;display:flex}.header-right[data-v-c2895763]{align-items:center;gap:8px;display:flex}.settings-title[data-v-c2895763]{color:#1a1a1a;letter-spacing:.2px;font-size:14px;font-weight:600}.settings-subtitle[data-v-c2895763]{color:#999;font-size:11px}.settings-close[data-v-c2895763]{cursor:pointer;color:#888;background:#fff;border:1px solid #e0e0e0;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;transition:background .15s,color .15s,border-color .15s;display:flex}.settings-close[data-v-c2895763]:hover{color:#333;background:#f0f0f0;border-color:#ccc}.settings-close svg[data-v-c2895763]{width:14px;height:14px}.settings-body[data-v-c2895763]{flex-direction:column;gap:10px;padding:16px 20px;display:flex}.settings-item[data-v-c2895763]{background:#f8f8f8;border:1px solid #e8e8e8;border-radius:8px;padding:8px 12px}.settings-label[data-v-c2895763]{color:#333;cursor:pointer;justify-content:space-between;align-items:center;font-size:13px;display:flex}.settings-checkbox[data-v-c2895763]{cursor:pointer;accent-color:#1a1a1a;width:16px;height:16px}.settings-section-divider[data-v-c2895763]{align-items:center;gap:8px;margin-top:4px;display:flex}.settings-section-divider[data-v-c2895763]:before,.settings-section-divider[data-v-c2895763]:after{content:"";border-top:1px solid #e0e0e0;flex:1}.settings-section-label[data-v-c2895763]{color:#999;white-space:nowrap;font-size:11px}.settings-item.experimental[data-v-c2895763]{background:#fdf8f3;border-color:#f0e0d0}.settings-footer[data-v-c2895763]{background:#f8f8f8;border-top:1px solid #e8e8e8;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.footer-right[data-v-c2895763]{gap:8px;display:flex}.settings-btn[data-v-c2895763]{cursor:pointer;border:1px solid #0000;border-radius:7px;align-items:center;gap:5px;padding:6px 14px;font-size:13px;font-weight:500;line-height:1.4;transition:all .15s;display:flex}.settings-btn svg[data-v-c2895763]{flex-shrink:0;width:12px;height:12px}.settings-btn.reset[data-v-c2895763]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.reset[data-v-c2895763]:hover{color:#e74c3c;background:#e74c3c14;border-color:#c0392b}.settings-btn.cancel[data-v-c2895763]{color:#666;background:0 0;border-color:#d0d0d0}.settings-btn.cancel[data-v-c2895763]:hover{color:#333;background:#f0f0f0;border-color:#bbb}.settings-btn.confirm[data-v-c2895763]{color:#fff;background:#1a1a1a;border-color:#1a1a1a}.settings-btn.confirm[data-v-c2895763]:hover{background:#333;border-color:#333;transform:translateY(-1px);box-shadow:0 2px 10px #00000026}.settings-btn.confirm[data-v-c2895763]:active{box-shadow:none;transform:translateY(0)}.chart-wrapper[data-v-c0f19dd6]{--kmap-height:var(--kmap-chart-height,100%);--kmap-width:var(--kmap-chart-width,100%);width:var(--kmap-width);height:var(--kmap-height);flex-direction:column;justify-content:center;align-items:center;min-height:300px;display:flex}.chart-stage[data-v-c0f19dd6]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-c0f19dd6]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-c0f19dd6]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-c0f19dd6]{opacity:1;box-sizing:border-box;border-top:1px solid #e5e7eb;height:0;transition:border-top-color .12s,border-top-width .12s,margin-top .12s,opacity .12s;position:absolute;left:0;right:0}.pane-separator-line.is-active[data-v-c0f19dd6]{border-top-width:2px;border-top-color:#3b82f6;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-c0f19dd6],.chart-stage.is-hovering-pane-separator[data-v-c0f19dd6]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-c0f19dd6]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-c0f19dd6]{cursor:ns-resize}.chart-stage.is-dragging[data-v-c0f19dd6]{cursor:grabbing}.chart-container[data-v-c0f19dd6]{height:100%;min-height:inherit;scrollbar-width:none;-ms-overflow-style:none;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-right:0;border-radius:6px 0 0 6px;flex:auto;position:relative;overflow:auto hidden}.chart-container[data-v-c0f19dd6]::-webkit-scrollbar{display:none}.chart-container[data-v-c0f19dd6]:hover{cursor:crosshair}.chart-stage.is-resizing-pane .chart-container[data-v-c0f19dd6],.chart-stage.is-hovering-pane-separator .chart-container[data-v-c0f19dd6]{cursor:ns-resize}.chart-stage.is-hovering-kline .chart-container[data-v-c0f19dd6]{cursor:pointer}.chart-stage.is-dragging .chart-container[data-v-c0f19dd6]{cursor:grabbing}.right-axis-host[data-v-c0f19dd6]{height:100%;min-height:inherit;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;background:#fff;border:1px solid #e5e7eb;border-top-right-radius:6px;border-bottom-right-radius:6px;flex:none;position:relative;overflow:visible}.scroll-content[data-v-c0f19dd6]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-c0f19dd6]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-c0f19dd6]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-c0f19dd6]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-c0f19dd6]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-c0f19dd6]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-c0f19dd6]{gap:6px}}.plot-canvas{display:block;position:absolute;top:0;left:0}.right-axis{display:block;position:absolute;left:0}.x-axis-canvas{z-index:10;display:block;position:absolute;bottom:0;left:0}.right-axis{z-index:15}
|
|
2
2
|
/*$vite$:1*/
|
|
@@ -36,13 +36,19 @@ export declare const DEFAULT_SETTINGS: readonly [{
|
|
|
36
36
|
readonly label: "主图纵轴刻度自适应调整";
|
|
37
37
|
readonly type: "boolean";
|
|
38
38
|
readonly default: true;
|
|
39
|
-
readonly group: "
|
|
39
|
+
readonly group: "main";
|
|
40
40
|
}, {
|
|
41
41
|
readonly key: "performanceTest10kKlines";
|
|
42
42
|
readonly label: "万条K线性能测试";
|
|
43
43
|
readonly type: "boolean";
|
|
44
44
|
readonly default: false;
|
|
45
45
|
readonly group: "experimental";
|
|
46
|
+
}, {
|
|
47
|
+
readonly key: "enableCanvasProfiler";
|
|
48
|
+
readonly label: "Canvas 性能分析插桩";
|
|
49
|
+
readonly type: "boolean";
|
|
50
|
+
readonly default: false;
|
|
51
|
+
readonly group: "experimental";
|
|
46
52
|
}];
|
|
47
53
|
/** 图表设置类型(从 DEFAULT_SETTINGS 自动推导,同时兼容扩展) */
|
|
48
54
|
export type ChartSettings = {
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { KLineData } from '../../types/price';
|
|
2
|
+
import { IndicatorConfigSnapshot, IndicatorSeriesBundle } from './workerProtocol';
|
|
3
|
+
/**
|
|
4
|
+
* 计算运行时
|
|
5
|
+
* 管理数据、配置、缓存和脏标记
|
|
6
|
+
*/
|
|
7
|
+
export declare class IndicatorRuntime {
|
|
8
|
+
private currentData;
|
|
9
|
+
private dataVersion;
|
|
10
|
+
private config;
|
|
11
|
+
private configVersion;
|
|
12
|
+
private cachedSeries;
|
|
13
|
+
private cachedBollSeries;
|
|
14
|
+
private cachedExpmaSeries;
|
|
15
|
+
private cachedEneSeries;
|
|
16
|
+
private cachedRsiSeries;
|
|
17
|
+
private cachedCciSeries;
|
|
18
|
+
private cachedStochSeries;
|
|
19
|
+
private cachedMomSeries;
|
|
20
|
+
private cachedWmsrSeries;
|
|
21
|
+
private cachedKstSeries;
|
|
22
|
+
private cachedFastkSeries;
|
|
23
|
+
private cachedMacdSeries;
|
|
24
|
+
private dirtyData;
|
|
25
|
+
private dirtyMAConfig;
|
|
26
|
+
private dirtyBollConfig;
|
|
27
|
+
private dirtyExpmaConfig;
|
|
28
|
+
private dirtyEneConfig;
|
|
29
|
+
private dirtyRsiConfig;
|
|
30
|
+
private dirtyCciConfig;
|
|
31
|
+
private dirtyStochConfig;
|
|
32
|
+
private dirtyMomConfig;
|
|
33
|
+
private dirtyWmsrConfig;
|
|
34
|
+
private dirtyKstConfig;
|
|
35
|
+
private dirtyFastkConfig;
|
|
36
|
+
private dirtyMacdConfig;
|
|
37
|
+
private getDefaultConfig;
|
|
38
|
+
/**
|
|
39
|
+
* 更新数据
|
|
40
|
+
*/
|
|
41
|
+
setData(data: KLineData[], version: number): void;
|
|
42
|
+
/**
|
|
43
|
+
* 更新配置
|
|
44
|
+
*/
|
|
45
|
+
private shallowEqual;
|
|
46
|
+
/**
|
|
47
|
+
* 更新配置(仅值变更时才设置脏标记)
|
|
48
|
+
*/
|
|
49
|
+
setConfig(config: Partial<IndicatorConfigSnapshot>, version: number): void;
|
|
50
|
+
/**
|
|
51
|
+
* 强制所有指标标记为脏(用于 recompute)
|
|
52
|
+
*/
|
|
53
|
+
forceDirty(): void;
|
|
54
|
+
/**
|
|
55
|
+
* 获取当前数据版本
|
|
56
|
+
*/
|
|
57
|
+
getDataVersion(): number;
|
|
58
|
+
/**
|
|
59
|
+
* 获取当前配置版本
|
|
60
|
+
*/
|
|
61
|
+
getConfigVersion(): number;
|
|
62
|
+
/**
|
|
63
|
+
* 计算所有指标的 series(如果脏了)
|
|
64
|
+
* 返回结果包,供主线程组装成 render states
|
|
65
|
+
*/
|
|
66
|
+
computeSeries(): IndicatorSeriesBundle;
|
|
67
|
+
/**
|
|
68
|
+
* 获取缓存的 series(用于 visibleRange 变更时扫描极值)
|
|
69
|
+
*/
|
|
70
|
+
getCachedSeries(): IndicatorSeriesBundle;
|
|
71
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PluginHost } from '../../plugin';
|
|
2
2
|
import { KLineData } from '../../types/price';
|
|
3
|
+
import { BOLLSchedulerConfig, EXPMASchedulerConfig, ENESchedulerConfig, RSISchedulerConfig, CCISchedulerConfig, STOCHSchedulerConfig, MOMSchedulerConfig, WMSRSchedulerConfig, KSTSchedulerConfig, FASTKSchedulerConfig, MACDSchedulerConfig } from './workerProtocol';
|
|
3
4
|
import { MAFlags } from './calculators';
|
|
4
|
-
import { MACDSchedulerConfig } from './macdState';
|
|
5
5
|
/**
|
|
6
6
|
* 可见范围
|
|
7
7
|
*/
|
|
@@ -9,270 +9,123 @@ interface VisibleRange {
|
|
|
9
9
|
start: number;
|
|
10
10
|
end: number;
|
|
11
11
|
}
|
|
12
|
+
export type { BOLLSchedulerConfig, EXPMASchedulerConfig, ENESchedulerConfig, RSISchedulerConfig, CCISchedulerConfig, STOCHSchedulerConfig, MOMSchedulerConfig, WMSRSchedulerConfig, KSTSchedulerConfig, FASTKSchedulerConfig, MACDSchedulerConfig, };
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
-
*/
|
|
15
|
-
export interface BOLLSchedulerConfig {
|
|
16
|
-
period: number;
|
|
17
|
-
multiplier: number;
|
|
18
|
-
showUpper: boolean;
|
|
19
|
-
showMiddle: boolean;
|
|
20
|
-
showLower: boolean;
|
|
21
|
-
showBand: boolean;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* EXPMA 调度器配置
|
|
25
|
-
*/
|
|
26
|
-
export interface EXPMASchedulerConfig {
|
|
27
|
-
fastPeriod: number;
|
|
28
|
-
slowPeriod: number;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* ENE 调度器配置
|
|
32
|
-
*/
|
|
33
|
-
export interface ENESchedulerConfig {
|
|
34
|
-
period: number;
|
|
35
|
-
deviation: number;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* RSI 调度器配置
|
|
39
|
-
*/
|
|
40
|
-
export interface RSISchedulerConfig {
|
|
41
|
-
period1: number;
|
|
42
|
-
period2: number;
|
|
43
|
-
period3: number;
|
|
44
|
-
showRSI1: boolean;
|
|
45
|
-
showRSI2: boolean;
|
|
46
|
-
showRSI3: boolean;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* CCI 调度器配置
|
|
50
|
-
*/
|
|
51
|
-
export interface CCISchedulerConfig {
|
|
52
|
-
period: number;
|
|
53
|
-
showCCI: boolean;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* STOCH 调度器配置
|
|
57
|
-
*/
|
|
58
|
-
export interface STOCHSchedulerConfig {
|
|
59
|
-
n: number;
|
|
60
|
-
m: number;
|
|
61
|
-
showK: boolean;
|
|
62
|
-
showD: boolean;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* MOM 调度器配置
|
|
66
|
-
*/
|
|
67
|
-
export interface MOMSchedulerConfig {
|
|
68
|
-
period: number;
|
|
69
|
-
showMOM: boolean;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* WMSR 调度器配置
|
|
73
|
-
*/
|
|
74
|
-
export interface WMSRSchedulerConfig {
|
|
75
|
-
period: number;
|
|
76
|
-
showWMSR: boolean;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* KST 调度器配置
|
|
80
|
-
*/
|
|
81
|
-
export interface KSTSchedulerConfig {
|
|
82
|
-
roc1: number;
|
|
83
|
-
roc2: number;
|
|
84
|
-
roc3: number;
|
|
85
|
-
roc4: number;
|
|
86
|
-
signalPeriod: number;
|
|
87
|
-
showKST: boolean;
|
|
88
|
-
showSignal: boolean;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* FASTK 调度器配置
|
|
92
|
-
*/
|
|
93
|
-
export interface FASTKSchedulerConfig {
|
|
94
|
-
period: number;
|
|
95
|
-
showFASTK: boolean;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* 指标调度器
|
|
99
|
-
*
|
|
100
|
-
* 职责:
|
|
101
|
-
* 1. 维护当前图表激活的指标配置
|
|
102
|
-
* 2. 在数据/视口/配置变更时触发计算
|
|
103
|
-
* 3. 将计算结果写入 StateStore,供渲染器消费
|
|
104
|
-
*
|
|
105
|
-
* 优化策略:
|
|
106
|
-
* - 双脏标记(dirtyData/dirtyRange):数据变更重算 series + 极值,视口变更仅重算极值
|
|
107
|
-
* - cachedSeries 缓存:视口变更时复用已计算的 series,避免 O(n) 重算
|
|
14
|
+
* IndicatorScheduler - 主线程 facade
|
|
108
15
|
*/
|
|
109
16
|
export declare class IndicatorScheduler {
|
|
110
17
|
private pluginHost;
|
|
111
|
-
private currentData;
|
|
112
|
-
private maConfig;
|
|
113
18
|
private visibleRange;
|
|
114
|
-
private cachedSeries;
|
|
115
|
-
private bollConfig;
|
|
116
|
-
private cachedBollSeries;
|
|
117
|
-
private expmaConfig;
|
|
118
|
-
private cachedExpmaSeries;
|
|
119
|
-
private eneConfig;
|
|
120
|
-
private cachedEneSeries;
|
|
121
|
-
private rsiConfig;
|
|
122
|
-
private rsiPaneId;
|
|
123
|
-
private cachedRsiSeries;
|
|
124
|
-
private cciConfig;
|
|
125
|
-
private cciPaneId;
|
|
126
|
-
private cachedCciSeries;
|
|
127
|
-
private stochConfig;
|
|
128
|
-
private stochPaneId;
|
|
129
|
-
private cachedStochSeries;
|
|
130
|
-
private momConfig;
|
|
131
|
-
private momPaneId;
|
|
132
|
-
private cachedMomSeries;
|
|
133
|
-
private wmsrConfig;
|
|
134
|
-
private wmsrPaneId;
|
|
135
|
-
private cachedWmsrSeries;
|
|
136
|
-
private kstConfig;
|
|
137
|
-
private kstPaneId;
|
|
138
|
-
private cachedKstSeries;
|
|
139
|
-
private fastkConfig;
|
|
140
|
-
private fastkPaneId;
|
|
141
|
-
private cachedFastkSeries;
|
|
142
|
-
private macdConfig;
|
|
143
|
-
private macdPaneId;
|
|
144
|
-
private cachedMacdSeries;
|
|
145
|
-
private dirtyData;
|
|
146
|
-
private dirtyRange;
|
|
147
|
-
private dirtyBollConfig;
|
|
148
|
-
private dirtyExpmaConfig;
|
|
149
|
-
private dirtyEneConfig;
|
|
150
|
-
private dirtyRsiConfig;
|
|
151
|
-
private dirtyCciConfig;
|
|
152
|
-
private dirtyStochConfig;
|
|
153
|
-
private dirtyMomConfig;
|
|
154
|
-
private dirtyWmsrConfig;
|
|
155
|
-
private dirtyKstConfig;
|
|
156
|
-
private dirtyFastkConfig;
|
|
157
|
-
private dirtyMacdConfig;
|
|
158
|
-
private dirtyRsiState;
|
|
159
|
-
private dirtyCciState;
|
|
160
|
-
private dirtyStochState;
|
|
161
|
-
private dirtyMomState;
|
|
162
|
-
private dirtyWmsrState;
|
|
163
|
-
private dirtyKstState;
|
|
164
|
-
private dirtyFastkState;
|
|
165
|
-
private dirtyMacdState;
|
|
166
|
-
/** 当前激活的主图指标列表 */
|
|
167
19
|
private activeMainIndicators;
|
|
168
|
-
|
|
169
|
-
|
|
20
|
+
private dataVersion;
|
|
21
|
+
private configVersion;
|
|
22
|
+
private requestId;
|
|
23
|
+
private lastAppliedRequestId;
|
|
24
|
+
private currentData;
|
|
25
|
+
private configSnapshot;
|
|
26
|
+
private worker;
|
|
27
|
+
private workerReady;
|
|
28
|
+
private useWorker;
|
|
29
|
+
private pendingRequest;
|
|
30
|
+
private inlineRuntime;
|
|
31
|
+
private latestResult;
|
|
32
|
+
private invalidateCallback;
|
|
33
|
+
constructor();
|
|
34
|
+
/**
|
|
35
|
+
* 设置 PluginHost
|
|
170
36
|
*/
|
|
171
37
|
setPluginHost(host: PluginHost): void;
|
|
172
38
|
/**
|
|
173
|
-
*
|
|
174
|
-
* @param indicators 激活的指标ID列表,如 ['ma', 'boll', 'expma', 'ene']
|
|
39
|
+
* 设置重绘回调
|
|
175
40
|
*/
|
|
176
|
-
|
|
41
|
+
setInvalidateCallback(callback: () => void): void;
|
|
42
|
+
/**
|
|
43
|
+
* 销毁调度器
|
|
44
|
+
*/
|
|
45
|
+
destroy(): void;
|
|
46
|
+
private getDefaultConfig;
|
|
47
|
+
private initBackend;
|
|
48
|
+
private tryInitWorker;
|
|
49
|
+
private initInlineRuntime;
|
|
50
|
+
private fallbackToInline;
|
|
51
|
+
private terminateWorker;
|
|
52
|
+
private handleWorkerMessage;
|
|
53
|
+
private handleSeriesResult;
|
|
54
|
+
private applyResults;
|
|
55
|
+
private updateVisibleStatesOnly;
|
|
56
|
+
private getVisibleSubIndicatorMask;
|
|
177
57
|
/**
|
|
178
58
|
* 数据变更时调用
|
|
179
|
-
* @param data 新的 K 线数据
|
|
180
|
-
* @param visibleRange 当前可见范围
|
|
181
59
|
*/
|
|
182
60
|
update(data: KLineData[], visibleRange: VisibleRange): void;
|
|
183
61
|
/**
|
|
184
|
-
*
|
|
185
|
-
|
|
62
|
+
* 视口变更时调用 - 同步处理,不走 Worker
|
|
63
|
+
*/
|
|
64
|
+
updateVisibleRange(visibleRange: VisibleRange): void;
|
|
65
|
+
/**
|
|
66
|
+
* MA 配置变更
|
|
186
67
|
*/
|
|
187
68
|
updateMAConfig(config: MAFlags): void;
|
|
188
69
|
/**
|
|
189
|
-
* BOLL
|
|
190
|
-
* @param config 新的 BOLL 配置
|
|
70
|
+
* BOLL 配置变更
|
|
191
71
|
*/
|
|
192
72
|
updateBOLLConfig(config: Partial<BOLLSchedulerConfig>): void;
|
|
193
73
|
/**
|
|
194
|
-
* EXPMA
|
|
195
|
-
* @param config 新的 EXPMA 配置
|
|
74
|
+
* EXPMA 配置变更
|
|
196
75
|
*/
|
|
197
76
|
updateEXPMAConfig(config: Partial<EXPMASchedulerConfig>): void;
|
|
198
77
|
/**
|
|
199
|
-
* ENE
|
|
200
|
-
* @param config 新的 ENE 配置
|
|
78
|
+
* ENE 配置变更
|
|
201
79
|
*/
|
|
202
80
|
updateENEConfig(config: Partial<ENESchedulerConfig>): void;
|
|
203
81
|
/**
|
|
204
|
-
* RSI
|
|
205
|
-
* @param config 新的 RSI 配置
|
|
206
|
-
* @param paneId RSI pane ID(可选,默认 'sub_RSI')
|
|
82
|
+
* RSI 配置变更
|
|
207
83
|
*/
|
|
208
84
|
updateRSIConfig(config: Partial<RSISchedulerConfig>, paneId?: string): void;
|
|
209
85
|
/**
|
|
210
|
-
* CCI
|
|
211
|
-
* @param config 新的 CCI 配置
|
|
212
|
-
* @param paneId CCI pane ID(可选,默认 'sub_CCI')
|
|
86
|
+
* CCI 配置变更
|
|
213
87
|
*/
|
|
214
88
|
updateCCIConfig(config: Partial<CCISchedulerConfig>, paneId?: string): void;
|
|
215
89
|
/**
|
|
216
|
-
* STOCH
|
|
217
|
-
* @param config 新的 STOCH 配置
|
|
218
|
-
* @param paneId STOCH pane ID(可选,默认 'sub_STOCH')
|
|
90
|
+
* STOCH 配置变更
|
|
219
91
|
*/
|
|
220
92
|
updateSTOCHConfig(config: Partial<STOCHSchedulerConfig>, paneId?: string): void;
|
|
221
93
|
/**
|
|
222
|
-
* MOM
|
|
223
|
-
* @param config 新的 MOM 配置
|
|
224
|
-
* @param paneId MOM pane ID(可选,默认 'sub_MOM')
|
|
94
|
+
* MOM 配置变更
|
|
225
95
|
*/
|
|
226
96
|
updateMOMConfig(config: Partial<MOMSchedulerConfig>, paneId?: string): void;
|
|
227
97
|
/**
|
|
228
|
-
* WMSR
|
|
229
|
-
* @param config 新的 WMSR 配置
|
|
230
|
-
* @param paneId WMSR pane ID(可选,默认 'sub_WMSR')
|
|
98
|
+
* WMSR 配置变更
|
|
231
99
|
*/
|
|
232
100
|
updateWMSRConfig(config: Partial<WMSRSchedulerConfig>, paneId?: string): void;
|
|
233
101
|
/**
|
|
234
|
-
* KST
|
|
235
|
-
* @param config 新的 KST 配置
|
|
236
|
-
* @param paneId KST pane ID(可选,默认 'sub_KST')
|
|
102
|
+
* KST 配置变更
|
|
237
103
|
*/
|
|
238
104
|
updateKSTConfig(config: Partial<KSTSchedulerConfig>, paneId?: string): void;
|
|
239
105
|
/**
|
|
240
|
-
* FASTK
|
|
241
|
-
* @param config 新的 FASTK 配置
|
|
242
|
-
* @param paneId FASTK pane ID(可选,默认 'sub_FASTK')
|
|
106
|
+
* FASTK 配置变更
|
|
243
107
|
*/
|
|
244
108
|
updateFASTKConfig(config: Partial<FASTKSchedulerConfig>, paneId?: string): void;
|
|
245
109
|
/**
|
|
246
|
-
* MACD
|
|
247
|
-
* @param config 新的 MACD 配置
|
|
248
|
-
* @param paneId MACD pane ID(可选,默认 'sub_MACD')
|
|
110
|
+
* MACD 配置变更
|
|
249
111
|
*/
|
|
250
112
|
updateMACDConfig(config: Partial<MACDSchedulerConfig>, paneId?: string): void;
|
|
251
113
|
/**
|
|
252
|
-
*
|
|
253
|
-
* @param visibleRange 新的可见范围
|
|
114
|
+
* 设置当前激活的主图指标
|
|
254
115
|
*/
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* 强制全部重算
|
|
258
|
-
*/
|
|
259
|
-
recompute(): void;
|
|
260
|
-
/**
|
|
261
|
-
* 根据脏标记执行计算
|
|
262
|
-
*
|
|
263
|
-
* 计算流程:
|
|
264
|
-
* 1. 若 dirtyData 或指标配置脏标记,重算对应 series
|
|
265
|
-
* 2. 若任一 series 重算或 dirtyRange,重算所有指标在视口内的极值
|
|
266
|
-
* 3. 写入所有指标的 StateStore
|
|
267
|
-
*/
|
|
268
|
-
private computeIfDirty;
|
|
116
|
+
setActiveMainIndicators(indicators: string[]): void;
|
|
269
117
|
/**
|
|
270
|
-
*
|
|
271
|
-
* @returns 主图指标的价格范围,无指标时返回 null
|
|
118
|
+
* 获取主图指标价格范围
|
|
272
119
|
*/
|
|
273
120
|
getMainIndicatorPriceRange(): {
|
|
274
121
|
min: number;
|
|
275
122
|
max: number;
|
|
276
123
|
} | null;
|
|
124
|
+
/**
|
|
125
|
+
* 强制全部重算
|
|
126
|
+
*/
|
|
127
|
+
recompute(): void;
|
|
128
|
+
private triggerRecompute;
|
|
129
|
+
private computeWithWorker;
|
|
130
|
+
private computeWithInline;
|
|
277
131
|
}
|
|
278
|
-
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { MARenderState } from './maState';
|
|
2
|
+
import { BOLLRenderState } from './bollState';
|
|
3
|
+
import { EXPMARenderState } from './expmaState';
|
|
4
|
+
import { ENERenderState } from './eneState';
|
|
5
|
+
import { RSIRenderState } from './rsiState';
|
|
6
|
+
import { CCIRenderState } from './cciState';
|
|
7
|
+
import { STOCHRenderState } from './stochState';
|
|
8
|
+
import { MOMRenderState } from './momState';
|
|
9
|
+
import { WMSRRenderState } from './wmsrState';
|
|
10
|
+
import { KSTRenderState } from './kstState';
|
|
11
|
+
import { FASTKRenderState } from './fastkState';
|
|
12
|
+
import { MACDRenderState } from './macdState';
|
|
13
|
+
import { IndicatorSeriesBundle } from './workerProtocol';
|
|
14
|
+
/**
|
|
15
|
+
* 可见范围
|
|
16
|
+
*/
|
|
17
|
+
interface VisibleRange {
|
|
18
|
+
start: number;
|
|
19
|
+
end: number;
|
|
20
|
+
}
|
|
21
|
+
type VisibleSubIndicatorStates = {
|
|
22
|
+
rsi: RSIRenderState;
|
|
23
|
+
cci: CCIRenderState;
|
|
24
|
+
stoch: STOCHRenderState;
|
|
25
|
+
mom: MOMRenderState;
|
|
26
|
+
wmsr: WMSRRenderState;
|
|
27
|
+
kst: KSTRenderState;
|
|
28
|
+
fastk: FASTKRenderState;
|
|
29
|
+
macd: MACDRenderState;
|
|
30
|
+
};
|
|
31
|
+
type VisibleSubIndicatorMask = {
|
|
32
|
+
rsi?: boolean;
|
|
33
|
+
cci?: boolean;
|
|
34
|
+
stoch?: boolean;
|
|
35
|
+
mom?: boolean;
|
|
36
|
+
wmsr?: boolean;
|
|
37
|
+
kst?: boolean;
|
|
38
|
+
fastk?: boolean;
|
|
39
|
+
macd?: boolean;
|
|
40
|
+
};
|
|
41
|
+
type ComposedRenderStates = VisibleSubIndicatorStates & {
|
|
42
|
+
ma: MARenderState;
|
|
43
|
+
boll: BOLLRenderState;
|
|
44
|
+
expma: EXPMARenderState;
|
|
45
|
+
ene: ENERenderState;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* 仅计算副图指标的 visible-only states
|
|
49
|
+
* 用于滚动时的轻量更新,避免重复计算主图指标
|
|
50
|
+
*/
|
|
51
|
+
export declare function composeVisibleSubIndicatorStates(bundle: IndicatorSeriesBundle, visibleRange: VisibleRange, timestamp: number, activeMask?: VisibleSubIndicatorMask): VisibleSubIndicatorStates;
|
|
52
|
+
/**
|
|
53
|
+
* 从 series bundle 组装所有 render states
|
|
54
|
+
* 同时计算 visibleMin/visibleMax 等派生字段
|
|
55
|
+
*/
|
|
56
|
+
export declare function composeRenderStates(bundle: IndicatorSeriesBundle, visibleRange: VisibleRange, timestamp: number): ComposedRenderStates;
|
|
57
|
+
/**
|
|
58
|
+
* 计算主图指标价格范围
|
|
59
|
+
* 用于 Chart.draw() 中的 pane.updateRange
|
|
60
|
+
*/
|
|
61
|
+
export declare function computeMainIndicatorPriceRange(bundle: IndicatorSeriesBundle, visibleRange: VisibleRange, activeMainIndicators: Set<string>): {
|
|
62
|
+
min: number;
|
|
63
|
+
max: number;
|
|
64
|
+
} | null;
|
|
65
|
+
export {};
|