import uuid import trade_logic import pandas as pd from sqlalchemy import create_engine # from autobasic import mts import socket from tools import * import datetime import logging import sys import time import smtplib from email.header import Header from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication # from voice_notification import call_user import getpass import uuid from sqlalchemy import text from sqlalchemy.exc import OperationalError, SQLAlchemyError from connect_wifi import connect_wifi import logging import os from logging.handlers import RotatingFileHandler def setup_logging(): """统一配置日志系统""" root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) # 移除所有现有处理器(避免重复) for handler in root_logger.handlers[:]: root_logger.removeHandler(handler) # 控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 控制台只显示INFO及以上级别 # 文件处理器 file_handler = logging.FileHandler('Auto_Trade_Log.log', encoding='utf-8') file_handler.setLevel(logging.DEBUG) # 文件记录所有DEBUG及以上级别 # 格式化 formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) root_logger.addHandler(console_handler) root_logger.addHandler(file_handler) def create_conn(): """ Check if the database connection is valid before afternoon trading session Only called once at the beginning of the afternoon session """ return create_engine('mysql+pymysql://cn_ainvest_db:cn_ainvest_sd3a1@rm-2zewagytttzk6f24xno.mysql.rds.aliyuncs.com:3306/ticker_daily_original_database', encoding="utf-8", echo=False) class auto_trade: def __init__(self, users, op,order_id): self.op = op self.users = users self.order_id = order_id def trade_main(self,user): user_main = trade_logic.Trade(user, self.op,self.order_id) print('3333') user_main.trade_by_op() def trades(self): for user in self.users: logger.info(user) try: self.trade_main(user) reset_proxy_to_default() if not connect_wifi('ZTE_A5DB9D','1234567890'): logger.info("无法建立网络连接,请检查配置") else: logger.info("网络已就绪") writer = ExcelDataWriter() writer.update_latest_record( status='成功', remarks='测试数据', risk_response='' ) logger.info(f'{user}交易已经完成') except Exception as er: reset_proxy_to_default() if not connect_wifi('ZTE_A5DB9D','1234567890'): # "4G-UFI-18C8", "1234567890" 'Redmi K40','123456789' logger.info("无法建立网络连接,请检查配置") else: logger.info("网络已就绪") ip_address = get_host_ip() try: send_email('auto trade error',(ip_address+' '+user)) except Exception as e: logger.error('----邮箱发送报错----') logger.error(e) if "UnboundLocalError: local variable 'user' referenced before assignment" in str(sys.exc_info): pass elif user=='15033920398': continue else: # call_user(server_describe='trade error') # call_user(phonenum = '13436825841',server_describe='trade error') logger.error('交易錯誤') logger.error(er) # writer = ExcelDataWriter() writer.update_latest_record( status='失败', remarks='测试数据', risk_response='' ) continue print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')) # def get_host_ip(): # """ # 查询本机ip地址 # :return: # """ # try: # s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # s.connect(('8.8.8.8',80)) # ip=s.getsockname()[0] # finally: # s.close() # return ip def get_userlist(order_id): today = str(datetime.date.today()) Intranat_ip = get_host_ip() # Intranat_ip = '10.0.0.15' engine_user_center = create_engine( 'mysql+pymysql://cn_ainvest_db:cn_ainvest_sd3a1@rm-2zewagytttzk6f24xno.' 'mysql.rds.aliyuncs.com:3306/user_center', encoding="utf-8", echo=False) logger.info('----正在获取用户列表----') logger.info(f'{order_id}') logger.info(Intranat_ip) userlist = (pd.read_sql(f'select Distinct Account_name from trade_instruction where ID_Order = "{order_id}" and Intranet_IP ="{Intranat_ip}"',engine_user_center))['Account_name'].tolist() logger.info('----成功获取用户列表----') return userlist def send_email(subject: str, message: str, receive_users: list = ['1055017575@qq.com','2293908092@qq.com'], file_path: str = 'no_path'): ''' Parameters ---------- subject : str title. message : str message. receive_users : list, optional receive. The default is ['1055017575@qq.com']. file_path : str, optional path. The default is 'no_path'. Returns ------- None. ''' # send_user = 'it_ainvest@zohomail.cn' # zoho # send_pwd = '2022@AIWANTE' # 密码 # receive_user = receive_users # # receive_user = ['1055017575@qq.com','yi.zhou@ainvest.io','2293908092@qq.com'] # # msg = MIMEMultipart() # msg['subject'] = subject # msg['from'] = send_user # msg['to'] = ','.join(receive_user) # msg.attach(MIMEText(message, 'html', 'utf-8')) # # if file_path != 'no_path': # part = MIMEApplication(open(file_path, 'rb').read()) # file_name = file_path.split('/')[-1] # part.add_header('Content-Disposition', 'attachment', filename=file_name) # msg.attach(part) # else: # pass # # server = smtplib.SMTP_SSL("smtp.zoho.com.cn", 465) # smtp.163.com # server.login(send_user, send_pwd) # server.sendmail(send_user, receive_user, msg.as_string()) # server.quit() # print('邮件发送成功') send_user = 'ainvest_family@ainvest.io' # zoho send_pwd = '2016@aiwante' # 密码 receive_user = receive_users # receive_user = ['1055017575@qq.com','yi.zhou@ainvest.io','2293908092@qq.com'] msg = MIMEMultipart() msg['subject'] = subject msg['from'] = send_user msg['to'] = ','.join(receive_user) msg.attach(MIMEText(message, 'html', 'utf-8')) if file_path != 'no_path': part = MIMEApplication(open(file_path, 'rb').read()) file_name = file_path.split('/')[-1] part.add_header('Content-Disposition', 'attachment', filename=file_name) msg.attach(part) else: pass server = smtplib.SMTP_SSL("smtp.zoho.com", 465) # smtp.163.com server.login(send_user, send_pwd) server.sendmail(send_user, receive_user, msg.as_string()) server.quit() print('邮件发送成功') def trade_instruction_monitor(last_order: int = 0): ''' 交易监控 Returns ------- None. ''' engine_user_center = create_engine( 'mysql+pymysql://cn_ainvest_db:cn_ainvest_sd3a1@rm-2zewagytttzk6f24xno.' 'mysql.rds.aliyuncs.com:3306/user_center', encoding="utf-8", echo=False) if last_order == 0: last_order_id = str( int(pd.read_sql(f'select max(ID_Order) from trade_instruction', engine_user_center).values.tolist()[0][0])) elif last_order == 1: last_order_id = '-1' else: last_order_id = last_order while True: order_id = str( int(pd.read_sql(f'select max(ID_Order) from trade_instruction', engine_user_center).values.tolist()[0][0])) if order_id == last_order_id: time.sleep(1) pass elif int(order_id) - int(last_order_id) > 1: order_id = str(int(last_order_id)+1) ip = get_host_ip() # message = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ' '+ str(ip) +' ' + order_id + ' begin trade' # # send_email('自动交易提醒', message) time.sleep(1) op = str(pd.read_sql(f'select Trade_Type from trade_instruction where ID_Order="{order_id}"', engine_user_center).values.tolist()[0][0]) userlist = get_userlist(order_id) logger.info(userlist) logger.info('----开始自动交易----') trade_main = auto_trade(userlist,op,order_id) trade_main.trades() logger.info('----结束自动交易') last_order_id = order_id elif int(order_id) - int(last_order_id) == 1: ip = get_host_ip() message = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ' ' + str( ip) + ' ' + order_id + ' begin trade' # send_email('自动交易提醒', message) time.sleep(1) op = str(pd.read_sql(f'select Trade_Type from trade_instruction where ID_Order="{order_id}"', engine_user_center).values.tolist()[0][0]) userlist = get_userlist(order_id) print(userlist) trade_main = auto_trade(userlist, op,order_id) trade_main.trades() last_order_id = order_id else: time.sleep(0.5) pass if __name__ == '__main__': # call_user() # 测试 setup_logging() # 获取当前模块的logger logger = logging.getLogger(__name__) logger.info("程序启动") reset_proxy_to_default() if not connect_wifi('ZTE_A5DB9D','1234567890'): # "4G-UFI-18C8", "1234567890" 'Redmi K40','123456789' logger.info("无法建立网络连接,请检查配置") else: logger.info("网络已就绪") logger.info('初始化全局代理成功') trade_instruction_monitor(0) # trade_instruction_monitor(115138)