st-comp 0.0.246 → 0.0.248
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/ChartLayout.js +4 -4
- package/es/CustomFunction.js +42 -42
- package/es/FactorWarning.js +33 -33
- package/es/Kline.js +17 -17
- package/es/KlineBasic.cjs +1 -1
- package/es/KlineBasic.js +520 -512
- package/es/KlineConfig.js +61 -61
- package/es/KlineNew.js +16 -16
- package/es/KlinePlus.cjs +4 -4
- package/es/KlinePlus.js +589 -575
- package/es/LinearLegend.cjs +1 -1
- package/es/LinearLegend.js +1 -63
- package/es/MonacoEditor.js +24 -24
- package/es/Pagination.js +73 -73
- package/es/PasswordPrompt.js +3 -3
- package/es/Table.js +38 -38
- package/es/User.js +44 -44
- package/es/VarSelectDialog.js +25 -25
- package/es/VarietyAutoComplete.js +10 -10
- package/es/VarietySearch.js +38 -38
- package/es/{VarietySelect-5a9dd50b.js → VarietySelect-b9fe3000.js} +4 -4
- package/es/VarietyTextCopy.cjs +3 -3
- package/es/VarietyTextCopy.js +15 -15
- package/es/VirtualTable.js +14 -14
- package/es/{_initCloneObject-c34c65bc.js → _initCloneObject-382335b2.js} +7 -7
- package/es/{base-a5af3db3.js → base-ff0e366f.js} +40 -40
- package/es/{castArray-7741a212.js → castArray-15070be9.js} +1 -1
- package/es/{config-provider-06a63185.js → config-provider-2e85eee8.js} +6 -6
- package/es/{debounce-8d53f4dd.js → debounce-e9e47f9a.js} +1 -1
- package/es/{dropdown-302f71e7.js → dropdown-2b35a683.js} +13 -13
- package/es/{el-autocomplete-ed75a659.js → el-autocomplete-18be2c5a.js} +16 -16
- package/es/{el-button-d09ff85f.js → el-button-f08c0639.js} +39 -39
- package/es/{el-checkbox-64648e02.js → el-checkbox-058dba2d.js} +31 -31
- package/es/{el-dialog-6a80e3d8.js → el-dialog-d328e0d8.js} +15 -15
- package/es/{el-divider-4e059794.js → el-divider-4fe55ebe.js} +1 -1
- package/es/{el-empty-33cb66f1.js → el-empty-ceecb81c.js} +5 -5
- package/es/{el-form-item-4eca95be.js → el-form-item-cb328886.js} +36 -36
- package/es/{el-input-cae60510.js → el-input-0f6ead19.js} +50 -50
- package/es/{el-input-number-c2499410.js → el-input-number-66e68609.js} +36 -36
- package/es/{el-loading-c738468d.js → el-loading-412370c7.js} +5 -5
- package/es/{el-menu-item-f904f685.js → el-menu-item-0ee8ad18.js} +22 -22
- package/es/{el-message-box-05d8cf39.js → el-message-box-6db52b29.js} +11 -11
- package/es/{el-message-0df23ae7.js → el-message-e6c755df.js} +23 -23
- package/es/{el-overlay-cc9bc792.js → el-overlay-981f8d49.js} +56 -56
- package/es/{el-popconfirm-a6f66a0e.js → el-popconfirm-005013fa.js} +20 -20
- package/es/{el-popper-a38874f4.js → el-popper-fdc7c793.js} +109 -109
- package/es/{el-segmented-51b1c797.js → el-segmented-050d0090.js} +8 -8
- package/es/{el-select-1b149fab.js → el-select-23a1f302.js} +64 -64
- package/es/{el-table-column-3e30ebae.js → el-table-column-d0c374cf.js} +15 -15
- package/es/{el-tag-0a25efdf.js → el-tag-f13f463b.js} +15 -15
- package/es/{el-text-73d899ff.js → el-text-27cef2be.js} +2 -2
- package/es/{index-42e59bf5.js → index-09bd2621.js} +43 -43
- package/es/{index-94e43e0d.js → index-15b9603e.js} +3 -3
- package/es/{index-960806da.js → index-269b8a8c.js} +36 -36
- package/es/{index-54d289d1.js → index-4a3f30c5.js} +12 -12
- package/es/{index-6e967429.js → index-80a7ad32.js} +17 -17
- package/es/{index-d77a7336.js → index-93a8960e.js} +1 -1
- package/es/{index-4194c942.js → index-b937ea22.js} +2 -2
- package/es/{index-ac98a4d8.js → index-c266c23a.js} +10 -10
- package/es/{index-6806997d.js → index-e0901394.js} +34 -34
- package/es/{index-87b4bf61.js → index-ec7ad93f.js} +31 -31
- package/es/{python-a914569a.js → python-823b276b.js} +24 -24
- package/es/raf-8e05a7f4.js +6 -0
- package/es/{scroll-679bd6bf.js → scroll-41b4f625.js} +5 -5
- package/es/style.css +1 -1
- package/es/{use-form-common-props-47e50c10.js → use-form-common-props-631cacae.js} +65 -65
- package/es/{use-global-config-f52caea0.js → use-global-config-5d001623.js} +14 -14
- package/es/{validator-94c04152.js → validator-4160d9e7.js} +1 -1
- package/es/{vnode-5ddb7ed1.js → vnode-06571d5b.js} +1 -1
- package/es/{zh-cn-4921961d.js → zh-cn-5df98ac2.js} +2 -2
- package/lib/bundle.js +1 -1
- package/lib/bundle.umd.cjs +162 -162
- package/lib/{index-2a325d42.js → index-f00d1e1f.js} +13173 -13151
- package/lib/{python-eb65d93b.js → python-0f34e2e6.js} +1 -1
- package/lib/style.css +1 -1
- package/package.json +1 -1
- package/packages/KlineBasic/components/KlineSub/index.vue +35 -15
- package/packages/KlineBasic/components/KlineTips/index.vue +2 -2
- package/packages/KlineBasic/index.vue +39 -41
- package/packages/KlinePlus/index.vue +88 -62
- package/src/App.vue +15 -4
- package/src/pages/KlineBasic/index.vue +7 -7
- package/src/pages/KlineNew/components/KlineAction/mockApi/index.js +1 -1
- package/src/pages/KlineNew/components/KlineBasic/utils.js +1 -1
- package/src/pages/KlineNew/components/KlineSlide/utils.js +1 -1
- package/src/pages/KlinePlus/KlineDialog/MultiCycle.vue +312 -0
- package/src/pages/KlinePlus/KlineDialog/api.js +108 -0
- package/src/pages/KlinePlus/KlineDialog/index.vue +582 -0
- package/src/pages/KlinePlus/KlineDialog/indicator.js +109 -0
- package/src/pages/KlinePlus/KlineDialog/tools.js +86 -0
- package/src/pages/KlinePlus/index.vue +23 -209
- package/es/raf-80ef0c0a.js +0 -6
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
|
|
3
|
+
// 数据源: 成交点类型
|
|
4
|
+
export const sellBuyOptions = [
|
|
5
|
+
{ label: "买卖", value: 0 },
|
|
6
|
+
{ label: "开平", value: 1 },
|
|
7
|
+
];
|
|
8
|
+
// 数据源: 复权类型
|
|
9
|
+
export const rightTypeOptions = [
|
|
10
|
+
{ label: "不复权", value: 0 },
|
|
11
|
+
{ label: "前复权", value: 1 },
|
|
12
|
+
];
|
|
13
|
+
// 数据源: 合约类型
|
|
14
|
+
export const klineTypeOptions = [
|
|
15
|
+
{ value: 0, label: "主连" },
|
|
16
|
+
{ value: 1, label: "加权" },
|
|
17
|
+
{ value: 2, label: "收益率指数" },
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
// 字典文案映射
|
|
21
|
+
export const formatLabel = (value, options) => {
|
|
22
|
+
return options.find((item) => item.value === value)?.label ?? "-";
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// 前端估算K线根数的周期分布
|
|
26
|
+
const dayBarsNumByCycle = {
|
|
27
|
+
1: 240, // 每天240根(4小时×60分钟)
|
|
28
|
+
2: 48, // 每天48根(4小时×12根)
|
|
29
|
+
3: 16, // 每天16根(4小时×4根)
|
|
30
|
+
4: 8, // 每天8根(4小时×2根)
|
|
31
|
+
5: 4, // 每天4根(4小时×1根)
|
|
32
|
+
6: 1, // 每天1根
|
|
33
|
+
7: 0.2, // 每周1根(按5个交易日算)
|
|
34
|
+
8: 0.033, // 每月1根(按21个交易日算)
|
|
35
|
+
};
|
|
36
|
+
// 前端估算大致根数的K线时间
|
|
37
|
+
export const estimateKlineTime = (time, direction, num, cycle) => {
|
|
38
|
+
const dayBarsNum = dayBarsNumByCycle[cycle] || 1;
|
|
39
|
+
// 计算需要的大概天数
|
|
40
|
+
const daysNeeded = num / dayBarsNum;
|
|
41
|
+
|
|
42
|
+
let resultTime;
|
|
43
|
+
if (direction === "before") {
|
|
44
|
+
resultTime = dayjs(time).subtract(daysNeeded, "day");
|
|
45
|
+
} else {
|
|
46
|
+
resultTime = dayjs(time).add(daysNeeded, "day");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return resultTime.format("YYYY-MM-DD HH:mm:ss");
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* @description: 根据开始时间, 结束时间, 返回拓展K线根数+校验间隔后的时间范围
|
|
53
|
+
* @params
|
|
54
|
+
* {
|
|
55
|
+
* startTime 开始时间;
|
|
56
|
+
* endTime: 结束时间;
|
|
57
|
+
* cycle: 周期Id;
|
|
58
|
+
*
|
|
59
|
+
* type: 类型, 默认reset;
|
|
60
|
+
* num: 推算根数, 默认200;
|
|
61
|
+
* maxSpan: 一屏上限根数, 默认3000; 这里是因为前端估算忽略了交易日等因素, 所以在计算差值时, 根数的上限可以比常规的一屏上限数量大一些
|
|
62
|
+
* }
|
|
63
|
+
* @return [startTime, endTime]
|
|
64
|
+
*/
|
|
65
|
+
export const getTimeRange = (rest) => {
|
|
66
|
+
const params = Object.assign({}, { type: "reset", num: 200, maxSpan: 3000 }, rest);
|
|
67
|
+
switch (params.type) {
|
|
68
|
+
case "week": {
|
|
69
|
+
return [dayjs().startOf("week").add(1, "day").format("YYYY-MM-DD HH:mm:ss"), dayjs().endOf("week").add(1, "day").format("YYYY-MM-DD HH:mm:ss")];
|
|
70
|
+
}
|
|
71
|
+
case "month": {
|
|
72
|
+
return [dayjs().startOf("month").format("YYYY-MM-DD HH:mm:ss"), dayjs().endOf("month").format("YYYY-MM-DD HH:mm:ss")];
|
|
73
|
+
}
|
|
74
|
+
case "reset": {
|
|
75
|
+
// 1. 推算根数后的时间范围
|
|
76
|
+
const startTime = estimateKlineTime(params.startTime, "before", params.num, params.cycle);
|
|
77
|
+
const endTime = estimateKlineTime(params.endTime, "after", params.num, params.cycle);
|
|
78
|
+
// 2. 进行N天间隔校验
|
|
79
|
+
const N = Math.ceil(params.maxSpan / dayBarsNumByCycle[params.cycle]);
|
|
80
|
+
const d1 = dayjs(startTime);
|
|
81
|
+
const d2 = dayjs(endTime);
|
|
82
|
+
const diff = d2.diff(d1, "day");
|
|
83
|
+
return [diff <= N ? startTime : dayjs(endTime).subtract(N, "day").format("YYYY-MM-DD HH:mm:ss"), endTime];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
@@ -1,216 +1,30 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<div style="display: flex; align-items: center; gap: 10px">
|
|
4
|
-
<el-button @click="stKlineConfigRef?.open">打开K线自定义配置</el-button>
|
|
5
|
-
<el-select
|
|
6
|
-
v-model="sellBuy"
|
|
7
|
-
style="width: 100px"
|
|
8
|
-
>
|
|
9
|
-
<el-option
|
|
10
|
-
v-for="item in [
|
|
11
|
-
{ label: '买卖', value: 0 },
|
|
12
|
-
{ label: '开平', value: 1 },
|
|
13
|
-
]"
|
|
14
|
-
:key="item.value"
|
|
15
|
-
:value="item.value"
|
|
16
|
-
:label="item.label"
|
|
17
|
-
/>
|
|
18
|
-
</el-select>
|
|
19
|
-
<el-select
|
|
20
|
-
v-model="cycle"
|
|
21
|
-
style="width: 100px"
|
|
22
|
-
>
|
|
23
|
-
<el-option
|
|
24
|
-
v-for="item in cycleOptions"
|
|
25
|
-
:key="item.value"
|
|
26
|
-
:value="item.value"
|
|
27
|
-
:label="item.label"
|
|
28
|
-
/>
|
|
29
|
-
</el-select>
|
|
30
|
-
</div>
|
|
31
|
-
<div class="main">
|
|
32
|
-
<template v-if="!loading">
|
|
33
|
-
<st-klinePlus
|
|
34
|
-
:varietyCode="varietyCode"
|
|
35
|
-
:varietyStock="varietyStock"
|
|
36
|
-
:indicatorStore="indicatorStore"
|
|
37
|
-
:userKlineConfig="userKlineConfig"
|
|
38
|
-
:cycle="cycle"
|
|
39
|
-
:sellBuy="sellBuy"
|
|
40
|
-
:rightType="rightType"
|
|
41
|
-
:klineType="klineType"
|
|
42
|
-
:initTimeRange="initTimeRange"
|
|
43
|
-
:mainIndicator="mainIndicator"
|
|
44
|
-
:tradeLog="tradeLog"
|
|
45
|
-
:netPositionData="netPositionData"
|
|
46
|
-
:positionTime="positionTime"
|
|
47
|
-
/>
|
|
48
|
-
</template>
|
|
49
|
-
</div>
|
|
50
|
-
<st-klineConfig
|
|
51
|
-
ref="stKlineConfigRef"
|
|
52
|
-
:indicatorStore="indicatorStore"
|
|
53
|
-
@callBack="(formJson) => handleUserKlineConfig('update', formJson)"
|
|
54
|
-
/>
|
|
55
|
-
</div>
|
|
56
|
-
</template>
|
|
57
|
-
|
|
58
1
|
<script setup>
|
|
59
|
-
import
|
|
60
|
-
import
|
|
61
|
-
import { onMounted, ref, reactive, provide, inject, nextTick } from "vue";
|
|
62
|
-
|
|
63
|
-
const { request } = inject("stConfig"); // 组件库全局配置
|
|
64
|
-
|
|
65
|
-
const stKlineConfigRef = ref(null);
|
|
66
|
-
const loading = ref(true);
|
|
67
|
-
const userKlineConfig = reactive({});
|
|
68
|
-
provide("userKlineConfig", userKlineConfig);
|
|
69
|
-
|
|
70
|
-
const cycleOptions = [
|
|
71
|
-
{ label: "1m", value: "1" },
|
|
72
|
-
{ label: "60m", value: "5" },
|
|
73
|
-
{ label: "1d", value: "6" },
|
|
74
|
-
{ label: "1mon", value: "8" },
|
|
75
|
-
];
|
|
76
|
-
|
|
77
|
-
const varietyName = ref("国债指数");
|
|
78
|
-
const varietyCode = ref("Z000012");
|
|
79
|
-
const varietyStock = ref(1); // 0: 期货, 1: 股票, 2: 期权
|
|
80
|
-
const tradeLog = ref(tradeLogMock);
|
|
81
|
-
const netPositionData = ref([]);
|
|
82
|
-
const pageType = ref(1);
|
|
83
|
-
const cycle = ref("5");
|
|
84
|
-
const sellBuy = ref(1);
|
|
85
|
-
const rightType = ref(1);
|
|
86
|
-
const klineType = ref(0);
|
|
87
|
-
const mainIndicator = ref("MA");
|
|
88
|
-
const initTimeRange = ref([]);
|
|
89
|
-
const positionTime = ref(null);
|
|
90
|
-
|
|
91
|
-
const indicatorStore = {
|
|
92
|
-
mainIndicatorList: [
|
|
93
|
-
{ label: "DKX_EMA", value: "DKX_EMA" },
|
|
94
|
-
{ label: "MA", value: "MA" },
|
|
95
|
-
],
|
|
96
|
-
getIndicatorParams: () => {
|
|
97
|
-
return ["MA5", "MA10", "MA20", "MA60", "MA120", "MA240", "MA360", "MA720"];
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
// 前端估算K线根数的周期分布
|
|
102
|
-
const dayBarsNumByCycle = {
|
|
103
|
-
1: 240, // 每天240根(4小时×60分钟)
|
|
104
|
-
2: 48, // 每天48根(4小时×12根)
|
|
105
|
-
3: 16, // 每天16根(4小时×4根)
|
|
106
|
-
4: 8, // 每天8根(4小时×2根)
|
|
107
|
-
5: 4, // 每天4根(4小时×1根)
|
|
108
|
-
6: 1, // 每天1根
|
|
109
|
-
7: 0.2, // 每周1根(按5个交易日算)
|
|
110
|
-
8: 0.033, // 每月1根(按21个交易日算)
|
|
111
|
-
};
|
|
112
|
-
// 前端估算大致根数的K线时间
|
|
113
|
-
const estimateKlineTime = (time, direction, num, cycle) => {
|
|
114
|
-
const dayBarsNum = dayBarsNumByCycle[cycle] || 1;
|
|
115
|
-
// 计算需要的大概天数
|
|
116
|
-
const daysNeeded = num / dayBarsNum;
|
|
2
|
+
import { ref } from "vue";
|
|
3
|
+
import KlineDialog from "./KlineDialog/index.vue"
|
|
117
4
|
|
|
118
|
-
|
|
119
|
-
if (direction === "before") {
|
|
120
|
-
resultTime = dayjs(time).subtract(daysNeeded, "day");
|
|
121
|
-
} else {
|
|
122
|
-
resultTime = dayjs(time).add(daysNeeded, "day");
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return resultTime.format("YYYY-MM-DD HH:mm:ss");
|
|
126
|
-
};
|
|
127
|
-
/**
|
|
128
|
-
* @description: 根据开始时间, 结束时间, 返回拓展K线根数+校验间隔后的时间范围
|
|
129
|
-
* @params
|
|
130
|
-
* {
|
|
131
|
-
* startTime 开始时间;
|
|
132
|
-
* endTime: 结束时间;
|
|
133
|
-
* cycle: 周期Id;
|
|
134
|
-
*
|
|
135
|
-
* type: 类型, 默认reset;
|
|
136
|
-
* num: 推算根数, 默认200;
|
|
137
|
-
* maxSpan: 一屏上限根数, 默认3000; 这里是因为前端估算忽略了交易日等因素, 所以在计算差值时, 根数的上限可以比常规的一屏上限数量大一些
|
|
138
|
-
* }
|
|
139
|
-
* @return [startTime, endTime]
|
|
140
|
-
*/
|
|
141
|
-
const getTimeRange = (rest) => {
|
|
142
|
-
const params = Object.assign({}, rest, { type: "reset", num: 200, maxSpan: 3000 });
|
|
143
|
-
switch (params.type) {
|
|
144
|
-
case "week": {
|
|
145
|
-
return [dayjs().startOf("week").add(1, "day").format("YYYY-MM-DD HH:mm:ss"), dayjs().endOf("week").add(1, "day").format("YYYY-MM-DD HH:mm:ss")];
|
|
146
|
-
}
|
|
147
|
-
case "month": {
|
|
148
|
-
return [dayjs().startOf("month").format("YYYY-MM-DD HH:mm:ss"), dayjs().endOf("month").format("YYYY-MM-DD HH:mm:ss")];
|
|
149
|
-
}
|
|
150
|
-
case "reset": {
|
|
151
|
-
// 1. 推算根数后的时间范围
|
|
152
|
-
const startTime = estimateKlineTime(params.startTime, "before", params.num, params.cycle);
|
|
153
|
-
const endTime = estimateKlineTime(params.endTime, "after", params.num, params.cycle);
|
|
154
|
-
// 2. 进行N天间隔校验
|
|
155
|
-
const N = Math.ceil(params.maxSpan / dayBarsNumByCycle[params.cycle]);
|
|
156
|
-
const d1 = dayjs(startTime);
|
|
157
|
-
const d2 = dayjs(endTime);
|
|
158
|
-
const diff = d2.diff(d1, "day");
|
|
159
|
-
return [diff <= N ? startTime : dayjs(endTime).subtract(N, "day").format("YYYY-MM-DD HH:mm:ss"), endTime];
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
// 用户自定义K线配置(获取, 更新)
|
|
164
|
-
const handleUserKlineConfig = async (action, formJson) => {
|
|
165
|
-
switch (action) {
|
|
166
|
-
case "get": {
|
|
167
|
-
const { body } = await request.post("/common/qt/getUserConfig", { appId: 1 });
|
|
168
|
-
Object.assign(userKlineConfig, stKlineConfigRef.value?.getDefaultUserKlineConfig(), body ? JSON.parse(body) : {});
|
|
169
|
-
break;
|
|
170
|
-
}
|
|
171
|
-
case "update": {
|
|
172
|
-
loading.value = true;
|
|
173
|
-
// 更新配置数据
|
|
174
|
-
Object.assign(userKlineConfig, JSON.parse(formJson));
|
|
175
|
-
// 默认值 [自定义配置]
|
|
176
|
-
pageType.value = userKlineConfig.pageType;
|
|
177
|
-
cycle.value = userKlineConfig.singelCycle;
|
|
178
|
-
sellBuy.value = userKlineConfig.sellBuy;
|
|
179
|
-
mainIndicator.value = userKlineConfig.mainIndicator;
|
|
180
|
-
nextTick(() => (loading.value = false));
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
onMounted(async () => {
|
|
186
|
-
loading.value = true;
|
|
187
|
-
|
|
188
|
-
await handleUserKlineConfig("get");
|
|
5
|
+
const KlineDialogRef = ref(null);
|
|
189
6
|
|
|
7
|
+
// 查看K线弹窗组件
|
|
8
|
+
const openKlineDialog = () => {
|
|
190
9
|
const params = {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
10
|
+
analyseId: "6186",
|
|
11
|
+
varietyInfo: {
|
|
12
|
+
index: 0,
|
|
13
|
+
varietyName: "荃银高科",
|
|
14
|
+
varietyCode: "300087",
|
|
15
|
+
ifBasket: 0,
|
|
16
|
+
tradeLog: [],
|
|
17
|
+
},
|
|
18
|
+
varietyList: [],
|
|
195
19
|
};
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
// 默认值 [自定义配置]
|
|
199
|
-
pageType.value = userKlineConfig.pageType;
|
|
200
|
-
cycle.value = userKlineConfig.singelCycle;
|
|
201
|
-
sellBuy.value = userKlineConfig.sellBuy;
|
|
202
|
-
mainIndicator.value = userKlineConfig.mainIndicator;
|
|
203
|
-
|
|
204
|
-
setTimeout(() => {
|
|
205
|
-
loading.value = false;
|
|
206
|
-
}, 200);
|
|
207
|
-
});
|
|
20
|
+
KlineDialogRef.value.open(params);
|
|
21
|
+
};
|
|
208
22
|
</script>
|
|
209
23
|
|
|
210
|
-
<
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
</
|
|
24
|
+
<template>
|
|
25
|
+
<div>
|
|
26
|
+
<el-button @click="openKlineDialog">打开K线窗口</el-button>
|
|
27
|
+
<!-- K线弹窗 -->
|
|
28
|
+
<KlineDialog ref="KlineDialogRef" />
|
|
29
|
+
</div>
|
|
30
|
+
</template>
|