trade_position_analysis.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. package data
  2. import (
  3. "context"
  4. "fmt"
  5. "hongze/hongze_task/models/data_manage"
  6. "hongze/hongze_task/services/alarm_msg"
  7. "hongze/hongze_task/utils"
  8. "sort"
  9. "strconv"
  10. "time"
  11. )
  12. // InitPositionTask 统计今日交易所的持仓分析数据
  13. func InitPositionTask(cont context.Context) (err error) {
  14. exchanges := []string{"zhengzhou", "dalian", "shanghai", "cffex", "ine"} //郑商所,大商所,上期所,中金所,上期能源
  15. for i := 1; i >= 0; i-- {
  16. startDate := time.Now().AddDate(0, 0, -i).Format(utils.FormatDate)
  17. endDate := startDate
  18. for _, v := range exchanges {
  19. exchange := v
  20. err = nil
  21. fmt.Println("InitPositionTask: 启动:" + exchange)
  22. utils.FileLog.Info("InitPositionTask: 启动:" + exchange)
  23. fmt.Println("开始" + startDate + "结束" + endDate)
  24. utils.FileLog.Info(fmt.Sprintf("InitTradePosition:开始:%s; 结束:%s", startDate, endDate))
  25. tErr, errMsg := InitTradePosition(exchange, startDate, endDate)
  26. if tErr != nil {
  27. err = tErr
  28. fmt.Println("InitTradePosition: 操作失败:" + errMsg + tErr.Error())
  29. utils.FileLog.Info(fmt.Sprintf("InitTradePosition: 操作失败:%s:%s", errMsg, tErr.Error()))
  30. continue
  31. }
  32. fmt.Println("InitTradePosition:" + exchange + "已完成")
  33. utils.FileLog.Info("InitTradePosition:" + exchange + "已完成")
  34. }
  35. }
  36. // 处理交易所的分类
  37. {
  38. allBaseFromTradeClassify, tmpErr := data_manage.GetAllBaseFromTradeClassify()
  39. if tmpErr != nil {
  40. utils.FileLog.Info(fmt.Sprintf("获取所有交易所分类失败,;err:%s", tmpErr.Error()))
  41. return
  42. }
  43. tradeClassifyMap := make(map[string]*data_manage.BaseFromTradeClassify)
  44. for _, v := range allBaseFromTradeClassify {
  45. key := fmt.Sprintf("%s_%s_%s", v.Exchange, v.ClassifyName, v.ClassifyType)
  46. tradeClassifyMap[key] = v
  47. }
  48. baseFromTradeClassifyList := make([]*data_manage.BaseFromTradeClassify, 0)
  49. for _, v := range exchanges {
  50. tradeClassifyNameList, tmpErr := data_manage.GetExchangeClassify(v)
  51. if tmpErr != nil {
  52. utils.FileLog.Info(fmt.Sprintf("获取%s分类失败,;err:%s", v, tmpErr.Error()))
  53. continue
  54. }
  55. for _, classify := range tradeClassifyNameList {
  56. key := fmt.Sprintf("%s_%s_%s", v, classify.ClassifyName, classify.ClassifyType)
  57. if tradeClassify, ok := tradeClassifyMap[key]; !ok {
  58. baseFromTradeClassifyList = append(baseFromTradeClassifyList, &data_manage.BaseFromTradeClassify{
  59. Id: 0,
  60. ClassifyName: classify.ClassifyName,
  61. ClassifyType: classify.ClassifyType,
  62. Exchange: v,
  63. LatestDate: classify.DataTime,
  64. CreateTime: time.Now(),
  65. ModifyTime: classify.ModifyTime,
  66. })
  67. } else {
  68. if tradeClassify.LatestDate.Before(classify.DataTime) {
  69. tradeClassify.LatestDate = classify.DataTime
  70. tradeClassify.ModifyTime = classify.ModifyTime
  71. tradeClassify.Update([]string{"LatestDate", "ModifyTime"})
  72. }
  73. }
  74. }
  75. }
  76. lenAddList := len(baseFromTradeClassifyList)
  77. if lenAddList > 0 {
  78. baseAddNum := 500
  79. num := lenAddList / baseAddNum
  80. lastNum := lenAddList % baseAddNum
  81. for i := 0; i <= num; i++ {
  82. tmpNum := baseAddNum
  83. if i == num && lastNum > 0 {
  84. tmpNum = lastNum
  85. }
  86. data_manage.MultiAddBaseFromTradeClassify(baseFromTradeClassifyList[i*baseAddNum : (i*baseAddNum + tmpNum)])
  87. }
  88. }
  89. }
  90. return
  91. }
  92. func InitTradePosition(exchange, startDate, endDate string) (err error, errMsg string) {
  93. defer func() {
  94. if err != nil {
  95. tips := fmt.Sprintf("统计今日交易所的持仓分析数据失败, Exchange: %s, Err: %s, Msg: %s", exchange, err.Error(), errMsg)
  96. alarm_msg.SendAlarmMsg(tips, 3)
  97. }
  98. }()
  99. // 批量插入今日的初始值
  100. num, err := data_manage.GetTradePositionTopCountByExchangeDataTime(exchange, startDate, endDate)
  101. if err != nil {
  102. errMsg = "查询原始数据失败,GetTradePositionTopCountByExchangeDataTime() Err: "
  103. return
  104. }
  105. if num > 0 {
  106. //err = fmt.Errorf("数据已存在,无需处理")
  107. return
  108. }
  109. err = data_manage.MultiInsertTradeBaseDataToTop(exchange, startDate, endDate)
  110. if err != nil {
  111. errMsg = "新增原始数据失败,MultiInsertTradeBaseDataToTop() Err: "
  112. return
  113. }
  114. originList, err := data_manage.GetTradePositionTopByExchangeDataTime(exchange, startDate, endDate)
  115. if err != nil {
  116. errMsg = "查询原始数据失败, GetTradePositionTopByExchangeDataTime() Err: "
  117. return
  118. }
  119. if len(originList) <= 0 {
  120. // 忽略周末
  121. w := time.Now().Weekday().String()
  122. if w == "Saturday" || w == "Sunday" {
  123. return
  124. }
  125. // 每天最后一个小时执行依旧无数据时, 才进行邮件提示
  126. if time.Now().Hour() != 23 {
  127. return
  128. }
  129. err = fmt.Errorf("原始数据没有值")
  130. return
  131. }
  132. // 原始数据日期
  133. dates, e := data_manage.GetTradePositionTopOriginDataTimes(exchange)
  134. if e != nil {
  135. err = fmt.Errorf("GetTradePositionTopOriginDataTimes err: %s", e.Error())
  136. return
  137. }
  138. now := time.Now()
  139. dataTimeMap := make(map[string]*data_manage.TradePositionTop)
  140. onlyEmptyMap := make(map[string]bool)
  141. onlyEmptyNameMap := make(map[string]*data_manage.TradePositionTop)
  142. topLastMap := make(map[string]int)
  143. topLastRankMap := make(map[string]int)
  144. list := make([]*data_manage.TradePositionTop, 0)
  145. for _, v := range originList {
  146. tmp0, tmpErr := dealTradeOriginData(dataTimeMap, onlyEmptyMap, onlyEmptyNameMap, v, topLastMap, topLastRankMap, startDate, now, dates)
  147. if tmpErr != nil {
  148. err = tmpErr
  149. errMsg = "处理原始数据失败 dealTradeOriginData() Err: "
  150. return
  151. }
  152. if tmp0 != nil {
  153. list = append(list, tmp0)
  154. }
  155. if len(list) >= 1000 {
  156. err = data_manage.InsertMultiTradePositionTop(exchange, list)
  157. if err != nil {
  158. errMsg = "批量新增昨日数据失败,InsertMultiTradePositionTop() Err: "
  159. return
  160. }
  161. list = make([]*data_manage.TradePositionTop, 0)
  162. }
  163. }
  164. if len(list) > 0 {
  165. err = data_manage.InsertMultiTradePositionTop(exchange, list)
  166. if err != nil {
  167. errMsg = "批量新增昨日数据失败,InsertMultiTradePositionTop() Err: "
  168. return
  169. }
  170. list = make([]*data_manage.TradePositionTop, 0)
  171. }
  172. // 处理某个期货公司只有买单没有卖单,或者只有卖单没有买单的情况
  173. for k, v := range onlyEmptyNameMap {
  174. _, ok1 := onlyEmptyMap[k+"_1"]
  175. _, ok2 := onlyEmptyMap[k+"_2"]
  176. var dealType int
  177. if ok1 && !ok2 {
  178. dealType = 2 //只有买单没有卖单
  179. } else if !ok1 && ok2 {
  180. dealType = 1 //只有卖单没有买单的情况
  181. } else {
  182. continue
  183. }
  184. if dealType > 0 {
  185. str := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DataTime + "_" + strconv.Itoa(dealType)
  186. dealValue := 0
  187. if lastVal, ok := topLastMap[str]; ok {
  188. dealValue = int(float64(lastVal)*0.7 + 0.5)
  189. }
  190. tmp := &data_manage.TradePositionTop{
  191. ClassifyName: v.ClassifyName,
  192. ClassifyType: v.ClassifyType,
  193. DealShortName: v.DealShortName,
  194. DataTime: v.DataTime,
  195. DealValue: dealValue,
  196. CreateTime: now,
  197. ModifyTime: now,
  198. DealType: dealType,
  199. SourceType: 2,
  200. }
  201. list = append(list, tmp)
  202. if len(list) >= 1000 {
  203. err = data_manage.InsertMultiTradePositionTop(exchange, list)
  204. if err != nil {
  205. errMsg = "批量新增前日数据失败,InsertMultiTradePositionTop() Err: "
  206. return
  207. }
  208. list = make([]*data_manage.TradePositionTop, 0)
  209. }
  210. }
  211. }
  212. if len(list) > 0 {
  213. err = data_manage.InsertMultiTradePositionTop(exchange, list)
  214. if err != nil {
  215. errMsg = "批量新增前日数据失败,InsertMultiTradePositionTop() Err: "
  216. return
  217. }
  218. }
  219. //生成净多单,净空单榜单
  220. err = createAnalysisCleanTop(exchange, startDate, endDate)
  221. if err != nil {
  222. errMsg = "创建净多单,净空单数据失败,createAnalysisCleanTop() Err: "
  223. return
  224. }
  225. // 特殊处理起始日期前一天的数据
  226. err = DealYesterdayData(exchange, startDate)
  227. if err != nil {
  228. errMsg = "处理昨日数据失败,DealYesterdayData() Err: "
  229. return
  230. }
  231. return
  232. }
  233. func dealTradeOriginData(dataTimeMap map[string]*data_manage.TradePositionTop, onlyEmptyMap map[string]bool, onlyEmptyNameMap map[string]*data_manage.TradePositionTop, currentItem *data_manage.TradePositionTop, topLastMap map[string]int, topLastRankMap map[string]int, startDate string, now time.Time, dates []string) (tmp0 *data_manage.TradePositionTop, err error) {
  234. classifyName := currentItem.ClassifyName
  235. classifyType := currentItem.ClassifyType
  236. dealShortName := currentItem.DealShortName
  237. dealValue := currentItem.DealValue
  238. dealChange := currentItem.DealChange
  239. dataTime := currentItem.DataTime
  240. dealType := currentItem.DealType
  241. dealTypeStr := strconv.Itoa(dealType)
  242. dataTimeMap[classifyName+"_"+classifyType+"_"+dealTypeStr+"_"+dealShortName+"_"+dataTime] = currentItem
  243. onlyEmptyMap[classifyName+"_"+classifyType+"_"+dataTime+"_"+dealShortName+"_"+dealTypeStr] = true
  244. onlyEmptyNameMap[classifyName+"_"+classifyType+"_"+dataTime+"_"+dealShortName] = currentItem
  245. if currentItem.Rank > topLastRankMap[classifyName+"_"+classifyType+"_"+dataTime+"_"+dealTypeStr] {
  246. topLastMap[classifyName+"_"+classifyType+"_"+dataTime+"_"+dealTypeStr] = dealValue
  247. topLastRankMap[classifyName+"_"+classifyType+"_"+dataTime+"_"+dealTypeStr] = currentItem.Rank
  248. }
  249. if dataTime > startDate {
  250. //tmpTimeStr, tErr := getYesterdayDate(dataTime)
  251. //if tErr != nil {
  252. // err = tErr
  253. // return
  254. //}
  255. tmpTimeStr := getPrevTradeDataDate(dataTime, dates)
  256. if tmpTimeStr < startDate {
  257. return
  258. }
  259. // 判断T-1日是否有值, 如果T-1日为空,则根据T日的值计算出T-1的值
  260. if _, ok := dataTimeMap[classifyName+"_"+classifyType+"_"+dealTypeStr+"_"+dealShortName+"_"+tmpTimeStr]; !ok {
  261. yesterdayVal := dealValue - dealChange
  262. yesterdayChange := 0
  263. //beforeYesterday, _ := getYesterdayDate(tmpTimeStr)
  264. beforeYesterday := getPrevTradeDataDate(tmpTimeStr, dates)
  265. beforeYesterdayItem, ok1 := dataTimeMap[classifyName+"_"+classifyType+"_"+dealTypeStr+"_"+dealShortName+"_"+beforeYesterday]
  266. if ok1 {
  267. yesterdayChange = yesterdayVal - beforeYesterdayItem.DealValue
  268. }
  269. tmp0 = &data_manage.TradePositionTop{
  270. ClassifyName: classifyName,
  271. ClassifyType: classifyType,
  272. DealShortName: dealShortName,
  273. DealValue: yesterdayVal,
  274. DealChange: yesterdayChange,
  275. DataTime: tmpTimeStr,
  276. CreateTime: now,
  277. ModifyTime: now,
  278. DealType: dealType,
  279. SourceType: 1,
  280. }
  281. dataTimeMap[classifyName+"_"+classifyType+"_"+dealTypeStr+"_"+dealShortName+"_"+tmpTimeStr] = tmp0
  282. onlyEmptyMap[classifyName+"_"+classifyType+"_"+tmpTimeStr+"_"+dealShortName+"_"+dealTypeStr] = true
  283. onlyEmptyNameMap[classifyName+"_"+classifyType+"_"+tmpTimeStr+"_"+dealShortName] = tmp0
  284. }
  285. }
  286. return
  287. }
  288. // DealYesterdayData 更新昨日数据
  289. func DealYesterdayData(exchange, startDate string) (err error) {
  290. // 查询最早的日期
  291. firstItem, err := data_manage.GetFirstBaseFromTradeIndexByDate(exchange)
  292. if err != nil {
  293. return
  294. }
  295. if startDate == firstItem.DataTime { //如果当前是起始日,则无需统计修改前一天的数据
  296. return
  297. }
  298. // 前一个交易日, 前两个交易日
  299. dates, e := data_manage.GetTradePositionTopOriginDataTimes(exchange)
  300. if e != nil {
  301. err = fmt.Errorf("GetTradePositionTopOriginDataTimes err: %s", e.Error())
  302. return
  303. }
  304. yesterdayStr := getPrevTradeDataDate(startDate, dates)
  305. beforeYesterdayStr := getPrevTradeDataDate(yesterdayStr, dates)
  306. //yesterdayStr, err := getYesterdayDate(startDate)
  307. //if err != nil {
  308. // return
  309. //}
  310. ////查找前日的值,并更新对应的更改
  311. //beforeYesterdayStr, err := getYesterdayDate(yesterdayStr)
  312. //if err != nil {
  313. // return
  314. //}
  315. // 先查出T日最原始的数据
  316. originList, err := data_manage.GetTradePositionTopByExchangeDataTime(exchange, startDate, startDate)
  317. if err != nil {
  318. return
  319. }
  320. originBuyMap := make(map[string]*data_manage.TradePositionTop)
  321. originSoldMap := make(map[string]*data_manage.TradePositionTop)
  322. for _, v := range originList {
  323. if v.SourceType != 0 {
  324. continue
  325. }
  326. str := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DealShortName
  327. if v.DealType == 1 {
  328. originBuyMap[str] = v
  329. } else if v.DealType == 2 {
  330. originSoldMap[str] = v
  331. }
  332. }
  333. // 然后查询T-1中数据来源类型是2的数据
  334. changeList, err := data_manage.GetTradePositionTopByExchangeSourceType(exchange, yesterdayStr, 2)
  335. if err != nil {
  336. return
  337. }
  338. if len(changeList) <= 0 {
  339. //err = fmt.Errorf("前天的数据无需修改")
  340. return
  341. }
  342. // 查询出前日的成交量
  343. beforeYesterdayList, err := data_manage.GetTradePositionTopByExchangeDataTime(exchange, beforeYesterdayStr, beforeYesterdayStr)
  344. if err != nil {
  345. return
  346. }
  347. beforeYesterdayMap1 := make(map[string]int)
  348. beforeYesterdayMap2 := make(map[string]int)
  349. if len(beforeYesterdayList) > 0 {
  350. for _, v := range beforeYesterdayList {
  351. if v.SourceType == 2 {
  352. continue
  353. }
  354. str := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DealShortName
  355. if v.DealType == 1 {
  356. beforeYesterdayMap1[str] = v.DealValue
  357. } else if v.DealType == 2 {
  358. beforeYesterdayMap2[str] = v.DealValue
  359. }
  360. }
  361. }
  362. // 根据原始数据中的值推算出最新的值
  363. now := time.Now()
  364. // 批量更新到分析表中,
  365. var updateAnalysisData []data_manage.UpdateDealValueChange
  366. for _, v := range changeList {
  367. str := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DealShortName
  368. dealValue := 0
  369. dealChange := 0
  370. if v.DealType == 1 {
  371. if n, ok := originBuyMap[str]; ok {
  372. dealValue = n.DealValue - n.DealChange
  373. if beforeVal, ok1 := beforeYesterdayMap1[str]; ok1 {
  374. dealChange = dealValue - beforeVal
  375. }
  376. tmp := data_manage.UpdateDealValueChange{
  377. Id: v.Id,
  378. DealValue: dealValue,
  379. DealChange: dealChange,
  380. SourceType: 1,
  381. ModifyTime: now,
  382. }
  383. updateAnalysisData = append(updateAnalysisData, tmp)
  384. }
  385. } else if v.DealType == 2 {
  386. if n, ok := originSoldMap[str]; ok {
  387. dealValue = n.DealValue - n.DealChange
  388. if beforeVal, ok1 := beforeYesterdayMap2[str]; ok1 {
  389. dealChange = dealValue - beforeVal
  390. }
  391. tmp := data_manage.UpdateDealValueChange{
  392. Id: v.Id,
  393. DealValue: dealValue,
  394. DealChange: dealChange,
  395. SourceType: 1,
  396. ModifyTime: now,
  397. }
  398. updateAnalysisData = append(updateAnalysisData, tmp)
  399. }
  400. }
  401. }
  402. if len(updateAnalysisData) > 0 {
  403. err = data_manage.MultiUpdatePositionTop(exchange, updateAnalysisData)
  404. if err != nil {
  405. return
  406. }
  407. //删除T-1日净多单和净空单的榜单
  408. err = data_manage.DeletePositionTopByDataTime(exchange, yesterdayStr, 3)
  409. if err != nil {
  410. return
  411. }
  412. err = data_manage.DeletePositionTopByDataTime(exchange, yesterdayStr, 4)
  413. if err != nil {
  414. return
  415. }
  416. //重新生成净多单和净空单的榜单
  417. err = createAnalysisCleanTop(exchange, yesterdayStr, yesterdayStr)
  418. if err != nil {
  419. return
  420. }
  421. }
  422. return
  423. }
  424. // createAnalysisCleanTop 生成净多单,净空单榜单
  425. func createAnalysisCleanTop(exchange, startDate, endDate string) (err error) {
  426. defer func() {
  427. if err != nil {
  428. fmt.Println("createAnalysisCleanTop err: " + err.Error())
  429. }
  430. }()
  431. topList := make([]*data_manage.TradePositionTop, 0)
  432. now := time.Now()
  433. var subDataList data_manage.TradePositionSubList
  434. subChangeMap1 := make(map[string]int) //净多单map
  435. subChangeMap2 := make(map[string]int) //净空单map
  436. // 2023-05-10 此处取前一个交易日, 不一定是昨日
  437. dates, e := data_manage.GetTradePositionTopOriginDataTimes(exchange)
  438. if e != nil {
  439. err = fmt.Errorf("GetTradePositionTopOriginDataTimes err: %s", e.Error())
  440. return
  441. }
  442. yesterday := getPrevTradeDataDate(startDate, dates)
  443. //查询所有差值数据,
  444. //yesterday, err := getYesterdayDate(startDate)
  445. //if err != nil {
  446. // return
  447. //}
  448. // 上一个交易日的净多单
  449. yesterdayTopList1, tErr := data_manage.GetTradePositionTopByExchangeDataTimeType(exchange, yesterday, 3)
  450. if tErr != nil {
  451. err = tErr
  452. return
  453. }
  454. if len(yesterdayTopList1) > 0 {
  455. for _, v := range yesterdayTopList1 {
  456. nameStr := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DataTime + "_" + v.DealShortName
  457. subChangeMap1[nameStr] = v.DealValue
  458. }
  459. }
  460. // 上一个交易日的净空单
  461. yesterdayTopList2, tErr := data_manage.GetTradePositionTopByExchangeDataTimeType(exchange, yesterday, 4)
  462. if tErr != nil {
  463. err = tErr
  464. return
  465. }
  466. if len(yesterdayTopList2) > 0 {
  467. for _, v := range yesterdayTopList2 {
  468. nameStr := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DataTime + "_" + v.DealShortName
  469. subChangeMap2[nameStr] = v.DealValue
  470. }
  471. }
  472. // 根据当日多单/空单数据, 生成净多单/净空单数据
  473. originDataList, err := data_manage.GetTradePositionTopByExchangeDataTime(exchange, startDate, endDate)
  474. if err != nil {
  475. return
  476. }
  477. buyDataMap := make(map[string]int)
  478. for _, v := range originDataList {
  479. str := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DataTime + "_" + v.DealShortName
  480. if v.DealType == 1 {
  481. buyDataMap[str] = v.DealValue
  482. } else if v.DealType == 2 {
  483. subValue := 0
  484. dealType := 0
  485. if buy, ok := buyDataMap[str]; ok {
  486. subValue = buy - v.DealValue
  487. if subValue >= 0 {
  488. dealType = 3
  489. } else {
  490. subValue = -subValue
  491. dealType = 4
  492. }
  493. }
  494. tmp := &data_manage.TradePositionSub{
  495. ClassifyName: v.ClassifyName,
  496. ClassifyType: v.ClassifyType,
  497. DataTime: v.DataTime,
  498. DealShortName: v.DealShortName,
  499. SubValue: subValue,
  500. DealType: dealType,
  501. }
  502. subDataList = append(subDataList, tmp)
  503. }
  504. }
  505. if len(subDataList) > 0 {
  506. sort.Sort(subDataList)
  507. }
  508. // 根据净多单/净空单数据, 比对上一个交易日的日期计算成交变化量, 并写入
  509. var dealType int
  510. rankMap := make(map[string]int)
  511. for _, v := range subDataList {
  512. subValue := v.SubValue
  513. nameStr := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DataTime + "_" + v.DealShortName
  514. if v.DealType == 3 {
  515. subChangeMap1[nameStr] = subValue
  516. dealType = 3
  517. if _, ok := rankMap[v.ClassifyName+"_"+v.ClassifyType+"_"+v.DataTime+"_3"]; !ok {
  518. rankMap[v.ClassifyName+"_"+v.ClassifyType+"_"+v.DataTime+"_3"] = 1
  519. } else {
  520. rankMap[v.ClassifyName+"_"+v.ClassifyType+"_"+v.DataTime+"_3"]++
  521. }
  522. } else if v.DealType == 4 {
  523. subChangeMap2[nameStr] = subValue
  524. dealType = 4
  525. if _, ok := rankMap[v.ClassifyName+"_"+v.ClassifyType+"_"+v.DataTime+"_4"]; !ok {
  526. rankMap[v.ClassifyName+"_"+v.ClassifyType+"_"+v.DataTime+"_4"] = 1
  527. } else {
  528. rankMap[v.ClassifyName+"_"+v.ClassifyType+"_"+v.DataTime+"_4"]++
  529. }
  530. }
  531. // 2023-05-10 目前看该方法的引用startDate和endDate其实是同一天, 所以前一个交易日直接用上面的yesterday
  532. tmpTimeStr := yesterday
  533. //和T-1日比较差值
  534. //var tmpTimeStr string
  535. //tmpTimeStr, err = getYesterdayDate(v.DataTime)
  536. //if err != nil {
  537. // return
  538. //}
  539. yesterdayStr := v.ClassifyName + "_" + v.ClassifyType + "_" + tmpTimeStr + "_" + v.DealShortName
  540. dealChange := 0
  541. if dealType == 3 {
  542. if c, ok := subChangeMap1[yesterdayStr]; ok {
  543. dealChange = subValue - c
  544. }
  545. } else if dealType == 4 {
  546. if c, ok := subChangeMap2[yesterdayStr]; ok {
  547. dealChange = subValue - c
  548. }
  549. }
  550. tmp := &data_manage.TradePositionTop{
  551. ClassifyName: v.ClassifyName,
  552. ClassifyType: v.ClassifyType,
  553. DataTime: v.DataTime,
  554. CreateTime: now,
  555. ModifyTime: now,
  556. DealShortName: v.DealShortName,
  557. DealValue: subValue,
  558. DealChange: dealChange,
  559. DealType: dealType,
  560. Rank: rankMap[v.ClassifyName+"_"+v.ClassifyType+"_"+v.DataTime+"_"+strconv.Itoa(dealType)],
  561. }
  562. topList = append(topList, tmp)
  563. if len(topList) >= 1000 {
  564. err = data_manage.InsertMultiTradePositionTop(exchange, topList)
  565. if err != nil {
  566. return
  567. }
  568. topList = make([]*data_manage.TradePositionTop, 0)
  569. }
  570. }
  571. if len(topList) >= 0 {
  572. err = data_manage.InsertMultiTradePositionTop(exchange, topList)
  573. if err != nil {
  574. return
  575. }
  576. }
  577. return
  578. }
  579. func getYesterdayDate(today string) (yesterday string, err error) {
  580. i := 1
  581. tmpTime, err := time.ParseInLocation(utils.FormatDate, today, time.Local)
  582. if err != nil {
  583. return
  584. }
  585. tmpTimeDate := tmpTime.AddDate(0, 0, -i)
  586. weekStr := tmpTimeDate.Weekday().String()
  587. if weekStr == "Sunday" {
  588. i += 2
  589. } else if weekStr == "Saturday" {
  590. i += 1
  591. }
  592. tmpTimeDate = tmpTime.AddDate(0, 0, -i)
  593. yesterday = tmpTimeDate.Format(utils.FormatDate)
  594. return
  595. }
  596. // getPrevTradeDataDate 获取指定日期上一个交易日日期
  597. func getPrevTradeDataDate(date string, dates []string) string {
  598. pre := -1
  599. for k, v := range dates {
  600. n := k - 1
  601. if v == date && n >= 0 {
  602. pre = n
  603. break
  604. }
  605. }
  606. // 找不到就随便给个不存在日期
  607. if pre == -1 {
  608. return "1980-01-01"
  609. }
  610. return dates[pre]
  611. }