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 tokenData
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:
| Method | Callback Signature | Mô tả |
|---|---|---|
SetOnData | func(interface{}) | Nhận dữ liệu thị trường (dùng type switch để xử lý) |
SetOnTrading | func(interface{}) | Nhận sự kiện giao dịch (trạng thái lệnh, danh mục) |
SetOnHeartbeat | func(*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()và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).