2
0
forked from kodorvan/stcs
Files
stcs/database/models.py

208 lines
6.2 KiB
Python

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.asyncio import AsyncAttrs
from sqlalchemy import (
Column,
ForeignKey,
Integer,
String,
BigInteger,
Float,
Boolean,
UniqueConstraint,
)
from sqlalchemy.orm import relationship
Base = declarative_base(cls=AsyncAttrs)
class User(Base):
"""User model."""
__tablename__ = "users"
id = Column(Integer, primary_key=True, autoincrement=True)
tg_id = Column(BigInteger, nullable=False, unique=True)
username = Column(String, nullable=False)
user_api = relationship(
"UserApi",
back_populates="user",
cascade="all, delete-orphan",
passive_deletes=True,
uselist=False,
)
user_symbol = relationship(
"UserSymbol",
back_populates="user",
cascade="all, delete-orphan",
passive_deletes=True,
uselist=False,
)
user_additional_settings = relationship(
"UserAdditionalSettings",
back_populates="user",
cascade="all, delete-orphan",
passive_deletes=True,
uselist=False,
)
user_risk_management = relationship(
"UserRiskManagement",
back_populates="user",
cascade="all, delete-orphan",
passive_deletes=True,
uselist=False,
)
user_conditional_settings = relationship(
"UserConditionalSettings",
back_populates="user",
cascade="all, delete-orphan",
passive_deletes=True,
uselist=False,
)
user_deals = relationship(
"UserDeals",
back_populates="user",
cascade="all, delete-orphan",
passive_deletes=True,
)
user_auto_trading = relationship(
"UserAutoTrading",
back_populates="user",
cascade="all, delete-orphan",
passive_deletes=True,
)
class UserApi(Base):
"""User API model."""
__tablename__ = "user_api"
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(
Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True
)
api_key = Column(String, nullable=False)
api_secret = Column(String, nullable=False)
user = relationship("User", back_populates="user_api")
class UserSymbol(Base):
"""User symbol model."""
__tablename__ = "user_symbol"
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(
Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True
)
symbol = Column(String, nullable=False, default="BTCUSDT")
user = relationship("User", back_populates="user_symbol")
class UserAdditionalSettings(Base):
"""User additional settings model."""
__tablename__ = "user_additional_settings"
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(
Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True
)
trade_mode = Column(String, nullable=False, default="Merged_Single")
switch_side = Column(String, nullable=False, default="По направлению")
trigger_price = Column(Float, nullable=False, default=0.0)
margin_type = Column(String, nullable=False, default="ISOLATED_MARGIN")
leverage = Column(String, nullable=False, default="10")
order_quantity = Column(Float, nullable=False, default=5.0)
martingale_factor = Column(Float, nullable=False, default=1.0)
max_bets_in_series = Column(Integer, nullable=False, default=1)
user = relationship("User", back_populates="user_additional_settings")
class UserRiskManagement(Base):
"""User risk management model."""
__tablename__ = "user_risk_management"
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(
Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True
)
take_profit_percent = Column(Float, nullable=False, default=1)
stop_loss_percent = Column(Float, nullable=False, default=1)
commission_fee = Column(String, nullable=False, default="Yes_commission_fee")
user = relationship("User", back_populates="user_risk_management")
class UserConditionalSettings(Base):
"""User conditional settings model."""
__tablename__ = "user_conditional_settings"
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(
Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True
)
timer_start = Column(Integer, nullable=False, default=0)
timer_end = Column(Integer, nullable=False, default=0)
user = relationship("User", back_populates="user_conditional_settings")
class UserDeals(Base):
"""User deals model."""
__tablename__ = "user_deals"
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(
Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False
)
current_step = Column(Integer, nullable=True)
symbol = Column(String, nullable=True)
trade_mode = Column(String, nullable=True)
base_quantity = Column(Float, nullable=True)
margin_type = Column(String, nullable=True)
leverage = Column(String, nullable=True)
last_side = Column(String, nullable=True)
closed_side = Column(String, nullable=True)
order_quantity = Column(Float, nullable=True)
martingale_factor = Column(Float, nullable=True)
max_bets_in_series = Column(Integer, nullable=True)
take_profit_percent = Column(Integer, nullable=True)
stop_loss_percent = Column(Integer, nullable=True)
trigger_price = Column(Float, nullable=True)
user = relationship("User", back_populates="user_deals")
__table_args__ = (UniqueConstraint("user_id", "symbol", name="uq_user_symbol"),)
class UserAutoTrading(Base):
"""User auto trading model."""
__tablename__ = "user_auto_trading"
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(
Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False
)
symbol = Column(String, nullable=True)
auto_trading = Column(Boolean, nullable=True)
fee = Column(Float, nullable=True)
total_fee = Column(Float, nullable=True)
user = relationship("User", back_populates="user_auto_trading")