trade_analysis.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. package trade_analysis
  2. import (
  3. "eta/eta_api/global"
  4. "eta/eta_api/utils"
  5. "fmt"
  6. "github.com/beego/beego/v2/client/orm"
  7. "strings"
  8. "time"
  9. )
  10. const (
  11. TradeDataTypeNull = 0 // 无值
  12. TradeDataTypeOrigin = 1 // 原始值
  13. TradeDataTypeCalculate = 2 // 推算值
  14. WarehouseBuyChartType = 1 // 多单图
  15. WarehouseSoldChartType = 2 // 空单图
  16. WarehousePureBuyChartType = 3 // 净多单图
  17. WarehouseDefaultUnit = "手"
  18. WarehouseDefaultFrequency = "日度"
  19. GuangZhouTopCompanyAliasName = "日成交持仓排名" // 广期所TOP20对应的公司名称
  20. GuangZhouSeatNameBuy = "持买单量" // 广期所指标名称中的多单名称
  21. GuangZhouSeatNameSold = "持卖单量" // 广期所指标名称中的空单名称
  22. GuangZhouTopSeatNameBuy = "持买单量总计" // 广期所指标名称中的TOP20多单名称
  23. GuangZhouTopSeatNameSold = "持卖单量总计" // 广期所指标名称中的TOP20空单名称
  24. GuangZhouTopSeatNameDeal = "成交量总计" // 广期所指标名称中的TOP20成交量名称
  25. )
  26. const (
  27. TradeExchangeDalian = "dalian"
  28. TradeExchangeZhengzhou = "zhengzhou"
  29. TradeExchangeGuangzhou = "guangzhou"
  30. )
  31. var WarehouseTypeSuffixNames = map[int]string{
  32. WarehouseBuyChartType: "席位多单",
  33. WarehouseSoldChartType: "席位空单",
  34. WarehousePureBuyChartType: "席位净多单",
  35. }
  36. // GuangzhouSeatNameValType 广期所数据名称对应的席位方向
  37. var GuangzhouSeatNameValType = map[string]int{
  38. GuangZhouSeatNameBuy: 1,
  39. GuangZhouSeatNameSold: 2,
  40. GuangZhouTopSeatNameBuy: 1,
  41. GuangZhouTopSeatNameSold: 2,
  42. GuangZhouTopSeatNameDeal: 3,
  43. }
  44. // 合约查询方式
  45. var (
  46. ContractQueryTypeTop = 1 // 主力合约
  47. ContractQueryTypeTop2 = 2 // 成交量前2
  48. ContractQueryTypeTop3 = 3 // 成交量前3
  49. ContractQueryTypeAll = 4 // 所有合约(多个)
  50. ContractQueryTypeTotal = 5 // 合约加总(1个)
  51. )
  52. // 合约方向
  53. var (
  54. ContractPositionBuy = 1 // 多单
  55. ContractPositionSold = 2 // 空单
  56. ContractPositionPureBuy = 3 // 净多单
  57. )
  58. // TradePositionTop 持仓榜单
  59. type TradePositionTop struct {
  60. Id uint64 `gorm:"primaryKey;column:id" json:"id"`
  61. ClassifyName string `gorm:"column:classify_name" json:"classify_name"` //分类名称
  62. ClassifyType string `gorm:"column:classify_type" json:"classify_type"` //分类名称下的类型
  63. DealShortName string `gorm:"column:deal_short_name" json:"deal_short_name"` //成交量公司简称
  64. DealValue int `gorm:"column:deal_value" json:"deal_value"` //成交量
  65. DealChange int `gorm:"column:deal_change" json:"deal_change"` //成交变化量
  66. DataTime time.Time `gorm:"column:data_time" json:"data_time"` //数据日期
  67. CreateTime time.Time `gorm:"column:create_time" json:"create_time"` //插入时间
  68. ModifyTime time.Time `gorm:"column:modify_time" json:"modify_time"` //修改时间
  69. DealType int `gorm:"column:deal_type" json:"deal_type"` //交易类型:1多单,2空单,3净多单,4净空单
  70. SourceType int `gorm:"column:source_type" json:"source_type"` //数据来源,0是原始数据的值,1是由T+1日推算出的值,2是由T日的榜单数据推算出的值
  71. Rank int `gorm:"column:rank" json:"rank"` //排名
  72. }
  73. type TradeClassifyNameList struct {
  74. Exchange string `description:"交易所"`
  75. ExchangeEn string `description:"交易所英文"`
  76. Sort int `description:"排序字段" `
  77. Num int `description:"品种数量"`
  78. DataTime string `description:"最新更新时间"`
  79. CurrDate string `description:"当前日期"`
  80. Items []TradeClassifyNameListItem `description:"子类"`
  81. }
  82. type TradeClassifyNameListSort []TradeClassifyNameList
  83. func (v TradeClassifyNameListSort) Len() int {
  84. return len(v)
  85. }
  86. func (v TradeClassifyNameListSort) Swap(i, j int) {
  87. v[i], v[j] = v[j], v[i]
  88. }
  89. func (v TradeClassifyNameListSort) Less(i, j int) bool {
  90. return v[i].Sort < v[j].Sort
  91. }
  92. type TradeClassifyNameListItemSort []TradeClassifyNameListItem
  93. func (v TradeClassifyNameListItemSort) Len() int {
  94. return len(v)
  95. }
  96. func (v TradeClassifyNameListItemSort) Swap(i, j int) {
  97. v[i], v[j] = v[j], v[i]
  98. }
  99. func (v TradeClassifyNameListItemSort) Less(i, j int) bool {
  100. return v[i].ClassifyName < v[j].ClassifyName
  101. }
  102. type TradeClassifyNameListItem struct {
  103. ClassifyName string `description:"交易分类"`
  104. Items []TradeClassifyNameListItemItem `description:"合约代码"`
  105. }
  106. type TradeClassifyNameListItemItemSort []TradeClassifyNameListItemItem
  107. func (v TradeClassifyNameListItemItemSort) Len() int {
  108. return len(v)
  109. }
  110. func (v TradeClassifyNameListItemItemSort) Swap(i, j int) {
  111. v[i], v[j] = v[j], v[i]
  112. }
  113. func (v TradeClassifyNameListItemItemSort) Less(i, j int) bool {
  114. return v[i].ClassifyType < v[j].ClassifyType
  115. }
  116. type TradeClassifyNameListItemItem struct {
  117. ClassifyType string `description:"分类名称下的类型"`
  118. }
  119. type TradeClassifyName struct {
  120. ClassifyName string //分类名称
  121. ClassifyType string //分类名称下的类型
  122. LatestDate string //分类下最晚日期
  123. }
  124. // GetExchangeClassify 获取交易所分类列表
  125. func GetExchangeClassify(exchange string) (list []TradeClassifyName, err error) {
  126. tableName := "base_from_trade_" + exchange + "_index"
  127. orderStr := "classify_name DESC, classify_type asc"
  128. if exchange == "zhengzhou" {
  129. orderStr = "classify_name asc"
  130. }
  131. sql := "SELECT classify_name, classify_type FROM " + tableName + " WHERE `rank` <=20 and `rank` > 0 GROUP BY classify_name, classify_type "
  132. sql += ` ORDER BY ` + orderStr
  133. err = global.DbMap[utils.DbNameIndex].Raw(sql).Scan(&list).Error
  134. return
  135. }
  136. type LastTimeItem struct {
  137. CreateTime time.Time
  138. }
  139. // GetExchangeLastTime 获取交易所数据最晚的时间
  140. func GetExchangeLastTime(exchange string) (item LastTimeItem, err error) {
  141. tableName := "base_from_trade_" + exchange + "_index"
  142. sql := `SELECT create_time FROM ` + tableName + ` ORDER BY create_time desc`
  143. o := orm.NewOrmUsingDB("data")
  144. err = o.Raw(sql).QueryRow(&item)
  145. return
  146. }
  147. type GetPositionTopReq struct {
  148. Exchange string `json:"exchange" form:"exchange"` //交易所
  149. ClassifyName string `json:"classify_name" form:"classify_name"` //分类名称
  150. ClassifyType string `json:"classify_type" form:"classify_type"` //具体合约名称
  151. DataTime string `json:"data_time" form:"data_time"` //请求日期,如果为空,则返回最新的榜单日期
  152. }
  153. type GetPositionTopResp struct {
  154. BuyList GetPositionTopList `description:"多单列表"`
  155. SoldList GetPositionTopList `description:"空单列表"`
  156. CleanBuyList GetPositionTopList `description:"净多单列表"`
  157. CleanSoldList GetPositionTopList `description:"净空单列表"`
  158. DataTime string `description:"最新日期或者请求日期"`
  159. LastDataTime string `description:"最新日期"`
  160. }
  161. type GetPositionTopList struct {
  162. TotalDealValue int `description:"总计成交量"`
  163. TotalDealChange int `description:"校昨日变化"`
  164. List []GetPositionTopListItem `description:"榜单详情列表"`
  165. }
  166. type GetPositionTopListItem struct {
  167. DealShortName string `description:"成交量公司简称"`
  168. DealValue int `description:"成交量"`
  169. DealChange int `description:"成交变化量"`
  170. Rank int `description:"当前名次"`
  171. Rate string `description:"当前占比"`
  172. BeforeAllRate string `description:"排在前面的成交量总计占比(包含)"`
  173. BeforeAllValue int `description:"排在前面的成交量总计"`
  174. BeforeAllChange int `description:"排在前面的成交量增减总计"`
  175. }
  176. func GetTradePositionTop(exchange string, classifyName, classifyType, dataTime string) (list []TradePositionTop, err error) {
  177. tableName := "trade_position_" + exchange + "_top"
  178. sql := `SELECT * FROM ` + tableName + " WHERE classify_name=? and classify_type=? and data_time=? and `rank` <=20 and `rank` > 0 ORDER BY deal_value desc"
  179. err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyName, classifyType, dataTime).Find(&list).Error
  180. return
  181. }
  182. type OriginTradeData struct {
  183. Rank int `description:"排名"`
  184. CompanyName string `description:"期货公司名称"`
  185. Val int `description:"持仓量"`
  186. ValChange int `description:"持仓增减"`
  187. DataTime time.Time `description:"数据日期"`
  188. ClassifyName string `description:"品种名称"`
  189. ClassifyType string `description:"合约代码"`
  190. ValType int `description:"数据类型: 1-多单; 2-空单"`
  191. }
  192. // BaseFromTradeCommonIndex 郑商所/大商所/上期所/上期能源指标表通用字段
  193. type BaseFromTradeCommonIndex struct {
  194. Rank int `description:"排名"`
  195. DealShortName string `description:"成交量公司简称"`
  196. DealName string `description:"成交量指标名称"`
  197. DealCode string `description:"成交量指标编码"`
  198. DealValue int `description:"成交量"`
  199. DealChange int `description:"成交变化量"`
  200. BuyShortName string `description:"持买单量公司简称"`
  201. BuyName string `description:"持买单量指标名称"`
  202. BuyCode string `description:"持买单量指标编码"`
  203. BuyValue int `description:"持买单量"`
  204. BuyChange int `description:"持买单量变化量"`
  205. SoldShortName string `description:"持卖单量公司简称"`
  206. SoldName string `description:"持卖单量指标名称"`
  207. SoldCode string `description:"持卖单量指标编码"`
  208. SoldValue int `description:"持卖单量"`
  209. SoldChange int `description:"持卖单变化量"`
  210. Frequency string `description:"频度"`
  211. ClassifyName string `description:"品种"`
  212. ClassifyType string `description:"合约"`
  213. CreateTime time.Time `description:"创建时间"`
  214. ModifyTime time.Time `description:"更新时间"`
  215. DataTime time.Time `description:"数据日期"`
  216. }
  217. // GetTradeDataByContracts 根据合约获取持仓数据
  218. func GetTradeDataByContracts(exchange string, classifyNames, contracts []string, startDate, endDate time.Time) (items []*BaseFromTradeCommonIndex, err error) {
  219. if exchange == "" {
  220. err = fmt.Errorf("数据表名称有误")
  221. return
  222. }
  223. var cond string
  224. var pars []interface{}
  225. if len(classifyNames) > 0 {
  226. cond += fmt.Sprintf(` AND classify_name IN (%s)`, utils.GetOrmInReplace(len(classifyNames)))
  227. pars = append(pars, classifyNames)
  228. }
  229. if len(contracts) > 0 {
  230. cond += fmt.Sprintf(` AND classify_type IN (%s)`, utils.GetOrmInReplace(len(contracts)))
  231. pars = append(pars, contracts)
  232. }
  233. if !startDate.IsZero() && !endDate.IsZero() {
  234. cond += ` AND (data_time BETWEEN ? AND ?)`
  235. pars = append(pars, startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
  236. }
  237. fields := []string{"rank", "buy_short_name", "buy_value", "buy_change", "sold_short_name", "sold_value", "sold_change", "classify_name", "classify_type", "data_time"}
  238. tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  239. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s ORDER BY data_time DESC`, strings.Join(fields, ","), tableName, cond)
  240. err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
  241. return
  242. }
  243. // GetZhengzhouTradeDataByContracts 郑商所-根据合约获取持仓数据
  244. func GetZhengzhouTradeDataByContracts(classifyNames []string, startDate, endDate time.Time) (items []*BaseFromTradeCommonIndex, err error) {
  245. var cond string
  246. var pars []interface{}
  247. if len(classifyNames) > 0 {
  248. cond += fmt.Sprintf(` AND classify_name IN (%s)`, utils.GetOrmInReplace(len(classifyNames)))
  249. pars = append(pars, classifyNames)
  250. }
  251. if !startDate.IsZero() && !endDate.IsZero() {
  252. cond += ` AND (data_time BETWEEN ? AND ?)`
  253. pars = append(pars, startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
  254. }
  255. // ps.classify_name实为合约代码
  256. fields := []string{"rank", "buy_short_name", "buy_value", "buy_change", "sold_short_name", "sold_value", "sold_change", "classify_name AS classify_type", "data_time"}
  257. sql := fmt.Sprintf(`SELECT %s FROM base_from_trade_zhengzhou_index WHERE 1=1 %s ORDER BY data_time DESC`, strings.Join(fields, ","), cond)
  258. err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&items).Error
  259. return
  260. }
  261. // ContractCompanyTradeData [合约-期货公司]持仓数据
  262. type ContractCompanyTradeData struct {
  263. Exchange string `description:"交易所"`
  264. ClassifyName string `description:"品种"`
  265. ClassifyType string `description:"合约代码"`
  266. CompanyName string `description:"期货公司名称"`
  267. IsTotal bool `description:"是否为合约加总"`
  268. StartDate time.Time `description:"数据开始日期"`
  269. EndDate time.Time `description:"数据结束日期"`
  270. DataList []*ContractCompanyTradeDataList `description:"数据序列"`
  271. }
  272. // ContractCompanyTradeDataList [合约-期货公司]持仓数据详情
  273. type ContractCompanyTradeDataList struct {
  274. Date time.Time `description:"数据日期"`
  275. BuyVal int `description:"多单持仓量"`
  276. BuyValType int `description:"多单数据类型: 0-无值; 1-原始值; 2-推算值"`
  277. BuyChange int `description:"多单持仓增减"`
  278. BuyChangeType int `description:"多单持仓增减类型: 0-无值; 1-原始值; 2-推算值"`
  279. SoldVal int `description:"空单持仓量"`
  280. SoldValType int `description:"空单数据类型: 0-无值; 1-原始值; 2-推算值"`
  281. SoldChange int `description:"空单持仓增减"`
  282. SoldChangeType int `description:"空单持仓增减类型: 0-无值; 1-原始值; 2-推算值"`
  283. PureBuyVal int `description:"净多单持仓量"`
  284. PureBuyValType int `description:"净多单数据类型: 0-无值; 1-原始值; 2-推算值"`
  285. PureBuyChange int `description:"净多单持仓增减"`
  286. PureBuyChangeType int `description:"净多单持仓增减类型: 0-无值; 1-原始值; 2-推算值"`
  287. }
  288. type BaseFromTradeGuangzhouIndex struct {
  289. BaseFromTradeGuangzhouIndexId int `orm:"column(base_from_trade_guangzhou_index_id);pk"`
  290. BaseFromTradeGuangzhouClassifyId int `description:"分类id"`
  291. IndexCode string `description:"指标编码"`
  292. IndexName string `description:"指标名称"`
  293. Frequency string `description:"频率"`
  294. Unit string `description:"单位"`
  295. StartDate string `description:"开始日期"`
  296. EndDate string `description:"结束日期"`
  297. CreateTime time.Time `description:"创建日期"`
  298. ModifyTime time.Time `description:"修改日期"`
  299. }
  300. func GetBaseFromTradeGuangzhouIndex(classifyIds []int, contracts []string, indexKeyword string) (list []*BaseFromTradeGuangzhouIndex, err error) {
  301. cond := ``
  302. pars := make([]interface{}, 0)
  303. if len(classifyIds) > 0 {
  304. cond += fmt.Sprintf(` AND b.base_from_trade_guangzhou_classify_id IN (%s)`, utils.GetOrmInReplace(len(classifyIds)))
  305. pars = append(pars, classifyIds)
  306. }
  307. if len(contracts) > 0 {
  308. cond += fmt.Sprintf(` AND b.contract IN (%s)`, utils.GetOrmInReplace(len(contracts)))
  309. pars = append(pars, contracts)
  310. }
  311. if indexKeyword != "" {
  312. cond += fmt.Sprintf(` AND a.index_name LIKE ?`)
  313. pars = append(pars, indexKeyword)
  314. }
  315. sql := `SELECT a.* FROM base_from_trade_guangzhou_index AS a
  316. JOIN base_from_trade_guangzhou_contract AS b ON a.base_from_trade_guangzhou_contract_id = b.base_from_trade_guangzhou_contract_id
  317. WHERE 1=1 %s`
  318. sql = fmt.Sprintf(sql, cond)
  319. err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&list).Error
  320. return
  321. }
  322. type BaseFromTradeGuangzhouData struct {
  323. BaseFromTradeGuangzhouDataId int `orm:"column(base_from_trade_guangzhou_data_id);pk"`
  324. BaseFromTradeGuangzhouIndexId int `description:"指标id"`
  325. IndexCode string `description:"指标编码"`
  326. DataTime time.Time `description:"数据日期"`
  327. Value float64 `description:"数据值"`
  328. QtySub float64 `description:"增减"`
  329. CreateTime time.Time `description:"创建日期"`
  330. ModifyTime time.Time `description:"修改日期"`
  331. }
  332. // GetBaseFromTradeGuangzhouDataByIndexIds 广期所-获取指标数据
  333. func GetBaseFromTradeGuangzhouDataByIndexIds(indexIds []int, startDate, endDate time.Time) (list []*BaseFromTradeGuangzhouData, err error) {
  334. if len(indexIds) == 0 {
  335. return
  336. }
  337. cond := fmt.Sprintf(` AND base_from_trade_guangzhou_index_id IN (%s)`, utils.GetOrmInReplace(len(indexIds)))
  338. pars := make([]interface{}, 0)
  339. pars = append(pars, indexIds)
  340. if !startDate.IsZero() && !endDate.IsZero() {
  341. if startDate.Equal(endDate) {
  342. cond += ` AND data_time = ?`
  343. pars = append(pars, startDate.Format(utils.FormatDate))
  344. }
  345. if !startDate.Equal(endDate) {
  346. cond += ` AND (data_time BETWEEN ? AND ?)`
  347. pars = append(pars, startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
  348. }
  349. }
  350. sql := fmt.Sprintf(`SELECT * FROM base_from_trade_guangzhou_data WHERE 1=1 %s ORDER BY base_from_trade_guangzhou_index_id`, cond)
  351. err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&list).Error
  352. return
  353. }
  354. // ContractTopRankData TOP20合约排名数据
  355. type ContractTopRankData struct {
  356. Exchange string `description:"交易所"`
  357. DealValue int `description:"成交量"`
  358. BuyValue int `description:"多单持仓量"`
  359. BuyChange int `description:"多单变化"`
  360. SoldValue int `description:"空单持仓量"`
  361. SoldChange int `description:"空单变化"`
  362. PureBuyValue int `description:"净多单持仓量"`
  363. PureBuyChange int `description:"净多单变化"`
  364. ClassifyName string `description:"品种名称"`
  365. ClassifyType string `description:"合约代码"`
  366. DataTime time.Time `description:"数据日期"`
  367. }
  368. // GetContractTopRankData 获取合约TOP20根据当日成交量排名
  369. func GetContractTopRankData(exchange string, classifyNames []string, dataDate time.Time) (items []*ContractTopRankData, err error) {
  370. if exchange == "" {
  371. err = fmt.Errorf("数据表名称有误")
  372. return
  373. }
  374. if len(classifyNames) == 0 {
  375. return
  376. }
  377. tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  378. // 大商所存在TOP20的rank=0
  379. queryRank := ` rank = 999`
  380. if exchange == TradeExchangeDalian {
  381. queryRank = ` (rank = 999 OR rank = 0)`
  382. }
  383. sql := `SELECT * FROM %s WHERE data_time = ? AND classify_name IN (%s) AND %s GROUP BY classify_type ORDER BY deal_value DESC`
  384. sql = fmt.Sprintf(sql, tableName, utils.GetOrmInReplace(len(classifyNames)), queryRank)
  385. err = global.DbMap[utils.DbNameIndex].Raw(sql, dataDate.Format(utils.FormatDate), classifyNames).Find(&items).Error
  386. return
  387. }
  388. // GetZhengzhouContractTopRankData 郑商所-获取合约根据当日成交量排名
  389. func GetZhengzhouContractTopRankData(classifyNames []string, dataDate time.Time) (items []*ContractTopRankData, err error) {
  390. if len(classifyNames) == 0 {
  391. return
  392. }
  393. sql := `SELECT * FROM base_from_trade_zhengzhou_index WHERE data_time = ? AND classify_name IN (%s) AND rank = 999 GROUP BY classify_name ORDER BY deal_value DESC`
  394. sql = fmt.Sprintf(sql, utils.GetOrmInReplace(len(classifyNames)))
  395. err = global.DbMap[utils.DbNameIndex].Raw(sql, dataDate.Format(utils.FormatDate), classifyNames).Find(&items).Error
  396. return
  397. }
  398. // ContractCompanyTradeEdb [合约-期货公司]指标
  399. type ContractCompanyTradeEdb struct {
  400. Exchange string `description:"交易所"`
  401. ClassifyName string `description:"品种"`
  402. ClassifyType string `description:"合约代码"`
  403. CompanyName string `description:"期货公司名称"`
  404. IsTotal bool `description:"是否为合约加总"`
  405. ContractPosition int `description:"合约方向"`
  406. StartDate time.Time `description:"数据开始日期"`
  407. EndDate time.Time `description:"数据结束日期"`
  408. DataList []*ContractCompanyTradeEdbData `description:"数据序列"`
  409. }
  410. // ContractCompanyTradeEdbData [合约-期货公司]指标数据
  411. type ContractCompanyTradeEdbData struct {
  412. DataTime time.Time `description:"数据日期"`
  413. Val int `description:"数据值"`
  414. }
  415. // GetClassifyNewestDataTime 获取品种最新数据日期
  416. func GetClassifyNewestDataTime(exchange string, classifyNames []string) (dateTime time.Time, err error) {
  417. if exchange == "" {
  418. err = fmt.Errorf("数据表名称有误")
  419. return
  420. }
  421. if len(classifyNames) == 0 {
  422. return
  423. }
  424. tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  425. sql := `SELECT data_time FROM %s WHERE classify_name IN (%s) ORDER BY data_time DESC LIMIT 1`
  426. sql = fmt.Sprintf(sql, tableName, utils.GetOrmInReplace(len(classifyNames)))
  427. err = global.DbMap[utils.DbNameIndex].Raw(sql, classifyNames).First(&dateTime).Error
  428. return
  429. }
  430. // GetGuangzhouClassifyNewestDataTime 广期所-获取品种最新数据日期
  431. func GetGuangzhouClassifyNewestDataTime(indexIds []int) (dateTime time.Time, err error) {
  432. if len(indexIds) == 0 {
  433. return
  434. }
  435. cond := fmt.Sprintf(` AND base_from_trade_guangzhou_index_id IN (%s)`, utils.GetOrmInReplace(len(indexIds)))
  436. pars := make([]interface{}, 0)
  437. pars = append(pars, indexIds)
  438. sql := fmt.Sprintf(`SELECT data_time FROM base_from_trade_guangzhou_data WHERE 1=1 %s ORDER BY data_time DESC LIMIT 1`, cond)
  439. err = global.DbMap[utils.DbNameIndex].Raw(sql, pars...).Find(&dateTime).Error
  440. return
  441. }