161 lines
7.0 KiB
Go
161 lines
7.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/egoist/mygo/ui"
|
|
mujica "mujicaui"
|
|
"time"
|
|
)
|
|
|
|
func marketsSentimentGaugeDemo(c *ui.Context, log func(string)) {
|
|
disabled := ui.Local(c.Root(), "196.disabled", func() bool { return false })
|
|
if mujica.Checkbox(c, disabled, "Disabled", mujica.CheckboxOptions{}).Changed() {
|
|
log(fmt.Sprint("disabled ", *disabled))
|
|
}
|
|
value := 72.0
|
|
|
|
level := ui.Local(c.Root(), "196.value", func() float64 { return 72 })
|
|
if mujica.Slider(c, level, mujica.SliderOptions{Min: 0, Max: 100, Step: 1, Label: "Sentiment", ShowValue: true}).Changed() {
|
|
log(fmt.Sprint(*level))
|
|
}
|
|
value = *level
|
|
status, empty, err := marketsDataState(c, "196", log)
|
|
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
|
|
mujica.SentimentGauge(c, value, mujica.SentimentGaugeOptions{Label: "Fear & Greed", Status: status, Empty: empty, Error: err, Retry: func() { log("retry requested") }})
|
|
})
|
|
}
|
|
|
|
func marketsPortfolioSummaryDemo(c *ui.Context, log func(string)) {
|
|
disabled := ui.Local(c.Root(), "197.disabled", func() bool { return false })
|
|
if mujica.Checkbox(c, disabled, "Disabled", mujica.CheckboxOptions{}).Changed() {
|
|
log(fmt.Sprint("disabled ", *disabled))
|
|
}
|
|
account := ui.Local(c.Root(), "197.account", func() string { return "" })
|
|
accounts := *ui.Local(c.Root(), "markets.PortfolioSummary.accounts.pages_markets_4", func() []mujica.PortfolioAccount {
|
|
return []mujica.PortfolioAccount{{ID: "a", Name: "Brokerage", Total: 120000, DayPnL: 1250, TotalReturn: 20000, Cost: 100000}, {ID: "b", Name: "Retirement", Total: 80000, DayPnL: -300, TotalReturn: 5000, Cost: 75000}}
|
|
})
|
|
|
|
assets := ui.Local(c.Root(), "197.assets", func() float64 { return 120000 })
|
|
if mujica.NumberInput(c, assets, mujica.NumberInputOptions{Min: 0, Max: 1000000, Step: 100, Precision: 2, Label: "Brokerage assets"}).Changed() {
|
|
log(fmt.Sprint(*assets))
|
|
}
|
|
accounts[0].Total = *assets
|
|
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
|
|
r := mujica.PortfolioSummary(c, account, accounts, mujica.PortfolioSummaryOptions{})
|
|
if r.Changed() {
|
|
log(fmt.Sprint(account))
|
|
}
|
|
})
|
|
}
|
|
|
|
func marketsAssetAllocationChartDemo(c *ui.Context, log func(string)) {
|
|
disabled := ui.Local(c.Root(), "198.disabled", func() bool { return false })
|
|
if mujica.Checkbox(c, disabled, "Disabled", mujica.CheckboxOptions{}).Changed() {
|
|
log(fmt.Sprint("disabled ", *disabled))
|
|
}
|
|
items := *ui.Local(c.Root(), "markets.AssetAllocationChart.items.pages_markets_4", func() []mujica.AllocationItem {
|
|
return []mujica.AllocationItem{{Name: "Stocks", Value: 60, Target: 50}, {Name: "Bonds", Value: 30, Target: 40}, {Name: "Cash", Value: 10, Target: 10}}
|
|
})
|
|
|
|
status := ui.Local(c.Root(), "198.status", func() int { return 0 })
|
|
if mujica.RadioGroup(c, status, []mujica.RadioItem[int]{{Value: 0, Label: "Ready"}, {Value: 1, Label: "Loading"}, {Value: 2, Label: "Empty"}, {Value: 3, Label: "Error"}}, mujica.RadioGroupOptions{Horizontal: true}).Changed() {
|
|
log(fmt.Sprint("status ", *status))
|
|
}
|
|
frame := mujica.ChartFrame{Label: "AssetAllocationChart"}
|
|
if *status == 1 {
|
|
frame.Status = mujica.DataLoading
|
|
}
|
|
if *status == 3 {
|
|
frame.Status = mujica.DataFailed
|
|
frame.Error = "Sample failed"
|
|
}
|
|
if *status == 2 {
|
|
items = nil
|
|
}
|
|
tolerance := ui.Local(c.Root(), "198.tolerance", func() float64 { return 5 })
|
|
if mujica.Slider(c, tolerance, mujica.SliderOptions{Min: 1, Max: 15, Step: 1, Label: "Drift tolerance", ShowValue: true}).Changed() {
|
|
log(fmt.Sprint(*tolerance))
|
|
}
|
|
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
|
|
r := mujica.AssetAllocationChart(c, items, mujica.AssetAllocationChartOptions{Frame: frame, Tolerance: *tolerance})
|
|
if r.Changed() || r.Retried() {
|
|
log(fmt.Sprint(r.Point))
|
|
}
|
|
})
|
|
}
|
|
|
|
func marketsPerformanceChartDemo(c *ui.Context, log func(string)) {
|
|
disabled := ui.Local(c.Root(), "199.disabled", func() bool { return false })
|
|
if mujica.Checkbox(c, disabled, "Disabled", mujica.CheckboxOptions{}).Changed() {
|
|
log(fmt.Sprint("disabled ", *disabled))
|
|
}
|
|
values := *ui.Local(c.Root(), "markets.PerformanceChart.values.pages_markets_4", func() []float64 { return []float64{100, 110, 95, 120} })
|
|
benchmark := *ui.Local(c.Root(), "markets.PerformanceChart.benchmark.pages_markets_4", func() []float64 { return []float64{100, 105, 108, 112} })
|
|
times := *ui.Local(c.Root(), "markets.PerformanceChart.times.pages_markets_4", func() []time.Time {
|
|
return []time.Time{time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 2, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 3, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 4, 1, 0, 0, 0, 0, time.UTC)}
|
|
})
|
|
|
|
status := ui.Local(c.Root(), "199.status", func() int { return 0 })
|
|
if mujica.RadioGroup(c, status, []mujica.RadioItem[int]{{Value: 0, Label: "Ready"}, {Value: 1, Label: "Loading"}, {Value: 2, Label: "Empty"}, {Value: 3, Label: "Error"}}, mujica.RadioGroupOptions{Horizontal: true}).Changed() {
|
|
log(fmt.Sprint("status ", *status))
|
|
}
|
|
frame := mujica.ChartFrame{Label: "PerformanceChart"}
|
|
if *status == 1 {
|
|
frame.Status = mujica.DataLoading
|
|
}
|
|
if *status == 3 {
|
|
frame.Status = mujica.DataFailed
|
|
frame.Error = "Sample failed"
|
|
}
|
|
if *status == 2 {
|
|
values = nil
|
|
benchmark = nil
|
|
times = nil
|
|
}
|
|
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
|
|
r := mujica.PerformanceChart(c, values, mujica.PerformanceChartOptions{Frame: frame, Times: times, Benchmark: benchmark})
|
|
if r.Changed() || r.Retried() {
|
|
log(fmt.Sprint(r.Point))
|
|
}
|
|
if name, ok := r.Toggled(); ok {
|
|
log(fmt.Sprint(name))
|
|
}
|
|
})
|
|
}
|
|
|
|
func marketsCurrencyConverterDemo(c *ui.Context, log func(string)) {
|
|
disabled := ui.Local(c.Root(), "200.disabled", func() bool { return false })
|
|
if mujica.Checkbox(c, disabled, "Disabled", mujica.CheckboxOptions{}).Changed() {
|
|
log(fmt.Sprint("disabled ", *disabled))
|
|
}
|
|
state := ui.Local(c.Root(), "200.state", func() mujica.CurrencyConverterState {
|
|
return mujica.CurrencyConverterState{Amount: 100, From: "USD", To: "JPY"}
|
|
})
|
|
currencies := *ui.Local(c.Root(), "markets.CurrencyConverter.currencies.pages_markets_4", func() []mujica.Currency {
|
|
return []mujica.Currency{{Code: "USD", Name: "Dollar", Decimals: 2}, {Code: "JPY", Name: "Yen", Decimals: 0}}
|
|
})
|
|
rate := ui.Local(c.Root(), "200.rate", func() float64 { return 149.37 })
|
|
|
|
if mujica.NumberInput(c, rate, mujica.NumberInputOptions{Min: 0, Max: 1000, Step: 0.0001, Precision: 4, Label: "Caller rate"}).Changed() {
|
|
log(fmt.Sprint("rate ", *rate))
|
|
}
|
|
if mujica.Button(c, "Load pair rate", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() {
|
|
*rate = 149.37
|
|
if state.From == "JPY" {
|
|
*rate = 1 / 149.37
|
|
}
|
|
log("pair rate loaded")
|
|
}
|
|
beforeAmount := state.Amount
|
|
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
|
|
r := mujica.CurrencyConverter(c, state, currencies, mujica.CurrencyConverterOptions{Rate: *rate, RateFrom: state.From, RateTo: state.To})
|
|
if r.PairChanged {
|
|
*rate = 0
|
|
log(fmt.Sprint(state.From, state.To))
|
|
}
|
|
})
|
|
if state.Amount != beforeAmount {
|
|
log(fmt.Sprint("amount ", state.Amount))
|
|
}
|
|
}
|