initial
This commit is contained in:
73
market/kline.go
Normal file
73
market/kline.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package market
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"strconv"
|
||||
|
||||
"git.apinb.com/bsm-sdk/core/utils"
|
||||
"git.apinb.com/quant/strategy/types"
|
||||
)
|
||||
|
||||
var (
|
||||
KlineUrl = "http://market.senlin.ai/ticker/klines"
|
||||
)
|
||||
|
||||
func FetchKlines(symbol, interval string, limit int) ([]*types.KLine, []float64, error) {
|
||||
url := KlineUrl + "?symbol=" + symbol + "&interval=" + interval + "&limit=" + strconv.Itoa(limit)
|
||||
body, err := utils.HttpGet(url)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
var data []*types.KLine
|
||||
err = json.Unmarshal(body, &data)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if len(data) < 1 {
|
||||
return nil, nil, errors.New("no data")
|
||||
}
|
||||
|
||||
var closes []float64
|
||||
for _, kline := range data {
|
||||
closes = append(closes, kline.Close)
|
||||
}
|
||||
|
||||
return data, closes, nil
|
||||
}
|
||||
|
||||
// 获取最后两个K线
|
||||
// 返回:上一个K线, 当前K线, 错误
|
||||
func GetLastKline(symbol, interval string) (*types.KLine, *types.KLine, error) {
|
||||
url := KlineUrl + "?symbol=" + symbol + "&interval=" + interval + "&limit=2"
|
||||
body, err := utils.HttpGet(url)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
var data []*types.KLine
|
||||
err = json.Unmarshal(body, &data)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
if len(data) < 2 {
|
||||
return nil, nil, errors.New("no data")
|
||||
}
|
||||
|
||||
data[1].PriceRate = (data[1].Close - data[1].Open) / data[1].Open
|
||||
data[0].PriceRate = (data[0].Close - data[0].Open) / data[0].Open
|
||||
|
||||
return data[0], data[1], nil
|
||||
}
|
||||
|
||||
func UnmarshalKline(body string) (*types.KLine, error) {
|
||||
var data types.KLine
|
||||
err := json.Unmarshal([]byte(body), &data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &data, nil
|
||||
}
|
||||
166
market/setting.go
Normal file
166
market/setting.go
Normal file
@@ -0,0 +1,166 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user