package libs import ( "encoding/json" "fmt" "log" "strings" ) var ( MarketUrl = "/a/market" Period = "60m" ) // AllowOpen 每次开仓或补仓前取 60 分钟大盘信号,只有 UP 才放行。 func MarketAllowOpen() bool { // gen url. fullUrl := fmt.Sprintf("%s%s?period=%s&t=%s", API_HOST, MarketUrl, Period, randStr(16)) payload, err := GetJSON(fullUrl, HTTPTimeout) if err != nil { log.Printf("[ERROR] 获取大盘指数失败: %s %v", fullUrl, err) return false } var result map[string]any err = json.Unmarshal(payload, &result) if err != nil { log.Printf("[ERROR] 获取大盘指数解析: %v", err) return false } status := Status(result) log.Printf("[INFO] 大盘信号: url=%s status=%s", fullUrl, status) return status == "UP" } // Status 兼容常见响应结构;无法识别的值统一按 UNKNOWN 处理。 func Status(payload map[string]any) string { var value any = payload if m, ok := value.(map[string]any); ok { if d, exists := m["data"]; exists { value = d } } if arr, ok := value.([]any); ok { if len(arr) == 0 { value = nil } else { value = arr[len(arr)-1] } } if m, ok := value.(map[string]any); ok { if v, exists := m["action"]; exists { value = v } else if v, exists := m["status"]; exists { value = v } else if v, exists := m["signal"]; exists { value = v } } s := strings.ToUpper(strings.TrimSpace(fmt.Sprint(value))) switch s { case "UP", "DOWN", "NEUTRAL": return s default: return "UNKNOWN" } }