forked from kodorvan/stcs
add files project
This commit is contained in:
120
app/telegram/database/models.py
Normal file
120
app/telegram/database/models.py
Normal file
@@ -0,0 +1,120 @@
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
from sqlalchemy import BigInteger, Boolean, Integer, String, ForeignKey
|
||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
||||
from sqlalchemy.ext.asyncio import AsyncAttrs, async_sessionmaker, create_async_engine
|
||||
|
||||
from sqlalchemy import select, insert
|
||||
|
||||
engine = create_async_engine(url='sqlite+aiosqlite:///db.sqlite3')
|
||||
|
||||
async_session = async_sessionmaker(engine)
|
||||
|
||||
class Base(AsyncAttrs, DeclarativeBase):
|
||||
pass
|
||||
|
||||
class User_Telegram_Id(Base):
|
||||
__tablename__ = 'user_telegram_id'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
tg_id = mapped_column(BigInteger)
|
||||
|
||||
class Trading_Mode(Base):
|
||||
__tablename__ = 'trading_modes'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
mode = mapped_column(String(10), unique=True)
|
||||
|
||||
class Margin_type(Base):
|
||||
__tablename__ = 'margin_types'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
type = mapped_column(String(15), unique=True)
|
||||
|
||||
class Trigger(Base):
|
||||
__tablename__ = 'triggers'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
trigger = mapped_column(String(15), unique=True)
|
||||
|
||||
class User_Main_Settings(Base):
|
||||
__tablename__ = 'user_main_settings'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
tg_id = mapped_column(ForeignKey("user_telegram_id.tg_id"))
|
||||
|
||||
trading_mode = mapped_column(ForeignKey("trading_modes.mode"))
|
||||
margin_type = mapped_column(ForeignKey("margin_types.type"))
|
||||
size_leverage = mapped_column(Integer(), default=1)
|
||||
starting_quantity = mapped_column(Integer(), default=1)
|
||||
martingale_factor = mapped_column(Integer(), default=1)
|
||||
maximal_quantity = mapped_column(Integer(), default=10)
|
||||
|
||||
class User_Risk_Management_Settings(Base):
|
||||
__tablename__ = 'user_risk_management_settings'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
tg_id = mapped_column(ForeignKey("user_telegram_id.tg_id"))
|
||||
|
||||
price_profit = mapped_column(Integer(), default=1)
|
||||
price_loss = mapped_column(Integer(), default=1)
|
||||
max_risk_deal = mapped_column(Integer(), default=1)
|
||||
|
||||
class User_Condition_Settings(Base):
|
||||
__tablename__ = 'user_condition_settings'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
tg_id = mapped_column(ForeignKey("user_telegram_id.tg_id"))
|
||||
|
||||
trigger = mapped_column(ForeignKey("triggers.trigger"))
|
||||
filter_time = mapped_column(String(25), default='???')
|
||||
filter_volatility = mapped_column(Boolean, default=False)
|
||||
external_cues = mapped_column(Boolean, default=False)
|
||||
tradingview_cues = mapped_column(Boolean, default=False)
|
||||
webhook = mapped_column(String(40), default='')
|
||||
ai_analytics = mapped_column(Boolean, default=False)
|
||||
|
||||
class User_Additional_Settings(Base):
|
||||
__tablename__ = 'user_additional_settings'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
tg_id = mapped_column(ForeignKey("user_telegram_id.tg_id"))
|
||||
|
||||
pattern_save = mapped_column(Boolean, default=False)
|
||||
autostart = mapped_column(Boolean, default=False)
|
||||
notifications = mapped_column(Boolean, default=False)
|
||||
|
||||
async def async_main():
|
||||
async with engine.begin() as conn:
|
||||
await conn.run_sync(Base.metadata.create_all)
|
||||
|
||||
# Заполнение таблиц
|
||||
modes = ['Long', 'Short', 'Switch', 'Smart']
|
||||
for mode in modes:
|
||||
result = await conn.execute(select(Trading_Mode).where(Trading_Mode.mode == mode))
|
||||
if not result.first():
|
||||
logger.info("Заполение таблицы режима торговли")
|
||||
await conn.execute(Trading_Mode.__table__.insert().values(mode=mode))
|
||||
|
||||
types = ['Изолированный', 'Кросс']
|
||||
for type in types:
|
||||
result = await conn.execute(select(Margin_type).where(Margin_type.type == type))
|
||||
if not result.first():
|
||||
logger.info("Заполение таблицы типов маржи")
|
||||
await conn.execute(Margin_type.__table__.insert().values(type=type))
|
||||
|
||||
triggers = ['Ручной', 'Автоматический', 'TradingView']
|
||||
for trigger in triggers:
|
||||
result = await conn.execute(select(Trigger).where(Trigger.trigger == trigger))
|
||||
if not result.first():
|
||||
logger.info("Заполение таблицы триггеров")
|
||||
await conn.execute(Trigger.__table__.insert().values(trigger=trigger))
|
174
app/telegram/database/requests.py
Normal file
174
app/telegram/database/requests.py
Normal file
@@ -0,0 +1,174 @@
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
from app.telegram.database.models import async_session
|
||||
from app.telegram.database.models import User_Telegram_Id as UTi
|
||||
from app.telegram.database.models import User_Main_Settings as UMS
|
||||
from app.telegram.database.models import User_Risk_Management_Settings as URMS
|
||||
from app.telegram.database.models import User_Condition_Settings as UCS
|
||||
from app.telegram.database.models import User_Additional_Settings as UAS
|
||||
from app.telegram.database.models import Trading_Mode
|
||||
from app.telegram.database.models import Margin_type
|
||||
from app.telegram.database.models import Trigger
|
||||
|
||||
import app.telegram.functions.functions as func # functions
|
||||
|
||||
from sqlalchemy import select, delete, update
|
||||
|
||||
# SET_DB
|
||||
async def save_tg_id_new_user(tg_id):
|
||||
async with async_session() as session:
|
||||
user = await session.scalar(select(UTi).where(UTi.tg_id == tg_id))
|
||||
|
||||
if not user:
|
||||
session.add(UTi(tg_id=tg_id))
|
||||
|
||||
logger.info("Новый пользователь был добавлен в бд")
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def set_new_user_default_main_settings(tg_id, trading_mode, margin_type) -> None:
|
||||
async with async_session() as session:
|
||||
settings = await session.scalar(select(UMS).where(UMS.tg_id == tg_id))
|
||||
|
||||
if not settings:
|
||||
session.add(UMS(
|
||||
tg_id=tg_id,
|
||||
trading_mode=trading_mode,
|
||||
margin_type=margin_type,
|
||||
))
|
||||
|
||||
logger.info("Основные настройки нового пользователя были заполнены")
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def set_new_user_default_risk_management_settings(tg_id) -> None:
|
||||
async with async_session() as session:
|
||||
settings = await session.scalar(select(URMS).where(URMS.tg_id == tg_id))
|
||||
|
||||
if not settings:
|
||||
session.add(URMS(
|
||||
tg_id=tg_id
|
||||
))
|
||||
|
||||
logger.info("Риск-Менеджмент настройки нового пользователя были заполнены")
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def set_new_user_default_condition_settings(tg_id, trigger) -> None:
|
||||
async with async_session() as session:
|
||||
settings = await session.scalar(select(UCS).where(UCS.tg_id == tg_id))
|
||||
|
||||
if not settings:
|
||||
session.add(UCS(
|
||||
tg_id=tg_id,
|
||||
trigger=trigger
|
||||
))
|
||||
|
||||
logger.info("Условные настройки нового пользователя были заполнены")
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def set_new_user_default_additional_settings(tg_id) -> None:
|
||||
async with async_session() as session:
|
||||
settings = await session.scalar(select(UAS).where(UAS.tg_id == tg_id))
|
||||
|
||||
if not settings:
|
||||
session.add(UAS(
|
||||
tg_id=tg_id,
|
||||
))
|
||||
|
||||
logger.info("Дополнительные настройки нового пользователя были заполнены")
|
||||
|
||||
await session.commit()
|
||||
|
||||
# GET_DB
|
||||
async def check_user(tg_id):
|
||||
async with async_session() as session:
|
||||
user = await session.scalar(select(UTi).where(UTi.tg_id == tg_id))
|
||||
return user
|
||||
|
||||
async def get_for_registration_trading_mode():
|
||||
async with async_session() as session:
|
||||
mode = await session.scalar(select(Trading_Mode.mode).where(Trading_Mode.id == 1))
|
||||
return mode
|
||||
|
||||
async def get_for_registration_margin_type():
|
||||
async with async_session() as session:
|
||||
type = await session.scalar(select(Margin_type.type).where(Margin_type.id == 1))
|
||||
return type
|
||||
|
||||
async def get_for_registration_trigger():
|
||||
async with async_session() as session:
|
||||
trigger = await session.scalar(select(Trigger.trigger).where(Trigger.id == 1))
|
||||
return trigger
|
||||
|
||||
async def get_user_main_settings(tg_id):
|
||||
async with async_session() as session:
|
||||
user = await session.scalar(select(UMS).where(UMS.tg_id == tg_id))
|
||||
|
||||
if user:
|
||||
logger.info("Получение основных настроек пользователя")
|
||||
|
||||
trading_mode = await session.scalar(select(UMS.trading_mode).where(UMS.tg_id == tg_id))
|
||||
margin_mode = await session.scalar(select(UMS.margin_type).where(UMS.tg_id == tg_id))
|
||||
size_leverage = await session.scalar(select(UMS.size_leverage).where(UMS.tg_id == tg_id))
|
||||
starting_quantity = await session.scalar(select(UMS.starting_quantity).where(UMS.tg_id == tg_id))
|
||||
martingale_factor = await session.scalar(select(UMS.martingale_factor).where(UMS.tg_id == tg_id))
|
||||
maximal_quantity = await session.scalar(select(UMS.maximal_quantity).where(UMS.tg_id == tg_id))
|
||||
|
||||
data = {
|
||||
'trading_mode': trading_mode,
|
||||
'margin_type': margin_mode,
|
||||
'size_leverage': size_leverage,
|
||||
'starting_quantity': starting_quantity,
|
||||
'martingale_factor': martingale_factor,
|
||||
'maximal_quantity': maximal_quantity
|
||||
}
|
||||
|
||||
return data
|
||||
|
||||
# UPDATE_DB
|
||||
async def update_trade_mode_user(tg_id, trading_mode) -> None:
|
||||
async with async_session() as session:
|
||||
mode = await session.scalar(select(Trading_Mode.mode).where(Trading_Mode.mode == trading_mode))
|
||||
|
||||
if mode:
|
||||
logger.info("Изменен трейд мод")
|
||||
await session.execute(update(UMS).where(UMS.tg_id == tg_id).values(trading_mode = mode))
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def update_margin_type(tg_id, margin_type) -> None:
|
||||
async with async_session() as session:
|
||||
type = await session.scalar(select(Margin_type.type).where(Margin_type.type == margin_type))
|
||||
|
||||
if type:
|
||||
logger.info("Изменен тип маржи")
|
||||
await session.execute(update(UMS).where(UMS.tg_id == tg_id).values(margin_type = type))
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def update_size_leverange(tg_id, num):
|
||||
async with async_session() as session:
|
||||
await session.execute(update(UMS).where(UMS.tg_id == tg_id).values(size_leverage = num))
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def update_starting_quantity(tg_id, num):
|
||||
async with async_session() as session:
|
||||
await session.execute(update(UMS).where(UMS.tg_id == tg_id).values(starting_quantity = num))
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def update_martingale_factor(tg_id, num):
|
||||
async with async_session() as session:
|
||||
await session.execute(update(UMS).where(UMS.tg_id == tg_id).values(martingale_factor = num))
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def update_maximal_quantity(tg_id, num):
|
||||
async with async_session() as session:
|
||||
await session.execute(update(UMS).where(UMS.tg_id == tg_id).values(maximal_quantity = num))
|
||||
|
||||
await session.commit()
|
Reference in New Issue
Block a user