st-comp 0.0.169 → 0.0.171
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/KlineConfig.cjs +1 -1
- package/es/KlineConfig.js +312 -291
- package/es/KlinePlus.cjs +2 -2
- package/es/KlinePlus.js +499 -455
- package/es/style.css +1 -1
- package/lib/bundle.js +1 -1
- package/lib/bundle.umd.cjs +175 -175
- package/lib/{index-832c69a2.js → index-42745784.js} +9714 -9649
- package/lib/{python-bfb3b4c6.js → python-bea23b43.js} +1 -1
- package/lib/style.css +1 -1
- package/package.json +1 -1
- package/packages/KlineConfig/config.js +9 -5
- package/packages/KlineConfig/index.vue +48 -26
- package/packages/KlinePlus/components/SliderChart.vue +6 -1
- package/packages/KlinePlus/index.vue +49 -12
- package/packages/KlinePlus/utils.js +18 -1
package/package.json
CHANGED
|
@@ -25,11 +25,15 @@ export const getDefaultUserKlineConfig = () => {
|
|
|
25
25
|
/**
|
|
26
26
|
* @description: 功能配置
|
|
27
27
|
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
enable_tradeLogBrush: true, // 高亮交易范围
|
|
29
|
+
enable_showScreenTimeRange: true, // 展示当屏时间范围
|
|
30
|
+
enable_dbClickOpenSingel: true, // 多周期双击图表切换至单周期
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @description: 组件开关
|
|
34
|
+
*/
|
|
35
|
+
enable_subChart: true, // 是否启用副图
|
|
36
|
+
enable_sliderChart: true, // 是否启用拖拽轴
|
|
33
37
|
};
|
|
34
38
|
};
|
|
35
39
|
|
|
@@ -8,6 +8,9 @@ const { request } = inject("stConfig"); // 组件库全局配置
|
|
|
8
8
|
const emit = defineEmits("callBack");
|
|
9
9
|
const props = defineProps({
|
|
10
10
|
indicatorStore: { type: Object, default: () => ({}) }, // 指标配置Store
|
|
11
|
+
origin: { type: String, default: "server" }, // 数据来源: server服务器, local本地
|
|
12
|
+
// 如果server此项不用管, 如果local则使用此项
|
|
13
|
+
cycleOptions: { type: Array, default: () => [] },
|
|
11
14
|
});
|
|
12
15
|
|
|
13
16
|
const visible = ref(false);
|
|
@@ -23,25 +26,37 @@ const handleReset = () => {
|
|
|
23
26
|
// 配置: 保存配置
|
|
24
27
|
const handleSubmit = async () => {
|
|
25
28
|
const json = JSON.stringify(form);
|
|
26
|
-
|
|
29
|
+
if (props.origin === "server") {
|
|
30
|
+
await request.post("/common/qt/updateUserConfig", { appId: 1, json });
|
|
31
|
+
} else {
|
|
32
|
+
localStorage.setItem("userKlineConfig", json);
|
|
33
|
+
}
|
|
27
34
|
emit("callBack", json);
|
|
28
35
|
visible.value = false;
|
|
29
36
|
};
|
|
30
|
-
|
|
31
37
|
// 获取配置数据
|
|
32
38
|
const getKlineConfig = async () => {
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
if (props.origin === "server") {
|
|
40
|
+
const { body } = await request.post("/common/qt/getUserConfig", { appId: 1 });
|
|
41
|
+
Object.assign(form, getDefaultUserKlineConfig(), body ? JSON.parse(body) : {});
|
|
42
|
+
} else {
|
|
43
|
+
const body = localStorage.getItem("userKlineConfig");
|
|
44
|
+
Object.assign(form, getDefaultUserKlineConfig(), body ? JSON.parse(body) : {});
|
|
45
|
+
}
|
|
35
46
|
};
|
|
36
47
|
// 获取周期选项
|
|
37
48
|
const getCycleOptions = async () => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
49
|
+
if (props.origin === "server") {
|
|
50
|
+
const { body } = await request.post("/common/qt/getDict", { dictIds: [1002] });
|
|
51
|
+
cycleOptions.value = body[1002].map((item) => {
|
|
52
|
+
return {
|
|
53
|
+
label: item.dictName,
|
|
54
|
+
value: item.dictCode,
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
} else {
|
|
58
|
+
cycleOptions.value = props.cycleOptions;
|
|
59
|
+
}
|
|
45
60
|
};
|
|
46
61
|
|
|
47
62
|
onMounted(() => {
|
|
@@ -71,7 +86,7 @@ defineExpose({
|
|
|
71
86
|
<!-- 偏好设置 -->
|
|
72
87
|
<el-divider style="margin-top: 8px">偏好设置</el-divider>
|
|
73
88
|
<div class="setting-item">
|
|
74
|
-
<span class="label"
|
|
89
|
+
<span class="label">主图指标: </span>
|
|
75
90
|
<el-select
|
|
76
91
|
v-model="form.mainIndicator"
|
|
77
92
|
popper-class="element-dark"
|
|
@@ -85,7 +100,7 @@ defineExpose({
|
|
|
85
100
|
</el-select>
|
|
86
101
|
</div>
|
|
87
102
|
<div class="setting-item">
|
|
88
|
-
<span class="label"
|
|
103
|
+
<span class="label">交易点位: </span>
|
|
89
104
|
<el-select
|
|
90
105
|
v-model="form.sellBuy"
|
|
91
106
|
popper-class="element-dark"
|
|
@@ -99,7 +114,7 @@ defineExpose({
|
|
|
99
114
|
</el-select>
|
|
100
115
|
</div>
|
|
101
116
|
<div class="setting-item">
|
|
102
|
-
<span class="label"
|
|
117
|
+
<span class="label">单周期: </span>
|
|
103
118
|
<el-select
|
|
104
119
|
v-model="form.singelCycle"
|
|
105
120
|
popper-class="element-dark"
|
|
@@ -113,7 +128,7 @@ defineExpose({
|
|
|
113
128
|
</el-select>
|
|
114
129
|
</div>
|
|
115
130
|
<div class="setting-item">
|
|
116
|
-
<span class="label"
|
|
131
|
+
<span class="label">多周期: </span>
|
|
117
132
|
<el-segmented
|
|
118
133
|
size="small"
|
|
119
134
|
v-model="form.multiCycleNum"
|
|
@@ -147,7 +162,7 @@ defineExpose({
|
|
|
147
162
|
</template>
|
|
148
163
|
</div>
|
|
149
164
|
<div class="setting-item">
|
|
150
|
-
<span class="label"
|
|
165
|
+
<span class="label">默认展示: </span>
|
|
151
166
|
<el-segmented
|
|
152
167
|
size="small"
|
|
153
168
|
v-model="form.pageType"
|
|
@@ -161,24 +176,26 @@ defineExpose({
|
|
|
161
176
|
<!-- 功能配置 -->
|
|
162
177
|
<el-divider style="margin-top: 44px">功能配置</el-divider>
|
|
163
178
|
<div class="setting-item">
|
|
164
|
-
<span class="label"
|
|
165
|
-
<el-switch v-model="form.
|
|
179
|
+
<span class="label">高亮交易范围: </span>
|
|
180
|
+
<el-switch v-model="form.enable_tradeLogBrush" />
|
|
166
181
|
</div>
|
|
167
182
|
<div class="setting-item">
|
|
168
|
-
<span class="label"
|
|
169
|
-
<el-switch v-model="form.
|
|
183
|
+
<span class="label">展示当屏时间: </span>
|
|
184
|
+
<el-switch v-model="form.enable_showScreenTimeRange" />
|
|
170
185
|
</div>
|
|
171
186
|
<div class="setting-item">
|
|
172
|
-
<span class="label"
|
|
173
|
-
<el-switch v-model="form.
|
|
187
|
+
<span class="label">多周期双击图表切换至单周期: </span>
|
|
188
|
+
<el-switch v-model="form.enable_dbClickOpenSingel" />
|
|
174
189
|
</div>
|
|
190
|
+
<!-- 组件开关 -->
|
|
191
|
+
<el-divider style="margin-top: 44px">组件开关</el-divider>
|
|
175
192
|
<div class="setting-item">
|
|
176
|
-
<span class="label"
|
|
177
|
-
<el-switch v-model="form.
|
|
193
|
+
<span class="label">开启副图: </span>
|
|
194
|
+
<el-switch v-model="form.enable_subChart" />
|
|
178
195
|
</div>
|
|
179
196
|
<div class="setting-item">
|
|
180
|
-
<span class="label"
|
|
181
|
-
<el-switch v-model="form.
|
|
197
|
+
<span class="label">开启拖拽轴: </span>
|
|
198
|
+
<el-switch v-model="form.enable_sliderChart" />
|
|
182
199
|
</div>
|
|
183
200
|
</el-scrollbar>
|
|
184
201
|
<div class="setting-footer">
|
|
@@ -226,6 +243,11 @@ defineExpose({
|
|
|
226
243
|
align-items: center;
|
|
227
244
|
justify-content: space-between;
|
|
228
245
|
margin-bottom: 8px;
|
|
246
|
+
.label {
|
|
247
|
+
display: flex;
|
|
248
|
+
align-items: center;
|
|
249
|
+
gap: 4px;
|
|
250
|
+
}
|
|
229
251
|
.el-select {
|
|
230
252
|
width: 130px;
|
|
231
253
|
}
|
|
@@ -22,6 +22,10 @@ const props = defineProps({
|
|
|
22
22
|
rightType: { type: Number, required: true },
|
|
23
23
|
// 常用选项 [期货]
|
|
24
24
|
klineType: { type: Number, required: true },
|
|
25
|
+
|
|
26
|
+
// 业务系统相关
|
|
27
|
+
deleteFirstNumber: { type: Number, default: 1 }, // 绩效标记
|
|
28
|
+
withoutPermission: { type: Number, default: 0 }, // 三方标记(不需要token授权)
|
|
25
29
|
});
|
|
26
30
|
const klineData = ref({
|
|
27
31
|
data: [], // <[开 收 低 高 成交额 涨跌值 涨跌百分比]>
|
|
@@ -37,7 +41,8 @@ const getData = async () => {
|
|
|
37
41
|
cycle: "6",
|
|
38
42
|
startTime: "1999-01-01 00:00:00",
|
|
39
43
|
endTime: dayjs().format("YYYY-MM-DD 23:59:59"),
|
|
40
|
-
deleteFirstNumber:
|
|
44
|
+
deleteFirstNumber: props.deleteFirstNumber,
|
|
45
|
+
withoutPermission: props.withoutPermission,
|
|
41
46
|
};
|
|
42
47
|
// 参数加工
|
|
43
48
|
switch (props.varietyStock) {
|
|
@@ -4,7 +4,17 @@ import dayjs from "dayjs";
|
|
|
4
4
|
import * as echarts from "echarts";
|
|
5
5
|
import { stMath, debounce, addResizeListener } from "st-func";
|
|
6
6
|
import { ref, watch, computed, onMounted, onUnmounted, inject } from "vue";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
loadKlineConfig,
|
|
9
|
+
checkTimeInterval,
|
|
10
|
+
getSubOptions,
|
|
11
|
+
mergeklineData,
|
|
12
|
+
handleMarkPointTradeLog,
|
|
13
|
+
handleNetPositionLine,
|
|
14
|
+
handleTradeIncomeRateLine,
|
|
15
|
+
handleMarkPointOffset,
|
|
16
|
+
normalizeToKlineTimeByMatch,
|
|
17
|
+
} from "./utils.js";
|
|
8
18
|
import Tips from "./components/Tips.vue";
|
|
9
19
|
import SliderChart from "./components/SliderChart.vue";
|
|
10
20
|
|
|
@@ -23,20 +33,25 @@ const props = defineProps({
|
|
|
23
33
|
// 交互选项
|
|
24
34
|
cycle: { type: String, required: true },
|
|
25
35
|
sellBuy: { type: Number, default: 1 },
|
|
26
|
-
rightType: { type: Number, default: null },
|
|
27
|
-
klineType: { type: Number, default: null },
|
|
36
|
+
rightType: { type: Number, default: null }, // 复权类型
|
|
37
|
+
klineType: { type: Number, default: null }, // 合约类型
|
|
38
|
+
incomeType: { type: Number, default: 0 }, // 收益计算类型 0-单利, 1-复利
|
|
28
39
|
initTimeRange: { type: Array, required: true },
|
|
29
40
|
mainIndicator: { type: String, required: true },
|
|
30
41
|
|
|
31
|
-
//
|
|
42
|
+
// 绘制数据
|
|
32
43
|
tradeLog: { type: Array, default: () => [] }, // 成交数据
|
|
33
|
-
// 绘制数据: 净值
|
|
34
44
|
netPositionData: { type: Array, default: () => [] }, // 净值数据
|
|
45
|
+
tradeIncomeRateData: { type: Array, default: () => [] }, // 成交收益率数据
|
|
35
46
|
|
|
36
|
-
//
|
|
47
|
+
// 强制定位高亮(非必填)
|
|
37
48
|
positionTime: { type: [String, null], default: null },
|
|
38
|
-
//
|
|
49
|
+
// 同步刷选范围(非必填)
|
|
39
50
|
syncBrushRange: { type: Object, default: () => ({ cycleList: [], startTime: null, endTime: null }) },
|
|
51
|
+
|
|
52
|
+
// 业务系统相关
|
|
53
|
+
deleteFirstNumber: { type: Number, default: 1 }, // 绩效标记
|
|
54
|
+
withoutPermission: { type: Number, default: 0 }, // 三方标记(不需要token授权)
|
|
40
55
|
});
|
|
41
56
|
|
|
42
57
|
// 加载标记
|
|
@@ -174,7 +189,8 @@ const getMainData = async ({ startTime, endTime }) => {
|
|
|
174
189
|
contractType: props.varietyStock ? null : props.klineType, // 合约类型
|
|
175
190
|
mainIndicatorList: props.indicatorStore.getIndicatorParams(props.mainIndicator),
|
|
176
191
|
subIndicator: subIndicator.value,
|
|
177
|
-
deleteFirstNumber:
|
|
192
|
+
deleteFirstNumber: props.deleteFirstNumber,
|
|
193
|
+
withoutPermission: props.withoutPermission,
|
|
178
194
|
};
|
|
179
195
|
// Echarts如果一屏如果正好展示了所有数据, 是无法缩放触发加载更多的
|
|
180
196
|
// 所以在请求中需要对开始和结束时间进行延伸, 但是首屏的展示时间定位还是会以传入的开始结束时间为准
|
|
@@ -238,7 +254,8 @@ const getMoreData = async (type) => {
|
|
|
238
254
|
limit: loadAddCount,
|
|
239
255
|
mainIndicatorList: props.indicatorStore.getIndicatorParams(props.mainIndicator),
|
|
240
256
|
subIndicator: subIndicator.value,
|
|
241
|
-
deleteFirstNumber:
|
|
257
|
+
deleteFirstNumber: props.deleteFirstNumber,
|
|
258
|
+
withoutPermission: props.withoutPermission,
|
|
242
259
|
};
|
|
243
260
|
const { body } = await request.post("/middleLayer/kline/getKline", params);
|
|
244
261
|
// 合并数据
|
|
@@ -260,9 +277,10 @@ const getMoreData = async (type) => {
|
|
|
260
277
|
contractType: props.varietyStock ? null : props.klineType, // 合约类型
|
|
261
278
|
startTime: klineData.value.time[klineData.value.time.length - 1], // 开始时间
|
|
262
279
|
limit: loadAddCount, // 查询K线数量
|
|
263
|
-
deleteFirstNumber: 1, // >> 重要: 绩效后端特殊要求传参 <<
|
|
264
280
|
mainIndicatorList: props.indicatorStore.getIndicatorParams(props.mainIndicator),
|
|
265
281
|
subIndicator: subIndicator.value,
|
|
282
|
+
deleteFirstNumber: props.deleteFirstNumber,
|
|
283
|
+
withoutPermission: props.withoutPermission,
|
|
266
284
|
};
|
|
267
285
|
const { body } = await request.post("/middleLayer/kline/getKline", params);
|
|
268
286
|
// 合并数据
|
|
@@ -328,6 +346,8 @@ const draw = (params = { startValue: 0, endValue: 0 }) => {
|
|
|
328
346
|
});
|
|
329
347
|
// 配置数据: 净值曲线
|
|
330
348
|
const { netPositionLineData } = handleNetPositionLine(props.netPositionData, props.cycle);
|
|
349
|
+
// 配置数据: 成交收益率曲线
|
|
350
|
+
const { tradeIncomeRateLineData } = handleTradeIncomeRateLine(props.tradeIncomeRateData, props.cycle, props.incomeType, time);
|
|
331
351
|
// 配置数据: 成交点位 + 连线
|
|
332
352
|
const { tradePointData, tradeLineData } = handleMarkPointTradeLog(props.tradeLog, props.cycle, props.sellBuy, time, data);
|
|
333
353
|
|
|
@@ -520,6 +540,21 @@ const draw = (params = { startValue: 0, endValue: 0 }) => {
|
|
|
520
540
|
width: 2,
|
|
521
541
|
},
|
|
522
542
|
},
|
|
543
|
+
// 交易收益率曲线
|
|
544
|
+
{
|
|
545
|
+
type: "line",
|
|
546
|
+
name: "tradeIncomeRate",
|
|
547
|
+
data: tradeIncomeRateLineData,
|
|
548
|
+
symbol: "none",
|
|
549
|
+
yAxisIndex: 1,
|
|
550
|
+
connectNulls: false,
|
|
551
|
+
itemStyle: {
|
|
552
|
+
color: "#666666",
|
|
553
|
+
},
|
|
554
|
+
lineStyle: {
|
|
555
|
+
width: 2,
|
|
556
|
+
},
|
|
557
|
+
},
|
|
523
558
|
],
|
|
524
559
|
toolbox: {
|
|
525
560
|
show: false,
|
|
@@ -719,9 +754,9 @@ watch(
|
|
|
719
754
|
},
|
|
720
755
|
{ deep: true }
|
|
721
756
|
);
|
|
722
|
-
// 监控: [成交点类型, 成交数据,
|
|
757
|
+
// 监控: [成交点类型, 成交数据, 净值数据, 收益计算类型, 成交收益率数据] => 重绘K线 (缩放不变)
|
|
723
758
|
watch(
|
|
724
|
-
() => [props.sellBuy, props.tradeLog, props.netPositionData],
|
|
759
|
+
() => [props.sellBuy, props.tradeLog, props.netPositionData, props.incomeType, props.tradeIncomeRateData],
|
|
725
760
|
() => {
|
|
726
761
|
const { startValue, endValue } = mainChartIns.getOption()?.dataZoom[0] ?? {};
|
|
727
762
|
draw({ startValue, endValue });
|
|
@@ -812,6 +847,8 @@ defineExpose({
|
|
|
812
847
|
:varietyStock="varietyStock"
|
|
813
848
|
:rightType="rightType"
|
|
814
849
|
:klineType="klineType"
|
|
850
|
+
:deleteFirstNumber="props.deleteFirstNumber"
|
|
851
|
+
:withoutPermission="props.withoutPermission"
|
|
815
852
|
@change="handleSliderChange"
|
|
816
853
|
/>
|
|
817
854
|
</div>
|
|
@@ -719,7 +719,7 @@ export const handleMarkPointTradeLog = (tradeLog, cycle, sellBuy, klineTimeArray
|
|
|
719
719
|
};
|
|
720
720
|
};
|
|
721
721
|
|
|
722
|
-
// 生成图表配置所需数据: 净值曲线
|
|
722
|
+
// 生成图表配置所需数据: 净值曲线 (周, 月不展示)
|
|
723
723
|
export const handleNetPositionLine = (netPositionData, cycle) => {
|
|
724
724
|
let netPositionLineData = [];
|
|
725
725
|
// 分钟线: 时间格式化
|
|
@@ -743,3 +743,20 @@ export const handleNetPositionLine = (netPositionData, cycle) => {
|
|
|
743
743
|
}
|
|
744
744
|
return { netPositionLineData };
|
|
745
745
|
};
|
|
746
|
+
|
|
747
|
+
// 生成图表配置所需数据: 成交收益率曲线 (仅在日, 周, 月展示)
|
|
748
|
+
export const handleTradeIncomeRateLine = (tradeIncomeRateData, cycle, incomeType, klineTimeArray) => {
|
|
749
|
+
let tradeIncomeRateLineData = [];
|
|
750
|
+
if (["6", "7", "8"].includes(cycle)) {
|
|
751
|
+
const data = tradeIncomeRateData.reduce((result, item) => {
|
|
752
|
+
const key = normalizeToKlineTime(klineTimeArray, item.date, cycle);
|
|
753
|
+
const value = item[incomeType === 0 ? "simple" : "compound"];
|
|
754
|
+
result.set(key, value);
|
|
755
|
+
return result;
|
|
756
|
+
}, new Map());
|
|
757
|
+
tradeIncomeRateLineData = Array.from(data, ([key, value]) => [key, value]);
|
|
758
|
+
} else {
|
|
759
|
+
tradeIncomeRateLineData = [];
|
|
760
|
+
}
|
|
761
|
+
return { tradeIncomeRateLineData };
|
|
762
|
+
};
|