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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "st-comp",
3
3
  "public": true,
4
- "version": "0.0.169",
4
+ "version": "0.0.171",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -25,11 +25,15 @@ export const getDefaultUserKlineConfig = () => {
25
25
  /**
26
26
  * @description: 功能配置
27
27
  */
28
- enable_subChart: true, // 是否启用副图
29
- enable_sliderChart: true, // 是否启用拖拽轴
30
- enable_tradeLogBrush: true, // 是否开启交易范围高亮
31
- enable_dbClickOpenSingel: true, // 是否开启双击打开单周期
32
- enable_showScreenTimeRange: true, // 是否开启显示K线当屏时间范围
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
- await request.post("/common/qt/updateUserConfig", { appId: 1, json });
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
- const { body } = await request.post("/common/qt/getUserConfig", { appId: 1 });
34
- Object.assign(form, getDefaultUserKlineConfig(), body ? JSON.parse(body) : {});
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
- const { body } = await request.post("/common/qt/getDict", { dictIds: [1002] });
39
- cycleOptions.value = body[1002].map((item) => {
40
- return {
41
- label: item.dictName,
42
- value: item.dictCode,
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">默认主图指标: </span>
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">成交点显示模式: </span>
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">单周期默认展示: </span>
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">多周期默认展示: </span>
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">默认展示模块: </span>
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">启用副图: </span>
165
- <el-switch v-model="form.enable_subChart" />
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">启用拖拽轴: </span>
169
- <el-switch v-model="form.enable_sliderChart" />
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">交易范围高亮: </span>
173
- <el-switch v-model="form.enable_tradeLogBrush" />
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">双击跳转单周期: </span>
177
- <el-switch v-model="form.enable_dbClickOpenSingel" />
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">显示K线当屏时间范围: </span>
181
- <el-switch v-model="form.enable_showScreenTimeRange" />
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: 1, // 后端要求标识
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 { loadKlineConfig, checkTimeInterval, getSubOptions, mergeklineData, handleMarkPointTradeLog, handleNetPositionLine, handleMarkPointOffset, normalizeToKlineTimeByMatch } from "./utils.js";
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: 1, // >> 重要: 绩效后端特殊要求传参 <<
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: 1,
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
- // 监控: [成交点类型, 成交数据, 净值数据] => 重绘K线 (缩放不变)
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
+ };