This commit is contained in:
2026-01-09 15:48:31 +08:00
parent e32eabbf95
commit c8e189e9c7
28 changed files with 2795 additions and 0 deletions

102
usmarket/watch.go Normal file
View File

@@ -0,0 +1,102 @@
package usmarket
import (
"log"
"sync"
"time"
)
var (
UsMarket *MarketIndex
)
// lock
type MarketIndex struct {
sync.RWMutex
LastIndex map[string]*StockDataIndex
Stats int // -1:未开市0开市数据不正常1: 开市,数据正常
}
func NewMarket() {
UsMarket = &MarketIndex{
LastIndex: make(map[string]*StockDataIndex),
Stats: -1,
}
}
func (m *MarketIndex) Set(stats int, index map[string]*StockDataIndex) {
m.Lock()
defer m.Unlock()
m.Stats = stats
m.LastIndex = index
}
func (m *MarketIndex) Get() (int, map[string]*StockDataIndex) {
m.Lock()
defer m.Unlock()
return m.Stats, m.LastIndex
}
func CheckUsMarketOpen() int {
var err error
if !IsUSMarketOpen() {
UsMarket.Set(-1, nil)
return -1
}
newIndex, err := Baidu_UsIndex()
if err != nil {
log.Println("Baidu_UsIndex Error:", err)
UsMarket.Set(-1, nil)
return -1
}
_, LastStockIndex := UsMarket.Get()
if len(LastStockIndex) == 0 {
UsMarket.Set(0, newIndex)
return 0
}
// IXIC 纳斯达克,DJI 道琼斯,SPX 标普500
if LastStockIndex["IXIC"].LastPrice == newIndex["IXIC"].LastPrice && LastStockIndex["DJI"].LastPrice == newIndex["DJI"].LastPrice && LastStockIndex["SPX"].LastPrice == newIndex["SPX"].LastPrice {
// log.Println("ERROR #103, IXIC,DJI,SPX LastPrice no change")
UsMarket.Set(-1, LastStockIndex)
return 0
}
if newIndex["IXIC"].Increase == "0.00" && newIndex["DJI"].Increase == "0.00" && newIndex["SPX"].Increase == "0.00" {
// log.Println("ERROR #104, IXIC,DJI,SPX Increase is 0")
UsMarket.Set(-1, LastStockIndex)
return 0
}
// jsonBytes, _ := json.Marshal(newIndex)
// log.Println("USMarket:", string(jsonBytes))
UsMarket.Set(1, newIndex)
return 1
}
// 判断美股是否开市
func IsUSMarketOpen() bool {
// 获取当前时间
now := time.Now()
// 设置美国东部时间
loc, _ := time.LoadLocation("America/New_York")
// 将当前时间转换为美国东部时间
nowInNY := now.In(loc)
// 判断是否为周末
if nowInNY.Weekday() == time.Saturday || nowInNY.Weekday() == time.Sunday {
return false
}
// 判断是否在交易时间内
openTime := time.Date(nowInNY.Year(), nowInNY.Month(), nowInNY.Day(), 9, 30, 0, 0, loc)
closeTime := time.Date(nowInNY.Year(), nowInNY.Month(), nowInNY.Day(), 16, 0, 0, 0, loc)
return nowInNY.After(openTime) && nowInNY.Before(closeTime)
}