This commit is contained in:
guoyz 2025-04-15 23:06:41 +08:00
parent e36c9baa0e
commit 1378b7f87b
2 changed files with 157 additions and 8 deletions

79
EmailTest.py Executable file
View File

@ -0,0 +1,79 @@
import imaplib
import smtplib
import email
from email.header import decode_header
from email.mime.text import MIMEText
from imapclient import IMAPClient
from email.parser import Parser
def send_email(subject, body, to_email):
# 这个函数名为send_email它接受三个参数
# subject邮件主题、body邮件内容和to_email收件人的电子邮件地址
from_email = 'yizeguo1@126.com'
mail_pass = 'CHRIZKWQSRWYLBOL'# 126授权码
# mail_pass = 'pwvzuqbiysqshgha'# qq授权码
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = from_email
msg['To'] = to_email
server = smtplib.SMTP('smtp.126.com', 25)
# server = smtplib.SMTP('smtp.qq.com', 465)
server.starttls()
server.login(from_email, mail_pass)
server.sendmail(from_email, to_email, msg.as_string())
server.quit()
def get_latest_email_body(to_email):
# 连接到126邮箱的IMAP服务器
mail = IMAPClient("imap.126.com")
from_email = 'yizeguo1@126.com'
mail_pass = 'CHRIZKWQSRWYLBOL'# 126授权码
mail.login(from_email, mail_pass)
mail.id_({"name": "IMAPClient", "version": "2.1.0"})
# mail.list_folders()
print(mail.list_folders())
# 选择收件箱
# messages = mail.select_folder(folder="inbox", readonly=True)
mail.select_folder('INBOX')
# 搜索发件人为指定邮箱的所有邮件
encoded_email = to_email.encode('utf-8')
# 构建搜索条件HEADER FROM "<发件人邮箱>"
search_criteria = f'FROM "{encoded_email.decode("utf-8")}"'
# 执行搜索操作
messages = mail.search(search_criteria)
# print(f"Search Status: {status}")
print(f"Matching Emails: {messages}")
response = mail.fetch(messages, ['FLAGS', 'RFC822.SIZE'])
# `response` is keyed by message id and contains parsed,
# converted response items.
for message_id, data in response.items():
print('{id}: {size} bytes, flags={flags}'.format(
id=message_id,
size=data[b'RFC822.SIZE'],
flags=data[b'FLAGS']))
if __name__ == "__main__":
# send_email("测试", 'test', "guoyize2209@163.com")
# id_info = {
# 'name': 'myname',
# 'version': '1.0.0',
# 'vendor': 'myclient',
# 'support-email': 'yizeguo1@126.com'
# }
body = get_latest_email_body("guoyize2209@163.com")
# if body:
# print("Latest email body:", body)
# else:
# print("No plain text email found.")

View File

