DB - accounts

abstract

Stores MT5 trading account credentials, configuration, and trading limits — one row per registered account.

Table Info

PropertyValue
Table Nameaccounts
SQLAlchemy Modelbackend/db/models.py :: Account
Pydantic Schemabackend/api/routes/accounts.py :: AccountCreate / AccountResponse
Migration Filealembic/versions/
TimescaleDB HypertableNo
Partition Column

Columns

ColumnSQLAlchemy TypeNullableDefaultDescription
idIntegerNoautoPrimary key
nameString(100)NoHuman-readable account label
brokerString(100)NoBroker name (e.g., "MetaQuotes")
loginIntegerNoMT5 account number (unique + indexed)
password_encryptedString(500)NoFernet-encrypted MT5 password
serverString(200)NoMT5 server string (e.g., "MetaQuotes-Demo")
is_liveBooleanNoFalseTrue = live account; False = demo
is_activeBooleanNoTrueSoft-delete flag
created_atDateTime(timezone=True)Nodatetime.now(UTC)Registration timestamp
allowed_symbolsTextNo""JSON list of permitted symbols
max_lot_sizeFloatNo0.1Maximum volume per trade in lots
risk_pctFloatNo0.01Fraction of balance to risk per trade (0.01 = 1%)
auto_trade_enabledBooleanNoTrueAllow automated LLM-driven trading
paper_trade_enabledBooleanNoFalseIf True, execute paper trades instead of live
mt5_pathString(500)No""Path to terminal64.exe (overrides global MT5_PATH)
account_typeString(20)No"USD"Account denomination: USD or USC

Constraints & Indexes

NameTypeColumnsPurpose
pk_accountsPRIMARY KEYidRow uniqueness
uq_accounts_loginUNIQUEloginNo duplicate MT5 account numbers
idx_accounts_loginINDEXloginFast lookup by MT5 login number

Entity Relationships

SQLAlchemy Model (reference snapshot)

class Account(Base):
    __tablename__ = "accounts"
 
    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    name: Mapped[str] = mapped_column(String(100))
    broker: Mapped[str] = mapped_column(String(100))
    login: Mapped[int] = mapped_column(Integer, unique=True, index=True)
    password_encrypted: Mapped[str] = mapped_column(String(500))  # Fernet-encrypted
    server: Mapped[str] = mapped_column(String(200))
    is_live: Mapped[bool] = mapped_column(Boolean, default=False)
    is_active: Mapped[bool] = mapped_column(Boolean, default=True)
    created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=lambda: datetime.now(UTC))
    allowed_symbols: Mapped[str] = mapped_column(Text, default="")  # JSON list
    max_lot_size: Mapped[float] = mapped_column(Float, default=0.1)
    risk_pct: Mapped[float] = mapped_column(Float, default=0.01)
    auto_trade_enabled: Mapped[bool] = mapped_column(Boolean, default=True)
    paper_trade_enabled: Mapped[bool] = mapped_column(Boolean, default=False)
    mt5_path: Mapped[str] = mapped_column(String(500), default="")
    account_type: Mapped[str] = mapped_column(String(20), default="USD")
 
    trades: Mapped[list["Trade"]] = relationship("Trade", back_populates="account")
    journal_entries: Mapped[list["AIJournal"]] = relationship("AIJournal", back_populates="account")
    strategy_bindings: Mapped[list["AccountStrategy"]] = relationship(
        "AccountStrategy", back_populates="account", cascade="all, delete-orphan"
    )

Service Layer

LayerFilePurpose
Routerbackend/api/routes/accounts.pyCRUD endpoints
MT5 Bridgebackend/mt5/bridge.pyConnect/fetch live data
Securitybackend/core/security.pyencrypt() / decrypt() for password
RoleLink
API EndpointAPI-POST-v1-Accounts
API EndpointAPI-GET-v1-Accounts
Frontend PagePage - Accounts
Related TableDB - trades
Related TableDB - account_strategy