texus/main.go

241 lines
5.7 KiB
Go
Raw Normal View History

2024-12-02 14:03:35 +08:00
package main
import (
"encoding/json"
"fmt"
"math/rand"
"os"
"strings"
"time"
"v5sdk_go/rest"
2024-12-02 22:28:41 +08:00
// "v5sdk_go/ws"
// "v5sdk_go/ws/wImpl"
2024-12-02 14:03:35 +08:00
simple "github.com/bitly/go-simplejson"
2024-12-02 22:28:41 +08:00
// "github.com/go-redis/redis"
2024-12-02 14:03:35 +08:00
"phyer.click/tunas/core"
2024-12-02 22:28:41 +08:00
// "phyer.click/tunas/private"
2024-12-02 14:03:35 +08:00
"phyer.click/tunas/utils"
)
func init() {
}
// 通过rest接口获取所有ticker信息存入redis的stream和成交量排行榜
func RestTicker(cr *core.Core, dura time.Duration) {
rsp := rest.RESTAPIResult{}
js := simple.Json{}
itemList := []interface{}{}
fmt.Println("getAllTickerInfo err: ")
rsp1, err := cr.GetAllTickerInfo()
rsp = *rsp1
js1, err := simple.NewJson([]byte(rsp.Body))
js = *js1
if err != nil {
fmt.Println("restTicker err: ", err)
return
}
if len(rsp.Body) == 0 {
fmt.Println("rsp body is null")
return
}
itemList = js.Get("data").MustArray()
fmt.Println("itemList length:", len(itemList))
// 关注多少个币,在这里设置, 只需要5个币
allTicker := cr.GetScoreList(5)
redisCli := cr.RedisCli
// 全部币种列表跟特定币种列表进行比对匹配后push到redis
for _, v := range itemList {
tir := core.TickerInfoResp{}
bs, err := json.Marshal(v)
if err != nil {
fmt.Println("restTicker marshal err: ", err)
return
}
err = json.Unmarshal(bs, &tir)
if err != nil {
fmt.Println("restTicker unmarshal err: ", err)
return
}
ti := tir.Convert()
isUsdt := strings.Contains(ti.InstId, "-USDT")
if !isUsdt {
continue
}
if ti.InstType != "SPOT" {
continue
}
ab, _ := json.Marshal(ti)
suffix := ""
env := os.Getenv("GO_ENV")
if env == "demoEnv" {
suffix = "-demoEnv"
}
for _, v := range allTicker {
if v == ti.InstId {
redisCli.Publish(core.TICKERINFO_PUBLISH+suffix, string(ab)).Result()
}
}
}
}
// 统一受理发起rest请求的请求
func LoopSaveCandle(cr *core.Core) {
for {
ary, err := cr.RedisCli.BRPop(0, "restQueue").Result()
if err != nil {
fmt.Println("brpop err:", err)
continue
}
restQ := core.RestQueue{}
json.Unmarshal([]byte(ary[1]), &restQ)
2024-12-02 22:28:41 +08:00
fmt.Println("before: ", restQ.InstId)
2024-12-02 14:03:35 +08:00
// before: USDT|position|key
ary1 := strings.Split(restQ.InstId, "|")
if ary1[0] == "USDT" {
// "USDT-USDT" 这个没有意义,忽略
continue
}
if len(ary1) > 1 && ary1[1] == "position" {
restQ.InstId = ary1[0] + "-USDT"
}
2024-12-02 22:28:41 +08:00
fmt.Println("after: ", restQ.InstId)
2024-12-02 14:03:35 +08:00
// after: restQueue-USDT
go func() {
restQ.Show(cr)
restQ.Save(cr)
}()
}
}
// period: 每个循环开始的时间点,单位:秒
// delay延时多少秒后去取此值, 单位:秒
// mdura多少个分钟之内遍历完获取到的goins列表, 单位:秒
// onceCount每次获取这个coin几个当前周期的candle数据
// range: 随机的范围从0开始到range个周期作为查询的after值也就是随机n个周期去取之前的记录,对于2D5D等数据可以用来补全数据, range值越大随机散点的范围越大, 越失焦
func LoopAllCoinsList(period int64, delay int64, mdura int, barPeriod string, onceCount int, rge int) {
cr := core.Core{}
cr.Init()
allScoreChan := make(chan []string)
2024-12-02 22:28:41 +08:00
fmt.Println("allCoins1")
2024-12-02 14:03:35 +08:00
per1 := 1 * time.Minute
ticker := time.NewTicker(per1)
go func() {
for {
tsi := time.Now().Unix()
2024-12-02 22:28:41 +08:00
fmt.Println("tsi, period, delay, tsi%(period): ", tsi, period, delay, tsi%(period))
2024-12-02 14:03:35 +08:00
if tsi%(period) != delay {
time.Sleep(1 * time.Second)
continue
}
select {
case <-ticker.C:
go func() {
// -1 是获取全部coin列表
list := cr.GetScoreList(5)
2024-12-02 22:28:41 +08:00
fmt.Println("allCoins3", list)
2024-12-02 14:03:35 +08:00
allScoreChan <- list
}()
}
}
}()
for {
allScore, _ := <-allScoreChan
2024-12-02 22:28:41 +08:00
fmt.Println("allCoins allScore", allScore)
2024-12-02 14:03:35 +08:00
if len(allScore) == 0 {
continue
}
utils.TickerWrapper(time.Duration(mdura)*time.Second, allScore, func(i int, ary []string) error {
nw := time.Now()
rand.Seed(nw.UnixNano())
ct := rand.Intn(rge)
minutes := cr.PeriodToMinutes(barPeriod)
tmi := nw.UnixMilli()
tmi = tmi - tmi%60000
tmi = tmi - (int64(ct) * minutes * 60000)
fmt.Println("instId: ", ary[i])
restQ := core.RestQueue{
InstId: ary[i],
Bar: barPeriod,
WithWs: false,
After: tmi,
}
js, err := json.Marshal(restQ)
2024-12-02 22:28:41 +08:00
fmt.Println("allCoins lpush js:", string(js))
2024-12-02 14:03:35 +08:00
cr.RedisCli.LPush("restQueue", js)
return err
})
}
}
func main() {
cr := core.Core{}
cr.Init()
cr.ShowSysTime()
// 从rest接口获取的ticker记录种的交量计入排行榜指定周期刷新一次
go func() {
per1 := 1 * time.Minute
RestTicker(&cr, per1)
limiter := time.Tick(per1)
for {
<-limiter
go func() {
RestTicker(&cr, per1)
}()
}
}()
// 全员1H candle
2024-12-02 22:28:41 +08:00
go func() {
fmt.Println("LoopAllCoinsList2")
LoopAllCoinsList(770, 0, 760, "1H", 9, 12)
}()
2024-12-02 14:03:35 +08:00
// 全员2H candle
go func() {
fmt.Println("LoopAllCoinsList2")
LoopAllCoinsList(820, 0, 820, "2H", 12, 15)
}()
// 全员4小时candle
2024-12-02 22:28:41 +08:00
go func() {
fmt.Println("LoopAllCoinsList1")
LoopAllCoinsList(1280, 150, 1280, "4H", 15, 19)
}()
2024-12-02 14:03:35 +08:00
// 全员6小时candle
2024-12-02 22:28:41 +08:00
go func() {
fmt.Println("LoopAllCoinsList1")
LoopAllCoinsList(1440, 180, 1440, "6H", 17, 21)
}()
2024-12-02 14:03:35 +08:00
// 全员12小时candle
go func() {
fmt.Println("LoopAllCoinsList1")
LoopAllCoinsList(1680, 180, 1680, "12H", 19, 23)
}()
// 全员1Day candle & maX
2024-12-02 22:28:41 +08:00
go func() {
fmt.Println("LoopAllCoinsList1")
LoopAllCoinsList(1920, 4, 1920, "1D", 25, 30)
}()
2024-12-02 14:03:35 +08:00
// 全员2Day candle & maX
go func() {
fmt.Println("LoopAllCoinsList1")
LoopAllCoinsList(3840, 220, 3840, "2D", 26, 31)
}()
// 全员5Day candle & maX
go func() {
fmt.Println("LoopAllCoinsList1")
LoopAllCoinsList(6400, 4, 6400, "5D", 28, 35)
}()
go func() {
LoopSaveCandle(&cr)
}()
go func() {
2024-12-02 22:28:41 +08:00
core.WriteLogProcess(&cr)
2024-12-02 14:03:35 +08:00
}()
// 永久阻塞
select {}
}