You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.6 KiB
120 lines
3.6 KiB
2 months ago
|
package business
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"go.mongodb.org/mongo-driver/bson"
|
||
|
"go.mongodb.org/mongo-driver/mongo"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
"sync"
|
||
|
"wss-pool/config"
|
||
|
"wss-pool/dictionary"
|
||
|
"wss-pool/internal"
|
||
|
"wss-pool/internal/data"
|
||
|
"wss-pool/logging/applogger"
|
||
|
"wss-pool/pkg/model/stock"
|
||
|
)
|
||
|
|
||
|
/*
|
||
|
采集美股历史数据
|
||
|
*/
|
||
|
const (
|
||
|
UsPageSize int64 = 500
|
||
|
)
|
||
|
|
||
|
func UpdateStockUs(start, end interface{}, state string) {
|
||
|
fmt.Println("updateStockUs", start, end, state)
|
||
|
stocks, _, pageTotal := GetStockAll("US", 1, UsPageSize)
|
||
|
wg := sync.WaitGroup{}
|
||
|
for _, value := range stocks {
|
||
|
wg.Add(1)
|
||
|
go func(start, end interface{}, state, code string) {
|
||
|
defer wg.Done()
|
||
|
param := fmt.Sprintf("apiKey=%v", config.Config.ShareGather.PolygonKey)
|
||
|
multiplier, _ := strconv.Atoi(dictionary.StockUsListTimeMap[state])
|
||
|
timespan := "minute"
|
||
|
if !strings.Contains(state, "min") {
|
||
|
multiplier = 1
|
||
|
timespan = dictionary.StockUsListTimeMap[state]
|
||
|
}
|
||
|
url := fmt.Sprintf("https://%v/v2/aggs/ticker/%v/range/%d/%v/%v/%v?adjusted=true&sort=asc&%v",
|
||
|
config.Config.ShareGather.PolygonHost, code, multiplier, timespan, start, end, param)
|
||
|
bodyStr, err := internal.HttpGet(url)
|
||
|
if err != nil {
|
||
|
applogger.Error("Failed to query data:%v", err)
|
||
|
return
|
||
|
}
|
||
|
var eodModel stock.PreviousCloseResponse
|
||
|
if err = json.Unmarshal([]byte(bodyStr), &eodModel); err != nil {
|
||
|
applogger.Error("eodModel json Unmarshal err: %v", err)
|
||
|
return
|
||
|
}
|
||
|
applogger.Info("info", eodModel)
|
||
|
UpdateUs(eodModel, state)
|
||
|
}(start, end, state, value.Code)
|
||
|
}
|
||
|
wg.Wait()
|
||
|
for i := int64(2); i <= pageTotal; i++ {
|
||
|
stocks, _, _ := GetStockAll("US", i, UsPageSize)
|
||
|
wg := sync.WaitGroup{}
|
||
|
for _, value := range stocks {
|
||
|
wg.Add(1)
|
||
|
go func(start, end interface{}, state, code string) {
|
||
|
defer wg.Done()
|
||
|
param := fmt.Sprintf("apiKey=%v", config.Config.ShareGather.PolygonKey)
|
||
|
multiplier, _ := strconv.Atoi(dictionary.StockUsListTimeMap[state])
|
||
|
timespan := "minute"
|
||
|
if !strings.Contains(state, "min") {
|
||
|
multiplier = 1
|
||
|
timespan = dictionary.StockUsListTimeMap[state]
|
||
|
}
|
||
|
url := fmt.Sprintf("https://%v/v2/aggs/ticker/%v/range/%d/%v/%v/%v?adjusted=true&sort=asc&%v",
|
||
|
config.Config.ShareGather.PolygonHost, code, multiplier, timespan, start, end, param)
|
||
|
bodyStr, err := internal.HttpGet(url)
|
||
|
if err != nil {
|
||
|
applogger.Error("Failed to query data:%v", err)
|
||
|
return
|
||
|
}
|
||
|
var eodModel stock.PreviousCloseResponse
|
||
|
if err = json.Unmarshal([]byte(bodyStr), &eodModel); err != nil {
|
||
|
applogger.Error("eodModel json Unmarshal err: %v", err)
|
||
|
return
|
||
|
}
|
||
|
UpdateUs(eodModel, state)
|
||
|
applogger.Info("info", eodModel)
|
||
|
}(start, end, state, value.Code)
|
||
|
}
|
||
|
wg.Wait()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func UpdateUs(result stock.PreviousCloseResponse, period string) {
|
||
|
if len(result.Results) <= 0 {
|
||
|
applogger.Error("us data is null %v", result)
|
||
|
return
|
||
|
}
|
||
|
var dataList []mongo.WriteModel
|
||
|
for _, val := range result.Results {
|
||
|
filter := bson.M{"code": bson.M{"$eq": result.Ticker}, "timestamp": bson.M{"$eq": val.T}}
|
||
|
update := bson.D{{"$set", bson.D{
|
||
|
{"code", result.Ticker},
|
||
|
{"timestamp", val.T},
|
||
|
{"vw", val.VW.String()},
|
||
|
{"o", val.O.String()},
|
||
|
{"c", val.C.String()},
|
||
|
{"h", val.H.String()},
|
||
|
{"n", val.N},
|
||
|
}}}
|
||
|
applogger.Info("UpdateUs info:%v", update)
|
||
|
models := mongo.NewUpdateOneModel().SetFilter(filter).SetUpdate(update).SetUpsert(true)
|
||
|
dataList = append(dataList, models)
|
||
|
}
|
||
|
tableName := data.GetStockUsTableName(period)
|
||
|
if len(dataList) > 0 {
|
||
|
if err := data.MgoBulkWrite(tableName, dataList); err != nil {
|
||
|
applogger.Error("UpdateUs MgoInsertMany err:%v", err)
|
||
|
}
|
||
|
}
|
||
|
}
|