Add symbol conversion module

This commit is contained in:
2026-07-08 06:40:23 +00:00
parent 54802ca094
commit 26d04bdc26
+64
View File
@@ -0,0 +1,64 @@
"""Symbol conversion utilities.
CCXT uses 'BASE/QUOTE' format (e.g. "XAU/USD").
MT5 uses broker-specific names (e.g. "XAUUSD", "XAUUSDc", "XAUUSD.i").
The wrapper supports two strategies:
1. User-provided symbol_map in config (recommended, explicit)
2. Default: strip the "/" and concatenate (works for plain symbols)
"""
# Common quote currencies in forex/metals
COMMON_QUOTES = [
"USD", "EUR", "GBP", "JPY", "CHF", "CAD", "AUD", "NZD",
"CNY", "HKD", "SGD", "XAU", "XAG", "XPT", "XPD",
]
def to_mt5_symbol(symbol, default_suffix=""):
"""Convert CCXT symbol (XAU/USD) to MT5 format (XAUUSD).
Args:
symbol: CCXT-format symbol (e.g. "XAU/USD" or "XAUUSDc")
default_suffix: suffix to append when no symbol_map is provided
(e.g. "c" for ECN, ".i" for CFD indices)
Returns:
str: MT5-format symbol
"""
# Already in MT5 format (no slash)
if "/" not in symbol:
return symbol
base, quote = symbol.split("/", 1)
return f"{base}{quote}{default_suffix}"
def to_ccxt_symbol(symbol, quote=None):
"""Best-effort conversion from MT5 symbol to CCXT format.
Args:
symbol: MT5 symbol (e.g. "XAUUSDc")
quote: Optional explicit quote currency to split on
Returns:
str: CCXT symbol (e.g. "XAU/USD" or original if cannot split)
"""
# Strip common suffixes
cleaned = symbol
for suffix in ("c", ".i", ".m", ".pro", ".ecn", ".raw", ".std"):
if cleaned.endswith(suffix):
cleaned = cleaned[: -len(suffix)]
break
# Try explicit quote first
if quote and cleaned.endswith(quote) and len(cleaned) > len(quote):
return f"{cleaned[: -len(quote)]}/{quote}"
# Try common quotes
for q in COMMON_QUOTES:
if cleaned.endswith(q) and len(cleaned) > len(q):
return f"{cleaned[: -len(q)]}/{q}"
# Cannot split reliably
return symbol