新增T-1日开盘涨跌幅字段

This commit is contained in:
2026-05-07 17:26:37 +08:00
parent 844981a312
commit 9ea4b61ee3
2 changed files with 20 additions and 0 deletions
+3
View File
@@ -95,6 +95,7 @@ GET /api/v1/download/limit-board/second-board-profit-csv?tradeStartDate=2026-04-
| `name` | `string` | `股票简称` | 股票简称 | | `name` | `string` | `股票简称` | 股票简称 |
| `market` | `string` | `市场` | 市场信息 | | `market` | `string` | `市场` | 市场信息 |
| `industry` | `string` | `行业` | 所属行业 | | `industry` | `string` | `行业` | 所属行业 |
| `previous_open_pct_chg` | `number \| null` | `T-1日开盘涨跌幅%` | T-1 日开盘价相对 T-2 收盘价的涨跌幅百分比 |
| `open_pct_chg` | `number \| null` | `T日开盘涨跌幅%` | T 日开盘价相对 T-1 收盘价的涨跌幅百分比 | | `open_pct_chg` | `number \| null` | `T日开盘涨跌幅%` | T 日开盘价相对 T-1 收盘价的涨跌幅百分比 |
| `next_open_pct_chg` | `number \| null` | `T+1日开盘涨跌幅%` | T+1 日开盘价相对 T 日收盘价的涨跌幅百分比 | | `next_open_pct_chg` | `number \| null` | `T+1日开盘涨跌幅%` | T+1 日开盘价相对 T 日收盘价的涨跌幅百分比 |
| `next_open_profitable` | `string` | `T+1开盘是否盈利` | T+1 开盘收益大于 0 时为 `是`,否则为 `否`;无次日数据时为 `无次日数据` | | `next_open_profitable` | `string` | `T+1开盘是否盈利` | T+1 开盘收益大于 0 时为 `是`,否则为 `否`;无次日数据时为 `无次日数据` |
@@ -133,6 +134,7 @@ GET /api/v1/download/limit-board/second-board-profit-csv?tradeStartDate=2026-04-
"name": "示例股份", "name": "示例股份",
"market": "主板", "market": "主板",
"industry": "软件开发", "industry": "软件开发",
"previous_open_pct_chg": -1.25,
"open_pct_chg": 1.36, "open_pct_chg": 1.36,
"next_open_pct_chg": 2.38, "next_open_pct_chg": 2.38,
"next_open_profitable": "是", "next_open_profitable": "是",
@@ -166,6 +168,7 @@ CSV 字段顺序:
| `股票简称` | 股票简称 | | `股票简称` | 股票简称 |
| `市场` | 市场信息 | | `市场` | 市场信息 |
| `行业` | 所属行业 | | `行业` | 所属行业 |
| `T-1日开盘涨跌幅%` | T-1 日开盘价相对 T-2 收盘价的涨跌幅百分比 |
| `T日开盘涨跌幅%` | T 日开盘价相对 T-1 收盘价的涨跌幅百分比 | | `T日开盘涨跌幅%` | T 日开盘价相对 T-1 收盘价的涨跌幅百分比 |
| `T+1日开盘涨跌幅%` | T+1 日开盘价相对 T 日收盘价的涨跌幅百分比 | | `T+1日开盘涨跌幅%` | T+1 日开盘价相对 T 日收盘价的涨跌幅百分比 |
| `T+1开盘是否盈利` | T+1 开盘收益大于 0 时为 `是`,否则为 `否`;无次日数据时为 `无次日数据` | | `T+1开盘是否盈利` | T+1 开盘收益大于 0 时为 `是`,否则为 `否`;无次日数据时为 `无次日数据` |
@@ -28,6 +28,8 @@ type secondProfitCSVRow struct {
Name string `gorm:"column:name"` Name string `gorm:"column:name"`
Market string `gorm:"column:market"` Market string `gorm:"column:market"`
Industry string `gorm:"column:industry"` Industry string `gorm:"column:industry"`
PreviousOpen sql.NullFloat64 `gorm:"column:previous_open"`
PreviousTwoClose sql.NullFloat64 `gorm:"column:previous_two_close"`
Open sql.NullFloat64 `gorm:"column:open"` Open sql.NullFloat64 `gorm:"column:open"`
Close sql.NullFloat64 `gorm:"column:close_price"` Close sql.NullFloat64 `gorm:"column:close_price"`
LimitPrice float64 `gorm:"column:limit_price"` LimitPrice float64 `gorm:"column:limit_price"`
@@ -44,6 +46,7 @@ type secondProfitCSVRow struct {
NextLow sql.NullFloat64 `gorm:"column:next_low"` NextLow sql.NullFloat64 `gorm:"column:next_low"`
NextClose sql.NullFloat64 `gorm:"column:next_close"` NextClose sql.NullFloat64 `gorm:"column:next_close"`
OpenPreviousCloseRatio float64 OpenPreviousCloseRatio float64
PreviousOpenPctChg sql.NullFloat64
OpenPctChg sql.NullFloat64 OpenPctChg sql.NullFloat64
NextOpenReturnPct sql.NullFloat64 NextOpenReturnPct sql.NullFloat64
NextHighReturnPct sql.NullFloat64 NextHighReturnPct sql.NullFloat64
@@ -86,6 +89,7 @@ type secondProfitListItem struct {
Name string `json:"name"` Name string `json:"name"`
Market string `json:"market"` Market string `json:"market"`
Industry string `json:"industry"` Industry string `json:"industry"`
PreviousOpenPctChg *float64 `json:"previous_open_pct_chg"`
OpenPctChg *float64 `json:"open_pct_chg"` OpenPctChg *float64 `json:"open_pct_chg"`
NextOpenPctChg *float64 `json:"next_open_pct_chg"` NextOpenPctChg *float64 `json:"next_open_pct_chg"`
NextOpenProfitable string `json:"next_open_profitable"` NextOpenProfitable string `json:"next_open_profitable"`
@@ -323,6 +327,8 @@ SELECT
COALESCE(l.name, '') AS name, COALESCE(l.name, '') AS name,
COALESCE(l.market, '') AS market, COALESCE(l.market, '') AS market,
COALESCE(l.tushare_industry, '') AS industry, COALESCE(l.tushare_industry, '') AS industry,
pd.open AS previous_open,
COALESCE(pd.pre_close, ppd.close) AS previous_two_close,
d.open, d.open,
COALESCE(l.calc_close, l.tushare_close, d.close) AS close_price, COALESCE(l.calc_close, l.tushare_close, d.close) AS close_price,
COALESCE(l.calc_limit_price, 0) AS limit_price, COALESCE(l.calc_limit_price, 0) AS limit_price,
@@ -349,6 +355,8 @@ LEFT JOIN stock_daily d
ON l.ts_code = d.ts_code AND d.trade_date = l.trade_date ON l.ts_code = d.ts_code AND d.trade_date = l.trade_date
LEFT JOIN stock_daily pd LEFT JOIN stock_daily pd
ON l.ts_code = pd.ts_code AND pd.trade_date = c.previous_trade_date ON l.ts_code = pd.ts_code AND pd.trade_date = c.previous_trade_date
LEFT JOIN stock_daily ppd
ON l.ts_code = ppd.ts_code AND ppd.trade_date = c.previous_two_trade_date
LEFT JOIN stock_daily nd LEFT JOIN stock_daily nd
ON l.ts_code = nd.ts_code AND nd.trade_date = c.next_trade_date ON l.ts_code = nd.ts_code AND nd.trade_date = c.next_trade_date
WHERE c.trade_date BETWEEN ? AND ? WHERE c.trade_date BETWEEN ? AND ?
@@ -378,6 +386,12 @@ ORDER BY c.trade_date ASC, l.ts_code ASC`
Valid: true, Valid: true,
} }
} }
if row.PreviousOpen.Valid && row.PreviousTwoClose.Valid && row.PreviousTwoClose.Float64 > 0 {
row.PreviousOpenPctChg = sql.NullFloat64{
Float64: secondProfitRound2((row.PreviousOpen.Float64 - row.PreviousTwoClose.Float64) / row.PreviousTwoClose.Float64 * 100),
Valid: true,
}
}
if req.OpenPctChgRule.Enabled() && (!row.OpenPctChg.Valid || !req.OpenPctChgRule.Match(row.OpenPctChg.Float64)) { if req.OpenPctChgRule.Enabled() && (!row.OpenPctChg.Valid || !req.OpenPctChgRule.Match(row.OpenPctChg.Float64)) {
continue continue
} }
@@ -399,6 +413,7 @@ ORDER BY c.trade_date ASC, l.ts_code ASC`
func secondProfitCSVHeaders() []string { func secondProfitCSVHeaders() []string {
return []string{ return []string{
"交易日", "股票代码", "股票简称", "市场", "行业", "交易日", "股票代码", "股票简称", "市场", "行业",
"T-1日开盘涨跌幅%",
"T日开盘涨跌幅%", "T+1日开盘涨跌幅%", "T日开盘涨跌幅%", "T+1日开盘涨跌幅%",
"T+1开盘是否盈利", "T+1收盘是否盈利", "T+1盘中是否可盈利", "T+1开盘是否盈利", "T+1收盘是否盈利", "T+1盘中是否可盈利",
"T+1最高盈利%", "T+1最低盈利%", "开板次数", "换手率%", "T+1最高盈利%", "T+1最低盈利%", "开板次数", "换手率%",
@@ -413,6 +428,7 @@ func secondProfitCSVRecord(row secondProfitCSVRow) []string {
row.Name, row.Name,
row.Market, row.Market,
row.Industry, row.Industry,
secondProfitFormatNullFloat(row.PreviousOpenPctChg),
secondProfitFormatNullFloat(row.OpenPctChg), secondProfitFormatNullFloat(row.OpenPctChg),
secondProfitFormatNullFloat(row.NextOpenReturnPct), secondProfitFormatNullFloat(row.NextOpenReturnPct),
row.NextOpenProfitable, row.NextOpenProfitable,
@@ -435,6 +451,7 @@ func secondProfitBuildItem(row secondProfitCSVRow) secondProfitListItem {
Name: row.Name, Name: row.Name,
Market: row.Market, Market: row.Market,
Industry: row.Industry, Industry: row.Industry,
PreviousOpenPctChg: secondProfitNullFloatPtr(row.PreviousOpenPctChg),
OpenPctChg: secondProfitNullFloatPtr(row.OpenPctChg), OpenPctChg: secondProfitNullFloatPtr(row.OpenPctChg),
NextOpenPctChg: secondProfitNullFloatPtr(row.NextOpenReturnPct), NextOpenPctChg: secondProfitNullFloatPtr(row.NextOpenReturnPct),
NextOpenProfitable: row.NextOpenProfitable, NextOpenProfitable: row.NextOpenProfitable,