feat: add color preference setting

This commit is contained in:
qiweiii 2023-07-16 14:11:40 +08:00
parent 5253f70cb4
commit abed6f8868
11 changed files with 71 additions and 21 deletions

View File

@ -11,11 +11,14 @@ import NavBar from '@/components/layout/NavBar.vue';
import NavFooter from '@/components/layout/NavFooter.vue'; import NavFooter from '@/components/layout/NavFooter.vue';
import BodyLayout from '@/components/layout/BodyLayout.vue'; import BodyLayout from '@/components/layout/BodyLayout.vue';
import { setTimezone } from './shared/formatters'; import { setTimezone } from './shared/formatters';
import { setProfitLossColorsCSS } from './shared/colorPreference';
import { onMounted, watch } from 'vue'; import { onMounted, watch } from 'vue';
import { useSettingsStore } from './stores/settings'; import { useSettingsStore } from './stores/settings';
const settingsStore = useSettingsStore(); const settingsStore = useSettingsStore();
onMounted(() => { onMounted(() => {
setTimezone(settingsStore.timezone); setTimezone(settingsStore.timezone);
setProfitLossColorsCSS(settingsStore.colorPreference);
settingsStore.updateProfitLossColor();
}); });
watch( watch(
() => settingsStore.timezone, () => settingsStore.timezone,
@ -24,6 +27,12 @@ watch(
setTimezone(tz); setTimezone(tz);
}, },
); );
watch(
() => settingsStore.colorPreference,
(preference) => {
setProfitLossColorsCSS(preference);
},
);
</script> </script>
<style scoped> <style scoped>

View File

@ -68,17 +68,6 @@ const MARGINRIGHT = '1%';
const NAMEGAP = 55; const NAMEGAP = 55;
const SUBPLOTHEIGHT = 8; // Value in % const SUBPLOTHEIGHT = 8; // Value in %
// Binance colors
const upColor = '#26A69A';
const upBorderColor = '#26A69A';
const downColor = '#EF5350';
const downBorderColor = '#EF5350';
const buySignalColor = '#00ff26';
const shortEntrySignalColor = '#00ff26';
const sellSignalColor = '#faba25';
const shortexitSignalColor = '#faba25';
const props = defineProps({ const props = defineProps({
trades: { required: false, default: () => [], type: Array as () => Trade[] }, trades: { required: false, default: () => [], type: Array as () => Trade[] },
dataset: { required: true, type: Object as () => PairHistory }, dataset: { required: true, type: Object as () => PairHistory },
@ -91,7 +80,23 @@ const props = defineProps({
type: Object as () => ChartSliderPosition, type: Object as () => ChartSliderPosition,
default: () => undefined, default: () => undefined,
}, },
colorPreference: { required: false, type: String, default: 'greenUp' },
}); });
// Candle Colors
const colorProfit = props.colorPreference === 'greenUp' ? '#26A69A' : '#EF5350';
const colorLoss = props.colorPreference === 'greenUp' ? '#EF5350' : '#26A69A';
const upColor = colorProfit;
const upBorderColor = colorProfit;
const downColor = colorLoss;
const downBorderColor = colorLoss;
// Buy / Sell Signal Colors
const buySignalColor = '#00ff26';
const shortEntrySignalColor = '#00ff26';
const sellSignalColor = '#faba25';
const shortexitSignalColor = '#faba25';
const candleChart = ref<typeof ECharts>(); const candleChart = ref<typeof ECharts>();
const chartOptions = ref<EChartsOption>({}); const chartOptions = ref<EChartsOption>({});

View File

@ -57,6 +57,7 @@
:use-u-t-c="settingsStore.timezone === 'UTC'" :use-u-t-c="settingsStore.timezone === 'UTC'"
:theme="settingsStore.chartTheme" :theme="settingsStore.chartTheme"
:slider-position="sliderPosition" :slider-position="sliderPosition"
:color-preference="settingsStore.colorPreference"
> >
</CandleChart> </CandleChart>
<div v-else class="m-auto"> <div v-else class="m-auto">

View File

