commodity_trade_cffex.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package services
  2. import (
  3. "encoding/xml"
  4. "eta/eta_crawler/models"
  5. "eta/eta_crawler/utils"
  6. "fmt"
  7. "github.com/mozillazg/go-pinyin"
  8. "github.com/rdlucklib/rdluck_tools/http"
  9. "strings"
  10. "time"
  11. )
  12. type XmlItem struct {
  13. XMLName xml.Name `xml:"positionRank"`
  14. Data []struct {
  15. ContractCode string `xml:"instrumentid"`
  16. Value string `xml:"Value,attr"`
  17. Text string `xml:"Text,attr"`
  18. Tradingday string `xml:"tradingday"`
  19. Datatypeid string `xml:"datatypeid"`
  20. Rank int `xml:"rank"`
  21. ShortName string `xml:"shortname"`
  22. Volume int `xml:"volume"`
  23. Varvolume int `xml:"varvolume"`
  24. ProductId string `xml:"productid"`
  25. } `xml:"data"`
  26. }
  27. var cffexIndexCode string
  28. var cffexIndexCodeMap = make(map[string]string)
  29. var cffexActionCodeMap = make(map[string]map[string]int)
  30. func cffexIndexCodeGenerator(shortName, indexName, contractCode, suffix string) string {
  31. if shortName == "" {
  32. cffexIndexCode = ""
  33. return cffexIndexCode
  34. }
  35. //取公司全拼
  36. strResult := ""
  37. a := pinyin.NewArgs()
  38. rows := pinyin.LazyPinyin(shortName, a)
  39. for i := 0; i < len(rows); i++ {
  40. strResult += rows[i]
  41. }
  42. cffexIndexCode, _ := cffexIndexCodeMap[indexName]
  43. if cffexIndexCode == "" {
  44. cffexIndexCode = strResult + contractCode + suffix
  45. cffexIndexCodeMap[indexName] = cffexIndexCode
  46. err := models.AddBaseFromTradeMapping(indexName, cffexIndexCode, "CFFEX")
  47. if err != nil {
  48. fmt.Println("add Code err:", err)
  49. }
  50. }
  51. return cffexIndexCode
  52. }
  53. // SyncRankingFromCffex 中国金融期货交易所
  54. func SyncRankingFromCffex() {
  55. n := utils.GetRandInt(10, 120)
  56. time.Sleep(time.Duration(n) * time.Second)
  57. allCode, err := models.GetIndexCodeFromMapping("CFFEX")
  58. if err != nil {
  59. fmt.Println("select Code err:", err)
  60. }
  61. for _, item := range allCode {
  62. cffexIndexCodeMap[item.IndexName] = item.IndexCode
  63. }
  64. for i := 2; i >= 0; i-- {
  65. zzUrl := "http://www.cffex.com.cn/sj/ccpm/%s/%s/"
  66. date := time.Now().AddDate(0, 0, -i)
  67. dateStr := date.Format(utils.FormatDateUnSpace)
  68. pre := dateStr[:6]
  69. sub := dateStr[6:]
  70. zzUrl = fmt.Sprintf(zzUrl, pre, sub)
  71. fmt.Println(zzUrl)
  72. var xmlItems = make([]*XmlItem, 6)
  73. xmlItems[0] = GetXmlItem(zzUrl, "IF")
  74. xmlItems[1] = GetXmlItem(zzUrl, "IC")
  75. xmlItems[2] = GetXmlItem(zzUrl, "IH")
  76. xmlItems[3] = GetXmlItem(zzUrl, "TS")
  77. xmlItems[4] = GetXmlItem(zzUrl, "TF")
  78. xmlItems[5] = GetXmlItem(zzUrl, "T")
  79. //获取新的指标信息
  80. var sRank string
  81. //获取所有指标信息
  82. allIndex, err := models.GetBaseFromTradeCffexIndexAll(dateStr)
  83. if err != nil {
  84. fmt.Println("select err:", err)
  85. }
  86. existDealMap := make(map[string]int)
  87. existBuyMap := make(map[string]int)
  88. existSoldMap := make(map[string]int)
  89. for _, v := range allIndex {
  90. existDealMap[v.DealName] = v.BaseFromTradeCffexIndexId
  91. existBuyMap[v.BuyName] = v.BaseFromTradeCffexIndexId
  92. existSoldMap[v.SoldName] = v.BaseFromTradeCffexIndexId
  93. sRank = fmt.Sprintf("%d", v.Rank)
  94. time := strings.Replace(v.DataTime, "-", "", -1)
  95. cffexActionCodeMap[sRank+v.ClassifyType+time] = map[string]int{"0": v.DealValue, "1": v.BuyValue, "2": v.SoldValue, "id": v.BaseFromTradeCffexIndexId}
  96. }
  97. shortNameColum := map[string]string{"0": "deal_short_name", "1": "buy_short_name", "2": "sold_short_name"}
  98. nameColum := map[string]string{"0": "deal_name", "1": "buy_name", "2": "sold_name"}
  99. codeColum := map[string]string{"0": "deal_code", "1": "buy_code", "2": "sold_code"}
  100. valueColum := map[string]string{"0": "deal_value", "1": "buy_value", "2": "sold_value"}
  101. changeColum := map[string]string{"0": "deal_change", "1": "buy_change", "2": "sold_change"}
  102. var dataName string
  103. var dataCode string
  104. var indexKey string
  105. for _, xmlItem := range xmlItems {
  106. for _, i := range xmlItem.Data {
  107. var item = new(models.BaseFromTradeCffexIndex)
  108. item.DealValue = -1
  109. item.BuyValue = -1
  110. item.SoldValue = -1
  111. item.Rank = i.Rank
  112. switch i.Value {
  113. case "0":
  114. item.DealShortName = i.ShortName
  115. item.DealName = fmt.Sprintf("%s", i.ShortName+"_"+i.ContractCode+"_成交量(手)")
  116. item.DealCode = cffexIndexCodeGenerator(item.DealShortName, item.DealName, i.ContractCode, "deal")
  117. item.DealValue = i.Volume
  118. item.DealChange = i.Varvolume
  119. dataName = item.DealName
  120. dataCode = item.DealCode
  121. case "1":
  122. item.BuyShortName = i.ShortName
  123. item.BuyName = fmt.Sprintf("%s", i.ShortName+"_"+i.ContractCode+"_持买单量(手)")
  124. item.BuyCode = cffexIndexCodeGenerator(item.BuyShortName, item.BuyName, i.ContractCode, "buy")
  125. item.BuyValue = i.Volume
  126. item.BuyChange = i.Varvolume
  127. dataName = item.BuyName
  128. dataCode = item.BuyCode
  129. case "2":
  130. item.SoldShortName = i.ShortName
  131. item.SoldName = fmt.Sprintf("%s", i.ShortName+"_"+i.ContractCode+"_持卖单量(手)")
  132. item.SoldCode = cffexIndexCodeGenerator(item.SoldShortName, item.SoldName, i.ContractCode, "sold")
  133. item.SoldValue = i.Volume
  134. item.SoldChange = i.Varvolume
  135. dataName = item.SoldName
  136. dataCode = item.SoldCode
  137. default:
  138. fmt.Println("No data value")
  139. }
  140. item.Frequency = "日度"
  141. item.ClassifyName = i.ProductId
  142. item.ClassifyType = i.ContractCode
  143. item.CreateTime = time.Now()
  144. item.ModifyTime = time.Now()
  145. item.DataTime = i.Tradingday
  146. valueMap := map[string]int{"0": item.DealValue, "1": item.BuyValue, "2": item.SoldValue}
  147. //检查在actionCodeMap中是否已经有了
  148. indexKey = fmt.Sprintf("%d", item.Rank) + item.ClassifyType + item.DataTime
  149. if existMap, ok := cffexActionCodeMap[indexKey]; !ok {
  150. //没有,新增
  151. newID, err := models.AddBaseFromTradeCffexIndex(item)
  152. if err != nil {
  153. fmt.Println("insert error:", err)
  154. }
  155. fmt.Println("insert new indexID:", newID)
  156. existMap = make(map[string]int)
  157. existMap[i.Value] = i.Volume
  158. existMap["id"] = int(newID)
  159. cffexActionCodeMap[indexKey] = existMap
  160. } else if existMap != nil && existMap[i.Value] != i.Volume {
  161. //更新
  162. var columnList = [5]string{
  163. shortNameColum[i.Value],
  164. nameColum[i.Value],
  165. codeColum[i.Value],
  166. valueColum[i.Value],
  167. changeColum[i.Value],
  168. }
  169. var dataList = [5]interface{}{
  170. i.ShortName,
  171. dataName,
  172. dataCode,
  173. valueMap[i.Value],
  174. i.Varvolume,
  175. }
  176. err := models.ModifyBaseFromTradeCffexIndex(columnList, dataList, existMap["id"])
  177. if err != nil {
  178. fmt.Println("data update err:", err)
  179. }
  180. cffexActionCodeMap[indexKey][i.Value] = i.Volume
  181. } else if _, ok := existDealMap[item.DealName]; !ok {
  182. //更新
  183. var columnList = [5]string{
  184. shortNameColum[i.Value],
  185. nameColum[i.Value],
  186. codeColum[i.Value],
  187. valueColum[i.Value],
  188. changeColum[i.Value],
  189. }
  190. var dataList = [5]interface{}{
  191. i.ShortName,
  192. dataName,
  193. dataCode,
  194. valueMap[i.Value],
  195. i.Varvolume,
  196. }
  197. err := models.ModifyBaseFromTradeCffexIndex(columnList, dataList, existMap["id"])
  198. if err != nil {
  199. fmt.Println("data update err:", err)
  200. }
  201. cffexActionCodeMap[indexKey][i.Value] = i.Volume
  202. } else if _, ok := existBuyMap[item.BuyName]; !ok {
  203. //更新
  204. var columnList = [5]string{
  205. shortNameColum[i.Value],
  206. nameColum[i.Value],
  207. codeColum[i.Value],
  208. valueColum[i.Value],
  209. changeColum[i.Value],
  210. }
  211. var dataList = [5]interface{}{
  212. i.ShortName,
  213. dataName,
  214. dataCode,
  215. valueMap[i.Value],
  216. i.Varvolume,
  217. }
  218. err := models.ModifyBaseFromTradeCffexIndex(columnList, dataList, existMap["id"])
  219. if err != nil {
  220. fmt.Println("data update err:", err)
  221. }
  222. cffexActionCodeMap[indexKey][i.Value] = i.Volume
  223. } else if _, ok := existSoldMap[item.SoldName]; !ok {
  224. //更新
  225. var columnList = [5]string{
  226. shortNameColum[i.Value],
  227. nameColum[i.Value],
  228. codeColum[i.Value],
  229. valueColum[i.Value],
  230. changeColum[i.Value],
  231. }
  232. var dataList = [5]interface{}{
  233. i.ShortName,
  234. dataName,
  235. dataCode,
  236. valueMap[i.Value],
  237. i.Varvolume,
  238. }
  239. err := models.ModifyBaseFromTradeCffexIndex(columnList, dataList, existMap["id"])
  240. if err != nil {
  241. fmt.Println("data update err:", err)
  242. }
  243. cffexActionCodeMap[indexKey][i.Value] = i.Volume
  244. }
  245. }
  246. }
  247. }
  248. }
  249. func GetXmlItem(url, contract string) *XmlItem {
  250. zzUrl := url + contract + ".xml"
  251. fmt.Println(zzUrl)
  252. body, err := http.Get(zzUrl)
  253. if err != nil {
  254. fmt.Println("err:", err)
  255. }
  256. xmlItem := new(XmlItem)
  257. err = xml.Unmarshal(body, &xmlItem)
  258. if err != nil {
  259. fmt.Println("xml.Unmarshal:", err.Error())
  260. }
  261. return xmlItem
  262. }