From 2a22af2b7d8b3f7ca1dca917d2f90371ac9026ec Mon Sep 17 00:00:00 2001 From: tktk4751 Date: Thu, 25 Jan 2024 10:45:42 +0900 Subject: [PATCH] =?UTF-8?q?DB=E3=81=B8=E3=81=AE=E3=82=AF=E3=82=A8=E3=83=AA?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - cmd/main.go | 144 ++++---------- go.mod | 7 +- go.sum | 34 ++++ pkg/chart/chart.go | 36 ++++ pkg/chart/html/bar.html | 33 ++++ pkg/data/data.go | 86 ++++++++ pkg/data/get_klinedata.go | 159 +++++++++++++++ pkg/data/utils/csv_to_db.go | 283 +++++++++++++++++++++++++++ pkg/data/utils/dbpush.go | 80 ++++++++ pkg/db/db.go | 2 +- pkg/indicator/indicator.go | 159 ++++++++++++++- pkg/indicator/indicators/donchain.go | 66 +++---- pkg/market/market.go | 18 -- pkg/utils/get_candle_data.go | 4 - pkg/utils/get_csv_data/get_data.py | 23 +-- 16 files changed, 940 insertions(+), 195 deletions(-) create mode 100644 pkg/chart/chart.go create mode 100644 pkg/chart/html/bar.html create mode 100755 pkg/data/data.go create mode 100644 pkg/data/get_klinedata.go create mode 100755 pkg/data/utils/csv_to_db.go create mode 100755 pkg/data/utils/dbpush.go diff --git a/.gitignore b/.gitignore index dd16f34..40632ea 100755 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ *.exe *.db bin/ -data/ spot/ diff --git a/cmd/main.go b/cmd/main.go index 270192e..2fc90c7 100755 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,7 +1,6 @@ package main import ( -<<<<<<< HEAD // "v1/pkg/analytics/metrics" @@ -9,32 +8,19 @@ import ( // "v1/pkg/db/models" // p "v1/pkg/management/position" + // "fmt" + // "log" + // data "v1/pkg/db" "fmt" - "log" - "v1/pkg/data" - "v1/pkg/utils" + databace "v1/pkg/db" ) -var path = "/home/lux/dev/go_trading_bot/pkg/data/spot/monthly/klines" -======= - "fmt" - "math/rand" - - "v1/pkg/analytics/metrics" - "v1/pkg/config" - "v1/pkg/db/models" - p "v1/pkg/management/position" - "v1/pkg/utils" -) - -var path = "pkg/data/spot/monthly/klines/OPUSDT/4h" ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 +// var path = "/home/lux/dev/go_trading_bot/pkg/data/spot/monthly/klines" -var close []float64 = utils.GetClosePrice(path) +// var close []float64 = utils.GetClosePrice(path) -var hloc = utils.GetCandleData(path) +// var hloc = utils.GetCandleData(path) -<<<<<<< HEAD // var side = randam_side() // func randam_side() string { @@ -58,29 +44,31 @@ var hloc = utils.GetCandleData(path) // } func main() { - var assets_names []string = []string{"BTCUSDT", "MATICUSDT", "PEPEUSDT", "ARBUSDT", "ETHUSDT", "XRPUSDT", "OPUSDT", "ATOMUSDT", "UNIUSDT", "SEIUSDT", "SUIUSDT", "TIAUSDT", "DOTUSDT", "NEARUSDT", "WLDUSDT", "XRPUSDT"} - var durations []string = []string{"1m", "15m", "30m", "4h"} - paths := data.GetRelativePaths() - - groupedPaths := data.GroupAssetNamePaths(paths) - - asset_data, err := data.LoadOHLCV(groupedPaths, assets_names, durations) - if err != nil { - log.Fatalf("Error loading OHLCV data: %v", err) - } - - // DBに接続する関数を呼び出し - db, err := data.ConnectDB("./db/kline.db") - if err != nil { - log.Fatal(err) - } - // DBをクローズするのを遅延実行 - defer db.Close() - // データをDBに保存する関数を呼び出し - err = data.SaveAssetDatas(db, asset_data) - if err != nil { - log.Fatal(err) - } + databace.GetCloseData("BTCUSDT", "4h") + + // var assets_names []string = []string{"BTCUSDT", "MATICUSDT", "PEPEUSDT", "ARBUSDT", "ETHUSDT", "XRPUSDT", "OPUSDT", "ATOMUSDT", "UNIUSDT", "SEIUSDT", "SUIUSDT", "TIAUSDT", "DOTUSDT", "NEARUSDT", "WLDUSDT", "XRPUSDT"} + // var durations []string = []string{"1m", "15m", "30m", "4h"} + // paths := data.GetRelativePaths() + + // groupedPaths := data.GroupAssetNamePaths(paths) + + // asset_data, err := data.LoadOHLCV(groupedPaths, assets_names, durations) + // if err != nil { + // log.Fatalf("Error loading OHLCV data: %v", err) + // } + + // // DBに接続する関数を呼び出し + // db, err := data.ConnectDB("./db/kline.db") + // if err != nil { + // log.Fatal(err) + // } + // // DBをクローズするのを遅延実行 + // defer db.Close() + // // データをDBに保存する関数を呼び出し + // err = data.SaveAssetDatas(db, asset_data) + // if err != nil { + // log.Fatal(err) + // } // indicators.GetData() // 終了メッセージを表示 @@ -90,12 +78,12 @@ func main() { // } - for _, assetData := range asset_data { - fmt.Printf("Asset: %s, Duration: %s, OHLCV: %+v\n", assetData.AssetName, assetData.Duration, assetData.Data) - } + // for _, assetData := range asset_data { + // fmt.Printf("Asset: %s, Duration: %s, OHLCV: %+v\n", assetData.AssetName, assetData.Duration, assetData.Data) + // } - fmt.Println(asset_data) - // fmt.Println("メイン関数終了") + // fmt.Println(asset_data) + defer fmt.Println("メイン関数終了") } @@ -132,61 +120,3 @@ func main() { // fmt.Println(winrate) // fmt.Println(db) // fmt.Println(hloc) -======= -var side = randam_side() - -func randam_side() string { - // Declare a local variable result to store the random side - var result string - - for i := 0; i < len(close); i++ { - - n := rand.Intn(2) - // Assign "BUY" or "SELL" to result - if n == 0 { - result = "BUY" - } else { - // Otherwise, assign "SELL" to result - result = "SELL" - } - - } - // Return the value of result - return result -} -func main() { - - db := models.DbConnection - - env := config.GetEnv() - - var wr = metrics.Winrate_arg{ - Totall_wintrade: 100, - Totall_trade: 200, - } - var winrate float64 = metrics.Calc_winrate(wr.Totall_wintrade, wr.Totall_trade) - - w := 0.4044 - r := 4.699 - d := 0.33 - - position := p.PositionSizeCalculator{} - - risk_size := position.Risk_size_calculator(w, r, d) * 100 - - sl := position.Stop_loss_price_calc(close, side) - - // management := money_management.PositionSizeCalculator{} - // sl := management.Stop_loss_price_calc() - - // Call the KellyCriterion function and print the result - fmt.Println(risk_size, "%") - fmt.Println(env.TradeDuration, "DURATION") - fmt.Println(sl, side, "EXITPRICE") - // fmt.Println(env.ApiKey) - fmt.Println(winrate) - fmt.Println(db) - fmt.Println(hloc) - -} ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 diff --git a/go.mod b/go.mod index 626d3ef..c57157c 100755 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( golang.org/x/net v0.20.0 ) -<<<<<<< HEAD require ( github.com/gorilla/websocket v1.5.1 github.com/labstack/echo/v4 v4.11.4 @@ -17,6 +16,9 @@ require ( ) require ( + github.com/go-echarts/go-echarts/v2 v2.3.3 // indirect + github.com/iamjinlei/go-tachart v0.0.0-20210729041122-12052a3368c8 // indirect + github.com/iamjinlei/go-tart v0.0.0-20210623083942-ceb57e98706b // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/labstack/gommon v0.4.2 // indirect @@ -29,6 +31,3 @@ require ( golang.org/x/sys v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect ) -======= -require github.com/gorilla/websocket v1.5.1 ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 diff --git a/go.sum b/go.sum index fe08624..b5c360e 100755 --- a/go.sum +++ b/go.sum @@ -1,7 +1,14 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-echarts/go-echarts/v2 v2.3.3 h1:uImZAk6qLkC6F9ju6mZ5SPBqTyK8xjZKwSmwnCg4bxg= +github.com/go-echarts/go-echarts/v2 v2.3.3/go.mod h1:56YlvzhW/a+du15f3S2qUGNDfKnFOeJSThBIrVFHDtI= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/iamjinlei/go-tachart v0.0.0-20210729041122-12052a3368c8 h1:H5kOh2IkewOq8rhT45eAgXAntN870QpomwnmCohEtbo= +github.com/iamjinlei/go-tachart v0.0.0-20210729041122-12052a3368c8/go.mod h1:T8ypfvEbb7q1C/Sbu/KtZ4ANa0z7RRFyTBghcmQcWCE= +github.com/iamjinlei/go-tart v0.0.0-20210623083942-ceb57e98706b h1:KfgXYALdIQOs1IQNUDzwBu3SM+3eNUR3T0C6sl626fU= +github.com/iamjinlei/go-tart v0.0.0-20210623083942-ceb57e98706b/go.mod h1:30Qg94n/KqLWfDL2OCY77Z1uNrY5DK9Oe0DyftSn8IU= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -23,28 +30,55 @@ github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbW github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/sqlite v1.5.4 h1:IqXwXi8M/ZlPzH/947tn5uik3aYQslP9BVveoax0nV0= diff --git a/pkg/chart/chart.go b/pkg/chart/chart.go new file mode 100644 index 0000000..eddd1db --- /dev/null +++ b/pkg/chart/chart.go @@ -0,0 +1,36 @@ +package chart + +import ( + "math/rand" + "os" + + "github.com/go-echarts/go-echarts/v2/charts" + "github.com/go-echarts/go-echarts/v2/opts" +) + +// generate random data for bar chart +func generateBarItems() []opts.BarData { + items := make([]opts.BarData, 0) + for i := 0; i < 7; i++ { + items = append(items, opts.BarData{Value: rand.Intn(300)}) + } + return items +} + +func main() { + // create a new bar instance + bar := charts.NewBar() + // set some global options like Title/Legend/ToolTip or anything else + bar.SetGlobalOptions(charts.WithTitleOpts(opts.Title{ + Title: "My first bar chart generated by go-echarts", + Subtitle: "It's extremely easy to use, right?", + })) + + // Put data into instance + bar.SetXAxis([]string{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}). + AddSeries("Category A", generateBarItems()). + AddSeries("Category B", generateBarItems()) + // Where the magic happens + f, _ := os.Create("pkg/chart/html/bar.html") + bar.Render(f) +} diff --git a/pkg/chart/html/bar.html b/pkg/chart/html/bar.html new file mode 100644 index 0000000..b8703d4 --- /dev/null +++ b/pkg/chart/html/bar.html @@ -0,0 +1,33 @@ + + + + + + Awesome go-echarts + + + + +
+
+
+ + + + + + diff --git a/pkg/data/data.go b/pkg/data/data.go new file mode 100755 index 0000000..6a26bfc --- /dev/null +++ b/pkg/data/data.go @@ -0,0 +1,86 @@ +package data + +import ( + "encoding/csv" + "fmt" + "io" + "os" + "path/filepath" +) + +// type Candle struct { +// AssetName string +// Duration time.Duration +// Time time.Time +// //CSVのデータ用 +// Date string +// Open float64 +// Close float64 +// High float64 +// Low float64 +// Volume float64 +// } + +func main() { + + //銘柄の一覧リスト + // assets := []string{"BTCUSDT", "ETHUSDT", "SOLUSDT", "AVAXUSDT", "MATICUSDT", "ATOMUSDT", "UNIUSDT", "ARBUSDT", "OPUSDT", "PEPEUSDT", "SEIUSDT", "SUIUSDT", "TIAUSDT", "WLDUSDT", "XRPUSDT", "NEARUSDT", "DOTUSDT"} + // ディレクトリ内のすべてのCSVファイルを見つける + files, err := filepath.Glob("./monthly/klines/SOLUSDT/15m/*.csv") + if err != nil { + fmt.Println("ファイル検索エラー:", err) + return + } + + // 出力ファイルを作成する + outFile, err := os.Create("SOLUSDT_15m.csv") + if err != nil { + fmt.Println("出力ファイル作成エラー:", err) + return + } + defer outFile.Close() + + writer := csv.NewWriter(outFile) + //関数が終了するときに、全てのデータを書き込む + defer writer.Flush() + + // ファイルをループして読み込む + for _, file := range files { + fmt.Println("処理中のファイル:", file) + + // 入力ファイルを開く + inFile, err := os.Open(file) + if err != nil { + fmt.Println("ファイルオープンエラー:", err) + continue + } + + reader := csv.NewReader(inFile) + + // ヘッダーをスキップ + if _, err := reader.Read(); err != nil { + fmt.Println("ヘッダー読み込みエラー:", err) + inFile.Close() + continue + } + + // CSVデータを読み込み、出力ファイルに書き込む + for { + record, err := reader.Read() + if err == io.EOF { + break + } + if err != nil { + fmt.Println("レコード読み込みエラー:", err) + break + } + + if err := writer.Write(record); err != nil { + fmt.Println("レコード書き込みエラー:", err) + break + } + } + + inFile.Close() + } +} diff --git a/pkg/data/get_klinedata.go b/pkg/data/get_klinedata.go new file mode 100644 index 0000000..7278bfa --- /dev/null +++ b/pkg/data/get_klinedata.go @@ -0,0 +1,159 @@ +package data + +import ( + "database/sql" + "fmt" + "log" + + _ "github.com/mattn/go-sqlite3" +) + +type Kline struct { + Date string + Open float64 + High float64 + Low float64 + Close float64 + Volume float64 +} + +type HLC struct { + High float64 + Low float64 + Close float64 +} + +type OHLC struct { + Open float64 + High float64 + Low float64 + Close float64 +} + +type CLOSE struct { + Close float64 +} + +// 課題 GetDataを引数でAssetnameとDurationを受け取って、他のインディケーターでも使えるようにする + +func GetHLCData(assetName string, duration string) []HLC { + db, err := sql.Open("sqlite3", "db/kline.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + query := fmt.Sprintf("SELECT High, Low, Close FROM %s_%s", assetName, duration) + rows, err := db.Query(query) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + var hlc []HLC + for rows.Next() { + var k HLC + err := rows.Scan(&k.High, &k.Low, &k.Close) + if err != nil { + log.Fatal(err) + } + hlc = append(hlc, k) + // fmt.Println(hlc) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } + return hlc +} + +func GetOHLCData(assetName string, duration string) []OHLC { + db, err := sql.Open("sqlite3", "db/kline.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + query := fmt.Sprintf("SELECT Open,High, Low, Close FROM %s_%s", assetName, duration) + rows, err := db.Query(query) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + var ohlc []OHLC + for rows.Next() { + var k OHLC + err := rows.Scan(&k.Open, &k.High, &k.Low, &k.Close) + if err != nil { + log.Fatal(err) + } + ohlc = append(ohlc, k) + // fmt.Println(hlc) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } + + return ohlc +} + +func GetKlineCData(assetName string, duration string) []Kline { + db, err := sql.Open("sqlite3", "db/kline.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + query := fmt.Sprintf("SELECT * Close FROM %s_%s", assetName, duration) + rows, err := db.Query(query) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + var kline []Kline + for rows.Next() { + var k Kline + err := rows.Scan(&k.Date, &k.Open, &k.High, &k.Low, &k.Close, &k.Volume) + if err != nil { + log.Fatal(err) + } + kline = append(kline, k) + // fmt.Println(hlc) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } + return kline +} + +func GetCloseData(assetName string, duration string) []CLOSE { + db, err := sql.Open("sqlite3", "db/kline.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + query := fmt.Sprintf("SELECT Close FROM %s_%s", assetName, duration) + rows, err := db.Query(query) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + var close []CLOSE + for rows.Next() { + var k CLOSE + err := rows.Scan(&k.Close) + if err != nil { + log.Fatal(err) + } + close = append(close, k) + // fmt.Println(hlc) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } + fmt.Println(close) + return close +} diff --git a/pkg/data/utils/csv_to_db.go b/pkg/data/utils/csv_to_db.go new file mode 100755 index 0000000..e1777d3 --- /dev/null +++ b/pkg/data/utils/csv_to_db.go @@ -0,0 +1,283 @@ +package data + +import ( + "encoding/csv" + "fmt" + "os" + "path/filepath" + "strconv" + "strings" + "time" +) + +type Candle struct { + Assetname string //引数で与えられたpathの、最後から二番目の値を挿入する + Duration string //引数で与えられたpathの一番最後の値を挿入する + Date string //CSVファイルの一行目のタイムスタンプ + Open float64 //CSVファイル二行目の始値 + High float64 //CSVファイル三行目の高値 + Low float64 //CSVファイル四行目の安値 + Close float64 //CSVファイル五行目行目の終値 + Volume float64 //CSVファイル六行目のボリューム +} + +type OHLCV struct { + Date string //CSVファイルの一行目のタイムスタンプをRFC3339に変換したもの + Open float64 + High float64 + Low float64 + Close float64 + Volume float64 +} + +type OHLCVSlice []OHLCV + +type AssetDurationData struct { + AssetName string + Duration string + Data OHLCVSlice +} + +type OHLCVDB struct { + AssetName string + Duration string + Date string + Open float64 + High float64 + Low float64 + Close float64 + Volume float64 +} + +type AssetData map[string]map[string]OHLCVSlice + +type AssetDatas []AssetDurationData + +// CSVファイルがあるディレクトリのパスを全て取得する関数 +func GetRelativePaths() []string { + var root string = "./pkg/data/spot/monthly/klines" + var durations = []string{"1m", "30m", "4h", "15m"} + + var paths []string + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + // 時間間隔が含まれる場合のみ追加 + if info.IsDir() { + for _, duration := range durations { + if strings.Contains(path, duration) { + paths = append(paths, path) + break + } + } + } + + return nil + + }) + if err != nil { + panic(err) + } + + // フィルタリング + var filteredPaths []string + for _, path := range paths { + for _, duration := range durations { + if strings.Contains(path, duration) { + filteredPaths = append(filteredPaths, path) + break + } + } + } + + // fmt.Println(filteredPaths) + return filteredPaths +} + +var paths []string = GetRelativePaths() + +// 大量のpathを銘柄名でグループ化する関数 +func GroupAssetNamePaths(paths []string) map[string][]string { + groupedPaths := make(map[string][]string) + for _, path := range paths { + splitPath := strings.Split(path, "/") + if len(splitPath) < 2 { + continue + } + key := splitPath[len(splitPath)-2] + groupedPaths[key] = append(groupedPaths[key], path) + } + return groupedPaths +} + +// 呼び出し方 +// groupedPaths := groupPaths(paths) +// for key, paths := range groupedPaths { +// fmt.Printf("{%s: %v}\n", key, paths) + +func reverse(s []OHLCV) []OHLCV { + reversed := make([]OHLCV, len(s)) + copy(reversed, s) + + for i, j := 0, len(reversed)-1; i < j; i, j = i+1, j-1 { + reversed[i], reversed[j] = reversed[j], reversed[i] + } + + return reversed +} + +// 引数で受け取った銘柄名と期間に基づいて、OHLCVを出力する関数。呼び出し元でfo文を使うことで、全てのデータを取得するようにする。 + +// func LoadOHLCV(data map[string][]string, assetNames []string, durations []string) (AssetDatas, error) { + +// var result AssetDatas +// db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) +// if err != nil { +// return nil, err +// } + +// db.AutoMigrate(&OHLCVDB{}) + +// for _, paths := range data { +// for _, path := range paths { +// asset := filepath.Base(filepath.Dir(path)) +// dur := filepath.Base(path) +// if contains(assetNames, asset) && contains(durations, dur) { +// err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error { +// if err != nil { +// return err +// } +// if !info.IsDir() { +// file, err := os.Open(path) +// if err != nil { +// return err +// } +// defer file.Close() +// reader := csv.NewReader(file) +// lines, err := reader.ReadAll() +// if err != nil { +// return err +// } +// var ohlcvData OHLCVSlice +// for _, line := range lines { +// timestampMillis, _ := strconv.ParseInt(line[0], 10, 64) +// timestamp := time.Unix(timestampMillis/1000, 0) +// date := timestamp.Format(time.RFC3339) +// open, _ := strconv.ParseFloat(line[1], 64) +// high, _ := strconv.ParseFloat(line[2], 64) +// low, _ := strconv.ParseFloat(line[3], 64) +// close, _ := strconv.ParseFloat(line[4], 64) +// volume, _ := strconv.ParseFloat(line[5], 64) +// ohlcv := OHLCV{ +// Date: date, +// Open: open, +// High: high, +// Low: low, +// Close: close, +// Volume: volume, +// } +// ohlcvData = append(ohlcvData, ohlcv) + +// // Save to DB +// db.Create(&OHLCVDB{AssetName: asset, Duration: dur, Date: date, Open: open, High: high, Low: low, Close: close, Volume: volume}) +// } +// ohlcvData = reverse(ohlcvData) +// result = append(result, AssetDurationData{AssetName: asset, Duration: dur, Data: ohlcvData}) +// } +// return nil +// }) +// if err != nil { +// return nil, err +// } +// } +// } +// } +// defer fmt.Println("終了") +// return result, nil + +// } + +func LoadOHLCV(data map[string][]string, assetNames []string, durations []string) (AssetDatas, error) { + + var result AssetDatas + + for _, paths := range data { + for _, path := range paths { + asset := filepath.Base(filepath.Dir(path)) + dur := filepath.Base(path) + if contains(assetNames, asset) && contains(durations, dur) { + err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + reader := csv.NewReader(file) + lines, err := reader.ReadAll() + if err != nil { + return err + } + var ohlcvData OHLCVSlice + for _, line := range lines { + timestampMillis, _ := strconv.ParseInt(line[0], 10, 64) + timestamp := time.Unix(timestampMillis/1000, 0) + date := timestamp.Format(time.RFC3339) + open, _ := strconv.ParseFloat(line[1], 64) + high, _ := strconv.ParseFloat(line[2], 64) + low, _ := strconv.ParseFloat(line[3], 64) + close, _ := strconv.ParseFloat(line[4], 64) + volume, _ := strconv.ParseFloat(line[5], 64) + ohlcv := OHLCV{ + Date: date, + Open: open, + High: high, + Low: low, + Close: close, + Volume: volume, + } + ohlcvData = append(ohlcvData, ohlcv) + + } + ohlcvData = reverse(ohlcvData) + result = append(result, AssetDurationData{AssetName: asset, Duration: dur, Data: ohlcvData}) + } + return nil + }) + if err != nil { + return nil, err + } + } + } + } + defer fmt.Println("CSVデータの読み込み終了") + return result, nil + +} + +func contains(slice []string, str string) bool { + for _, v := range slice { + if v == str { + return true + } + } + return false +} + +//呼び出し方サンプル +// asset_data, err := data.LoadOHLCV(groupedPaths, "BTCUSDT", "1m") +// if err != nil { +// log.Fatalf("Error loading OHLCV data: %v", err) +// } + +// for asset, ohlcvData := range assetData { +// for dur, ohlcv := range ohlcvData { +// fmt.Printf("Asset: %s, Duration: %s, OHLCV: %+v\n", asset, dur, ohlcv) +// } +// } +// } diff --git a/pkg/data/utils/dbpush.go b/pkg/data/utils/dbpush.go new file mode 100755 index 0000000..ffa9d2c --- /dev/null +++ b/pkg/data/utils/dbpush.go @@ -0,0 +1,80 @@ +package data + +import ( + "database/sql" + "fmt" + "log" + "sort" + "time" + + _ "github.com/mattn/go-sqlite3" +) + +// DBに接続する関数 +func ConnectDB(dbname string) (*sql.DB, error) { + // DBファイルが存在しない場合は新規作成される + db, err := sql.Open("sqlite3", dbname) + if err != nil { + log.Fatal(err) + } + + return db, nil +} + +// DBファイルが存在しない場合は新規作成される + +// AssetDatas型のデータをDBに保存する関数 +func SaveAssetDatas(db *sql.DB, assetDatas AssetDatas) error { + + // トランザクションを開始 + tx, err := db.Begin() + if err != nil { + return err + } + // トランザクションの終了を遅延実行 + defer tx.Commit() + + // AssetDatas型のデータをループで処理 + for _, assetData := range assetDatas { + + // データを日付でソート + sort.Slice(assetData.Data, func(i, j int) bool { + iDate, _ := time.Parse(time.RFC3339, assetData.Data[i].Date) + jDate, _ := time.Parse(time.RFC3339, assetData.Data[j].Date) + return iDate.Before(jDate) + }) + + // テーブル名をAssetNameとDurationの組み合わせで作成 + tableName := assetData.AssetName + "_" + assetData.Duration + // テーブルが存在しない場合は作成するSQL文を準備 + createTableSQL := fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s ( + Date TEXT PRIMARY KEY, + Open REAL, + High REAL, + Low REAL, + Close REAL, + Volume REAL + )`, tableName) + // SQL文を実行 + _, err := tx.Exec(createTableSQL) + if err != nil { + return err + } + // データを挿入するSQL文を準備 + insertSQL := fmt.Sprintf(`INSERT OR IGNORE INTO %s ( + Date, Open, High, Low, Close, Volume + ) VALUES (?, ?, ?, ?, ?, ?)`, tableName) + // OHLCVSlice型のデータをループで処理 + for _, ohlcv := range assetData.Data { + // SQL文にパラメータをバインドして実行 + _, err := tx.Exec(insertSQL, ohlcv.Date, ohlcv.Open, ohlcv.High, ohlcv.Low, ohlcv.Close, ohlcv.Volume) + if err != nil { + return err + } + } + } + fmt.Println("データベースの更新が完了") + // エラーがなければコミットして終了 + return nil + +} diff --git a/pkg/db/db.go b/pkg/db/db.go index 3a49c63..94ee8c6 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -1 +1 @@ -package db +package databace diff --git a/pkg/indicator/indicator.go b/pkg/indicator/indicator.go index 809936b..cd09e88 100755 --- a/pkg/indicator/indicator.go +++ b/pkg/indicator/indicator.go @@ -1,8 +1,157 @@ package indicator -<<<<<<< HEAD -type indicators interface { - GetData() []Kline +import ( + "database/sql" + "fmt" + "log" + + _ "github.com/mattn/go-sqlite3" +) + +type Kline struct { + Date string + Open float64 + High float64 + Low float64 + Close float64 + Volume float64 +} + +type HLC struct { + High float64 + Low float64 + Close float64 +} + +type OHLC struct { + Open float64 + High float64 + Low float64 + Close float64 +} + +type CLOSE struct { + Close float64 +} + +// 課題 GetDataを引数でAssetnameとDurationを受け取って、他のインディケーターでも使えるようにする + +func GetHLCData(assetName string, duration string) []HLC { + db, err := sql.Open("sqlite3", "db/kline.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + query := fmt.Sprintf("SELECT High, Low, Close FROM %s_%s", assetName, duration) + rows, err := db.Query(query) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + var hlc []HLC + for rows.Next() { + var k HLC + err := rows.Scan(&k.High, &k.Low, &k.Close) + if err != nil { + log.Fatal(err) + } + hlc = append(hlc, k) + // fmt.Println(hlc) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } + return hlc +} + +func GetOHLCData(assetName string, duration string) []OHLC { + db, err := sql.Open("sqlite3", "db/kline.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + query := fmt.Sprintf("SELECT Open,High, Low, Close FROM %s_%s", assetName, duration) + rows, err := db.Query(query) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + var ohlc []OHLC + for rows.Next() { + var k OHLC + err := rows.Scan(&k.Open, &k.High, &k.Low, &k.Close) + if err != nil { + log.Fatal(err) + } + ohlc = append(ohlc, k) + // fmt.Println(hlc) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } + return ohlc +} + +func GetKlineCData(assetName string, duration string) []Kline { + db, err := sql.Open("sqlite3", "db/kline.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + query := fmt.Sprintf("SELECT * Close FROM %s_%s", assetName, duration) + rows, err := db.Query(query) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + var kline []Kline + for rows.Next() { + var k Kline + err := rows.Scan(&k.Date, &k.Open, &k.High, &k.Low, &k.Close, &k.Volume) + if err != nil { + log.Fatal(err) + } + kline = append(kline, k) + // fmt.Println(hlc) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } + return kline +} + +func GetCloseData(assetName string, duration string) []CLOSE { + db, err := sql.Open("sqlite3", "db/kline.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + query := fmt.Sprintf("SELECT Close FROM %s_%s", assetName, duration) + rows, err := db.Query(query) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + var close []CLOSE + for rows.Next() { + var k CLOSE + err := rows.Scan(&k.Close) + if err != nil { + log.Fatal(err) + } + close = append(close, k) + // fmt.Println(hlc) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } + return close } -======= ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 diff --git a/pkg/indicator/indicators/donchain.go b/pkg/indicator/indicators/donchain.go index a3a64c3..031e8eb 100755 --- a/pkg/indicator/indicators/donchain.go +++ b/pkg/indicator/indicators/donchain.go @@ -1,13 +1,9 @@ package indicators -<<<<<<< HEAD import ( - "database/sql" - "fmt" - "log" - "github.com/markcheno/go-talib" - _ "github.com/mattn/go-sqlite3" + + "v1/pkg/indicator" ) type Kline struct { @@ -19,34 +15,38 @@ type Kline struct { } // 課題 GetDataを引数でAssetnameとDurationを受け取って、他のインディケーターでも使えるようにする -func GetData() Kline { - db, err := sql.Open("sqlite3", "db/kline.db") - if err != nil { - log.Fatal(err) - } - defer db.Close() +// func GetData() Kline { +// db, err := sql.Open("sqlite3", "db/kline.db") +// if err != nil { +// log.Fatal(err) +// } +// defer db.Close() - rows, err := db.Query("SELECT high, low, close FROM BTCUSDT_4h") - if err != nil { - log.Fatal(err) - } - defer rows.Close() - - var hlc Kline - for rows.Next() { - err := rows.Scan(&hlc.High, &hlc.Low, &hlc.Close) - if err != nil { - log.Fatal(err) - } - fmt.Println(hlc) - } - if err := rows.Err(); err != nil { - log.Fatal(err) - } - return hlc -} +// rows, err := db.Query("SELECT high, low, close FROM BTCUSDT_4h") +// if err != nil { +// log.Fatal(err) +// } +// defer rows.Close() + +// var hlc Kline +// for rows.Next() { +// err := rows.Scan(&hlc.High, &hlc.Low, &hlc.Close) +// if err != nil { +// log.Fatal(err) +// } +// fmt.Println(hlc) +// } +// if err := rows.Err(); err != nil { +// log.Fatal(err) +// } +// return hlc +// } + +var hlc = indicator.Kline{} + +var data = indicator.GetHLCData("BTCUSDT", "4h") -func donchain(value int, GetData() Kline) ([]float64, []float64, []float64) { +func donchain(value int, data []Kline) ([]float64, []float64, []float64) { v := value v2 := value / 2 @@ -70,5 +70,3 @@ func donchain(value int, GetData() Kline) ([]float64, []float64, []float64) { return high, low, basis } -======= ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 diff --git a/pkg/market/market.go b/pkg/market/market.go index e89e87d..3c2f8ca 100755 --- a/pkg/market/market.go +++ b/pkg/market/market.go @@ -1,14 +1,9 @@ -<<<<<<< HEAD package market -======= -package define_data ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 import ( "time" ) -<<<<<<< HEAD // CSVデータを表す構造体の定義 type Data struct { Timestamp int64 // タイムスタンプ @@ -42,17 +37,4 @@ type Candle struct { type Chart struct { Candle Candle -======= -type Candle struct { - AssetName string - Duration time.Duration - Time time.Time - //CSVのデータ用 - Date string - Open float64 - Close float64 - High float64 - Low float64 - Volume float64 ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 } diff --git a/pkg/utils/get_candle_data.go b/pkg/utils/get_candle_data.go index 5671a52..19a573d 100755 --- a/pkg/utils/get_candle_data.go +++ b/pkg/utils/get_candle_data.go @@ -11,12 +11,8 @@ import ( "v1/pkg/market" ) -<<<<<<< HEAD func GetCandleData(dir string) []market.Data { var data []market.Data -======= -func GetCandleData(dir string) []Data { ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 // ディレクトリ内のファイルのパスを取得する files, err := os.ReadDir(dir) if err != nil { diff --git a/pkg/utils/get_csv_data/get_data.py b/pkg/utils/get_csv_data/get_data.py index 9c61475..8bea5a8 100755 --- a/pkg/utils/get_csv_data/get_data.py +++ b/pkg/utils/get_csv_data/get_data.py @@ -1,15 +1,11 @@ from binance_historical_data import BinanceDataDumper -ticker = ["BTCUSDT", "ETHUSDT", "SOLUSDT", "AVAXUSDT", "MATICUSDT", "ATOMUSDT", "UNIUSDT","ARBUSDT","OPUSDT","PEPEUSDT","SEIUSDT","SUIUSDT","TIAUSDT","WLDUSDT","XRPUSDT","NEARUSDT","DOTUSDT"] -<<<<<<< HEAD +ticker = ["BTCUSDT", "ETHUSDT", "SOLUSDT", "AVAXUSDT", "MATICUSDT", "ATOMUSDT", "UNIUSDT","ARBUSDT","OPUSDT","PEPEUSDT","SEIUSDT","SUIUSDT","TIAUSDT","WLDUSDT","XRPUSDT","NEARUSDT","DOTUSDT","APTUSDT"] # ticker = ["BTCUSDT","ETHUSDT","BNBUSDT","XRPUSDT","ADAUSDT","SOLUSDT","DOTUSDT","UNIUSDT","LINKUSDT","LTCUSDT","BCHUSDT","XLMUSDT","ETCUSDT","MATICUSDT","THETAUSDT","VETUSDT","FILUSDT","TRXUSDT","EOSUSDT","LUNAUSDT","ATOMUSDT","AVAXUSDT","XTZUSDT","MIOTAUSDT","NEOUSDT","MKRUSDT","CAKEUSDT","KSMUSDT","IOTAUSDT","BTSUSDT","ALGOUSDT","EGLDUSDT","HBARUSDT","RUNEUSDT","ENJUSDT","SUSHIUSDT","SNXUSDT","ZILUSDT","GRTUSDT","RVNUSDT","NANOUSDT","ZECUSDT","QTUMUSDT","COMPUSDT","WAVESUSDT","HOTUSDT","NEOUSDT","STXUSDT","ARUSDT","ONEUSDT","OGNUSDT","ICPUSDT","NKNUSDT","DGBUSDT","CVCUSDT","TUSDUSDT","WRXUSDT","LTOUSDT","PERPUSDT","ANKRUSDT","DYDXUSDT","BITUSDT","MBOXUSDT","C98USDT","MASKUSDT","1INCHUSDT","AKROUSDT","ACMUSDT","PUNDIXUSDT","GHSTUSDT","GLMRUSDT","LOKAUSDT","APEUSDT","API3USDT","WOOUSDT","ENSUSDT","NEXOUSDT","GMTUSDT","NEBLUSDT","KDAUSDT","NEARUSDT","OCEANUSDT","LRCUSDT","CKBUSDT","XECUSDT","ARUSDT","CTKUSDT","TOMOUSDT","MLNUSDT","UNFIUSDT","RAYUSDT","XYMUSDT","FETUSDT","SKLUSDT","CVPUSDT","IMXUSDT","QNTUSDT","FLMUSDT","WAXPUSDT","TRBUSDT","ERNUSDT","SANDUSDT","REBUSDT","MANAUSDT","KNCUSDT","FIROUSDT","MCUSDT","LPTUSDT","SFPUSDT","DENTUSDT","ARPAUSDT","CELRUSDT","GTCUSDT","FXSUSDT","SUNUSDT","ALCXUSDT","CHRUSDT","DUSKUSDT","OMGUSDT","GNOUSDT","UMAUSDT","BNTUSDT","AUDIOUSDT","SUPERUSDT","PONDUSDT","XCNUSDT","BADGERUSDT","PEOPLEUSDT","COTIUSDT","ORNUSDT","DOGEUSDT","RLCUSDT","TRIBEUSDT","FUNUSDT","CRVUSDT","SAFEUSDT","CTSIUSDT","FRONTUSDT","SRMUSDT","LITUSDT","SFPUSDT","KEEPUSDT","ROSEUSDT","IOTXUSDT","BTTCUSDT","AXSUSDT","HNTUSDT","VLXUSDT","PROMUSDT","UFTUSDT","JSTUSDT","CFXUSDT","GLMUSDT","CKBUSDT","SPELLUSDT","BTCSTUSDT","NUUSDT","FORTHUSDT","SCRTUSDT","OGUSDT","RAREUSDT","C98USDT","HIGHUSDT","BALUSDT","SWINGBYUSDT","ATAUSDT","CLVUSDT","USTUSDT","FEIUSDT","POLSUSDT","BTSUSDT"] -======= ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 if __name__ == '__main__': data_dumper = BinanceDataDumper( -<<<<<<< HEAD path_dir_where_to_dump="./", asset_class="spot", # spot, um, cm data_type="klines", # aggTrades, klines, trades @@ -17,24 +13,9 @@ ) data_dumper.dump_data( - tickers="ticker", -======= - path_dir_where_to_dump="/go_trading_bot/pkg/data", - asset_class="spot", # spot, um, cm - data_type="klines", # aggTrades, klines, trades - data_frequency="12h", - ) - - data_dumper.dump_data( - tickers=ticker, ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42 + tickers="ARBUSDT", date_start=None, date_end=None, is_to_update_existing=True, tickers_to_exclude=["UST"], ) -<<<<<<< HEAD -======= - - ->>>>>>> f2368b9e69670deb7cada702d1a07d48385c2c42