commodity_trade_cffex.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package services
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "hongze/hongze_data_crawler/models"
  6. "hongze/hongze_data_crawler/utils"
  7. "rdluck_tools/http"
  8. "strconv"
  9. "time"
  10. )
  11. type XmlItem struct {
  12. XMLName xml.Name `xml:"positionRank"`
  13. Data []struct {
  14. ContractCode string `xml:"instrumentid"`
  15. Value string `xml:"Value,attr"`
  16. Text string `xml:"Text,attr"`
  17. Tradingday string `xml:"tradingday"`
  18. Datatypeid string `xml:"datatypeid"`
  19. Rank int `xml:"rank"`
  20. ShortName string `xml:"shortname"`
  21. Volume int `xml:"volume"`
  22. Varvolume int `xml:"varvolume"`
  23. ProductId string `xml:"productid"`
  24. } `xml:"data"`
  25. }
  26. var cffexIndexCode string
  27. var cffexIndexCodeMap = make(map[string]string)
  28. var cffexActionCodeMap = make(map[string]map[string]int)
  29. func cffexIndexCodeGenerator(indexName, suffix string) string {
  30. cffexIndexCode, _ := cffexIndexCodeMap[indexName]
  31. if cffexIndexCode == "" {
  32. cffexIndexCode = fmt.Sprintf("CFFEX%s", time.Now().Format(utils.FormatDateTimeUnSpace)+strconv.Itoa(utils.GetRandInt(1, 100))+suffix)
  33. cffexIndexCodeMap[indexName] = cffexIndexCode
  34. err := models.AddBaseFromTradeMapping(indexName, cffexIndexCode, "CFFEX")
  35. if err != nil {
  36. fmt.Println("add Code err:", err)
  37. }
  38. }
  39. return cffexIndexCode
  40. }
  41. // SyncRankingFromCffex 中国金融期货交易所
  42. func SyncRankingFromCffex() {
  43. for i := 2; i > 0; i-- {
  44. zzUrl := "http://www.cffex.com.cn/sj/ccpm/%s/%s/"
  45. date := time.Now().AddDate(0, 0, -i)
  46. dateStr := date.Format(utils.FormatDateUnSpace)
  47. pre := dateStr[:6]
  48. sub := dateStr[6:]
  49. zzUrl = fmt.Sprintf(zzUrl, pre, sub)
  50. fmt.Println(zzUrl)
  51. var xmlItems = make([]*XmlItem, 6)
  52. xmlItems[0] = GetXmlItem(zzUrl, "IF")
  53. xmlItems[1] = GetXmlItem(zzUrl, "IC")
  54. xmlItems[2] = GetXmlItem(zzUrl, "IH")
  55. xmlItems[3] = GetXmlItem(zzUrl, "TS")
  56. xmlItems[4] = GetXmlItem(zzUrl, "TF")
  57. xmlItems[5] = GetXmlItem(zzUrl, "T")
  58. //获取新的指标信息
  59. var sRank string
  60. //获取所有指标信息
  61. allIndex, err := models.GetBaseFromTradeCffexIndexAll(dateStr)
  62. if err != nil {
  63. fmt.Println("select err:", err)
  64. }
  65. existDealMap := make(map[string]int)
  66. existBuyMap := make(map[string]int)
  67. existSoldMap := make(map[string]int)
  68. for _, v := range allIndex {
  69. existDealMap[v.DealName] = v.BaseFromTradeCffexIndexId
  70. existBuyMap[v.BuyName] = v.BaseFromTradeCffexIndexId
  71. existSoldMap[v.SoldName] = v.BaseFromTradeCffexIndexId
  72. sRank = fmt.Sprintf("%d", v.Rank)
  73. cffexActionCodeMap[sRank+v.ClassifyType] = map[string]int{"0": v.DealValue, "1": v.BuyValue, "2": v.SoldValue, "id": v.BaseFromTradeCffexIndexId}
  74. }
  75. shortNameColum := map[string]string{"0": "deal_short_name", "1": "buy_short_name", "2": "sold_short_name"}
  76. nameColum := map[string]string{"0": "deal_name", "1": "buy_name", "2": "sold_name"}
  77. codeColum := map[string]string{"0": "deal_code", "1": "buy_code", "2": "sold_code"}
  78. valueColum := map[string]string{"0": "deal_value", "1": "buy_value", "2": "sold_value"}
  79. changeColum := map[string]string{"0": "deal_change", "1": "buy_change", "2": "sold_change"}
  80. var dataName string
  81. var dataCode string
  82. var indexKey string
  83. for _, xmlItem := range xmlItems {
  84. for _, i := range xmlItem.Data {
  85. var item = new(models.BaseFromTradeCffexIndex)
  86. item.Rank = i.Rank
  87. switch i.Value {
  88. case "0":
  89. item.DealShortName = i.ShortName
  90. item.DealName = fmt.Sprintf("%s", i.ShortName+"_成交量_"+i.ContractCode)
  91. item.DealCode = cffexIndexCodeGenerator(item.DealName, "deal")
  92. item.DealValue = i.Volume
  93. item.DealChange = i.Varvolume
  94. dataName = item.DealName
  95. dataCode = item.DealCode
  96. case "1":
  97. item.BuyShortName = i.ShortName
  98. item.BuyName = fmt.Sprintf("%s", i.ShortName+"_持买单量_"+i.ContractCode)
  99. item.BuyCode = cffexIndexCodeGenerator(item.BuyName, "buy")
  100. item.BuyValue = i.Volume
  101. item.BuyChange = i.Varvolume
  102. dataName = item.BuyName
  103. dataCode = item.BuyCode
  104. case "2":
  105. item.SoldShortName = i.ShortName
  106. item.SoldName = fmt.Sprintf("%s", i.ShortName+"_持卖单量_"+i.ContractCode)
  107. item.SoldCode = cffexIndexCodeGenerator(item.SoldName, "sold")
  108. item.SoldValue = i.Volume
  109. item.SoldChange = i.Varvolume
  110. dataName = item.SoldName
  111. dataCode = item.SoldCode
  112. default:
  113. fmt.Println("No data value")
  114. }
  115. item.Frequency = "日度"
  116. item.ClassifyName = i.ProductId
  117. item.ClassifyType = i.ContractCode
  118. item.CreateTime = time.Now()
  119. item.ModifyTime = time.Now()
  120. item.DataTime = i.Tradingday
  121. valueMap := map[string]int{"0": item.DealValue, "1": item.BuyValue, "2": item.SoldValue}
  122. //检查在actionCodeMap中是否已经有了
  123. indexKey = fmt.Sprintf("%d", item.Rank) + item.ClassifyType
  124. if existMap, ok := cffexActionCodeMap[indexKey]; !ok {
  125. if _, ok := existDealMap[item.DealName]; !ok {
  126. if _, ok := existBuyMap[item.BuyName]; !ok {
  127. if _, ok := existSoldMap[item.SoldName]; !ok {
  128. //没有,新增
  129. newID, err := models.AddBaseFromTradeCffexIndex(item)
  130. if err != nil {
  131. fmt.Println("insert error:", err)
  132. }
  133. fmt.Println("insert new indexID:", newID)
  134. existMap = make(map[string]int)
  135. existMap[i.Value] = i.Volume
  136. existMap["id"] = int(newID)
  137. cffexActionCodeMap[indexKey] = existMap
  138. }
  139. }
  140. }
  141. } else if existMap != nil && existMap[i.Value] != i.Volume {
  142. //更新
  143. var columnList = [5]string{
  144. shortNameColum[i.Value],
  145. nameColum[i.Value],
  146. codeColum[i.Value],
  147. valueColum[i.Value],
  148. changeColum[i.Value],
  149. }
  150. var dataList = [5]interface{}{
  151. i.ShortName,
  152. dataName,
  153. dataCode,
  154. valueMap[i.Value],
  155. i.Varvolume,
  156. }
  157. err := models.ModifyBaseFromTradeCffexIndex(columnList, dataList, existMap["id"])
  158. if err != nil {
  159. fmt.Println("data update err:", err)
  160. }
  161. cffexActionCodeMap[indexKey][i.Value] = i.Volume
  162. }
  163. }
  164. }
  165. }
  166. }
  167. func GetXmlItem(url, contract string) *XmlItem {
  168. zzUrl := url + contract + ".xml"
  169. fmt.Println(zzUrl)
  170. body, err := http.Get(zzUrl)
  171. if err != nil {
  172. fmt.Println("err:", err)
  173. }
  174. xmlItem := new(XmlItem)
  175. err = xml.Unmarshal(body, &xmlItem)
  176. if err != nil {
  177. fmt.Println("xml.Unmarshal:", err.Error())
  178. }
  179. return xmlItem
  180. }