trade_analysis_interface.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package trade_analysis
  2. import (
  3. tradeAnalysisModel "eta/eta_api/models/data_manage/trade_analysis"
  4. "eta/eta_api/utils"
  5. "fmt"
  6. "strconv"
  7. "strings"
  8. )
  9. // TradeAnalysisInterface 持仓分析查询接口
  10. type TradeAnalysisInterface interface {
  11. GetTradeDataByClassifyAndCompany(exchange, classifyName string, contracts, queryCompanies []string) (items []*tradeAnalysisModel.OriginTradeData, err error) // 根据品种和公司获取原始数据
  12. GetLastTradeDataByClassify(exchange, classifyName string, contracts []string) (items []*tradeAnalysisModel.OriginTradeData, err error) // 获取品种末位数据
  13. }
  14. // BaseTradeAnalysis 通用交易所
  15. type BaseTradeAnalysis struct{}
  16. func (b *BaseTradeAnalysis) GetTradeDataByClassifyAndCompany(exchange, classifyName string, contracts, queryCompanies []string) (items []*tradeAnalysisModel.OriginTradeData, err error) {
  17. return tradeAnalysisModel.GetTradeDataByClassifyAndCompany(exchange, classifyName, contracts, queryCompanies)
  18. }
  19. func (b *BaseTradeAnalysis) GetLastTradeDataByClassify(exchange, classifyName string, contracts []string) (items []*tradeAnalysisModel.OriginTradeData, err error) {
  20. return tradeAnalysisModel.GetLastTradeDataByClassify(exchange, classifyName, contracts)
  21. }
  22. // GuangzhouTradeAnalysis 广期所
  23. type GuangzhouTradeAnalysis struct{}
  24. func (g *GuangzhouTradeAnalysis) GetTradeDataByClassifyAndCompany(exchange, classifyName string, contracts, queryCompanies []string) (items []*tradeAnalysisModel.OriginTradeData, err error) {
  25. classifyIdMap := map[string]int{"si": 7, "lc": 8}
  26. classifyId := classifyIdMap[classifyName]
  27. if classifyId == 0 {
  28. err = fmt.Errorf("品种有误")
  29. return
  30. }
  31. // TOP20
  32. seatNameArr := []string{tradeAnalysisModel.GuangZhouSeatNameBuy, tradeAnalysisModel.GuangZhouSeatNameSold}
  33. if utils.InArrayByStr(queryCompanies, tradeAnalysisModel.TradeFuturesCompanyTop20) {
  34. seatNameArr = append(seatNameArr, tradeAnalysisModel.GuangZhouTopSeatNameBuy, tradeAnalysisModel.GuangZhouTopSeatNameSold)
  35. }
  36. // 查询品种下所有指标
  37. indexes, e := tradeAnalysisModel.GetBaseFromTradeGuangzhouIndexByClassifyId(classifyId)
  38. if e != nil {
  39. err = fmt.Errorf("获取广期所指标失败, %v", e)
  40. return
  41. }
  42. var indexIds []int
  43. indexInfo := make(map[int]*tradeAnalysisModel.OriginTradeData)
  44. for _, v := range indexes {
  45. // eg.永安期货_si2401_持买单量
  46. nameArr := strings.Split(v.IndexName, "_")
  47. if len(nameArr) != 3 {
  48. continue
  49. }
  50. companyName := nameArr[0]
  51. if nameArr[0] == tradeAnalysisModel.GuangZhouTopCompanyAliasName {
  52. companyName = tradeAnalysisModel.TradeFuturesCompanyTop20
  53. }
  54. if !utils.InArrayByStr(seatNameArr, nameArr[2]) {
  55. continue
  56. }
  57. if !utils.InArrayByStr(queryCompanies, companyName) {
  58. continue
  59. }
  60. if !utils.InArrayByStr(contracts, nameArr[1]) {
  61. continue
  62. }
  63. indexIds = append(indexIds, v.BaseFromTradeGuangzhouIndexId)
  64. if indexInfo[v.BaseFromTradeGuangzhouIndexId] == nil {
  65. if tradeAnalysisModel.GuangzhouSeatNameValType[nameArr[2]] == 0 {
  66. continue
  67. }
  68. indexInfo[v.BaseFromTradeGuangzhouIndexId] = new(tradeAnalysisModel.OriginTradeData)
  69. indexInfo[v.BaseFromTradeGuangzhouIndexId].CompanyName = companyName
  70. indexInfo[v.BaseFromTradeGuangzhouIndexId].ClassifyName = classifyName
  71. indexInfo[v.BaseFromTradeGuangzhouIndexId].ClassifyType = nameArr[1]
  72. indexInfo[v.BaseFromTradeGuangzhouIndexId].ValType = tradeAnalysisModel.GuangzhouSeatNameValType[nameArr[2]]
  73. }
  74. }
  75. if len(indexIds) == 0 {
  76. return
  77. }
  78. // 查询指标数据
  79. indexesData, e := tradeAnalysisModel.GetBaseFromTradeGuangzhouDataByIndexIds(indexIds)
  80. if e != nil {
  81. err = fmt.Errorf("获取广期所指标数据失败, %v", e)
  82. return
  83. }
  84. items = make([]*tradeAnalysisModel.OriginTradeData, 0)
  85. for _, v := range indexesData {
  86. info, ok := indexInfo[v.BaseFromTradeGuangzhouIndexId]
  87. if !ok {
  88. continue
  89. }
  90. items = append(items, &tradeAnalysisModel.OriginTradeData{
  91. CompanyName: info.CompanyName,
  92. Val: int(v.Value),
  93. ValChange: int(v.QtySub),
  94. DataTime: v.DataTime,
  95. ClassifyName: info.ClassifyName,
  96. ClassifyType: info.ClassifyType,
  97. ValType: info.ValType,
  98. })
  99. }
  100. return
  101. }
  102. func (g *GuangzhouTradeAnalysis) GetLastTradeDataByClassify(exchange, classifyName string, contracts []string) (items []*tradeAnalysisModel.OriginTradeData, err error) {
  103. classifyIdMap := map[string]int{"si": 7, "lc": 8}
  104. classifyId := classifyIdMap[classifyName]
  105. if classifyId == 0 {
  106. err = fmt.Errorf("品种有误")
  107. return
  108. }
  109. seatNameArr := []string{tradeAnalysisModel.GuangZhouSeatNameBuy, tradeAnalysisModel.GuangZhouSeatNameSold}
  110. // 查询品种下所有指标
  111. indexes, e := tradeAnalysisModel.GetBaseFromTradeGuangzhouIndexByClassifyId(classifyId)
  112. if e != nil {
  113. err = fmt.Errorf("获取广期所指标失败, %v", e)
  114. return
  115. }
  116. // 获取各合约下的指标
  117. contractIndexIds := make(map[string][]int)
  118. for _, v := range indexes {
  119. // eg.永安期货_si2401_持买单量
  120. nameArr := strings.Split(v.IndexName, "_")
  121. if len(nameArr) != 3 {
  122. continue
  123. }
  124. if !utils.InArrayByStr(contracts, nameArr[1]) {
  125. continue
  126. }
  127. if !utils.InArrayByStr(seatNameArr, nameArr[2]) {
  128. continue
  129. }
  130. if tradeAnalysisModel.GuangzhouSeatNameValType[nameArr[2]] == 0 {
  131. continue
  132. }
  133. k := fmt.Sprintf("%s-%d", nameArr[1], tradeAnalysisModel.GuangzhouSeatNameValType[nameArr[2]])
  134. contractIndexIds[k] = append(contractIndexIds[k], v.BaseFromTradeGuangzhouIndexId)
  135. }
  136. // ps.如果后面如果有空可以优化一下这里, 把末位数据每天写进一张表里面
  137. for k, v := range contractIndexIds {
  138. keyArr := strings.Split(k, "-")
  139. contract := keyArr[0]
  140. valType, _ := strconv.Atoi(keyArr[1])
  141. lastVales, e := tradeAnalysisModel.GetBaseFromTradeGuangzhouMinDataByIndexIds(v)
  142. if e != nil {
  143. err = fmt.Errorf("获取合约末位数据失败, %v", e)
  144. return
  145. }
  146. for _, vv := range lastVales {
  147. items = append(items, &tradeAnalysisModel.OriginTradeData{
  148. Val: int(vv.Value),
  149. DataTime: vv.DataTime,
  150. ClassifyType: contract,
  151. ValType: valType,
  152. })
  153. }
  154. }
  155. return
  156. }