trade_analysis.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. package trade_analysis
  2. import (
  3. "eta/eta_api/utils"
  4. "fmt"
  5. "github.com/beego/beego/v2/client/orm"
  6. "strings"
  7. "time"
  8. )
  9. const (
  10. TradeDataTypeNull = 0 // 无值
  11. TradeDataTypeOrigin = 1 // 原始值
  12. TradeDataTypeCalculate = 2 // 推算值
  13. WarehouseBuyChartType = 1 // 多单图
  14. WarehouseSoldChartType = 2 // 空单图
  15. WarehousePureBuyChartType = 3 // 净多单图
  16. WarehouseDefaultUnit = "手"
  17. WarehouseDefaultFrequency = "日度"
  18. GuangZhouTopCompanyAliasName = "日成交持仓排名" // 广期所TOP20对应的公司名称
  19. GuangZhouSeatNameBuy = "持买单量" // 广期所指标名称中的多单名称
  20. GuangZhouSeatNameSold = "持卖单量" // 广期所指标名称中的空单名称
  21. GuangZhouTopSeatNameBuy = "持买单量总计" // 广期所指标名称中的TOP20多单名称
  22. GuangZhouTopSeatNameSold = "持卖单量总计" // 广期所指标名称中的TOP20空单名称
  23. GuangZhouTopSeatNameDeal = "成交量总计" // 广期所指标名称中的TOP20成交量名称
  24. )
  25. const (
  26. TradeExchangeDalian = "dalian"
  27. TradeExchangeZhengzhou = "zhengzhou"
  28. TradeExchangeGuangzhou = "guangzhou"
  29. )
  30. var WarehouseTypeSuffixNames = map[int]string{
  31. WarehouseBuyChartType: "席位多单",
  32. WarehouseSoldChartType: "席位空单",
  33. WarehousePureBuyChartType: "席位净多单",
  34. }
  35. // GuangzhouSeatNameValType 广期所数据名称对应的席位方向
  36. var GuangzhouSeatNameValType = map[string]int{
  37. GuangZhouSeatNameBuy: 1,
  38. GuangZhouSeatNameSold: 2,
  39. GuangZhouTopSeatNameBuy: 1,
  40. GuangZhouTopSeatNameSold: 2,
  41. GuangZhouTopSeatNameDeal: 3,
  42. }
  43. // 合约查询方式
  44. var (
  45. ContractQueryTypeTop = 1 // 主力合约
  46. ContractQueryTypeTop2 = 2 // 成交量前2
  47. ContractQueryTypeTop3 = 3 // 成交量前3
  48. ContractQueryTypeAll = 4 // 所有合约(多个)
  49. ContractQueryTypeTotal = 5 // 合约加总(1个)
  50. )
  51. // 合约方向
  52. var (
  53. ContractPositionBuy = 1 // 多单
  54. ContractPositionSold = 2 // 空单
  55. ContractPositionPureBuy = 3 // 净多单
  56. )
  57. // TradePositionTop 持仓榜单
  58. type TradePositionTop struct {
  59. Id uint64 `gorm:"primaryKey;column:id" json:"id"`
  60. ClassifyName string `gorm:"column:classify_name" json:"classify_name"` //分类名称
  61. ClassifyType string `gorm:"column:classify_type" json:"classify_type"` //分类名称下的类型
  62. DealShortName string `gorm:"column:deal_short_name" json:"deal_short_name"` //成交量公司简称
  63. DealValue int `gorm:"column:deal_value" json:"deal_value"` //成交量
  64. DealChange int `gorm:"column:deal_change" json:"deal_change"` //成交变化量
  65. DataTime time.Time `gorm:"column:data_time" json:"data_time"` //数据日期
  66. CreateTime time.Time `gorm:"column:create_time" json:"create_time"` //插入时间
  67. ModifyTime time.Time `gorm:"column:modify_time" json:"modify_time"` //修改时间
  68. DealType int `gorm:"column:deal_type" json:"deal_type"` //交易类型:1多单,2空单,3净多单,4净空单
  69. SourceType int `gorm:"column:source_type" json:"source_type"` //数据来源,0是原始数据的值,1是由T+1日推算出的值,2是由T日的榜单数据推算出的值
  70. Rank int `gorm:"column:rank" json:"rank"` //排名
  71. }
  72. type TradeClassifyNameList struct {
  73. Exchange string `description:"交易所"`
  74. ExchangeEn string `description:"交易所英文"`
  75. Sort int `description:"排序字段" `
  76. Num int `description:"品种数量"`
  77. DataTime string `description:"最新更新时间"`
  78. CurrDate string `description:"当前日期"`
  79. Items []TradeClassifyNameListItem `description:"子类"`
  80. }
  81. type TradeClassifyNameListSort []TradeClassifyNameList
  82. func (v TradeClassifyNameListSort) Len() int {
  83. return len(v)
  84. }
  85. func (v TradeClassifyNameListSort) Swap(i, j int) {
  86. v[i], v[j] = v[j], v[i]
  87. }
  88. func (v TradeClassifyNameListSort) Less(i, j int) bool {
  89. return v[i].Sort < v[j].Sort
  90. }
  91. type TradeClassifyNameListItemSort []TradeClassifyNameListItem
  92. func (v TradeClassifyNameListItemSort) Len() int {
  93. return len(v)
  94. }
  95. func (v TradeClassifyNameListItemSort) Swap(i, j int) {
  96. v[i], v[j] = v[j], v[i]
  97. }
  98. func (v TradeClassifyNameListItemSort) Less(i, j int) bool {
  99. return v[i].ClassifyName < v[j].ClassifyName
  100. }
  101. type TradeClassifyNameListItem struct {
  102. ClassifyName string `description:"交易分类"`
  103. Items []TradeClassifyNameListItemItem `description:"合约代码"`
  104. }
  105. type TradeClassifyNameListItemItemSort []TradeClassifyNameListItemItem
  106. func (v TradeClassifyNameListItemItemSort) Len() int {
  107. return len(v)
  108. }
  109. func (v TradeClassifyNameListItemItemSort) Swap(i, j int) {
  110. v[i], v[j] = v[j], v[i]
  111. }
  112. func (v TradeClassifyNameListItemItemSort) Less(i, j int) bool {
  113. return v[i].ClassifyType < v[j].ClassifyType
  114. }
  115. type TradeClassifyNameListItemItem struct {
  116. ClassifyType string `description:"分类名称下的类型"`
  117. }
  118. type TradeClassifyName struct {
  119. ClassifyName string //分类名称
  120. ClassifyType string //分类名称下的类型
  121. LatestDate string //分类下最晚日期
  122. }
  123. // GetExchangeClassify 获取交易所分类列表
  124. func GetExchangeClassify(exchange string) (list []TradeClassifyName, err error) {
  125. tableName := "base_from_trade_" + exchange + "_index"
  126. orderStr := "classify_name DESC, classify_type asc"
  127. if exchange == "zhengzhou" {
  128. orderStr = "classify_name asc"
  129. }
  130. sql := "SELECT classify_name, classify_type FROM " + tableName + " WHERE `rank` <=20 and `rank` > 0 GROUP BY classify_name, classify_type "
  131. sql += ` ORDER BY ` + orderStr
  132. o := orm.NewOrmUsingDB("data")
  133. _, err = o.Raw(sql).QueryRows(&list)
  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. o := orm.NewOrmUsingDB("data")
  180. _, err = o.Raw(sql, classifyName, classifyType, dataTime).QueryRows(&list)
  181. return
  182. }
  183. type OriginTradeData struct {
  184. Rank int `description:"排名"`
  185. CompanyName string `description:"期货公司名称"`
  186. Val int `description:"持仓量"`
  187. ValChange int `description:"持仓增减"`
  188. DataTime time.Time `description:"数据日期"`
  189. ClassifyName string `description:"品种名称"`
  190. ClassifyType string `description:"合约代码"`
  191. ValType int `description:"数据类型: 1-多单; 2-空单"`
  192. }
  193. // GetTradeDataByClassifyAndCompany 根据品种和公司名称获取持仓数据
  194. //func GetTradeDataByClassifyAndCompany(exchange string, classifyNames, contracts, companies []string, startDate, endDate time.Time) (items []*OriginTradeData, err error) {
  195. // if exchange == "" {
  196. // err = fmt.Errorf("数据表名称有误")
  197. // return
  198. // }
  199. // if len(contracts) == 0 || len(classifyNames) == 0 || len(companies) == 0 {
  200. // return
  201. // }
  202. // condBuy := fmt.Sprintf(`classify_name IN (%s) AND classify_type IN (%s)`, utils.GetOrmInReplace(len(classifyNames)), utils.GetOrmInReplace(len(contracts)))
  203. // parsBuy := make([]interface{}, 0)
  204. // parsBuy = append(parsBuy, classifyNames, contracts)
  205. //
  206. // condSold := fmt.Sprintf(`classify_name IN (%s) AND classify_type IN (%s)`, utils.GetOrmInReplace(len(classifyNames)), utils.GetOrmInReplace(len(contracts)))
  207. // parsSold := make([]interface{}, 0)
  208. // parsSold = append(parsSold, classifyNames, contracts)
  209. //
  210. // if !startDate.IsZero() && !endDate.IsZero() {
  211. // st := startDate.Format(utils.FormatDate)
  212. // ed := endDate.Format(utils.FormatDate)
  213. // condBuy += fmt.Sprintf(` AND (data_time BETWEEN ? AND ?)`)
  214. // parsBuy = append(parsBuy, st, ed)
  215. // condSold += fmt.Sprintf(` AND (data_time BETWEEN ? AND ?)`)
  216. // parsSold = append(parsSold, st, ed)
  217. // }
  218. //
  219. // // 是否含有TOP20
  220. // var hasTop bool
  221. // var condCompanies []string
  222. // for _, v := range companies {
  223. // if v == TradeFuturesCompanyTop20 {
  224. // hasTop = true
  225. // continue
  226. // }
  227. // condCompanies = append(condCompanies, v)
  228. // }
  229. // if !hasTop {
  230. // if len(condCompanies) == 0 {
  231. // err = fmt.Errorf("查询条件-期货公司异常")
  232. // return
  233. // }
  234. // condBuy += fmt.Sprintf(` AND buy_short_name IN (%s)`, utils.GetOrmInReplace(len(condCompanies)))
  235. // parsBuy = append(parsBuy, condCompanies)
  236. // condSold += fmt.Sprintf(` AND sold_short_name IN (%s)`, utils.GetOrmInReplace(len(condCompanies)))
  237. // parsSold = append(parsSold, condCompanies)
  238. // } else {
  239. // if len(condCompanies) > 0 {
  240. // condBuy += fmt.Sprintf(` AND (rank = 999 OR buy_short_name IN (%s))`, utils.GetOrmInReplace(len(condCompanies)))
  241. // condSold += fmt.Sprintf(` AND (rank = 999 OR sold_short_name IN (%s))`, utils.GetOrmInReplace(len(condCompanies)))
  242. // parsBuy = append(parsBuy, condCompanies)
  243. // parsSold = append(parsSold, condCompanies)
  244. // } else {
  245. // condBuy += ` AND rank = 999`
  246. // condSold += ` AND rank = 999`
  247. // }
  248. // }
  249. //
  250. // tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  251. // sql := `SELECT
  252. // rank,
  253. // buy_short_name AS company_name,
  254. // buy_value AS val,
  255. // buy_change AS val_change,
  256. // classify_name,
  257. // classify_type,
  258. // data_time,
  259. // 1 AS val_type
  260. // FROM
  261. // %s
  262. // WHERE
  263. // %s
  264. // UNION ALL
  265. // (
  266. // SELECT
  267. // rank,
  268. // sold_short_name,
  269. // sold_value,
  270. // sold_change,
  271. // classify_name,
  272. // classify_type,
  273. // data_time,
  274. // 2 AS val_type
  275. // FROM
  276. // %s
  277. // WHERE
  278. // %s
  279. // )`
  280. // sql = fmt.Sprintf(sql, tableName, condBuy, tableName, condSold)
  281. // o := orm.NewOrmUsingDB("data")
  282. // _, err = o.Raw(sql, parsBuy, parsSold).QueryRows(&items)
  283. // return
  284. //}
  285. // BaseFromTradeCommonIndex 郑商所/大商所/上期所/上期能源指标表通用字段
  286. type BaseFromTradeCommonIndex struct {
  287. Rank int `description:"排名"`
  288. DealShortName string `description:"成交量公司简称"`
  289. DealName string `description:"成交量指标名称"`
  290. DealCode string `description:"成交量指标编码"`
  291. DealValue int `description:"成交量"`
  292. DealChange int `description:"成交变化量"`
  293. BuyShortName string `description:"持买单量公司简称"`
  294. BuyName string `description:"持买单量指标名称"`
  295. BuyCode string `description:"持买单量指标编码"`
  296. BuyValue int `description:"持买单量"`
  297. BuyChange int `description:"持买单量变化量"`
  298. SoldShortName string `description:"持卖单量公司简称"`
  299. SoldName string `description:"持卖单量指标名称"`
  300. SoldCode string `description:"持卖单量指标编码"`
  301. SoldValue int `description:"持卖单量"`
  302. SoldChange int `description:"持卖单变化量"`
  303. Frequency string `description:"频度"`
  304. ClassifyName string `description:"品种"`
  305. ClassifyType string `description:"合约"`
  306. CreateTime time.Time `description:"创建时间"`
  307. ModifyTime time.Time `description:"更新时间"`
  308. DataTime time.Time `description:"数据日期"`
  309. }
  310. // GetTradeDataByContracts 根据合约获取持仓数据
  311. func GetTradeDataByContracts(exchange string, classifyNames, contracts []string, startDate, endDate time.Time) (items []*BaseFromTradeCommonIndex, err error) {
  312. if exchange == "" {
  313. err = fmt.Errorf("数据表名称有误")
  314. return
  315. }
  316. var cond string
  317. var pars []interface{}
  318. if len(classifyNames) > 0 {
  319. cond += fmt.Sprintf(` AND classify_name IN (%s)`, utils.GetOrmInReplace(len(classifyNames)))
  320. pars = append(pars, classifyNames)
  321. }
  322. if len(contracts) > 0 {
  323. cond += fmt.Sprintf(` AND classify_type IN (%s)`, utils.GetOrmInReplace(len(contracts)))
  324. pars = append(pars, contracts)
  325. }
  326. if !startDate.IsZero() && !endDate.IsZero() {
  327. cond += ` AND (data_time BETWEEN ? AND ?)`
  328. pars = append(pars, startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
  329. }
  330. fields := []string{"rank", "buy_short_name", "buy_value", "buy_change", "sold_short_name", "sold_value", "sold_change", "classify_name", "classify_type", "data_time"}
  331. tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  332. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s ORDER BY data_time DESC`, strings.Join(fields, ","), tableName, cond)
  333. _, err = orm.NewOrmUsingDB("data").Raw(sql, pars).QueryRows(&items)
  334. return
  335. }
  336. // GetZhengzhouTradeDataByContracts 郑商所-根据合约获取持仓数据
  337. func GetZhengzhouTradeDataByContracts(classifyNames []string, startDate, endDate time.Time) (items []*BaseFromTradeCommonIndex, err error) {
  338. var cond string
  339. var pars []interface{}
  340. if len(classifyNames) > 0 {
  341. cond += fmt.Sprintf(` AND classify_name IN (%s)`, utils.GetOrmInReplace(len(classifyNames)))
  342. pars = append(pars, classifyNames)
  343. }
  344. if !startDate.IsZero() && !endDate.IsZero() {
  345. cond += ` AND (data_time BETWEEN ? AND ?)`
  346. pars = append(pars, startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
  347. }
  348. // ps.classify_name实为合约代码
  349. fields := []string{"rank", "buy_short_name", "buy_value", "buy_change", "sold_short_name", "sold_value", "sold_change", "classify_name AS classify_type", "data_time"}
  350. sql := fmt.Sprintf(`SELECT %s FROM base_from_trade_zhengzhou_index WHERE 1=1 %s ORDER BY data_time DESC`, strings.Join(fields, ","), cond)
  351. _, err = orm.NewOrmUsingDB("data").Raw(sql, pars).QueryRows(&items)
  352. return
  353. }
  354. // GetTradeZhengzhouDataByClassifyAndCompany 郑商所-根据品种和公司名称获取持仓数据
  355. //func GetTradeZhengzhouDataByClassifyAndCompany(exchange string, contracts, companies []string) (items []*OriginTradeData, err error) {
  356. // if exchange == "" {
  357. // err = fmt.Errorf("数据表名称有误")
  358. // return
  359. // }
  360. // if len(contracts) == 0 || len(companies) == 0 {
  361. // return
  362. // }
  363. // condBuy := fmt.Sprintf(`classify_name IN (%s)`, utils.GetOrmInReplace(len(contracts)))
  364. // parsBuy := make([]interface{}, 0)
  365. // parsBuy = append(parsBuy, contracts)
  366. //
  367. // condSold := fmt.Sprintf(`classify_name IN (%s)`, utils.GetOrmInReplace(len(contracts)))
  368. // parsSold := make([]interface{}, 0)
  369. // parsSold = append(parsSold, contracts)
  370. //
  371. // // 是否含有TOP20
  372. // var hasTop bool
  373. // var condCompanies []string
  374. // for _, v := range companies {
  375. // if v == TradeFuturesCompanyTop20 {
  376. // hasTop = true
  377. // continue
  378. // }
  379. // condCompanies = append(condCompanies, v)
  380. // }
  381. // if !hasTop {
  382. // if len(condCompanies) == 0 {
  383. // err = fmt.Errorf("查询条件-期货公司异常")
  384. // return
  385. // }
  386. // condBuy += fmt.Sprintf(` AND buy_short_name IN (%s)`, utils.GetOrmInReplace(len(condCompanies)))
  387. // parsBuy = append(parsBuy, condCompanies)
  388. // condSold += fmt.Sprintf(` AND sold_short_name IN (%s)`, utils.GetOrmInReplace(len(condCompanies)))
  389. // parsSold = append(parsSold, condCompanies)
  390. // } else {
  391. // if len(condCompanies) > 0 {
  392. // condBuy += fmt.Sprintf(` AND (rank = 999 OR buy_short_name IN (%s))`, utils.GetOrmInReplace(len(condCompanies)))
  393. // condSold += fmt.Sprintf(` AND (rank = 999 OR sold_short_name IN (%s))`, utils.GetOrmInReplace(len(condCompanies)))
  394. // parsBuy = append(parsBuy, condCompanies)
  395. // parsSold = append(parsSold, condCompanies)
  396. // } else {
  397. // condBuy += ` AND rank = 999`
  398. // condSold += ` AND rank = 999`
  399. // }
  400. // }
  401. //
  402. // tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  403. // sql := `SELECT
  404. // rank,
  405. // buy_short_name AS company_name,
  406. // buy_value AS val,
  407. // buy_change AS val_change,
  408. // classify_name AS classify_type,
  409. // data_time,
  410. // 1 AS val_type
  411. // FROM
  412. // %s
  413. // WHERE
  414. // %s
  415. // UNION ALL
  416. // (
  417. // SELECT
  418. // rank,
  419. // sold_short_name,
  420. // sold_value,
  421. // sold_change,
  422. // classify_name AS classify_type,
  423. // data_time,
  424. // 2 AS val_type
  425. // FROM
  426. // %s
  427. // WHERE
  428. // %s
  429. // )`
  430. // sql = fmt.Sprintf(sql, tableName, condBuy, tableName, condSold)
  431. // o := orm.NewOrmUsingDB("data")
  432. // _, err = o.Raw(sql, parsBuy, parsSold).QueryRows(&items)
  433. // return
  434. //}
  435. // ContractCompanyTradeData [合约-期货公司]持仓数据
  436. type ContractCompanyTradeData struct {
  437. Exchange string `description:"交易所"`
  438. ClassifyName string `description:"品种"`
  439. ClassifyType string `description:"合约代码"`
  440. CompanyName string `description:"期货公司名称"`
  441. IsTotal bool `description:"是否为合约加总"`
  442. StartDate time.Time `description:"数据开始日期"`
  443. EndDate time.Time `description:"数据结束日期"`
  444. DataList []*ContractCompanyTradeDataList `description:"数据序列"`
  445. }
  446. // ContractCompanyTradeDataList [合约-期货公司]持仓数据详情
  447. type ContractCompanyTradeDataList struct {
  448. Date time.Time `description:"数据日期"`
  449. BuyVal int `description:"多单持仓量"`
  450. BuyValType int `description:"多单数据类型: 0-无值; 1-原始值; 2-推算值"`
  451. BuyChange int `description:"多单持仓增减"`
  452. BuyChangeType int `description:"多单持仓增减类型: 0-无值; 1-原始值; 2-推算值"`
  453. SoldVal int `description:"空单持仓量"`
  454. SoldValType int `description:"空单数据类型: 0-无值; 1-原始值; 2-推算值"`
  455. SoldChange int `description:"空单持仓增减"`
  456. SoldChangeType int `description:"空单持仓增减类型: 0-无值; 1-原始值; 2-推算值"`
  457. PureBuyVal int `description:"净多单持仓量"`
  458. PureBuyValType int `description:"净多单数据类型: 0-无值; 1-原始值; 2-推算值"`
  459. PureBuyChange int `description:"净多单持仓增减"`
  460. PureBuyChangeType int `description:"净多单持仓增减类型: 0-无值; 1-原始值; 2-推算值"`
  461. }
  462. // GetLastTradeDataByClassify 获取[合约]末位多空单数据
  463. //func GetLastTradeDataByClassify(exchange string, classifyNames, contracts []string) (items []*OriginTradeData, err error) {
  464. // if exchange == "" {
  465. // err = fmt.Errorf("数据表名称有误")
  466. // return
  467. // }
  468. // if len(classifyNames) == 0 || len(contracts) == 0 {
  469. // return
  470. // }
  471. // classifyReplacer := utils.GetOrmInReplace(len(classifyNames))
  472. // contractReplacer := utils.GetOrmInReplace(len(contracts))
  473. //
  474. // tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  475. // sql := `SELECT
  476. // tpt.rank,
  477. // tpt.buy_short_name AS company_name,
  478. // tpt.buy_value AS val,
  479. // tpt.buy_change AS val_change,
  480. // tpt.classify_name,
  481. // tpt.classify_type,
  482. // tpt.data_time,
  483. // 1 AS val_type
  484. // FROM
  485. // %s tpt
  486. // JOIN
  487. // (
  488. // SELECT
  489. // data_time, classify_type, MAX(rank) AS max_rank
  490. // FROM
  491. // %s
  492. // WHERE
  493. // classify_name IN (%s) AND classify_type IN (%s) AND buy_short_name <> ''
  494. // GROUP BY
  495. // data_time,
  496. // classify_type
  497. // ) sub
  498. // ON
  499. // tpt.data_time = sub.data_time AND tpt.classify_type = sub.classify_type AND tpt.rank = sub.max_rank
  500. // WHERE
  501. // tpt.classify_name IN (%s) AND tpt.classify_type IN (%s)
  502. // UNION ALL
  503. // (
  504. // SELECT
  505. // 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
  506. // FROM
  507. // %s tpt
  508. // JOIN
  509. // (
  510. // SELECT
  511. // data_time, classify_type, MAX(rank) AS max_rank
  512. // FROM
  513. // %s
  514. // WHERE
  515. // classify_name IN (%s) AND classify_type IN (%s) AND sold_short_name <> ''
  516. // GROUP BY
  517. // data_time, classify_type
  518. // ) sub
  519. // ON
  520. // tpt.data_time = sub.data_time AND tpt.classify_type = sub.classify_type AND tpt.rank = sub.max_rank
  521. // WHERE
  522. // tpt.classify_name IN (%s) AND tpt.classify_type IN (%s)
  523. // )`
  524. // sql = fmt.Sprintf(sql, tableName, tableName, classifyReplacer, contractReplacer, classifyReplacer, contractReplacer, tableName, tableName, classifyReplacer, contractReplacer, classifyReplacer, contractReplacer)
  525. // o := orm.NewOrmUsingDB("data")
  526. // _, err = o.Raw(sql, classifyNames, contracts, classifyNames, contracts, classifyNames, contracts, classifyNames, contracts).QueryRows(&items)
  527. // return
  528. //}
  529. // GetLastTradeZhengzhouDataByClassify 郑商所-获取[合约]末位多空单数据
  530. //func GetLastTradeZhengzhouDataByClassify(exchange string, contracts []string) (items []*OriginTradeData, err error) {
  531. // if exchange == "" {
  532. // err = fmt.Errorf("数据表名称有误")
  533. // return
  534. // }
  535. // if len(contracts) == 0 {
  536. // return
  537. // }
  538. // contractReplacer := utils.GetOrmInReplace(len(contracts))
  539. //
  540. // tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  541. // sql := `SELECT
  542. // tpt.rank,
  543. // tpt.buy_short_name AS company_name,
  544. // tpt.buy_value AS val,
  545. // tpt.buy_change AS val_change,
  546. // tpt.classify_name AS classify_type,
  547. // tpt.data_time,
  548. // 1 AS val_type
  549. // FROM
  550. // %s tpt
  551. // JOIN
  552. // (
  553. // SELECT
  554. // data_time, classify_name, MAX(rank) AS max_rank
  555. // FROM
  556. // %s
  557. // WHERE
  558. // classify_name IN (%s) AND buy_short_name <> ''
  559. // GROUP BY
  560. // data_time,
  561. // classify_name
  562. // ) sub
  563. // ON
  564. // tpt.data_time = sub.data_time AND tpt.classify_name = sub.classify_name AND tpt.rank = sub.max_rank
  565. // WHERE
  566. // tpt.classify_name IN (%s)
  567. // UNION ALL
  568. // (
  569. // SELECT
  570. // 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
  571. // FROM
  572. // %s tpt
  573. // JOIN
  574. // (
  575. // SELECT
  576. // data_time, classify_name, MAX(rank) AS max_rank
  577. // FROM
  578. // %s
  579. // WHERE
  580. // classify_name IN (%s) AND sold_short_name <> ''
  581. // GROUP BY
  582. // data_time, classify_name
  583. // ) sub
  584. // ON
  585. // tpt.data_time = sub.data_time AND tpt.classify_name = sub.classify_name AND tpt.rank = sub.max_rank
  586. // WHERE
  587. // tpt.classify_name IN (%s)
  588. // )`
  589. // sql = fmt.Sprintf(sql, tableName, tableName, contractReplacer, contractReplacer, tableName, tableName, contractReplacer, contractReplacer)
  590. // o := orm.NewOrmUsingDB("data")
  591. // _, err = o.Raw(sql, contracts, contracts, contracts, contracts).QueryRows(&items)
  592. // return
  593. //}
  594. type BaseFromTradeGuangzhouIndex struct {
  595. BaseFromTradeGuangzhouIndexId int `orm:"column(base_from_trade_guangzhou_index_id);pk"`
  596. BaseFromTradeGuangzhouClassifyId int `description:"分类id"`
  597. IndexCode string `description:"指标编码"`
  598. IndexName string `description:"指标名称"`
  599. Frequency string `description:"频率"`
  600. Unit string `description:"单位"`
  601. StartDate string `description:"开始日期"`
  602. EndDate string `description:"结束日期"`
  603. CreateTime time.Time `description:"创建日期"`
  604. ModifyTime time.Time `description:"修改日期"`
  605. }
  606. //func GetBaseFromTradeGuangzhouIndexByClassifyId(classifyId int, contractIds []int) (list []*BaseFromTradeGuangzhouIndex, err error) {
  607. // o := orm.NewOrmUsingDB("data")
  608. // cond := ` base_from_trade_guangzhou_classify_id = ?`
  609. // pars := make([]interface{}, 0)
  610. // pars = append(pars, classifyId)
  611. // if len(contractIds) > 0 {
  612. // cond += fmt.Sprintf(` AND base_from_trade_guangzhou_contract_id IN (%s)`, utils.GetOrmInReplace(len(contractIds)))
  613. // pars = append(pars, contractIds)
  614. // }
  615. // sql := fmt.Sprintf(`SELECT * FROM base_from_trade_guangzhou_index WHERE 1=1 %s `, cond)
  616. // _, err = o.Raw(sql, pars).QueryRows(&list)
  617. // return
  618. //}
  619. func GetBaseFromTradeGuangzhouIndex(classifyIds []int, contracts []string, indexKeyword string) (list []*BaseFromTradeGuangzhouIndex, err error) {
  620. o := orm.NewOrmUsingDB("data")
  621. cond := ``
  622. pars := make([]interface{}, 0)
  623. if len(classifyIds) > 0 {
  624. cond += fmt.Sprintf(` AND b.base_from_trade_guangzhou_classify_id IN (%s)`, utils.GetOrmInReplace(len(classifyIds)))
  625. pars = append(pars, classifyIds)
  626. }
  627. if len(contracts) > 0 {
  628. cond += fmt.Sprintf(` AND b.contract IN (%s)`, utils.GetOrmInReplace(len(contracts)))
  629. pars = append(pars, contracts)
  630. }
  631. if indexKeyword != "" {
  632. cond += fmt.Sprintf(` AND a.index_name LIKE ?`)
  633. pars = append(pars, indexKeyword)
  634. }
  635. sql := `SELECT a.* FROM base_from_trade_guangzhou_index AS a
  636. JOIN base_from_trade_guangzhou_contract AS b ON a.base_from_trade_guangzhou_contract_id = b.base_from_trade_guangzhou_contract_id
  637. WHERE 1=1 %s`
  638. sql = fmt.Sprintf(sql, cond)
  639. _, err = o.Raw(sql, pars).QueryRows(&list)
  640. return
  641. }
  642. type BaseFromTradeGuangzhouData struct {
  643. BaseFromTradeGuangzhouDataId int `orm:"column(base_from_trade_guangzhou_data_id);pk"`
  644. BaseFromTradeGuangzhouIndexId int `description:"指标id"`
  645. IndexCode string `description:"指标编码"`
  646. DataTime time.Time `description:"数据日期"`
  647. Value float64 `description:"数据值"`
  648. QtySub float64 `description:"增减"`
  649. CreateTime time.Time `description:"创建日期"`
  650. ModifyTime time.Time `description:"修改日期"`
  651. }
  652. // GetBaseFromTradeGuangzhouDataByIndexIds 广期所-获取指标数据
  653. func GetBaseFromTradeGuangzhouDataByIndexIds(indexIds []int, startDate, endDate time.Time) (list []*BaseFromTradeGuangzhouData, err error) {
  654. if len(indexIds) == 0 {
  655. return
  656. }
  657. cond := fmt.Sprintf(` AND base_from_trade_guangzhou_index_id IN (%s)`, utils.GetOrmInReplace(len(indexIds)))
  658. pars := make([]interface{}, 0)
  659. pars = append(pars, indexIds)
  660. if !startDate.IsZero() && !endDate.IsZero() {
  661. if startDate.Equal(endDate) {
  662. cond += ` AND data_time = ?`
  663. pars = append(pars, startDate.Format(utils.FormatDate))
  664. }
  665. if !startDate.Equal(endDate) {
  666. cond += ` AND (data_time BETWEEN ? AND ?)`
  667. pars = append(pars, startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
  668. }
  669. }
  670. sql := fmt.Sprintf(`SELECT * FROM base_from_trade_guangzhou_data WHERE 1=1 %s ORDER BY base_from_trade_guangzhou_index_id`, cond)
  671. _, err = orm.NewOrmUsingDB("data").Raw(sql, pars).QueryRows(&list)
  672. return
  673. }
  674. // GetBaseFromTradeGuangzhouMinDataByIndexIds 获取指标中的末位数据
  675. //func GetBaseFromTradeGuangzhouMinDataByIndexIds(indexIds []int) (list []*BaseFromTradeGuangzhouData, err error) {
  676. // indexLen := len(indexIds)
  677. // if indexLen == 0 {
  678. // return
  679. // }
  680. // o := orm.NewOrmUsingDB("data")
  681. // sql := fmt.Sprintf(`SELECT
  682. // t1.data_time,
  683. // t1.min_value AS value
  684. // FROM
  685. // (
  686. // SELECT
  687. // data_time,
  688. // MIN(value) AS min_value
  689. // FROM
  690. // base_from_trade_guangzhou_data
  691. // WHERE
  692. // base_from_trade_guangzhou_index_id IN (%s)
  693. // GROUP BY
  694. // data_time
  695. // ) t1
  696. // JOIN
  697. // base_from_trade_guangzhou_data t2
  698. // ON
  699. // t1.data_time = t2.data_time AND t1.min_value = t2.value AND t2.base_from_trade_guangzhou_index_id IN (%s)
  700. // GROUP BY
  701. // t1.data_time`, utils.GetOrmInReplace(indexLen), utils.GetOrmInReplace(indexLen))
  702. // _, err = o.Raw(sql, indexIds, indexIds).QueryRows(&list)
  703. // return
  704. //}
  705. // ContractTopRankData TOP20合约排名数据
  706. type ContractTopRankData struct {
  707. Exchange string `description:"交易所"`
  708. DealValue int `description:"成交量"`
  709. BuyValue int `description:"多单持仓量"`
  710. BuyChange int `description:"多单变化"`
  711. SoldValue int `description:"空单持仓量"`
  712. SoldChange int `description:"空单变化"`
  713. PureBuyValue int `description:"净多单持仓量"`
  714. PureBuyChange int `description:"净多单变化"`
  715. ClassifyName string `description:"品种名称"`
  716. ClassifyType string `description:"合约代码"`
  717. DataTime time.Time `description:"数据日期"`
  718. }
  719. // GetContractTopRankData 获取合约TOP20根据当日成交量排名
  720. func GetContractTopRankData(exchange string, classifyNames []string, dataDate time.Time) (items []*ContractTopRankData, err error) {
  721. if exchange == "" {
  722. err = fmt.Errorf("数据表名称有误")
  723. return
  724. }
  725. if len(classifyNames) == 0 {
  726. return
  727. }
  728. tableName := fmt.Sprintf("base_from_trade_%s_index", exchange)
  729. // 大商所存在TOP20的rank=0
  730. queryRank := ` rank = 999`
  731. if exchange == TradeExchangeDalian {
  732. queryRank = ` (rank = 999 OR rank = 0)`
  733. }
  734. sql := `SELECT * FROM %s WHERE data_time = ? AND classify_name IN (%s) AND %s GROUP BY classify_type ORDER BY deal_value DESC`
  735. sql = fmt.Sprintf(sql, tableName, utils.GetOrmInReplace(len(classifyNames)), queryRank)
  736. _, err = orm.NewOrmUsingDB("data").Raw(sql, dataDate.Format(utils.FormatDate), classifyNames).QueryRows(&items)
  737. return
  738. }
  739. // GetZhengzhouContractTopRankData 郑商所-获取合约根据当日成交量排名
  740. func GetZhengzhouContractTopRankData(classifyNames []string, dataDate time.Time) (items []*ContractTopRankData, err error) {
  741. if len(classifyNames) == 0 {
  742. return
  743. }
  744. 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`
  745. sql = fmt.Sprintf(sql, utils.GetOrmInReplace(len(classifyNames)))
  746. _, err = orm.NewOrmUsingDB("data").Raw(sql, dataDate.Format(utils.FormatDate), classifyNames).QueryRows(&items)
  747. return
  748. }
  749. // ContractCompanyTradeEdb [合约-期货公司]指标
  750. type ContractCompanyTradeEdb struct {
  751. Exchange string `description:"交易所"`
  752. ClassifyName string `description:"品种"`
  753. ClassifyType string `description:"合约代码"`
  754. CompanyName string `description:"期货公司名称"`
  755. IsTotal bool `description:"是否为合约加总"`
  756. ContractPosition int `description:"合约方向"`
  757. StartDate time.Time `description:"数据开始日期"`
  758. EndDate time.Time `description:"数据结束日期"`
  759. DataList []*ContractCompanyTradeEdbData `description:"数据序列"`
  760. }
  761. // ContractCompanyTradeEdbData [合约-期货公司]指标数据
  762. type ContractCompanyTradeEdbData struct {
  763. DataTime time.Time `description:"数据日期"`
  764. Val int `description:"数据值"`
  765. }
  766. // ContractCompanyTradeEdbData [合约-期货公司]指标数据
  767. //type ContractCompanyTradeEdbData struct {
  768. // DataTime time.Time `description:"数据日期"`
  769. // Val int `description:"数据值"`
  770. //}