@363045841yyt/klinechart-core 0.7.6 → 0.7.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/dist/config/chartSettings.d.ts +27 -2
- package/dist/config/chartSettings.d.ts.map +1 -1
- package/dist/config/chartSettings.js +6 -0
- package/dist/config/chartSettings.js.map +1 -1
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +4 -0
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/draw/pixelAlign.d.ts.map +1 -1
- package/dist/engine/draw/pixelAlign.js.map +1 -1
- package/dist/engine/drawing/plugin.js +1 -1
- package/dist/engine/drawing/plugin.js.map +1 -1
- package/dist/engine/renderers/Indicator/atr.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/atr.js +7 -4
- package/dist/engine/renderers/Indicator/atr.js.map +1 -1
- package/dist/engine/renderers/Indicator/boll.js +12 -12
- package/dist/engine/renderers/Indicator/boll.js.map +1 -1
- package/dist/engine/renderers/Indicator/cci.d.ts +1 -2
- package/dist/engine/renderers/Indicator/cci.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/cci.js +9 -9
- package/dist/engine/renderers/Indicator/cci.js.map +1 -1
- package/dist/engine/renderers/Indicator/ene.js +12 -12
- package/dist/engine/renderers/Indicator/ene.js.map +1 -1
- package/dist/engine/renderers/Indicator/expma.js +6 -6
- package/dist/engine/renderers/Indicator/expma.js.map +1 -1
- package/dist/engine/renderers/Indicator/fastk.d.ts +1 -2
- package/dist/engine/renderers/Indicator/fastk.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/fastk.js +7 -7
- package/dist/engine/renderers/Indicator/fastk.js.map +1 -1
- package/dist/engine/renderers/Indicator/kst.d.ts +1 -2
- package/dist/engine/renderers/Indicator/kst.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/kst.js +10 -10
- package/dist/engine/renderers/Indicator/kst.js.map +1 -1
- package/dist/engine/renderers/Indicator/ma.js +5 -5
- package/dist/engine/renderers/Indicator/ma.js.map +1 -1
- package/dist/engine/renderers/Indicator/macd.d.ts +1 -2
- package/dist/engine/renderers/Indicator/macd.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/macd.js +24 -24
- package/dist/engine/renderers/Indicator/macd.js.map +1 -1
- package/dist/engine/renderers/Indicator/macdLegend.js +6 -6
- package/dist/engine/renderers/Indicator/macdLegend.js.map +1 -1
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js +16 -16
- package/dist/engine/renderers/Indicator/mainIndicatorLegend.js.map +1 -1
- package/dist/engine/renderers/Indicator/mom.d.ts +1 -2
- package/dist/engine/renderers/Indicator/mom.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/mom.js +8 -8
- package/dist/engine/renderers/Indicator/mom.js.map +1 -1
- package/dist/engine/renderers/Indicator/rsi.d.ts +2 -3
- package/dist/engine/renderers/Indicator/rsi.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/rsi.js +19 -15
- package/dist/engine/renderers/Indicator/rsi.js.map +1 -1
- package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts +1 -2
- package/dist/engine/renderers/Indicator/scale/indicator_scale.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/scale/indicator_scale.js +5 -5
- package/dist/engine/renderers/Indicator/scale/indicator_scale.js.map +1 -1
- package/dist/engine/renderers/Indicator/stoch.d.ts +1 -2
- package/dist/engine/renderers/Indicator/stoch.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/stoch.js +10 -10
- package/dist/engine/renderers/Indicator/stoch.js.map +1 -1
- package/dist/engine/renderers/Indicator/structure.js +5 -5
- package/dist/engine/renderers/Indicator/structure.js.map +1 -1
- package/dist/engine/renderers/Indicator/wmsr.d.ts +1 -2
- package/dist/engine/renderers/Indicator/wmsr.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/wmsr.js +10 -10
- package/dist/engine/renderers/Indicator/wmsr.js.map +1 -1
- package/dist/engine/renderers/Indicator/zones.js +6 -6
- package/dist/engine/renderers/Indicator/zones.js.map +1 -1
- package/dist/engine/renderers/candle.d.ts +1 -1
- package/dist/engine/renderers/candle.d.ts.map +1 -1
- package/dist/engine/renderers/candle.js +21 -21
- package/dist/engine/renderers/candle.js.map +1 -1
- package/dist/engine/renderers/crosshair.js +3 -3
- package/dist/engine/renderers/crosshair.js.map +1 -1
- package/dist/engine/renderers/extremaMarkers.d.ts.map +1 -1
- package/dist/engine/renderers/extremaMarkers.js +12 -12
- package/dist/engine/renderers/extremaMarkers.js.map +1 -1
- package/dist/engine/renderers/gridLines.js +3 -3
- package/dist/engine/renderers/gridLines.js.map +1 -1
- package/dist/engine/renderers/lastPrice.js +7 -7
- package/dist/engine/renderers/lastPrice.js.map +1 -1
- package/dist/engine/renderers/paneTitle.js +6 -6
- package/dist/engine/renderers/paneTitle.js.map +1 -1
- package/dist/engine/renderers/subVolume.d.ts.map +1 -1
- package/dist/engine/renderers/subVolume.js +23 -20
- package/dist/engine/renderers/subVolume.js.map +1 -1
- package/dist/engine/renderers/timeAxis.js +9 -9
- package/dist/engine/renderers/timeAxis.js.map +1 -1
- package/dist/engine/renderers/webgl/candleSurface.d.ts.map +1 -1
- package/dist/engine/renderers/webgl/candleSurface.js +39 -7
- package/dist/engine/renderers/webgl/candleSurface.js.map +1 -1
- package/dist/engine/renderers/yAxis.d.ts.map +1 -1
- package/dist/engine/renderers/yAxis.js +5 -5
- package/dist/engine/renderers/yAxis.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin/types.d.ts +5 -1
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/types.js.map +1 -1
- package/dist/tokens/colorPresetSettings.d.ts +15 -0
- package/dist/tokens/colorPresetSettings.d.ts.map +1 -0
- package/dist/tokens/colorPresetSettings.js +65 -0
- package/dist/tokens/colorPresetSettings.js.map +1 -0
- package/dist/tokens/index.d.ts +17 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +16 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/mergeTheme.d.ts +17 -0
- package/dist/tokens/mergeTheme.d.ts.map +1 -0
- package/dist/tokens/mergeTheme.js +43 -0
- package/dist/tokens/mergeTheme.js.map +1 -0
- package/dist/tokens/theme-china.d.ts +45 -0
- package/dist/tokens/theme-china.d.ts.map +1 -0
- package/dist/tokens/theme-china.js +116 -0
- package/dist/tokens/theme-china.js.map +1 -0
- package/dist/tokens/theme-dark.d.ts +21 -0
- package/dist/tokens/theme-dark.d.ts.map +1 -0
- package/dist/tokens/theme-dark.js +228 -0
- package/dist/tokens/theme-dark.js.map +1 -0
- package/dist/tokens/theme-light.d.ts +23 -0
- package/dist/tokens/theme-light.d.ts.map +1 -0
- package/dist/tokens/theme-light.js +234 -0
- package/dist/tokens/theme-light.js.map +1 -0
- package/dist/tokens/themeToCssVars.d.ts +74 -0
- package/dist/tokens/themeToCssVars.d.ts.map +1 -0
- package/dist/tokens/themeToCssVars.js +108 -0
- package/dist/tokens/themeToCssVars.js.map +1 -0
- package/dist/tokens/types.d.ts +335 -0
- package/dist/tokens/types.d.ts.map +1 -0
- package/dist/tokens/types.js +20 -0
- package/dist/tokens/types.js.map +1 -0
- package/dist/utils/kLineDraw/axis.d.ts +8 -7
- package/dist/utils/kLineDraw/axis.d.ts.map +1 -1
- package/dist/utils/kLineDraw/axis.js +24 -24
- package/dist/utils/kLineDraw/axis.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/config/chartSettings.ts +11 -2
- package/src/engine/chart.ts +4 -0
- package/src/engine/draw/pixelAlign.ts +0 -2
- package/src/engine/drawing/plugin.ts +1 -1
- package/src/engine/renderers/Indicator/atr.ts +7 -3
- package/src/engine/renderers/Indicator/boll.ts +12 -12
- package/src/engine/renderers/Indicator/cci.ts +11 -10
- package/src/engine/renderers/Indicator/ene.ts +12 -12
- package/src/engine/renderers/Indicator/expma.ts +6 -6
- package/src/engine/renderers/Indicator/fastk.ts +9 -8
- package/src/engine/renderers/Indicator/kst.ts +12 -11
- package/src/engine/renderers/Indicator/ma.ts +5 -5
- package/src/engine/renderers/Indicator/macd.ts +27 -25
- package/src/engine/renderers/Indicator/macdLegend.ts +6 -6
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +16 -16
- package/src/engine/renderers/Indicator/mom.ts +11 -10
- package/src/engine/renderers/Indicator/rsi.ts +22 -15
- package/src/engine/renderers/Indicator/scale/indicator_scale.ts +6 -6
- package/src/engine/renderers/Indicator/stoch.ts +12 -11
- package/src/engine/renderers/Indicator/structure.ts +5 -5
- package/src/engine/renderers/Indicator/wmsr.ts +13 -12
- package/src/engine/renderers/Indicator/zones.ts +7 -7
- package/src/engine/renderers/candle.ts +21 -21
- package/src/engine/renderers/crosshair.ts +3 -3
- package/src/engine/renderers/extremaMarkers.ts +13 -12
- package/src/engine/renderers/gridLines.ts +3 -3
- package/src/engine/renderers/lastPrice.ts +7 -7
- package/src/engine/renderers/paneTitle.ts +6 -6
- package/src/engine/renderers/subVolume.ts +23 -20
- package/src/engine/renderers/timeAxis.ts +9 -9
- package/src/engine/renderers/webgl/candleSurface.ts +43 -7
- package/src/engine/renderers/yAxis.ts +6 -5
- package/src/index.ts +1 -0
- package/src/plugin/types.ts +5 -1
- package/src/tokens/__tests__/__snapshots__/baseline.test.ts.snap +393 -0
- package/src/tokens/__tests__/baseline.test.ts +183 -0
- package/src/tokens/__tests__/themeToCssVars.test.ts +175 -0
- package/src/tokens/__tests__/tokens.test.ts +215 -0
- package/src/tokens/colorPresetSettings.ts +128 -0
- package/src/tokens/index.ts +65 -0
- package/src/tokens/mergeTheme.ts +48 -0
- package/src/tokens/theme-china.ts +132 -0
- package/src/tokens/theme-dark.ts +244 -0
- package/src/tokens/theme-light.ts +250 -0
- package/src/tokens/themeToCssVars.ts +138 -0
- package/src/tokens/types.ts +394 -0
- package/src/utils/kLineDraw/axis.ts +31 -30
- package/src/version.ts +1 -1
- package/dist/engine/theme/colors.d.ts +0 -223
- package/dist/engine/theme/colors.d.ts.map +0 -1
- package/dist/engine/theme/colors.js +0 -375
- package/dist/engine/theme/colors.js.map +0 -1
- package/src/engine/theme/colors.ts +0 -642
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
|
-
import {
|
|
3
|
+
import { resolveThemeColors } from '../../../tokens'
|
|
4
4
|
import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
|
|
5
5
|
import type { RSIRenderState } from '../../indicators/rsiState'
|
|
6
6
|
import { createRSIStateKey } from '../../indicators/rsiState'
|
|
@@ -168,7 +168,7 @@ export function createRSIRendererPlugin(options: RSIRendererOptions = {}): Rende
|
|
|
168
168
|
|
|
169
169
|
draw(context: RenderContext) {
|
|
170
170
|
const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
|
|
171
|
-
const colors =
|
|
171
|
+
const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
172
172
|
|
|
173
173
|
// 从 StateStore 读取 RSI 状态
|
|
174
174
|
const stateKey = resolveKey()
|
|
@@ -191,6 +191,10 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
|
|
|
191
191
|
// ========== 优化1: 使用离屏 Canvas 缓存虚线背景线 ==========
|
|
192
192
|
const paneWidth = context.paneWidth
|
|
193
193
|
const paneHeight = pane.height
|
|
194
|
+
if (paneWidth <= 0 || paneHeight <= 0) {
|
|
195
|
+
clearLineCache()
|
|
196
|
+
return
|
|
197
|
+
}
|
|
194
198
|
const dashedLinesKey = buildDashedLinesKey(paneWidth, paneHeight, displayMin, displayMax, dpr)
|
|
195
199
|
|
|
196
200
|
if (cachedDashedLinesKey !== dashedLinesKey) {
|
|
@@ -251,13 +255,13 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
|
|
|
251
255
|
if (enableWebGL && lineWebGLSurface?.isAvailable()) {
|
|
252
256
|
const lines: Array<{ points: LinePoint[]; width: number; color: string }> = []
|
|
253
257
|
if (params.showRSI1 && cachedRSI1Points.length >= 2) {
|
|
254
|
-
lines.push({ points: cachedRSI1Points, width: 1, color: colors.
|
|
258
|
+
lines.push({ points: cachedRSI1Points, width: 1, color: colors.rsi.rsi1 })
|
|
255
259
|
}
|
|
256
260
|
if (params.showRSI2 && cachedRSI2Points.length >= 2) {
|
|
257
|
-
lines.push({ points: cachedRSI2Points, width: 1, color: colors.
|
|
261
|
+
lines.push({ points: cachedRSI2Points, width: 1, color: colors.rsi.rsi2 })
|
|
258
262
|
}
|
|
259
263
|
if (params.showRSI3 && cachedRSI3Points.length >= 2) {
|
|
260
|
-
lines.push({ points: cachedRSI3Points, width: 1, color: colors.
|
|
264
|
+
lines.push({ points: cachedRSI3Points, width: 1, color: colors.rsi.rsi3 })
|
|
261
265
|
}
|
|
262
266
|
|
|
263
267
|
const allOk = lines.length > 0 && lineWebGLSurface.drawLineStrips(lines, scrollLeft)
|
|
@@ -269,7 +273,7 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
|
|
|
269
273
|
}
|
|
270
274
|
|
|
271
275
|
if (!usedWebGL) {
|
|
272
|
-
drawRSILinesWithCanvas2D(ctx, scrollLeft, cachedRSI1Points, cachedRSI2Points, cachedRSI3Points, params, colors)
|
|
276
|
+
drawRSILinesWithCanvas2D(ctx, scrollLeft, cachedRSI1Points, cachedRSI2Points, cachedRSI3Points, params, colors.rsi.rsi1, colors.rsi.rsi2, colors.rsi.rsi3)
|
|
273
277
|
}
|
|
274
278
|
},
|
|
275
279
|
|
|
@@ -297,7 +301,9 @@ export function drawRSILinesWithCanvas2D(
|
|
|
297
301
|
rsi2Points: LinePoint[],
|
|
298
302
|
rsi3Points: LinePoint[],
|
|
299
303
|
params: { showRSI1: boolean; showRSI2: boolean; showRSI3: boolean },
|
|
300
|
-
|
|
304
|
+
rsi1Color: string,
|
|
305
|
+
rsi2Color: string,
|
|
306
|
+
rsi3Color: string
|
|
301
307
|
): void {
|
|
302
308
|
ctx.save()
|
|
303
309
|
ctx.translate(-scrollLeft, 0)
|
|
@@ -306,7 +312,7 @@ export function drawRSILinesWithCanvas2D(
|
|
|
306
312
|
ctx.lineCap = 'round'
|
|
307
313
|
|
|
308
314
|
if (params.showRSI1 && rsi1Points.length >= 2) {
|
|
309
|
-
ctx.strokeStyle =
|
|
315
|
+
ctx.strokeStyle = rsi1Color
|
|
310
316
|
ctx.beginPath()
|
|
311
317
|
ctx.moveTo(rsi1Points[0]!.x, rsi1Points[0]!.y)
|
|
312
318
|
for (let i = 1; i < rsi1Points.length; i++) {
|
|
@@ -317,7 +323,7 @@ export function drawRSILinesWithCanvas2D(
|
|
|
317
323
|
}
|
|
318
324
|
|
|
319
325
|
if (params.showRSI2 && rsi2Points.length >= 2) {
|
|
320
|
-
ctx.strokeStyle =
|
|
326
|
+
ctx.strokeStyle = rsi2Color
|
|
321
327
|
ctx.beginPath()
|
|
322
328
|
ctx.moveTo(rsi2Points[0]!.x, rsi2Points[0]!.y)
|
|
323
329
|
for (let i = 1; i < rsi2Points.length; i++) {
|
|
@@ -328,7 +334,7 @@ export function drawRSILinesWithCanvas2D(
|
|
|
328
334
|
}
|
|
329
335
|
|
|
330
336
|
if (params.showRSI3 && rsi3Points.length >= 2) {
|
|
331
|
-
ctx.strokeStyle =
|
|
337
|
+
ctx.strokeStyle = rsi3Color
|
|
332
338
|
ctx.beginPath()
|
|
333
339
|
ctx.moveTo(rsi3Points[0]!.x, rsi3Points[0]!.y)
|
|
334
340
|
for (let i = 1; i < rsi3Points.length; i++) {
|
|
@@ -348,9 +354,10 @@ export function getRSITitleInfo(
|
|
|
348
354
|
period3: number,
|
|
349
355
|
pluginHost: PluginHost,
|
|
350
356
|
paneId: string = 'sub_RSI',
|
|
351
|
-
theme:
|
|
357
|
+
theme: 'light' | 'dark' = 'light',
|
|
358
|
+
isAsiaMarket?: boolean
|
|
352
359
|
): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
|
|
353
|
-
const colors =
|
|
360
|
+
const colors = resolveThemeColors(theme, isAsiaMarket)
|
|
354
361
|
const stateKey = createRSIStateKey(paneId)
|
|
355
362
|
const state = pluginHost.getSharedState<RSIRenderState>(stateKey)
|
|
356
363
|
|
|
@@ -361,9 +368,9 @@ export function getRSITitleInfo(
|
|
|
361
368
|
const rsi3 = state.series[period3]?.[index]
|
|
362
369
|
|
|
363
370
|
const values: Array<{ label: string; value: number; color: string }> = []
|
|
364
|
-
if (rsi1 !== undefined) values.push({ label: `RSI${period1}`, value: rsi1, color: colors.
|
|
365
|
-
if (rsi2 !== undefined) values.push({ label: `RSI${period2}`, value: rsi2, color: colors.
|
|
366
|
-
if (rsi3 !== undefined) values.push({ label: `RSI${period3}`, value: rsi3, color: colors.
|
|
371
|
+
if (rsi1 !== undefined) values.push({ label: `RSI${period1}`, value: rsi1, color: colors.rsi.rsi1 })
|
|
372
|
+
if (rsi2 !== undefined) values.push({ label: `RSI${period2}`, value: rsi2, color: colors.rsi.rsi2 })
|
|
373
|
+
if (rsi3 !== undefined) values.push({ label: `RSI${period3}`, value: rsi3, color: colors.rsi.rsi3 })
|
|
367
374
|
|
|
368
375
|
if (values.length === 0) return null
|
|
369
376
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, PluginHost, RenderContext, BaseIndicatorState } from '../../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../../plugin'
|
|
3
3
|
import { createIndicatorStateKey } from '../../../../plugin/stateKeys'
|
|
4
|
-
import {
|
|
4
|
+
import { resolveThemeColors } from '../../../../tokens'
|
|
5
5
|
import { getFont, setCanvasFont } from '../../../theme/fonts'
|
|
6
6
|
import { calculateValueTickPositions, type ScaleType } from '../../../utils/tickPosition'
|
|
7
7
|
import { drawCrosshairPriceLabel } from '../../../../utils/kLineDraw/axis'
|
|
@@ -62,7 +62,7 @@ export interface DrawScaleTicksOptions {
|
|
|
62
62
|
const BASELINE_MIDDLE = 'middle' as const
|
|
63
63
|
const ALIGN_CENTER = 'center' as const
|
|
64
64
|
|
|
65
|
-
export function drawScaleTicks(options: DrawScaleTicksOptions & {
|
|
65
|
+
export function drawScaleTicks(options: DrawScaleTicksOptions & { tickColor: string }): void {
|
|
66
66
|
const {
|
|
67
67
|
ctx,
|
|
68
68
|
dpr,
|
|
@@ -85,7 +85,7 @@ export function drawScaleTicks(options: DrawScaleTicksOptions & { colors: ThemeC
|
|
|
85
85
|
setCanvasFont(ctx, font)
|
|
86
86
|
ctx.textBaseline = BASELINE_MIDDLE
|
|
87
87
|
ctx.textAlign = ALIGN_CENTER
|
|
88
|
-
ctx.fillStyle = options.
|
|
88
|
+
ctx.fillStyle = options.tickColor
|
|
89
89
|
|
|
90
90
|
const centerX = axisWidth / 2
|
|
91
91
|
const centerXPx = roundToPhysicalPixel(centerX, dpr)
|
|
@@ -148,7 +148,7 @@ export function createIndicatorScaleRendererPlugin(options: IndicatorScaleRender
|
|
|
148
148
|
|
|
149
149
|
const effectiveScaleType: ScaleType = pane.yAxis.getScaleType() ?? scaleType
|
|
150
150
|
const effectiveAxisWidth = yAxisCtx.canvas ? (yAxisCtx.canvas.width / dpr) : axisWidth
|
|
151
|
-
const
|
|
151
|
+
const tokenColors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
152
152
|
|
|
153
153
|
const displayRange = pane.yAxis.getDisplayRange({
|
|
154
154
|
minPrice: state.valueMin,
|
|
@@ -156,7 +156,7 @@ export function createIndicatorScaleRendererPlugin(options: IndicatorScaleRender
|
|
|
156
156
|
})
|
|
157
157
|
|
|
158
158
|
drawScaleTicks({
|
|
159
|
-
|
|
159
|
+
tickColor: tokenColors.text.secondary,
|
|
160
160
|
ctx: yAxisCtx,
|
|
161
161
|
dpr,
|
|
162
162
|
axisWidth: effectiveAxisWidth,
|
|
@@ -198,7 +198,7 @@ export function createIndicatorScaleRendererPlugin(options: IndicatorScaleRender
|
|
|
198
198
|
priceOffset: 0,
|
|
199
199
|
price: displayPrice,
|
|
200
200
|
formatPrice: formatCrosshairLabel,
|
|
201
|
-
})
|
|
201
|
+
}, context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
202
202
|
},
|
|
203
203
|
}
|
|
204
204
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
|
-
import {
|
|
3
|
+
import { resolveThemeColors } from '../../../tokens'
|
|
4
4
|
import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
|
|
5
5
|
import type { STOCHRenderState } from '../../indicators/stochState'
|
|
6
6
|
import { createSTOCHStateKey } from '../../indicators/stochState'
|
|
@@ -152,7 +152,7 @@ export function createSTOCHRendererPlugin(options: STOCHRendererOptions = {}): R
|
|
|
152
152
|
|
|
153
153
|
draw(context: RenderContext) {
|
|
154
154
|
const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
|
|
155
|
-
const colors =
|
|
155
|
+
const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
156
156
|
|
|
157
157
|
const stateKey = resolveKey()
|
|
158
158
|
if (!stateKey) return
|
|
@@ -238,10 +238,10 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
|
|
|
238
238
|
if (enableWebGL && lineWebGLSurface?.isAvailable()) {
|
|
239
239
|
const lines: Array<{ points: LinePoint[]; width: number; color: string }> = []
|
|
240
240
|
if (params.showK && cachedKPoints.length >= 2) {
|
|
241
|
-
lines.push({ points: cachedKPoints, width: 1, color: colors.
|
|
241
|
+
lines.push({ points: cachedKPoints, width: 1, color: colors.kdj.k })
|
|
242
242
|
}
|
|
243
243
|
if (params.showD && cachedDPoints.length >= 2) {
|
|
244
|
-
lines.push({ points: cachedDPoints, width: 1, color: colors.
|
|
244
|
+
lines.push({ points: cachedDPoints, width: 1, color: colors.kdj.d })
|
|
245
245
|
}
|
|
246
246
|
|
|
247
247
|
const allOk = lines.length > 0 && lineWebGLSurface.drawLineStrips(lines, scrollLeft)
|
|
@@ -279,7 +279,7 @@ function drawSTOCHLinesWithCanvas2D(
|
|
|
279
279
|
kPoints: LinePoint[],
|
|
280
280
|
dPoints: LinePoint[],
|
|
281
281
|
params: { showK: boolean; showD: boolean },
|
|
282
|
-
colors: {
|
|
282
|
+
colors: { kdj: { k: string; d: string } }
|
|
283
283
|
): void {
|
|
284
284
|
ctx.save()
|
|
285
285
|
ctx.translate(-scrollLeft, 0)
|
|
@@ -288,7 +288,7 @@ function drawSTOCHLinesWithCanvas2D(
|
|
|
288
288
|
ctx.lineCap = 'round'
|
|
289
289
|
|
|
290
290
|
if (params.showK && kPoints.length >= 2) {
|
|
291
|
-
ctx.strokeStyle = colors.
|
|
291
|
+
ctx.strokeStyle = colors.kdj.k
|
|
292
292
|
ctx.beginPath()
|
|
293
293
|
ctx.moveTo(kPoints[0]!.x, kPoints[0]!.y)
|
|
294
294
|
for (let i = 1; i < kPoints.length; i++) {
|
|
@@ -299,7 +299,7 @@ function drawSTOCHLinesWithCanvas2D(
|
|
|
299
299
|
}
|
|
300
300
|
|
|
301
301
|
if (params.showD && dPoints.length >= 2) {
|
|
302
|
-
ctx.strokeStyle = colors.
|
|
302
|
+
ctx.strokeStyle = colors.kdj.d
|
|
303
303
|
ctx.beginPath()
|
|
304
304
|
ctx.moveTo(dPoints[0]!.x, dPoints[0]!.y)
|
|
305
305
|
for (let i = 1; i < dPoints.length; i++) {
|
|
@@ -321,9 +321,10 @@ export function getSTOCHTitleInfo(
|
|
|
321
321
|
m: number,
|
|
322
322
|
pluginHost: PluginHost,
|
|
323
323
|
paneId: string = 'sub_STOCH',
|
|
324
|
-
theme:
|
|
324
|
+
theme: 'light' | 'dark' = 'light',
|
|
325
|
+
isAsiaMarket?: boolean
|
|
325
326
|
): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
|
|
326
|
-
const colors =
|
|
327
|
+
const colors = resolveThemeColors(theme, isAsiaMarket)
|
|
327
328
|
const state = pluginHost.getSharedState<STOCHRenderState>(createSTOCHStateKey(paneId))
|
|
328
329
|
if (!state) return null
|
|
329
330
|
|
|
@@ -331,8 +332,8 @@ export function getSTOCHTitleInfo(
|
|
|
331
332
|
if (!point || point.k === undefined) return null
|
|
332
333
|
|
|
333
334
|
const values = []
|
|
334
|
-
if (state.params.showK) values.push({ label: 'K', value: point.k, color: colors.
|
|
335
|
-
if (state.params.showD) values.push({ label: 'D', value: point.d, color: colors.
|
|
335
|
+
if (state.params.showK) values.push({ label: 'K', value: point.k, color: colors.kdj.k })
|
|
336
|
+
if (state.params.showD) values.push({ label: 'D', value: point.d, color: colors.kdj.d })
|
|
336
337
|
|
|
337
338
|
if (values.length === 0) return null
|
|
338
339
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveThemeColors } from '../../../tokens'
|
|
2
2
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
3
3
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
4
4
|
import type { StructureRenderState } from '../../indicators/structureState'
|
|
@@ -41,7 +41,7 @@ export function createStructureRendererPlugin(options: { paneId?: string } = {})
|
|
|
41
41
|
getDeclaredNamespaces() { const key = resolveKey(); return key ? [key] : [] },
|
|
42
42
|
draw(context: RenderContext) {
|
|
43
43
|
const { ctx, pane, range, scrollLeft, kLineCenters } = context
|
|
44
|
-
const colors =
|
|
44
|
+
const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
45
45
|
const stateKey = resolveKey()
|
|
46
46
|
if (!stateKey) return
|
|
47
47
|
const state = pluginHost?.getSharedState<StructureRenderState>(stateKey)
|
|
@@ -64,7 +64,7 @@ export function createStructureRendererPlugin(options: { paneId?: string } = {})
|
|
|
64
64
|
const centerX = kLineCenters[s.index - range.start]
|
|
65
65
|
if (centerX === undefined) continue
|
|
66
66
|
const y = toY(s.price)
|
|
67
|
-
ctx.fillStyle = s.label === 'HH' ? colors.
|
|
67
|
+
ctx.fillStyle = s.label === 'HH' ? colors.structure.hh : s.label === 'HL' ? colors.structure.hl : s.label === 'LH' ? colors.structure.lh : colors.structure.ll
|
|
68
68
|
const labelY = s.kind === 'high' ? y - 8 : y + 16
|
|
69
69
|
ctx.fillText(s.label, centerX, labelY)
|
|
70
70
|
// Dot
|
|
@@ -86,12 +86,12 @@ export function createStructureRendererPlugin(options: { paneId?: string } = {})
|
|
|
86
86
|
const x2 = kLineCenters[ev.index - range.start]
|
|
87
87
|
if (x1 === undefined || x2 === undefined) continue
|
|
88
88
|
const y = toY(ev.brokenLevel)
|
|
89
|
-
ctx.strokeStyle = ev.kind === 'BOS' ? colors.
|
|
89
|
+
ctx.strokeStyle = ev.kind === 'BOS' ? colors.structure.bos : colors.structure.choch
|
|
90
90
|
ctx.beginPath()
|
|
91
91
|
ctx.moveTo(x1, y)
|
|
92
92
|
ctx.lineTo(x2, y)
|
|
93
93
|
ctx.stroke()
|
|
94
|
-
ctx.fillStyle = ev.kind === 'BOS' ? colors.
|
|
94
|
+
ctx.fillStyle = ev.kind === 'BOS' ? colors.structure.bos : colors.structure.choch
|
|
95
95
|
ctx.fillText(ev.kind, (x1 + x2) / 2, y - 4)
|
|
96
96
|
}
|
|
97
97
|
ctx.setLineDash([])
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
3
|
-
import {
|
|
3
|
+
import { resolveThemeColors } from '../../../tokens'
|
|
4
4
|
import { alignToPhysicalPixelCenter } from '../../draw/pixelAlign'
|
|
5
5
|
import type { WMSRRenderState } from '../../indicators/wmsrState'
|
|
6
6
|
import { createWMSRStateKey } from '../../indicators/wmsrState'
|
|
@@ -82,7 +82,7 @@ export function createWMSRRendererPlugin(options: WMSRRendererOptions = {}): Ren
|
|
|
82
82
|
displayMin: number,
|
|
83
83
|
displayMax: number,
|
|
84
84
|
dpr: number,
|
|
85
|
-
colors: {
|
|
85
|
+
colors: { wmsr: { overbought: string; oversold: string }; wmsrGrid: string }
|
|
86
86
|
): void {
|
|
87
87
|
const displayValueRange = displayMax - displayMin || 1
|
|
88
88
|
const y20 = alignToPhysicalPixelCenter(paneHeight - (-20 - displayMin) / displayValueRange * paneHeight, dpr)
|
|
@@ -95,19 +95,19 @@ export function createWMSRRendererPlugin(options: WMSRRendererOptions = {}): Ren
|
|
|
95
95
|
ctx.lineWidth = 1
|
|
96
96
|
ctx.setLineDash([4, 4])
|
|
97
97
|
|
|
98
|
-
ctx.strokeStyle = colors.
|
|
98
|
+
ctx.strokeStyle = colors.wmsr.overbought
|
|
99
99
|
ctx.beginPath()
|
|
100
100
|
ctx.moveTo(0, y20)
|
|
101
101
|
ctx.lineTo(paneWidth, y20)
|
|
102
102
|
ctx.stroke()
|
|
103
103
|
|
|
104
|
-
ctx.strokeStyle = colors.
|
|
104
|
+
ctx.strokeStyle = colors.wmsr.oversold
|
|
105
105
|
ctx.beginPath()
|
|
106
106
|
ctx.moveTo(0, y80)
|
|
107
107
|
ctx.lineTo(paneWidth, y80)
|
|
108
108
|
ctx.stroke()
|
|
109
109
|
|
|
110
|
-
ctx.strokeStyle = colors.
|
|
110
|
+
ctx.strokeStyle = colors.wmsrGrid
|
|
111
111
|
ctx.beginPath()
|
|
112
112
|
ctx.moveTo(0, y50)
|
|
113
113
|
ctx.lineTo(paneWidth, y50)
|
|
@@ -160,7 +160,7 @@ export function createWMSRRendererPlugin(options: WMSRRendererOptions = {}): Ren
|
|
|
160
160
|
|
|
161
161
|
draw(context: RenderContext) {
|
|
162
162
|
const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = context
|
|
163
|
-
const colors =
|
|
163
|
+
const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
164
164
|
|
|
165
165
|
const stateKey = resolveKey()
|
|
166
166
|
if (!stateKey) return
|
|
@@ -230,7 +230,7 @@ const { ctx, pane, range, scrollLeft, dpr, kLineCenters, lineWebGLSurface } = co
|
|
|
230
230
|
if (enableWebGL && lineWebGLSurface?.isAvailable()) {
|
|
231
231
|
if (params.showWMSR && cachedWMSRPoints.length >= 2) {
|
|
232
232
|
const ok = lineWebGLSurface.drawLineStrips(
|
|
233
|
-
[{ points: cachedWMSRPoints, width: 1, color: colors.
|
|
233
|
+
[{ points: cachedWMSRPoints, width: 1, color: colors.wmsr.wmsr }],
|
|
234
234
|
scrollLeft
|
|
235
235
|
)
|
|
236
236
|
if (ok) {
|
|
@@ -266,13 +266,13 @@ function drawWMSRLineWithCanvas2D(
|
|
|
266
266
|
scrollLeft: number,
|
|
267
267
|
wmsrPoints: LinePoint[],
|
|
268
268
|
params: { showWMSR: boolean },
|
|
269
|
-
colors: {
|
|
269
|
+
colors: { wmsr: { wmsr: string } }
|
|
270
270
|
): void {
|
|
271
271
|
if (!params.showWMSR || wmsrPoints.length < 2) return
|
|
272
272
|
|
|
273
273
|
ctx.save()
|
|
274
274
|
ctx.translate(-scrollLeft, 0)
|
|
275
|
-
ctx.strokeStyle = colors.
|
|
275
|
+
ctx.strokeStyle = colors.wmsr.wmsr
|
|
276
276
|
ctx.lineWidth = 1
|
|
277
277
|
ctx.lineJoin = 'round'
|
|
278
278
|
ctx.lineCap = 'round'
|
|
@@ -294,9 +294,10 @@ export function getWMSRTitleInfo(
|
|
|
294
294
|
period: number,
|
|
295
295
|
pluginHost: PluginHost,
|
|
296
296
|
paneId: string = 'sub_WMSR',
|
|
297
|
-
theme:
|
|
297
|
+
theme: 'light' | 'dark' = 'light',
|
|
298
|
+
isAsiaMarket?: boolean
|
|
298
299
|
): { name: string; params: number[]; values: Array<{ label: string; value: number; color: string }> } | null {
|
|
299
|
-
const colors =
|
|
300
|
+
const colors = resolveThemeColors(theme, isAsiaMarket)
|
|
300
301
|
const state = pluginHost.getSharedState<WMSRRenderState>(createWMSRStateKey(paneId))
|
|
301
302
|
if (!state) return null
|
|
302
303
|
|
|
@@ -307,7 +308,7 @@ export function getWMSRTitleInfo(
|
|
|
307
308
|
name: 'WMSR',
|
|
308
309
|
params: [period],
|
|
309
310
|
values: [
|
|
310
|
-
{ label: 'WMSR', value: wmsr, color: colors.
|
|
311
|
+
{ label: 'WMSR', value: wmsr, color: colors.wmsr.wmsr },
|
|
311
312
|
],
|
|
312
313
|
}
|
|
313
314
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveThemeColors } from '../../../tokens'
|
|
2
2
|
import type { RendererPluginWithHost, RenderContext, PluginHost } from '../../../plugin'
|
|
3
3
|
import { RENDERER_PRIORITY } from '../../../plugin'
|
|
4
4
|
import type { ZonesRenderState } from '../../indicators/zonesState'
|
|
@@ -39,7 +39,7 @@ export function createZonesRendererPlugin(options: { paneId?: string } = {}): Re
|
|
|
39
39
|
getDeclaredNamespaces() { const key = resolveKey(); return key ? [key] : [] },
|
|
40
40
|
draw(context: RenderContext) {
|
|
41
41
|
const { ctx, pane, range, scrollLeft, kLineCenters } = context
|
|
42
|
-
const colors =
|
|
42
|
+
const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
43
43
|
const stateKey = resolveKey()
|
|
44
44
|
if (!stateKey) return
|
|
45
45
|
const state = pluginHost?.getSharedState<ZonesRenderState>(stateKey)
|
|
@@ -69,10 +69,10 @@ export function createZonesRendererPlugin(options: { paneId?: string } = {}): Re
|
|
|
69
69
|
|
|
70
70
|
const yHigh = toY(zone.high)
|
|
71
71
|
const yLow = toY(zone.low)
|
|
72
|
-
const fill = zone.kind === 'FVG_BULL' ? colors.
|
|
73
|
-
: zone.kind === 'FVG_BEAR' ? colors.
|
|
74
|
-
: zone.kind === 'OB_BULL' ? colors.
|
|
75
|
-
: colors.
|
|
72
|
+
const fill = zone.kind === 'FVG_BULL' ? colors.zones.fvgBullFill
|
|
73
|
+
: zone.kind === 'FVG_BEAR' ? colors.zones.fvgBearFill
|
|
74
|
+
: zone.kind === 'OB_BULL' ? colors.zones.obBullFill
|
|
75
|
+
: colors.zones.obBearFill
|
|
76
76
|
ctx.fillStyle = fill
|
|
77
77
|
ctx.fillRect(startX, yHigh, endX - startX, yLow - yHigh)
|
|
78
78
|
}
|
|
@@ -102,4 +102,4 @@ export function createZonesRendererPlugin(options: { paneId?: string } = {}): Re
|
|
|
102
102
|
})
|
|
103
103
|
class ZonesDefinition {
|
|
104
104
|
static rendererFactory = createZonesRendererPlugin
|
|
105
|
-
}
|
|
105
|
+
}
|
|
@@ -3,7 +3,7 @@ import { RENDERER_PRIORITY } from '../../plugin'
|
|
|
3
3
|
import type { KLineData } from '../../types/price'
|
|
4
4
|
import { getKLineTrend, type kLineTrend } from '../../types/kLine'
|
|
5
5
|
import { createAlignedKLineFromPx, createVerticalLineRect } from '../draw/pixelAlign'
|
|
6
|
-
import {
|
|
6
|
+
import { resolveThemeColors, type VolumePriceColors } from '../../tokens'
|
|
7
7
|
import { getPhysicalKLineConfig } from '../chart'
|
|
8
8
|
import { VolumePriceRelation } from '../../types/volumePrice'
|
|
9
9
|
import { analyzeVolumePriceRelationBatch, DEFAULT_VOLUME_PRICE_CONFIG } from '../../utils/volumePrice'
|
|
@@ -52,7 +52,7 @@ export function createCandleRenderer(): RendererPlugin {
|
|
|
52
52
|
|
|
53
53
|
draw(context: RenderContext) {
|
|
54
54
|
const { ctx, pane, data, range, scrollLeft, kWidth, kGap, dpr, kLinePositions, markerManager, settings } = context
|
|
55
|
-
const colors =
|
|
55
|
+
const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
56
56
|
const klineData = data as KLineData[]
|
|
57
57
|
if (!klineData.length) return
|
|
58
58
|
|
|
@@ -67,9 +67,9 @@ export function createCandleRenderer(): RendererPlugin {
|
|
|
67
67
|
settings,
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
const usedWebGL = drawCandlesWithWebGL(context, prepared, colors.
|
|
70
|
+
const usedWebGL = drawCandlesWithWebGL(context, prepared, colors.candleUpBody, colors.candleDownBody)
|
|
71
71
|
if (!usedWebGL) {
|
|
72
|
-
drawCandlesWithCanvas2D(ctx, scrollLeft, prepared, colors.
|
|
72
|
+
drawCandlesWithCanvas2D(ctx, scrollLeft, prepared, colors.candleUpBody, colors.candleDownBody)
|
|
73
73
|
} else {
|
|
74
74
|
compositeWebGLToMainCanvas(ctx, context)
|
|
75
75
|
}
|
|
@@ -238,29 +238,29 @@ function prepareCandles(args: {
|
|
|
238
238
|
}
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
-
function drawCandlesWithCanvas2D(ctx: CanvasRenderingContext2D, scrollLeft: number, prepared: PreparedCandles,
|
|
241
|
+
function drawCandlesWithCanvas2D(ctx: CanvasRenderingContext2D, scrollLeft: number, prepared: PreparedCandles, upColor: string, downColor: string): void {
|
|
242
242
|
ctx.save()
|
|
243
243
|
ctx.translate(-scrollLeft, 0)
|
|
244
244
|
|
|
245
|
-
ctx.fillStyle =
|
|
245
|
+
ctx.fillStyle = upColor
|
|
246
246
|
for (let i = 0; i < prepared.upBodyCount; i++) {
|
|
247
247
|
const off = i * 4
|
|
248
248
|
ctx.fillRect(prepared.upBodyBuf[off], prepared.upBodyBuf[off + 1], prepared.upBodyBuf[off + 2], prepared.upBodyBuf[off + 3])
|
|
249
249
|
}
|
|
250
250
|
|
|
251
|
-
ctx.fillStyle =
|
|
251
|
+
ctx.fillStyle = downColor
|
|
252
252
|
for (let i = 0; i < prepared.downBodyCount; i++) {
|
|
253
253
|
const off = i * 4
|
|
254
254
|
ctx.fillRect(prepared.downBodyBuf[off], prepared.downBodyBuf[off + 1], prepared.downBodyBuf[off + 2], prepared.downBodyBuf[off + 3])
|
|
255
255
|
}
|
|
256
256
|
|
|
257
|
-
ctx.fillStyle =
|
|
257
|
+
ctx.fillStyle = upColor
|
|
258
258
|
for (let i = 0; i < prepared.upWickCount; i++) {
|
|
259
259
|
const off = i * 4
|
|
260
260
|
ctx.fillRect(prepared.upWickBuf[off], prepared.upWickBuf[off + 1], prepared.wickWidth, prepared.upWickBuf[off + 3])
|
|
261
261
|
}
|
|
262
262
|
|
|
263
|
-
ctx.fillStyle =
|
|
263
|
+
ctx.fillStyle = downColor
|
|
264
264
|
for (let i = 0; i < prepared.downWickCount; i++) {
|
|
265
265
|
const off = i * 4
|
|
266
266
|
ctx.fillRect(prepared.downWickBuf[off], prepared.downWickBuf[off + 1], prepared.wickWidth, prepared.downWickBuf[off + 3])
|
|
@@ -269,17 +269,17 @@ function drawCandlesWithCanvas2D(ctx: CanvasRenderingContext2D, scrollLeft: numb
|
|
|
269
269
|
ctx.restore()
|
|
270
270
|
}
|
|
271
271
|
|
|
272
|
-
function drawCandlesWithWebGL(context: RenderContext, prepared: PreparedCandles,
|
|
272
|
+
function drawCandlesWithWebGL(context: RenderContext, prepared: PreparedCandles, upColor: string, downColor: string): boolean {
|
|
273
273
|
if (context.settings?.enableWebGLRendering === false) return false
|
|
274
274
|
const surface = context.candleWebGLSurface
|
|
275
275
|
if (!surface || !surface.isAvailable()) return false
|
|
276
276
|
|
|
277
277
|
surface.clear()
|
|
278
278
|
|
|
279
|
-
const bodyUpOk = prepared.upBodyCount === 0 || surface.drawRectBuffer(prepared.upBodyBuf.subarray(0, prepared.upBodyCount * 4), prepared.upBodyCount,
|
|
280
|
-
const bodyDownOk = prepared.downBodyCount === 0 || surface.drawRectBuffer(prepared.downBodyBuf.subarray(0, prepared.downBodyCount * 4), prepared.downBodyCount,
|
|
281
|
-
const wickUpOk = prepared.upWickCount === 0 || surface.drawRectBuffer(prepared.upWickBuf.subarray(0, prepared.upWickCount * 4), prepared.upWickCount,
|
|
282
|
-
const wickDownOk = prepared.downWickCount === 0 || surface.drawRectBuffer(prepared.downWickBuf.subarray(0, prepared.downWickCount * 4), prepared.downWickCount,
|
|
279
|
+
const bodyUpOk = prepared.upBodyCount === 0 || surface.drawRectBuffer(prepared.upBodyBuf.subarray(0, prepared.upBodyCount * 4), prepared.upBodyCount, upColor, context.scrollLeft)
|
|
280
|
+
const bodyDownOk = prepared.downBodyCount === 0 || surface.drawRectBuffer(prepared.downBodyBuf.subarray(0, prepared.downBodyCount * 4), prepared.downBodyCount, downColor, context.scrollLeft)
|
|
281
|
+
const wickUpOk = prepared.upWickCount === 0 || surface.drawRectBuffer(prepared.upWickBuf.subarray(0, prepared.upWickCount * 4), prepared.upWickCount, upColor, context.scrollLeft)
|
|
282
|
+
const wickDownOk = prepared.downWickCount === 0 || surface.drawRectBuffer(prepared.downWickBuf.subarray(0, prepared.downWickCount * 4), prepared.downWickCount, downColor, context.scrollLeft)
|
|
283
283
|
|
|
284
284
|
return bodyUpOk && bodyDownOk && wickUpOk && wickDownOk
|
|
285
285
|
}
|
|
@@ -297,7 +297,7 @@ function drawVolumePriceMarkers(
|
|
|
297
297
|
markerManager: MarkerManager | undefined
|
|
298
298
|
): void {
|
|
299
299
|
const { ctx, range, kWidth, dpr } = context
|
|
300
|
-
const colors =
|
|
300
|
+
const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
301
301
|
if (!prepared.showVolumePriceMarkers || !markerManager || (context.zoomLevel ?? 1) < 2) {
|
|
302
302
|
return
|
|
303
303
|
}
|
|
@@ -312,7 +312,7 @@ function drawVolumePriceMarkers(
|
|
|
312
312
|
const markerY = isRising ? k.alignedHighY - 15 : k.alignedLowY + 15
|
|
313
313
|
const posIndex = k.i - range.start
|
|
314
314
|
const markerX = context.kLineCenters[posIndex]!
|
|
315
|
-
drawVolumePriceMarker(ctx, markerX, markerY, relation, k.i, kWidth, 4, markerManager, dpr, colors.
|
|
315
|
+
drawVolumePriceMarker(ctx, markerX, markerY, relation, k.i, kWidth, 4, markerManager, dpr, colors.volumePrice)
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
318
|
|
|
@@ -323,7 +323,7 @@ function drawVolumePriceMarkers(
|
|
|
323
323
|
const markerY = isRising ? k.alignedHighY - 15 : k.alignedLowY + 15
|
|
324
324
|
const posIndex = k.i - range.start
|
|
325
325
|
const markerX = context.kLineCenters[posIndex]!
|
|
326
|
-
drawVolumePriceMarker(ctx, markerX, markerY, relation, k.i, kWidth, 4, markerManager, dpr, colors.
|
|
326
|
+
drawVolumePriceMarker(ctx, markerX, markerY, relation, k.i, kWidth, 4, markerManager, dpr, colors.volumePrice)
|
|
327
327
|
}
|
|
328
328
|
}
|
|
329
329
|
|
|
@@ -366,19 +366,19 @@ export function drawVolumePriceMarker(
|
|
|
366
366
|
|
|
367
367
|
switch (relation) {
|
|
368
368
|
case VolumePriceRelation.RISE_WITH_VOLUME:
|
|
369
|
-
color = volumePriceColors.
|
|
369
|
+
color = volumePriceColors.riseWith
|
|
370
370
|
isUp = true
|
|
371
371
|
break
|
|
372
372
|
case VolumePriceRelation.RISE_WITHOUT_VOLUME:
|
|
373
|
-
color = volumePriceColors.
|
|
373
|
+
color = volumePriceColors.riseWithout
|
|
374
374
|
isUp = true
|
|
375
375
|
break
|
|
376
376
|
case VolumePriceRelation.FALL_WITH_VOLUME:
|
|
377
|
-
color = volumePriceColors.
|
|
377
|
+
color = volumePriceColors.fallWith
|
|
378
378
|
isUp = false
|
|
379
379
|
break
|
|
380
380
|
case VolumePriceRelation.FALL_WITHOUT_VOLUME:
|
|
381
|
-
color = volumePriceColors.
|
|
381
|
+
color = volumePriceColors.fallWithout
|
|
382
382
|
isUp = false
|
|
383
383
|
break
|
|
384
384
|
default:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { RendererPlugin, RenderContext } from '../../plugin'
|
|
2
2
|
import { RENDERER_PRIORITY, GLOBAL_PANE_ID } from '../../plugin'
|
|
3
3
|
import { createHorizontalLineRect, createVerticalLineRect } from '../draw/pixelAlign'
|
|
4
|
-
import {
|
|
4
|
+
import { resolveThemeColors } from '../../tokens'
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* 创建十字线渲染器插件
|
|
@@ -27,7 +27,7 @@ export function createCrosshairRendererPlugin(options: {
|
|
|
27
27
|
|
|
28
28
|
draw(context: RenderContext) {
|
|
29
29
|
const { pane, dpr, paneWidth, overlayCtx } = context
|
|
30
|
-
const colors =
|
|
30
|
+
const colors = resolveThemeColors(context.theme, context.isAsiaMarket, context.colorPresetSettings)
|
|
31
31
|
const state = options.getCrosshairState()
|
|
32
32
|
|
|
33
33
|
if (state.isDragging || !state.pos) return
|
|
@@ -50,7 +50,7 @@ export function createCrosshairRendererPlugin(options: {
|
|
|
50
50
|
ctx.rect(0, 0, paneWidth, pane.height)
|
|
51
51
|
ctx.clip()
|
|
52
52
|
|
|
53
|
-
ctx.fillStyle = colors.
|
|
53
|
+
ctx.fillStyle = colors.crosshairLine
|
|
54
54
|
|
|
55
55
|
// 绘制垂直线
|
|
56
56
|
const v = createVerticalLineRect(x, 0, pane.height, dpr)
|