trade_analysis.go 19 KB

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