blingo/exam/fetchOHLCV.go
zhangkun9038@dingtalk.com dd8d3b8a95 remove proxy
2025-03-05 20:47:26 +08:00

122 lines
3.3 KiB
Go

package exam
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 FetchOHLCV(symbol string, timeframe string, since int64, limit int64, params map[string]interface{}) {
// 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), "个交易对")
ohlcv, err := okx.FetchOHLCV(symbol,
ccxt.WithFetchOHLCVSince(since),
ccxt.WithFetchOHLCVTimeframe(timeframe),
ccxt.WithFetchOHLCVLimit(limit),
ccxt.WithFetchOHLCVParams(params))
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
}
}