Skip to content

MT5Account Β· Additional Methods - OverviewΒΆ

Advanced symbol information, trading sessions, margin rates, batch operations. Use this page to choose the right API for advanced queries.

πŸ“ What lives hereΒΆ

Advanced Symbol InformationΒΆ


πŸ“š Step-by-step tutorialsΒΆ

Want detailed explanations with line-by-line code breakdown? Check these guides:


🧭 Plain English¢

  • SymbolInfoMarginRate β†’ get margin multiplier for different order types.
  • SymbolInfoSessionQuote β†’ get quote session times (when quotes are available).
  • SymbolInfoSessionTrade β†’ get trading session times (when trading is allowed).
  • SymbolParamsMany β†’ get complete symbol specifications for one symbol or all symbols in one call (most efficient).
  • TickValueWithSize β†’ get tick value and contract size for position value and P&L calculations.

Rule of thumb: need session times β†’ use Session methods; need complete symbol data β†’ use SymbolParamsMany; need margin rates β†’ use SymbolInfoMarginRate; need tick value/P&L data β†’ use TickValueWithSize.


Quick chooseΒΆ

If you need… Use Returns Key inputs
Margin rates for order type SymbolInfoMarginRate SymbolInfoMarginRateData Symbol, OrderType
Quote session times SymbolInfoSessionQuote SymbolInfoSessionQuoteData (From, To) Symbol, DayOfWeek, SessionIndex
Trading session times SymbolInfoSessionTrade SymbolInfoSessionTradeData (From, To) Symbol, DayOfWeek, SessionIndex
Complete specs for one or all symbols SymbolParamsMany SymbolParamsManyData (SymbolInfos array of SymbolParameters) SymbolName (optional), SortType, PageNumber/ItemsPerPage
Tick value and size for P&L calculations TickValueWithSize TickValueWithSizeData (SymbolTickSizeInfos array of TickSizeSymbol) SymbolNames array

❌ Cross‑refs & gotchasΒΆ

  • SymbolParamsMany - THE MOST EFFICIENT way to get complete symbol data (116 fields per symbol).
  • Session times - From/To are timestamps whose time of day is the session boundary; ignore the date part.
  • Day of week - SUNDAY=0, MONDAY=1, ..., SATURDAY=6.
  • Session index - Most symbols have 1 session, some have multiple (e.g., 24h = 1 session, day+night = 2 sessions).
  • Margin rates - Different rates for BUY/SELL, LONG/SHORT positions.
  • SymbolParamsMany filters - Only SymbolName (one symbol), sorting and paging; there is no field filter or symbol list. Filter other things on the client side.
  • Batch operations - SymbolParamsMany without SymbolName returns all symbols in one call.

🟒 Minimal snippets¢

// Get margin rates for symbol
rates, err := account.SymbolInfoMarginRate(ctx, &pb.SymbolInfoMarginRateRequest{
    Symbol:    "EURUSD",
    OrderType: pb.ENUM_ORDER_TYPE_ORDER_TYPE_BUY,
})
if err != nil {
    log.Fatalf("Failed: %v", err)
}

fmt.Printf("EURUSD BUY margin rates:\n")
fmt.Printf("  Initial: %.2f\n", rates.InitialMarginRate)
fmt.Printf("  Maintenance: %.2f\n", rates.MaintenanceMarginRate)
// Get trading session times for Monday
sessionInfo, _ := account.SymbolInfoSessionTrade(ctx, &pb.SymbolInfoSessionTradeRequest{
    Symbol:       "EURUSD",
    DayOfWeek:    pb.DayOfWeek_MONDAY,
    SessionIndex: 0,
})

fromTime := sessionInfo.From.AsTime()
toTime := sessionInfo.To.AsTime()
fromSeconds := fromTime.Hour()*3600 + fromTime.Minute()*60 + fromTime.Second()
toSeconds := toTime.Hour()*3600 + toTime.Minute()*60 + toTime.Second()

fmt.Printf("EURUSD Monday trading session:\n")
fmt.Printf("  From: %d seconds (%.2f hours)\n",
    fromSeconds, float64(fromSeconds)/3600)
fmt.Printf("  To: %d seconds (%.2f hours)\n",
    toSeconds, float64(toSeconds)/3600)
// Get complete symbol parameters for several symbols:
// one call for all symbols, then keep the wanted ones (there is no symbol-list filter)
wanted := map[string]bool{"EURUSD": true, "GBPUSD": true, "USDJPY": true}

params, err := account.SymbolParamsMany(ctx, &pb.SymbolParamsManyRequest{})
if err != nil {
    log.Fatalf("Failed: %v", err)
}

for _, symbolParam := range params.SymbolInfos {
    if !wanted[symbolParam.Name] {
        continue
    }
    fmt.Printf("\n%s:\n", symbolParam.Name)
    fmt.Printf("  Bid: %.5f, Ask: %.5f\n", symbolParam.Bid, symbolParam.Ask)
    fmt.Printf("  Digits: %d, Point: %.5f\n", symbolParam.Digits, symbolParam.Point)
    fmt.Printf("  Volume: %.2f - %.2f (step: %.2f)\n",
        symbolParam.VolumeMin, symbolParam.VolumeMax, symbolParam.VolumeStep)
    fmt.Printf("  Contract size: %.0f\n", symbolParam.TradeContractSize)
    fmt.Printf("  Spread: %d points\n", symbolParam.Spread)
}
// Get all trading sessions for a week
symbol := "EURUSD"

var days []pb.DayOfWeek // Monday through Friday
days = append(days, pb.DayOfWeek_MONDAY, pb.DayOfWeek_TUESDAY, pb.DayOfWeek_WEDNESDAY,
    pb.DayOfWeek_THURSDAY, pb.DayOfWeek_FRIDAY)

dayNames := []string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}

fmt.Printf("%s Trading Schedule:\n", symbol)
fmt.Println("─────────────────────────────────────")

for i, day := range days {
    session, err := account.SymbolInfoSessionTrade(ctx, &pb.SymbolInfoSessionTradeRequest{
        Symbol:       symbol,
        DayOfWeek:    day,
        SessionIndex: 0,
    })

    if err != nil {
        continue
    }

    fromTime := session.From.AsTime()
    toTime := session.To.AsTime()
    fromHours := float64(fromTime.Hour()*3600 + fromTime.Minute()*60 + fromTime.Second()) / 3600
    toHours := float64(toTime.Hour()*3600 + toTime.Minute()*60 + toTime.Second()) / 3600

    fmt.Printf("%s: %.2f:00 - %.2f:00\n",
        dayNames[i], fromHours, toHours)
}
// Batch query all forex majors with SymbolParamsMany (all symbols, filtered on the client side)
majors := map[string]bool{
    "EURUSD": true, "GBPUSD": true, "USDJPY": true, "USDCHF": true,
    "AUDUSD": true, "USDCAD": true, "NZDUSD": true,
}

params, _ := account.SymbolParamsMany(ctx, &pb.SymbolParamsManyRequest{})

fmt.Println("Forex Majors Summary:")
fmt.Println("─────────────────────────────────────────────────────")
fmt.Printf("%-8s  %-10s  %-10s  %-8s\n", "Symbol", "Bid", "Ask", "Spread")
fmt.Println("─────────────────────────────────────────────────────")

for _, sp := range params.SymbolInfos {
    if !majors[sp.Name] {
        continue
    }
    fmt.Printf("%-8s  %-10.5f  %-10.5f  %-8d\n",
        sp.Name, sp.Bid, sp.Ask, sp.Spread)
}

See alsoΒΆ