mirror of
https://github.com/freqtrade/frequi.git
synced 2024-11-10 18:23:50 +00:00
commit
678d314037
|
@ -18,11 +18,11 @@
|
|||
"core-js": "^3.12.1",
|
||||
"date-fns": "^2.21.3",
|
||||
"date-fns-tz": "^1.1.4",
|
||||
"echarts": "^4.9.0",
|
||||
"echarts": "^5.1.0",
|
||||
"humanize-duration": "^3.26.0",
|
||||
"vue": "^2.6.12",
|
||||
"vue-class-component": "^7.2.5",
|
||||
"vue-echarts": "^5.0.0-beta.0",
|
||||
"vue-echarts": "^6.0.0-rc.5",
|
||||
"vue-grid-layout": "^2.3.12",
|
||||
"vue-material-design-icons": "^4.11.0",
|
||||
"vue-property-decorator": "^9.1.2",
|
||||
|
@ -42,6 +42,7 @@
|
|||
"@vue/cli-plugin-unit-jest": "~4.5.13",
|
||||
"@vue/cli-plugin-vuex": "~4.5.12",
|
||||
"@vue/cli-service": "~4.5.13",
|
||||
"@vue/composition-api": "^1.0.0-rc.9",
|
||||
"@vue/eslint-config-airbnb": "^5.1.0",
|
||||
"@vue/eslint-config-prettier": "^6.0.0",
|
||||
"@vue/eslint-config-typescript": "^5.1.0",
|
||||
|
|
|
@ -1,18 +1,55 @@
|
|||
<template>
|
||||
<div class="row flex-grow-1 chart-wrapper">
|
||||
<v-chart v-if="hasData" :theme="theme" autoresize :options="chartOptions" />
|
||||
<v-chart v-if="hasData" ref="candleChart" :theme="theme" autoresize manual-update />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { Component, Vue, Prop, Watch } from 'vue-property-decorator';
|
||||
import ECharts from 'vue-echarts';
|
||||
import * as echarts from 'echarts';
|
||||
import { Trade, PairHistory, PlotConfig } from '@/types';
|
||||
import randomColor from '@/shared/randomColor';
|
||||
import { roundTimeframe } from '@/shared/timemath';
|
||||
import ECharts from 'vue-echarts';
|
||||
|
||||
import 'echarts';
|
||||
import { use } from 'echarts/core';
|
||||
import { EChartsOption, SeriesOption, ScatterSeriesOption } from 'echarts';
|
||||
import { CanvasRenderer } from 'echarts/renderers';
|
||||
import { CandlestickChart, LineChart, BarChart, ScatterChart } from 'echarts/charts';
|
||||
import {
|
||||
AxisPointerComponent,
|
||||
CalendarComponent,
|
||||
DatasetComponent,
|
||||
DataZoomComponent,
|
||||
GridComponent,
|
||||
LegendComponent,
|
||||
TimelineComponent,
|
||||
TitleComponent,
|
||||
TooltipComponent,
|
||||
ToolboxComponent,
|
||||
VisualMapComponent,
|
||||
VisualMapPiecewiseComponent,
|
||||
} from 'echarts/components';
|
||||
|
||||
use([
|
||||
AxisPointerComponent,
|
||||
CalendarComponent,
|
||||
DatasetComponent,
|
||||
DataZoomComponent,
|
||||
GridComponent,
|
||||
LegendComponent,
|
||||
ToolboxComponent,
|
||||
TimelineComponent,
|
||||
TitleComponent,
|
||||
TooltipComponent,
|
||||
VisualMapComponent,
|
||||
VisualMapPiecewiseComponent,
|
||||
|
||||
CandlestickChart,
|
||||
BarChart,
|
||||
LineChart,
|
||||
ScatterChart,
|
||||
CanvasRenderer,
|
||||
]);
|
||||
|
||||
// Chart default options
|
||||
const MARGINLEFT = '4%';
|
||||
|
@ -33,6 +70,10 @@ const tradeSellColor = 'pink';
|
|||
components: { 'v-chart': ECharts },
|
||||
})
|
||||
export default class CandleChart extends Vue {
|
||||
$refs!: {
|
||||
candleChart: typeof ECharts;
|
||||
};
|
||||
|
||||
@Prop({ required: false, default: [] }) readonly trades!: Array<Trade>;
|
||||
|
||||
@Prop({ required: true }) readonly dataset!: PairHistory;
|
||||
|
@ -47,7 +88,7 @@ export default class CandleChart extends Vue {
|
|||
|
||||
sellData = [] as Array<number>[];
|
||||
|
||||
chartOptions: echarts.EChartOption = {};
|
||||
chartOptions: EChartsOption = {};
|
||||
|
||||
@Watch('dataset')
|
||||
datasetChanged() {
|
||||
|
@ -103,7 +144,7 @@ export default class CandleChart extends Vue {
|
|||
show: true,
|
||||
},
|
||||
],
|
||||
// backgroundColor: '#1b1b1b',
|
||||
backgroundColor: 'rgba(0, 0, 0, 0)',
|
||||
useUTC: this.useUTC,
|
||||
animation: false,
|
||||
legend: {
|
||||
|
@ -206,6 +247,7 @@ export default class CandleChart extends Vue {
|
|||
// ],
|
||||
// },
|
||||
};
|
||||
|
||||
console.log('Initialized');
|
||||
this.updateChart(true);
|
||||
}
|
||||
|
@ -248,7 +290,7 @@ export default class CandleChart extends Vue {
|
|||
}
|
||||
}
|
||||
|
||||
const options: echarts.EChartOption = {
|
||||
const options: EChartsOption = {
|
||||
dataset: {
|
||||
source: this.dataset.data,
|
||||
},
|
||||
|
@ -340,10 +382,10 @@ export default class CandleChart extends Vue {
|
|||
Object.entries(this.plotConfig.main_plot).forEach(([key, value]) => {
|
||||
const col = this.dataset.columns.findIndex((el) => el === key);
|
||||
if (col > 1) {
|
||||
if (this.chartOptions.legend && this.chartOptions.legend.data) {
|
||||
if (!Array.isArray(this.chartOptions.legend) && this.chartOptions.legend?.data) {
|
||||
this.chartOptions.legend.data.push(key);
|
||||
}
|
||||
const sp: echarts.EChartOption.Series = {
|
||||
const sp: SeriesOption = {
|
||||
name: key,
|
||||
type: value.type || 'line',
|
||||
xAxisIndex: 0,
|
||||
|
@ -357,7 +399,7 @@ export default class CandleChart extends Vue {
|
|||
},
|
||||
showSymbol: false,
|
||||
};
|
||||
if (this.chartOptions.series) {
|
||||
if (Array.isArray(this.chartOptions.series)) {
|
||||
this.chartOptions.series.push(sp);
|
||||
}
|
||||
} else {
|
||||
|
@ -371,7 +413,7 @@ export default class CandleChart extends Vue {
|
|||
let plotIndex = 2;
|
||||
Object.entries(this.plotConfig.subplots).forEach(([key, value]) => {
|
||||
// define yaxis
|
||||
if (this.chartOptions.yAxis && Array.isArray(this.chartOptions.yAxis)) {
|
||||
if (Array.isArray(this.chartOptions.yAxis)) {
|
||||
this.chartOptions.yAxis.push({
|
||||
scale: true,
|
||||
gridIndex: plotIndex,
|
||||
|
@ -384,7 +426,7 @@ export default class CandleChart extends Vue {
|
|||
splitLine: { show: false },
|
||||
});
|
||||
}
|
||||
if (this.chartOptions.xAxis && Array.isArray(this.chartOptions.xAxis)) {
|
||||
if (Array.isArray(this.chartOptions.xAxis)) {
|
||||
this.chartOptions.xAxis.push({
|
||||
type: 'time',
|
||||
scale: true,
|
||||
|
@ -397,7 +439,7 @@ export default class CandleChart extends Vue {
|
|||
splitNumber: 20,
|
||||
});
|
||||
}
|
||||
if (this.chartOptions.dataZoom) {
|
||||
if (Array.isArray(this.chartOptions.dataZoom)) {
|
||||
this.chartOptions.dataZoom.forEach((el) =>
|
||||
el.xAxisIndex && Array.isArray(el.xAxisIndex) ? el.xAxisIndex.push(plotIndex) : null,
|
||||
);
|
||||
|
@ -411,17 +453,13 @@ export default class CandleChart extends Vue {
|
|||
});
|
||||
}
|
||||
Object.entries(value).forEach(([sk, sv]) => {
|
||||
if (
|
||||
this.chartOptions.legend &&
|
||||
this.chartOptions.legend.data &&
|
||||
Array.isArray(this.chartOptions.legend.data)
|
||||
) {
|
||||
this.chartOptions.legend.data.push(sk);
|
||||
}
|
||||
// entries per subplot
|
||||
const col = this.dataset.columns.findIndex((el) => el === sk);
|
||||
if (col > 0) {
|
||||
const sp: echarts.EChartOption.Series = {
|
||||
if (!Array.isArray(this.chartOptions.legend) && this.chartOptions.legend?.data) {
|
||||
this.chartOptions.legend.data.push(sk);
|
||||
}
|
||||
const sp: SeriesOption = {
|
||||
name: sk,
|
||||
type: sv.type || 'line',
|
||||
xAxisIndex: plotIndex,
|
||||
|
@ -461,10 +499,10 @@ export default class CandleChart extends Vue {
|
|||
|
||||
const name = 'Trades';
|
||||
const nameClose = 'Trades Close';
|
||||
if (this.chartOptions.legend && this.chartOptions.legend.data) {
|
||||
if (!Array.isArray(this.chartOptions.legend) && this.chartOptions.legend?.data) {
|
||||
this.chartOptions.legend.data.push(name);
|
||||
}
|
||||
const sp: echarts.EChartOption.SeriesScatter = {
|
||||
const sp: ScatterSeriesOption = {
|
||||
name,
|
||||
type: 'scatter',
|
||||
xAxisIndex: 0,
|
||||
|
@ -474,13 +512,13 @@ export default class CandleChart extends Vue {
|
|||
},
|
||||
data: trades,
|
||||
};
|
||||
if (this.chartOptions.series) {
|
||||
if (Array.isArray(this.chartOptions?.series)) {
|
||||
this.chartOptions.series.push(sp);
|
||||
}
|
||||
if (this.chartOptions.legend && this.chartOptions.legend.data) {
|
||||
if (!Array.isArray(this.chartOptions.legend) && this.chartOptions.legend?.data) {
|
||||
this.chartOptions.legend.data.push(nameClose);
|
||||
}
|
||||
const closeSeries: echarts.EChartOption.SeriesScatter = {
|
||||
const closeSeries: ScatterSeriesOption = {
|
||||
name: nameClose,
|
||||
type: 'scatter',
|
||||
xAxisIndex: 0,
|
||||
|
@ -490,11 +528,13 @@ export default class CandleChart extends Vue {
|
|||
},
|
||||
data: tradesClose,
|
||||
};
|
||||
if (this.chartOptions.series) {
|
||||
if (this.chartOptions.series && Array.isArray(this.chartOptions.series)) {
|
||||
this.chartOptions.series.push(closeSeries);
|
||||
}
|
||||
|
||||
console.log('chartOptions', this.chartOptions);
|
||||
|
||||
this.$refs.candleChart.setOption(this.chartOptions);
|
||||
}
|
||||
|
||||
/** Return trade entries for charting */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<v-chart v-if="trades.length > 0" :options="chartOptions" autoresize :theme="getChartTheme" />
|
||||
<v-chart v-if="trades.length > 0" :option="chartOptions" autoresize :theme="getChartTheme" />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
|
@ -7,19 +7,17 @@ import { Component, Vue, Prop } from 'vue-property-decorator';
|
|||
import { Getter } from 'vuex-class';
|
||||
|
||||
import ECharts from 'vue-echarts';
|
||||
import { EChartOption } from 'echarts';
|
||||
import { EChartsOption } from 'echarts';
|
||||
|
||||
import 'echarts/lib/chart/bar';
|
||||
import 'echarts/lib/chart/line';
|
||||
import 'echarts/lib/component/title';
|
||||
import 'echarts/lib/component/tooltip';
|
||||
import 'echarts/lib/component/legend';
|
||||
import 'echarts/lib/component/dataZoom';
|
||||
import 'echarts/lib/component/visualMap';
|
||||
import 'echarts/lib/component/visualMapPiecewise';
|
||||
import { use } from 'echarts/core';
|
||||
import { CanvasRenderer } from 'echarts/renderers';
|
||||
import { LineChart, BarChart } from 'echarts/charts';
|
||||
import { TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components';
|
||||
|
||||
import { ClosedTrade, CumProfitData } from '@/types';
|
||||
|
||||
use([BarChart, LineChart, CanvasRenderer, TitleComponent, TooltipComponent, LegendComponent]);
|
||||
|
||||
// Define Column labels here to avoid typos
|
||||
const CHART_PROFIT = 'Profit';
|
||||
const CHART_TRADE_COUNT = 'Trade Count';
|
||||
|
@ -40,8 +38,6 @@ export default class CumProfitChart extends Vue {
|
|||
|
||||
get cumulativeData() {
|
||||
const res: CumProfitData[] = [];
|
||||
// const closedTrades = [...this.trades]; // .filter((t) => t.close_timestamp);
|
||||
|
||||
const closedTrades = this.trades
|
||||
.slice()
|
||||
.sort((a, b) => (a.close_timestamp > b.close_timestamp ? 1 : -1));
|
||||
|
@ -50,18 +46,19 @@ export default class CumProfitChart extends Vue {
|
|||
const trade = closedTrades[i];
|
||||
if (trade.close_timestamp && trade[this.profitColumn]) {
|
||||
profit += trade[this.profitColumn];
|
||||
res.push({ date: trade.close_timestamp, profit, raising: trade[this.profitColumn] > 0 });
|
||||
res.push({ date: trade.close_timestamp, profit });
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
get chartOptions(): EChartOption {
|
||||
get chartOptions(): EChartsOption {
|
||||
return {
|
||||
title: {
|
||||
text: 'Cumulative Profit',
|
||||
show: this.showTitle,
|
||||
},
|
||||
backgroundColor: 'rgba(0, 0, 0, 0)',
|
||||
dataset: {
|
||||
dimensions: ['date', 'profit'],
|
||||
source: this.cumulativeData,
|
||||
|
|
|
@ -1,21 +1,22 @@
|
|||
<template>
|
||||
<v-chart v-if="dailyStats.data" :options="dailyChartOptions" :theme="getChartTheme" autoresize />
|
||||
<v-chart v-if="dailyStats.data" :option="dailyChartOptions" :theme="getChartTheme" autoresize />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { Component, Vue, Prop } from 'vue-property-decorator';
|
||||
import { Getter } from 'vuex-class';
|
||||
import ECharts from 'vue-echarts';
|
||||
import { EChartOption } from 'echarts';
|
||||
import { EChartsOption } from 'echarts';
|
||||
|
||||
import 'echarts/lib/chart/bar';
|
||||
import 'echarts/lib/chart/line';
|
||||
import 'echarts/lib/component/title';
|
||||
import 'echarts/lib/component/tooltip';
|
||||
import 'echarts/lib/component/legend';
|
||||
import { use } from 'echarts/core';
|
||||
import { CanvasRenderer } from 'echarts/renderers';
|
||||
import { LineChart, BarChart } from 'echarts/charts';
|
||||
import { TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components';
|
||||
|
||||
import { DailyReturnValue } from '@/types';
|
||||
|
||||
use([BarChart, LineChart, CanvasRenderer, TitleComponent, TooltipComponent, LegendComponent]);
|
||||
|
||||
// Define Column labels here to avoid typos
|
||||
const CHART_ABS_PROFIT = 'Absolute profit';
|
||||
const CHART_TRADE_COUNT = 'Trade Count';
|
||||
|
@ -50,12 +51,13 @@ export default class DailyChart extends Vue {
|
|||
);
|
||||
}
|
||||
|
||||
get dailyChartOptions(): EChartOption {
|
||||
get dailyChartOptions(): EChartsOption {
|
||||
return {
|
||||
title: {
|
||||
text: 'Daily profit',
|
||||
show: this.showTitle,
|
||||
},
|
||||
backgroundColor: 'rgba(0, 0, 0, 0)',
|
||||
dataset: {
|
||||
dimensions: ['date', 'abs_profit', 'trade_count'],
|
||||
source: this.dailyStats.data,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<template>
|
||||
<v-chart
|
||||
v-if="trades.length > 0"
|
||||
:options="hourlyChartOptions"
|
||||
:option="hourlyChartOptions"
|
||||
autoresize
|
||||
:theme="getChartTheme"
|
||||
/>
|
||||
|
@ -13,17 +13,31 @@ import { Getter } from 'vuex-class';
|
|||
|
||||
import ECharts from 'vue-echarts';
|
||||
|
||||
import 'echarts/lib/chart/bar';
|
||||
import 'echarts/lib/chart/line';
|
||||
import 'echarts/lib/component/title';
|
||||
import 'echarts/lib/component/tooltip';
|
||||
import 'echarts/lib/component/legend';
|
||||
import 'echarts/lib/component/visualMap';
|
||||
import 'echarts/lib/component/visualMapPiecewise';
|
||||
|
||||
import { Trade } from '@/types';
|
||||
import { timestampHour } from '@/shared/formatters';
|
||||
import { EChartOption } from 'echarts';
|
||||
import { EChartsOption } from 'echarts';
|
||||
|
||||
import { use } from 'echarts/core';
|
||||
import { CanvasRenderer } from 'echarts/renderers';
|
||||
import { LineChart, BarChart } from 'echarts/charts';
|
||||
import {
|
||||
TitleComponent,
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
VisualMapComponent,
|
||||
VisualMapPiecewiseComponent,
|
||||
} from 'echarts/components';
|
||||
|
||||
use([
|
||||
BarChart,
|
||||
LineChart,
|
||||
CanvasRenderer,
|
||||
TitleComponent,
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
VisualMapComponent,
|
||||
VisualMapPiecewiseComponent,
|
||||
]);
|
||||
|
||||
// Define Column labels here to avoid typos
|
||||
const CHART_PROFIT = 'Profit %';
|
||||
|
@ -59,12 +73,13 @@ export default class HourlyChart extends Vue {
|
|||
return res;
|
||||
}
|
||||
|
||||
get hourlyChartOptions(): EChartOption {
|
||||
get hourlyChartOptions(): EChartsOption {
|
||||
return {
|
||||
title: {
|
||||
text: 'Hourly Profit',
|
||||
show: this.showTitle,
|
||||
},
|
||||
backgroundColor: 'rgba(0, 0, 0, 0)',
|
||||
dataset: {
|
||||
dimensions: ['hourDesc', 'profit', 'count'],
|
||||
source: this.hourlyData,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<v-chart v-if="trades.length > 0" :options="chartOptions" autoresize :theme="getChartTheme" />
|
||||
<v-chart v-if="trades.length > 0" :option="chartOptions" autoresize :theme="getChartTheme" />
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
|
@ -7,19 +7,32 @@ import { Component, Vue, Prop } from 'vue-property-decorator';
|
|||
import { Getter } from 'vuex-class';
|
||||
|
||||
import ECharts from 'vue-echarts';
|
||||
import { EChartOption } from 'echarts';
|
||||
import { EChartsOption } from 'echarts';
|
||||
|
||||
import 'echarts/lib/chart/bar';
|
||||
import 'echarts/lib/chart/line';
|
||||
import 'echarts/lib/component/title';
|
||||
import 'echarts/lib/component/tooltip';
|
||||
import 'echarts/lib/component/legend';
|
||||
import 'echarts/lib/component/dataZoom';
|
||||
import 'echarts/lib/component/visualMap';
|
||||
import 'echarts/lib/component/visualMapPiecewise';
|
||||
import { use } from 'echarts/core';
|
||||
import { CanvasRenderer } from 'echarts/renderers';
|
||||
import { LineChart, BarChart } from 'echarts/charts';
|
||||
import {
|
||||
TitleComponent,
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
VisualMapComponent,
|
||||
VisualMapPiecewiseComponent,
|
||||
} from 'echarts/components';
|
||||
|
||||
import { ClosedTrade } from '@/types';
|
||||
|
||||
use([
|
||||
BarChart,
|
||||
LineChart,
|
||||
CanvasRenderer,
|
||||
TitleComponent,
|
||||
TooltipComponent,
|
||||
LegendComponent,
|
||||
VisualMapComponent,
|
||||
VisualMapPiecewiseComponent,
|
||||
]);
|
||||
|
||||
// Define Column labels here to avoid typos
|
||||
const CHART_PROFIT = 'Profit %';
|
||||
const CHART_COLOR = '#9be0a8';
|
||||
|
@ -48,7 +61,7 @@ export default class TradesLogChart extends Vue {
|
|||
return res;
|
||||
}
|
||||
|
||||
get chartOptions(): EChartOption {
|
||||
get chartOptions(): EChartsOption {
|
||||
const { chartData } = this;
|
||||
// Show a maximum of 50 trades by default - allowing to zoom out further.
|
||||
const datazoomStart = chartData.length > 0 ? (1 - 50 / chartData.length) * 100 : 100;
|
||||
|
@ -57,6 +70,7 @@ export default class TradesLogChart extends Vue {
|
|||
text: 'Trades log',
|
||||
show: true,
|
||||
},
|
||||
backgroundColor: 'rgba(0, 0, 0, 0)',
|
||||
dataset: {
|
||||
dimensions: ['date', 'profit'],
|
||||
source: chartData,
|
||||
|
@ -126,7 +140,6 @@ export default class TradesLogChart extends Vue {
|
|||
{
|
||||
type: 'bar',
|
||||
name: CHART_PROFIT,
|
||||
step: 'start',
|
||||
barGap: '0%',
|
||||
barCategoryGap: '0%',
|
||||
animation: false,
|
||||
|
@ -143,9 +156,6 @@ export default class TradesLogChart extends Vue {
|
|||
y: 1,
|
||||
},
|
||||
|
||||
areaStyle: {
|
||||
// color: CHART_COLOR,
|
||||
},
|
||||
itemStyle: {
|
||||
color: CHART_COLOR,
|
||||
},
|
||||
|
|
|
@ -20,13 +20,10 @@
|
|||
timestampms(trade.close_timestamp)
|
||||
}}</ValuePair>
|
||||
<ValuePair
|
||||
v-if="trade.current_profit && trade.current_profit_abs"
|
||||
description="Current Profit"
|
||||
v-if="trade.profit_ratio && trade.profit_abs"
|
||||
:description="`${trade.is_open ? 'Current Profit' : 'Close Profit'}`"
|
||||
>
|
||||
{{ formatPercent(trade.current_profit) }} | {{ trade.current_profit_abs }}
|
||||
</ValuePair>
|
||||
<ValuePair v-if="trade.close_profit" description="Close Profit">
|
||||
{{ formatPercent(trade.close_profit) }} | {{ trade.close_profit_abs }}
|
||||
{{ formatPercent(trade.profit_ratio) }} | {{ trade.profit_abs }}
|
||||
</ValuePair>
|
||||
</div>
|
||||
<div class="col-lg-7">
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
export interface CumProfitData {
|
||||
date: number;
|
||||
[date: string]: number;
|
||||
profit: number;
|
||||
raising: boolean;
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ export interface DailyPayload {
|
|||
|
||||
export interface DailyRecord {
|
||||
/** Date in the format yyyy-mm-dd */
|
||||
[key: string]: string | number;
|
||||
date: string;
|
||||
abs_profit: number;
|
||||
fiat_value: number;
|
||||
|
@ -11,7 +12,7 @@ export interface DailyRecord {
|
|||
}
|
||||
|
||||
export interface DailyReturnValue {
|
||||
data: Array<DailyRecord>;
|
||||
data: DailyRecord[];
|
||||
fiat_display_currency: string;
|
||||
stake_currency: string;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
export enum ChartType {
|
||||
line = 'line',
|
||||
bar = 'bar',
|
||||
scatter = 'scatter',
|
||||
}
|
||||
|
||||
export interface IndicatorConfig {
|
||||
color?: string;
|
||||
type?: string;
|
||||
type?: ChartType;
|
||||
}
|
||||
|
||||
export interface PlotConfig {
|
||||
|
|
66
yarn.lock
66
yarn.lock
|
@ -1961,6 +1961,13 @@
|
|||
optionalDependencies:
|
||||
prettier "^1.18.2"
|
||||
|
||||
"@vue/composition-api@^1.0.0-rc.9":
|
||||
version "1.0.0-rc.9"
|
||||
resolved "https://registry.yarnpkg.com/@vue/composition-api/-/composition-api-1.0.0-rc.9.tgz#ddfcaa13040add84edab918573dfc999b5f03cf3"
|
||||
integrity sha512-U//BqmGRVaPyZbYsPfRlmCKnnFkhRzUBu7cjrWn4PSwQ5Oh+M0KcYIHlupUd+Qmd8KwaiYiuUpJLncl3wFsrdg==
|
||||
dependencies:
|
||||
tslib "^2.2.0"
|
||||
|
||||
"@vue/eslint-config-airbnb@^5.1.0":
|
||||
version "5.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@vue/eslint-config-airbnb/-/eslint-config-airbnb-5.3.0.tgz#896551d600816a06dff13fdd7d04fd5153379817"
|
||||
|
@ -3623,7 +3630,7 @@ core-js@^2.4.0:
|
|||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
|
||||
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
|
||||
|
||||
core-js@^3.12.1, core-js@^3.4.4, core-js@^3.6.5:
|
||||
core-js@^3.12.1, core-js@^3.6.5:
|
||||
version "3.12.1"
|
||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112"
|
||||
integrity sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw==
|
||||
|
@ -4287,12 +4294,13 @@ ecc-jsbn@~0.1.1:
|
|||
jsbn "~0.1.0"
|
||||
safer-buffer "^2.1.0"
|
||||
|
||||
echarts@^4.9.0:
|
||||
version "4.9.0"
|
||||
resolved "https://registry.yarnpkg.com/echarts/-/echarts-4.9.0.tgz#a9b9baa03f03a2a731e6340c55befb57a9e1347d"
|
||||
integrity sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==
|
||||
echarts@^5.1.0:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/echarts/-/echarts-5.1.1.tgz#b186f162f017c555cfd67b12ede6762bdc3ddfda"
|
||||
integrity sha512-b3nP8M9XwZM2jISuA+fP0EuJv8lcfgWrinel185Npy8bE/UhXTDIPJcqgQOCWdvk0c5CeT6Dsm1xBjmJXAGlxQ==
|
||||
dependencies:
|
||||
zrender "4.3.2"
|
||||
tslib "2.0.3"
|
||||
zrender "5.1.0"
|
||||
|
||||
editorconfig@^0.15.3:
|
||||
version "0.15.3"
|
||||
|
@ -9189,10 +9197,10 @@ requires-port@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
|
||||
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
|
||||
|
||||
resize-detector@^0.1.10:
|
||||
version "0.1.10"
|
||||
resolved "https://registry.yarnpkg.com/resize-detector/-/resize-detector-0.1.10.tgz#1da3f961aa5f914ccbcfd3752d52fd45beeb692c"
|
||||
integrity sha512-iLcXC8A6Fb0DfA+TRiywrK/0A22bFqkhntjMJMEzXDA4XkcEkfwpNbv7W8iewUiD0xYIaeiXOfiEehTqGKsUFw==
|
||||
resize-detector@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/resize-detector/-/resize-detector-0.3.0.tgz#fe495112e184695500a8f51e0389f15774cb1cfc"
|
||||
integrity sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==
|
||||
|
||||
resolve-cwd@^2.0.0:
|
||||
version "2.0.0"
|
||||
|
@ -10352,11 +10360,21 @@ tsconfig@^7.0.0:
|
|||
strip-bom "^3.0.0"
|
||||
strip-json-comments "^2.0.0"
|
||||
|
||||
tslib@2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
|
||||
integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
|
||||
|
||||
tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
|
||||
version "1.14.1"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
|
||||
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
|
||||
|
||||
tslib@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
|
||||
integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
|
||||
|
||||
tslint@^5.20.1:
|
||||
version "5.20.1"
|
||||
resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d"
|
||||
|
@ -10712,14 +10730,18 @@ vue-cli-plugin-bootstrap-vue@~0.7.0:
|
|||
resolved "https://registry.yarnpkg.com/vue-cli-plugin-bootstrap-vue/-/vue-cli-plugin-bootstrap-vue-0.7.0.tgz#b44ed7180e59aca2846e981fc67f59d7c77298e3"
|
||||
integrity sha512-KYP7CpwbM6Xw94LR2G6y8ZqqTDKlYTgLDwsxaNUj8NyuAo/mpo2y6Q67T9CXjiPgJYVbWH5IzkhE0gHc+9xZKA==
|
||||
|
||||
vue-echarts@^5.0.0-beta.0:
|
||||
version "5.0.0-beta.0"
|
||||
resolved "https://registry.yarnpkg.com/vue-echarts/-/vue-echarts-5.0.0-beta.0.tgz#438dd4b0fc5ccea281709c1f7c6321b05352bdf4"
|
||||
integrity sha512-QZFKGXDAYFQo+F20REpzcdLx79nsl4kOorJRpN+08aYq4YiIlmtWss1Lxadm7Fo+NYyWm8nnT+h4xHv3uqWIDQ==
|
||||
vue-demi@^0.7.4:
|
||||
version "0.7.5"
|
||||
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.7.5.tgz#88dee7492fc99a0f911ff03fc02c658fa2a79af8"
|
||||
integrity sha512-eFSQSvbQdY7C9ujOzvM6tn7XxwLjn0VQDXQsiYBLBwf28Na+2nTQR4BBBcomhmdP6mmHlBKAwarq6a0BPG87hQ==
|
||||
|
||||
vue-echarts@^6.0.0-rc.5:
|
||||
version "6.0.0-rc.5"
|
||||
resolved "https://registry.yarnpkg.com/vue-echarts/-/vue-echarts-6.0.0-rc.5.tgz#4e06289927d03d289c368fa09b740d82e6ded528"
|
||||
integrity sha512-qG7jM4tz2Ipygn5r88s2nHFftakQyWpoM2IXwpzWrQwl/UZIQ1bbqyyLHqMLtgzEU/QhD/maFG9tnMkjVR75sg==
|
||||
dependencies:
|
||||
core-js "^3.4.4"
|
||||
lodash "^4.17.15"
|
||||
resize-detector "^0.1.10"
|
||||
resize-detector "^0.3.0"
|
||||
vue-demi "^0.7.4"
|
||||
|
||||
vue-eslint-parser@^7.0.0, vue-eslint-parser@^7.6.0:
|
||||
version "7.6.0"
|
||||
|
@ -11296,7 +11318,9 @@ yorkie@^2.0.0:
|
|||
normalize-path "^1.0.0"
|
||||
strip-indent "^2.0.0"
|
||||
|
||||
zrender@4.3.2:
|
||||
version "4.3.2"
|
||||
resolved "https://registry.yarnpkg.com/zrender/-/zrender-4.3.2.tgz#ec7432f9415c82c73584b6b7b8c47e1b016209c6"
|
||||
integrity sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==
|
||||
zrender@5.1.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/zrender/-/zrender-5.1.0.tgz#b6a84c3aa7ccc6642ee0519901ca4c0835c4d85e"
|
||||
integrity sha512-c+8VRx52ycbmqwHeHLlo/BAfIHBl/JZNLM6cfDQFgzIH05yb+f5J9F/fbRsP+zGc8dW9XHuhdt8/iqukgMZSeg==
|
||||
dependencies:
|
||||
tslib "2.0.3"
|
||||
|
|
Loading…
Reference in New Issue
Block a user