@ -228,10 +228,10 @@ class TurtleTrading(object):
def system1EnterNormal(self, PriceNow, TempDonchian20Upper, BreakOutLog):
# 没有持仓且价格向上突破---此时包含两种情形1 对某标的首次使用系统2 已发生过突破,此时上次突破天然是失败的
if self.TrigerTime == 0 and PriceNow > TempDonchian20Upper[-1]:
if self.TrigerTime == 0 and PriceNow > TempDonchian20Upper:
# 买入
return True
elif self.TrigerTime != 0 and PriceNow > TempDonchian20Upper[-1]:
elif PriceNow > TempDonchian20Upper:#todo !=0不会满足条件 先跳过
self.system1BreakoutValid(PriceNow)
if BreakOutLog[-1][5] == 'Lose': # TT!= 0且突破且上一次突破unseccessful
return True
@ -257,14 +257,31 @@ class TurtleTrading(object):
self.BreakOutLog[-1][5] = 'None'
# 一天结束计算ATR计算唐奇安通道追加到已有的mysql数据库中
def system1Out(self, PriceNow, TempDonchian10Lower):
def system_1_Out(self, PriceNow, TempDonchian10Lower):
# 退出:低于20日最低价多头方向,空头以突破20日最高价为止损价格--有持仓且价格向下突破
if self.TrigerTime != 0 and PriceNow < TempDonchian10Lower[-1]:
if self.TrigerTime != 0 and PriceNow < TempDonchian10Lower:
# 退出
return True
else:
return False
def add(self, PriceNow):
"""加仓
"""
if self.TrigerTime < 4 and PriceNow > self.BuyStates[self.TrigerTime - 1][2]:#todo BuyStates是空的
# 买入
return True
else:
return False
def system_1_stop(self, PriceNow):
"""止损判断:如果当前价格<上一次买入后的止损价格则止损
"""
if PriceNow < self.BuyStates[self.TrigerTime - 1][3]:
# 买入
return True
else:
return False
def day_end(self):
pass
@ -297,8 +314,8 @@ class TurtleTrading_OnTime(object):
# mysql_database.insert_db(etf_data, "etf_price", True, "代码")
return stock_data, etf_data
def Start_S1_system(self):
"""启动S1系统
def Start_short_system(self):
"""启动short系统
"""
# ------------------准备阶段--------------------
@ -308,7 +325,7 @@ class TurtleTrading_OnTime(object):
self.turtle.Donchian_20_up = self.turtle.CurrentData['Donchian_20_upper'].iloc[-1]
self.turtle.Donchian_50_up = self.turtle.CurrentData['Donchian_50_upper'].iloc[-1]
self.turtle.Donchian_10_down = self.turtle.CurrentData['Donchian_10_lower'].iloc[-1]
self.turtle.CalPositionSize()
# ------------------实时监测阶段--------------------
# 9:00 1、判断是否是新的一周是则重新计算Position Size
# 判断是否是新的一周
@ -319,8 +336,61 @@ class TurtleTrading_OnTime(object):
# 根据typecode, 取得实时价格self.turtle.PriceNow
if self.turtle.Type == "stock":
self.turtle.PriceNow = stock_data[stock_data['代码'] == self.turtle.TradeCode]['最新价'].iloc[-1]
elif self.turtle.Type == "etf":
self.turtle.PriceNow = etf_data[etf_data['代码'] == self.turtle.TradeCode]['当前-单位净值'].iloc[-1]
# 空仓
if self.turtle.TrigerTime == 0:
if self.turtle.system1EnterNormal(self.turtle.PriceNow, self.turtle.Donchian_20_up, self.turtle.BreakOutLog):
# 发出买入指令
pass
elif self.turtle.system1EnterSafe(self.turtle.PriceNow, self.turtle.Donchian_50_up):
# 发出买入指令
pass
# 已有仓位,加仓 / 止损 / 退出
elif 1<=self.turtle.TrigerTime <= 3:
# ---------------------加仓---------------------
# 继续突破
if self.turtle.system1EnterNormal(self.turtle.PriceNow, self.turtle.Donchian_20_up, self.turtle.BreakOutLog):
# 发出买入指令
pass
#
elif self.turtle.system1EnterSafe(self.turtle.PriceNow, self.turtle.Donchian_50_up):
# 发出买入指令
pass
# 触发加仓价格
elif self.turtle.add(self.turtle.PriceNow):
# 发出买入指令
pass
# ---------------------止损-------------------
elif self.turtle.system_1_stop(self.turtle.PriceNow):
# 发出卖出指令
pass
# ---------------------止盈退出---------------------
elif self.turtle.system_1_Out(self.turtle.PriceNow, self.turtle.Donchian_10_down):
# 发出卖出指令
pass
# 满仓 止损 / 退出
elif self.turtle.TrigerTime == 4:
# ---------------------止损-------------------
if self.turtle.system_1_stop(self.turtle.PriceNow):
# 发出卖出指令
pass
# ---------------------止盈退出---------------------
elif self.turtle.system_1_Out(self.turtle.PriceNow, self.turtle.Donchian_10_down):
# 发出卖出指令
pass
# ------------------结束阶段--------------------
# 数据库更新当天数据增加ATR、donchian数据