125 lines
2.5 KiB
Go
125 lines
2.5 KiB
Go
|
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
|
||
|
}
|