trade_analysis.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. package trade_analysis
  2. import (
  3. "eta/eta_index_lib/utils"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  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. o := orm.NewOrm()
  84. _, err = o.Raw(sql).QueryRows(&list)
  85. return
  86. }
  87. type LastTimeItem struct {
  88. CreateTime time.Time
  89. }
  90. // GetExchangeLastTime 获取交易所数据最晚的时间
  91. func GetExchangeLastTime(exchange string) (item LastTimeItem, err error) {
  92. tableName := "base_from_trade_" + exchange + "_index"
  93. sql := `SELECT create_time FROM ` + tableName + ` ORDER BY create_time desc`
  94. o := orm.NewOrm()
  95. err = o.Raw(sql).QueryRow(&item)
  96. return
  97. }
  98. type GetPositionTopReq struct {
  99. Exchange string `json:"exchange" form:"exchange"` //交易所
  100. ClassifyName string `json:"classify_name" form:"classify_name"` //分类名称
  101. ClassifyType string `json:"classify_type" form:"classify_type"` //具体合约名称
  102. DataTime string `json:"data_time" form:"data_time"` //请求日期,如果为空,则返回最新的榜单日期
  103. }
  104. type GetPositionTopResp struct {
  105. BuyList GetPositionTopList `description:"多单列表"`
  106. SoldList GetPositionTopList `description:"空单列表"`
  107. CleanBuyList GetPositionTopList `description:"净多单列表"`
  108. CleanSoldList GetPositionTopList `description:"净空单列表"`
  109. DataTime string `description:"最新日期或者请求日期"`
  110. LastDataTime string `description:"最新日期"`
  111. }
  112. type GetPositionTopList struct {
  113. TotalDealValue int `description:"总计成交量"`
  114. TotalDealChange int `description:"校昨日变化"`
  115. List []GetPositionTopListItem `description:"榜单详情列表"`
  116. }
  117. type GetPositionTopListItem struct {
  118. DealShortName string `description:"成交量公司简称"`
  119. DealValue int `description:"成交量"`
  120. DealChange int `description:"成交变化量"`
  121. Rank int `description:"当前名次"`
  122. Rate string `description:"当前占比"`
  123. BeforeAllRate string `description:"排在前面的成交量总计占比(包含)"`
  124. BeforeAllValue int `description:"排在前面的成交量总计"`
  125. BeforeAllChange int `description:"排在前面的成交量增减总计"`
  126. }
  127. func GetTradePositionTop(exchange string, classifyName, classifyType, dataTime string) (list []TradePositionTop, err error) {
  128. tableName := "trade_position_" + exchange + "_top"
  129. sql := `SELECT * FROM ` + tableName + " WHERE classify_name=? and classify_type=? and data_time=? and `rank` <=20 and `rank` > 0 ORDER BY deal_value desc"
  130. o := orm.NewOrm()
  131. _, err = o.Raw(sql, classifyName, classifyType, dataTime).QueryRows(&list)
  132. return
  133. }
  134. type OriginTradeData struct {
  135. Rank int `description:"排名"`
  136. CompanyName string `description:"期货公司名称"`
  137. Val int `description:"持仓量"`
  138. ValChange int `description:"持仓增减"`
  139. DataTime time.Time `description:"数据日期"`
  140. ClassifyName string `description:"品种名称"`
  141. ClassifyType string `description:"合约代码"`
  142. ValType int `description:"数据类型: 1-多单; 2-空单"`
  143. }
  144. func GetTradeDataByClassifyAndCompany(exchange, classifyName string, contracts, companies []string) (items []*OriginTradeData, err error) {
  145. if exchange == "" {
  146. err = fmt.Errorf("数据表名称有误")
  147. return
  148. }
  149. if len(contracts) == 0 || len(companies) == 0 {
  150. return
  151. }
  152. tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  153. sql := `SELECT
  154. rank,
  155. buy_short_name AS company_name,
  156. buy_value AS val,
  157. buy_change AS val_change,
  158. classify_name,
  159. classify_type,
  160. data_time,
  161. 1 AS val_type
  162. FROM
  163. %s
  164. WHERE
  165. classify_name = ? AND classify_type IN (%s) AND buy_short_name IN (%s)
  166. UNION ALL
  167. (
  168. SELECT
  169. rank,
  170. sold_short_name,
  171. sold_value,
  172. sold_change,
  173. classify_name,
  174. classify_type,
  175. data_time,
  176. 2 AS val_type
  177. FROM
  178. %s
  179. WHERE
  180. classify_name = ? AND classify_type IN (%s) AND sold_short_name IN (%s)
  181. )`
  182. sql = fmt.Sprintf(sql, tableName, utils.GetOrmInReplace(len(contracts)), utils.GetOrmInReplace(len(companies)), tableName, utils.GetOrmInReplace(len(contracts)), utils.GetOrmInReplace(len(companies)))
  183. o := orm.NewOrm()
  184. _, err = o.Raw(sql, classifyName, contracts, companies, classifyName, contracts, companies).QueryRows(&items)
  185. return
  186. }
  187. // ContractCompanyTradeData [合约-期货公司]持仓数据
  188. type ContractCompanyTradeData struct {
  189. CompanyName string `description:"期货公司名称"`
  190. ClassifyType string `description:"合约代码"`
  191. StartDate time.Time `description:"数据开始日期"`
  192. EndDate time.Time `description:"数据结束日期"`
  193. DataList []*ContractCompanyTradeDataList `description:"数据序列"`
  194. }
  195. const (
  196. TradeDataTypeNull = 0 // 无值
  197. TradeDataTypeOrigin = 1 // 原始值
  198. TradeDataTypeCalculate = 2 // 推算值
  199. WarehouseBuyChartType = 1 // 多单图
  200. WarehouseSoldChartType = 2 // 空单图
  201. WarehousePureBuyChartType = 3 // 净多单图
  202. WarehouseDefaultUnit = "手"
  203. WarehouseDefaultFrequency = "日度"
  204. )
  205. var WarehouseTypeSuffixNames = map[int]string{
  206. WarehouseBuyChartType: "席位多单",
  207. WarehouseSoldChartType: "席位空单",
  208. WarehousePureBuyChartType: "席位净多单",
  209. }
  210. // ContractCompanyTradeDataList [合约-期货公司]持仓数据详情
  211. type ContractCompanyTradeDataList struct {
  212. Date time.Time `description:"数据日期"`
  213. BuyVal int `description:"多单持仓量"`
  214. BuyValType int `description:"多单数据类型: 0-无值; 1-原始值; 2-推算值"`
  215. BuyChange int `description:"多单持仓增减"`
  216. BuyChangeType int `description:"多单持仓增减类型: 0-无值; 1-原始值; 2-推算值"`
  217. SoldVal int `description:"空单持仓量"`
  218. SoldValType int `description:"空单数据类型: 0-无值; 1-原始值; 2-推算值"`
  219. SoldChange int `description:"空单持仓增减"`
  220. SoldChangeType int `description:"空单持仓增减类型: 0-无值; 1-原始值; 2-推算值"`
  221. PureBuyVal int `description:"净多单持仓量"`
  222. PureBuyValType int `description:"净多单数据类型: 0-无值; 1-原始值; 2-推算值"`
  223. PureBuyChange int `description:"净多单持仓增减"`
  224. PureBuyChangeType int `description:"净多单持仓增减类型: 0-无值; 1-原始值; 2-推算值"`
  225. }
  226. // GetLastTradeDataByClassify 获取[合约]末位多空单数据
  227. func GetLastTradeDataByClassify(exchange, classifyName string, contracts []string) (items []*OriginTradeData, err error) {
  228. if exchange == "" {
  229. err = fmt.Errorf("数据表名称有误")
  230. return
  231. }
  232. if len(contracts) == 0 {
  233. return
  234. }
  235. contractReplacer := utils.GetOrmInReplace(len(contracts))
  236. tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  237. sql := `SELECT
  238. tpt.rank,
  239. tpt.buy_short_name AS company_name,
  240. tpt.buy_value AS val,
  241. tpt.buy_change AS val_change,
  242. tpt.classify_name,
  243. tpt.classify_type,
  244. tpt.data_time,
  245. 1 AS val_type
  246. FROM
  247. %s tpt
  248. JOIN
  249. (
  250. SELECT
  251. data_time, classify_type, MAX(rank) AS max_rank
  252. FROM
  253. %s
  254. WHERE
  255. classify_name = ? AND classify_type IN (%s) AND buy_short_name <> ''
  256. GROUP BY
  257. data_time,
  258. classify_type
  259. ) sub
  260. ON
  261. tpt.data_time = sub.data_time AND tpt.classify_type = sub.classify_type AND tpt.rank = sub.max_rank
  262. WHERE
  263. tpt.classify_name = ? AND tpt.classify_type IN (%s)
  264. UNION ALL
  265. (
  266. SELECT
  267. 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
  268. FROM
  269. %s tpt
  270. JOIN
  271. (
  272. SELECT
  273. data_time, classify_type, MAX(rank) AS max_rank
  274. FROM
  275. %s
  276. WHERE
  277. classify_name = ? AND classify_type IN (%s) AND sold_short_name <> ''
  278. GROUP BY
  279. data_time, classify_type
  280. ) sub
  281. ON
  282. tpt.data_time = sub.data_time AND tpt.classify_type = sub.classify_type AND tpt.rank = sub.max_rank
  283. WHERE
  284. tpt.classify_name = ? AND tpt.classify_type IN (%s)
  285. )`
  286. sql = fmt.Sprintf(sql, tableName, tableName, contractReplacer, contractReplacer, tableName, tableName, contractReplacer, contractReplacer)
  287. o := orm.NewOrm()
  288. _, err = o.Raw(sql, classifyName, contracts, classifyName, contracts, classifyName, contracts, classifyName, contracts).QueryRows(&items)
  289. return
  290. }