|
@@ -4,6 +4,7 @@ import (
|
|
"context"
|
|
"context"
|
|
"fmt"
|
|
"fmt"
|
|
"hongze/hongze_task/models/data_manage"
|
|
"hongze/hongze_task/models/data_manage"
|
|
|
|
+ "hongze/hongze_task/services/alarm_msg"
|
|
"hongze/hongze_task/utils"
|
|
"hongze/hongze_task/utils"
|
|
"sort"
|
|
"sort"
|
|
"strconv"
|
|
"strconv"
|
|
@@ -12,32 +13,101 @@ import (
|
|
|
|
|
|
// InitPositionTask 统计今日交易所的持仓分析数据
|
|
// InitPositionTask 统计今日交易所的持仓分析数据
|
|
func InitPositionTask(cont context.Context) (err error) {
|
|
func InitPositionTask(cont context.Context) (err error) {
|
|
- exchanges := []string{"zhengzhou","dalian","shanghai","cffex","ine"} //郑商所,大商所,上期所,中金所,上期能源
|
|
|
|
- startDate := time.Now().Format(utils.FormatDate)
|
|
|
|
- endDate := startDate
|
|
|
|
- for _, v := range exchanges {
|
|
|
|
- exchange := v
|
|
|
|
- err = nil
|
|
|
|
- fmt.Println("InitPositionTask: 启动:"+exchange)
|
|
|
|
- utils.FileLog.Info("InitPositionTask: 启动:"+exchange)
|
|
|
|
-
|
|
|
|
- fmt.Println("开始"+startDate+"结束"+endDate)
|
|
|
|
- utils.FileLog.Info(fmt.Sprintf("InitTradePosition:开始:%s; 结束:%s", startDate, endDate))
|
|
|
|
- tErr, errMsg := InitTradePosition(exchange, startDate, endDate)
|
|
|
|
- if tErr != nil {
|
|
|
|
- err = tErr
|
|
|
|
- fmt.Println("InitTradePosition: 操作失败:"+errMsg+tErr.Error())
|
|
|
|
- utils.FileLog.Info(fmt.Sprintf("InitTradePosition: 操作失败:%s:%s", errMsg, tErr.Error()))
|
|
|
|
- continue
|
|
|
|
|
|
+ exchanges := []string{"zhengzhou", "dalian", "shanghai", "cffex", "ine"} //郑商所,大商所,上期所,中金所,上期能源
|
|
|
|
+ for i := 1; i >= 0; i-- {
|
|
|
|
+ startDate := time.Now().AddDate(0, 0, -i).Format(utils.FormatDate)
|
|
|
|
+ endDate := startDate
|
|
|
|
+ for _, v := range exchanges {
|
|
|
|
+ exchange := v
|
|
|
|
+ err = nil
|
|
|
|
+ fmt.Println("InitPositionTask: 启动:" + exchange)
|
|
|
|
+ utils.FileLog.Info("InitPositionTask: 启动:" + exchange)
|
|
|
|
+
|
|
|
|
+ fmt.Println("开始" + startDate + "结束" + endDate)
|
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("InitTradePosition:开始:%s; 结束:%s", startDate, endDate))
|
|
|
|
+ tErr, errMsg := InitTradePosition(exchange, startDate, endDate)
|
|
|
|
+ if tErr != nil {
|
|
|
|
+ err = tErr
|
|
|
|
+ fmt.Println("InitTradePosition: 操作失败:" + errMsg + tErr.Error())
|
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("InitTradePosition: 操作失败:%s:%s", errMsg, tErr.Error()))
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fmt.Println("InitTradePosition:" + exchange + "已完成")
|
|
|
|
+ utils.FileLog.Info("InitTradePosition:" + exchange + "已完成")
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 处理交易所的分类
|
|
|
|
+ {
|
|
|
|
+ allBaseFromTradeClassify, tmpErr := data_manage.GetAllBaseFromTradeClassify()
|
|
|
|
+ if tmpErr != nil {
|
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("获取所有交易所分类失败,;err:%s", tmpErr.Error()))
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ tradeClassifyMap := make(map[string]*data_manage.BaseFromTradeClassify)
|
|
|
|
+ for _, v := range allBaseFromTradeClassify {
|
|
|
|
+ key := fmt.Sprintf("%s_%s_%s", v.Exchange, v.ClassifyName, v.ClassifyType)
|
|
|
|
+ tradeClassifyMap[key] = v
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ baseFromTradeClassifyList := make([]*data_manage.BaseFromTradeClassify, 0)
|
|
|
|
+ for _, v := range exchanges {
|
|
|
|
+ tradeClassifyNameList, tmpErr := data_manage.GetExchangeClassify(v)
|
|
|
|
+ if tmpErr != nil {
|
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("获取%s分类失败,;err:%s", v, tmpErr.Error()))
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, classify := range tradeClassifyNameList {
|
|
|
|
+ key := fmt.Sprintf("%s_%s_%s", v, classify.ClassifyName, classify.ClassifyType)
|
|
|
|
+
|
|
|
|
+ if tradeClassify, ok := tradeClassifyMap[key]; !ok {
|
|
|
|
+ baseFromTradeClassifyList = append(baseFromTradeClassifyList, &data_manage.BaseFromTradeClassify{
|
|
|
|
+ Id: 0,
|
|
|
|
+ ClassifyName: classify.ClassifyName,
|
|
|
|
+ ClassifyType: classify.ClassifyType,
|
|
|
|
+ Exchange: v,
|
|
|
|
+ LatestDate: classify.DataTime,
|
|
|
|
+ CreateTime: time.Now(),
|
|
|
|
+ ModifyTime: classify.ModifyTime,
|
|
|
|
+ })
|
|
|
|
+ } else {
|
|
|
|
+ if tradeClassify.LatestDate.Before(classify.DataTime) {
|
|
|
|
+ tradeClassify.LatestDate = classify.DataTime
|
|
|
|
+ tradeClassify.ModifyTime = classify.ModifyTime
|
|
|
|
+ tradeClassify.Update([]string{"LatestDate", "ModifyTime"})
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- fmt.Println("InitTradePosition:"+exchange+"已完成")
|
|
|
|
- utils.FileLog.Info("InitTradePosition:"+exchange+"已完成")
|
|
|
|
|
|
+ lenAddList := len(baseFromTradeClassifyList)
|
|
|
|
+ if lenAddList > 0 {
|
|
|
|
+ baseAddNum := 500
|
|
|
|
+ num := lenAddList / baseAddNum
|
|
|
|
+ lastNum := lenAddList % baseAddNum
|
|
|
|
+ for i := 0; i <= num; i++ {
|
|
|
|
+ tmpNum := baseAddNum
|
|
|
|
+ if i == num && lastNum > 0 {
|
|
|
|
+ tmpNum = lastNum
|
|
|
|
+ }
|
|
|
|
+ data_manage.MultiAddBaseFromTradeClassify(baseFromTradeClassifyList[i*baseAddNum : (i*baseAddNum + tmpNum)])
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
func InitTradePosition(exchange, startDate, endDate string) (err error, errMsg string) {
|
|
func InitTradePosition(exchange, startDate, endDate string) (err error, errMsg string) {
|
|
|
|
+ defer func() {
|
|
|
|
+ if err != nil {
|
|
|
|
+ tips := fmt.Sprintf("统计今日交易所的持仓分析数据失败, Exchange: %s, Err: %s, Msg: %s", exchange, err.Error(), errMsg)
|
|
|
|
+ alarm_msg.SendAlarmMsg(tips, 3)
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
|
|
+
|
|
// 批量插入今日的初始值
|
|
// 批量插入今日的初始值
|
|
num, err := data_manage.GetTradePositionTopCountByExchangeDataTime(exchange, startDate, endDate)
|
|
num, err := data_manage.GetTradePositionTopCountByExchangeDataTime(exchange, startDate, endDate)
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -45,8 +115,32 @@ func InitTradePosition(exchange, startDate, endDate string) (err error, errMsg s
|
|
return
|
|
return
|
|
}
|
|
}
|
|
if num > 0 {
|
|
if num > 0 {
|
|
- err = fmt.Errorf("数据已存在,无需处理")
|
|
|
|
- return
|
|
|
|
|
|
+ //err = fmt.Errorf("数据已存在,无需处理")
|
|
|
|
+ //数据存在不同步的情况,有些合约会提早更新,有些合约会延迟更新
|
|
|
|
+ //判断合约数是否一致
|
|
|
|
+
|
|
|
|
+ originNum, tmpErr := data_manage.GetTradePositionOriginClassifyCountByExchangeDataTime(exchange, startDate, endDate)
|
|
|
|
+ if tmpErr != nil {
|
|
|
|
+ err = tmpErr
|
|
|
|
+ errMsg = "查询原始数据分类个数失败,GetTradePositionOriginClassifyCountByExchangeDataTime() Err: "
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ topNum, tmpErr := data_manage.GetTradePositionTopClassifyCountByExchangeDataTime(exchange, startDate, endDate)
|
|
|
|
+ if tmpErr != nil {
|
|
|
|
+ err = tmpErr
|
|
|
|
+ errMsg = "查询榜单数据分类个数失败,GetTradePositionTopClassifyCountByExchangeDataTime() Err: "
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ if originNum == topNum {
|
|
|
|
+ //err = fmt.Errorf("数据已存在,无需处理")
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ //如果合约数不一致,则删除今日数据
|
|
|
|
+ err = data_manage.DeleteTradePositionTopAllByExchangeDataTime(exchange, startDate, endDate)
|
|
|
|
+ if err != nil {
|
|
|
|
+ errMsg = "删除榜单数据失败,DeleteTradePositionTopAllByExchangeDataTime() Err: "
|
|
|
|
+ return
|
|
|
|
+ }
|
|
}
|
|
}
|
|
err = data_manage.MultiInsertTradeBaseDataToTop(exchange, startDate, endDate)
|
|
err = data_manage.MultiInsertTradeBaseDataToTop(exchange, startDate, endDate)
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -59,10 +153,26 @@ func InitTradePosition(exchange, startDate, endDate string) (err error, errMsg s
|
|
return
|
|
return
|
|
}
|
|
}
|
|
if len(originList) <= 0 {
|
|
if len(originList) <= 0 {
|
|
|
|
+ // 忽略周末
|
|
|
|
+ w := time.Now().Weekday().String()
|
|
|
|
+ if w == "Saturday" || w == "Sunday" {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ // 每天最后一个小时执行依旧无数据时, 才进行邮件提示
|
|
|
|
+ if time.Now().Hour() != 23 {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
err = fmt.Errorf("原始数据没有值")
|
|
err = fmt.Errorf("原始数据没有值")
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // 原始数据日期
|
|
|
|
+ dates, e := data_manage.GetTradePositionTopOriginDataTimes(exchange)
|
|
|
|
+ if e != nil {
|
|
|
|
+ err = fmt.Errorf("GetTradePositionTopOriginDataTimes err: %s", e.Error())
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
now := time.Now()
|
|
now := time.Now()
|
|
dataTimeMap := make(map[string]*data_manage.TradePositionTop)
|
|
dataTimeMap := make(map[string]*data_manage.TradePositionTop)
|
|
onlyEmptyMap := make(map[string]bool)
|
|
onlyEmptyMap := make(map[string]bool)
|
|
@@ -71,7 +181,7 @@ func InitTradePosition(exchange, startDate, endDate string) (err error, errMsg s
|
|
topLastRankMap := make(map[string]int)
|
|
topLastRankMap := make(map[string]int)
|
|
list := make([]*data_manage.TradePositionTop, 0)
|
|
list := make([]*data_manage.TradePositionTop, 0)
|
|
for _, v := range originList {
|
|
for _, v := range originList {
|
|
- tmp0, tmpErr := dealTradeOriginData(dataTimeMap, onlyEmptyMap, onlyEmptyNameMap, v, topLastMap, topLastRankMap, startDate, now)
|
|
|
|
|
|
+ tmp0, tmpErr := dealTradeOriginData(dataTimeMap, onlyEmptyMap, onlyEmptyNameMap, v, topLastMap, topLastRankMap, startDate, now, dates)
|
|
if tmpErr != nil {
|
|
if tmpErr != nil {
|
|
err = tmpErr
|
|
err = tmpErr
|
|
errMsg = "处理原始数据失败 dealTradeOriginData() Err: "
|
|
errMsg = "处理原始数据失败 dealTradeOriginData() Err: "
|
|
@@ -153,7 +263,7 @@ func InitTradePosition(exchange, startDate, endDate string) (err error, errMsg s
|
|
errMsg = "创建净多单,净空单数据失败,createAnalysisCleanTop() Err: "
|
|
errMsg = "创建净多单,净空单数据失败,createAnalysisCleanTop() Err: "
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- // 特殊处理起始日期前一天的数据
|
|
|
|
|
|
+
|
|
err = DealYesterdayData(exchange, startDate)
|
|
err = DealYesterdayData(exchange, startDate)
|
|
if err != nil {
|
|
if err != nil {
|
|
errMsg = "处理昨日数据失败,DealYesterdayData() Err: "
|
|
errMsg = "处理昨日数据失败,DealYesterdayData() Err: "
|
|
@@ -162,7 +272,7 @@ func InitTradePosition(exchange, startDate, endDate string) (err error, errMsg s
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
-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) (tmp0 *data_manage.TradePositionTop, err error) {
|
|
|
|
|
|
+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) {
|
|
classifyName := currentItem.ClassifyName
|
|
classifyName := currentItem.ClassifyName
|
|
classifyType := currentItem.ClassifyType
|
|
classifyType := currentItem.ClassifyType
|
|
dealShortName := currentItem.DealShortName
|
|
dealShortName := currentItem.DealShortName
|
|
@@ -179,11 +289,12 @@ func dealTradeOriginData(dataTimeMap map[string]*data_manage.TradePositionTop, o
|
|
topLastRankMap[classifyName+"_"+classifyType+"_"+dataTime+"_"+dealTypeStr] = currentItem.Rank
|
|
topLastRankMap[classifyName+"_"+classifyType+"_"+dataTime+"_"+dealTypeStr] = currentItem.Rank
|
|
}
|
|
}
|
|
if dataTime > startDate {
|
|
if dataTime > startDate {
|
|
- tmpTimeStr, tErr := getYesterdayDate(dataTime)
|
|
|
|
- if tErr != nil {
|
|
|
|
- err = tErr
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
|
|
+ //tmpTimeStr, tErr := getYesterdayDate(dataTime)
|
|
|
|
+ //if tErr != nil {
|
|
|
|
+ // err = tErr
|
|
|
|
+ // return
|
|
|
|
+ //}
|
|
|
|
+ tmpTimeStr := getPrevTradeDataDate(dataTime, dates)
|
|
if tmpTimeStr < startDate {
|
|
if tmpTimeStr < startDate {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
@@ -191,7 +302,8 @@ func dealTradeOriginData(dataTimeMap map[string]*data_manage.TradePositionTop, o
|
|
if _, ok := dataTimeMap[classifyName+"_"+classifyType+"_"+dealTypeStr+"_"+dealShortName+"_"+tmpTimeStr]; !ok {
|
|
if _, ok := dataTimeMap[classifyName+"_"+classifyType+"_"+dealTypeStr+"_"+dealShortName+"_"+tmpTimeStr]; !ok {
|
|
yesterdayVal := dealValue - dealChange
|
|
yesterdayVal := dealValue - dealChange
|
|
yesterdayChange := 0
|
|
yesterdayChange := 0
|
|
- beforeYesterday, _ := getYesterdayDate(tmpTimeStr)
|
|
|
|
|
|
+ //beforeYesterday, _ := getYesterdayDate(tmpTimeStr)
|
|
|
|
+ beforeYesterday := getPrevTradeDataDate(tmpTimeStr, dates)
|
|
beforeYesterdayItem, ok1 := dataTimeMap[classifyName+"_"+classifyType+"_"+dealTypeStr+"_"+dealShortName+"_"+beforeYesterday]
|
|
beforeYesterdayItem, ok1 := dataTimeMap[classifyName+"_"+classifyType+"_"+dealTypeStr+"_"+dealShortName+"_"+beforeYesterday]
|
|
if ok1 {
|
|
if ok1 {
|
|
yesterdayChange = yesterdayVal - beforeYesterdayItem.DealValue
|
|
yesterdayChange = yesterdayVal - beforeYesterdayItem.DealValue
|
|
@@ -216,7 +328,7 @@ func dealTradeOriginData(dataTimeMap map[string]*data_manage.TradePositionTop, o
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
-// 更新昨日数据
|
|
|
|
|
|
+// DealYesterdayData 更新昨日数据
|
|
func DealYesterdayData(exchange, startDate string) (err error) {
|
|
func DealYesterdayData(exchange, startDate string) (err error) {
|
|
// 查询最早的日期
|
|
// 查询最早的日期
|
|
firstItem, err := data_manage.GetFirstBaseFromTradeIndexByDate(exchange)
|
|
firstItem, err := data_manage.GetFirstBaseFromTradeIndexByDate(exchange)
|
|
@@ -227,15 +339,24 @@ func DealYesterdayData(exchange, startDate string) (err error) {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
- yesterdayStr, err := getYesterdayDate(startDate)
|
|
|
|
- if err != nil {
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- //查找前日的值,并更新对应的更改
|
|
|
|
- beforeYesterdayStr, err := getYesterdayDate(yesterdayStr)
|
|
|
|
- if err != nil {
|
|
|
|
|
|
+ // 前一个交易日, 前两个交易日
|
|
|
|
+ dates, e := data_manage.GetTradePositionTopOriginDataTimes(exchange)
|
|
|
|
+ if e != nil {
|
|
|
|
+ err = fmt.Errorf("GetTradePositionTopOriginDataTimes err: %s", e.Error())
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+ yesterdayStr := getPrevTradeDataDate(startDate, dates)
|
|
|
|
+ beforeYesterdayStr := getPrevTradeDataDate(yesterdayStr, dates)
|
|
|
|
+
|
|
|
|
+ //yesterdayStr, err := getYesterdayDate(startDate)
|
|
|
|
+ //if err != nil {
|
|
|
|
+ // return
|
|
|
|
+ //}
|
|
|
|
+ ////查找前日的值,并更新对应的更改
|
|
|
|
+ //beforeYesterdayStr, err := getYesterdayDate(yesterdayStr)
|
|
|
|
+ //if err != nil {
|
|
|
|
+ // return
|
|
|
|
+ //}
|
|
// 先查出T日最原始的数据
|
|
// 先查出T日最原始的数据
|
|
originList, err := data_manage.GetTradePositionTopByExchangeDataTime(exchange, startDate, startDate)
|
|
originList, err := data_manage.GetTradePositionTopByExchangeDataTime(exchange, startDate, startDate)
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -345,6 +466,12 @@ func DealYesterdayData(exchange, startDate string) (err error) {
|
|
if err != nil {
|
|
if err != nil {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ //T-1日重新生成净多单和净空单的榜单后,需要更新T日净多单和净空单榜单里的变化量
|
|
|
|
+ err = updateAnalysisCleanTopChangeVal(exchange, startDate, yesterdayStr)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
return
|
|
return
|
|
@@ -352,17 +479,34 @@ func DealYesterdayData(exchange, startDate string) (err error) {
|
|
|
|
|
|
// createAnalysisCleanTop 生成净多单,净空单榜单
|
|
// createAnalysisCleanTop 生成净多单,净空单榜单
|
|
func createAnalysisCleanTop(exchange, startDate, endDate string) (err error) {
|
|
func createAnalysisCleanTop(exchange, startDate, endDate string) (err error) {
|
|
|
|
+ defer func() {
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Println("createAnalysisCleanTop err: " + err.Error())
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
|
|
+
|
|
topList := make([]*data_manage.TradePositionTop, 0)
|
|
topList := make([]*data_manage.TradePositionTop, 0)
|
|
now := time.Now()
|
|
now := time.Now()
|
|
var subDataList data_manage.TradePositionSubList
|
|
var subDataList data_manage.TradePositionSubList
|
|
|
|
|
|
subChangeMap1 := make(map[string]int) //净多单map
|
|
subChangeMap1 := make(map[string]int) //净多单map
|
|
subChangeMap2 := make(map[string]int) //净空单map
|
|
subChangeMap2 := make(map[string]int) //净空单map
|
|
- //查询所有差值数据,
|
|
|
|
- yesterday, err := getYesterdayDate(startDate)
|
|
|
|
- if err != nil {
|
|
|
|
|
|
+
|
|
|
|
+ // 2023-05-10 此处取前一个交易日, 不一定是昨日
|
|
|
|
+ dates, e := data_manage.GetTradePositionTopOriginDataTimes(exchange)
|
|
|
|
+ if e != nil {
|
|
|
|
+ err = fmt.Errorf("GetTradePositionTopOriginDataTimes err: %s", e.Error())
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+ yesterday := getPrevTradeDataDate(startDate, dates)
|
|
|
|
+
|
|
|
|
+ //查询所有差值数据,
|
|
|
|
+ //yesterday, err := getYesterdayDate(startDate)
|
|
|
|
+ //if err != nil {
|
|
|
|
+ // return
|
|
|
|
+ //}
|
|
|
|
+
|
|
|
|
+ // 上一个交易日的净多单
|
|
yesterdayTopList1, tErr := data_manage.GetTradePositionTopByExchangeDataTimeType(exchange, yesterday, 3)
|
|
yesterdayTopList1, tErr := data_manage.GetTradePositionTopByExchangeDataTimeType(exchange, yesterday, 3)
|
|
if tErr != nil {
|
|
if tErr != nil {
|
|
err = tErr
|
|
err = tErr
|
|
@@ -375,6 +519,7 @@ func createAnalysisCleanTop(exchange, startDate, endDate string) (err error) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // 上一个交易日的净空单
|
|
yesterdayTopList2, tErr := data_manage.GetTradePositionTopByExchangeDataTimeType(exchange, yesterday, 4)
|
|
yesterdayTopList2, tErr := data_manage.GetTradePositionTopByExchangeDataTimeType(exchange, yesterday, 4)
|
|
if tErr != nil {
|
|
if tErr != nil {
|
|
err = tErr
|
|
err = tErr
|
|
@@ -387,6 +532,7 @@ func createAnalysisCleanTop(exchange, startDate, endDate string) (err error) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // 根据当日多单/空单数据, 生成净多单/净空单数据
|
|
originDataList, err := data_manage.GetTradePositionTopByExchangeDataTime(exchange, startDate, endDate)
|
|
originDataList, err := data_manage.GetTradePositionTopByExchangeDataTime(exchange, startDate, endDate)
|
|
if err != nil {
|
|
if err != nil {
|
|
return
|
|
return
|
|
@@ -422,6 +568,8 @@ func createAnalysisCleanTop(exchange, startDate, endDate string) (err error) {
|
|
if len(subDataList) > 0 {
|
|
if len(subDataList) > 0 {
|
|
sort.Sort(subDataList)
|
|
sort.Sort(subDataList)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // 根据净多单/净空单数据, 比对上一个交易日的日期计算成交变化量, 并写入
|
|
var dealType int
|
|
var dealType int
|
|
rankMap := make(map[string]int)
|
|
rankMap := make(map[string]int)
|
|
for _, v := range subDataList {
|
|
for _, v := range subDataList {
|
|
@@ -444,12 +592,16 @@ func createAnalysisCleanTop(exchange, startDate, endDate string) (err error) {
|
|
rankMap[v.ClassifyName+"_"+v.ClassifyType+"_"+v.DataTime+"_4"]++
|
|
rankMap[v.ClassifyName+"_"+v.ClassifyType+"_"+v.DataTime+"_4"]++
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // 2023-05-10 目前看该方法的引用startDate和endDate其实是同一天, 所以前一个交易日直接用上面的yesterday
|
|
|
|
+ tmpTimeStr := yesterday
|
|
|
|
+
|
|
//和T-1日比较差值
|
|
//和T-1日比较差值
|
|
- var tmpTimeStr string
|
|
|
|
- tmpTimeStr, err = getYesterdayDate(v.DataTime)
|
|
|
|
- if err != nil {
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
|
|
+ //var tmpTimeStr string
|
|
|
|
+ //tmpTimeStr, err = getYesterdayDate(v.DataTime)
|
|
|
|
+ //if err != nil {
|
|
|
|
+ // return
|
|
|
|
+ //}
|
|
yesterdayStr := v.ClassifyName + "_" + v.ClassifyType + "_" + tmpTimeStr + "_" + v.DealShortName
|
|
yesterdayStr := v.ClassifyName + "_" + v.ClassifyType + "_" + tmpTimeStr + "_" + v.DealShortName
|
|
dealChange := 0
|
|
dealChange := 0
|
|
if dealType == 3 {
|
|
if dealType == 3 {
|
|
@@ -492,20 +644,85 @@ func createAnalysisCleanTop(exchange, startDate, endDate string) (err error) {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
-func getYesterdayDate(today string) (yesterday string, err error) {
|
|
|
|
- i := 1
|
|
|
|
- tmpTime, err := time.ParseInLocation(utils.FormatDate, today, time.Local)
|
|
|
|
|
|
+// getPrevTradeDataDate 获取指定日期上一个交易日日期
|
|
|
|
+func getPrevTradeDataDate(date string, dates []string) string {
|
|
|
|
+ pre := -1
|
|
|
|
+ for k, v := range dates {
|
|
|
|
+ n := k - 1
|
|
|
|
+ if v == date && n >= 0 {
|
|
|
|
+ pre = n
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // 找不到就随便给个不存在日期
|
|
|
|
+ if pre == -1 {
|
|
|
|
+ return "1980-01-01"
|
|
|
|
+ }
|
|
|
|
+ return dates[pre]
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// updateAnalysisCleanTopChangeVal T-1日重新生成净多单和净空单的榜单后,需要更新T日净多单和净空单榜单里的变化量
|
|
|
|
+func updateAnalysisCleanTopChangeVal(exchange, startDate, yesterday string) (err error) {
|
|
|
|
+ defer func() {
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Println("updateAnalysisCleanTopChangeVal err: " + err.Error())
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ //查询T日的净多单和净空单榜单列表
|
|
|
|
+ //查询T-1日的净多单和净空单列表
|
|
|
|
+ //组装数据,计算T日与T-1日的变更值
|
|
|
|
+ //更新变更值
|
|
|
|
+ topList := make([]*data_manage.TradePositionTop, 0) //T日和T+1日列表
|
|
|
|
+ todayTopList := make([]*data_manage.TradePositionTop, 0) //T日列表
|
|
|
|
+
|
|
|
|
+ yesterdayTopListMap := make(map[string]int) //净多单净空单持仓量map
|
|
|
|
+
|
|
|
|
+ // 查询T日和T-1日的净多单和净空单列表
|
|
|
|
+ topList, err = data_manage.GetTradePositionTopCleanByExchangeDataTime(exchange, yesterday, startDate)
|
|
if err != nil {
|
|
if err != nil {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- tmpTimeDate := tmpTime.AddDate(0, 0, -i)
|
|
|
|
- weekStr := tmpTimeDate.Weekday().String()
|
|
|
|
- if weekStr == "Sunday" {
|
|
|
|
- i += 2
|
|
|
|
- } else if weekStr == "Saturday" {
|
|
|
|
- i += 1
|
|
|
|
|
|
+ if len(topList) == 0 {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ for _, v := range topList {
|
|
|
|
+ if v.DataTime == startDate {
|
|
|
|
+ todayTopList = append(todayTopList, v)
|
|
|
|
+ } else if v.DataTime == yesterday {
|
|
|
|
+ nameStr := v.ClassifyName + "_" + v.ClassifyType + "_" + v.DataTime + "_" + v.DealShortName + "_" + strconv.Itoa(v.DealType)
|
|
|
|
+ yesterdayTopListMap[nameStr] = v.DealValue
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if len(todayTopList) == 0 {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ // 根据净多单/净空单数据, 比对上一个交易日的日期计算成交变化量, 并写入
|
|
|
|
+ now := time.Now()
|
|
|
|
+ updateList := make([]data_manage.UpdateChangeVal, 0)
|
|
|
|
+ for _, v := range todayTopList {
|
|
|
|
+ //T日值-T-1日值
|
|
|
|
+ yesterdayStr := v.ClassifyName + "_" + v.ClassifyType + "_" + yesterday + "_" + v.DealShortName + "_" + strconv.Itoa(v.DealType)
|
|
|
|
+ dealChange := 0
|
|
|
|
+ if c, ok := yesterdayTopListMap[yesterdayStr]; ok {
|
|
|
|
+ dealChange = v.DealValue - c
|
|
|
|
+ }
|
|
|
|
+ if dealChange != v.DealChange {
|
|
|
|
+ tmp := data_manage.UpdateChangeVal{
|
|
|
|
+ Id: v.Id,
|
|
|
|
+ ModifyTime: now,
|
|
|
|
+ DealChange: dealChange,
|
|
|
|
+ }
|
|
|
|
+ updateList = append(updateList, tmp)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if len(updateList) > 0 {
|
|
|
|
+ err = data_manage.MultiUpdatePositionTopChangeVal(exchange, updateList)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- tmpTimeDate = tmpTime.AddDate(0, 0, -i)
|
|
|
|
- yesterday = tmpTimeDate.Format(utils.FormatDate)
|
|
|
|
return
|
|
return
|
|
}
|
|
}
|