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.

331 lines
11 KiB

package business
import (
"encoding/json"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"wss-pool/config"
"wss-pool/internal"
"wss-pool/internal/data"
"wss-pool/logging/applogger"
"wss-pool/pkg/model/stock"
)
/*
采集美股历史数据
一、日终数据
1、每日 daily
https://eodhistoricaldata.com/api/eod/0001.KLSE?api_token=647dd6744b94f4.20894198&period=d&fmt=json&from=2022-08-01&to=2023-06-15
2、每周 weekly
https://eodhistoricaldata.com/api/eod/MCD.US?api_token=647dd6744b94f4.20894198&period=w&fmt=json&from=2022-08-01&to=2023-06-15
3、每月 monthly
https://eodhistoricaldata.com/api/eod/MCD.US?api_token=647dd6744b94f4.20894198&period=m&fmt=json&from=2022-08-01&to=2023-06-15
二、日内数据
1、1小时 hour
https://eodhistoricaldata.com/api/intraday/AAPL.US?api_token=647dd6744b94f4.20894198&interval=1h&fmt=json&from=1659283200&to=1686815102
2、5分钟 fiveminutes
https://eodhistoricaldata.com/api/intraday/AAPL.US?api_token=647dd6744b94f4.20894198&interval=5m&fmt=json&from=1659283200&to=1686815102
3、1分钟 oneminute
https://eodhistoricaldata.com/api/intraday/AAPL.US?api_token=647dd6744b94f4.20894198&interval=1m&fmt=json
*/
func StockUsDaily() {
filter := bson.M{"Country": "USA", "YesterdayClose": bson.M{"$ne": ""}, "BeforeClose": bson.M{"$ne": ""}}
dateList, err := data.MgoFind(data.StockList, filter)
if err != nil {
applogger.Error("MgoFind info err: %v", err)
return
}
for _, value := range dateList.([]primitive.M) {
code := TypeCheck(value["Code"])
applogger.Debug("code info: %v", code)
codeUS := fmt.Sprintf("%v.US", code)
// https://eodhistoricaldata.com/api/eod/0001.KLSE?api_token=647dd6744b94f4.20894198&period=d&fmt=json&from=2022-08-01&to=2023-06-15
url := fmt.Sprintf("https://%v/api/eod/%v?api_token=%v&period=d&fmt=json&from=2022-08-01&to=2023-06-17",
config.Config.ShareGather.FinancialHost, codeUS, config.Config.ShareGather.FinancialKey)
bodyStr, err := internal.HttpGet(url)
if err != nil {
applogger.Error("Failed to query data:%v", err)
return
}
fmt.Println(url)
var eodModel []stock.EodData
if err = json.Unmarshal([]byte(bodyStr), &eodModel); err != nil {
applogger.Error("eodModel json Unmarshal err: %v", err)
return
}
applogger.Info("data info: %v", eodModel)
var bsonEod []interface{}
for _, eodValue := range eodModel {
bsonEod = append(bsonEod, bson.D{
{"code", code},
{"date", eodValue.Date},
{"open", eodValue.Open},
{"high", eodValue.High},
{"low", eodValue.Low},
{"close", eodValue.Close},
{"adjusted_close", eodValue.AdjustedClose},
{"volume", eodValue.Volume},
})
}
if len(bsonEod) > 0 {
if err := data.MgoInsertMany(data.StockUsDaily, bsonEod); err != nil {
applogger.Error("MgoInsertMany info err: %v", err)
return
}
}
}
}
func StockUsWeekly() {
filter := bson.M{"Country": "USA", "YesterdayClose": bson.M{"$ne": ""}, "BeforeClose": bson.M{"$ne": ""}}
dateList, err := data.MgoFind(data.StockList, filter)
if err != nil {
applogger.Error("MgoFind info err: %v", err)
return
}
for _, value := range dateList.([]primitive.M) {
code := TypeCheck(value["Code"])
applogger.Debug("code info: %v", code)
codeUS := fmt.Sprintf("%v.US", code)
// https://eodhistoricaldata.com/api/eod/MCD.US?api_token=647dd6744b94f4.20894198&period=w&fmt=json&from=2022-08-01&to=2023-06-15
url := fmt.Sprintf("https://%v/api/eod/%v?api_token=%v&period=w&fmt=json&from=2022-08-01&to=2023-06-17",
config.Config.ShareGather.FinancialHost, codeUS, config.Config.ShareGather.FinancialKey)
bodyStr, err := internal.HttpGet(url)
if err != nil {
applogger.Error("Failed to query data:%v", err)
return
}
var eodModel []stock.EodData
if err = json.Unmarshal([]byte(bodyStr), &eodModel); err != nil {
applogger.Error("eodModel json Unmarshal err: %v", err)
return
}
applogger.Info("data info: %v", eodModel)
var bsonEod []interface{}
for _, eodValue := range eodModel {
bsonEod = append(bsonEod, bson.D{
{"code", code},
{"date", eodValue.Date},
{"open", eodValue.Open},
{"high", eodValue.High},
{"low", eodValue.Low},
{"close", eodValue.Close},
{"adjusted_close", eodValue.AdjustedClose},
{"volume", eodValue.Volume},
})
}
if len(bsonEod) > 0 {
if err := data.MgoInsertMany(data.StockUsWeekly, bsonEod); err != nil {
applogger.Error("MgoInsertMany info err: %v", err)
return
}
}
}
}
func StockUsMonthly() {
filter := bson.M{"Country": "USA", "YesterdayClose": bson.M{"$ne": ""}, "BeforeClose": bson.M{"$ne": ""}}
dateList, err := data.MgoFind(data.StockList, filter)
if err != nil {
applogger.Error("MgoFind info err: %v", err)
return
}
for _, value := range dateList.([]primitive.M) {
code := TypeCheck(value["Code"])
applogger.Debug("code info: %v", code)
codeUs := fmt.Sprintf("%v.US", code)
// https://eodhistoricaldata.com/api/eod/MCD.US?api_token=647dd6744b94f4.20894198&period=m&fmt=json&from=2022-08-01&to=2023-06-17
url := fmt.Sprintf("https://%v/api/eod/%v?api_token=%v&period=m&fmt=json&from=2022-08-01&to=2023-06-17",
config.Config.ShareGather.FinancialHost, codeUs, config.Config.ShareGather.FinancialKey)
bodyStr, err := internal.HttpGet(url)
if err != nil {
applogger.Error("Failed to query data:%v", err)
return
}
var eodModel []stock.EodData
if err = json.Unmarshal([]byte(bodyStr), &eodModel); err != nil {
applogger.Error("eodModel json Unmarshal err: %v", err)
return
}
applogger.Info("data info: %v", eodModel)
var bsonEod []interface{}
for _, eodValue := range eodModel {
bsonEod = append(bsonEod, bson.D{
{"code", code},
{"date", eodValue.Date},
{"open", eodValue.Open},
{"high", eodValue.High},
{"low", eodValue.Low},
{"close", eodValue.Close},
{"adjusted_close", eodValue.AdjustedClose},
{"volume", eodValue.Volume},
})
}
if len(bsonEod) > 0 {
if err := data.MgoInsertMany(data.StockUsMonthly, bsonEod); err != nil {
applogger.Error("MgoInsertMany info err: %v", err)
return
}
}
}
}
func StockUsHour() {
filter := bson.M{"Country": "USA", "YesterdayClose": bson.M{"$ne": ""}, "BeforeClose": bson.M{"$ne": ""}}
dateList, err := data.MgoFind(data.StockList, filter)
if err != nil {
applogger.Error("MgoFind info err: %v", err)
return
}
for _, value := range dateList.([]primitive.M) {
code := TypeCheck(value["Code"])
applogger.Debug("code info: %v", code)
codeUs := fmt.Sprintf("%v.US", code)
// https://eodhistoricaldata.com/api/intraday/AAPL.US?api_token=647dd6744b94f4.20894198&interval=1h&fmt=json&from=1659283200&to=1686759266
url := fmt.Sprintf("https://%v/api/intraday/%v?api_token=%v&interval=1h&fmt=json&from=1659283200&to=1686759266",
config.Config.ShareGather.FinancialHost, codeUs, config.Config.ShareGather.FinancialKey)
bodyStr, err := internal.HttpGet(url)
if err != nil {
applogger.Error("Failed to query data:%v", err)
return
}
var eodModel []stock.IntraDayData
if err = json.Unmarshal([]byte(bodyStr), &eodModel); err != nil {
applogger.Error("eodModel json Unmarshal err: %v", err)
return
}
applogger.Info("data info: %v", eodModel)
var bsonEod []interface{}
for _, eodValue := range eodModel {
bsonEod = append(bsonEod, bson.D{
{"code", code},
{"timestamp", eodValue.Timestamp},
{"gmtoffset", eodValue.Gmtoffset},
{"datetime", eodValue.Datetime},
{"open", eodValue.Open},
{"high", eodValue.High},
{"low", eodValue.Low},
{"close", eodValue.Close},
{"volume", eodValue.Volume},
})
}
if len(bsonEod) > 0 {
if err := data.MgoInsertMany(data.StockUsHour, bsonEod); err != nil {
applogger.Error("MgoInsertMany info err: %v", err)
return
}
}
}
}
func StockUsFiveMinutes() {
filter := bson.M{"Country": "USA", "YesterdayClose": bson.M{"$ne": ""}, "BeforeClose": bson.M{"$ne": ""}}
dateList, err := data.MgoFind(data.StockList, filter)
if err != nil {
applogger.Error("MgoFind info err: %v", err)
return
}
for _, value := range dateList.([]primitive.M) {
code := TypeCheck(value["Code"])
applogger.Debug("code info: %v", code)
codeUs := fmt.Sprintf("%v.US", code)
// https://eodhistoricaldata.com/api/intraday/AAPL.US?api_token=647dd6744b94f4.20894198&interval=5m&fmt=json&from=1659283200&to=1686815102
url := fmt.Sprintf("https://%v/api/intraday/%v?api_token=%v&interval=5m&fmt=json&from=1659283200&to=1686759266",
config.Config.ShareGather.FinancialHost, codeUs, config.Config.ShareGather.FinancialKey)
bodyStr, err := internal.HttpGet(url)
if err != nil {
applogger.Error("Failed to query data:%v", err)
return
}
var eodModel []stock.IntraDayData
if err = json.Unmarshal([]byte(bodyStr), &eodModel); err != nil {
applogger.Error("eodModel json Unmarshal err: %v", err)
return
}
applogger.Info("data info: %v", eodModel)
var bsonEod []interface{}
for _, eodValue := range eodModel {
bsonEod = append(bsonEod, bson.D{
{"code", code},
{"timestamp", eodValue.Timestamp},
{"gmtoffset", eodValue.Gmtoffset},
{"datetime", eodValue.Datetime},
{"open", eodValue.Open},
{"high", eodValue.High},
{"low", eodValue.Low},
{"close", eodValue.Close},
{"volume", eodValue.Volume},
})
}
if len(bsonEod) > 0 {
if err := data.MgoInsertMany(data.StockUsFiveMinutes, bsonEod); err != nil {
applogger.Error("MgoInsertMany info err: %v", err)
return
}
}
}
}
func StockUsOneMinute() {
filter := bson.M{"Country": "USA", "YesterdayClose": bson.M{"$ne": ""}, "BeforeClose": bson.M{"$ne": ""}}
dateList, err := data.MgoFind(data.StockList, filter)
if err != nil {
applogger.Error("MgoFind info err: %v", err)
return
}
for _, value := range dateList.([]primitive.M) {
code := TypeCheck(value["Code"])
applogger.Debug("code info: %v", code)
codeUs := fmt.Sprintf("%v.US", code)
// https://eodhistoricaldata.com/api/intraday/AAPL.US?api_token=647dd6744b94f4.20894198&interval=1m&fmt=json
url := fmt.Sprintf("https://%v/api/intraday/%v?api_token=%v&interval=1m&fmt=json",
config.Config.ShareGather.FinancialHost, codeUs, config.Config.ShareGather.FinancialKey)
bodyStr, err := internal.HttpGet(url)
if err != nil {
applogger.Error("Failed to query data:%v", err)
return
}
var eodModel []stock.IntraDayData
if err = json.Unmarshal([]byte(bodyStr), &eodModel); err != nil {
applogger.Error("eodModel json Unmarshal err: %v", err)
return
}
applogger.Info("data info: %v", eodModel)
var bsonEod []interface{}
for _, eodValue := range eodModel {
bsonEod = append(bsonEod, bson.D{
{"code", code},
{"timestamp", eodValue.Timestamp},
{"gmtoffset", eodValue.Gmtoffset},
{"datetime", eodValue.Datetime},
{"open", eodValue.Open},
{"high", eodValue.High},
{"low", eodValue.Low},
{"close", eodValue.Close},
{"volume", eodValue.Volume},
})
}
if len(bsonEod) > 0 {
if err := data.MgoInsertMany(data.StockUsOneMinute, bsonEod); err != nil {
applogger.Error("MgoInsertMany info err: %v", err)
return
}
}
}
}