st-comp 0.0.146 → 0.0.147
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/components.d.ts +0 -3
- package/es/ChartLayout.cjs +1 -1
- package/es/ChartLayout.js +2 -2
- package/es/Dialog.cjs +1 -1
- package/es/Dialog.js +22 -26
- package/es/FactorWarning.cjs +1 -1
- package/es/FactorWarning.js +103 -112
- package/es/KlineBasic.cjs +1 -1
- package/es/KlineBasic.js +1426 -671
- package/es/KlineNew.cjs +3 -1
- package/es/KlineNew.js +2736 -314
- package/es/Pagination.cjs +1 -1
- package/es/Pagination.js +96 -102
- package/es/Table.cjs +1 -1
- package/es/Table.js +60 -66
- package/es/User.cjs +1 -1
- package/es/User.js +96 -103
- package/es/VarietySearch.cjs +1 -1
- package/es/VarietySearch.js +32 -41
- package/es/VirtualTable.cjs +1 -13
- package/es/VirtualTable.js +1 -2801
- package/es/_initCloneObject-7493ecd5.cjs +1 -0
- package/es/{_initCloneObject-14b53c6f.js → _initCloneObject-a8dcd058.js} +26 -26
- package/es/{base-ec05f348.cjs → base-00ce90ec.cjs} +3 -3
- package/es/{base-437d17f3.js → base-674a354a.js} +63 -64
- package/es/config-provider-419ffbf2.js +120 -0
- package/es/config-provider-68414290.cjs +3 -0
- package/es/dropdown-127a8c0d.cjs +1 -0
- package/es/{dropdown-634b5e27.js → dropdown-ce30ada6.js} +30 -31
- package/es/el-button-7b9f5933.js +745 -0
- package/es/el-button-c00975e1.cjs +1 -0
- package/es/{el-checkbox-group-e8fece80.js → el-checkbox-group-0554b352.js} +10 -10
- package/es/el-checkbox-group-7a313d34.cjs +1 -0
- package/es/{el-empty-bacc6613.js → el-empty-39b3aed7.js} +5 -5
- package/es/{el-empty-19ea04f4.cjs → el-empty-87154b6d.cjs} +1 -1
- package/es/el-form-item-7867f64d.cjs +12 -0
- package/es/{el-form-item-af1855f0.js → el-form-item-fc6f80ab.js} +78 -79
- package/es/el-input-2ff1628c.cjs +1 -0
- package/es/{el-input-4961b99f.js → el-input-d249ac86.js} +82 -84
- package/es/{el-input-number-610fc8ba.js → el-input-number-2066fbb7.js} +35 -36
- package/es/el-input-number-d6801a5c.cjs +1 -0
- package/es/{el-message-c3b3ac96.js → el-message-9859835d.js} +79 -81
- package/es/el-message-ffcf690c.cjs +1 -0
- package/es/el-overlay-91784be2.cjs +1 -0
- package/es/el-overlay-f0757cc4.js +525 -0
- package/es/el-popover-4db657e2.cjs +1 -0
- package/es/{el-popover-0aa071f2.js → el-popover-b7b43c1f.js} +18 -18
- package/es/el-scrollbar-35bac6b3.js +2452 -0
- package/es/el-scrollbar-ec09bbd3.cjs +1 -0
- package/es/el-select-0785c35a.cjs +1 -0
- package/es/{el-select-9381b156.js → el-select-bcbb7e55.js} +329 -333
- package/es/el-table-column-2478adf8.cjs +14 -0
- package/es/{el-table-column-55bffba5.js → el-table-column-c1e1a206.js} +346 -350
- package/es/el-tag-13ee17b3.cjs +1 -0
- package/es/el-tag-73372c6c.js +359 -0
- package/es/index-07b61d12.cjs +1 -0
- package/es/{index-39ec9741.js → index-45de4a12.js} +7 -7
- package/es/index-65b719a4.cjs +1 -0
- package/es/index-8b5fbc11.js +66 -0
- package/es/index-8c85d7c5.js +858 -0
- package/es/index-a49f4743.cjs +2 -0
- package/es/{scroll-387fcfdb.js → scroll-cb696ed2.js} +1 -1
- package/es/{scroll-41224831.cjs → scroll-cca17da0.cjs} +1 -1
- package/es/style.css +1 -1
- package/es/{zh-cn-ab9a583d.cjs → zh-cn-37af467d.cjs} +1 -1
- package/es/{zh-cn-eb9c2820.js → zh-cn-ef7d7220.js} +2 -2
- package/lib/bundle.js +1 -1
- package/lib/bundle.umd.cjs +206 -206
- package/lib/{index-9b8ff62a.js → index-24f8572c.js} +31450 -33319
- package/lib/{python-a9c3d9e5.js → python-2143eee4.js} +1 -1
- package/lib/style.css +1 -1
- package/package.json +1 -1
- package/packages/KlineBasic/components/KlineSub/index.vue +17 -3
- package/packages/KlineBasic/index.vue +2 -1
- package/packages/KlineBasic/utils.js +20 -2
- package/packages/index.ts +0 -2
- package/src/pages/KlineBasic/api.js +1 -1
- package/src/router/routes.ts +0 -5
- package/es/Kline.cjs +0 -1
- package/es/Kline.js +0 -1901
- package/es/_initCloneObject-441db749.cjs +0 -1
- package/es/castArray-4251bbe4.js +0 -10
- package/es/castArray-a45823fe.cjs +0 -1
- package/es/config-provider-55482a43.js +0 -47
- package/es/config-provider-7cdfca4d.cjs +0 -1
- package/es/debounce-ac30be50.js +0 -83
- package/es/debounce-b2ff12bd.cjs +0 -1
- package/es/dropdown-d7c59a21.cjs +0 -1
- package/es/el-button-196807af.cjs +0 -1
- package/es/el-button-e1665717.js +0 -235
- package/es/el-checkbox-group-492b95cc.cjs +0 -1
- package/es/el-form-item-5bdffd07.cjs +0 -12
- package/es/el-input-23e2bac3.cjs +0 -1
- package/es/el-input-number-40a81eb5.cjs +0 -1
- package/es/el-menu-item-78b858f2.cjs +0 -1
- package/es/el-menu-item-7d04c11a.js +0 -771
- package/es/el-message-d4df8136.cjs +0 -1
- package/es/el-overlay-12dd9b35.js +0 -519
- package/es/el-overlay-bc0790a2.cjs +0 -1
- package/es/el-popover-8a77e015.cjs +0 -1
- package/es/el-popper-50100766.js +0 -2262
- package/es/el-popper-746070ba.cjs +0 -1
- package/es/el-scrollbar-562d0595.js +0 -201
- package/es/el-scrollbar-d1c3e7f7.cjs +0 -1
- package/es/el-select-b162dffc.cjs +0 -1
- package/es/el-table-column-6d761fce.cjs +0 -14
- package/es/el-tag-985d9aff.js +0 -279
- package/es/el-tag-c51a6490.cjs +0 -1
- package/es/index-09e01b1d.js +0 -81
- package/es/index-0cb48e01.js +0 -306
- package/es/index-3bf8d597.cjs +0 -1
- package/es/index-657047bb.js +0 -513
- package/es/index-8a0b1c53.cjs +0 -3
- package/es/index-a387515d.cjs +0 -1
- package/es/index-a902a0d9.js +0 -59
- package/es/index-deb8de52.cjs +0 -1
- package/es/index-eea0bcb3.cjs +0 -1
- package/es/index.esm-8d9a2abe.js +0 -2432
- package/es/index.esm-94a95a2a.cjs +0 -3
- package/es/raf-8fc301fd.cjs +0 -1
- package/es/raf-b128c7b7.js +0 -6
- package/es/typescript-7ae59c4c.js +0 -4
- package/es/typescript-b63f8e83.cjs +0 -1
- package/es/use-form-common-props-1b84d8f4.cjs +0 -2
- package/es/use-form-common-props-f377e500.js +0 -587
- package/es/vnode-7dfd4ed5.js +0 -14
- package/es/vnode-7fbc61e1.cjs +0 -1
- package/packages/Kline/components/Contextmenu/index.vue +0 -110
- package/packages/Kline/components/Tips/index.vue +0 -40
- package/packages/Kline/componentsNew/KlineSlide/index.vue +0 -155
- package/packages/Kline/componentsNew/KlineSub/index.vue +0 -297
- package/packages/Kline/componentsNew/KlineTips/index.vue +0 -66
- package/packages/Kline/componentsNew/KlineUtils/index.vue +0 -84
- package/packages/Kline/componentsNew/Tips/index.vue +0 -33
- package/packages/Kline/formatKlineData.ts +0 -109
- package/packages/Kline/images/buy.svg +0 -1
- package/packages/Kline/images/pen.png +0 -0
- package/packages/Kline/images/sell.svg +0 -1
- package/packages/Kline/images/t.svg +0 -1
- package/packages/Kline/index.ts +0 -16
- package/packages/Kline/index.vue +0 -891
- package/packages/Kline/option.ts +0 -539
- package/packages/Kline/type.d.ts +0 -219
- package/packages/Kline/utils.ts +0 -682
- package/src/pages/Kline/api.ts +0 -127
- package/src/pages/Kline/components/MultiCycleSingleVariety.vue +0 -701
- package/src/pages/Kline/components/SingleCycleSingleVariety.vue +0 -924
- package/src/pages/Kline/index.vue +0 -90
|
@@ -1,924 +0,0 @@
|
|
|
1
|
-
<!-- 单品种单周期K线组件-Demo -->
|
|
2
|
-
<script setup lang="ts">
|
|
3
|
-
import { RefreshRight } from "@element-plus/icons-vue";
|
|
4
|
-
import { ref, onMounted, onUnmounted, computed, watch } from "vue";
|
|
5
|
-
import dayjs from "dayjs";
|
|
6
|
-
import isSameOrAfter from "dayjs/plugin/isSameOrAfter";
|
|
7
|
-
import { ElMessage } from "element-plus";
|
|
8
|
-
import "element-plus/dist/index.css";
|
|
9
|
-
import { formatValue } from "../../../../packages/Kline/utils";
|
|
10
|
-
import {
|
|
11
|
-
getDiffKLine,
|
|
12
|
-
queryDiffLineRevelance,
|
|
13
|
-
getDiffSubKLine,
|
|
14
|
-
getDict,
|
|
15
|
-
getNetPositionData,
|
|
16
|
-
queryPairedRecordByVariety,
|
|
17
|
-
} from "../api.ts";
|
|
18
|
-
import { mainIndicatorList } from "st-func";
|
|
19
|
-
|
|
20
|
-
dayjs.extend(isSameOrAfter);
|
|
21
|
-
|
|
22
|
-
const props = defineProps({
|
|
23
|
-
deBugValue: {
|
|
24
|
-
type: Number,
|
|
25
|
-
},
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const loading = ref(true);
|
|
29
|
-
const netWorkErrorMsg = ref("");
|
|
30
|
-
|
|
31
|
-
// 筛选条件相关参数
|
|
32
|
-
const cycle = ref<any>("5");
|
|
33
|
-
const cycleName = computed(() => {
|
|
34
|
-
if (cycleOptions.value.length > 0) {
|
|
35
|
-
return cycleOptions.value.find((item: any) => item.value === cycle.value).label;
|
|
36
|
-
}
|
|
37
|
-
return null;
|
|
38
|
-
});
|
|
39
|
-
const cycleOptions = ref<any>([]); // 周期下拉框数据
|
|
40
|
-
|
|
41
|
-
const indicator = computed(() => {
|
|
42
|
-
if (mainIndicatorList.length > 0) {
|
|
43
|
-
return mainIndicatorList.find((item: any) => item.value === indicatorName.value);
|
|
44
|
-
}
|
|
45
|
-
return null;
|
|
46
|
-
});
|
|
47
|
-
const indicatorName = ref<any>("DKX_EMA");
|
|
48
|
-
|
|
49
|
-
const sellBuyType = ref(1);
|
|
50
|
-
const sellBuyTypeName = computed(() => {
|
|
51
|
-
if (sellBuyTypeOptions.value.length > 0) {
|
|
52
|
-
return sellBuyTypeOptions.value.find((item: any) => item.value === sellBuyType.value).label;
|
|
53
|
-
}
|
|
54
|
-
return null;
|
|
55
|
-
});
|
|
56
|
-
const sellBuyTypeOptions = ref<any>([
|
|
57
|
-
{ label: "开平", value: 1 },
|
|
58
|
-
{ label: "买卖", value: 2 },
|
|
59
|
-
]);
|
|
60
|
-
|
|
61
|
-
const otherChart = ref("价差分布图");
|
|
62
|
-
const otherChartOptions = ["二腿价格走势图", "二腿价格走势百分比图", "二腿相关度", "价差周期性", "价差分布图"];
|
|
63
|
-
|
|
64
|
-
// 接口原生-点位数据
|
|
65
|
-
const originPointData = ref<any>([]);
|
|
66
|
-
// 接口原生-二腿相关度数据
|
|
67
|
-
const relevanceOriginData = ref<any>([]);
|
|
68
|
-
// 接口原生-二腿价格趋势数据
|
|
69
|
-
const priceTrendOriginData = ref<any>([]);
|
|
70
|
-
const priceTrendPercentOriginData = ref<any>([]);
|
|
71
|
-
// K线组件入参
|
|
72
|
-
const isSelect = ref(false);
|
|
73
|
-
const klineData = ref<any>([]);
|
|
74
|
-
const markData = ref<any>([]);
|
|
75
|
-
const lineData = ref<any>([]);
|
|
76
|
-
const brushRange = ref<any>(["2024-01-04 10:10:00", "2024-01-04 21:40:00"]);
|
|
77
|
-
const netPositionData = ref<any>([]);
|
|
78
|
-
const defaultMenuData = ref([
|
|
79
|
-
{
|
|
80
|
-
label: "画线预警",
|
|
81
|
-
callBack: (echartsInstance: any, cursorPenVisible: any) => createWarning(echartsInstance, cursorPenVisible),
|
|
82
|
-
},
|
|
83
|
-
]);
|
|
84
|
-
const relevanceData = computed(() => {
|
|
85
|
-
let result = [];
|
|
86
|
-
result = relevanceOriginData.value.reduce((res: any[], item: any) => {
|
|
87
|
-
res.push([
|
|
88
|
-
dayjs(item.genTime).format(cycle.value === "6" ? "YYYY-MM-DDT00:00:00" : "YYYY-MM-DDT15:00:00"),
|
|
89
|
-
item.rel,
|
|
90
|
-
]);
|
|
91
|
-
return res;
|
|
92
|
-
}, []);
|
|
93
|
-
return result;
|
|
94
|
-
});
|
|
95
|
-
const priceTrendData = computed(() => {
|
|
96
|
-
let result = [];
|
|
97
|
-
result = priceTrendOriginData.value.reduce((res: any[], item: any) => {
|
|
98
|
-
res.push({
|
|
99
|
-
name: item.name,
|
|
100
|
-
data: item.infos.map((i) => {
|
|
101
|
-
return [dayjs(i.genTime).format("YYYY-MM-DDTHH:mm:ss"), i.close];
|
|
102
|
-
}),
|
|
103
|
-
});
|
|
104
|
-
return res;
|
|
105
|
-
}, []);
|
|
106
|
-
return result;
|
|
107
|
-
});
|
|
108
|
-
const priceTrendPercentData = computed(() => {
|
|
109
|
-
let result = [];
|
|
110
|
-
result = priceTrendPercentOriginData.value.reduce((res: any[], item: any) => {
|
|
111
|
-
res.push({
|
|
112
|
-
name: item.name,
|
|
113
|
-
data: item.infos.map((i) => {
|
|
114
|
-
return [dayjs(i.genTime).format("YYYY-MM-DDTHH:mm:ss"), i.close];
|
|
115
|
-
}),
|
|
116
|
-
});
|
|
117
|
-
return res;
|
|
118
|
-
}, []);
|
|
119
|
-
return result;
|
|
120
|
-
});
|
|
121
|
-
const config = ref({
|
|
122
|
-
totalBarCount: 2000, // 会被渲染的K线条数
|
|
123
|
-
preBarCount: 100, // 预加载K线条数
|
|
124
|
-
// 左上角Tips配置
|
|
125
|
-
tipsConfig: {
|
|
126
|
-
open: true,
|
|
127
|
-
heigh: true,
|
|
128
|
-
low: true,
|
|
129
|
-
close: true,
|
|
130
|
-
business: false,
|
|
131
|
-
riseAndFall: true,
|
|
132
|
-
netPosition: true,
|
|
133
|
-
},
|
|
134
|
-
// 动态数据加载配置
|
|
135
|
-
dynamicLoadConfig: {
|
|
136
|
-
historyVisible: true,
|
|
137
|
-
historyLoadCallBack: async (historyIsAllLoad: any) => {
|
|
138
|
-
const { totalBarCount, preBarCount } = config.value;
|
|
139
|
-
// 前置判断: 如果 [K线数据量 < 期望总渲染条数 + 预请求数] ,则标记完毕
|
|
140
|
-
if (klineData.value.length < totalBarCount + preBarCount) {
|
|
141
|
-
config.value.totalBarCount = klineData.value.length;
|
|
142
|
-
historyIsAllLoad.value = true;
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
// 运算过程:
|
|
146
|
-
// 1.计算出当前K线数据中,第一根K线时间点
|
|
147
|
-
// 2.请求接口,获取历史K线数据,并拼接
|
|
148
|
-
// 3.如果请求到的数据量小于期望获得的条数,或当前数据总根数大于限制的10000条数, 则标记完毕
|
|
149
|
-
const endTime = dayjs(klineData.value[0][0]).format("YYYY-MM-DD HH:mm:ss");
|
|
150
|
-
const params = { diffId: 1481, cycle: cycle.value, limit: 2800, endTime, queryType: 1 };
|
|
151
|
-
const res = await getDiffKLine(params);
|
|
152
|
-
const apiData = res.data.body.slice(0, res.data.body.length - 1);
|
|
153
|
-
klineData.value = [...apiData, ...klineData.value];
|
|
154
|
-
config.value.totalBarCount = klineData.value.length;
|
|
155
|
-
if (apiData.length < 2800 - 1 || config.value.totalBarCount > 10000) {
|
|
156
|
-
historyIsAllLoad.value = true;
|
|
157
|
-
}
|
|
158
|
-
},
|
|
159
|
-
},
|
|
160
|
-
isOpenDS: false,
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
watch(
|
|
164
|
-
otherChart,
|
|
165
|
-
(newValue: string) => {
|
|
166
|
-
config.value.isOpenDS = false;
|
|
167
|
-
relevanceOriginData.value = [];
|
|
168
|
-
priceTrendOriginData.value = [];
|
|
169
|
-
priceTrendPercentOriginData.value = [];
|
|
170
|
-
const callBackMap = new Map([
|
|
171
|
-
[
|
|
172
|
-
"二腿价格走势图",
|
|
173
|
-
async () => {
|
|
174
|
-
await getPriceTrendData("value");
|
|
175
|
-
},
|
|
176
|
-
],
|
|
177
|
-
[
|
|
178
|
-
"二腿价格走势百分比图",
|
|
179
|
-
async () => {
|
|
180
|
-
await getPriceTrendData("percent");
|
|
181
|
-
},
|
|
182
|
-
],
|
|
183
|
-
[
|
|
184
|
-
"二腿相关度",
|
|
185
|
-
async () => {
|
|
186
|
-
await getRelevanceData();
|
|
187
|
-
},
|
|
188
|
-
],
|
|
189
|
-
["价差周期性", async () => {}],
|
|
190
|
-
[
|
|
191
|
-
"价差分布图",
|
|
192
|
-
async () => {
|
|
193
|
-
config.value.isOpenDS = true;
|
|
194
|
-
},
|
|
195
|
-
],
|
|
196
|
-
]);
|
|
197
|
-
const callBack = callBackMap.get(newValue);
|
|
198
|
-
callBack instanceof Function && callBack();
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
immediate: true,
|
|
202
|
-
}
|
|
203
|
-
);
|
|
204
|
-
|
|
205
|
-
// 初始化
|
|
206
|
-
const componentInit = async () => {
|
|
207
|
-
try {
|
|
208
|
-
loading.value = true;
|
|
209
|
-
await getDictCycle();
|
|
210
|
-
await getKlineData();
|
|
211
|
-
// await getKlinePointData();
|
|
212
|
-
// await getKlineNetPositionData();
|
|
213
|
-
loading.value = false;
|
|
214
|
-
await getKlineExtendData();
|
|
215
|
-
} catch (error) {
|
|
216
|
-
console.log(error);
|
|
217
|
-
} finally {
|
|
218
|
-
loading.value = false;
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* @description: 获取通用字典[周期]
|
|
224
|
-
*/
|
|
225
|
-
const getDictCycle = async () => {
|
|
226
|
-
const params = {
|
|
227
|
-
dictIds: [1002],
|
|
228
|
-
};
|
|
229
|
-
const res = await getDict(params);
|
|
230
|
-
cycleOptions.value = res.data.body[1002].map((item: any) => {
|
|
231
|
-
return {
|
|
232
|
-
label: item.dictName,
|
|
233
|
-
value: item.dictCode,
|
|
234
|
-
data: item,
|
|
235
|
-
};
|
|
236
|
-
});
|
|
237
|
-
};
|
|
238
|
-
/**
|
|
239
|
-
* @description: 获取K线数据(价差)
|
|
240
|
-
*/
|
|
241
|
-
const getKlineData = async () => {
|
|
242
|
-
const params = { diffId: 1481, cycle: cycle.value, limit: 2800, endTime: "2024-04-08 17:02:19", queryType: 1 };
|
|
243
|
-
const res = await getDiffKLine(params);
|
|
244
|
-
klineData.value = res.data.body;
|
|
245
|
-
};
|
|
246
|
-
/**
|
|
247
|
-
* @description: 获取点位数据
|
|
248
|
-
*/
|
|
249
|
-
const getKlinePointData = async () => {
|
|
250
|
-
// ------
|
|
251
|
-
const params = {
|
|
252
|
-
analyseId: 3172,
|
|
253
|
-
cycle: cycle.value,
|
|
254
|
-
ifStock: 0,
|
|
255
|
-
varietyName: "橡胶",
|
|
256
|
-
};
|
|
257
|
-
const res = await queryPairedRecordByVariety(params);
|
|
258
|
-
const body = res.data.body;
|
|
259
|
-
// console.log(body);
|
|
260
|
-
const formatData = [];
|
|
261
|
-
const markLine = [];
|
|
262
|
-
// 格式化: 每一笔订单都有开,平两对应的点
|
|
263
|
-
body.forEach((item) => {
|
|
264
|
-
let openTime = klineData.value.find((i) => dayjs(i[0]).isSameOrAfter(item.openTime))[0];
|
|
265
|
-
let closeTime = klineData.value.find((i) => dayjs(i[0]).isSameOrAfter(item.closeTime))[0];
|
|
266
|
-
// 日线
|
|
267
|
-
if (cycle.value == 6) {
|
|
268
|
-
// 只看年月日
|
|
269
|
-
const toYMD = (value) => {
|
|
270
|
-
return dayjs(value).format("YYYY-MM-DD");
|
|
271
|
-
};
|
|
272
|
-
openTime = klineData.value.find((i) => dayjs(toYMD(i[0])).isSameOrAfter(toYMD(item.openTime)))[0];
|
|
273
|
-
closeTime = klineData.value.find((i) => dayjs(toYMD(i[0])).isSameOrAfter(toYMD(item.closeTime)))[0];
|
|
274
|
-
}
|
|
275
|
-
// 周线
|
|
276
|
-
if (cycle.value == 7) {
|
|
277
|
-
// 只看这个时间点的周五
|
|
278
|
-
}
|
|
279
|
-
// 月线
|
|
280
|
-
if (cycle.value == 8) {
|
|
281
|
-
// 只看这个时间点的年月
|
|
282
|
-
const toYM = (value) => {
|
|
283
|
-
return dayjs(value).format("YYYY-MM");
|
|
284
|
-
};
|
|
285
|
-
openTime = klineData.value.find((i) => dayjs(toYM(i[0])).isSameOrAfter(toYM(item.openTime)))[0];
|
|
286
|
-
closeTime = klineData.value.find((i) => dayjs(toYM(i[0])).isSameOrAfter(toYM(item.closeTime)))[0];
|
|
287
|
-
}
|
|
288
|
-
const openItem = {
|
|
289
|
-
tradeAction: "开",
|
|
290
|
-
direction: item.tradeDirection ? "空" : "多", // 交易方向
|
|
291
|
-
tradeType: `开${item.tradeDirection ? "空" : "多"}`,
|
|
292
|
-
amount: item.tradeVolume, // 手数
|
|
293
|
-
part: null, // 份数
|
|
294
|
-
profitAndLoss: item.profitAndLoss,
|
|
295
|
-
time: openTime, // 匹配到X轴的时间
|
|
296
|
-
markLineTarget: [],
|
|
297
|
-
};
|
|
298
|
-
// 连线逻辑,当天的不连
|
|
299
|
-
if (openTime !== closeTime) {
|
|
300
|
-
openItem.markLineTarget = [
|
|
301
|
-
{
|
|
302
|
-
time: closeTime,
|
|
303
|
-
name: `平${item.tradeDirection ? "空" : "多"}`,
|
|
304
|
-
lineStyle: {
|
|
305
|
-
color: item.profitAndLoss >= 0 ? "#FF0000" : "#389e0d",
|
|
306
|
-
},
|
|
307
|
-
},
|
|
308
|
-
];
|
|
309
|
-
}
|
|
310
|
-
const closeItem = {
|
|
311
|
-
tradeAction: "平",
|
|
312
|
-
direction: item.tradeDirection ? "空" : "多", // 交易方向
|
|
313
|
-
tradeType: `平${item.tradeDirection ? "空" : "多"}`,
|
|
314
|
-
amount: item.tradeVolume, // 手数
|
|
315
|
-
part: null, // 份数
|
|
316
|
-
profitAndLoss: item.profitAndLoss,
|
|
317
|
-
time: closeTime, // 匹配到X轴的时间
|
|
318
|
-
};
|
|
319
|
-
formatData.push(openItem);
|
|
320
|
-
formatData.push(closeItem);
|
|
321
|
-
// 连线数据
|
|
322
|
-
// markLine.push([
|
|
323
|
-
// {
|
|
324
|
-
// coord: [openTime, 1],
|
|
325
|
-
// },
|
|
326
|
-
// {
|
|
327
|
-
// coord: [closeTime, 1],
|
|
328
|
-
// },
|
|
329
|
-
// ]);
|
|
330
|
-
});
|
|
331
|
-
// 数据合并
|
|
332
|
-
const noRepeatMap = new Map([]);
|
|
333
|
-
formatData.forEach((i) => {
|
|
334
|
-
const { time, tradeType } = i;
|
|
335
|
-
const key = time + tradeType;
|
|
336
|
-
// 判断这个节点是否已存在数据
|
|
337
|
-
if (noRepeatMap.has(key)) {
|
|
338
|
-
// 已存在,说明节点重复,进行数据合并
|
|
339
|
-
const oldItem = noRepeatMap.get(key);
|
|
340
|
-
i.amount += oldItem.amount;
|
|
341
|
-
i.part += oldItem.part;
|
|
342
|
-
i.profitAndLoss += oldItem.profitAndLoss;
|
|
343
|
-
if (i.markLineTarget) {
|
|
344
|
-
// 如果新的markLineTarget没有存在过于老的markLineTarget中
|
|
345
|
-
const isRepeat = oldItem.markLineTarget.find(
|
|
346
|
-
(item) => item.time === i.markLineTarget[0].time && item.name === i.markLineTarget[0].name
|
|
347
|
-
);
|
|
348
|
-
if (!isRepeat) {
|
|
349
|
-
i.markLineTarget = [...i.markLineTarget, ...oldItem.markLineTarget];
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
i.tooltip = `<div>${tradeType}: ${i.amount}手<div>`;
|
|
354
|
-
// 如果是平仓则需要展示盈亏
|
|
355
|
-
if (i.tradeAction === "平") {
|
|
356
|
-
i.tooltip += `盈亏:${i.profitAndLoss.toFixed(2)}`;
|
|
357
|
-
}
|
|
358
|
-
noRepeatMap.set(key, i);
|
|
359
|
-
});
|
|
360
|
-
originPointData.value = [
|
|
361
|
-
{
|
|
362
|
-
key: "sellBuy",
|
|
363
|
-
data: [...noRepeatMap.values()],
|
|
364
|
-
},
|
|
365
|
-
{
|
|
366
|
-
key: "openClose",
|
|
367
|
-
data: [...noRepeatMap.values()],
|
|
368
|
-
},
|
|
369
|
-
];
|
|
370
|
-
// 1.获取点位接口数据 2.格式化处理[数据合并,匹配K线时间轴] 建议分开,此处demo所以简写
|
|
371
|
-
// const resultApi = [
|
|
372
|
-
// {
|
|
373
|
-
// key: "sellBuy",
|
|
374
|
-
// data: [
|
|
375
|
-
// {
|
|
376
|
-
// tradeAction: "开", // 交易动作
|
|
377
|
-
// direction: "多", // 交易方向
|
|
378
|
-
// tradeType: "开多", // 交易类型
|
|
379
|
-
// amount: 2, // 手数
|
|
380
|
-
// part: 2, // 份数
|
|
381
|
-
// time: "2024-01-04 22:30:00", // 交易时间
|
|
382
|
-
// tooltip: "<div>买卖点1</div>",
|
|
383
|
-
// },
|
|
384
|
-
// {
|
|
385
|
-
// tradeAction: "平", // 交易动作
|
|
386
|
-
// direction: "空", // 交易方向
|
|
387
|
-
// tradeType: "平空", // 交易类型
|
|
388
|
-
// amount: 2, // 手数
|
|
389
|
-
// part: 2, // 份数
|
|
390
|
-
// time: "2024-01-04 22:40:00", // 交易时间
|
|
391
|
-
// tooltip: "<div>买卖点2</div>",
|
|
392
|
-
// },
|
|
393
|
-
// {
|
|
394
|
-
// tradeAction: "开", // 交易动作
|
|
395
|
-
// direction: "空", // 交易方向
|
|
396
|
-
// tradeType: "开空", // 交易类型
|
|
397
|
-
// amount: 2, // 手数
|
|
398
|
-
// part: 2, // 份数
|
|
399
|
-
// time: "2024-01-04 23:50:00", // 交易时间
|
|
400
|
-
// tooltip: "<div>买卖点3</div>",
|
|
401
|
-
// },
|
|
402
|
-
// ],
|
|
403
|
-
// },
|
|
404
|
-
// {
|
|
405
|
-
// key: "openClose",
|
|
406
|
-
// data: [
|
|
407
|
-
// {
|
|
408
|
-
// tradeAction: "开", // 交易动作
|
|
409
|
-
// direction: "多", // 交易方向
|
|
410
|
-
// tradeType: "开多", // 交易类型
|
|
411
|
-
// amount: 2, // 手数
|
|
412
|
-
// part: 2, // 份数
|
|
413
|
-
// time: "2024-01-04 22:30:00", // 交易时间
|
|
414
|
-
// tooltip: "<div>开平点1</div>",
|
|
415
|
-
// },
|
|
416
|
-
// {
|
|
417
|
-
// tradeAction: "平", // 交易动作
|
|
418
|
-
// direction: "空", // 交易方向
|
|
419
|
-
// tradeType: "平空", // 交易类型
|
|
420
|
-
// amount: 2, // 手数
|
|
421
|
-
// part: 2, // 份数
|
|
422
|
-
// time: "2024-01-04 22:40:00", // 交易时间
|
|
423
|
-
// tooltip: "<div>开平点2</div>",
|
|
424
|
-
// },
|
|
425
|
-
// {
|
|
426
|
-
// tradeAction: "开", // 交易动作
|
|
427
|
-
// direction: "空", // 交易方向
|
|
428
|
-
// tradeType: "开空", // 交易类型
|
|
429
|
-
// amount: 2, // 手数
|
|
430
|
-
// part: 2, // 份数
|
|
431
|
-
// time: "2024-01-04 23:50:00", // 交易时间
|
|
432
|
-
// tooltip: "<div>买卖点3</div>",
|
|
433
|
-
// },
|
|
434
|
-
// ],
|
|
435
|
-
// },
|
|
436
|
-
// {
|
|
437
|
-
// key: "signal",
|
|
438
|
-
// data: [],
|
|
439
|
-
// },
|
|
440
|
-
// ];
|
|
441
|
-
// 进行时间轴匹配
|
|
442
|
-
// const klineTimeAry = klineData.value.map((item: any) => item[0]);
|
|
443
|
-
// originPointData.value = resultApi.reduce((result: any, next) => {
|
|
444
|
-
// const { data } = next;
|
|
445
|
-
// result.push({
|
|
446
|
-
// key: next.key,
|
|
447
|
-
// data: data.map((item: any) => {
|
|
448
|
-
// const time = klineTimeAry.find((klineTime: string) => dayjs(klineTime).isSameOrAfter(item.time));
|
|
449
|
-
// return {
|
|
450
|
-
// ...item,
|
|
451
|
-
// time,
|
|
452
|
-
// };
|
|
453
|
-
// }),
|
|
454
|
-
// });
|
|
455
|
-
// return result;
|
|
456
|
-
// }, []);
|
|
457
|
-
// 判断展示开平/买卖
|
|
458
|
-
sellBuyTypeChange();
|
|
459
|
-
};
|
|
460
|
-
/**
|
|
461
|
-
* @description: 获取K线额外画线数据
|
|
462
|
-
*/
|
|
463
|
-
const getKlineExtendData = async () => {
|
|
464
|
-
lineData.value = [
|
|
465
|
-
{
|
|
466
|
-
key: "warning",
|
|
467
|
-
data: [
|
|
468
|
-
{
|
|
469
|
-
value: 479,
|
|
470
|
-
text: 479,
|
|
471
|
-
// 自定义信息
|
|
472
|
-
info: {},
|
|
473
|
-
// 自定义配置
|
|
474
|
-
config: {
|
|
475
|
-
draggable: true,
|
|
476
|
-
},
|
|
477
|
-
},
|
|
478
|
-
],
|
|
479
|
-
ondragstart: (params: any, info: any) => {
|
|
480
|
-
console.log("拖拽开始", params, info);
|
|
481
|
-
},
|
|
482
|
-
ondragend: (params: any, info: any, yAxisValue: number) => {
|
|
483
|
-
console.log("拖拽结束", params, info, yAxisValue);
|
|
484
|
-
ElMessage.success("预警线修改更新成功!");
|
|
485
|
-
},
|
|
486
|
-
oncontextmenu: (params: any, info: any, menuData: any) => {
|
|
487
|
-
console.log("右击了", params, info);
|
|
488
|
-
menuData.value = [
|
|
489
|
-
{
|
|
490
|
-
label: "删除画线",
|
|
491
|
-
callBack: () => ElMessage.success("预警线删除成功!"),
|
|
492
|
-
},
|
|
493
|
-
{
|
|
494
|
-
label: "修改画线",
|
|
495
|
-
callBack: () => ElMessage.success("预警线修改成功!"),
|
|
496
|
-
},
|
|
497
|
-
];
|
|
498
|
-
},
|
|
499
|
-
},
|
|
500
|
-
{
|
|
501
|
-
key: "position",
|
|
502
|
-
data: [
|
|
503
|
-
{
|
|
504
|
-
value: 480,
|
|
505
|
-
text: "持仓:192.14万(1份) 数量:4手 方向:多 浮动盈亏:-1280.00",
|
|
506
|
-
// 自定义信息
|
|
507
|
-
info: {},
|
|
508
|
-
// 自定义配置
|
|
509
|
-
config: {},
|
|
510
|
-
},
|
|
511
|
-
],
|
|
512
|
-
},
|
|
513
|
-
{
|
|
514
|
-
key: "condition",
|
|
515
|
-
data: [
|
|
516
|
-
{
|
|
517
|
-
value: 482,
|
|
518
|
-
text: "[多损][多盈] 开多↓2269 1份(22手)",
|
|
519
|
-
profitValue: 483,
|
|
520
|
-
profitText: "上破484",
|
|
521
|
-
lossValue: 481,
|
|
522
|
-
lossText: "下破482",
|
|
523
|
-
// 自定义信息
|
|
524
|
-
info: {},
|
|
525
|
-
// 自定义配置
|
|
526
|
-
config: {},
|
|
527
|
-
},
|
|
528
|
-
],
|
|
529
|
-
},
|
|
530
|
-
];
|
|
531
|
-
};
|
|
532
|
-
/**
|
|
533
|
-
* @description: 获取净值曲线数据
|
|
534
|
-
*/
|
|
535
|
-
const getKlineNetPositionData = async () => {
|
|
536
|
-
const params = {
|
|
537
|
-
analyseId: "2229",
|
|
538
|
-
endTime: "2022-12-23T00:00:00",
|
|
539
|
-
startTime: "2020-12-23T00:00:00",
|
|
540
|
-
varietyCode: "FU",
|
|
541
|
-
};
|
|
542
|
-
const res = await getNetPositionData(params);
|
|
543
|
-
const body = res.data.body;
|
|
544
|
-
const netPositionMap = new Map();
|
|
545
|
-
if (Number(cycle.value) <= 5) {
|
|
546
|
-
body.forEach((item: any) => {
|
|
547
|
-
const key = dayjs(item.tradeDate).format("YYYY-MM-DD HH:mm:ss");
|
|
548
|
-
const value = item.netPositionValue;
|
|
549
|
-
netPositionMap.set(key, value);
|
|
550
|
-
});
|
|
551
|
-
} else {
|
|
552
|
-
body.forEach((item: any) => {
|
|
553
|
-
const key = dayjs(item.tradeDate).add(9, "hour").format("YYYY-MM-DD HH:mm:ss");
|
|
554
|
-
const value = item.netPositionValue;
|
|
555
|
-
netPositionMap.set(key, value);
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
netPositionData.value = klineData.value.map((item: any) => netPositionMap.get(item[0]) ?? null);
|
|
559
|
-
};
|
|
560
|
-
/**
|
|
561
|
-
* @description: 获取二腿相关度数据
|
|
562
|
-
*/
|
|
563
|
-
const getRelevanceData = async () => {
|
|
564
|
-
const params = {
|
|
565
|
-
diffId: 1481,
|
|
566
|
-
};
|
|
567
|
-
const res = await queryDiffLineRevelance(params);
|
|
568
|
-
const { body } = res.data;
|
|
569
|
-
relevanceOriginData.value = body;
|
|
570
|
-
};
|
|
571
|
-
/**
|
|
572
|
-
* @description: 获取二腿价格走势数据
|
|
573
|
-
*/
|
|
574
|
-
const getPriceTrendData = async (type: string) => {
|
|
575
|
-
const params = { diffId: 1481, cycle: cycle.value, limit: 2800, endTime: "2024-04-08 17:02:19", queryType: 1 };
|
|
576
|
-
const res = await getDiffSubKLine(params);
|
|
577
|
-
const { body } = res.data;
|
|
578
|
-
if (type === "value") {
|
|
579
|
-
priceTrendOriginData.value = body;
|
|
580
|
-
} else {
|
|
581
|
-
priceTrendPercentOriginData.value = body;
|
|
582
|
-
}
|
|
583
|
-
};
|
|
584
|
-
|
|
585
|
-
/**
|
|
586
|
-
* @description: 周期切换
|
|
587
|
-
*/
|
|
588
|
-
const cycleChange = async () => {
|
|
589
|
-
try {
|
|
590
|
-
loading.value = true;
|
|
591
|
-
config.value.totalBarCount = 2000;
|
|
592
|
-
await getKlineData();
|
|
593
|
-
// await getPriceTrendData();
|
|
594
|
-
// await getKlinePointData();
|
|
595
|
-
loading.value = false;
|
|
596
|
-
} catch (error) {
|
|
597
|
-
console.log(error);
|
|
598
|
-
} finally {
|
|
599
|
-
loading.value = false;
|
|
600
|
-
}
|
|
601
|
-
};
|
|
602
|
-
|
|
603
|
-
/**
|
|
604
|
-
* @description: 买卖点,开平点切换
|
|
605
|
-
*/
|
|
606
|
-
const sellBuyTypeChange = () => {
|
|
607
|
-
if (sellBuyType.value === 1) {
|
|
608
|
-
markData.value = originPointData.value.filter((item: any) => {
|
|
609
|
-
return item.key !== "sellBuy";
|
|
610
|
-
});
|
|
611
|
-
} else {
|
|
612
|
-
markData.value = originPointData.value.filter((item: any) => {
|
|
613
|
-
return item.key !== "openClose";
|
|
614
|
-
});
|
|
615
|
-
}
|
|
616
|
-
};
|
|
617
|
-
|
|
618
|
-
// 画线预警
|
|
619
|
-
const createWarning = (echartsInstance: any, cursorPenVisible: any) => {
|
|
620
|
-
// 1.打开画笔模式,并修改指示器样式[画预览线]
|
|
621
|
-
cursorPenVisible.value = true;
|
|
622
|
-
const echartsOptions = echartsInstance.getOption();
|
|
623
|
-
const oldTooltip = (echartsOptions.tooltip as Array<any>)[0];
|
|
624
|
-
echartsInstance.setOption({
|
|
625
|
-
...echartsOptions,
|
|
626
|
-
// 指示器样式
|
|
627
|
-
tooltip: {
|
|
628
|
-
...oldTooltip,
|
|
629
|
-
// 坐标轴指示器
|
|
630
|
-
axisPointer: {
|
|
631
|
-
// 保留原有部分配置
|
|
632
|
-
...oldTooltip.axisPointer,
|
|
633
|
-
// X轴指示线的宽度
|
|
634
|
-
lineStyle: {
|
|
635
|
-
width: 0,
|
|
636
|
-
},
|
|
637
|
-
// Y轴指示线的宽度
|
|
638
|
-
crossStyle: {
|
|
639
|
-
width: 2,
|
|
640
|
-
},
|
|
641
|
-
// 文本标签
|
|
642
|
-
label: {
|
|
643
|
-
// 保留原有部分配置
|
|
644
|
-
...oldTooltip.axisPointer.label,
|
|
645
|
-
// 颜色改为透明
|
|
646
|
-
backgroundColor: "transparent",
|
|
647
|
-
// 仅显示Y轴值
|
|
648
|
-
formatter: (data: any) => {
|
|
649
|
-
const { axisDimension, value } = data;
|
|
650
|
-
if (axisDimension === "y") {
|
|
651
|
-
return String(formatValue(value));
|
|
652
|
-
}
|
|
653
|
-
return "";
|
|
654
|
-
},
|
|
655
|
-
},
|
|
656
|
-
},
|
|
657
|
-
},
|
|
658
|
-
});
|
|
659
|
-
// 2.获取当前列数据并发送请求至后端记录
|
|
660
|
-
const handleClick = (el: any) => {
|
|
661
|
-
// 关闭画笔模式,并移除echarts点击事件
|
|
662
|
-
cursorPenVisible.value = false;
|
|
663
|
-
echartsInstance.getZr().off("mousedown", handleClick);
|
|
664
|
-
const yAxisValue = echartsInstance.convertFromPixel({ yAxisIndex: 0 }, el.offsetY);
|
|
665
|
-
const newWarnPrice = Math.round(yAxisValue * 1000) / 1000;
|
|
666
|
-
// 3.恢复指示器样式
|
|
667
|
-
echartsInstance.setOption({
|
|
668
|
-
...echartsOptions,
|
|
669
|
-
// 指示器样式
|
|
670
|
-
tooltip: {
|
|
671
|
-
...oldTooltip,
|
|
672
|
-
axisPointer: {
|
|
673
|
-
...oldTooltip.axisPointer,
|
|
674
|
-
lineStyle: {
|
|
675
|
-
width: 1,
|
|
676
|
-
},
|
|
677
|
-
crossStyle: {
|
|
678
|
-
width: 1,
|
|
679
|
-
},
|
|
680
|
-
label: {
|
|
681
|
-
...oldTooltip.axisPointer.label,
|
|
682
|
-
backgroundColor: null,
|
|
683
|
-
},
|
|
684
|
-
},
|
|
685
|
-
},
|
|
686
|
-
});
|
|
687
|
-
// 4.发送保存预警线请求
|
|
688
|
-
lineData.value[0].data.push({
|
|
689
|
-
value: newWarnPrice,
|
|
690
|
-
text: newWarnPrice,
|
|
691
|
-
// 自定义信息
|
|
692
|
-
info: {},
|
|
693
|
-
// 自定义配置
|
|
694
|
-
config: {
|
|
695
|
-
draggable: true,
|
|
696
|
-
},
|
|
697
|
-
});
|
|
698
|
-
console.log(lineData.value[0].data);
|
|
699
|
-
ElMessage.success("画线预警成功!");
|
|
700
|
-
};
|
|
701
|
-
// 绑定echarts点击事件
|
|
702
|
-
echartsInstance.getZr().on("mousedown", handleClick);
|
|
703
|
-
};
|
|
704
|
-
|
|
705
|
-
watch(
|
|
706
|
-
() => props.deBugValue,
|
|
707
|
-
(newValue: any) => {
|
|
708
|
-
if (newValue === 1) {
|
|
709
|
-
// 正常模式
|
|
710
|
-
netWorkErrorMsg.value = "";
|
|
711
|
-
componentInit();
|
|
712
|
-
} else if (newValue === 2) {
|
|
713
|
-
// 网络故障
|
|
714
|
-
loading.value = true;
|
|
715
|
-
setTimeout(() => {
|
|
716
|
-
netWorkErrorMsg.value = "网络加载失败,请刷新重试";
|
|
717
|
-
loading.value = false;
|
|
718
|
-
}, 1000);
|
|
719
|
-
} else if (newValue === 3) {
|
|
720
|
-
// 空数据
|
|
721
|
-
netWorkErrorMsg.value = "";
|
|
722
|
-
loading.value = true;
|
|
723
|
-
setTimeout(() => {
|
|
724
|
-
klineData.value = [];
|
|
725
|
-
loading.value = false;
|
|
726
|
-
}, 1000);
|
|
727
|
-
}
|
|
728
|
-
},
|
|
729
|
-
{
|
|
730
|
-
immediate: true,
|
|
731
|
-
}
|
|
732
|
-
);
|
|
733
|
-
|
|
734
|
-
onUnmounted(() => {
|
|
735
|
-
console.log("---------单品种单周期组件: onUnmounted卸载成功---------");
|
|
736
|
-
});
|
|
737
|
-
|
|
738
|
-
// 刷新按钮
|
|
739
|
-
const reFresh = () => {
|
|
740
|
-
netWorkErrorMsg.value = "";
|
|
741
|
-
componentInit();
|
|
742
|
-
};
|
|
743
|
-
</script>
|
|
744
|
-
|
|
745
|
-
<template>
|
|
746
|
-
<div id="single-cycle-single-variety" @mousemove="isSelect = true" @mouseout="isSelect = false">
|
|
747
|
-
<div class="st-Kline" v-loading="loading" element-loading-text="正在加载数据中,请稍等...">
|
|
748
|
-
<!-- 功能区 -->
|
|
749
|
-
<div class="kline-header">
|
|
750
|
-
<!-- 品种名称 -->
|
|
751
|
-
<div class="kline-header-item">黄金 au8888</div>
|
|
752
|
-
<!-- 周期展示 + 选择 -->
|
|
753
|
-
<div class="kline-header-item cycleSelect">
|
|
754
|
-
<span>{{ cycleName }}</span>
|
|
755
|
-
<el-select v-model="cycle" popper-class="element-dark" @change="cycleChange">
|
|
756
|
-
<el-option v-for="(item, index) in cycleOptions" :key="index" :label="item.label" :value="item.value" />
|
|
757
|
-
</el-select>
|
|
758
|
-
</div>
|
|
759
|
-
<!-- 指标展示 + 选择 -->
|
|
760
|
-
<div class="kline-header-item cycleSelect">
|
|
761
|
-
<span>{{ indicatorName }}</span>
|
|
762
|
-
<el-select v-model="indicatorName" popper-class="element-dark">
|
|
763
|
-
<el-option
|
|
764
|
-
v-for="(item, index) in mainIndicatorList"
|
|
765
|
-
:key="index"
|
|
766
|
-
:label="item.label"
|
|
767
|
-
:value="item.value"
|
|
768
|
-
/>
|
|
769
|
-
</el-select>
|
|
770
|
-
</div>
|
|
771
|
-
<!-- 开平/买卖展示 + 选择 -->
|
|
772
|
-
<div class="kline-header-item sellBuySelect">
|
|
773
|
-
<span>{{ sellBuyTypeName }}</span>
|
|
774
|
-
<el-select v-model="sellBuyType" popper-class="element-dark" @change="sellBuyTypeChange">
|
|
775
|
-
<el-option
|
|
776
|
-
v-for="(item, index) in sellBuyTypeOptions"
|
|
777
|
-
:key="index"
|
|
778
|
-
:label="item.label"
|
|
779
|
-
:value="item.value"
|
|
780
|
-
/>
|
|
781
|
-
</el-select>
|
|
782
|
-
</div>
|
|
783
|
-
<!-- 价差额外图表展示 + 选择 -->
|
|
784
|
-
<div class="kline-header-item sellBuySelect">
|
|
785
|
-
<span>{{ otherChart }}</span>
|
|
786
|
-
<el-select v-model="otherChart" popper-class="element-dark" @change="sellBuyTypeChange">
|
|
787
|
-
<el-option v-for="item in otherChartOptions" :key="item" :label="item" :value="item" />
|
|
788
|
-
</el-select>
|
|
789
|
-
</div>
|
|
790
|
-
</div>
|
|
791
|
-
<!-- K线本体 -->
|
|
792
|
-
<st-kline
|
|
793
|
-
v-if="!loading && klineData.length && !netWorkErrorMsg"
|
|
794
|
-
class="kline"
|
|
795
|
-
:indicator="indicator"
|
|
796
|
-
:klineData="klineData"
|
|
797
|
-
:markData="markData"
|
|
798
|
-
:lineData="lineData"
|
|
799
|
-
:brushRange="brushRange"
|
|
800
|
-
:netPositionData="netPositionData"
|
|
801
|
-
:relevanceData="relevanceData"
|
|
802
|
-
:priceTrendData="priceTrendData"
|
|
803
|
-
:priceTrendPercentData="priceTrendPercentData"
|
|
804
|
-
:defaultMenuData="defaultMenuData"
|
|
805
|
-
:isSelect="isSelect"
|
|
806
|
-
:config="config"
|
|
807
|
-
/>
|
|
808
|
-
<!-- 网络请求错误时 -->
|
|
809
|
-
<div v-if="netWorkErrorMsg" class="netWorkError">
|
|
810
|
-
<span>{{ netWorkErrorMsg }}</span>
|
|
811
|
-
<el-button @click="reFresh" :icon="RefreshRight">刷新</el-button>
|
|
812
|
-
</div>
|
|
813
|
-
<!-- 空数据时 -->
|
|
814
|
-
<div class="empty" v-else-if="!loading && klineData.length === 0">
|
|
815
|
-
<el-empty description="暂无数据" />
|
|
816
|
-
</div>
|
|
817
|
-
</div>
|
|
818
|
-
</div>
|
|
819
|
-
</template>
|
|
820
|
-
|
|
821
|
-
<style lang="scss" scoped>
|
|
822
|
-
#single-cycle-single-variety {
|
|
823
|
-
margin: auto;
|
|
824
|
-
width: 100%;
|
|
825
|
-
height: 100%;
|
|
826
|
-
.st-Kline {
|
|
827
|
-
height: 100%;
|
|
828
|
-
display: flex;
|
|
829
|
-
flex-direction: column;
|
|
830
|
-
border-radius: 2px;
|
|
831
|
-
box-sizing: border-box;
|
|
832
|
-
background-color: black;
|
|
833
|
-
color-scheme: dark;
|
|
834
|
-
--el-mask-color: rgba(0, 0, 0, 0.8);
|
|
835
|
-
.kline-header {
|
|
836
|
-
display: flex;
|
|
837
|
-
align-items: center;
|
|
838
|
-
color: white;
|
|
839
|
-
border-bottom: 1px solid rgb(153, 153, 153);
|
|
840
|
-
.kline-header-item {
|
|
841
|
-
display: flex;
|
|
842
|
-
align-items: center;
|
|
843
|
-
border-right: 1px solid rgb(153, 153, 153);
|
|
844
|
-
padding: 6px;
|
|
845
|
-
box-sizing: border-box;
|
|
846
|
-
}
|
|
847
|
-
// 功能区: 周期
|
|
848
|
-
.cycleSelect {
|
|
849
|
-
:deep(.el-select) {
|
|
850
|
-
margin-left: 6px;
|
|
851
|
-
width: 16px;
|
|
852
|
-
.el-input__wrapper {
|
|
853
|
-
height: 16px;
|
|
854
|
-
padding: 0;
|
|
855
|
-
border-radius: 50%;
|
|
856
|
-
background-color: #ccc;
|
|
857
|
-
}
|
|
858
|
-
.el-input__inner {
|
|
859
|
-
width: 0;
|
|
860
|
-
}
|
|
861
|
-
.el-select__icon {
|
|
862
|
-
color: black;
|
|
863
|
-
width: 16px;
|
|
864
|
-
height: 16px;
|
|
865
|
-
margin-left: 0;
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
}
|
|
869
|
-
// 功能区: 开平/买卖
|
|
870
|
-
.sellBuySelect {
|
|
871
|
-
:deep(.el-select) {
|
|
872
|
-
margin-left: 6px;
|
|
873
|
-
width: 16px;
|
|
874
|
-
.el-input__wrapper {
|
|
875
|
-
height: 16px;
|
|
876
|
-
padding: 0;
|
|
877
|
-
border-radius: 50%;
|
|
878
|
-
background-color: #ccc;
|
|
879
|
-
}
|
|
880
|
-
.el-input__inner {
|
|
881
|
-
width: 0;
|
|
882
|
-
}
|
|
883
|
-
.el-select__icon {
|
|
884
|
-
color: black;
|
|
885
|
-
width: 16px;
|
|
886
|
-
height: 16px;
|
|
887
|
-
margin-left: 0;
|
|
888
|
-
}
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
.kline {
|
|
893
|
-
flex: 1;
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
.netWorkError {
|
|
897
|
-
color: white;
|
|
898
|
-
font-weight: 600;
|
|
899
|
-
display: flex;
|
|
900
|
-
flex-direction: column;
|
|
901
|
-
align-items: center;
|
|
902
|
-
justify-content: center;
|
|
903
|
-
width: 100%;
|
|
904
|
-
height: 100%;
|
|
905
|
-
font-size: 24px;
|
|
906
|
-
.el-button {
|
|
907
|
-
margin-top: 10px;
|
|
908
|
-
background-color: rgb(0, 0, 0);
|
|
909
|
-
color: white;
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
.empty {
|
|
913
|
-
color: white;
|
|
914
|
-
font-weight: 600;
|
|
915
|
-
display: flex;
|
|
916
|
-
flex-direction: column;
|
|
917
|
-
align-items: center;
|
|
918
|
-
justify-content: center;
|
|
919
|
-
width: 100%;
|
|
920
|
-
height: 100%;
|
|
921
|
-
font-size: 24px;
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
</style>
|