package market import ( "encoding/json" "log" "sync" "git.apinb.com/bsm-sdk/core/utils" ) var ( AllowSymbolsEndpoint string = "http://market.senlin.ai/symbols/allow" SymbolsSettingEndpoint string = "http://market.senlin.ai/symbols/get/" AllowSymbols *symbols ) type PairSetting struct { Symbol string `json:"symbol"` PricePrecision int `json:"pricePrecision"` // 价格小数点位数 QuantityPrecision int `json:"quantityPrecision"` // 数量小数点位数 MinNotional float64 `json:"minNotional"` // 最小名义价值 MinTradeNum float64 `json:"minTradeNum"` // 最小开单数量(基础币) BaseAssetPrecision int `json:"baseAssetPrecision"` // 标的资产精度 Commit string `json:"commit"` // 备注 Level int `json:"level"` // 仓位等级 MinClosePrecision float64 `json:"minClosePrecision"` // 平仓利润率百分比 TickSize float64 `json:"tickSize"` // 最小价格变动单位 //LowestPrice float64 `json:"lowestPrice"` // 最低价,低位不做空 //HightPrice float64 `json:"hightPrice"` // 最高价,高位不做多 //MaxMarginSize float64 `json:"maxMarginSize"` // 最大仓位 } type symbols struct { sync.RWMutex Data map[string]*PairSetting } func NewAllowAllSymbols() { AllowSymbols = &symbols{ Data: make(map[string]*PairSetting), } } func (m *symbols) Set(symbol string, setting *PairSetting) { m.Lock() defer m.Unlock() m.Data[symbol] = setting } func (m *symbols) Get(symbol string) *PairSetting { m.RLock() defer m.RUnlock() return m.Data[symbol] } func (m *symbols) Del(symbol string) { m.Lock() defer m.Unlock() delete(m.Data, symbol) } func (m *symbols) SetData(Data map[string]*PairSetting) { m.RLock() defer m.RUnlock() m.Data = Data } func (m *symbols) All() map[string]*PairSetting { m.RLock() defer m.RUnlock() return m.Data } // 读取行情接口,返回行情接口的最小止盈百分比 func FetchMarketSymbolsSetting(leverage int) ([]string, map[string]*PairSetting, error) { var data map[string]*PairSetting body, err := utils.HttpGet(AllowSymbolsEndpoint) if err != nil { return nil, nil, err } log.Println("AllowSymbolsSetting", string(body)) err = json.Unmarshal(body, &data) if err != nil { return nil, nil, err } var symboles []string for k, val := range data { data[k].MinClosePrecision = val.MinClosePrecision * float64(leverage) // 根据杠杆调整最小平仓利润率 symboles = append(symboles, k) } return symboles, data, nil } // 读取行情接口,不处理最小止盈百分比 func FetchMarketSymbolsSetting_V2(leverage int) (map[string]*PairSetting, error) { var data map[string]*PairSetting body, err := utils.HttpGet(AllowSymbolsEndpoint) if err != nil { return nil, err } log.Println("AllowSymbolsSetting", string(body)) err = json.Unmarshal(body, &data) if err != nil { return nil, err } return data, nil } func InitAllowSymbolsSetting(posSymbols []string) (map[string]*PairSetting, error) { data := make(map[string]*PairSetting) for _, symbol := range posSymbols { if _, ok := data[symbol]; !ok { var pairSetting PairSetting body, err := utils.HttpGet(SymbolsSettingEndpoint + symbol) if err != nil { return nil, err } err = json.Unmarshal(body, &pairSetting) if err != nil { return nil, err } data[symbol] = &pairSetting } } AllowSymbols.SetData(data) log.Println("GetAllowSymbolsSetting Lenght:", len(data)) return data, nil } func RefreshAllowSymbolsSetting(posSymbols []string) error { var data map[string]*PairSetting body, err := utils.HttpGet(AllowSymbolsEndpoint) if err != nil { return err } log.Println("AllowSymbolsSetting", string(body)) err = json.Unmarshal(body, &data) if err != nil { return err } for _, symbol := range posSymbols { if _, ok := data[symbol]; !ok { var pairSetting PairSetting body, err := utils.HttpGet(SymbolsSettingEndpoint + symbol) if err != nil { return err } err = json.Unmarshal(body, &pairSetting) if err != nil { return err } data[symbol] = &pairSetting } } AllowSymbols.SetData(data) log.Println("RefreshAllowSymbolsSetting Lenght:", len(data)) return nil }