สร้าง Crypto Trading Bot ด้วยภาษา Go — EP2 การใช้ bitkub api
By: Nuttanon Sira
Tags: Bitcoin, Bots

สวัสดีครับ ขอโทษด้วยครับที่ห่างหายไปนาน มีบอทเเล้วขี้เกียจไปหน่อย555 ตอนนี้ราคา btc เกิดจุดสูงสุดเก่าไปเเล้ว เลยอยากจะมาฉลองกันหน่อยครับ เดี๋ยววันนี้เราจะเเจก code บางส่วนเลย

ใครยังไม่ได้ดู EP1 ดูได้ตามลิ้งนี้เลยครับ

https://medium.com/kbtg-life/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-crypto-trading-bot-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2-go-part-1-%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%A7%E0%B8%B2%E0%B8%87-architect-4b4cf02fcaa

คิดว่าสิ่งที่สำคัญที่สุดในการซื้อขายก็คือการส่ง order ให้ exchange ดังนั้น เราจะมาดูกันนะครับว่าเขียนcodeเยังไง เราจะเน้นไปที่คำสั่งซื้อขายกันวันนี้ มาดู code กันเลย

package main import (

"bytes"

"crypto/hmac"

"crypto/sha256"

"encoding/hex"

"encoding/json"

"fmt"

"io/ioutil"

"net/http"

"time"

) func main() { // place buy order

OrderBitkub(2000, 200)

} type orderBody struct {

Symbol string `json:"sym,omitempty"`

Amount float64 `json:"amt,omitempty"` // for buy is amount of THB spend, for sell is amount of btc

Rate float64 `json:"rat,omitempty"`

Type string `json:"typ,omitempty"`

Ts int64 `json:"ts,omitempty"`

Signature string `json:"sig,omitempty"`

} type response struct {

Error int `json:"error"`

Result orderResponse `json:"result"`

} type orderResponse struct {

Id int `json:"id,omitempty"`

Hash string `json:"hash,omitempty"`

Amount float64 `json:"amt,omitempty"`

Rate float64 `json:"rat,omitempty"`

Type string `json:"typ,omitempty"`

Fee float64 `json:"fee,omitempty"`

Cred float64 `json:"cre,omitempty"`

Receive float64 `json:"rec,omitempty"`

Ts int64 `json:"ts,omitempty"`

} func OrderBitkub(price float64, amount float64) { var resp response

var uri string t := time.Now().Unix()

body := orderBody{

Symbol: "THB_BTC", //ชื่อของproductที่เราจะtrade

Amount: amount, //จำนวนที่เราต้องการ

Rate: price, //ราคาของทรัพย์สิน

Type: "limit", //ประเภทของorder

Ts: t,

}

body.Amount = price * amount //bitkub ต้องการ spending amount หรือ thb ที่เราจะซื้อ uri = " https://api.bitkub.com/api/market/place-bid body.Amount = price * amount //bitkub ต้องการ spending amount หรือ thb ที่เราจะซื้อ //create request body

byteBody, err := json.Marshal(body)

if err != nil {

fmt.Println("marshal error:", err)

return

} // create signature and add it to request

sig := signRequest(byteBody)

body.Signature = sig

signedByteBody, err := json.Marshal(body)

if err != nil {

fmt.Println("Marshal signed order error:", err)

}

// send http post request

err = sendHttpRequestWithBody("POST", uri, signedByteBody, &resp)

if err != nil {

fmt.Println("send request error:", err)

} // check if we have any error if 0 mean no error

// you can check error meaning via bitkub api doc

if resp.Error != 0 {

fmt.Println("error with error code:", resp.Error)

return

}

fmt.Println(resp.Result)

} func signRequest(body []byte) string {

signature := string(body)

h := hmac.New(sha256.New, []byte("your_secret"))

h.Write([]byte(signature))

hmacSigned := h.Sum(nil)

hmacSignedStr := hex.EncodeToString(hmacSigned)

return hmacSignedStr

}

func sendHttpRequestWithBody(method string, uri string, body []byte, result interface{}) error { client := &http.Client{} req, err := http.NewRequest(method, uri, bytes.NewBuffer(body))

if err != nil {

return err

}

req.Header.Set("X-BTK-APIKEY", "your_api_key")

req.Header.Set("Content-Type", "application/json")

req.Header.Set("Accept", "application/json") resp, err := client.Do(req)

if err != nil {

return err

} defer resp.Body.Close()

bytes, err := ioutil.ReadAll(resp.Body)

if err != nil {

return err

} return json.Unmarshal(bytes, result)

}

ตัว code ข้างบนจะเป็นตัวอย่างการยิง order เพื่อสั่งซื้อ ผ่าน api ของ bitkub

โดยการสั่งซื้อนั้นเป็น api เส้นสำคัญ เราจึงต้อง signed request ของเรา ซึ่งเราต้องเอา api_secret ของเรา มา signed เเบบ HMAC SHA-256 ซึ่งข้างบนมี function signRequest ทำส่วนนี้ให้

นอกจากนี้ order เราต้องเเปะ timestmap เพื่อยืนยันว่า order ไม่เก่าเกินไปหรือเป็น order จากอนาคต ถ้า timeStamp เราผิด bitkub จะ reject ครับ

ตัวอย่างข้างบนเป็น api เส้นที่ยิงซื้อขายจริงๆ เพราะฉะนั้นเพื่อความปลอดภัยกับเงินในกระเป๋า bitkub สร้างเส้น test ไว้ให้เรา ให้เราเติม “/test” ไปที่ท้าย uri ข้างบน เพื่อเทส

ถ้าหากมีข้อสงสัยเพิ่มเติมสามารถ comment ถามไว้ได้ หรือศึกษาเพิ่มเติมได้จาก bitkub api document ตามลิ้งนี้เลยครับ

วันนี้ขอไปเชียร์ han-ji ต่อก่อน

happy trading ครับ

ขอบคุณครับ