package libs import ( "encoding/json" "fmt" "io" "log" "net/http" "net/url" "strings" "time" ) // AllowOpen 每次开仓或补仓前取 60 分钟大盘信号,只有 UP 才放行。 func AllowOpen(apiHost string, timeout time.Duration) bool { rawURL := strings.TrimRight(apiHost, "/") + "/a/market" payload, err := getJSON(rawURL, url.Values{"period": {"60m"}}, timeout) if err != nil { log.Printf("[ERROR] 获取60m大盘信号失败: %s %v", rawURL, err) return false } status := Status(payload) log.Printf("[INFO] 大盘信号: url=%s status=%s", rawURL, 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" } }