|
@@ -144,144 +144,158 @@ func FormatCompanyTradeData2EdbMappings(companyTradeData []*tradeAnalysisModel.C
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func GetOriginTradeData(exchange, classifyName string, contracts, companies []string, predictRatio float64) (companyTradeData []*tradeAnalysisModel.ContractCompanyTradeData, err error) {
|
|
|
+func GetWarehouseTradeData(exchange, classifyName string, contracts, companies []string, predictRatio float64) (companyTradeData []*tradeAnalysisModel.ContractCompanyTradeData, err error) {
|
|
|
// 各原始数据表期货公司名称不一致
|
|
|
- companyMap := make(map[string]string)
|
|
|
- {
|
|
|
- ob := new(tradeAnalysisModel.TradeFuturesCompany)
|
|
|
- list, e := ob.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
|
|
|
- if e != nil {
|
|
|
- err = fmt.Errorf("获取期货公司名称失败: %v", e)
|
|
|
- return
|
|
|
- }
|
|
|
- switch exchange {
|
|
|
- case "zhengzhou":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.ZhengzhouName
|
|
|
- }
|
|
|
- case "dalian":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.DalianName
|
|
|
- }
|
|
|
- case "shanghai":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.ShanghaiName
|
|
|
- }
|
|
|
- case "cffex":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.CffexName
|
|
|
- }
|
|
|
- case "ine":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.IneName
|
|
|
- }
|
|
|
- case "guangzhou":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.GuangzhouName
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- var queryCompanies []string
|
|
|
- for _, v := range companies {
|
|
|
- if v == tradeAnalysisModel.TradeFuturesCompanyTop20 {
|
|
|
- queryCompanies = append(queryCompanies, tradeAnalysisModel.TradeFuturesCompanyTop20)
|
|
|
- continue
|
|
|
- }
|
|
|
- companyName, ok := companyMap[v]
|
|
|
- if !ok {
|
|
|
- utils.FileLog.Info(fmt.Sprintf("交易所%s公司名称映射不存在: %s", exchange, v))
|
|
|
- continue
|
|
|
- }
|
|
|
- queryCompanies = append(queryCompanies, companyName)
|
|
|
- }
|
|
|
-
|
|
|
- // 郑商所/广期所查询方式不一样
|
|
|
- var tradeAnalysis TradeAnalysisInterface
|
|
|
- switch exchange {
|
|
|
- case tradeAnalysisModel.TradeExchangeZhengzhou:
|
|
|
- tradeAnalysis = &ZhengzhouTradeAnalysis{}
|
|
|
- case tradeAnalysisModel.TradeExchangeGuangzhou:
|
|
|
- tradeAnalysis = &GuangzhouTradeAnalysis{}
|
|
|
- default:
|
|
|
- tradeAnalysis = &BaseTradeAnalysis{}
|
|
|
- }
|
|
|
-
|
|
|
- // 获取多单/空单原始数据
|
|
|
- originList, e := tradeAnalysis.GetTradeDataByClassifyAndCompany(exchange, []string{classifyName}, contracts, queryCompanies, time.Time{}, time.Time{})
|
|
|
+ //companyMap := make(map[string]string)
|
|
|
+ //{
|
|
|
+ // ob := new(tradeAnalysisModel.TradeFuturesCompany)
|
|
|
+ // list, e := ob.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
|
|
|
+ // if e != nil {
|
|
|
+ // err = fmt.Errorf("获取期货公司名称失败: %v", e)
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // switch exchange {
|
|
|
+ // case "zhengzhou":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.ZhengzhouName
|
|
|
+ // }
|
|
|
+ // case "dalian":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.DalianName
|
|
|
+ // }
|
|
|
+ // case "shanghai":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.ShanghaiName
|
|
|
+ // }
|
|
|
+ // case "cffex":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.CffexName
|
|
|
+ // }
|
|
|
+ // case "ine":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.IneName
|
|
|
+ // }
|
|
|
+ // case "guangzhou":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.GuangzhouName
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ //var queryCompanies []string
|
|
|
+ //for _, v := range companies {
|
|
|
+ // if v == tradeAnalysisModel.TradeFuturesCompanyTop20 {
|
|
|
+ // queryCompanies = append(queryCompanies, tradeAnalysisModel.TradeFuturesCompanyTop20)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // companyName, ok := companyMap[v]
|
|
|
+ // if !ok {
|
|
|
+ // utils.FileLog.Info(fmt.Sprintf("交易所%s公司名称映射不存在: %s", exchange, v))
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // queryCompanies = append(queryCompanies, companyName)
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// 郑商所/广期所查询方式不一样
|
|
|
+ //var tradeAnalysis TradeAnalysisInterface
|
|
|
+ //switch exchange {
|
|
|
+ //case tradeAnalysisModel.TradeExchangeZhengzhou:
|
|
|
+ // tradeAnalysis = &ZhengzhouTradeAnalysis{}
|
|
|
+ //case tradeAnalysisModel.TradeExchangeGuangzhou:
|
|
|
+ // tradeAnalysis = &GuangzhouTradeAnalysis{}
|
|
|
+ //default:
|
|
|
+ // tradeAnalysis = &BaseTradeAnalysis{}
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// 获取多单/空单原始数据
|
|
|
+ ////originList, e := tradeAnalysis.GetTradeDataByClassifyAndCompany(exchange, []string{classifyName}, contracts, queryCompanies, time.Time{}, time.Time{})
|
|
|
+ ////if e != nil {
|
|
|
+ //// err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
|
+ //// return
|
|
|
+ ////}
|
|
|
+ //originList, _, lastOriginList, e := tradeAnalysis.GetTradeDataByContracts(exchange, []string{classifyName}, contracts, queryCompanies, time.Time{}, time.Time{})
|
|
|
+ //if e != nil {
|
|
|
+ // err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
|
+ // return
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //keyItems := make(map[string]*tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
+ //keyDateData := make(map[string]*tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
+ //keyDateDataExist := make(map[string]bool)
|
|
|
+ //for _, v := range originList {
|
|
|
+ // // Rank999-对应的是TOP20
|
|
|
+ // companyName := v.CompanyName
|
|
|
+ // //if v.Rank == 999 {
|
|
|
+ // // companyName = tradeAnalysisModel.TradeFuturesCompanyTop20
|
|
|
+ // //}
|
|
|
+ //
|
|
|
+ // k := fmt.Sprintf("%s-%s", v.ClassifyType, companyName)
|
|
|
+ // if keyItems[k] == nil {
|
|
|
+ // keyItems[k] = new(tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
+ // keyItems[k].CompanyName = companyName
|
|
|
+ // keyItems[k].ClassifyType = v.ClassifyType
|
|
|
+ // keyItems[k].DataList = make([]*tradeAnalysisModel.ContractCompanyTradeDataList, 0)
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // kd := fmt.Sprintf("%s-%s", k, v.DataTime.Format(utils.FormatDate))
|
|
|
+ // if keyDateData[kd] == nil {
|
|
|
+ // keyDateData[kd] = new(tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
+ // keyDateData[kd].Date = v.DataTime
|
|
|
+ // }
|
|
|
+ // if v.ValType == 1 {
|
|
|
+ // keyDateData[kd].BuyVal = v.Val
|
|
|
+ // keyDateData[kd].BuyValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // keyDateData[kd].BuyChange = v.ValChange
|
|
|
+ // keyDateData[kd].BuyChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // }
|
|
|
+ // if v.ValType == 2 {
|
|
|
+ // keyDateData[kd].SoldVal = v.Val
|
|
|
+ // keyDateData[kd].SoldValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // keyDateData[kd].SoldChange = v.ValChange
|
|
|
+ // keyDateData[kd].SoldChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // }
|
|
|
+ // if !keyDateDataExist[kd] {
|
|
|
+ // keyItems[k].DataList = append(keyItems[k].DataList, keyDateData[kd])
|
|
|
+ // keyDateDataExist[kd] = true
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// 获取[合约]每日的末位多空单
|
|
|
+ //contractLastBuyDateVal := make(map[string]map[time.Time]int)
|
|
|
+ //contractLastSoldDateVal := make(map[string]map[time.Time]int)
|
|
|
+ //{
|
|
|
+ // //lastOriginList, e := tradeAnalysis.GetLastTradeDataByClassify(exchange, []string{classifyName}, contracts)
|
|
|
+ // //if e != nil {
|
|
|
+ // // err = fmt.Errorf("获取末位多空单原始数据失败, %v", e)
|
|
|
+ // // return
|
|
|
+ // //}
|
|
|
+ // for _, v := range lastOriginList {
|
|
|
+ // if v.ValType == 1 {
|
|
|
+ // if contractLastBuyDateVal[v.ClassifyType] == nil {
|
|
|
+ // contractLastBuyDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
+ // }
|
|
|
+ // contractLastBuyDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // if contractLastSoldDateVal[v.ClassifyType] == nil {
|
|
|
+ // contractLastSoldDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
+ // }
|
|
|
+ // contractLastSoldDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+
|
|
|
+ //func GetContractCompanyTradeData(exchange string, classifyNames, contracts, companies []string, startDate, endDate time.Time) (contractTradeData map[string]*tradeAnalysisModel.ContractCompanyTradeData, lastBuyVal, lastSoldVal map[string]map[time.Time]int, err error)
|
|
|
+
|
|
|
+ // 获取合约持仓数据
|
|
|
+ contractTradeData, lastBuyVal, lastSoldVal, e := GetContractCompanyTradeData(exchange, []string{classifyName}, contracts, companies, time.Time{}, time.Time{})
|
|
|
if e != nil {
|
|
|
- err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
|
+ err = fmt.Errorf("获取合约-持仓数据失败, %v", e)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- keyItems := make(map[string]*tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
- keyDateData := make(map[string]*tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
- keyDateDataExist := make(map[string]bool)
|
|
|
- for _, v := range originList {
|
|
|
- // Rank999-对应的是TOP20
|
|
|
- companyName := v.CompanyName
|
|
|
- if v.Rank == 999 {
|
|
|
- companyName = tradeAnalysisModel.TradeFuturesCompanyTop20
|
|
|
- }
|
|
|
-
|
|
|
- k := fmt.Sprintf("%s-%s", v.ClassifyType, companyName)
|
|
|
- if keyItems[k] == nil {
|
|
|
- keyItems[k] = new(tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
- keyItems[k].CompanyName = companyName
|
|
|
- keyItems[k].ClassifyType = v.ClassifyType
|
|
|
- keyItems[k].DataList = make([]*tradeAnalysisModel.ContractCompanyTradeDataList, 0)
|
|
|
- }
|
|
|
-
|
|
|
- kd := fmt.Sprintf("%s-%s", k, v.DataTime.Format(utils.FormatDate))
|
|
|
- if keyDateData[kd] == nil {
|
|
|
- keyDateData[kd] = new(tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
- keyDateData[kd].Date = v.DataTime
|
|
|
- }
|
|
|
- if v.ValType == 1 {
|
|
|
- keyDateData[kd].BuyVal = v.Val
|
|
|
- keyDateData[kd].BuyValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
- keyDateData[kd].BuyChange = v.ValChange
|
|
|
- keyDateData[kd].BuyChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
- }
|
|
|
- if v.ValType == 2 {
|
|
|
- keyDateData[kd].SoldVal = v.Val
|
|
|
- keyDateData[kd].SoldValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
- keyDateData[kd].SoldChange = v.ValChange
|
|
|
- keyDateData[kd].SoldChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
- }
|
|
|
- if !keyDateDataExist[kd] {
|
|
|
- keyItems[k].DataList = append(keyItems[k].DataList, keyDateData[kd])
|
|
|
- keyDateDataExist[kd] = true
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 获取[合约]每日的末位多空单
|
|
|
- contractLastBuyDateVal := make(map[string]map[time.Time]int)
|
|
|
- contractLastSoldDateVal := make(map[string]map[time.Time]int)
|
|
|
- {
|
|
|
- lastOriginList, e := tradeAnalysis.GetLastTradeDataByClassify(exchange, []string{classifyName}, contracts)
|
|
|
- if e != nil {
|
|
|
- err = fmt.Errorf("获取末位多空单原始数据失败, %v", e)
|
|
|
- return
|
|
|
- }
|
|
|
- for _, v := range lastOriginList {
|
|
|
- if v.ValType == 1 {
|
|
|
- if contractLastBuyDateVal[v.ClassifyType] == nil {
|
|
|
- contractLastBuyDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
- }
|
|
|
- contractLastBuyDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
- continue
|
|
|
- }
|
|
|
- if contractLastSoldDateVal[v.ClassifyType] == nil {
|
|
|
- contractLastSoldDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
- }
|
|
|
- contractLastSoldDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
// 填充[合约-公司]预估数据, 并根据[公司-多合约]分组, [公司]算作一个指标, 指标值为[多个合约]的计算加总
|
|
|
companyContracts := make(map[string][]*tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
- for _, v := range keyItems {
|
|
|
- td, fd, ed, e := PredictingTradeData(v.DataList, contractLastBuyDateVal[v.ClassifyType], contractLastSoldDateVal[v.ClassifyType], predictRatio)
|
|
|
+ for _, v := range contractTradeData {
|
|
|
+ td, fd, ed, e := PredictingTradeData(v.DataList, lastBuyVal[v.ClassifyType], lastSoldVal[v.ClassifyType], predictRatio)
|
|
|
if e != nil {
|
|
|
err = fmt.Errorf("数据补全失败, %v", e)
|
|
|
return
|
|
@@ -658,13 +672,17 @@ func GetTopContractRank(exchange string, classifyNames []string, dataDate time.T
|
|
|
tradeAnalysis = &BaseTradeAnalysis{}
|
|
|
}
|
|
|
|
|
|
- // TODO:郑商所品种
|
|
|
+ // 郑商所-需要把所选品种转为实际合约进行后续的查询
|
|
|
if exchange == tradeAnalysisModel.TradeExchangeZhengzhou {
|
|
|
-
|
|
|
+ classifies, e := GetZhengzhouContractsByClassifyNames(classifyNames)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("获取郑商所实际合约失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ classifyNames = classifies
|
|
|
}
|
|
|
|
|
|
// 获取多单/空单原始数据
|
|
|
- // TODO:净多单变化
|
|
|
rankData, e := tradeAnalysis.GetContractTopRankData(exchange, classifyNames, dataDate)
|
|
|
if e != nil {
|
|
|
err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
@@ -678,145 +696,158 @@ func GetTopContractRank(exchange string, classifyNames []string, dataDate time.T
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func GetTableTradeData(exchange string, classifyNames, contracts, companies []string, predictRatio float64, baseDate time.Time, contractType int) (companyTradeData []*tradeAnalysisModel.ContractCompanyTradeData, err error) {
|
|
|
+// GetTableTradeData 获取多空分析表格持仓数据
|
|
|
+func GetTableTradeData(exchange string, classifyNames, contracts, companies []string, predictRatio float64, startDate, endDate time.Time, contractType int) (companyTradeData []*tradeAnalysisModel.ContractCompanyTradeData, err error) {
|
|
|
// 各原始数据表期货公司名称不一致
|
|
|
- companyMap := make(map[string]string)
|
|
|
- {
|
|
|
- ob := new(tradeAnalysisModel.TradeFuturesCompany)
|
|
|
- list, e := ob.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
|
|
|
- if e != nil {
|
|
|
- err = fmt.Errorf("获取期货公司名称失败: %v", e)
|
|
|
- return
|
|
|
- }
|
|
|
- switch exchange {
|
|
|
- case "zhengzhou":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.ZhengzhouName
|
|
|
- }
|
|
|
- case "dalian":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.DalianName
|
|
|
- }
|
|
|
- case "shanghai":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.ShanghaiName
|
|
|
- }
|
|
|
- case "cffex":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.CffexName
|
|
|
- }
|
|
|
- case "ine":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.IneName
|
|
|
- }
|
|
|
- case "guangzhou":
|
|
|
- for _, v := range list {
|
|
|
- companyMap[v.CompanyName] = v.GuangzhouName
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- var queryCompanies []string
|
|
|
- for _, v := range companies {
|
|
|
- if v == tradeAnalysisModel.TradeFuturesCompanyTop20 {
|
|
|
- queryCompanies = append(queryCompanies, tradeAnalysisModel.TradeFuturesCompanyTop20)
|
|
|
- continue
|
|
|
- }
|
|
|
- companyName, ok := companyMap[v]
|
|
|
- if !ok {
|
|
|
- utils.FileLog.Info(fmt.Sprintf("交易所%s公司名称映射不存在: %s", exchange, v))
|
|
|
- continue
|
|
|
- }
|
|
|
- queryCompanies = append(queryCompanies, companyName)
|
|
|
- }
|
|
|
-
|
|
|
- // 郑商所/广期所查询方式不一样
|
|
|
- var tradeAnalysis TradeAnalysisInterface
|
|
|
- switch exchange {
|
|
|
- case tradeAnalysisModel.TradeExchangeZhengzhou:
|
|
|
- tradeAnalysis = &ZhengzhouTradeAnalysis{}
|
|
|
- case tradeAnalysisModel.TradeExchangeGuangzhou:
|
|
|
- tradeAnalysis = &GuangzhouTradeAnalysis{}
|
|
|
- default:
|
|
|
- tradeAnalysis = &BaseTradeAnalysis{}
|
|
|
- }
|
|
|
-
|
|
|
- // 获取多单/空单原始数据, 取基准时间前后五天的数据, 填充数据后, 取出基准日期作为结果
|
|
|
- originList, e := tradeAnalysis.GetTradeDataByClassifyAndCompany(exchange, classifyNames, contracts, queryCompanies, baseDate.AddDate(0, 0, -5), baseDate.AddDate(0, 0, 5))
|
|
|
+ //companyMap := make(map[string]string)
|
|
|
+ //{
|
|
|
+ // ob := new(tradeAnalysisModel.TradeFuturesCompany)
|
|
|
+ // list, e := ob.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
|
|
|
+ // if e != nil {
|
|
|
+ // err = fmt.Errorf("获取期货公司名称失败: %v", e)
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // switch exchange {
|
|
|
+ // case "zhengzhou":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.ZhengzhouName
|
|
|
+ // }
|
|
|
+ // case "dalian":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.DalianName
|
|
|
+ // }
|
|
|
+ // case "shanghai":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.ShanghaiName
|
|
|
+ // }
|
|
|
+ // case "cffex":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.CffexName
|
|
|
+ // }
|
|
|
+ // case "ine":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.IneName
|
|
|
+ // }
|
|
|
+ // case "guangzhou":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.GuangzhouName
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ //var queryCompanies []string
|
|
|
+ //for _, v := range companies {
|
|
|
+ // if v == tradeAnalysisModel.TradeFuturesCompanyTop20 {
|
|
|
+ // queryCompanies = append(queryCompanies, tradeAnalysisModel.TradeFuturesCompanyTop20)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // companyName, ok := companyMap[v]
|
|
|
+ // if !ok {
|
|
|
+ // utils.FileLog.Info(fmt.Sprintf("交易所%s公司名称映射不存在: %s", exchange, v))
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // queryCompanies = append(queryCompanies, companyName)
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// 郑商所/广期所查询方式不一样
|
|
|
+ //var tradeAnalysis TradeAnalysisInterface
|
|
|
+ //switch exchange {
|
|
|
+ //case tradeAnalysisModel.TradeExchangeZhengzhou:
|
|
|
+ // tradeAnalysis = &ZhengzhouTradeAnalysis{}
|
|
|
+ //case tradeAnalysisModel.TradeExchangeGuangzhou:
|
|
|
+ // tradeAnalysis = &GuangzhouTradeAnalysis{}
|
|
|
+ //default:
|
|
|
+ // tradeAnalysis = &BaseTradeAnalysis{}
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// 获取多单/空单原始数据, 取基准时间前后五天的数据, 填充数据后, 取出基准日期作为结果
|
|
|
+ ////originList, e := tradeAnalysis.GetTradeDataByClassifyAndCompany(exchange, classifyNames, contracts, queryCompanies, baseDate.AddDate(0, 0, -5), baseDate.AddDate(0, 0, 5))
|
|
|
+ ////if e != nil {
|
|
|
+ //// err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
|
+ //// return
|
|
|
+ ////}
|
|
|
+ //originList, _, lastOriginList, e := tradeAnalysis.GetTradeDataByContracts(exchange, classifyNames, contracts, queryCompanies, baseDate.AddDate(0, 0, -5), baseDate.AddDate(0, 0, 5))
|
|
|
+ //if e != nil {
|
|
|
+ // err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
|
+ // return
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //keyItems := make(map[string]*tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
+ //keyDateData := make(map[string]*tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
+ //keyDateDataExist := make(map[string]bool)
|
|
|
+ //for _, v := range originList {
|
|
|
+ // // Rank999-对应的是TOP20
|
|
|
+ // companyName := v.CompanyName
|
|
|
+ // //if v.Rank == 999 {
|
|
|
+ // // companyName = tradeAnalysisModel.TradeFuturesCompanyTop20
|
|
|
+ // //}
|
|
|
+ //
|
|
|
+ // k := fmt.Sprintf("%s-%s", v.ClassifyType, companyName)
|
|
|
+ // if keyItems[k] == nil {
|
|
|
+ // keyItems[k] = new(tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
+ // keyItems[k].CompanyName = companyName
|
|
|
+ // keyItems[k].ClassifyType = v.ClassifyType
|
|
|
+ // keyItems[k].DataList = make([]*tradeAnalysisModel.ContractCompanyTradeDataList, 0)
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // kd := fmt.Sprintf("%s-%s", k, v.DataTime.Format(utils.FormatDate))
|
|
|
+ // if keyDateData[kd] == nil {
|
|
|
+ // keyDateData[kd] = new(tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
+ // keyDateData[kd].Date = v.DataTime
|
|
|
+ // }
|
|
|
+ // if v.ValType == 1 {
|
|
|
+ // keyDateData[kd].BuyVal = v.Val
|
|
|
+ // keyDateData[kd].BuyValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // keyDateData[kd].BuyChange = v.ValChange
|
|
|
+ // keyDateData[kd].BuyChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // }
|
|
|
+ // if v.ValType == 2 {
|
|
|
+ // keyDateData[kd].SoldVal = v.Val
|
|
|
+ // keyDateData[kd].SoldValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // keyDateData[kd].SoldChange = v.ValChange
|
|
|
+ // keyDateData[kd].SoldChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // }
|
|
|
+ // if !keyDateDataExist[kd] {
|
|
|
+ // keyItems[k].DataList = append(keyItems[k].DataList, keyDateData[kd])
|
|
|
+ // keyDateDataExist[kd] = true
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// 获取[合约]每日的末位多空单
|
|
|
+ //contractLastBuyDateVal := make(map[string]map[time.Time]int)
|
|
|
+ //contractLastSoldDateVal := make(map[string]map[time.Time]int)
|
|
|
+ //{
|
|
|
+ // //lastOriginList, e := tradeAnalysis.GetLastTradeDataByClassify(exchange, classifyNames, contracts)
|
|
|
+ // //if e != nil {
|
|
|
+ // // err = fmt.Errorf("获取末位多空单原始数据失败, %v", e)
|
|
|
+ // // return
|
|
|
+ // //}
|
|
|
+ // for _, v := range lastOriginList {
|
|
|
+ // if v.ValType == 1 {
|
|
|
+ // if contractLastBuyDateVal[v.ClassifyType] == nil {
|
|
|
+ // contractLastBuyDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
+ // }
|
|
|
+ // contractLastBuyDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // if contractLastSoldDateVal[v.ClassifyType] == nil {
|
|
|
+ // contractLastSoldDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
+ // }
|
|
|
+ // contractLastSoldDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+
|
|
|
+ // 获取合约持仓数据
|
|
|
+ contractTradeData, lastBuyVal, lastSoldVal, e := GetContractCompanyTradeData(exchange, classifyNames, contracts, companies, startDate, endDate)
|
|
|
if e != nil {
|
|
|
- err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
|
+ err = fmt.Errorf("获取合约-持仓数据失败, %v", e)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- keyItems := make(map[string]*tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
- keyDateData := make(map[string]*tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
- keyDateDataExist := make(map[string]bool)
|
|
|
- for _, v := range originList {
|
|
|
- // Rank999-对应的是TOP20
|
|
|
- companyName := v.CompanyName
|
|
|
- if v.Rank == 999 {
|
|
|
- companyName = tradeAnalysisModel.TradeFuturesCompanyTop20
|
|
|
- }
|
|
|
-
|
|
|
- k := fmt.Sprintf("%s-%s", v.ClassifyType, companyName)
|
|
|
- if keyItems[k] == nil {
|
|
|
- keyItems[k] = new(tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
- keyItems[k].CompanyName = companyName
|
|
|
- keyItems[k].ClassifyType = v.ClassifyType
|
|
|
- keyItems[k].DataList = make([]*tradeAnalysisModel.ContractCompanyTradeDataList, 0)
|
|
|
- }
|
|
|
-
|
|
|
- kd := fmt.Sprintf("%s-%s", k, v.DataTime.Format(utils.FormatDate))
|
|
|
- if keyDateData[kd] == nil {
|
|
|
- keyDateData[kd] = new(tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
- keyDateData[kd].Date = v.DataTime
|
|
|
- }
|
|
|
- if v.ValType == 1 {
|
|
|
- keyDateData[kd].BuyVal = v.Val
|
|
|
- keyDateData[kd].BuyValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
- keyDateData[kd].BuyChange = v.ValChange
|
|
|
- keyDateData[kd].BuyChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
- }
|
|
|
- if v.ValType == 2 {
|
|
|
- keyDateData[kd].SoldVal = v.Val
|
|
|
- keyDateData[kd].SoldValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
- keyDateData[kd].SoldChange = v.ValChange
|
|
|
- keyDateData[kd].SoldChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
- }
|
|
|
- if !keyDateDataExist[kd] {
|
|
|
- keyItems[k].DataList = append(keyItems[k].DataList, keyDateData[kd])
|
|
|
- keyDateDataExist[kd] = true
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 获取[合约]每日的末位多空单
|
|
|
- contractLastBuyDateVal := make(map[string]map[time.Time]int)
|
|
|
- contractLastSoldDateVal := make(map[string]map[time.Time]int)
|
|
|
- {
|
|
|
- lastOriginList, e := tradeAnalysis.GetLastTradeDataByClassify(exchange, classifyNames, contracts)
|
|
|
- if e != nil {
|
|
|
- err = fmt.Errorf("获取末位多空单原始数据失败, %v", e)
|
|
|
- return
|
|
|
- }
|
|
|
- for _, v := range lastOriginList {
|
|
|
- if v.ValType == 1 {
|
|
|
- if contractLastBuyDateVal[v.ClassifyType] == nil {
|
|
|
- contractLastBuyDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
- }
|
|
|
- contractLastBuyDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
- continue
|
|
|
- }
|
|
|
- if contractLastSoldDateVal[v.ClassifyType] == nil {
|
|
|
- contractLastSoldDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
- }
|
|
|
- contractLastSoldDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
// 填充[合约-公司]预估数据, 并根据[公司-多合约]分组, [公司]算作一个指标, 指标值为[多个合约]的计算加总
|
|
|
companyTradeData = make([]*tradeAnalysisModel.ContractCompanyTradeData, 0)
|
|
|
companyContracts := make(map[string][]*tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
- for _, v := range keyItems {
|
|
|
- td, fd, ed, e := PredictingTradeData(v.DataList, contractLastBuyDateVal[v.ClassifyType], contractLastSoldDateVal[v.ClassifyType], predictRatio)
|
|
|
+ for _, v := range contractTradeData {
|
|
|
+ td, fd, ed, e := PredictingTradeData(v.DataList, lastBuyVal[v.ClassifyType], lastSoldVal[v.ClassifyType], predictRatio)
|
|
|
if e != nil {
|
|
|
err = fmt.Errorf("数据补全失败, %v", e)
|
|
|
return
|
|
@@ -917,8 +948,229 @@ func GetTableTradeData(exchange string, classifyNames, contracts, companies []st
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// GetContractCompanyTradeData 获取[合约-期货公司]持仓数据, 填充预估值
|
|
|
-func GetContractCompanyTradeData(exchange string, classifyNames, contracts, companies []string, predictRatio float64) (tradeData []*tradeAnalysisModel.ContractCompanyTradeData, err error) {
|
|
|
+// GetCorrelationTableTradeData 获取相关性表格持仓数据
|
|
|
+func GetCorrelationTableTradeData(exchange string, classifyNames, contracts, companies []string, predictRatio float64) (tradeData []*tradeAnalysisModel.ContractCompanyTradeData, err error) {
|
|
|
+ // 各原始数据表期货公司名称不一致
|
|
|
+ //companyMap := make(map[string]string)
|
|
|
+ //{
|
|
|
+ // ob := new(tradeAnalysisModel.TradeFuturesCompany)
|
|
|
+ // list, e := ob.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
|
|
|
+ // if e != nil {
|
|
|
+ // err = fmt.Errorf("获取期货公司名称失败: %v", e)
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // switch exchange {
|
|
|
+ // case "zhengzhou":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.ZhengzhouName
|
|
|
+ // }
|
|
|
+ // case "dalian":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.DalianName
|
|
|
+ // }
|
|
|
+ // case "shanghai":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.ShanghaiName
|
|
|
+ // }
|
|
|
+ // case "cffex":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.CffexName
|
|
|
+ // }
|
|
|
+ // case "ine":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.IneName
|
|
|
+ // }
|
|
|
+ // case "guangzhou":
|
|
|
+ // for _, v := range list {
|
|
|
+ // companyMap[v.CompanyName] = v.GuangzhouName
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ //var queryCompanies []string
|
|
|
+ //for _, v := range companies {
|
|
|
+ // if v == tradeAnalysisModel.TradeFuturesCompanyTop20 {
|
|
|
+ // queryCompanies = append(queryCompanies, tradeAnalysisModel.TradeFuturesCompanyTop20)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // companyName, ok := companyMap[v]
|
|
|
+ // if !ok {
|
|
|
+ // utils.FileLog.Info(fmt.Sprintf("交易所%s公司名称映射不存在: %s", exchange, v))
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // queryCompanies = append(queryCompanies, companyName)
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// 郑商所/广期所查询方式不一样
|
|
|
+ //var tradeAnalysis TradeAnalysisInterface
|
|
|
+ //switch exchange {
|
|
|
+ //case tradeAnalysisModel.TradeExchangeZhengzhou:
|
|
|
+ // tradeAnalysis = &ZhengzhouTradeAnalysis{}
|
|
|
+ //case tradeAnalysisModel.TradeExchangeGuangzhou:
|
|
|
+ // tradeAnalysis = &GuangzhouTradeAnalysis{}
|
|
|
+ //default:
|
|
|
+ // tradeAnalysis = &BaseTradeAnalysis{}
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// 获取多单/空单原始数据
|
|
|
+ ////originList, e := tradeAnalysis.GetTradeDataByClassifyAndCompany(exchange, classifyNames, contracts, queryCompanies, time.Time{}, time.Time{})
|
|
|
+ ////if e != nil {
|
|
|
+ //// err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
|
+ //// return
|
|
|
+ ////}
|
|
|
+ //originList, _, lastOriginList, e := tradeAnalysis.GetTradeDataByContracts(exchange, classifyNames, contracts, queryCompanies, time.Time{}, time.Time{})
|
|
|
+ //if e != nil {
|
|
|
+ // err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
|
+ // return
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// [合约-期货公司]数据分组
|
|
|
+ //keyItems := make(map[string]*tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
+ //{
|
|
|
+ // keyDateData := make(map[string]*tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
+ // keyDateDataExist := make(map[string]bool)
|
|
|
+ // for _, v := range originList {
|
|
|
+ // // Rank999-对应的是TOP20
|
|
|
+ // companyName := v.CompanyName
|
|
|
+ // if v.Rank == 999 {
|
|
|
+ // companyName = tradeAnalysisModel.TradeFuturesCompanyTop20
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // k := fmt.Sprintf("%s-%s", v.ClassifyType, companyName)
|
|
|
+ // if keyItems[k] == nil {
|
|
|
+ // keyItems[k] = new(tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
+ // keyItems[k].Exchange = exchange
|
|
|
+ // keyItems[k].CompanyName = companyName
|
|
|
+ // keyItems[k].ClassifyName = v.ClassifyName
|
|
|
+ // keyItems[k].ClassifyType = v.ClassifyType
|
|
|
+ // keyItems[k].DataList = make([]*tradeAnalysisModel.ContractCompanyTradeDataList, 0)
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // kd := fmt.Sprintf("%s-%s", k, v.DataTime.Format(utils.FormatDate))
|
|
|
+ // if keyDateData[kd] == nil {
|
|
|
+ // keyDateData[kd] = new(tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
+ // keyDateData[kd].Date = v.DataTime
|
|
|
+ // }
|
|
|
+ // if v.ValType == 1 {
|
|
|
+ // keyDateData[kd].BuyVal = v.Val
|
|
|
+ // keyDateData[kd].BuyValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // keyDateData[kd].BuyChange = v.ValChange
|
|
|
+ // keyDateData[kd].BuyChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // }
|
|
|
+ // if v.ValType == 2 {
|
|
|
+ // keyDateData[kd].SoldVal = v.Val
|
|
|
+ // keyDateData[kd].SoldValType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // keyDateData[kd].SoldChange = v.ValChange
|
|
|
+ // keyDateData[kd].SoldChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
+ // }
|
|
|
+ // if !keyDateDataExist[kd] {
|
|
|
+ // keyItems[k].DataList = append(keyItems[k].DataList, keyDateData[kd])
|
|
|
+ // keyDateDataExist[kd] = true
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ //// 获取[合约]每日的末位多空单
|
|
|
+ //contractLastBuyDateVal := make(map[string]map[time.Time]int)
|
|
|
+ //contractLastSoldDateVal := make(map[string]map[time.Time]int)
|
|
|
+ //{
|
|
|
+ // //lastOriginList, e := tradeAnalysis.GetLastTradeDataByClassify(exchange, classifyNames, contracts)
|
|
|
+ // //if e != nil {
|
|
|
+ // // err = fmt.Errorf("获取末位多空单原始数据失败, %v", e)
|
|
|
+ // // return
|
|
|
+ // //}
|
|
|
+ // for _, v := range lastOriginList {
|
|
|
+ // if v.ValType == 1 {
|
|
|
+ // if contractLastBuyDateVal[v.ClassifyType] == nil {
|
|
|
+ // contractLastBuyDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
+ // }
|
|
|
+ // contractLastBuyDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // if contractLastSoldDateVal[v.ClassifyType] == nil {
|
|
|
+ // contractLastSoldDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
+ // }
|
|
|
+ // contractLastSoldDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+
|
|
|
+ // 获取合约持仓数据
|
|
|
+ contractTradeData, lastBuyVal, lastSoldVal, e := GetContractCompanyTradeData(exchange, classifyNames, contracts, companies, time.Time{}, time.Time{})
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("获取合约-持仓数据失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 填充预估数据
|
|
|
+ tradeData = make([]*tradeAnalysisModel.ContractCompanyTradeData, 0)
|
|
|
+ for _, v := range contractTradeData {
|
|
|
+ td, fd, ed, e := PredictingTradeData(v.DataList, lastBuyVal[v.ClassifyType], lastSoldVal[v.ClassifyType], predictRatio)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("数据补全失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ v.DataList = td
|
|
|
+ v.StartDate = fd
|
|
|
+ v.EndDate = ed
|
|
|
+ tradeData = append(tradeData, v)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// TransTradeData2EdbData 持仓数据转为指标数据
|
|
|
+func TransTradeData2EdbData(tradeData []*tradeAnalysisModel.ContractCompanyTradeData, contractPosition int) (edbData []*tradeAnalysisModel.ContractCompanyTradeEdb, edbDataMap []map[time.Time]int, err error) {
|
|
|
+ if len(tradeData) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbData = make([]*tradeAnalysisModel.ContractCompanyTradeEdb, 0)
|
|
|
+ edbDataMap = make([]map[time.Time]int, 0)
|
|
|
+
|
|
|
+ for _, v := range tradeData {
|
|
|
+ newEdb := new(tradeAnalysisModel.ContractCompanyTradeEdb)
|
|
|
+ newEdb.Exchange = v.Exchange
|
|
|
+ newEdb.ClassifyName = v.ClassifyName
|
|
|
+ newEdb.ClassifyType = v.ClassifyType
|
|
|
+ newEdb.CompanyName = v.CompanyName
|
|
|
+ newEdb.IsTotal = v.IsTotal
|
|
|
+ newEdb.ContractPosition = contractPosition
|
|
|
+ newEdb.StartDate = v.StartDate
|
|
|
+ newEdb.EndDate = v.EndDate
|
|
|
+ newEdb.DataList = make([]*tradeAnalysisModel.ContractCompanyTradeEdbData, 0)
|
|
|
+ dataMap := make(map[time.Time]int)
|
|
|
+ for _, d := range v.DataList {
|
|
|
+ var vd int
|
|
|
+ switch contractPosition {
|
|
|
+ case tradeAnalysisModel.ContractPositionBuy:
|
|
|
+ if d.BuyValType == tradeAnalysisModel.TradeDataTypeNull {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ vd = d.BuyVal
|
|
|
+ case tradeAnalysisModel.ContractPositionSold:
|
|
|
+ if d.SoldValType == tradeAnalysisModel.TradeDataTypeNull {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ vd = d.SoldVal
|
|
|
+ case tradeAnalysisModel.ContractPositionPureBuy:
|
|
|
+ if d.PureBuyValType == tradeAnalysisModel.TradeDataTypeNull {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ vd = d.PureBuyVal
|
|
|
+ default:
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ newEdb.DataList = append(newEdb.DataList, &tradeAnalysisModel.ContractCompanyTradeEdbData{
|
|
|
+ DataTime: d.Date,
|
|
|
+ Val: vd,
|
|
|
+ })
|
|
|
+ dataMap[d.Date] = vd
|
|
|
+ }
|
|
|
+ edbData = append(edbData, newEdb)
|
|
|
+ edbDataMap = append(edbDataMap, dataMap)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// GetContractCompanyTradeData 获取合约持仓数据
|
|
|
+func GetContractCompanyTradeData(exchange string, classifyNames, contracts, companies []string, startDate, endDate time.Time) (contractTradeData map[string]*tradeAnalysisModel.ContractCompanyTradeData, lastBuyVal, lastSoldVal map[string]map[time.Time]int, err error) {
|
|
|
// 各原始数据表期货公司名称不一致
|
|
|
companyMap := make(map[string]string)
|
|
|
{
|
|
@@ -981,32 +1233,32 @@ func GetContractCompanyTradeData(exchange string, classifyNames, contracts, comp
|
|
|
}
|
|
|
|
|
|
// 获取多单/空单原始数据
|
|
|
- originList, e := tradeAnalysis.GetTradeDataByClassifyAndCompany(exchange, classifyNames, contracts, queryCompanies, time.Time{}, time.Time{})
|
|
|
+ originList, _, lastOriginList, e := tradeAnalysis.GetTradeDataByContracts(exchange, classifyNames, contracts, queryCompanies, startDate, endDate)
|
|
|
if e != nil {
|
|
|
err = fmt.Errorf("获取多空单原始数据失败, %v", e)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// [合约-期货公司]数据分组
|
|
|
- keyItems := make(map[string]*tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
+ contractTradeData = make(map[string]*tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
{
|
|
|
keyDateData := make(map[string]*tradeAnalysisModel.ContractCompanyTradeDataList)
|
|
|
keyDateDataExist := make(map[string]bool)
|
|
|
for _, v := range originList {
|
|
|
// Rank999-对应的是TOP20
|
|
|
companyName := v.CompanyName
|
|
|
- if v.Rank == 999 {
|
|
|
- companyName = tradeAnalysisModel.TradeFuturesCompanyTop20
|
|
|
- }
|
|
|
+ //if v.Rank == 999 {
|
|
|
+ // companyName = tradeAnalysisModel.TradeFuturesCompanyTop20
|
|
|
+ //}
|
|
|
|
|
|
k := fmt.Sprintf("%s-%s", v.ClassifyType, companyName)
|
|
|
- if keyItems[k] == nil {
|
|
|
- keyItems[k] = new(tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
- keyItems[k].Exchange = exchange
|
|
|
- keyItems[k].CompanyName = companyName
|
|
|
- keyItems[k].ClassifyName = v.ClassifyName
|
|
|
- keyItems[k].ClassifyType = v.ClassifyType
|
|
|
- keyItems[k].DataList = make([]*tradeAnalysisModel.ContractCompanyTradeDataList, 0)
|
|
|
+ if contractTradeData[k] == nil {
|
|
|
+ contractTradeData[k] = new(tradeAnalysisModel.ContractCompanyTradeData)
|
|
|
+ contractTradeData[k].Exchange = exchange
|
|
|
+ contractTradeData[k].CompanyName = companyName
|
|
|
+ contractTradeData[k].ClassifyName = v.ClassifyName
|
|
|
+ contractTradeData[k].ClassifyType = v.ClassifyType
|
|
|
+ contractTradeData[k].DataList = make([]*tradeAnalysisModel.ContractCompanyTradeDataList, 0)
|
|
|
}
|
|
|
|
|
|
kd := fmt.Sprintf("%s-%s", k, v.DataTime.Format(utils.FormatDate))
|
|
@@ -1027,101 +1279,29 @@ func GetContractCompanyTradeData(exchange string, classifyNames, contracts, comp
|
|
|
keyDateData[kd].SoldChangeType = tradeAnalysisModel.TradeDataTypeOrigin
|
|
|
}
|
|
|
if !keyDateDataExist[kd] {
|
|
|
- keyItems[k].DataList = append(keyItems[k].DataList, keyDateData[kd])
|
|
|
+ contractTradeData[k].DataList = append(contractTradeData[k].DataList, keyDateData[kd])
|
|
|
keyDateDataExist[kd] = true
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 获取[合约]每日的末位多空单
|
|
|
- contractLastBuyDateVal := make(map[string]map[time.Time]int)
|
|
|
- contractLastSoldDateVal := make(map[string]map[time.Time]int)
|
|
|
+ // 合约的[日期-末位值]
|
|
|
+ lastBuyVal = make(map[string]map[time.Time]int)
|
|
|
+ lastSoldVal = make(map[string]map[time.Time]int)
|
|
|
{
|
|
|
- lastOriginList, e := tradeAnalysis.GetLastTradeDataByClassify(exchange, classifyNames, contracts)
|
|
|
- if e != nil {
|
|
|
- err = fmt.Errorf("获取末位多空单原始数据失败, %v", e)
|
|
|
- return
|
|
|
- }
|
|
|
for _, v := range lastOriginList {
|
|
|
if v.ValType == 1 {
|
|
|
- if contractLastBuyDateVal[v.ClassifyType] == nil {
|
|
|
- contractLastBuyDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
+ if lastBuyVal[v.ClassifyType] == nil {
|
|
|
+ lastBuyVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
}
|
|
|
- contractLastBuyDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
+ lastBuyVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
continue
|
|
|
}
|
|
|
- if contractLastSoldDateVal[v.ClassifyType] == nil {
|
|
|
- contractLastSoldDateVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
+ if lastSoldVal[v.ClassifyType] == nil {
|
|
|
+ lastSoldVal[v.ClassifyType] = make(map[time.Time]int)
|
|
|
}
|
|
|
- contractLastSoldDateVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 填充预估数据
|
|
|
- tradeData = make([]*tradeAnalysisModel.ContractCompanyTradeData, 0)
|
|
|
- for _, v := range keyItems {
|
|
|
- td, fd, ed, e := PredictingTradeData(v.DataList, contractLastBuyDateVal[v.ClassifyType], contractLastSoldDateVal[v.ClassifyType], predictRatio)
|
|
|
- if e != nil {
|
|
|
- err = fmt.Errorf("数据补全失败, %v", e)
|
|
|
- return
|
|
|
+ lastSoldVal[v.ClassifyType][v.DataTime] = v.Val
|
|
|
}
|
|
|
- v.DataList = td
|
|
|
- v.StartDate = fd
|
|
|
- v.EndDate = ed
|
|
|
- tradeData = append(tradeData, v)
|
|
|
- }
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
-// TransTradeData2EdbData 持仓数据转为指标数据
|
|
|
-func TransTradeData2EdbData(tradeData []*tradeAnalysisModel.ContractCompanyTradeData, contractPosition int) (edbData []*tradeAnalysisModel.ContractCompanyTradeEdb, edbDataMap []map[time.Time]int, err error) {
|
|
|
- if len(tradeData) == 0 {
|
|
|
- return
|
|
|
- }
|
|
|
- edbData = make([]*tradeAnalysisModel.ContractCompanyTradeEdb, 0)
|
|
|
- edbDataMap = make([]map[time.Time]int, 0)
|
|
|
-
|
|
|
- for _, v := range tradeData {
|
|
|
- newEdb := new(tradeAnalysisModel.ContractCompanyTradeEdb)
|
|
|
- newEdb.Exchange = v.Exchange
|
|
|
- newEdb.ClassifyName = v.ClassifyName
|
|
|
- newEdb.ClassifyType = v.ClassifyType
|
|
|
- newEdb.CompanyName = v.CompanyName
|
|
|
- newEdb.IsTotal = v.IsTotal
|
|
|
- newEdb.ContractPosition = contractPosition
|
|
|
- newEdb.StartDate = v.StartDate
|
|
|
- newEdb.EndDate = v.EndDate
|
|
|
- newEdb.DataList = make([]*tradeAnalysisModel.ContractCompanyTradeEdbData, 0)
|
|
|
- dataMap := make(map[time.Time]int)
|
|
|
- for _, d := range v.DataList {
|
|
|
- var vd int
|
|
|
- switch contractPosition {
|
|
|
- case tradeAnalysisModel.ContractPositionBuy:
|
|
|
- if d.BuyValType == tradeAnalysisModel.TradeDataTypeNull {
|
|
|
- continue
|
|
|
- }
|
|
|
- vd = d.BuyVal
|
|
|
- case tradeAnalysisModel.ContractPositionSold:
|
|
|
- if d.SoldValType == tradeAnalysisModel.TradeDataTypeNull {
|
|
|
- continue
|
|
|
- }
|
|
|
- vd = d.SoldVal
|
|
|
- case tradeAnalysisModel.ContractPositionPureBuy:
|
|
|
- if d.PureBuyValType == tradeAnalysisModel.TradeDataTypeNull {
|
|
|
- continue
|
|
|
- }
|
|
|
- vd = d.PureBuyVal
|
|
|
- default:
|
|
|
- continue
|
|
|
- }
|
|
|
- newEdb.DataList = append(newEdb.DataList, &tradeAnalysisModel.ContractCompanyTradeEdbData{
|
|
|
- DataTime: d.Date,
|
|
|
- Val: vd,
|
|
|
- })
|
|
|
- dataMap[d.Date] = vd
|
|
|
- }
|
|
|
- edbData = append(edbData, newEdb)
|
|
|
- edbDataMap = append(edbDataMap, dataMap)
|
|
|
}
|
|
|
return
|
|
|
}
|