159 lines
4.2 KiB
Go
159 lines
4.2 KiB
Go
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
|
|
}
|
|
}
|