trade_position_analysis.go 18 KB

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