bloomberg.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. package pcsg
  2. import (
  3. "eta/eta_bridge/global"
  4. "eta/eta_bridge/utils"
  5. "fmt"
  6. "strings"
  7. "time"
  8. )
  9. const (
  10. TaskKey0000 = "IDpcsgDailySnap0000"
  11. SubOneDayTaskKey = "IDpcsgDailySnap0330" // 日期-1的key
  12. TaskKey0345 = "IDpcsgDailySnap0345"
  13. TaskKeyHistU3 = "IDpcsgDailyRunHistU3"
  14. TaskKeyIDpcsgDailyRun11 = "IDpcsgDailyRun11"
  15. TaskKeyIDpcsgDailyRun12 = "IDpcsgDailyRun12"
  16. )
  17. // PythonBloombergGeneralData 通用数据格式(有空改成Map吧...然后做成配置方便加新字段...)
  18. type PythonBloombergGeneralData struct {
  19. NAME string `json:"NAME" description:"指标名称, 可能为null"`
  20. IDENTIFIER string `json:"IDENTIFIER" description:"指标编码"`
  21. PX_LAST_EOD *float64 `json:"PX_LAST_EOD" description:"数据值, 可能为null"`
  22. PX_VOLUME_EOD *float64 `json:"PX_VOLUME_EOD" description:"数据值, 可能为null"`
  23. PX_LAST *float64 `json:"PX_LAST" description:"数据值, 可能为null"`
  24. PX_VOLUME *float64 `json:"PX_VOLUME" description:"数据值, 可能为null"`
  25. LAST_UPDATE_DATE_EOD string `json:"LAST_UPDATE_DATE_EOD" description:"数据日期"`
  26. DATE string `json:"DATE" description:"数据日期"`
  27. PX_SETTLE *float64 `json:"PX_SETTLE" description:"数据值, 可能为null"`
  28. PX_SETTLE_LAST_DT string `json:"PX_SETTLE_LAST_DT" description:"数据日期"`
  29. OPEN_INT *float64 `json:"OPEN_INT"`
  30. OPEN_INT_DATE string `json:"OPEN_INT_DATE"`
  31. DL_SNAPSHOT_START_TIME string `json:"DL_SNAPSHOT_START_TIME" description:"数据日期"`
  32. LAST_UPDATE string `json:"LAST_UPDATE" description:"IDpcsgDailySnap0000和IDpcsgDailySnap0330判断用的"`
  33. PX_CLOSE_DT string `json:"PX_CLOSE_DT" description:"数据日期"`
  34. LAST_UPDATE_DT string `json:"LAST_UPDATE_DT" description:"数据日期"`
  35. HEATING_DAYS *float64 `json:"HEATING_DAYS" description:"数据值, 可能为null"`
  36. COOLING_DAYS *float64 `json:"COOLING_DAYS" description:"数据值, 可能为null"`
  37. PX_OPEN *float64 `json:"PX_OPEN" description:"数据值, 可能为null"`
  38. PX_LOW *float64 `json:"PX_LOW" description:"数据值, 可能为null"`
  39. PX_HIGH *float64 `json:"PX_HIGH" description:"数据值, 可能为null"`
  40. WIND_SPEED *float64 `json:"WIND_SPEED" description:"数据值, 可能为null"`
  41. PRECIPITATION *float64 `json:"PRECIPITATION" description:"数据值, 可能为null"`
  42. }
  43. // PythonBloombergGeneralResult API响应体
  44. type PythonBloombergGeneralResult struct {
  45. Code int `json:"code"`
  46. Msg string `json:"msg"`
  47. Data []PythonBloombergGeneralData `json:"data"`
  48. }
  49. // BaseFromBloombergApiIndexAndData Bloomberg原始指标及数据
  50. type BaseFromBloombergApiIndexAndData struct {
  51. BaseFromBloombergIndexId int `description:"指标ID"`
  52. IndexCode string `description:"指标编码"`
  53. IndexName string `description:"指标名称"`
  54. Unit string `description:"单位"`
  55. Source string `description:"来源"`
  56. Frequency string `description:"频度"`
  57. CreateTime time.Time `description:"创建时间"`
  58. ModifyTime time.Time `description:"修改时间"`
  59. Data []BaseFromBloombergApiIndexData `description:"数据列表"`
  60. }
  61. // BaseFromBloombergApiIndexData Bloomberg原始指标数据
  62. type BaseFromBloombergApiIndexData struct {
  63. DataTime time.Time `description:"数据日期"`
  64. Value float64 `description:"数据值"`
  65. }
  66. func FormatPythonBloombergGeneralData2Base(origin PythonBloombergGeneralData, frequency, taskKey string) (item BaseFromBloombergApiIndexAndData) {
  67. if origin.IDENTIFIER == "" {
  68. return
  69. }
  70. item.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  71. item.IndexName = strings.TrimSpace(origin.NAME)
  72. item.Frequency = frequency
  73. item.Unit = "无"
  74. item.Data = make([]BaseFromBloombergApiIndexData, 0)
  75. // 数据来源的值和日期对应字段不同
  76. var dataTime time.Time
  77. var val *float64
  78. if origin.LAST_UPDATE_DATE_EOD != "" && origin.PX_LAST_EOD != nil {
  79. dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DATE_EOD, time.Local)
  80. val = origin.PX_LAST_EOD
  81. }
  82. if origin.LAST_UPDATE_DATE_EOD != "" && origin.PX_VOLUME_EOD != nil {
  83. dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DATE_EOD, time.Local)
  84. val = origin.PX_VOLUME_EOD
  85. }
  86. if origin.DATE != "" && origin.PX_LAST != nil {
  87. dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.DATE, time.Local)
  88. val = origin.PX_LAST
  89. }
  90. if origin.DATE != "" && origin.PX_VOLUME != nil {
  91. dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.DATE, time.Local)
  92. val = origin.PX_VOLUME
  93. }
  94. if origin.PX_SETTLE_LAST_DT != "" && origin.PX_SETTLE != nil {
  95. dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.PX_SETTLE_LAST_DT, time.Local)
  96. val = origin.PX_SETTLE
  97. }
  98. if origin.OPEN_INT_DATE != "" && origin.OPEN_INT != nil {
  99. dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.OPEN_INT_DATE, time.Local)
  100. val = origin.OPEN_INT
  101. }
  102. if taskKey == TaskKey0345 && origin.PX_CLOSE_DT != "" && origin.PX_LAST != nil {
  103. dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.PX_CLOSE_DT, time.Local)
  104. val = origin.PX_LAST
  105. }
  106. if (taskKey == TaskKey0000 || taskKey == SubOneDayTaskKey) && origin.DL_SNAPSHOT_START_TIME != "" && origin.PX_LAST != nil {
  107. // 根据LAST_UPDATE的格式进行判断, 仅加入格式为hh:mm:ss的
  108. _, e := time.ParseInLocation("15:04:05", origin.LAST_UPDATE, time.Local)
  109. if e != nil {
  110. return
  111. }
  112. d, e := time.ParseInLocation("2006-01-02T15:04:05", origin.DL_SNAPSHOT_START_TIME, time.Local)
  113. if e != nil {
  114. global.LOG.Info(fmt.Sprintf("DL_SNAPSHOT_START_TIME日期解析失败, %s", origin.DL_SNAPSHOT_START_TIME))
  115. }
  116. dataTime = d
  117. // 这个任务日期需要-1
  118. if taskKey == SubOneDayTaskKey {
  119. dataTime = dataTime.AddDate(0, 0, -1)
  120. }
  121. val = origin.PX_LAST
  122. }
  123. if !dataTime.IsZero() && val != nil {
  124. item.Data = append(item.Data, BaseFromBloombergApiIndexData{
  125. DataTime: dataTime,
  126. Value: *val,
  127. })
  128. }
  129. return
  130. }
  131. // FormatPythonBloombergDailyRun11Data2Base Run11不要了被Run12替代了,留这过渡一下
  132. func FormatPythonBloombergDailyRun11Data2Base(origin PythonBloombergGeneralData, frequency, taskKey string) (items []BaseFromBloombergApiIndexAndData) {
  133. if origin.IDENTIFIER == "" {
  134. return
  135. }
  136. if origin.LAST_UPDATE_DT == "" {
  137. return
  138. }
  139. dataTime, err := time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DT, time.Local)
  140. if err != nil {
  141. return
  142. }
  143. items = make([]BaseFromBloombergApiIndexAndData, 0)
  144. // WER1UK00 Index, WER1UK00 Index HDD, WER1UK00 Index CDD
  145. item := BaseFromBloombergApiIndexAndData{}
  146. item.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  147. item.IndexName = strings.TrimSpace(origin.NAME)
  148. item.Frequency = frequency
  149. item.Unit = "无"
  150. item.Data = make([]BaseFromBloombergApiIndexData, 0)
  151. itemHDD := BaseFromBloombergApiIndexAndData{}
  152. itemHDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  153. itemHDD.IndexCode = fmt.Sprintf("%s HDD", itemHDD.IndexCode)
  154. itemHDD.IndexName = strings.TrimSpace(origin.NAME)
  155. itemHDD.IndexName = fmt.Sprintf("%s HDD", itemHDD.IndexName)
  156. itemHDD.Frequency = frequency
  157. itemHDD.Unit = "无"
  158. itemHDD.Data = make([]BaseFromBloombergApiIndexData, 0)
  159. itemCDD := BaseFromBloombergApiIndexAndData{}
  160. itemCDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  161. itemCDD.IndexCode = fmt.Sprintf("%s CDD", itemCDD.IndexCode)
  162. itemCDD.IndexName = strings.TrimSpace(origin.NAME)
  163. itemCDD.IndexName = fmt.Sprintf("%s CDD", itemCDD.IndexName)
  164. itemCDD.Frequency = frequency
  165. itemCDD.Unit = "无"
  166. itemCDD.Data = make([]BaseFromBloombergApiIndexData, 0)
  167. // 数据来源的值和日期对应字段不同
  168. if origin.PX_LAST != nil {
  169. val := origin.PX_LAST
  170. item.Data = append(item.Data, BaseFromBloombergApiIndexData{
  171. DataTime: dataTime,
  172. Value: *val,
  173. })
  174. }
  175. if origin.HEATING_DAYS != nil {
  176. val := origin.HEATING_DAYS
  177. itemHDD.Data = append(itemHDD.Data, BaseFromBloombergApiIndexData{
  178. DataTime: dataTime,
  179. Value: *val,
  180. })
  181. }
  182. if origin.COOLING_DAYS != nil {
  183. val := origin.COOLING_DAYS
  184. itemCDD.Data = append(itemCDD.Data, BaseFromBloombergApiIndexData{
  185. DataTime: dataTime,
  186. Value: *val,
  187. })
  188. }
  189. items = append(items, item, itemHDD, itemCDD)
  190. return
  191. }
  192. func FormatPythonBloombergDailyRunHistV1Data2Base(origin PythonBloombergGeneralData, frequency, taskKey string) (item BaseFromBloombergApiIndexAndData) {
  193. if origin.IDENTIFIER == "" {
  194. return
  195. }
  196. item.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  197. if item.IndexCode == "TZT1 COMB Comdty" {
  198. item.IndexCode = "TZT1 COMB V Comdty"
  199. }
  200. item.IndexName = strings.TrimSpace(origin.NAME)
  201. item.Frequency = frequency
  202. item.Unit = "无"
  203. item.Data = make([]BaseFromBloombergApiIndexData, 0)
  204. // 数据来源的值和日期对应字段不同
  205. var dataTime time.Time
  206. var val *float64
  207. if origin.DATE != "" && origin.PX_VOLUME != nil {
  208. dataTime, _ = time.ParseInLocation(utils.FormatDate, origin.DATE, time.Local)
  209. val = origin.PX_VOLUME
  210. }
  211. if !dataTime.IsZero() && val != nil {
  212. item.Data = append(item.Data, BaseFromBloombergApiIndexData{
  213. DataTime: dataTime,
  214. Value: *val,
  215. })
  216. }
  217. return
  218. }
  219. func FormatPythonBloombergDailyHistU3Data2Base(origin PythonBloombergGeneralData, frequency string) (items []BaseFromBloombergApiIndexAndData) {
  220. origin.IDENTIFIER = strings.TrimSpace(origin.IDENTIFIER)
  221. if origin.IDENTIFIER == "" {
  222. return
  223. }
  224. dataTime, err := time.ParseInLocation(utils.FormatDate, origin.DATE, time.Local)
  225. if err != nil {
  226. return
  227. }
  228. items = make([]BaseFromBloombergApiIndexAndData, 0)
  229. // TZT1 Comdty / CO1 Comdty
  230. if origin.IDENTIFIER == "CO1 Comdty" {
  231. itemA1 := BaseFromBloombergApiIndexAndData{}
  232. itemA1.IndexCode = "CO1 O Comdty"
  233. itemA1.IndexName = "ICE Brent 1st Line - Open"
  234. itemA1.Frequency = frequency
  235. itemA1.Unit = "无"
  236. itemA1.Data = make([]BaseFromBloombergApiIndexData, 0)
  237. itemA2 := BaseFromBloombergApiIndexAndData{}
  238. itemA2.IndexCode = "CO1 L Comdty"
  239. itemA2.IndexName = "ICE Brent 1st Line - Low"
  240. itemA2.Frequency = frequency
  241. itemA2.Unit = "无"
  242. itemA2.Data = make([]BaseFromBloombergApiIndexData, 0)
  243. itemA3 := BaseFromBloombergApiIndexAndData{}
  244. itemA3.IndexCode = "CO1 H Comdty"
  245. itemA3.IndexName = "ICE Brent 1st Line - High"
  246. itemA3.Frequency = frequency
  247. itemA3.Unit = "无"
  248. itemA3.Data = make([]BaseFromBloombergApiIndexData, 0)
  249. // 数据来源的值和日期对应字段不同
  250. if origin.PX_OPEN != nil {
  251. val := origin.PX_OPEN
  252. itemA1.Data = append(itemA1.Data, BaseFromBloombergApiIndexData{
  253. DataTime: dataTime,
  254. Value: *val,
  255. })
  256. }
  257. if origin.PX_LOW != nil {
  258. val := origin.PX_LOW
  259. itemA2.Data = append(itemA2.Data, BaseFromBloombergApiIndexData{
  260. DataTime: dataTime,
  261. Value: *val,
  262. })
  263. }
  264. if origin.PX_HIGH != nil {
  265. val := origin.PX_HIGH
  266. itemA3.Data = append(itemA3.Data, BaseFromBloombergApiIndexData{
  267. DataTime: dataTime,
  268. Value: *val,
  269. })
  270. }
  271. items = append(items, itemA1, itemA2, itemA3)
  272. }
  273. if origin.IDENTIFIER == "TZT1 Comdty" {
  274. itemB1 := BaseFromBloombergApiIndexAndData{}
  275. itemB1.IndexCode = "TZT1 O Comdty"
  276. itemB1.IndexName = "ICE TTF 1st Line - Open"
  277. itemB1.Frequency = frequency
  278. itemB1.Unit = "无"
  279. itemB1.Data = make([]BaseFromBloombergApiIndexData, 0)
  280. itemB2 := BaseFromBloombergApiIndexAndData{}
  281. itemB2.IndexCode = "TZT1 L Comdty"
  282. itemB2.IndexName = "ICE TTF 1st Line - Low"
  283. itemB2.Frequency = frequency
  284. itemB2.Unit = "无"
  285. itemB2.Data = make([]BaseFromBloombergApiIndexData, 0)
  286. itemB3 := BaseFromBloombergApiIndexAndData{}
  287. itemB3.IndexCode = "TZT1 H Comdty"
  288. itemB3.IndexName = "ICE TTF 1st Line - High"
  289. itemB3.Frequency = frequency
  290. itemB3.Unit = "无"
  291. itemB3.Data = make([]BaseFromBloombergApiIndexData, 0)
  292. // 数据来源的值和日期对应字段不同
  293. if origin.PX_OPEN != nil {
  294. val := origin.PX_OPEN
  295. itemB1.Data = append(itemB1.Data, BaseFromBloombergApiIndexData{
  296. DataTime: dataTime,
  297. Value: *val,
  298. })
  299. }
  300. if origin.PX_LOW != nil {
  301. val := origin.PX_LOW
  302. itemB2.Data = append(itemB2.Data, BaseFromBloombergApiIndexData{
  303. DataTime: dataTime,
  304. Value: *val,
  305. })
  306. }
  307. if origin.PX_HIGH != nil {
  308. val := origin.PX_HIGH
  309. itemB3.Data = append(itemB3.Data, BaseFromBloombergApiIndexData{
  310. DataTime: dataTime,
  311. Value: *val,
  312. })
  313. }
  314. items = append(items, itemB1, itemB2, itemB3)
  315. }
  316. return
  317. }
  318. // FormatPythonBloombergDailyRun12Data2Base 替换Run11
  319. func FormatPythonBloombergDailyRun12Data2Base(origin PythonBloombergGeneralData, frequency string) (items []BaseFromBloombergApiIndexAndData) {
  320. if origin.IDENTIFIER == "" {
  321. return
  322. }
  323. if origin.LAST_UPDATE_DT == "" {
  324. return
  325. }
  326. dataTime, err := time.ParseInLocation(utils.FormatDate, origin.LAST_UPDATE_DT, time.Local)
  327. if err != nil {
  328. return
  329. }
  330. items = make([]BaseFromBloombergApiIndexAndData, 0)
  331. // WER1UK00 Index, WER1UK00 Index HDD, WER1UK00 Index CDD, WER1UK00 Index Pre, WER1UK00 Index Win
  332. item := BaseFromBloombergApiIndexAndData{}
  333. item.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  334. item.IndexName = strings.TrimSpace(origin.NAME)
  335. item.Frequency = frequency
  336. item.Unit = "无"
  337. item.Data = make([]BaseFromBloombergApiIndexData, 0)
  338. itemHDD := BaseFromBloombergApiIndexAndData{}
  339. itemHDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  340. itemHDD.IndexCode = fmt.Sprintf("%s HDD", itemHDD.IndexCode)
  341. itemHDD.IndexName = strings.TrimSpace(origin.NAME)
  342. itemHDD.IndexName = fmt.Sprintf("%s HDD", itemHDD.IndexName)
  343. itemHDD.Frequency = frequency
  344. itemHDD.Unit = "无"
  345. itemHDD.Data = make([]BaseFromBloombergApiIndexData, 0)
  346. itemCDD := BaseFromBloombergApiIndexAndData{}
  347. itemCDD.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  348. itemCDD.IndexCode = fmt.Sprintf("%s CDD", itemCDD.IndexCode)
  349. itemCDD.IndexName = strings.TrimSpace(origin.NAME)
  350. itemCDD.IndexName = fmt.Sprintf("%s CDD", itemCDD.IndexName)
  351. itemCDD.Frequency = frequency
  352. itemCDD.Unit = "无"
  353. itemCDD.Data = make([]BaseFromBloombergApiIndexData, 0)
  354. itemPre := BaseFromBloombergApiIndexAndData{}
  355. itemPre.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  356. itemPre.IndexCode = fmt.Sprintf("%s Pre", itemPre.IndexCode)
  357. itemPre.IndexName = strings.TrimSpace(origin.NAME)
  358. itemPre.IndexName = fmt.Sprintf("%s Precipitation", itemPre.IndexName)
  359. itemPre.Frequency = frequency
  360. itemPre.Unit = "无"
  361. itemPre.Data = make([]BaseFromBloombergApiIndexData, 0)
  362. itemWin := BaseFromBloombergApiIndexAndData{}
  363. itemWin.IndexCode = strings.TrimSpace(origin.IDENTIFIER)
  364. itemWin.IndexCode = fmt.Sprintf("%s Win", itemWin.IndexCode)
  365. itemWin.IndexName = strings.TrimSpace(origin.NAME)
  366. itemWin.IndexName = fmt.Sprintf("%s Wind Speed", itemWin.IndexName)
  367. itemWin.Frequency = frequency
  368. itemWin.Unit = "无"
  369. itemWin.Data = make([]BaseFromBloombergApiIndexData, 0)
  370. // 数据来源的值和日期对应字段不同
  371. if origin.PX_LAST != nil {
  372. val := origin.PX_LAST
  373. item.Data = append(item.Data, BaseFromBloombergApiIndexData{
  374. DataTime: dataTime,
  375. Value: *val,
  376. })
  377. }
  378. if origin.HEATING_DAYS != nil {
  379. val := origin.HEATING_DAYS
  380. itemHDD.Data = append(itemHDD.Data, BaseFromBloombergApiIndexData{
  381. DataTime: dataTime,
  382. Value: *val,
  383. })
  384. }
  385. if origin.COOLING_DAYS != nil {
  386. val := origin.COOLING_DAYS
  387. itemCDD.Data = append(itemCDD.Data, BaseFromBloombergApiIndexData{
  388. DataTime: dataTime,
  389. Value: *val,
  390. })
  391. }
  392. if origin.WIND_SPEED != nil {
  393. val := origin.WIND_SPEED
  394. itemWin.Data = append(itemWin.Data, BaseFromBloombergApiIndexData{
  395. DataTime: dataTime,
  396. Value: *val,
  397. })
  398. }
  399. if origin.PRECIPITATION != nil {
  400. val := origin.PRECIPITATION
  401. itemPre.Data = append(itemPre.Data, BaseFromBloombergApiIndexData{
  402. DataTime: dataTime,
  403. Value: *val,
  404. })
  405. }
  406. items = append(items, item, itemHDD, itemCDD, itemWin, itemPre)
  407. return
  408. }