1
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from .base_sync import BaseSync
|
||||
from loguru import logger
|
||||
from typing import List, Dict
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy import text, select, func, and_
|
||||
from models.orm_models import StrategyKX
|
||||
|
||||
class AccountSyncBatch(BaseSync):
|
||||
@@ -12,14 +12,9 @@ class AccountSyncBatch(BaseSync):
|
||||
try:
|
||||
logger.info(f"开始批量同步账户信息,共 {len(accounts)} 个账号")
|
||||
|
||||
# 测试
|
||||
# res = await self.redis_client._get_account_info_from_redis(10140, 5548, 'mt5')
|
||||
# print(res)
|
||||
# return
|
||||
# 收集所有账号的数据
|
||||
all_account_data = await self.redis_client._collect_all_account_data(accounts)
|
||||
|
||||
|
||||
if not all_account_data:
|
||||
logger.info("无账户信息数据需要同步")
|
||||
return
|
||||
@@ -182,3 +177,44 @@ class AccountSyncBatch(BaseSync):
|
||||
logger.error(f"批量查询现有记录失败: {e}")
|
||||
|
||||
return existing_records
|
||||
|
||||
async def networth(self, accounts: Dict[str, Dict]):
|
||||
"""计算所有策略的净值"""
|
||||
|
||||
# 从accounts中获取所有策略的st_id
|
||||
st_ids = set()
|
||||
for account in accounts.values():
|
||||
st_ids.add(account['st_id'])
|
||||
|
||||
stmt = select(
|
||||
StrategyKX.st_id,
|
||||
StrategyKX.time,
|
||||
func.sum(StrategyKX.balance).label('balance_sum'),
|
||||
func.sum(StrategyKX.profit).label('profit_sum'),
|
||||
func.sum(StrategyKX.withdrawal).label('withdrawal_sum'),
|
||||
func.sum(StrategyKX.deposit).label('deposit_sum'),
|
||||
func.sum(StrategyKX.other).label('other_sum')
|
||||
).where(
|
||||
StrategyKX.st_id.in_(st_ids)
|
||||
).group_by(
|
||||
StrategyKX.st_id,
|
||||
StrategyKX.time
|
||||
).order_by(
|
||||
StrategyKX.time.asc(),
|
||||
StrategyKX.st_id.asc()
|
||||
)
|
||||
|
||||
results = self.session.execute(stmt).all()
|
||||
|
||||
return [
|
||||
{
|
||||
'st_id': row.st_id,
|
||||
'time': row.time,
|
||||
'balance_sum': float(row.balance_sum) if row.balance_sum else 0.0,
|
||||
'profit_sum': float(row.profit_sum) if row.profit_sum else 0.0,
|
||||
'withdrawal_sum': float(row.withdrawal_sum) if row.withdrawal_sum else 0.0,
|
||||
'deposit_sum': float(row.deposit_sum) if row.deposit_sum else 0.0,
|
||||
'other_sum': float(row.other_sum) if row.other_sum else 0.0,
|
||||
}
|
||||
for row in results
|
||||
]
|
||||
@@ -6,6 +6,7 @@ import time
|
||||
import json
|
||||
from typing import Dict
|
||||
import utils.helpers as helpers
|
||||
import redis
|
||||
|
||||
from utils.redis_client import RedisClient
|
||||
from config.settings import SYNC_CONFIG
|
||||
@@ -15,6 +16,7 @@ from .account_sync import AccountSyncBatch
|
||||
from utils.redis_batch_helper import RedisBatchHelper
|
||||
from config.settings import COMPUTER_NAMES, COMPUTER_NAME_PATTERN
|
||||
from typing import List, Dict, Any, Set, Optional
|
||||
from config.settings import REDIS_CONFIG
|
||||
|
||||
class SyncManager:
|
||||
"""同步管理器(完整批量版本)"""
|
||||
@@ -62,7 +64,8 @@ class SyncManager:
|
||||
async def start(self):
|
||||
"""启动同步服务"""
|
||||
logger.info(f"同步服务启动,间隔 {self.sync_interval} 秒")
|
||||
|
||||
# await self.cp()
|
||||
# return
|
||||
while self.is_running:
|
||||
try:
|
||||
|
||||
@@ -155,4 +158,62 @@ class SyncManager:
|
||||
if hasattr(syncer, 'db_manager'):
|
||||
syncer.db_manager.close()
|
||||
|
||||
logger.info("同步服务停止")
|
||||
logger.info("同步服务停止")
|
||||
|
||||
async def cp(self):
|
||||
"""把Redis 0库的资产数据复制到Redis 1库"""
|
||||
# 创建到Redis 0库的连接
|
||||
redis_0 = redis.Redis(
|
||||
host=REDIS_CONFIG['host'], # 你的Redis主机
|
||||
port=REDIS_CONFIG['port'], # 你的Redis端口
|
||||
db=0, # 数据库0
|
||||
password=None, # 如果有密码
|
||||
decode_responses=True # 自动解码为字符串
|
||||
)
|
||||
|
||||
# 创建到Redis 1库的连接
|
||||
redis_1 = redis.Redis(
|
||||
host=REDIS_CONFIG['host'],
|
||||
port=REDIS_CONFIG['port'],
|
||||
db=1, # 数据库1
|
||||
password=None,
|
||||
decode_responses=True
|
||||
)
|
||||
accounts = self.redis_client.get_accounts_from_redis()
|
||||
print(f"共 {len(accounts)} 个账号")
|
||||
all_kid = accounts.keys()
|
||||
|
||||
keys1 = redis_0.keys("Bybit_fin_*")
|
||||
# print(f"找到 {len(keys1)} 个匹配的键")
|
||||
keys2 = redis_0.keys("Metatrader_fin_*")
|
||||
# print(f"找到 {len(keys2)} 个匹配的键")
|
||||
all_keys = keys1 + keys2
|
||||
print(f"共 {len(all_keys)} 个键")
|
||||
for key in all_keys:
|
||||
key_split = key.split("_")
|
||||
k_id = key_split[-1]
|
||||
if k_id not in all_kid:
|
||||
continue
|
||||
exchange_id = None
|
||||
if key_split[0] == "Bybit":
|
||||
exchange_id = "bybit"
|
||||
elif key_split[0] == "Metatrader":
|
||||
exchange_id = "mt5"
|
||||
# data = redis_0.hget(key)
|
||||
print(f"开始处理键 {key} 的数据")
|
||||
data = redis_0.hgetall(key)
|
||||
for k, v in data.items():
|
||||
# print(f"{k}")
|
||||
data_dict = json.loads(v)
|
||||
data_dict['lz_amount'] = float(data_dict['lz_money'])
|
||||
del data_dict['lz_money']
|
||||
if data_dict['lz_type'] == 'lz_balance':
|
||||
row_key = k
|
||||
else:
|
||||
row_key = f"fund_{k}"
|
||||
# print(row_key)
|
||||
redis_1.hset(f"{exchange_id}:balance:{data_dict['k_id']}",row_key,json.dumps(data_dict))
|
||||
# print(f"键 {key} 的数据为 {data}")
|
||||
redis_1.close()
|
||||
redis_0.close()
|
||||
print("复制完成")
|
||||
@@ -15,6 +15,7 @@ class OrderSyncBatch(BaseSync):
|
||||
|
||||
async def sync_batch(self, accounts: Dict[str, Dict]):
|
||||
"""批量同步所有账号的订单数据"""
|
||||
return
|
||||
try:
|
||||
logger.info(f"开始批量同步订单数据,共 {len(accounts)} 个账号")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user