Go
API Services
Chi tiết các method API cho mỗi service trong Go SDK
1. Xác thực (TokenManager)
Truy cập qua auth.TokenManager hoặc trực tiếp trên auth (được uỷ quyền).
Xác thực với OTP
token, err := auth.Authenticate("222222")
if err != nil {
log.Fatal(err)
}
log.Printf("Access token: %s", token.AccessToken)Yêu cầu gửi OTP
result, err := auth.RequestOTP()Làm mới token
token, err := auth.Refresh()Kiểm tra trạng thái token
if auth.TokenManager.IsTokenExpired() {
auth.Refresh()
}
accessToken := auth.AccessToken()2. Tài khoản (AccountService)
Truy cập qua t.Account.
Lấy danh sách tài khoản
accounts, err := t.Account.GetAccountInfo()
for _, acc := range accounts {
fmt.Printf("%s (%s)\n", acc.AccountNo, acc.AccountType)
}Trả về: []Account — mỗi Account có AccountNo string, AccountType string.
3. Dữ liệu thị trường (MarketDataService)
Truy cập qua data.MarketData. Không cần OTP.
3.1. Dữ liệu OHLC (nến)
Trong ngày:
| Method | Khung thời gian |
|---|---|
GetOHLC1Minute(symbol) | 1 phút |
GetOHLC3Minute(symbol) | 3 phút |
GetOHLC5Minute(symbol) | 5 phút |
GetOHLC15Minute(symbol) | 15 phút |
GetOHLC1Hour(symbol) | 1 giờ |
ohlc, err := data.MarketData.GetOHLC1Minute("SSI")
if err != nil {
log.Fatal(err)
}
for _, candle := range ohlc {
fmt.Printf("%s: O=%.0f H=%.0f L=%.0f C=%.0f V=%d\n",
candle.TradingDate, candle.OpenPrice, candle.HighPrice,
candle.LowPrice, candle.ClosePrice, candle.Volume)
}Lịch sử (với khoảng ngày + phân trang):
| Method | Khung thời gian |
|---|---|
GetOHLC1MinuteHistorical(symbol, fromDate, toDate, page, size) | 1 phút |
GetOHLC3MinuteHistorical(...) | 3 phút |
GetOHLC5MinuteHistorical(...) | 5 phút |
GetOHLC15MinuteHistorical(...) | 15 phút |
GetOHLC1HourHistorical(...) | 1 giờ |
GetOHLC1DayHistorical(...) | 1 ngày |
GetOHLC1WeekHistorical(...) | 1 tuần |
GetOHLC1MonthHistorical(...) | 1 tháng |
ohlc, err := data.MarketData.GetOHLC1DayHistorical(
"SSI", "2026/03/27", "2026/04/22", 1, 100,
)Tham số lịch sử:
| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
symbol | string | (bắt buộc) | Mã chứng khoán |
fromDate | string | (bắt buộc) | Ngày bắt đầu (yyyy/MM/dd) |
toDate | string | (bắt buộc) | Ngày kết thúc (yyyy/MM/dd) |
page | int | 1 | Số trang |
size | int | 1000 | Số bản ghi mỗi trang |
Trả về: []OHLCData
3.2. Chỉ số thị trường
// Tất cả chỉ số
indexes, err := data.MarketData.GetIndexes()
// Theo sàn
import "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/market"
indexes, err := data.MarketData.GetIndexesByBoard(market.BoardHOSE)
for _, idx := range indexes {
fmt.Printf("%s - %s\n", idx.Index, idx.IndexName)
}Trả về: []MarketIndexes
3.3. Tổng hợp chỉ số (Index Summary)
// Tổng hợp hiện tại
summary, err := data.MarketData.GetIndexSummary("VNINDEX")
// Tổng hợp lịch sử
summary, err := data.MarketData.GetIndexSummaryHistorical("VNINDEX", "2026/01/15")
// Tổng hợp theo sàn
summary, err := data.MarketData.GetBoardSummary(market.BoardHOSE)
// Tổng hợp theo sàn lịch sử
summary, err := data.MarketData.GetBoardSummaryHistorical(market.BoardHOSE, "2026/01/15")Trả về: MarketIndexSummary
3.4. Thông tin chứng khoán
// Một mã
info, err := data.MarketData.GetSecuritiesInfo("SSI")
// Theo chỉ số
securities, err := data.MarketData.GetSecuritiesInfoByIndex("VN30")
// Theo sàn
securities, err := data.MarketData.GetSecuritiesInfoByBoard(market.BoardHOSE)Trả về: SecuritiesInfo
3.5. Tổng hợp chứng khoán (Securities Summary)
// Tổng hợp hiện tại
summary, err := data.MarketData.GetSecuritiesSummary("SSI")
// Tổng hợp lịch sử
summary, err := data.MarketData.GetSecuritiesSummaryHistorical(
"SSI", "2026/03/01", "2026/03/31",
)
// Theo chỉ số
summary, err := data.MarketData.GetSecuritiesSummaryByIndex("VN30")
// Theo chỉ số lịch sử
summary, err := data.MarketData.GetSecuritiesSummaryByIndexHistorical(
"VN30", "2026/03/01", "2026/03/31",
)Trả về: []SecuritiesSummary
4. Danh mục (PortfolioService)
Truy cập qua t.Portfolio.
4.1. Số dư tài khoản
// Số dư cổ phiếu
balance, err := t.Portfolio.GetEquityBalance("1234561")
// Số dư phái sinh
derBalance, err := t.Portfolio.GetDerivativeBalance("1234568")4.2. Vị thế
// Vị thế cổ phiếu
positions, err := t.Portfolio.GetEquityPositions("1234561")
for _, pos := range positions {
fmt.Printf("%s: %d cổ | Giá vốn: %.0f\n", pos.Symbol, pos.Quantity, pos.CostPrice)
}
// Tất cả vị thế phái sinh
derPositions, err := t.Portfolio.GetDerivativePositions("1234568")
// Chỉ vị thế đang mở
openPos, err := t.Portfolio.GetOpenDerivativePositions("1234568")
// Chỉ vị thế đã đóng
closedPos, err := t.Portfolio.GetClosedDerivativePositions("1234568")4.3. Sổ lệnh
// Lệnh trong ngày
orders, err := t.Portfolio.GetTodayOrders("1234561")
for _, order := range orders {
fmt.Printf("%s: %s %s %d@%.0f - %s\n",
order.OrderID, order.Symbol, order.Side, order.Quantity, order.Price, order.Status)
}
// Lệnh lịch sử
orders, err := t.Portfolio.GetHistoricalOrders("1234561", "2026/01/01", "2026/01/31")4.4. PPMMR
// PPMMR cổ phiếu
ppmmr, err := t.Portfolio.GetEquityPPMMR("1234561")
// PPMMR phái sinh
derPPMMR, err := t.Portfolio.GetDerivativePPMMR("1234568")Tổng quan method Portfolio
| Nhóm | Method | Trả về |
|---|---|---|
| Số dư | GetEquityBalance(accountNo) | EquityAccountBalance |
GetDerivativeBalance(accountNo) | DerivativeAccountBalance | |
| Vị thế | GetEquityPositions(accountNo) | []EquityPosition |
GetDerivativePositions(accountNo) | []AllDerivativePosition | |
GetOpenDerivativePositions(accountNo) | []DerivativePosition | |
GetClosedDerivativePositions(accountNo) | []DerivativePosition | |
| Sổ lệnh | GetTodayOrders(accountNo) | []Order |
GetHistoricalOrders(accountNo, fromDate, toDate) | []Order | |
| PPMMR | GetEquityPPMMR(accountNo) | EquityPPMMR |
GetDerivativePPMMR(accountNo) | DerivativePPMMR |
5. Giao dịch (TradingService)
Truy cập qua t.Trading.
5.1. Đặt lệnh
import "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/trading"
// Lệnh giới hạn (LO)
result, err := t.Trading.PlaceLimitOrder("1234561", "SSI", trading.OrderSideBuy, 100, 66000)
// Lệnh thị trường (MTL)
result, err := t.Trading.PlaceMarketOrder("1234561", "SSI", trading.OrderSideBuy, 100)
// Lệnh ATO (mở cửa)
result, err := t.Trading.PlaceATOOrder("1234561", "SSI", trading.OrderSideBuy, 100)
// Lệnh ATC (đóng cửa)
result, err := t.Trading.PlaceATCOrder("1234561", "SSI", trading.OrderSideSell, 100)
// Loại lệnh tuỳ chỉnh
result, err := t.Trading.PlaceOrder(
"1234561", "SSI", trading.OrderSideBuy, 100, 66000, trading.OrderTypeLO,
)
fmt.Printf("Order ID: %s, Status: %s\n", result.OrderID, result.Status)5.2. Sửa lệnh
Chỉ có thể sửa giá hoặc khối lượng (không sửa cả hai cùng lúc).
// Sửa giá theo client_request_id
result, err := t.Trading.ModifyOrderPrice("1234561", "REQ123", 68000)
// Sửa giá theo order_id
result, err := t.Trading.ModifyOrderPriceByOrderID("1234561", "ORD123", 68000)
// Sửa khối lượng theo client_request_id
result, err := t.Trading.ModifyOrderQuantity("1234561", "REQ123", 200)
// Sửa khối lượng theo order_id
result, err := t.Trading.ModifyOrderQuantityByOrderID("1234561", "ORD123", 200)5.3. Huỷ lệnh
// Huỷ theo client_request_id
result, err := t.Trading.CancelOrder("1234561", "REQ123")
// Huỷ theo order_id
result, err := t.Trading.CancelOrderByOrderID("1234561", "ORD123")5.4. Sức mua/bán tối đa
// Với giá cụ thể
price := 66000.0
maxBS, err := t.Trading.GetMaxBuySell("1234561", "SSI", &price)
fmt.Printf("Max mua: %d, Max bán: %d\n", maxBS.MaxBuyQuantity, maxBS.MaxSellQuantity)
// Theo giá thị trường
maxBS, err := t.Trading.GetMaxBuySellAtMarketPrice("1234561", "SSI")Tổng quan method Trading
| Nhóm | Method | Trả về |
|---|---|---|
| Đặt lệnh | PlaceOrder(accountNo, symbol, side, qty, price, orderType) | PlaceOrderResponse |
PlaceLimitOrder(accountNo, symbol, side, qty, price) | PlaceOrderResponse | |
PlaceMarketOrder(accountNo, symbol, side, qty) | PlaceOrderResponse | |
PlaceATOOrder(accountNo, symbol, side, qty) | PlaceOrderResponse | |
PlaceATCOrder(accountNo, symbol, side, qty) | PlaceOrderResponse | |
| Sửa lệnh | ModifyOrderPrice(accountNo, clientRequestID, price) | ModifyOrderResponse |
ModifyOrderPriceByOrderID(accountNo, orderID, price) | ModifyOrderResponse | |
ModifyOrderQuantity(accountNo, clientRequestID, qty) | ModifyOrderResponse | |
ModifyOrderQuantityByOrderID(accountNo, orderID, qty) | ModifyOrderResponse | |
| Huỷ lệnh | CancelOrder(accountNo, clientRequestID) | CancelOrderResponse |
CancelOrderByOrderID(accountNo, orderID) | CancelOrderResponse | |
| Sức mua/bán | GetMaxBuySell(accountNo, symbol, price) | MaxBuySellResponse |
GetMaxBuySellAtMarketPrice(accountNo, symbol) | MaxBuySellResponse |
6. Streaming Realtime (StreamingService)
Truy cập qua s.Streaming. Gọi s.Connect() trước.
6.1. Kết nối
s := ssi.NewStream(auth)
defer s.Disconnect()
if err := s.Connect(); err != nil {
log.Fatal(err)
}
// Chờ vô thời hạn
s.Wait(nil)
// Chờ với timeout
timeout := 30 * time.Second
s.Wait(&timeout)6.2. Thiết lập Callbacks
import "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/stream"
s.Streaming.SetOnData(func(msg interface{}) {
switch m := msg.(type) {
case *stream.TradeMessage:
fmt.Printf("[TRADE] %s | Giá: %.0f | KL: %d\n", m.Symbol, m.Price, m.Quantity)
case *stream.QuoteMessage:
fmt.Printf("[QUOTE] %s | Mua: %v | Bán: %v\n", m.Symbol, m.BidPrices, m.AskPrices)
case *stream.ForeignRoomMessage:
fmt.Printf("[ROOM] %s | KL Mua: %d | KL Bán: %d\n", m.Symbol, m.BuyQuantity, m.SellQuantity)
case *stream.MarketStatusMessage:
fmt.Printf("[MARKET] %s | Trạng thái: %s\n", m.Market, m.Status)
case *stream.PutMessage:
fmt.Printf("[PUT] %s | %.0f x %d\n", m.Symbol, m.Price, m.Quantity)
case *stream.OddLotMessage:
fmt.Printf("[ODDLOT] %s | %.0f x %d\n", m.Symbol, m.Price, m.Quantity)
}
})
s.Streaming.SetOnTrading(func(msg interface{}) {
switch m := msg.(type) {
case *stream.OrderStatusMessage:
fmt.Printf("[ORDER] %s %s | Trạng thái: %s\n", m.Symbol, m.Side, m.Status)
case *stream.PortfolioMessage:
fmt.Printf("[PORTFOLIO] %s | Tổng: %.0f\n", m.AccountNo, m.TotalAsset)
}
})
s.Streaming.SetOnHeartbeat(func(msg *stream.HeartbeatMessage) {
fmt.Printf("[HEARTBEAT] %v\n", msg)
})6.3. Subscribe dữ liệu thị trường
import "github.com/SSI-Securities-Inc/ssi-sdk-go/v3/market"
// Tất cả kênh (trade + quote + room) cho mã
s.Streaming.SubscribeSymbol([]string{"SSI", "HPG", "VIC"}, nil)
// Kênh riêng lẻ
s.Streaming.SubscribeSymbolTrade([]string{"SSI", "HPG"}, nil)
s.Streaming.SubscribeSymbolQuote([]string{"SSI", "HPG"}, nil)
s.Streaming.SubscribeSymbolRoom([]string{"SSI", "HPG"}, nil)
s.Streaming.SubscribeSymbolPutThrough([]string{"SSI"}, nil)
s.Streaming.SubscribeSymbolOddLot([]string{"SSI"}, nil)
// Theo sàn
s.Streaming.SubscribeBoard([]market.Board{market.BoardHOSE, market.BoardHNX}, nil)
// Theo chỉ số
s.Streaming.SubscribeIndex([]string{"VNINDEX", "VN30"}, nil)6.4. Unsubscribe
s.Streaming.UnsubscribeSymbol([]string{"SSI", "HPG"})
s.Streaming.UnsubscribeSymbolTrade([]string{"SSI"})
s.Streaming.UnsubscribeSymbolQuote([]string{"SSI"})
s.Streaming.UnsubscribeSymbolRoom([]string{"SSI"})
s.Streaming.UnsubscribeSymbolPutThrough([]string{"SSI"})
s.Streaming.UnsubscribeSymbolOddLot([]string{"SSI"})
s.Streaming.UnsubscribeBoard([]market.Board{market.BoardHOSE})
s.Streaming.UnsubscribeIndex([]string{"VNINDEX"})6.5. Subscribe sự kiện giao dịch
// Trạng thái lệnh — tất cả tài khoản
s.Streaming.SubscribeOrderStatus("", nil)
// Cho tài khoản cụ thể
s.Streaming.SubscribeOrderStatus("1234561", nil)
// Danh mục — tất cả tài khoản
s.Streaming.SubscribePortfolio("", nil)
// Cho tài khoản cụ thể
s.Streaming.SubscribePortfolio("1234561", nil)6.6. Heartbeat
s.Streaming.Ping()Loại message qua SetOnData
| Topic | Message Type | Mô tả |
|---|---|---|
trade.* | *stream.TradeMessage | Dữ liệu khớp lệnh |
quote.* | *stream.QuoteMessage | Dữ liệu mua/bán |
room.* | *stream.ForeignRoomMessage | Room ngoại |
market.* | *stream.MarketStatusMessage | Trạng thái thị trường |
put.* | *stream.PutMessage | Thoả thuận |
oddlot.* | *stream.OddLotMessage | Lô lẻ |
Loại message qua SetOnTrading
| Topic | Message Type | Mô tả |
|---|---|---|
order.* | *stream.OrderStatusMessage | Cập nhật trạng thái lệnh |
portfolio.* | *stream.PortfolioMessage | Thay đổi danh mục |
Tổng quan method Streaming
| Nhóm | Method | Mô tả |
|---|---|---|
| Kết nối | Connect() | Kết nối WebSocket |
Disconnect() | Ngắt kết nối | |
Wait(timeout *time.Duration) | Chờ dữ liệu | |
| Heartbeat | Ping() | Ping server |
| Symbol | SubscribeSymbol(symbols, callback) | Trade + Quote + Room |
SubscribeSymbolTrade(symbols, callback) | Chỉ Trade | |
SubscribeSymbolQuote(symbols, callback) | Chỉ Quote | |
SubscribeSymbolRoom(symbols, callback) | Chỉ Room ngoại | |
SubscribeSymbolPutThrough(symbols, callback) | Chỉ thoả thuận | |
SubscribeSymbolOddLot(symbols, callback) | Chỉ lô lẻ | |
| Sàn/Chỉ số | SubscribeBoard(boards, callback) | Theo sàn |
SubscribeIndex(indices, callback) | Theo chỉ số | |
| Giao dịch | SubscribeOrderStatus(accountNo, callback) | Trạng thái lệnh |
SubscribePortfolio(accountNo, callback) | Thay đổi danh mục | |
| Unsubscribe | UnsubscribeSymbol(symbols) | Huỷ tất cả kênh |
UnsubscribeSymbolTrade(symbols) | Huỷ trade | |
UnsubscribeSymbolQuote(symbols) | Huỷ quote | |
UnsubscribeSymbolRoom(symbols) | Huỷ room | |
UnsubscribeSymbolPutThrough(symbols) | Huỷ thoả thuận | |
UnsubscribeSymbolOddLot(symbols) | Huỷ lô lẻ | |
UnsubscribeBoard(boards) | Huỷ sàn | |
UnsubscribeIndex(indices) | Huỷ chỉ số |