|
|
@@ -0,0 +1,179 @@
|
|
|
+<template>
|
|
|
+ <lay-layer zIndex="9999999" :title="modelConfig.title" v-model="modelConfig.visible" area="auto">
|
|
|
+ <div class="width-1000 custom-layer" style="padding: 20px">
|
|
|
+ <lay-loading :loading="modelConfig.loading">
|
|
|
+ <div class="chart" ref="chartRef"></div>
|
|
|
+ </lay-loading>
|
|
|
+ </div>
|
|
|
+ </lay-layer>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" setup>
|
|
|
+import { ref, reactive, shallowRef, onUnmounted } from "vue";
|
|
|
+import * as echarts from "echarts";
|
|
|
+import dayjs from "dayjs";
|
|
|
+import { get_indicator } from "@/api";
|
|
|
+
|
|
|
+const chartRef = ref();
|
|
|
+
|
|
|
+interface ModelConfig {
|
|
|
+ title: string;
|
|
|
+ visible: boolean;
|
|
|
+ isUpdate: boolean;
|
|
|
+ loading: boolean;
|
|
|
+}
|
|
|
+
|
|
|
+interface ModelParams {
|
|
|
+ exchange?: String;
|
|
|
+ symbol?: String;
|
|
|
+ start_time_mills?: String;
|
|
|
+ end_time_mills?: String;
|
|
|
+}
|
|
|
+
|
|
|
+let modelConfig: ModelConfig = reactive({ title: "", visible: false, isUpdate: false, loading: false });
|
|
|
+let modelParams: ModelParams = reactive({});
|
|
|
+
|
|
|
+let tradesInfo = ref();
|
|
|
+let tradesChart = shallowRef();
|
|
|
+
|
|
|
+const show = (params?: any) => {
|
|
|
+ modelConfig.visible = true;
|
|
|
+ modelConfig.title = "Trades数据";
|
|
|
+ modelParams = params;
|
|
|
+ setTimeout(() => {
|
|
|
+ getIndicatorInfo(params);
|
|
|
+ }, 500);
|
|
|
+};
|
|
|
+
|
|
|
+// 获取trades数据
|
|
|
+const getIndicatorInfo = (value: any) => {
|
|
|
+ const params = { indicator: "trades", query: value };
|
|
|
+ modelConfig.loading = true;
|
|
|
+ get_indicator(params, (data: any) => {
|
|
|
+ modelConfig.loading = false;
|
|
|
+ if (data.code == 200) {
|
|
|
+ tradesInfo.value = data.data;
|
|
|
+ initChart(data.data);
|
|
|
+ }
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const initChart = (data: any) => {
|
|
|
+ tradesChart.value = echarts.init(chartRef.value);
|
|
|
+
|
|
|
+ window.removeEventListener("resize", () => {
|
|
|
+ tradesChart.value.resize();
|
|
|
+ });
|
|
|
+ window.addEventListener("resize", () => {
|
|
|
+ tradesChart.value.resize();
|
|
|
+ });
|
|
|
+
|
|
|
+ let buy_list: any = [];
|
|
|
+ let sell_list: any = [];
|
|
|
+ data.map((item: any) => {
|
|
|
+ const info = [item.time, item.price, item.size, item.side];
|
|
|
+ Number(item.size) > 0 ? buy_list.push(info) : sell_list.push(info);
|
|
|
+ });
|
|
|
+ const chartOption = {
|
|
|
+ title: {
|
|
|
+ text: `${modelParams.exchange} Trades`,
|
|
|
+ subtext: `币对:${modelParams.symbol?.toUpperCase()} 时间:${dayjs(Number(modelParams.start_time_mills)).format("MM-DD HH:mm:ss")} ~ ${dayjs(Number(modelParams.end_time_mills)).format(
|
|
|
+ "MM-DD HH:mm:ss"
|
|
|
+ )}`,
|
|
|
+ },
|
|
|
+ grid: {
|
|
|
+ top: "80px",
|
|
|
+ left: "60px",
|
|
|
+ right: "40px",
|
|
|
+ bottom: "100px",
|
|
|
+ },
|
|
|
+ tooltip: {
|
|
|
+ // trigger: 'axis',
|
|
|
+ showDelay: 0,
|
|
|
+ formatter: (params: any) => {
|
|
|
+ if (params.value.length <= 0) return "";
|
|
|
+ var time = dayjs(params.value[0] * 1).format("YYYY-MM-DD HH:mm:ss.SSS");
|
|
|
+ return `${params.seriesName}:<br/>时间: ${time}<br/>价格: ${params.value[1]}<br/>数量: ${params.value[2]}`;
|
|
|
+ },
|
|
|
+ axisPointer: {
|
|
|
+ show: true,
|
|
|
+ type: "cross",
|
|
|
+ lineStyle: {
|
|
|
+ type: "dashed",
|
|
|
+ width: 1,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ toolbox: {
|
|
|
+ feature: {
|
|
|
+ dataZoom: {},
|
|
|
+ brush: {
|
|
|
+ type: ["rect", "clear"],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xAxis: [
|
|
|
+ {
|
|
|
+ type: "value",
|
|
|
+ scale: true,
|
|
|
+ axisLabel: {
|
|
|
+ formatter: (value: any) => {
|
|
|
+ var time = dayjs(value).format("MM-DD HH:mm:ss");
|
|
|
+ return time;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ yAxis: [
|
|
|
+ {
|
|
|
+ type: "value",
|
|
|
+ scale: true,
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ name: "买",
|
|
|
+ type: "scatter",
|
|
|
+ symbol: "triangle",
|
|
|
+ symbolSize: 6,
|
|
|
+ itemStyle: {
|
|
|
+ color: "transparent",
|
|
|
+ borderColor: "rgb(14, 203, 129)",
|
|
|
+ borderWidth: 1,
|
|
|
+ },
|
|
|
+ data: buy_list.reverse(),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "卖",
|
|
|
+ type: "scatter",
|
|
|
+ symbol: "triangle",
|
|
|
+ symbolRotate: 180,
|
|
|
+ symbolSize: 6,
|
|
|
+ itemStyle: {
|
|
|
+ color: "transparent",
|
|
|
+ borderColor: "rgb(246, 70, 93)",
|
|
|
+ borderWidth: 1,
|
|
|
+ },
|
|
|
+ data: sell_list.reverse(),
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ tradesChart.value.setOption(chartOption);
|
|
|
+};
|
|
|
+onUnmounted(() => {
|
|
|
+ window.removeEventListener("resize", tradesChart.value.resize());
|
|
|
+});
|
|
|
+
|
|
|
+defineExpose({ show });
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.chart {
|
|
|
+ padding-top: 20px;
|
|
|
+ min-width: 350px;
|
|
|
+ min-height: 500px;
|
|
|
+}
|
|
|
+</style>
|