code
This commit is contained in:
173
app/jobs/jobs.go
173
app/jobs/jobs.go
@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/bytedance/sonic"
|
||||||
"go-admin/app/admin/models"
|
"go-admin/app/admin/models"
|
||||||
"go-admin/app/admin/service"
|
"go-admin/app/admin/service"
|
||||||
"go-admin/app/admin/service/dto"
|
"go-admin/app/admin/service/dto"
|
||||||
@ -14,6 +15,12 @@ import (
|
|||||||
"go-admin/pkg/utility/snowflakehelper"
|
"go-admin/pkg/utility/snowflakehelper"
|
||||||
"go-admin/services/binanceservice"
|
"go-admin/services/binanceservice"
|
||||||
"go-admin/services/fileservice"
|
"go-admin/services/fileservice"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -41,6 +48,9 @@ type AutoPlaceOrder struct {
|
|||||||
type LimitOrderTimeoutDuration struct {
|
type LimitOrderTimeoutDuration struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ListenSymbol struct {
|
||||||
|
}
|
||||||
|
|
||||||
// 初始化合约交易对
|
// 初始化合约交易对
|
||||||
func (t InitFuturesSymbol) Exec(arg interface{}) error {
|
func (t InitFuturesSymbol) Exec(arg interface{}) error {
|
||||||
str := time.Now().Format(timeFormat) + " [INFO] JobCore InitFuturesSymbol exec success"
|
str := time.Now().Format(timeFormat) + " [INFO] JobCore InitFuturesSymbol exec success"
|
||||||
@ -319,3 +329,166 @@ func (t LimitOrderTimeoutDuration) ReFutOrderPlace(db *gorm.DB, order models.Lin
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l ListenSymbol) Exec(arg interface{}) error {
|
||||||
|
str := time.Now().Format(timeFormat) + " [INFO] JobCore ClearLogJob exec success"
|
||||||
|
defer logger.Info(str)
|
||||||
|
var db *gorm.DB
|
||||||
|
|
||||||
|
for _, item := range sdk.Runtime.GetDb() {
|
||||||
|
db = item
|
||||||
|
break
|
||||||
|
}
|
||||||
|
set, err := helper.DefaultRedis.GetAllSortSet(rediskey.ListenAveLastSymbol)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("获取监听交易对失败")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Println(set)
|
||||||
|
//if len(set) == 0 {
|
||||||
|
// return nil
|
||||||
|
//}
|
||||||
|
|
||||||
|
aveToken, _ := helper.DefaultRedis.GetString(rediskey.AveRequestToken)
|
||||||
|
if aveToken == "" {
|
||||||
|
aveToken, err = l.GetAveRequestId()
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("获取请求id失败err:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
chainSlice := []string{"solana", "bsc", "eth"}
|
||||||
|
|
||||||
|
for _, chain := range chainSlice {
|
||||||
|
symbols, err := l.GetAveLastSymbol(chain, aveToken)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, symbol := range symbols.Data.Data {
|
||||||
|
if slices.Contains(set, symbol.Token0Symbol+symbol.Token1Symbol) {
|
||||||
|
|
||||||
|
// 清除数据
|
||||||
|
|
||||||
|
//发送邮箱
|
||||||
|
l.SendEmailNotice(db, symbol.Pair, symbol.Token0Symbol+symbol.Token1Symbol, chain)
|
||||||
|
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAveRequestId 获取请求id
|
||||||
|
func (l ListenSymbol) GetAveRequestId() (aveToken string, err error) {
|
||||||
|
execPath, err := os.Getwd()
|
||||||
|
// 获取可执行文件所在的目录
|
||||||
|
execDir := fmt.Sprintf("%s/config/ave.js", filepath.Dir(filepath.Dir(execPath)))
|
||||||
|
_, err = os.Stat(execDir)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("可执行的js 文件不存在")
|
||||||
|
return aveToken, err
|
||||||
|
}
|
||||||
|
command := exec.Command("node", execDir)
|
||||||
|
output, err := command.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("执行出错:err", err)
|
||||||
|
return aveToken, err
|
||||||
|
}
|
||||||
|
client := &http.Client{}
|
||||||
|
|
||||||
|
m := map[string]string{
|
||||||
|
"request_id": string(output),
|
||||||
|
}
|
||||||
|
marshal, _ := sonic.Marshal(m)
|
||||||
|
var data = strings.NewReader(string(marshal))
|
||||||
|
req, err := http.NewRequest("POST", "https://febweb002.com/v1api/v1/captcha/requestToken", data)
|
||||||
|
if err != nil {
|
||||||
|
return aveToken, err
|
||||||
|
}
|
||||||
|
req.Header.Set("accept", "*/*")
|
||||||
|
req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
|
||||||
|
req.Header.Set("ave-platform", "web")
|
||||||
|
req.Header.Set("content-type", "application/json")
|
||||||
|
req.Header.Set("origin", "https://ave.ai")
|
||||||
|
req.Header.Set("priority", "u=1, i")
|
||||||
|
req.Header.Set("referer", "https://ave.ai/")
|
||||||
|
req.Header.Set("sec-ch-ua", `"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"`)
|
||||||
|
req.Header.Set("sec-ch-ua-mobile", "?0")
|
||||||
|
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
|
||||||
|
req.Header.Set("sec-fetch-dest", "empty")
|
||||||
|
req.Header.Set("sec-fetch-mode", "cors")
|
||||||
|
req.Header.Set("sec-fetch-site", "cross-site")
|
||||||
|
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36")
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("请求失败err:", err)
|
||||||
|
return aveToken, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
bodyText, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("读取响应失败err:", err)
|
||||||
|
return aveToken, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var res RequestId
|
||||||
|
sonic.Unmarshal(bodyText, &res)
|
||||||
|
|
||||||
|
if res.Status == 1 {
|
||||||
|
aveToken = res.Data.Id
|
||||||
|
helper.DefaultRedis.SetStringExpire(rediskey.AveRequestToken, res.Data.Id, time.Duration(60*time.Second))
|
||||||
|
}
|
||||||
|
return aveToken, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l ListenSymbol) GetAveLastSymbol(chain, token string) (aveLastSymbolResp AveLastSymbolResp, err error) {
|
||||||
|
client := &http.Client{}
|
||||||
|
url := fmt.Sprintf("https://api.agacve.com/v1api/v4/tokens/treasure/list?chain=%s&sort=created_at&sort_dir=desc&pageNO=1&pageSize=50&category=new&refresh_total=0", chain)
|
||||||
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("获取最新交易对列表出错err:", err)
|
||||||
|
return AveLastSymbolResp{}, err
|
||||||
|
}
|
||||||
|
req.Header.Set("accept", "application/json, text/plain, */*")
|
||||||
|
req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
|
||||||
|
req.Header.Set("ave-udid", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36--1739784205001--97086a46-bce0-4ca9-8e0e-78f5075be306")
|
||||||
|
req.Header.Set("cache-control", "no-cache")
|
||||||
|
req.Header.Set("lang", "en")
|
||||||
|
req.Header.Set("origin", "https://ave.ai")
|
||||||
|
req.Header.Set("pragma", "no-cache")
|
||||||
|
req.Header.Set("priority", "u=1, i")
|
||||||
|
req.Header.Set("referer", "https://ave.ai/")
|
||||||
|
req.Header.Set("sec-ch-ua", `"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"`)
|
||||||
|
req.Header.Set("sec-ch-ua-mobile", "?0")
|
||||||
|
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
|
||||||
|
req.Header.Set("sec-fetch-dest", "empty")
|
||||||
|
req.Header.Set("sec-fetch-mode", "cors")
|
||||||
|
req.Header.Set("sec-fetch-site", "cross-site")
|
||||||
|
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36")
|
||||||
|
req.Header.Set("x-auth", token)
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("获取最新交易对列表出错1err:", err)
|
||||||
|
return AveLastSymbolResp{}, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
bodyText, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("获取最新交易对列表出错2err:", err)
|
||||||
|
return AveLastSymbolResp{}, err
|
||||||
|
}
|
||||||
|
var res AveLastSymbolResp
|
||||||
|
sonic.Unmarshal(bodyText, &res)
|
||||||
|
return res, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendEmailNotice 发送邮箱通知
|
||||||
|
// pair 合约地址
|
||||||
|
// symbol 完整交易对
|
||||||
|
// chain 链
|
||||||
|
func (l ListenSymbol) SendEmailNotice(db *gorm.DB, pair string, symbol string, chain string) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
190
app/jobs/type.go
190
app/jobs/type.go
@ -1,6 +1,9 @@
|
|||||||
package jobs
|
package jobs
|
||||||
|
|
||||||
import "github.com/robfig/cron/v3"
|
import (
|
||||||
|
"github.com/robfig/cron/v3"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type Job interface {
|
type Job interface {
|
||||||
Run()
|
Run()
|
||||||
@ -14,3 +17,188 @@ type JobExec interface {
|
|||||||
func CallExec(e JobExec, arg interface{}) error {
|
func CallExec(e JobExec, arg interface{}) error {
|
||||||
return e.Exec(arg)
|
return e.Exec(arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RequestId struct {
|
||||||
|
Status int `json:"status"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
Data struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
Image string `json:"image"`
|
||||||
|
} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// AveLastSymbolResp 最新交易对列表
|
||||||
|
type AveLastSymbolResp struct {
|
||||||
|
Status int `json:"status"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
Data struct {
|
||||||
|
Total int `json:"total"`
|
||||||
|
PageNO int `json:"pageNO"`
|
||||||
|
PageSize int `json:"pageSize"`
|
||||||
|
Data []struct {
|
||||||
|
Pair string `json:"pair"`
|
||||||
|
Chain string `json:"chain"`
|
||||||
|
Amm string `json:"amm"`
|
||||||
|
TargetToken string `json:"target_token"`
|
||||||
|
Token0Address string `json:"token0_address"`
|
||||||
|
Token0Symbol string `json:"token0_symbol"`
|
||||||
|
Reserve0 float64 `json:"reserve0"`
|
||||||
|
Token0LogoUrl string `json:"token0_logo_url"`
|
||||||
|
Token1Address string `json:"token1_address"`
|
||||||
|
Token1Symbol string `json:"token1_symbol"`
|
||||||
|
Reserve1 float64 `json:"reserve1"`
|
||||||
|
Token1LogoUrl string `json:"token1_logo_url"`
|
||||||
|
InitReserve0 float64 `json:"init_reserve0"`
|
||||||
|
InitReserve1 float64 `json:"init_reserve1"`
|
||||||
|
Tvl float64 `json:"tvl"`
|
||||||
|
InitTvl float64 `json:"init_tvl"`
|
||||||
|
TvlRatio float64 `json:"tvl_ratio"`
|
||||||
|
CurrentPriceUsd float64 `json:"current_price_usd"`
|
||||||
|
LpHolders int `json:"lp_holders"`
|
||||||
|
LpLockedPercent int `json:"lp_locked_percent"`
|
||||||
|
LpLockedTo time.Time `json:"lp_locked_to"`
|
||||||
|
LpLockPlatform string `json:"lp_lock_platform"`
|
||||||
|
PriceChange1M float64 `json:"price_change_1m"`
|
||||||
|
PriceChange5M float64 `json:"price_change_5m"`
|
||||||
|
PriceChange15M float64 `json:"price_change_15m"`
|
||||||
|
PriceChange30M float64 `json:"price_change_30m"`
|
||||||
|
PriceChange1H float64 `json:"price_change_1h"`
|
||||||
|
PriceChange4H float64 `json:"price_change_4h"`
|
||||||
|
PriceChange24H float64 `json:"price_change_24h"`
|
||||||
|
Tx1MCount int `json:"tx_1m_count"`
|
||||||
|
Tx5MCount int `json:"tx_5m_count"`
|
||||||
|
Tx15MCount int `json:"tx_15m_count"`
|
||||||
|
Tx30MCount int `json:"tx_30m_count"`
|
||||||
|
Tx1HCount int `json:"tx_1h_count"`
|
||||||
|
Tx4HCount int `json:"tx_4h_count"`
|
||||||
|
Tx24HCount int `json:"tx_24h_count"`
|
||||||
|
BuysTx1MCount int `json:"buys_tx_1m_count"`
|
||||||
|
BuysTx5MCount int `json:"buys_tx_5m_count"`
|
||||||
|
BuysTx15MCount int `json:"buys_tx_15m_count"`
|
||||||
|
BuysTx30MCount int `json:"buys_tx_30m_count"`
|
||||||
|
BuysTx1HCount int `json:"buys_tx_1h_count"`
|
||||||
|
BuysTx4HCount int `json:"buys_tx_4h_count"`
|
||||||
|
BuysTx24HCount int `json:"buys_tx_24h_count"`
|
||||||
|
SellsTx1MCount int `json:"sells_tx_1m_count"`
|
||||||
|
SellsTx5MCount int `json:"sells_tx_5m_count"`
|
||||||
|
SellsTx15MCount int `json:"sells_tx_15m_count"`
|
||||||
|
SellsTx30MCount int `json:"sells_tx_30m_count"`
|
||||||
|
SellsTx1HCount int `json:"sells_tx_1h_count"`
|
||||||
|
SellsTx4HCount int `json:"sells_tx_4h_count"`
|
||||||
|
SellsTx24HCount int `json:"sells_tx_24h_count"`
|
||||||
|
VolumeU1M float64 `json:"volume_u_1m"`
|
||||||
|
VolumeU5M float64 `json:"volume_u_5m"`
|
||||||
|
VolumeU15M float64 `json:"volume_u_15m"`
|
||||||
|
VolumeU30M float64 `json:"volume_u_30m"`
|
||||||
|
VolumeU1H float64 `json:"volume_u_1h"`
|
||||||
|
VolumeU4H float64 `json:"volume_u_4h"`
|
||||||
|
VolumeU24H float64 `json:"volume_u_24h"`
|
||||||
|
BuyVolumeU1M float64 `json:"buy_volume_u_1m"`
|
||||||
|
BuyVolumeU5M float64 `json:"buy_volume_u_5m"`
|
||||||
|
BuyVolumeU15M float64 `json:"buy_volume_u_15m"`
|
||||||
|
BuyVolumeU30M float64 `json:"buy_volume_u_30m"`
|
||||||
|
BuyVolumeU1H float64 `json:"buy_volume_u_1h"`
|
||||||
|
BuyVolumeU4H float64 `json:"buy_volume_u_4h"`
|
||||||
|
BuyVolumeU24H float64 `json:"buy_volume_u_24h"`
|
||||||
|
SellVolumeU1M float64 `json:"sell_volume_u_1m"`
|
||||||
|
SellVolumeU5M float64 `json:"sell_volume_u_5m"`
|
||||||
|
SellVolumeU15M float64 `json:"sell_volume_u_15m"`
|
||||||
|
SellVolumeU30M float64 `json:"sell_volume_u_30m"`
|
||||||
|
SellVolumeU1H float64 `json:"sell_volume_u_1h"`
|
||||||
|
SellVolumeU4H float64 `json:"sell_volume_u_4h"`
|
||||||
|
SellVolumeU24H float64 `json:"sell_volume_u_24h"`
|
||||||
|
Makers1M int `json:"makers_1m"`
|
||||||
|
Makers5M int `json:"makers_5m"`
|
||||||
|
Makers15M int `json:"makers_15m"`
|
||||||
|
Makers30M int `json:"makers_30m"`
|
||||||
|
Makers1H int `json:"makers_1h"`
|
||||||
|
Makers4H int `json:"makers_4h"`
|
||||||
|
Makers24H int `json:"makers_24h"`
|
||||||
|
Buyers1M int `json:"buyers_1m"`
|
||||||
|
Buyers5M int `json:"buyers_5m"`
|
||||||
|
Buyers15M int `json:"buyers_15m"`
|
||||||
|
Buyers30M int `json:"buyers_30m"`
|
||||||
|
Buyers1H int `json:"buyers_1h"`
|
||||||
|
Buyers4H int `json:"buyers_4h"`
|
||||||
|
Buyers24H int `json:"buyers_24h"`
|
||||||
|
Sellers1M int `json:"sellers_1m"`
|
||||||
|
Sellers5M int `json:"sellers_5m"`
|
||||||
|
Sellers15M int `json:"sellers_15m"`
|
||||||
|
Sellers30M int `json:"sellers_30m"`
|
||||||
|
Sellers1H int `json:"sellers_1h"`
|
||||||
|
Sellers4H int `json:"sellers_4h"`
|
||||||
|
Sellers24H int `json:"sellers_24h"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
SniperTxCount int `json:"sniper_tx_count"`
|
||||||
|
RusherTxCount int `json:"rusher_tx_count"`
|
||||||
|
LastTradeAt time.Time `json:"last_trade_at"`
|
||||||
|
DynamicTag string `json:"dynamic_tag"`
|
||||||
|
Tag string `json:"tag"`
|
||||||
|
MarketCap float64 `json:"market_cap"`
|
||||||
|
MarketCapDiff int `json:"market_cap_diff"`
|
||||||
|
Holders int `json:"holders"`
|
||||||
|
HoldersDiff int `json:"holders_diff"`
|
||||||
|
RiskScore int `json:"risk_score"`
|
||||||
|
RiskLevel int `json:"risk_level"`
|
||||||
|
Appendix string `json:"appendix"`
|
||||||
|
SmartMoneyBuyCount24H int `json:"smart_money_buy_count_24h"`
|
||||||
|
SmartMoneySellCount24H int `json:"smart_money_sell_count_24h"`
|
||||||
|
SmartMoneyBuyVolume24H float64 `json:"smart_money_buy_volume_24h"`
|
||||||
|
SmartMoneySellVolume24H float64 `json:"smart_money_sell_volume_24h"`
|
||||||
|
SmartMoneyBuyCount4H int `json:"smart_money_buy_count_4h"`
|
||||||
|
SmartMoneySellCount4H int `json:"smart_money_sell_count_4h"`
|
||||||
|
SmartMoneyBuyVolume4H float64 `json:"smart_money_buy_volume_4h"`
|
||||||
|
SmartMoneySellVolume4H float64 `json:"smart_money_sell_volume_4h"`
|
||||||
|
SmartMoneyBuyCount1H int `json:"smart_money_buy_count_1h"`
|
||||||
|
SmartMoneySellCount1H int `json:"smart_money_sell_count_1h"`
|
||||||
|
SmartMoneyBuyVolume1H float64 `json:"smart_money_buy_volume_1h"`
|
||||||
|
SmartMoneySellVolume1H float64 `json:"smart_money_sell_volume_1h"`
|
||||||
|
SmartMoneyBuyCount15M int `json:"smart_money_buy_count_15m"`
|
||||||
|
SmartMoneySellCount15M int `json:"smart_money_sell_count_15m"`
|
||||||
|
SmartMoneyBuyVolume15M float64 `json:"smart_money_buy_volume_15m"`
|
||||||
|
SmartMoneySellVolume15M float64 `json:"smart_money_sell_volume_15m"`
|
||||||
|
SmartMoneyBuyCount5M int `json:"smart_money_buy_count_5m"`
|
||||||
|
SmartMoneySellCount5M int `json:"smart_money_sell_count_5m"`
|
||||||
|
SmartMoneyBuyVolume5M float64 `json:"smart_money_buy_volume_5m"`
|
||||||
|
SmartMoneySellVolume5M float64 `json:"smart_money_sell_volume_5m"`
|
||||||
|
HoldersTop10Ratio float64 `json:"holders_top10_ratio"`
|
||||||
|
DevBalanceRatioCur float64 `json:"dev_balance_ratio_cur"`
|
||||||
|
InsiderBalanceRatioCur float64 `json:"insider_balance_ratio_cur"`
|
||||||
|
SniperBalanceRatioCur int `json:"sniper_balance_ratio_cur"`
|
||||||
|
CtoFlag int `json:"cto_flag"`
|
||||||
|
ReplyCount int `json:"reply_count"`
|
||||||
|
Progress int `json:"progress"`
|
||||||
|
FirstHalfElapsedTime int `json:"first_half_elapsed_time"`
|
||||||
|
SecondHalfElapsedTime int `json:"second_half_elapsed_time"`
|
||||||
|
WinnerCount int `json:"winner_count"`
|
||||||
|
WinnerRatio int `json:"winner_ratio"`
|
||||||
|
UpCount7D int `json:"up_count_7d"`
|
||||||
|
UpCount14D int `json:"up_count_14d"`
|
||||||
|
UpSeq string `json:"up_seq"`
|
||||||
|
BigorderCnt1H int `json:"bigorder_cnt_1h"`
|
||||||
|
BigorderBuyCnt1H int `json:"bigorder_buy_cnt_1h"`
|
||||||
|
BigorderSellCnt1H int `json:"bigorder_sell_cnt_1h"`
|
||||||
|
HasBrokenIssuePrice bool `json:"has_broken_issue_price"`
|
||||||
|
ListingAt int `json:"listing_at"`
|
||||||
|
Holders1440 int `json:"holders_1440"`
|
||||||
|
BuyCount24H int `json:"buy_count_24h"`
|
||||||
|
HotRank int `json:"hot_rank"`
|
||||||
|
FrontShowIndex int `json:"front_show_index"`
|
||||||
|
PiPriceChange1M float64 `json:"pi_price_change_1m"`
|
||||||
|
PiPriceChange5M float64 `json:"pi_price_change_5m"`
|
||||||
|
PiPriceChange15M float64 `json:"pi_price_change_15m"`
|
||||||
|
PiPriceChange30M float64 `json:"pi_price_change_30m"`
|
||||||
|
PiPriceChange1H float64 `json:"pi_price_change_1h"`
|
||||||
|
PiPriceChange4H float64 `json:"pi_price_change_4h"`
|
||||||
|
PiPriceChange24H float64 `json:"pi_price_change_24h"`
|
||||||
|
RatRate float64 `json:"rat_rate"`
|
||||||
|
PhishingRate float64 `json:"phishing_rate"`
|
||||||
|
ClusterRate float64 `json:"cluster_rate"`
|
||||||
|
BoulderRate float64 `json:"boulder_rate"`
|
||||||
|
AllTagRate float64 `json:"all_tag_rate"`
|
||||||
|
Rugged int `json:"rugged"`
|
||||||
|
Total int `json:"total"`
|
||||||
|
RugRate float64 `json:"rug_rate"`
|
||||||
|
} `json:"data"`
|
||||||
|
} `json:"data"`
|
||||||
|
}
|
||||||
|
|||||||
@ -52,4 +52,7 @@ const (
|
|||||||
//需要清理键值---------END-----------------
|
//需要清理键值---------END-----------------
|
||||||
|
|
||||||
JobReOrderTrigger = "job_re_order_trigger" //定时取消限价并下市价锁
|
JobReOrderTrigger = "job_re_order_trigger" //定时取消限价并下市价锁
|
||||||
|
|
||||||
|
ListenAveLastSymbol = "listen_ave_last_symbol" // 监听最新交易对
|
||||||
|
AveRequestToken = "ave_request_token" // AVE请求token
|
||||||
)
|
)
|
||||||
|
|||||||
418
config/ave.js
Normal file
418
config/ave.js
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user