✅ Get Tick Values for Multiple Symbols (TickValueWithSizeAsync)¶
Request: Get tick values and sizes for multiple symbols in a single call on MT5. Returns tick value, profit/loss tick values, tick size, and contract size.
API Information:
- SDK wrapper:
MT5Account.TickValueWithSizeAsync(...)(from NuGet packageMetaRPC.MT5) - gRPC service:
mt5_term_api.AccountHelper - Proto definition:
TickValueWithSize(defined inmt5-term-api-account-helper.proto)
RPC¶
- Service:
mt5_term_api.AccountHelper - Method:
TickValueWithSize(TickValueWithSizeRequest) → TickValueWithSizeReply - Low‑level client (generated):
AccountHelper.AccountHelperClient.TickValueWithSize(request, headers, deadline, cancellationToken) - SDK wrapper (your class):
namespace mt5_term_api
{
public class MT5Account
{
public async Task<TickValueWithSizeData> TickValueWithSizeAsync(
TickValueWithSizeRequest request,
DateTime? deadline = null,
CancellationToken cancellationToken = default);
}
}
Request message:
TickValueWithSizeRequest { symbol_names }
Reply message:
TickValueWithSizeReply { data: TickValueWithSizeData }
🔽 Input¶
| Parameter | Type | Description |
|---|---|---|
request |
TickValueWithSizeRequest |
Protobuf request with array of symbol names |
deadline |
DateTime? |
Absolute per‑call UTC deadline → converted to timeout |
cancellationToken |
CancellationToken |
Cooperative cancel for the call/retry loop |
TickValueWithSizeRequest¶
| Field | Type | Description |
|---|---|---|
SymbolNames |
List<string> |
Array of symbol names (e.g., ["EURUSD", "XAUUSD"]) |
⬆️ Output — TickValueWithSizeData¶
| Field | Type | Description |
|---|---|---|
SymbolTickSizeInfos |
List<TickSizeSymbol> |
Array of tick information for each symbol |
TickSizeSymbol — Tick value information¶
| Field | Type | Description |
|---|---|---|
Index |
int32 |
Symbol index in request array |
Name |
string |
Symbol name |
TradeTickValue |
double |
Tick value (cost of 1 tick for 1 lot) |
TradeTickValueProfit |
double |
Tick value for profit calculation |
TradeTickValueLoss |
double |
Tick value for loss calculation |
TradeTickSize |
double |
Tick size (minimum price change) |
TradeContractSize |
double |
Contract size (volume for 1 standard lot) |
💬 Just the essentials¶
- What it is. Batch endpoint to get tick values and contract sizes for multiple symbols in one call.
- Why you need it. Calculate P&L in account currency, determine pip value, analyze trading costs across multiple symbols efficiently.
- Sanity check. If
SymbolTickSizeInfos.Count > 0→ data available. CheckIndexto match symbols with request order.
🎯 Purpose¶
Use it to get tick value data:
- Calculate profit/loss in account currency.
- Determine pip/tick value for risk management.
- Batch-fetch tick data for multiple symbols.
- Calculate position sizing based on tick value.
🧩 Notes & Tips¶
- Batch optimization: More efficient than calling individual symbol info methods multiple times.
- Tick value vs Tick size: Tick size is the minimum price change. Tick value is the monetary value of that change for 1 lot.
- Profit vs Loss tick value: Some symbols have asymmetric tick values for long/short positions.
- Contract size: Used to convert volume (lots) to actual units (e.g., 100,000 for Forex).
- Account currency: Tick values are returned in account currency.
- Use Index: Match results to request using
Indexfield, especially if some symbols fail.
🔗 Usage Examples¶
1) Get tick values for single symbol¶
// acc — connected MT5Account
var result = await acc.TickValueWithSizeAsync(new TickValueWithSizeRequest
{
SymbolNames = { "EURUSD" }
});
if (result.SymbolTickSizeInfos.Count > 0)
{
var tick = result.SymbolTickSizeInfos[0];
Console.WriteLine($"Symbol: {tick.Name}");
Console.WriteLine($"Tick value: {tick.TradeTickValue:F2}");
Console.WriteLine($"Tick value (profit): {tick.TradeTickValueProfit:F2}");
Console.WriteLine($"Tick value (loss): {tick.TradeTickValueLoss:F2}");
Console.WriteLine($"Tick size: {tick.TradeTickSize:F5}");
Console.WriteLine($"Contract size: {tick.TradeContractSize:F2}");
}
2) Get tick values for multiple symbols (batch)¶
var symbols = new[] { "EURUSD", "GBPUSD", "USDJPY", "XAUUSD", "BTCUSD" };
var result = await acc.TickValueWithSizeAsync(new TickValueWithSizeRequest
{
SymbolNames = { symbols }
});
Console.WriteLine($"Tick values for {result.SymbolTickSizeInfos.Count} symbols:\n");
foreach (var tick in result.SymbolTickSizeInfos)
{
Console.WriteLine($"{tick.Name,-10} Tick value: ${tick.TradeTickValue,8:F2} Tick size: {tick.TradeTickSize,10:F5} Contract: {tick.TradeContractSize,10:F0}");
}
3) Calculate pip value for Forex pairs¶
var forexPairs = new[] { "EURUSD", "GBPUSD", "USDJPY", "USDCHF" };
var result = await acc.TickValueWithSizeAsync(new TickValueWithSizeRequest
{
SymbolNames = { forexPairs }
});
Console.WriteLine("Pip values (for 1 standard lot):\n");
foreach (var tick in result.SymbolTickSizeInfos)
{
// For most Forex pairs, 1 pip = 10 ticks (0.0001 for 4-digit pairs, 0.01 for JPY pairs)
var pipValue = tick.TradeTickValue * 10;
Console.WriteLine($"{tick.Name,-10} 1 pip = ${pipValue:F2}");
}
4) Calculate P&L for position¶
var symbol = "XAUUSD";
var lots = 0.10;
var entryPrice = 2000.00;
var currentPrice = 2010.00;
// Get tick value
var result = await acc.TickValueWithSizeAsync(new TickValueWithSizeRequest
{
SymbolNames = { symbol }
});
if (result.SymbolTickSizeInfos.Count > 0)
{
var tick = result.SymbolTickSizeInfos[0];
// Calculate price change in ticks
var priceChange = currentPrice - entryPrice;
var ticksChanged = priceChange / tick.TradeTickSize;
// Calculate P&L
var profitLoss = ticksChanged * tick.TradeTickValueProfit * lots;
Console.WriteLine($"Symbol: {tick.Name}");
Console.WriteLine($"Entry: {entryPrice}, Current: {currentPrice}");
Console.WriteLine($"Price change: {priceChange} ({ticksChanged} ticks)");
Console.WriteLine($"P&L for {lots} lots: ${profitLoss:F2}");
}
5) Position sizing based on risk¶
var symbol = "EURUSD";
var accountBalance = 10000.0; // $10,000
var riskPercent = 1.0; // Risk 1% per trade
var stopLossPips = 50; // 50 pip stop loss
// Get tick value
var result = await acc.TickValueWithSizeAsync(new TickValueWithSizeRequest
{
SymbolNames = { symbol }
});
if (result.SymbolTickSizeInfos.Count > 0)
{
var tick = result.SymbolTickSizeInfos[0];
// Calculate pip value (1 pip = 10 ticks for most pairs)
var pipValue = tick.TradeTickValue * 10;
// Calculate risk amount
var riskAmount = accountBalance * (riskPercent / 100.0);
// Calculate lot size
var lotSize = riskAmount / (stopLossPips * pipValue);
// Round to valid lot size (e.g., 0.01 step)
lotSize = Math.Round(lotSize, 2);
Console.WriteLine($"Account: ${accountBalance:F2}");
Console.WriteLine($"Risk: {riskPercent}% (${riskAmount:F2})");
Console.WriteLine($"Stop loss: {stopLossPips} pips");
Console.WriteLine($"Pip value (1 lot): ${pipValue:F2}");
Console.WriteLine($"Recommended lot size: {lotSize:F2}");
}
6) Compare tick values across symbol types¶
var symbols = new[] { "EURUSD", "XAUUSD", "BTCUSD", "ES", "NQ" };
var result = await acc.TickValueWithSizeAsync(new TickValueWithSizeRequest
{
SymbolNames = { symbols }
});
Console.WriteLine("Tick value comparison:\n");
Console.WriteLine($"{"Symbol",-10} {"Tick Value",-12} {"Tick Size",-12} {"Contract Size",-15}");
Console.WriteLine(new string('-', 60));
foreach (var tick in result.SymbolTickSizeInfos)
{
Console.WriteLine($"{tick.Name,-10} ${tick.TradeTickValue,-12:F2} {tick.TradeTickSize,-12:F5} {tick.TradeContractSize,-15:F0}");
}
Console.WriteLine("\nNotes:");
Console.WriteLine("- Forex (EURUSD): Contract size 100,000, tick size 0.00001");
Console.WriteLine("- Gold (XAUUSD): Contract size 100, tick size varies");
Console.WriteLine("- Crypto (BTCUSD): Contract size varies by broker");
Console.WriteLine("- Futures (ES/NQ): Contract size and tick size vary by contract");
7) Calculate margin requirement using tick values¶
var symbol = "XAUUSD";
var lots = 1.0;
// Get tick values
var result = await acc.TickValueWithSizeAsync(new TickValueWithSizeRequest
{
SymbolNames = { symbol }
});
if (result.SymbolTickSizeInfos.Count > 0)
{
var tick = result.SymbolTickSizeInfos[0];
// Get current price (assuming you have it from SymbolInfoTick)
var currentPrice = 2000.0; // Example
// Calculate position value
var positionValue = lots * tick.TradeContractSize * currentPrice;
Console.WriteLine($"Symbol: {tick.Name}");
Console.WriteLine($"Lots: {lots}");
Console.WriteLine($"Contract size: {tick.TradeContractSize}");
Console.WriteLine($"Current price: ${currentPrice}");
Console.WriteLine($"Position value: ${positionValue:F2}");
Console.WriteLine($"\nNote: Actual margin depends on leverage and margin requirements");
}
8) Validate tick value asymmetry¶
var symbols = new[] { "EURUSD", "USDJPY", "XAUUSD" };
var result = await acc.TickValueWithSizeAsync(new TickValueWithSizeRequest
{
SymbolNames = { symbols }
});
Console.WriteLine("Checking for asymmetric tick values:\n");
foreach (var tick in result.SymbolTickSizeInfos)
{
var isSymmetric = Math.Abs(tick.TradeTickValueProfit - tick.TradeTickValueLoss) < 0.0001;
Console.WriteLine($"{tick.Name,-10}:");
Console.WriteLine($" Profit tick value: ${tick.TradeTickValueProfit:F2}");
Console.WriteLine($" Loss tick value: ${tick.TradeTickValueLoss:F2}");
Console.WriteLine($" Status: {(isSymmetric ? "Symmetric" : "⚠ Asymmetric - long/short have different pip values")}");
Console.WriteLine();
}