frequi_origin/src/components/charts/CandleChartContainer.vue

175 lines
4.8 KiB
Vue
Raw Normal View History

2020-08-08 13:37:18 +00:00
<template>
2020-09-14 18:24:24 +00:00
<div class="container-fluid flex-column align-items-stretch d-flex h-100">
2020-08-08 13:37:18 +00:00
<b-modal
id="plotConfiguratorModal"
title="Plot Configurator"
ok-only
hide-backdrop
button-size="sm"
>
2020-08-08 13:57:36 +00:00
<PlotConfigurator v-model="plotConfig" :columns="datasetColumns" />
2020-08-08 13:37:18 +00:00
</b-modal>
<div class="row mr-0">
<div class="col-mb-2 ml-2">
<b-select v-model="pair" :options="availablePairs" size="sm" @change="refresh"> </b-select>
</div>
<div class="col-mb-2 ml-2 mr-2">
<b-button :disabled="!!!pair" size="sm" @click="refresh">&#x21bb;</b-button>
</div>
2020-09-27 07:37:07 +00:00
<div v-if="hasDataset" class="col-mb-2 ml-2 mr-2">
2020-09-27 07:24:12 +00:00
<small>Buysignals: {{ dataset.buy_signals }}</small>
<small class="ml-2">SellSignals: {{ dataset.sell_signals }}</small>
</div>
<div class="col-mb-2 ml-auto mr-2">
2020-08-08 13:57:36 +00:00
<b-select
v-model="plotConfigName"
:options="availablePlotConfigNames"
size="sm"
2020-08-08 13:57:36 +00:00
@change="plotConfigChanged"
>
</b-select>
</div>
2020-08-08 13:37:18 +00:00
<div class="col-mb-2 mr-2">
2020-09-30 05:48:36 +00:00
<b-checkbox v-model="useUTC" title="Use UTC for graph">useUTC</b-checkbox>
2020-08-08 13:37:18 +00:00
</div>
<div class="col-mb-2 mr-1">
2020-08-24 18:20:54 +00:00
<b-button size="sm" title="Plot configurator" @click="showConfigurator">&#9881;</b-button>
2020-08-08 13:37:18 +00:00
</div>
</div>
2020-09-14 18:24:24 +00:00
<div class="row mr-1 ml-1 h-100">
<CandleChart
2020-09-30 05:48:36 +00:00
v-if="hasDataset"
:dataset="dataset"
:trades="trades"
:plot-config="plotConfig"
:use-u-t-c="useUTC"
>
</CandleChart>
2020-09-30 05:48:36 +00:00
<label v-else style="margin: auto auto; font-size: 1.5rem">No data available</label>
</div>
2020-08-08 13:37:18 +00:00
</div>
</template>
<script lang="ts">
import { Component, Vue, Prop, Watch } from 'vue-property-decorator';
2020-08-08 13:57:36 +00:00
import { namespace } from 'vuex-class';
import {
Trade,
PairHistory,
EMPTY_PLOTCONFIG,
PlotConfig,
PairCandlePayload,
PairHistoryPayload,
} from '@/types';
import CandleChart from '@/components/charts/CandleChart.vue';
import PlotConfigurator from '@/components/charts/PlotConfigurator.vue';
2020-08-08 13:57:36 +00:00
import { getCustomPlotConfig, getPlotConfigName } from '@/shared/storage';
2020-10-31 07:47:07 +00:00
import { BotStoreGetters } from '@/store/modules/ftbot';
2020-08-08 13:57:36 +00:00
const ftbot = namespace('ftbot');
2020-08-08 13:37:18 +00:00
@Component({ components: { CandleChart, PlotConfigurator } })
export default class CandleChartContainer extends Vue {
@Prop({ required: true }) readonly availablePairs!: string[];
2020-08-08 13:37:18 +00:00
@Prop({ required: true }) readonly timeframe!: string;
@Prop({ required: false, default: [] }) readonly trades!: Array<Trade>;
@Prop({ required: false, default: false }) historicView!: boolean;
/** Only required if historicView is true */
@Prop({ required: false, default: false }) timerange!: string;
/**
* Only required if historicView is true
*/
@Prop({ required: false, default: false }) strategy!: string;
pair = '';
2020-08-08 13:37:18 +00:00
useUTC = true;
plotConfig: PlotConfig = { ...EMPTY_PLOTCONFIG };
2020-08-08 13:57:36 +00:00
plotConfigName = '';
@ftbot.State availablePlotConfigNames!: Array<string>;
2020-08-24 18:20:54 +00:00
@ftbot.Action setPlotConfigName;
@ftbot.State candleData!: PairHistory;
@ftbot.State history!: PairHistory;
2020-10-31 07:47:07 +00:00
@ftbot.Getter [BotStoreGetters.selectedPair]!: string;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@ftbot.Action public getPairCandles!: (payload: PairCandlePayload) => void;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@ftbot.Action public getPairHistory!: (payload: PairHistoryPayload) => void;
2020-09-27 07:24:12 +00:00
get dataset(): PairHistory {
if (this.historicView) {
return this.history[`${this.pair}__${this.timeframe}`];
}
return this.candleData[`${this.pair}__${this.timeframe}`];
}
2020-08-08 13:37:18 +00:00
get datasetColumns() {
return this.dataset ? this.dataset.columns : [];
}
2020-09-27 07:37:07 +00:00
get hasDataset(): boolean {
return !!this.dataset;
}
2020-08-08 13:37:18 +00:00
mounted() {
2020-08-08 13:57:36 +00:00
this.plotConfigName = getPlotConfigName();
this.plotConfig = getCustomPlotConfig(this.plotConfigName);
}
plotConfigChanged() {
2020-08-24 18:20:54 +00:00
console.log('plotConfigChanged');
2020-08-08 13:57:36 +00:00
this.plotConfig = getCustomPlotConfig(this.plotConfigName);
2020-08-24 18:20:54 +00:00
this.setPlotConfigName(this.plotConfigName);
2020-08-08 13:37:18 +00:00
}
showConfigurator() {
this.$bvModal.show('plotConfiguratorModal');
}
refresh() {
if (this.pair && this.timeframe) {
if (this.historicView) {
this.getPairHistory({
pair: this.pair,
timeframe: this.timeframe,
timerange: this.timerange,
strategy: this.strategy,
});
} else {
this.getPairCandles({ pair: this.pair, timeframe: this.timeframe, limit: 500 });
}
}
}
@Watch('availablePairs')
watchAvailablePairs() {
[this.pair] = this.availablePairs;
this.refresh();
}
2020-10-31 07:47:07 +00:00
@Watch(BotStoreGetters.selectedPair)
watchSelectedPair() {
this.pair = this.selectedPair;
this.refresh();
}
2020-08-08 13:37:18 +00:00
}
</script>
2020-09-30 05:48:36 +00:00
<style scoped></style>