package main import ( "fmt" // "gitea.zjmud.xyz/phyer/blingo/cache" // "gitea.zjmud.xyz/phyer/blingo/collector" // "gitea.zjmud.xyz/phyer/blingo/config" // "gitea.zjmud.xyz/phyer/blingo/feature_processor" // "gitea.zjmud.xyz/phyer/blingo/scheduler" // "gitea.zjmud.xyz/phyer/blingo/storage" // "log" // "error" ccxt "gitea.zjmud.xyz/ext/ccxt-go" "os" "os/exec" // "net/http" "time" ) func main() { // 1. 创建 OKX 交易所实例 okx := ccxt.NewOkx(map[string]interface{}{ "apiKey": "fe468418-5e40-433f-8d04-04951286d417", "secret": "D6D74DF9DD60A25BE2B27CA71D8F814D", "password": "M4pw71Id", "hostname": "aws.okx.com", }) // 3. 可选:自定义 HTTP 客户端配置 // okx.HttpClient.Timeout = 15 * time.Second okx.EnableRateLimit = true // 启用内置速率限制 // 4. 加载市场数据(关键步骤!) marketsChan := okx.LoadMarkets() select { case marketsResult := <-marketsChan: switch v := marketsResult.(type) { case error: panic(fmt.Errorf("加载市场数据失败: %v", v)) case string: panic(fmt.Errorf("加载市场数据失败: %v", v)) case map[string]interface{}: okx.Markets = v default: panic(fmt.Errorf("加载市场数据失败: 未知类型的结果")) } case <-time.After(30 * time.Second): panic(fmt.Errorf("加载市场数据超时")) } fmt.Println("OKX 初始化完成,已加载", len(okx.Markets), "个交易对") // 获取ticker数据 symbol := "BTC/USDT" // ticker, err := okx.FetchTicker(symbol) // if err != nil { // fmt.Println("获取ticker数据错误:", err) // return // } // fmt.Println("ticker数据:", ticker) // 获取BTC/USDT的1分钟K线数据 // 创建一个 FetchOHLCVOptionsStruct 实例 // // // 使用 WithFetchOHLCVTimeframe 设置时间框架 // ccxt.WithFetchOHLCVTimeframe("1h")(opts) // // // 使用 WithFetchOHLCVSince 设置开始时间 // ccxt.WithFetchOHLCVSince(1672531200)(opts) // 示例时间戳 // // // 使用 WithFetchOHLCVLimit 设置最大数量 // ccxt.WithFetchOHLCVLimit(100)(opts) // 使用 WithFetchOHLCVParams 设置其他参数 // params := map[string]interface{}{ // "adjustForTimezone": true, // "includeHighLow": false, // } // ccxt.WithFetchOHLCVParams(params)(opts) // 打印设置后的 opts // fmt.Printf("%+v\n", opts) tf := "1h" sc := int64(1672502400000) lm := int64(1000) pm := map[string]interface{}{ "rateLimit": true, // Hypothetical parameter to enable rate limiting } ohlcv, err := okx.FetchOHLCV(symbol, ccxt.WithFetchOHLCVSince(sc), ccxt.WithFetchOHLCVTimeframe(tf), ccxt.WithFetchOHLCVLimit(lm), ccxt.WithFetchOHLCVParams(pm)) if err != nil { fmt.Println("Error fetching OHLCV:", err) return } fmt.Println("ohlcv: ", ohlcv) // 检查并删除旧文件 fileName := "ohlcv-btc.csv" destName := "/tmp/blingo/python/" + fileName if _, err := os.Stat(destName); err == nil { // 文件存在,删除它 if err := os.Remove(destName); err != nil { fmt.Println("删除旧文件失败:", err) return } } // 创建临时文件 tmpFile, err := os.CreateTemp("", fileName) if err != nil { fmt.Println("创建临时文件失败:", err) return } defer os.Remove(tmpFile.Name()) // 程序结束后删除临时文件 // 写入CSV数据 for _, candle := range ohlcv { line := fmt.Sprintf("%d,%.2f,%.2f,%.2f,%.2f,%.2f\n", candle.Timestamp, // 时间戳 candle.Open, // 开盘价 candle.High, // 最高价 candle.Low, // 最低价 candle.Close, // 收盘价 candle.Volume) // 成交量 if _, err := tmpFile.WriteString(line); err != nil { fmt.Println("写入文件失败:", err) return } } // 确保目标目录存在 destDir := "/tmp/blingo/python/" if err := os.MkdirAll(destDir, 0755); err != nil { fmt.Println("创建目录失败:", err) return } // 重命名文件 destName = destDir + fileName if err := os.Rename(tmpFile.Name(), destName); err != nil { fmt.Println("重命名文件失败:", err) return } tmpFile.Close() // 调用Python脚本 cmd := exec.Command("python3", "plot_ohlcv.py", destName) cmd.Dir = "../python" // 设置工作目录 cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { fmt.Println("执行Python脚本失败:", err) return } }