From ab59d51628f975f88d2ad697a1552b91694fa9e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 5 Oct 2026 14:53:33 -0400 Subject: [PATCH] WIP mktchart 2 --- indicator_pane.go | 220 ++++++++++++++++++ indicator_pane_test.go | 65 ++++++ messages_mktchart.go | 1 + .../snapshots/darwin/indicator_pane-dark.png | Bin 0 -> 34670 bytes .../snapshots/darwin/indicator_pane-light.png | Bin 0 -> 33684 bytes .../snapshots/darwin/volume_chart-dark.png | Bin 0 -> 8066 bytes .../snapshots/darwin/volume_chart-light.png | Bin 0 -> 7686 bytes volume_chart.go | 139 +++++++++++ volume_chart_test.go | 56 +++++ 9 files changed, 481 insertions(+) create mode 100644 indicator_pane.go create mode 100644 indicator_pane_test.go create mode 100644 testdata/snapshots/darwin/indicator_pane-dark.png create mode 100644 testdata/snapshots/darwin/indicator_pane-light.png create mode 100644 testdata/snapshots/darwin/volume_chart-dark.png create mode 100644 testdata/snapshots/darwin/volume_chart-light.png create mode 100644 volume_chart.go create mode 100644 volume_chart_test.go diff --git a/indicator_pane.go b/indicator_pane.go new file mode 100644 index 0000000..547d864 --- /dev/null +++ b/indicator_pane.go @@ -0,0 +1,220 @@ +package mujica + +import ( + "fmt" + "log/slog" + "math" + "strings" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/internal" + "mujicaui/theme" +) + +// IndicatorPaneSpec is one lower pane: MACD, RSI, KDJ or OBV. +type IndicatorPaneSpec struct { + Kind IndicatorKind + // Params nil uses the kind's defaults. + Params []float64 +} + +// IndicatorPanes is the caller-held stack of panes and their height shares. +type IndicatorPanes struct { + Panes []IndicatorPaneSpec + // Sizes are the panes' height shares; they reset to equal when the pane count changes. + Sizes []float32 +} + +// IndicatorPaneOptions configure an IndicatorPane. +type IndicatorPaneOptions struct { + // Height is the whole stack's height; zero is 140 per pane. + Height float32 + // Label prefixes each pane's accessible name, as the symbol. + Label string + Disabled bool +} + +// IndicatorPaneResult reports the stack's events. +type IndicatorPaneResult struct { + Element *ui.Element + // Removed is the index of the pane closed this frame, -1 for none. + Removed int + // Resized reports finished height changes, for saving. + Resized bool +} + +// IndicatorPane stacks indicator panes under a price chart, sharing its view; dividers between them resize. +func IndicatorPane(c *ui.Context, candles []Candle, view *MarketView, panes *IndicatorPanes, opts IndicatorPaneOptions) IndicatorPaneResult { + if view == nil || panes == nil { + panic("mujica: IndicatorPane needs a view and panes") + } + res := IndicatorPaneResult{Removed: -1} + n := len(panes.Panes) + for _, p := range panes.Panes { + if _ = p.Kind.String(); indicatorInfo[p.Kind].overlay { + panic(fmt.Sprintf("mujica: %v is an overlay, not a pane indicator", p.Kind)) + } + indicatorParams(p.Kind, p.Params) + } + if n == 0 { + res.Element = ui.Column(c) + return res + } + if len(panes.Sizes) != n { + panes.Sizes = nil + } + h := opts.Height + if h == 0 { + h = 140 * float32(n) + } + build := func(i int) func() { + return func() { + col := ui.Column(c).Fill().MinHeight(0) + b := col.Bounds() + internal.Remeasure(c, col, b.W, b.H) + u := Density(c).Unit() + // The plot takes what the title, legend and readout rows leave. + plotH := max(40, b.H-2*theme.MinHitSize-u*12) + col.Children(func() { + if indicatorPaneOne(c, candles, view, panes.Panes[i], opts, plotH) { + res.Removed = i + } + }) + } + } + box := ui.Column(c).Height(h).FillWidth().Disabled(opts.Disabled) + box.Children(func() { + if n == 1 { + build(0)() + return + } + list := make([]ResizablePanel, n) + for i, p := range panes.Panes { + list[i] = ResizablePanel{Label: indicatorName(p.Kind, indicatorParams(p.Kind, p.Params)), Min: 60, Build: build(i)} + } + r := ResizablePanelGroup(c, &panes.Sizes, list, ResizablePanelGroupOptions{Vertical: true}) + r.Element.Fill() + res.Resized = r.Committed + }) + if res.Removed >= 0 { + slog.Debug("mujica: indicator_pane removed", "kind", panes.Panes[res.Removed].Kind) + panes.Panes = append(panes.Panes[:res.Removed:res.Removed], panes.Panes[res.Removed+1:]...) + panes.Sizes = nil + c.Invalidate() + } + res.Element = box + return res +} + +// indicatorPaneOne draws one pane's lines over the view's window; it reports the close button. +func indicatorPaneOne(c *ui.Context, candles []Candle, view *MarketView, spec IndicatorPaneSpec, opts IndicatorPaneOptions, height float32) bool { + k := Tokens(c) + params := indicatorParams(spec.Kind, spec.Params) + name := indicatorName(spec.Kind, params) + closed := false + ui.Row(c).AlignItems(ui.Center).Gap(Density(c).Unit()).Children(func() { + ui.Text(c, name).FontSize(FontSize(c, theme.CaptionSize)).FontWeight(600).TextColor(k.Text).Grow(1) + closed = iconAction(c, icons.Must("x"), fmt.Sprintf(msg(c, "indicator_pane.remove"), name)).Clicked() + }) + label := strings.TrimSpace(opts.Label + " " + name) + ch := newChart(c, ChartFrame{Label: label, Height: height}) + series := chartMemo(ch, "series", fmt.Sprintf("%s|%v|%v", chartID(candles), spec.Kind, params), func() []ChartSeries { + marketCheckCandles(candles) + return indicatorSeries(spec.Kind, params, candles) + }) + m := &mktCore{c: c, k: k, ch: ch, candles: candles, view: view} + m.window() + pal := internal.Palette(k) + lines := make([]mktLine, len(series)) + keys := make([]chartKey, len(series)) + for i, s := range series { + lines[i] = mktLine{name: s.Name, values: s.Values, color: pal[(i+1)%len(pal)], shape: i} + keys[i] = chartKey{Name: s.Name, Color: lines[i].color, Shape: i} + } + yr := chartMemo(ch, "y", [3]any{chartID(candles), m.from, m.to}, func() [2]float64 { + lo, hi := math.Inf(1), math.Inf(-1) + for _, l := range lines { + for i := m.from; i < m.to; i++ { + if v := l.values[i]; !math.IsNaN(v) { + lo, hi = min(lo, v), max(hi, v) + } + } + } + if spec.Kind == IndicatorRSI { + lo, hi = 0, 100 + } + return [2]float64{lo, hi} + }) + lo, hi := yr[0], yr[1] + spec2 := chartSpec{n: len(candles), keys: keys} + if m.to <= m.from || math.IsInf(lo, 0) { + spec2.n = 0 + } + m.lo, m.hi = lo, hi + spec2.pick = func(r ui.Rect, x, y float32) int { + g := m.paneGeom(r) + if !g.plot.Contains(x, y) { + return -1 + } + return g.index(m, x) + } + spec2.readout = func(i int) string { + parts := []string{candles[i].Time.Format("2006-01-02 15:04")} + for _, l := range lines { + parts = append(parts, l.name+" "+chartValue(c, l.values[i], func(v float64) string { return fmt.Sprintf("%.2f", v) })) + } + return strings.Join(parts, " · ") + } + spec2.draw = func(p *ui.Painter, r ui.Rect, active int) { + g := m.paneGeom(r) + size := FontSize(c, theme.CaptionSize) + internal.AxisY(p, g.plot, g.ys, g.ticks, func(v float64) string { return volumeShort(v, g.step) }, size, k) + p.Clip(g.plot, 0, func() { + for i, l := range lines { + if spec.Kind == IndicatorMACD && i == 2 { + indicatorPaneBars(p, g, m, l.values, c) + continue + } + mktPaintLine(p, g, m, l.values, l.color, i) + } + }) + if active >= m.from && active < m.to { + x := internal.Snap(p, g.x(m, active)) + p.Line(x, g.plot.Y, x, g.plot.Y+g.plot.H, 1, k.TextMuted) + } + } + ch.build(spec2) + return closed && !ch.res.Element.IsDisabled() +} + +// paneGeom is geom without the time axis, for lower panes. +func (m *mktCore) paneGeom(r ui.Rect) mktGeom { + plot := chartInset(r, 60, 4) + lo, hi, step := internal.Nice(m.lo, m.hi, 2) + return mktGeom{plot: plot, band: internal.Band{N: m.to - m.from, R0: plot.X, R1: plot.X + plot.W, Pad: 0.3}, + ys: internal.Linear{D0: lo, D1: hi, R0: float64(plot.Y + plot.H), R1: float64(plot.Y)}, ticks: internal.Ticks(lo, hi, step), step: step} +} + +// indicatorPaneBars draws MACD's histogram: hollow bars above zero, filled below. +func indicatorPaneBars(p *ui.Painter, g mktGeom, m *mktCore, vals []float64, c *ui.Context) { + k := Tokens(c) + zero := g.ys.Map(0) + w := max(1, g.band.Width()) + for i := m.from; i < m.to; i++ { + v := vals[i] + if math.IsNaN(v) { + continue + } + y := g.ys.Map(v) + x := internal.Snap(p, g.x(m, i)) + bar := ui.Rect{X: x - w/2, Y: min(y, zero), W: w, H: max(1, float32(math.Abs(float64(y-zero))))} + if v >= 0 && w >= 3 { + p.Fill(bar, k.Surface, 0) + p.Stroke(bar, trendColor(c, 1), 0, 1) + } else { + p.Fill(bar, trendColor(c, trendSign(v)), 0) + } + } +} diff --git a/indicator_pane_test.go b/indicator_pane_test.go new file mode 100644 index 0000000..332e2ac --- /dev/null +++ b/indicator_pane_test.go @@ -0,0 +1,65 @@ +package mujica + +import ( + "strings" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestIndicatorPaneStackReadAndRemove(t *testing.T) { + candles := sampleCandles(300) + view := MarketView{Count: 80} + panes := IndicatorPanes{Panes: []IndicatorPaneSpec{{Kind: IndicatorMACD}, {Kind: IndicatorRSI, Params: []float64{6}}}} + removed := -1 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if r := IndicatorPane(c, candles, &view, &panes, IndicatorPaneOptions{Label: "BTC"}); r.Removed >= 0 { + removed = r.Removed + } + }, 800, 500) + tt.Frame() + if !tt.HasText("MACD(12,26,9)") || !tt.HasText("RSI(6)") || len(panes.Sizes) != 2 { + t.Fatalf("texts %q sizes %v", tt.Texts(), panes.Sizes) + } + tt.Key(0, ui.KeyTab) // remove MACD + tt.Key(0, ui.KeyTab) // MACD plot + tt.Key(0, ui.KeyEnd) + found := false + for _, s := range tt.Texts() { + found = found || strings.Contains(s, "DIF ") && strings.Contains(s, "DEA ") + } + if !found { + t.Fatalf("MACD readout missing: %q", tt.Texts()) + } + if err := tt.Click("Remove MACD(12,26,9)"); err != nil { + t.Fatal(err) + } + if len(panes.Panes) != 1 || panes.Panes[0].Kind != IndicatorRSI || removed != 0 { + t.Fatalf("after remove %+v (%d)", panes.Panes, removed) + } + for name, p := range map[string]IndicatorPanes{ + "overlay kind": {Panes: []IndicatorPaneSpec{{Kind: IndicatorMA}}}, + "bad params": {Panes: []IndicatorPaneSpec{{Kind: IndicatorRSI, Params: []float64{1, 2}}}}, + } { + func() { + defer func() { + if recover() == nil { + t.Errorf("%s: no panic", name) + } + }() + ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); IndicatorPane(c, candles, &view, &p, IndicatorPaneOptions{}) }, 300, 200) + }() + } +} + +func TestIndicatorPaneSnapshot(t *testing.T) { + candles := sampleCandles(120) + view := MarketView{Count: 80} + panes := IndicatorPanes{Panes: []IndicatorPaneSpec{{Kind: IndicatorMACD}, {Kind: IndicatorKDJ}}} + snapshot(t, "indicator_pane", 640, 340, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { + IndicatorPane(c, candles, &view, &panes, IndicatorPaneOptions{Height: 316}) + }) + }) +} diff --git a/messages_mktchart.go b/messages_mktchart.go index e804b54..97e1603 100644 --- a/messages_mktchart.go +++ b/messages_mktchart.go @@ -13,6 +13,7 @@ func init() { "chart_sync.link": {"Sync with other charts", "与其他图表同步"}, "chart_sync.linked": {"Synced", "已同步"}, "chart_sync.unlinked": {"Not synced", "未同步"}, + "indicator_pane.remove": {"Remove %s", "移除 %s"}, "drawing_tools.note": {"Note", "标注"}, }) } diff --git a/testdata/snapshots/darwin/indicator_pane-dark.png b/testdata/snapshots/darwin/indicator_pane-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3cda3b48387268df44e6272c67b90af1daaac1 GIT binary patch literal 34670 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 X?j#sL4rFoxpiNR#PNe#WLE!%dw>%Sw literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/indicator_pane-light.png b/testdata/snapshots/darwin/indicator_pane-light.png new file mode 100644 index 0000000000000000000000000000000000000000..f4df8bda18034cc81cf5dfbd83b6ae86f029826a GIT binary patch literal 33684 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 Q{%svWOh{U=1g!1(U!8}M$N&HU literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/volume_chart-light.png b/testdata/snapshots/darwin/volume_chart-light.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4a431b879ad473012efc8e7ea212204cee5df9 GIT binary patch literal 7686 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 cd.Open + col := trendColor(c, 1) + if !up { + col = trendColor(c, -1) + } + if up && w >= 3 { + p.Fill(bar, k.Surface, 0) + p.Stroke(bar, col, 0, 1) + } else { + p.Fill(bar, col, 0) + } + } + m.st0().drawn = m.to - m.from + if at >= m.from && at < m.to { + x := internal.Snap(p, band.Center(at-m.from)) + p.Line(x, plot.Y, x, plot.Y+plot.H, 1, k.TextMuted) + } + } + res, plot := ch.build(spec) + if plot != nil && !plot.IsDisabled() { + room := m.room() + switch { + case plot.Shortcut(ui.Shift, ui.KeyLeft): + marketPan(view, len(candles), room, -max(1, (m.to-m.from)/10)) + case plot.Shortcut(ui.Shift, ui.KeyRight): + marketPan(view, len(candles), room, max(1, (m.to-m.from)/10)) + } + if f := ch.st.focus; f >= 0 && (f < m.from || f >= m.to) { + ch.st.focus = max(m.from, min(m.to-1, f)) + } + } + if s := opts.Sync; s != nil { + s.store(opts.SyncID, candles, view, res.Point) + } + return res +} + +// st0 is the chart's market state, made on first use. +func (m *mktCore) st0() *mktState { + if m.st == nil { + m.st = *ui.Local(m.ch.res.Element, "mujica.mkt", func() *mktState { return &mktState{grab: -1, focus: -1} }) + } + return m.st +} + +// volumeShort writes a volume tick as 1.2K, 3M or 4B. +func volumeShort(v, step float64) string { + for _, u := range []struct { + div float64 + unit string + }{{1e9, "B"}, {1e6, "M"}, {1e3, "K"}} { + if math.Abs(v) >= u.div { + return internal.FormatTick(v/u.div, step/u.div) + u.unit + } + } + return internal.FormatTick(v, step) +} diff --git a/volume_chart_test.go b/volume_chart_test.go new file mode 100644 index 0000000..ef563d6 --- /dev/null +++ b/volume_chart_test.go @@ -0,0 +1,56 @@ +package mujica + +import ( + "strings" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestVolumeChartSharesViewAndReads(t *testing.T) { + candles := sampleCandles(100000) + view := MarketView{Count: 60} + var price, vol ChartResult + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Width(800).Children(func() { + price = CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "Price"}}) + vol = VolumeChart(c, candles, &view, VolumeChartOptions{Frame: ChartFrame{Label: "Volume"}}) + }) + }, 820, 600) + tt.Frame() + if d := mktState0(vol).drawn; d != 60 { + t.Fatalf("volume drew %d bars", d) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnd) + found := false + for _, s := range tt.Texts() { + found = found || strings.HasPrefix(s, candles[99999].Time.Format("2006-01-02 15:04")+" · Vol ") + } + if !found || vol.Point != 99999 { + t.Fatalf("readout %q point %d", tt.Texts(), vol.Point) + } + tt.Key(ui.Shift, ui.KeyLeft) + if view.End == 0 { + t.Fatal("Shift+Left on volume did not pan the shared view") + } + _ = price + defer func() { + if recover() == nil { + t.Fatal("nil view accepted") + } + }() + ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); VolumeChart(c, candles, nil, VolumeChartOptions{}) }, 200, 100) +} + +func TestVolumeChartSnapshot(t *testing.T) { + candles := sampleCandles(80) + view := MarketView{Count: 60} + snapshot(t, "volume_chart", 640, 180, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { + VolumeChart(c, candles, &view, VolumeChartOptions{Frame: ChartFrame{Label: "Volume"}}) + }) + }) +}