trade_position_analysis.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. package data_manage
  2. import (
  3. "eta/eta_task/utils"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "time"
  7. "unsafe"
  8. )
  9. // 持仓榜单表
  10. type TradePositionTop struct {
  11. Id uint64 `orm:"column(id);pk"`
  12. ClassifyName string //分类名称
  13. ClassifyType string //分类名称下的类型
  14. DataTime string //数据日期
  15. CreateTime time.Time //插入时间
  16. ModifyTime time.Time //修改时间
  17. DealShortName string //成交量公司简称
  18. DealValue int //成交量
  19. DealChange int //成交变化量
  20. DealType int //交易类型:1多单,2空单,3净多单,4净空单
  21. SourceType int //数据来源,0是原始数据的值,1是由T+1日推算出的值,2是由T日的榜单数据推算出的值
  22. Rank int //排名
  23. }
  24. type TradePositionDalianTop struct {
  25. TradePositionTop
  26. }
  27. type TradePositionZhengzhouTop struct {
  28. TradePositionTop
  29. }
  30. type TradePositionCffexTop struct {
  31. TradePositionTop
  32. }
  33. type TradePositionShanghaiTop struct {
  34. TradePositionTop
  35. }
  36. type TradePositionIneTop struct {
  37. TradePositionTop
  38. }
  39. type TradePositionGuangzhouTop struct {
  40. TradePositionTop
  41. }
  42. func InsertMultiTradePositionTop(exchange string, items []*TradePositionTop) (err error) {
  43. o := orm.NewOrm()
  44. if exchange == "dalian" {
  45. list := make([]*TradePositionDalianTop, 0)
  46. for _, v := range items {
  47. tmp := (*TradePositionDalianTop)(unsafe.Pointer(v))
  48. list = append(list, tmp)
  49. }
  50. _, err = o.InsertMulti(len(list), list)
  51. return
  52. } else if exchange == "zhengzhou" {
  53. list := make([]*TradePositionZhengzhouTop, 0)
  54. for _, v := range items {
  55. tmp := (*TradePositionZhengzhouTop)(unsafe.Pointer(v))
  56. list = append(list, tmp)
  57. }
  58. _, err = o.InsertMulti(len(list), list)
  59. return
  60. } else if exchange == "cffex" {
  61. list := make([]*TradePositionCffexTop, 0)
  62. for _, v := range items {
  63. tmp := (*TradePositionCffexTop)(unsafe.Pointer(v))
  64. list = append(list, tmp)
  65. }
  66. _, err = o.InsertMulti(len(list), list)
  67. return
  68. } else if exchange == "shanghai" {
  69. list := make([]*TradePositionShanghaiTop, 0)
  70. for _, v := range items {
  71. tmp := (*TradePositionShanghaiTop)(unsafe.Pointer(v))
  72. list = append(list, tmp)
  73. }
  74. _, err = o.InsertMulti(len(list), list)
  75. return
  76. } else if exchange == "ine" {
  77. list := make([]*TradePositionIneTop, 0)
  78. for _, v := range items {
  79. tmp := (*TradePositionIneTop)(unsafe.Pointer(v))
  80. list = append(list, tmp)
  81. }
  82. _, err = o.InsertMulti(len(list), list)
  83. return
  84. } else if exchange == "guangzhou" {
  85. list := make([]*TradePositionGuangzhouTop, 0)
  86. for _, v := range items {
  87. tmp := (*TradePositionGuangzhouTop)(unsafe.Pointer(v))
  88. list = append(list, tmp)
  89. }
  90. _, err = o.InsertMulti(len(list), list)
  91. return
  92. }
  93. return
  94. }
  95. func GetTradePositionTopByExchangeDataTime(exchange string, startDate, endDate string) (list []*TradePositionTop, err error) {
  96. o := orm.NewOrm()
  97. sql := "SELECT * FROM trade_position_" + exchange + "_top where data_time >= ? and data_time <= ? and deal_type in (1,2) ORDER BY classify_name, classify_type, deal_type, data_time, deal_value desc"
  98. _, err = o.Raw(sql, startDate, endDate).QueryRows(&list)
  99. return
  100. }
  101. func GetTradePositionTopByExchangeDataTimeByClassify(exchange string, startDate, endDate string, classifyNames, classifyTypes []string) (list []*TradePositionTop, err error) {
  102. o := orm.NewOrm()
  103. sql := `SELECT * FROM trade_position_` + exchange + `_top where data_time >= ? and data_time <= ? and deal_type in (1,2) and classify_name in (` + utils.GetOrmInReplace(len(classifyNames)) + `) and classify_type in (` + utils.GetOrmInReplace(len(classifyTypes)) + `) ORDER BY classify_name, classify_type, deal_type, data_time, deal_value desc`
  104. _, err = o.Raw(sql, startDate, endDate, classifyNames, classifyTypes).QueryRows(&list)
  105. return
  106. }
  107. func GetTradePositionTopCountByExchangeDataTime(exchange string, startDate, endDate string) (count int64, err error) {
  108. o := orm.NewOrm()
  109. sql := "SELECT count(*) FROM trade_position_" + exchange + "_top where data_time >= ? and data_time <= ? and deal_type in (1,2) ORDER BY classify_name, classify_type, deal_type, data_time, deal_value desc"
  110. err = o.Raw(sql, startDate, endDate).QueryRow(&count)
  111. return
  112. }
  113. func GetTradePositionTopByExchangeSourceType(exchange string, dataTime string, sourceType int) (list []*TradePositionTop, err error) {
  114. o := orm.NewOrm()
  115. sql := "SELECT * FROM trade_position_" + exchange + "_top where data_time= ? and source_type = ? ORDER BY classify_name, classify_type, deal_type, deal_value desc"
  116. _, err = o.Raw(sql, dataTime, sourceType).QueryRows(&list)
  117. return
  118. }
  119. func GetTradePositionTopByExchangeSourceTypeClassify(exchange string, dataTime string, sourceType int, classifyNames, classifyTypes []string) (list []*TradePositionTop, err error) {
  120. o := orm.NewOrm()
  121. sql := `SELECT * FROM trade_position_` + exchange + `_top where data_time= ? and source_type = ? and classify_name in (` + utils.GetOrmInReplace(len(classifyNames)) + `) and classify_type in (` + utils.GetOrmInReplace(len(classifyTypes)) + `) ORDER BY classify_name, classify_type, deal_type, deal_value desc`
  122. _, err = o.Raw(sql, dataTime, sourceType, classifyNames, classifyTypes).QueryRows(&list)
  123. return
  124. }
  125. type TradeTopClassify struct {
  126. ClassifyName string //分类名称
  127. ClassifyType string //分类名称下的类型
  128. }
  129. type TradePositionSub struct {
  130. ClassifyName string //分类名称
  131. ClassifyType string //分类名称下的类型
  132. DataTime string //数据日期
  133. DealShortName string //成交量公司简称
  134. SubValue int //差值
  135. DealType int
  136. }
  137. type TradePositionSubList []*TradePositionSub
  138. func (v TradePositionSubList) Len() int {
  139. return len(v)
  140. }
  141. func (v TradePositionSubList) Swap(i, j int) {
  142. v[i], v[j] = v[j], v[i]
  143. }
  144. func (v TradePositionSubList) Less(i, j int) bool {
  145. return v[i].SubValue > v[j].SubValue
  146. }
  147. type UpdateDealValueChange struct {
  148. Id uint64
  149. DealValue int //成交量
  150. DealChange int
  151. SourceType int
  152. ModifyTime time.Time //修改时间
  153. }
  154. type UpdateChangeVal struct {
  155. Id uint64
  156. DealChange int
  157. ModifyTime time.Time //修改时间
  158. }
  159. func MultiUpdatePositionTop(exchange string, updates []UpdateDealValueChange) (err error) {
  160. o := orm.NewOrm()
  161. p, err := o.Raw("UPDATE trade_position_" + exchange + "_top SET deal_value=?, deal_change=?, source_type=?, modify_time=? WHERE id = ?").Prepare()
  162. if err != nil {
  163. return
  164. }
  165. defer func() {
  166. _ = p.Close() // 别忘记关闭 statement
  167. }()
  168. for _, v := range updates {
  169. _, err = p.Exec(v.DealValue, v.DealChange, v.SourceType, v.ModifyTime, v.Id)
  170. if err != nil {
  171. return
  172. }
  173. }
  174. return
  175. }
  176. func DeletePositionTopByDataTime(exchange string, dataTime string, dealType int) (err error) {
  177. o := orm.NewOrm()
  178. sql := "delete from trade_position_" + exchange + "_top WHERE data_time=? and deal_type=?"
  179. _, err = o.Raw(sql, dataTime, dealType).Exec()
  180. return
  181. }
  182. func DeletePositionTopByDataTimeClassify(exchange string, dataTime string, dealType int, classifyNames, classifyTypes []string) (err error) {
  183. o := orm.NewOrm()
  184. sql := `delete from trade_position_` + exchange + `_top WHERE data_time=? and deal_type=? and classify_name in (` + utils.GetOrmInReplace(len(classifyNames)) + `) and classify_type in (` + utils.GetOrmInReplace(len(classifyTypes)) + `)`
  185. _, err = o.Raw(sql, dataTime, dealType, classifyNames, classifyTypes).Exec()
  186. return
  187. }
  188. func GetTradePositionTopByExchangeDataTimeType(exchange string, dataTime string, dealType int) (list []TradePositionTop, err error) {
  189. o := orm.NewOrm()
  190. sql := "select * from trade_position_" + exchange + "_top WHERE data_time=? and deal_type=?"
  191. _, err = o.Raw(sql, dataTime, dealType).QueryRows(&list)
  192. return
  193. }
  194. func GetTradePositionTopByExchangeDataTimeTypeClassify(exchange string, dataTime string, dealType int, classifyNames, classifyTypes []string) (list []TradePositionTop, err error) {
  195. o := orm.NewOrm()
  196. sql := `select * from trade_position_` + exchange + `_top WHERE data_time=? and deal_type=? and classify_name in (` + utils.GetOrmInReplace(len(classifyNames)) + `) and classify_type in (` + utils.GetOrmInReplace(len(classifyTypes)) + `)`
  197. _, err = o.Raw(sql, dataTime, dealType, classifyNames, classifyTypes).QueryRows(&list)
  198. return
  199. }
  200. func MultiInsertTradeBaseDataToTop(exchange string, startDate, endDate string) (err error) {
  201. o := orm.NewOrm()
  202. now := time.Now().Format(utils.FormatDateTime)
  203. sql1 := `INSERT INTO trade_position_` + exchange + `_top(classify_name,classify_type,deal_short_name,deal_value,deal_change,data_time,deal_type,source_type,rank,create_time,modify_time)
  204. SELECT classify_name,classify_type,buy_short_name,buy_value,buy_change,data_time,1,0,rank,?,? FROM base_from_trade_` + exchange + `_index where buy_short_name !="" and buy_short_name !=" " and data_time between ? and ?`
  205. sql1 += " and `rank` <50 "
  206. _, err = o.Raw(sql1, now, now, startDate, endDate).Exec()
  207. if err != nil {
  208. return
  209. }
  210. sql2 := `INSERT INTO trade_position_` + exchange + `_top(classify_name,classify_type,deal_short_name,deal_value,deal_change,data_time,deal_type,source_type,rank,create_time,modify_time)
  211. SELECT classify_name,classify_type,sold_short_name,sold_value,sold_change,data_time,2,0,rank,?,? FROM base_from_trade_` + exchange + `_index where sold_short_name !="" and sold_short_name !=" " and data_time between ? and ?`
  212. sql2 += " and `rank` <50 "
  213. _, err = o.Raw(sql2, now, now, startDate, endDate).Exec()
  214. return
  215. }
  216. func MultiInsertTradeBaseDataToTopByClassify(exchange string, startDate, endDate string, classifyNames, classifyTypes []string) (err error) {
  217. o := orm.NewOrm()
  218. now := time.Now().Format(utils.FormatDateTime)
  219. sql1 := `INSERT INTO trade_position_` + exchange + `_top(classify_name,classify_type,deal_short_name,deal_value,deal_change,data_time,deal_type,source_type,rank,create_time,modify_time)
  220. SELECT classify_name,classify_type,buy_short_name,buy_value,buy_change,data_time,1,0,rank,?,? FROM base_from_trade_` + exchange + `_index where buy_short_name !="" and buy_short_name !=" " and data_time between ? and ? and classify_name in (` + utils.GetOrmInReplace(len(classifyNames)) + `) and classify_type in (` + utils.GetOrmInReplace(len(classifyTypes)) + `)`
  221. sql1 += " and `rank` <50 "
  222. _, err = o.Raw(sql1, now, now, startDate, endDate, classifyNames, classifyTypes).Exec()
  223. if err != nil {
  224. return
  225. }
  226. sql2 := `INSERT INTO trade_position_` + exchange + `_top(classify_name,classify_type,deal_short_name,deal_value,deal_change,data_time,deal_type,source_type,rank,create_time,modify_time)
  227. SELECT classify_name,classify_type,sold_short_name,sold_value,sold_change,data_time,2,0,rank,?,? FROM base_from_trade_` + exchange + `_index where sold_short_name !="" and sold_short_name !=" " and data_time between ? and ? and classify_name in (` + utils.GetOrmInReplace(len(classifyNames)) + `) and classify_type in (` + utils.GetOrmInReplace(len(classifyTypes)) + `)`
  228. sql2 += " and `rank` <50 "
  229. _, err = o.Raw(sql2, now, now, startDate, endDate, classifyNames, classifyTypes).Exec()
  230. return
  231. }
  232. // GetTradePositionTopOriginDataTimes 获取榜单原始数据日期-正序
  233. func GetTradePositionTopOriginDataTimes(exchange string) (dates []string, err error) {
  234. o := orm.NewOrm()
  235. sql := `SELECT DISTINCT data_time FROM base_from_trade_%s_index ORDER BY data_time ASC`
  236. sql = fmt.Sprintf(sql, exchange)
  237. _, err = o.Raw(sql).QueryRows(&dates)
  238. return
  239. }
  240. // BaseFromTradeClassify 交易所分类表
  241. type BaseFromTradeClassify struct {
  242. Id uint64 `orm:"column(id);pk"`
  243. ClassifyName string //分类名称
  244. ClassifyType string //分类名称下的类型
  245. Exchange string //交易所
  246. LatestDate time.Time //数据最近的日期
  247. CreateTime time.Time //插入时间
  248. ModifyTime time.Time //修改时间
  249. }
  250. // GetAllBaseFromTradeClassify 获取所有的交易所分类列表
  251. func GetAllBaseFromTradeClassify() (list []*BaseFromTradeClassify, err error) {
  252. sql := `SELECT * FROM base_from_trade_classify `
  253. o := orm.NewOrm()
  254. _, err = o.Raw(sql).QueryRows(&list)
  255. return
  256. }
  257. // Update 更新
  258. func (m *BaseFromTradeClassify) Update(cols []string) (err error) {
  259. o := orm.NewOrm()
  260. _, err = o.Update(m, cols...)
  261. return
  262. }
  263. // MultiAddBaseFromTradeClassify 批量插入交易所分类
  264. func MultiAddBaseFromTradeClassify(items []*BaseFromTradeClassify) (err error) {
  265. if len(items) == 0 {
  266. return
  267. }
  268. o := orm.NewOrm()
  269. _, err = o.InsertMulti(len(items), items)
  270. return
  271. }
  272. type TradeClassifyName struct {
  273. ClassifyName string //分类名称
  274. ClassifyType string //分类名称下的类型
  275. DataTime time.Time //数据最近的日期
  276. ModifyTime time.Time //数据最近的日期
  277. }
  278. // GetExchangeClassify 获取交易所分类列表
  279. func GetExchangeClassify(exchange string) (list []TradeClassifyName, err error) {
  280. tableName := "trade_position_" + exchange + "_top"
  281. orderStr := "classify_name DESC, classify_type asc"
  282. if exchange == "zhengzhou" {
  283. orderStr = "classify_name asc"
  284. }
  285. sql := `SELECT classify_name, classify_type,MAX(data_time) as data_time,MAX(modify_time) as modify_time FROM ` + tableName + ` GROUP BY classify_name, classify_type `
  286. sql += ` ORDER BY ` + orderStr
  287. o := orm.NewOrm()
  288. _, err = o.Raw(sql).QueryRows(&list)
  289. return
  290. }
  291. // GetTradePositionTopCleanByExchangeDataTime 根据时间查询净多单和净空单的值
  292. func GetTradePositionTopCleanByExchangeDataTime(exchange string, startDate, endDate string) (list []*TradePositionTop, err error) {
  293. o := orm.NewOrm()
  294. sql := "SELECT * FROM trade_position_" + exchange + "_top where data_time >= ? and data_time <= ? and deal_type in (3,4) ORDER BY classify_name, classify_type, deal_type, data_time, deal_value desc"
  295. _, err = o.Raw(sql, startDate, endDate).QueryRows(&list)
  296. return
  297. }
  298. // GetTradePositionTopCleanByExchangeDataTimeClassify 根据时间查询净多单和净空单的值
  299. func GetTradePositionTopCleanByExchangeDataTimeClassify(exchange string, startDate, endDate string, classifyNames, classifyTypes []string) (list []*TradePositionTop, err error) {
  300. o := orm.NewOrm()
  301. sql := `SELECT * FROM trade_position_` + exchange + `_top where data_time >= ? and data_time <= ? and deal_type in (3,4) and classify_name in (` + utils.GetOrmInReplace(len(classifyNames)) + `) and classify_type in (` + utils.GetOrmInReplace(len(classifyTypes)) + `) ORDER BY classify_name, classify_type, deal_type, data_time, deal_value desc`
  302. _, err = o.Raw(sql, startDate, endDate, classifyNames, classifyTypes).QueryRows(&list)
  303. return
  304. }
  305. // MultiUpdatePositionTopChangeVal 批量更新榜单里变化量的值
  306. func MultiUpdatePositionTopChangeVal(exchange string, updates []UpdateChangeVal) (err error) {
  307. o := orm.NewOrm()
  308. p, err := o.Raw("UPDATE trade_position_" + exchange + "_top SET deal_change=?, modify_time=? WHERE id = ?").Prepare()
  309. if err != nil {
  310. return
  311. }
  312. defer func() {
  313. _ = p.Close() // 别忘记关闭 statement
  314. }()
  315. for _, v := range updates {
  316. _, err = p.Exec(v.DealChange, v.ModifyTime, v.Id)
  317. if err != nil {
  318. return
  319. }
  320. }
  321. return
  322. }
  323. func GetTradePositionOriginClassifyCountByExchangeDataTime(exchange string, startDate, endDate string) (count int64, err error) {
  324. o := orm.NewOrm()
  325. sql := `SELECT COUNT(DISTINCT classify_name, classify_type) FROM base_from_trade_` + exchange + `_index where (buy_short_name !="" or sold_short_name !="" ) and (buy_short_name !=" " or sold_short_name !=" " ) and data_time >= ? and data_time <= ?`
  326. sql += " and `rank` <50 "
  327. err = o.Raw(sql, startDate, endDate).QueryRow(&count)
  328. return
  329. }
  330. func GetTradePositionTopClassifyCountByExchangeDataTime(exchange string, startDate, endDate string) (count int64, err error) {
  331. o := orm.NewOrm()
  332. sql := "SELECT COUNT(DISTINCT classify_name, classify_type) FROM trade_position_" + exchange + "_top where data_time >= ? and data_time <= ? and deal_type in (1,2) "
  333. err = o.Raw(sql, startDate, endDate).QueryRow(&count)
  334. return
  335. }
  336. type TradePositionClassifyInfo struct {
  337. ClassifyName string //分类名称
  338. ClassifyType string //分类名称下的类型
  339. }
  340. func GetTradePositionOriginClassifyByExchangeDataTime(exchange string, startDate, endDate string) (list []TradePositionClassifyInfo, err error) {
  341. o := orm.NewOrm()
  342. sql := `SELECT DISTINCT classify_name, classify_type FROM base_from_trade_` + exchange + `_index where (buy_short_name !="" or sold_short_name !="" ) and (buy_short_name !=" " or sold_short_name !=" " ) and data_time >= ? and data_time <= ?`
  343. sql += " and `rank` <50 "
  344. _, err = o.Raw(sql, startDate, endDate).QueryRows(&list)
  345. return
  346. }
  347. func GetTradePositionTopClassifyByExchangeDataTime(exchange string, startDate, endDate string) (list []TradePositionClassifyInfo, err error) {
  348. o := orm.NewOrm()
  349. sql := "SELECT DISTINCT classify_name, classify_type FROM trade_position_" + exchange + "_top where data_time >= ? and data_time <= ? and deal_type in (1,2) "
  350. _, err = o.Raw(sql, startDate, endDate).QueryRows(&list)
  351. return
  352. }
  353. // DeleteTradePositionTopAllByExchangeDataTime 删除计算数据
  354. func DeleteTradePositionTopAllByExchangeDataTime(exchange string, startDate, endDate string) (err error) {
  355. o := orm.NewOrm()
  356. sql := "DELETE FROM trade_position_" + exchange + "_top where data_time >= ? and data_time <= ? "
  357. _, err = o.Raw(sql, startDate, endDate).Exec()
  358. return
  359. }
  360. type GetFirstBaseFromTradeIndeDate struct {
  361. DataTime string
  362. }
  363. func GetFirstBaseFromTradeIndexByDate(exchange string) (item *GetFirstBaseFromTradeIndeDate, err error) {
  364. o := orm.NewOrm()
  365. sql := "SELECT * FROM base_from_trade_" + exchange + "_index where `rank` < 50 order by data_time asc"
  366. err = o.Raw(sql).QueryRow(&item)
  367. return
  368. }