trade_analysis.go 17 KB

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