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 }