@ -121,6 +121,7 @@ const cumulativeData = computed<CumProfitChartData[]>(() => {
}); });
function updateChart(initial = false) { function updateChart(initial = false) {
const { colorProfit, colorLoss } = settingsStore;
const chartOptionsLoc: EChartsOption = { const chartOptionsLoc: EChartsOption = {
dataset: { dataset: {
dimensions: ['date', 'profit', 'currentProfit'], dimensions: ['date', 'profit', 'currentProfit'],
@ -136,11 +137,11 @@ function updateChart(initial = false) {
animation: initial, animation: initial,
lineStyle: { lineStyle: {
color: openProfit.value > 0 ? 'green' : 'red', color: openProfit.value > 0 ? colorProfit : colorLoss,
type: 'dotted', type: 'dotted',
}, },
itemStyle: { itemStyle: {
color: openProfit.value > 0 ? 'green' : 'red', color: openProfit.value > 0 ? colorProfit : colorLoss,
}, },
encode: { encode: {
x: 'date', x: 'date',

View File

@ -106,12 +106,12 @@ const dailyChartOptions: ComputedRef<EChartsOption> = computed(() => {
{ {
max: 0.0, max: 0.0,
min: absoluteMin.value, min: absoluteMin.value,
color: 'red', color: settingsStore.colorLoss,
}, },
{ {
min: 0.0, min: 0.0,
max: absoluteMax.value, max: absoluteMax.value,
color: 'green', color: settingsStore.colorProfit,
}, },
], ],
}, },

View File

@ -123,12 +123,12 @@ const hourlyChartOptions = computed((): EChartsOption => {
{ {
max: 0.0, max: 0.0,
min: -2, min: -2,
color: 'red', color: settingsStore.colorLoss,
}, },
{ {
min: 0.0, min: 0.0,
max: 2, max: 2,
color: 'green', color: settingsStore.colorProfit,
}, },
], ],
}, },

View File

@ -140,11 +140,11 @@ const chartOptions = computed((): EChartsOption => {
pieces: [ pieces: [
{ {
max: 0.0, max: 0.0,
color: '#f84960', color: settingsStore.colorLoss,
}, },
{ {
min: 0.0, min: 0.0,
color: '#2ed191', color: settingsStore.colorProfit,
}, },
], ],
}, },

View File

@ -0,0 +1,7 @@
// setProfitLossColorsCSS
export function setProfitLossColorsCSS(preference: string) {
const [colorProfit, colorLoss] =
preference === 'greenUp' ? ['#12bb7b', '#ef5350'] : ['#ef5350', '#12bb7b'];
document.documentElement.style.setProperty('--color-profit', colorProfit);
document.documentElement.style.setProperty('--color-loss', colorLoss);
}

View File

@ -32,6 +32,9 @@ export const useSettingsStore = defineStore('uiSettings', {
useHeikinAshiCandles: false, useHeikinAshiCandles: false,
notifications: notificationDefaults, notifications: notificationDefaults,
profitDistributionBins: 20, profitDistributionBins: 20,
colorPreference: 'greenUp',
colorProfit: '#12bb7b',
colorLoss: '#ef5350',
}; };
}, },
getters: { getters: {
@ -58,6 +61,12 @@ export const useSettingsStore = defineStore('uiSettings', {
} }
} }
}, },
updateProfitLossColor() {
const [colorProfit, colorLoss] =
this.colorPreference === 'greenUp' ? ['#12bb7b', '#ef5350'] : ['#ef5350', '#12bb7b'];
this.colorProfit = colorProfit;
this.colorLoss = colorLoss;
},
}, },
persist: { persist: {
key: STORE_UI_SETTINGS, key: STORE_UI_SETTINGS,

View File

@ -1,5 +1,11 @@
// variables created for the project and not overwrite of bootstrap // variables created for the project and not overwrite of bootstrap
$fontsize-small: 0.8rem; $fontsize-small: 0.8rem;
$color-profit: #12bb7b; :root {
$color-loss: #ef5350; // default profit loss colors, could be overwriten by setProfitLossColorsCSS
--color-profit: #12bb7b;
--color-loss: #ef5350;
}
$color-profit: var(--color-profit);
$color-loss: var(--color-loss);

View File

@ -11,6 +11,14 @@
<b-form-group description="Reset dynamic layouts to how they were."> <b-form-group description="Reset dynamic layouts to how they were.">
<b-button size="sm" class="me-1" @click="resetDynamicLayout">Reset layout</b-button> <b-button size="sm" class="me-1" @click="resetDynamicLayout">Reset layout</b-button>
</b-form-group> </b-form-group>
<b-form-group description="Color Preference">
<b-form-radio-group
id="settings-color-preference-radio-group"
v-model="settingsStore.colorPreference"
:options="colorPreferenceOptions"
name="color-preference-options"
></b-form-radio-group>
</b-form-group>
<b-form-group <b-form-group
label="Show open trades in header" label="Show open trades in header"
description="Decide if open trades should be visualized" description="Decide if open trades should be visualized"
@ -71,6 +79,10 @@ const openTradesOptions = [
{ value: OpenTradeVizOptions.asTitle, text: 'Show in title' }, { value: OpenTradeVizOptions.asTitle, text: 'Show in title' },
{ value: OpenTradeVizOptions.noOpenTrades, text: "Don't show open trades in header" }, { value: OpenTradeVizOptions.noOpenTrades, text: "Don't show open trades in header" },
]; ];
const colorPreferenceOptions = [
{ value: 'greenUp', text: 'Green Up/Red Down' },
{ value: 'redUp', text: 'Green Down/Red Up' },
];
// //
const resetDynamicLayout = () => { const resetDynamicLayout = () => {