Skip to content

Handle Errors

Patterns for handling failures at every level.


Basic pattern

res = mt5.positions()

if res.success:
    # use res.data
    print(f"{len(res.data)} positions")
else:
    print(f"[{res.operation}] error {res.error_code}: {res.error_message}")

Lifecycle errors

Always check initialize() and login() before proceeding:

init = mt5.initialize(creds)
if not init.success:
    raise SystemExit(f"initialize failed: {init.error_message}")

login = mt5.login(creds)
if not login.success:
    raise SystemExit(f"login failed ({login.error_code}): {login.error_message}")

Common login errors:

Error code Cause
10013 Invalid account number or password
10014 Wrong server name
-10 initialize() was not called first

Trade errors (two-level check)

order_send() can fail at the SDK level or be rejected by the broker:

res = mt5.order_send(request)

if not res.success:
    # SDK-level failure
    print(f"SDK error {res.error_code}: {res.error_message}")

elif not res.data.is_successful:
    # Broker rejected the trade
    from syntiq_mt5 import constants
    retcode = res.data.retcode

    if retcode == constants.TRADE_RETCODE_NO_MONEY:
        print("Insufficient funds")
    elif retcode == constants.TRADE_RETCODE_MARKET_CLOSED:
        print("Market is closed")
    elif retcode == constants.TRADE_RETCODE_INVALID_STOPS:
        print("Invalid SL/TP levels")
    elif retcode == constants.TRADE_RETCODE_REQUOTE:
        print(f"Requote — new price: {res.data.ask}")
    else:
        print(f"Rejected (retcode {retcode}): {res.data.comment}")

else:
    print(f"Order filled: deal={res.data.deal}")

Validate before sending

Use order_check() to catch problems before they reach the broker:

check = mt5.order_check(request)

if check.success and check.data.is_successful:
    res = mt5.order_send(request)
    ...
else:
    reason = check.data.comment if check.success else check.error_message
    print(f"Pre-flight failed: {reason}")

Logging errors

import logging

log = logging.getLogger(__name__)

res = mt5.positions()
if not res.success:
    log.error(
        "positions failed",
        extra={
            "operation": res.operation,
            "error_code": res.error_code,
            "error_message": res.error_message,
        },
    )

Result fields for debugging

Field When set Description
success always True / False
data on success The return value
error_code on failure MT5 error code (negative = SDK-internal)
error_message on failure Human-readable description
context on failure MT5 API function name (e.g. "positions_get")
operation on failure Logical operation name

See Result[T] and Error Handling for the full picture.