Go

Client Classes

Auth, Data, Trading, Stream — khởi tạo và sử dụng

SDK cung cấp 4 client chuyên biệt. Go sử dụng goroutines cho concurrency — không cần biến thể async riêng.

Auth

Client gốc — quản lý REST client, xác thực, và token. Tất cả client khác nhận *Auth làm tham số.

import "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/ssi"

config := ssi.NewConfig("YOUR_CLIENT_ID")
config.APIKey     = "YOUR_API_KEY"
config.APISecret  = "YOUR_API_SECRET"
config.PrivateKey = "YOUR_PRIVATE_KEY"

auth := ssi.NewAuth(config)
defer auth.Close()

token, err := auth.Authenticate("222222")
if err != nil {
    log.Fatal(err)
}
log.Printf("Access token: %s", token.AccessToken)

Các method xác thực

// Yêu cầu gửi OTP
result, err := auth.RequestOTP()

// Xác thực với OTP
token, err := auth.Authenticate("222222")

// Xác thực không cần OTP (chỉ dữ liệu thị trường)
token, err := auth.Authenticate("")

// Làm mới token
token, err := auth.Refresh()

Trạng thái token

auth.TokenManager.IsTokenExpired()  // true/false
auth.AccessToken()                  // chuỗi access token

Data

Client dữ liệu thị trường. Không cần OTP — chỉ cần auth.Authenticate("").

import "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/ssi"

auth := ssi.NewAuth(config)
defer auth.Close()

if _, err := auth.Authenticate(""); err != nil {
    log.Fatal(err)
}

data := ssi.NewData(auth)

ohlc, err := data.MarketData.GetOHLC1Minute("SSI")
indexes, err := data.MarketData.GetIndexes()
info, err := data.MarketData.GetSecuritiesInfo("SSI")

Service: data.MarketData (MarketDataService) — OHLC, chỉ số, chứng khoán.

Trading

Client giao dịch, tài khoản, và danh mục. Cần OTP.

import (
    "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/ssi"
    "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/trading"
)

auth := ssi.NewAuth(config)
defer auth.Close()

if _, err := auth.Authenticate("222222"); err != nil {
    log.Fatal(err)
}

t := ssi.NewTrading(auth)

// Tài khoản
accounts, err := t.Account.GetAccountInfo()

// Danh mục
balance, err := t.Portfolio.GetEquityBalance("1234561")
positions, err := t.Portfolio.GetEquityPositions("1234561")
orders, err := t.Portfolio.GetTodayOrders("1234561")

// Giao dịch
result, err := t.Trading.PlaceLimitOrder(
    "1234561", "SSI", trading.OrderSideBuy, 100, 66000,
)

Services:

  • t.Account (AccountService) — thông tin tài khoản.
  • t.Portfolio (PortfolioService) — số dư, vị thế, sổ lệnh, PPMMR.
  • t.Trading (TradingService) — đặt/sửa/huỷ lệnh, sức mua/bán.

Stream

Client streaming realtime qua WebSocket. Cần OTP.

import (
    "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/ssi"
    "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/stream"
)

auth := ssi.NewAuth(config)
defer auth.Close()

if _, err := auth.Authenticate("222222"); err != nil {
    log.Fatal(err)
}

s := ssi.NewStream(auth)
defer s.Disconnect()

// Đăng ký callback
s.Streaming.SetOnData(func(msg interface{}) {
    switch m := msg.(type) {
    case *stream.TradeMessage:
        fmt.Printf("[TRADE] %s | %.0f | %d\n", m.Symbol, m.Price, m.Quantity)
    case *stream.QuoteMessage:
        fmt.Printf("[QUOTE] %s\n", m.Symbol)
    }
})

s.Streaming.SetOnTrading(func(msg interface{}) {
    switch m := msg.(type) {
    case *stream.OrderStatusMessage:
        fmt.Printf("[ORDER] %s %s | %s\n", m.Symbol, m.Side, m.Status)
    case *stream.PortfolioMessage:
        fmt.Printf("[PORTFOLIO] %s\n", m.AccountNo)
    }
})

// Kết nối và subscribe
if err := s.Connect(); err != nil {
    log.Fatal(err)
}

s.Streaming.SubscribeSymbol([]string{"SSI", "HPG"}, nil)
s.Streaming.SubscribeOrderStatus("", nil)

s.Wait(nil)

Service: s.Streaming (StreamingService) — subscribe/unsubscribe dữ liệu realtime.

Callbacks:

MethodCallback SignatureMô tả
SetOnDatafunc(interface{})Nhận dữ liệu thị trường (dùng type switch để xử lý)
SetOnTradingfunc(interface{})Nhận sự kiện giao dịch (trạng thái lệnh, danh mục)
SetOnHeartbeatfunc(*stream.HeartbeatMessage)Nhận heartbeat

Ví dụ đầy đủ

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/ssi"
    "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/stream"
)

func main() {
    config := ssi.NewConfig("YOUR_CLIENT_ID")
    config.APIKey     = "YOUR_API_KEY"
    config.APISecret  = "YOUR_API_SECRET"
    config.PrivateKey = "YOUR_PRIVATE_KEY"

    auth := ssi.NewAuth(config)
    defer auth.Close()

    if _, err := auth.Authenticate("222222"); err != nil {
        log.Fatal(err)
    }

    // Dữ liệu thị trường
    data := ssi.NewData(auth)
    ohlc, err := data.MarketData.GetOHLC1Minute("SSI")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(ohlc)

    // Giao dịch
    t := ssi.NewTrading(auth)
    accounts, err := t.Account.GetAccountInfo()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(accounts)

    // Streaming
    s := ssi.NewStream(auth)
    defer s.Disconnect()

    s.Streaming.SetOnData(func(msg interface{}) {
        switch m := msg.(type) {
        case *stream.TradeMessage:
            fmt.Printf("[TRADE] %s | %.0f | %d\n", m.Symbol, m.Price, m.Quantity)
        }
    })

    s.Streaming.SetOnTrading(func(msg interface{}) {
        fmt.Printf("[TRADING] %v\n", msg)
    })

    if err := s.Connect(); err != nil {
        log.Fatal(err)
    }

    s.Streaming.SubscribeSymbol([]string{"SSI", "HPG"}, nil)
    s.Streaming.SubscribeOrderStatus("", nil)

    timeout := 30 * time.Second
    s.Wait(&timeout)
}

Ghi chú

  • Go SDK không có biến thể async riêng — dùng goroutines cho concurrency.
  • Tất cả client dùng chung HTTP connection qua Auth.
  • Luôn dùng defer auth.Close()defer s.Disconnect() để dọn dẹp.
  • Lỗi thường gặp: *fc.AuthenticationError (xác thực), *fc.WebSocketError (stream), *fc.APIError (lỗi HTTP).

Trên trang này