exchange/okex/tool.go

125 lines
2.5 KiB
Go
Raw Normal View History

2024-06-25 16:59:56 +00:00
package okex
import (
"encoding/json"
"errors"
"fmt"
"git.qtrade.icu/coin-quant/exchange/okex/api/market"
. "git.qtrade.icu/coin-quant/trademodel"
"strconv"
"time"
)
func transCandle(values [9]string) (ret *Candle) {
nTs, err := strconv.ParseInt(values[0], 10, 64)
if err != nil {
panic(fmt.Sprintf("trans candle error: %#v", values))
return nil
}
ret = &Candle{
ID: 0,
Start: nTs / 1000,
Open: parseFloat(values[1]),
High: parseFloat(values[2]),
Low: parseFloat(values[3]),
Close: parseFloat(values[4]),
Volume: parseFloat(values[5]),
Turnover: parseFloat(values[7]),
}
return
}
func parseFloat(str string) float64 {
if str == "" {
return 0
}
f, err := strconv.ParseFloat(str, 64)
if err != nil {
panic("okex parseFloat error:" + err.Error())
}
return f
}
func parseCandles(resp *market.GetApiV5MarketHistoryCandlesResponse) (candles []*Candle, err error) {
var candleResp CandleResp
err = json.Unmarshal(resp.Body, &candleResp)
if err != nil {
return
}
if candleResp.Code != "0" {
err = errors.New(string(resp.Body))
return
}
for _, v := range candleResp.Data {
// unfinished candle
if v[8] == "0" {
continue
}
temp := transCandle(v)
candles = append(candles, temp)
}
return
}
func parsePostOrders(symbol, status, side string, amount, price float64, body []byte) (ret []*Order, err error) {
temp := OKEXOrder{}
err = json.Unmarshal(body, &temp)
if err != nil {
return
}
if temp.Code != "0" {
err = fmt.Errorf("error resp: %s", string(body))
return
}
for _, v := range temp.Data {
if v.SCode != "0" {
err = fmt.Errorf("%s %s", v.SCode, v.SMsg)
return
}
temp := &Order{
OrderID: v.OrdID,
Symbol: symbol,
// Currency
Side: side,
Status: status,
Price: price,
Amount: amount,
Time: time.Now(),
}
ret = append(ret, temp)
}
return
}
func parsePostAlgoOrders(symbol, status, side string, amount, price float64, body []byte) (ret []*Order, err error) {
temp := OKEXAlgoOrder{}
err = json.Unmarshal(body, &temp)
if err != nil {
return
}
if temp.Code != "0" {
err = fmt.Errorf("error resp: %s", string(body))
return
}
for _, v := range temp.Data {
if v.SCode != "0" {
err = fmt.Errorf("%s %s", v.SCode, v.SMsg)
return
}
temp := &Order{
OrderID: v.AlgoID,
Symbol: symbol,
// Currency
Side: side,
Status: status,
Price: price,
Amount: amount,
Time: time.Now(),
}
ret = append(ret, temp)
}
return
}