Repository navigation
Expand file tree
/
Copy pathdiff.txt
More file actions
132 lines (120 loc) · 15.2 KB
/
Copy pathdiff.txt
File metadata and controls
132 lines (120 loc) · 15.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
diff --git a/frontend/src/components/stock.vue b/frontend/src/components/stock.vue
index 31dc2b0..5f9e7cf 100644
--- a/frontend/src/components/stock.vue
+++ b/frontend/src/components/stock.vue
@@ -19,6 +19,7 @@ import {
GetPromptTemplates,
GetStockKLine,
GetStockList,
+ GetStockHistoryMoneyData,
GetStockMinuteMoneyFlowData,
GetStockMinutePriceLineData,
GetStockMoneyTrendByDay,
@@ -1788,11 +1789,12 @@ async function showMarkdownExport(stockItem) {
// 骞惰鑾峰彇鏁版嵁
// K绾胯幏鍙?20澶?90+30)锛岀‘淇?0澶╁唴姣忓ぉ閮借兘璁$畻MA30
const kLineDays = is90DayMode ? 120 : 90
- const [minuteData, kLineData, moneyData, minuteMoneyFlowData] = await Promise.all([
+ const [minuteData, kLineData, moneyData, minuteMoneyFlowData, historyMoneyData] = await Promise.all([
GetStockMinutePriceLineData(code, name),
GetStockKLine(code, name, kLineDays),
GetStockMoneyTrendByDay(code, moneyDays),
- GetStockMinuteMoneyFlowData(code)
+ GetStockMinuteMoneyFlowData(code),
+ GetStockHistoryMoneyData(code)
])
// 浠?followList 鑾峰彇鎴愭湰淇℃伅
@@ -1813,7 +1815,7 @@ async function showMarkdownExport(stockItem) {
}
// 鐢熸垚Markdown
- markdownContent.value = generateMarkdownReport(stockItem, minuteData, kLineData, moneyData, minuteInterval.value, costInfo, true, minuteMoneyFlowData, summarizeEnabled.value)
+ markdownContent.value = generateMarkdownReport(stockItem, minuteData, kLineData, moneyData, historyMoneyData, minuteInterval.value, costInfo, true, minuteMoneyFlowData, summarizeEnabled.value)
} catch (error) {
message.error('鑾峰彇鏁版嵁澶辫触: ' + error)
} finally {
@@ -1846,7 +1848,7 @@ const currentStockItem = ref(null)
// (This requires updating showMarkdownExport above, adding `currentStockItem.value = stockItem`)
-function generateMarkdownReport(stockItem, minuteData, kLineData, moneyData, interval = 5, costInfo = null, includeKLine = true, minuteMoneyFlowData = null, summarize = false) {
+function generateMarkdownReport(stockItem, minuteData, kLineData, moneyData, historyMoneyData = null, interval = 5, costInfo = null, includeKLine = true, minuteMoneyFlowData = null, summarize = false) {
const code = stockItem['鑲$エ浠g爜']
const name = stockItem['鑲$エ鍚嶇О']
const now = new Date()
@@ -2383,6 +2385,16 @@ function generateMarkdownReport(stockItem, minuteData, kLineData, moneyData, int
}
}
}
+
+ const historyMoneyMap = {}
+ if (historyMoneyData && historyMoneyData.length > 0) {
+ for (const item of historyMoneyData) {
+ const tradeDate = item.date ?? item.Date
+ if (tradeDate) {
+ historyMoneyMap[tradeDate] = item
+ }
+ }
+ }
// 璁$畻MA鍧囩嚎鐨勮緟鍔╁嚱鏁? function calculateMA(data, index, period) {
@@ -2561,8 +2573,8 @@ function generateMarkdownReport(stockItem, minuteData, kLineData, moneyData, int
// 浠巗tockItem鑾峰彇浠婃棩瀹炴椂鍐呭鐩橈紙濡傛灉鏈夌殑璇濓紝鑵捐鎺ュ彛瀵瑰簲鏌愪簺瀛楁锛岀敱浜庡墠闈㈠垎鏋愪娇鐢ㄧ殑鏄笢璐PI锛屽湪stockinfo閲屽彲鑳芥病鏈夌洿鎺ュ唴鐩樺鐩樼殑鏁版嵁锛岄櫎闈炴垜浠妸f49/f50瀛樺叆stockItem銆傛牴鎹畇tockinfo缁撴瀯鐩墠娌℃湁鍗曠嫭鎻愬彇杩欎咯瀛楁锛屾墍浠ュ湪鏃ョ嚎涓彧鑳芥殏鏃跺彇涓嶅埌鍏ㄦ斁 -锛? // 涓轰簡绠€鍖栧鐞嗭紝濡傛灉鑳借幏鍙栧垯鏀惧叆锛屽惁鍒欑疆绌?
- md += `| 鏃ユ湡 | 寮€鐩?| 鏀剁洏 | 鏈€楂?| 鏈€浣?| 娑ㄨ穼骞?| 鎴愪氦閲?涓? | 鎹㈡墜鐜?%) | MA5 | MA10 | MA20 | MA30 | DIF | DEA | MACD | RSI6 | RSI14 | K | D | J | 鍑€娴佸叆(涓? | 涓诲姏鍑€娴佸叆(涓? |\n`
- md += `|------|------|------|------|------|--------|------------|-----------|-----|------|------|------|-----|-----|------|------|-------|---|---|---|------------|----------------|\n`
+ md += `| 鏃ユ湡 | 寮€鐩?| 鏀剁洏 | 鏈€楂?| 鏈€浣?| 娑ㄨ穼骞?| 鎴愪氦閲?涓? | 鎹㈡墜鐜?%) | MA5 | MA10 | MA20 | MA30 | DIF | DEA | MACD | RSI6 | RSI14 | K | D | J | 鍑€娴佸叆(涓? | 涓诲姏鍑€娴佸叆(涓? | 澶у崟鍑€閲?%) |\n`
+ md += `|------|------|------|------|------|--------|------------|-----------|-----|------|------|------|-----|-----|------|------|-------|---|---|---|------------|----------------|-------------|\n`
for (let i = 0; i < recentK.length; i++) {
const k = recentK[i]
@@ -2583,6 +2595,12 @@ function generateMarkdownReport(stockItem, minuteData, kLineData, moneyData, int
const moneyInfo = moneyMap[k.day] || {}
const netAmount = moneyInfo.netamount ? (moneyInfo.netamount / 10000).toFixed(2) : '-'
const r0Net = moneyInfo.r0_net ? (moneyInfo.r0_net / 10000).toFixed(2) : '-'
+ const historyMoneyInfo = historyMoneyMap[k.day] || {}
+ const largeOrderRatio = Number(historyMoneyInfo.f75 ?? historyMoneyInfo.F75)
+ const superLargeOrderRatio = Number(historyMoneyInfo.f69 ?? historyMoneyInfo.F69)
+ const bigOrderNetPct = Number.isFinite(largeOrderRatio) && Number.isFinite(superLargeOrderRatio)
+ ? (largeOrderRatio + superLargeOrderRatio).toFixed(2)
+ : '-'
// 鎹㈡墜鐜? Sina/Tencent API 鏁版嵁璁$畻
// stockItem 娴侀€氬競鍊?circulatingMarketValue)鍗曚綅涓轰嚎鍏冿紝k.volume鍗曚綅涓烘墜
@@ -2615,7 +2633,7 @@ function generateMarkdownReport(stockItem, minuteData, kLineData, moneyData, int
// 浠ュ悗濡傞渶绮剧‘鍐欏叆锛屽彲鍦℅etStockCodeRealTimeData涓В鏋恌49/f50
}
- md += `| ${k.day} | ${k.open} | ${k.close} | ${k.high} | ${k.low} | ${changePercent}% | ${volume} | ${turnover === '-' ? '-' : turnover + '%'} | ${ma5} | ${ma10} | ${ma20} | ${ma30} | ${macdItem.dif} | ${macdItem.dea} | ${macdItem.macd} | ${rsi6Item.rsi} | ${rsi14Item.rsi} | ${kdjItem.k} | ${kdjItem.d} | ${kdjItem.j} | ${netAmount} | ${r0Net} |\n`
+ md += `| ${k.day} | ${k.open} | ${k.close} | ${k.high} | ${k.low} | ${changePercent}% | ${volume} | ${turnover === '-' ? '-' : turnover + '%'} | ${ma5} | ${ma10} | ${ma20} | ${ma30} | ${macdItem.dif} | ${macdItem.dea} | ${macdItem.macd} | ${rsi6Item.rsi} | ${rsi14Item.rsi} | ${kdjItem.k} | ${kdjItem.d} | ${kdjItem.j} | ${netAmount} | ${r0Net} | ${bigOrderNetPct === '-' ? '-' : bigOrderNetPct + '%'} |\n`
}
md += `\n`
} else {
@@ -2686,11 +2704,12 @@ async function showBatchMarkdownExport() {
batchExportProgress.value = `姝e湪瀵煎嚭 ${completed + 1}/${stockItems.length}: ${name} ...`
try {
- const [minuteData, kLineData, moneyData, minuteMoneyFlowData] = await Promise.all([
+ const [minuteData, kLineData, moneyData, minuteMoneyFlowData, historyMoneyData] = await Promise.all([
GetStockMinutePriceLineData(code, name),
GetStockKLine(code, name, kLineDays),
GetStockMoneyTrendByDay(code, moneyDays),
- GetStockMinuteMoneyFlowData(code)
+ GetStockMinuteMoneyFlowData(code),
+ GetStockHistoryMoneyData(code)
])
const stockInfo = followList.value.find(item => item.StockCode === code)
@@ -2709,7 +2728,7 @@ async function showBatchMarkdownExport() {
}
}
- batchCachedData.value.push({ stockItem, minuteData, kLineData, moneyData, minuteMoneyFlowData, costInfo })
+ batchCachedData.value.push({ stockItem, minuteData, kLineData, moneyData, minuteMoneyFlowData, historyMoneyData, costInfo })
} catch (error) {
batchCachedData.value.push({ stockItem, error: String(error) })
}
@@ -2746,7 +2765,7 @@ function regenerateBatchReport() {
allMd += `# ${name} (${code})\n\n> 鏁版嵁鑾峰彇澶辫触: ${cached.error}\n\n---\n\n`
} else {
allMd += generateMarkdownReport(
- cached.stockItem, cached.minuteData, cached.kLineData, cached.moneyData,
+ cached.stockItem, cached.minuteData, cached.kLineData, cached.moneyData, cached.historyMoneyData,
minuteInterval.value, cached.costInfo, batchIncludeKLine.value, cached.minuteMoneyFlowData, summarizeEnabled.value
)
allMd += `\n---\n\n`
@@ -3870,4 +3889,4 @@ function searchStockReport(stockCode) {
filter: grayscale(1) saturate(0) contrast(1.05);
}
-</style>
\ No newline at end of file
+</style>