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 AccountAccountNo 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:

MethodKhung 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):

MethodKhung 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ểuMặc địnhMô tả
symbolstring(bắt buộc)Mã chứng khoán
fromDatestring(bắt buộc)Ngày bắt đầu (yyyy/MM/dd)
toDatestring(bắt buộc)Ngày kết thúc (yyyy/MM/dd)
pageint1Số trang
sizeint1000Số 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ómMethodTrả 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ệnhGetTodayOrders(accountNo)[]Order
GetHistoricalOrders(accountNo, fromDate, toDate)[]Order
PPMMRGetEquityPPMMR(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ómMethodTrả về
Đặt lệnhPlaceOrder(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ệnhModifyOrderPrice(accountNo, clientRequestID, price)ModifyOrderResponse
ModifyOrderPriceByOrderID(accountNo, orderID, price)ModifyOrderResponse
ModifyOrderQuantity(accountNo, clientRequestID, qty)ModifyOrderResponse
ModifyOrderQuantityByOrderID(accountNo, orderID, qty)ModifyOrderResponse
Huỷ lệnhCancelOrder(accountNo, clientRequestID)CancelOrderResponse
CancelOrderByOrderID(accountNo, orderID)CancelOrderResponse
Sức mua/bánGetMaxBuySell(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

TopicMessage TypeMô tả
trade.**stream.TradeMessageDữ liệu khớp lệnh
quote.**stream.QuoteMessageDữ liệu mua/bán
room.**stream.ForeignRoomMessageRoom ngoại
market.**stream.MarketStatusMessageTrạng thái thị trường
put.**stream.PutMessageThoả thuận
oddlot.**stream.OddLotMessageLô lẻ

Loại message qua SetOnTrading

TopicMessage TypeMô tả
order.**stream.OrderStatusMessageCập nhật trạng thái lệnh
portfolio.**stream.PortfolioMessageThay đổi danh mục

Tổng quan method Streaming

NhómMethodMô tả
Kết nốiConnect()Kết nối WebSocket
Disconnect()Ngắt kết nối
Wait(timeout *time.Duration)Chờ dữ liệu
HeartbeatPing()Ping server
SymbolSubscribeSymbol(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ịchSubscribeOrderStatus(accountNo, callback)Trạng thái lệnh
SubscribePortfolio(accountNo, callback)Thay đổi danh mục
UnsubscribeUnsubscribeSymbol(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ố

Trên trang này