NOTICE:
PACKAGE IS CURRENTLY UNDER HEAVY DEVELOPMENT AND THERE IS NO GUARANTY FOR STABILITY UNTIL V1 RELEASE.
Okex V5 Golang API
A complete golang wrapper for Okex V5 API. Pretty simple and easy to use. For more info about Okex V5 API read here.
go get github.com/amir-the-h/[email protected]
package main
import (
"context"
"github.com/amir-the-h/okex"
"github.com/amir-the-h/okex/api"
"github.com/amir-the-h/okex/events"
"github.com/amir-the-h/okex/events/private"
ws_private_requests "github.com/amir-the-h/okex/requests/ws/private"
ws_public_requests "github.com/amir-the-h/okex/requests/ws/public"
"log"
)
func main() {
apiKey := "YOUR-API-KEY"
secretKey := "YOUR-SECRET-KEY"
passphrase := "YOUR-PASS-PHRASE"
dest := okex.NormalServer // The main API server
ctx := context.Background()
client, err := api.NewClient(ctx, apiKey, secretKey, passphrase, &dest)
if err != nil {
log.Fatalln(err)
}
response, err := client.Rest.Account.GetConfig()
if err != nil {
log.Fatalln(err)
}
log.Printf("Account Config %+v", response)
errChan := make(chan *events.Error)
subChan := make(chan *events.Subscribe)
uSubChan := make(chan *events.Unsubscribe)
lCh := make(chan *events.Login)
oCh := make(chan *private.Order)
iCh := make(chan *public.Instruments)
// to receive unique events individually in separated channels
client.Ws.SetChannels(errChan, subChan, uSubChan, lCh)
// subscribe into orders private channel
// it will do the login process and wait until authorization confirmed
err = client.Ws.Private.Order(ws_private_requests.Order{
InstType: okex.SwapInstrument,
}, oCh)
if err != nil {
log.Fatalln(err)
}
// subscribe into instruments public channel
// it doesn't need any authorization
err = client.Ws.Public.Instruments(ws_public_requests.Instruments{
InstType: okex.SwapInstrument,
}, iCh)
if err != nil {
log.Fatalln("Instruments", err)
}
// starting on listening
for {
select {
case <-lCh:
log.Print("[Authorized]")
case sub := <-subChan:
channel, _ := sub.Arg.Get("channel")
log.Printf("[Subscribed]\t%s", channel)
case uSub := <-uSubChan:
channel, _ := uSub.Arg.Get("channel")
log.Printf("[Unsubscribed]\t%s", channel)
case err := <-client.Ws.ErrChan:
log.Printf("[Error]\t%+v", err)
case o := <-oCh:
log.Print("[Event]\tOrder")
for _, p := range o.Orders {
log.Printf("\t%+v", p)
}
case i := <-iCh:
log.Print("[Event]\tInstrument")
for _, p := range i.Instruments {
log.Printf("\t%+v", p)
}
case e := <-client.Ws.StructuredEventChan:
log.Printf("[Event] STRUCTED:\t%+v", e)
v := reflect.TypeOf(e)
switch v {
case reflect.TypeOf(events.Error{}):
log.Printf("[Error] STRUCTED:\t%+v", e)
case reflect.TypeOf(events.Subscribe{}):
log.Printf("[Subscribed] STRUCTED:\t%+v", e)
case reflect.TypeOf(events.Unsubscribe{}):
log.Printf("[Unsubscribed] STRUCTED:\t%+v", e)
}
case e := <-client.Ws.RawEventChan:
log.Printf("[Event] RAW:\t%+v", e)
case b := <-client.Ws.DoneChan:
log.Printf("[End]:\t%v", b)
return
}
}
}
- Rest
- Trade (except demo special trading endpoints)
- Funding
- Account
- SubAccount
- Market Data
- Public Data
- Trading Data
- Ws
- Private Channel (except demo special trading endpoints)
- Public Channel
- Trade
- All requests, responses, and events are well typed and will convert into the language built-in types instead of using API's strings. Note that zero values will be replaced with non-existing data.
- Fully automated authorization steps for both REST and WS
- To receive websocket events you can choose RawEventChan , StructuredEventChan, or provide your own channels. More info