@363045841yyt/klinechart 0.6.5 → 0.6.6
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 +4 -4
- package/dist/index.js +1565 -1071
- package/dist/klinechart.css +1 -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 +61 -209
- package/dist/src/core/indicators/stateComposer.d.ts +47 -0
- package/dist/src/core/indicators/workerProtocol.d.ts +189 -0
- package/dist/src/core/renderers/Indicator/macdLegend.d.ts +5 -3
- package/dist/src/core/renderers/webgl/candleSurface.d.ts +1 -0
- package/dist/src/core/utils/zoom.d.ts +2 -2
- 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-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-5f030216]{--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-5f030216]{align-items:stretch;gap:8px;width:95%;height:85%;min-height:255px;display:flex}.chart-main[data-v-5f030216]{flex:auto;align-items:stretch;gap:0;min-width:0;height:100%;display:flex;position:relative}.pane-separator-layer[data-v-5f030216]{pointer-events:none;z-index:20;position:absolute;inset:0}.pane-separator-line[data-v-5f030216]{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-5f030216]{border-top-width:2px;border-top-color:#3b82f6;margin-top:-1px}.chart-stage.is-resizing-pane[data-v-5f030216],.chart-stage.is-hovering-pane-separator[data-v-5f030216]{cursor:ns-resize}.chart-stage.is-hovering-kline[data-v-5f030216]{cursor:pointer}.chart-stage.is-hovering-right-axis[data-v-5f030216]{cursor:ns-resize}.chart-stage.is-dragging[data-v-5f030216]{cursor:grabbing}.chart-container[data-v-5f030216]{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-5f030216]::-webkit-scrollbar{display:none}.chart-container[data-v-5f030216]:hover{cursor:crosshair}.chart-stage.is-resizing-pane .chart-container[data-v-5f030216],.chart-stage.is-hovering-pane-separator .chart-container[data-v-5f030216]{cursor:ns-resize}.chart-stage.is-hovering-kline .chart-container[data-v-5f030216]{cursor:pointer}.chart-stage.is-dragging .chart-container[data-v-5f030216]{cursor:grabbing}.right-axis-host[data-v-5f030216]{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-5f030216]{height:100%;min-height:inherit;position:relative}.canvas-layer[data-v-5f030216]{pointer-events:none;position:sticky;top:0;left:0}.tooltip-layer[data-v-5f030216]{pointer-events:none;z-index:30;position:absolute;inset:0}.tooltip-anchor[data-v-5f030216]{pointer-events:none;width:1px;height:1px;position:absolute}.tooltip-anchor.kline-tooltip-anchor.use-anchor[data-v-5f030216]{anchor-name:--kline-tooltip-anchor}.tooltip-anchor.marker-tooltip-anchor.use-anchor[data-v-5f030216]{anchor-name:--marker-tooltip-anchor}@media (width<=768px),(height<=640px){.chart-stage[data-v-5f030216]{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*/
|
|
@@ -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,122 @@ 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;
|
|
177
56
|
/**
|
|
178
57
|
* 数据变更时调用
|
|
179
|
-
* @param data 新的 K 线数据
|
|
180
|
-
* @param visibleRange 当前可见范围
|
|
181
58
|
*/
|
|
182
59
|
update(data: KLineData[], visibleRange: VisibleRange): void;
|
|
183
60
|
/**
|
|
184
|
-
*
|
|
185
|
-
|
|
61
|
+
* 视口变更时调用 - 同步处理,不走 Worker
|
|
62
|
+
*/
|
|
63
|
+
updateVisibleRange(visibleRange: VisibleRange): void;
|
|
64
|
+
/**
|
|
65
|
+
* MA 配置变更
|
|
186
66
|
*/
|
|
187
67
|
updateMAConfig(config: MAFlags): void;
|
|
188
68
|
/**
|
|
189
|
-
* BOLL
|
|
190
|
-
* @param config 新的 BOLL 配置
|
|
69
|
+
* BOLL 配置变更
|
|
191
70
|
*/
|
|
192
71
|
updateBOLLConfig(config: Partial<BOLLSchedulerConfig>): void;
|
|
193
72
|
/**
|
|
194
|
-
* EXPMA
|
|
195
|
-
* @param config 新的 EXPMA 配置
|
|
73
|
+
* EXPMA 配置变更
|
|
196
74
|
*/
|
|
197
75
|
updateEXPMAConfig(config: Partial<EXPMASchedulerConfig>): void;
|
|
198
76
|
/**
|
|
199
|
-
* ENE
|
|
200
|
-
* @param config 新的 ENE 配置
|
|
77
|
+
* ENE 配置变更
|
|
201
78
|
*/
|
|
202
79
|
updateENEConfig(config: Partial<ENESchedulerConfig>): void;
|
|
203
80
|
/**
|
|
204
|
-
* RSI
|
|
205
|
-
* @param config 新的 RSI 配置
|
|
206
|
-
* @param paneId RSI pane ID(可选,默认 'sub_RSI')
|
|
81
|
+
* RSI 配置变更
|
|
207
82
|
*/
|
|
208
83
|
updateRSIConfig(config: Partial<RSISchedulerConfig>, paneId?: string): void;
|
|
209
84
|
/**
|
|
210
|
-
* CCI
|
|
211
|
-
* @param config 新的 CCI 配置
|
|
212
|
-
* @param paneId CCI pane ID(可选,默认 'sub_CCI')
|
|
85
|
+
* CCI 配置变更
|
|
213
86
|
*/
|
|
214
87
|
updateCCIConfig(config: Partial<CCISchedulerConfig>, paneId?: string): void;
|
|
215
88
|
/**
|
|
216
|
-
* STOCH
|
|
217
|
-
* @param config 新的 STOCH 配置
|
|
218
|
-
* @param paneId STOCH pane ID(可选,默认 'sub_STOCH')
|
|
89
|
+
* STOCH 配置变更
|
|
219
90
|
*/
|
|
220
91
|
updateSTOCHConfig(config: Partial<STOCHSchedulerConfig>, paneId?: string): void;
|
|
221
92
|
/**
|
|
222
|
-
* MOM
|
|
223
|
-
* @param config 新的 MOM 配置
|
|
224
|
-
* @param paneId MOM pane ID(可选,默认 'sub_MOM')
|
|
93
|
+
* MOM 配置变更
|
|
225
94
|
*/
|
|
226
95
|
updateMOMConfig(config: Partial<MOMSchedulerConfig>, paneId?: string): void;
|
|
227
96
|
/**
|
|
228
|
-
* WMSR
|
|
229
|
-
* @param config 新的 WMSR 配置
|
|
230
|
-
* @param paneId WMSR pane ID(可选,默认 'sub_WMSR')
|
|
97
|
+
* WMSR 配置变更
|
|
231
98
|
*/
|
|
232
99
|
updateWMSRConfig(config: Partial<WMSRSchedulerConfig>, paneId?: string): void;
|
|
233
100
|
/**
|
|
234
|
-
* KST
|
|
235
|
-
* @param config 新的 KST 配置
|
|
236
|
-
* @param paneId KST pane ID(可选,默认 'sub_KST')
|
|
101
|
+
* KST 配置变更
|
|
237
102
|
*/
|
|
238
103
|
updateKSTConfig(config: Partial<KSTSchedulerConfig>, paneId?: string): void;
|
|
239
104
|
/**
|
|
240
|
-
* FASTK
|
|
241
|
-
* @param config 新的 FASTK 配置
|
|
242
|
-
* @param paneId FASTK pane ID(可选,默认 'sub_FASTK')
|
|
105
|
+
* FASTK 配置变更
|
|
243
106
|
*/
|
|
244
107
|
updateFASTKConfig(config: Partial<FASTKSchedulerConfig>, paneId?: string): void;
|
|
245
108
|
/**
|
|
246
|
-
* MACD
|
|
247
|
-
* @param config 新的 MACD 配置
|
|
248
|
-
* @param paneId MACD pane ID(可选,默认 'sub_MACD')
|
|
109
|
+
* MACD 配置变更
|
|
249
110
|
*/
|
|
250
111
|
updateMACDConfig(config: Partial<MACDSchedulerConfig>, paneId?: string): void;
|
|
251
112
|
/**
|
|
252
|
-
*
|
|
253
|
-
* @param visibleRange 新的可见范围
|
|
113
|
+
* 设置当前激活的主图指标
|
|
254
114
|
*/
|
|
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;
|
|
115
|
+
setActiveMainIndicators(indicators: string[]): void;
|
|
269
116
|
/**
|
|
270
|
-
*
|
|
271
|
-
* @returns 主图指标的价格范围,无指标时返回 null
|
|
117
|
+
* 获取主图指标价格范围
|
|
272
118
|
*/
|
|
273
119
|
getMainIndicatorPriceRange(): {
|
|
274
120
|
min: number;
|
|
275
121
|
max: number;
|
|
276
122
|
} | null;
|
|
123
|
+
/**
|
|
124
|
+
* 强制全部重算
|
|
125
|
+
*/
|
|
126
|
+
recompute(): void;
|
|
127
|
+
private triggerRecompute;
|
|
128
|
+
private computeWithWorker;
|
|
129
|
+
private computeWithInline;
|
|
277
130
|
}
|
|
278
|
-
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
/**
|
|
22
|
+
* 从 series bundle 组装所有 render states
|
|
23
|
+
* 同时计算 visibleMin/visibleMax 等派生字段
|
|
24
|
+
*/
|
|
25
|
+
export declare function composeRenderStates(bundle: IndicatorSeriesBundle, visibleRange: VisibleRange, timestamp: number): {
|
|
26
|
+
ma: MARenderState;
|
|
27
|
+
boll: BOLLRenderState;
|
|
28
|
+
expma: EXPMARenderState;
|
|
29
|
+
ene: ENERenderState;
|
|
30
|
+
rsi: RSIRenderState;
|
|
31
|
+
cci: CCIRenderState;
|
|
32
|
+
stoch: STOCHRenderState;
|
|
33
|
+
mom: MOMRenderState;
|
|
34
|
+
wmsr: WMSRRenderState;
|
|
35
|
+
kst: KSTRenderState;
|
|
36
|
+
fastk: FASTKRenderState;
|
|
37
|
+
macd: MACDRenderState;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* 计算主图指标价格范围
|
|
41
|
+
* 用于 Chart.draw() 中的 pane.updateRange
|
|
42
|
+
*/
|
|
43
|
+
export declare function computeMainIndicatorPriceRange(bundle: IndicatorSeriesBundle, visibleRange: VisibleRange, activeMainIndicators: Set<string>): {
|
|
44
|
+
min: number;
|
|
45
|
+
max: number;
|
|
46
|
+
} | null;
|
|
47
|
+
export {};
|