Compare commits

...

4 Commits

3 changed files with 120 additions and 95 deletions

View File

@ -5,7 +5,7 @@ from email.header import decode_header
from email.mime.text import MIMEText from email.mime.text import MIMEText
from imapclient import IMAPClient from imapclient import IMAPClient
from email.parser import Parser from email.parser import Parser
import base64
def send_email(subject, body, to_email): def send_email(subject, body, to_email):
# 这个函数名为send_email它接受三个参数 # 这个函数名为send_email它接受三个参数
# subject邮件主题、body邮件内容和to_email收件人的电子邮件地址 # subject邮件主题、body邮件内容和to_email收件人的电子邮件地址
@ -167,8 +167,8 @@ if __name__ == "__main__":
# 'vendor': 'myclient', # 'vendor': 'myclient',
# 'support-email': 'yizeguo1@126.com' # 'support-email': 'yizeguo1@126.com'
# } # }
body = get_latest_email_body("guoyize2209@163.com") get_latest_email_body("guoyize2209@163.com")
# if body: # if body:
# print("Latest email body:", body) # print("Latest email body:", body)
# else: # else:
# print("No plain text email found.") # print("No plain text email found.")

View File

@ -10,7 +10,7 @@ import stock_database
import mysql_database import mysql_database
from EmailTest import send_email, parse_return_email from EmailTest import send_email, parse_return_email
from dataclasses import dataclass from dataclasses import dataclass
import time
@dataclass @dataclass
class BuyState: class BuyState:
trigger_time: float # 触发次数 trigger_time: float # 触发次数
@ -356,16 +356,16 @@ class TurtleTrading_OnTime(object):
#每隔1分钟检测回信解析邮件。 #每隔1分钟检测回信解析邮件。
parsed_email_flag = False parsed_email_flag = False
datetime.time.sleep(60) while not parsed_email_flag:
while parsed_email_flag: time.sleep(60) # 每次尝试前等待 60 秒
parse_states, buy_price, buy_share, fee = parse_return_email(
self.user_email, send_email_time
)
parse_states, buy_price, buy_share, fee = parse_return_email(self.user_email, send_email_time) if parse_states:
if parse_states == True:
parsed_email_flag = True parsed_email_flag = True
break break
else:
datetime.time.sleep(60)
# 成功买入 # 成功买入
self.turtle.TrigerTime += 1 self.turtle.TrigerTime += 1
# 记录self.turtle.BuyStates # 记录self.turtle.BuyStates
@ -408,16 +408,15 @@ class TurtleTrading_OnTime(object):
#每隔1分钟检测回信解析邮件。 #每隔1分钟检测回信解析邮件。
parsed_email_flag = False parsed_email_flag = False
datetime.time.sleep(60) while not parsed_email_flag:
while parsed_email_flag: time.sleep(60) # 每次尝试前等待 60 秒
parse_states, buy_price, buy_share, fee = parse_return_email(
self.user_email, send_email_time
)
parse_states, buy_price, buy_share, fee = parse_return_email(self.user_email, send_email_time) if parse_states:
if parse_states == True:
parsed_email_flag = True parsed_email_flag = True
break break
else:
datetime.time.sleep(60)
# 成功买入 # 成功买入
self.turtle.TrigerTime += 1 self.turtle.TrigerTime += 1
@ -470,17 +469,17 @@ class TurtleTrading_OnTime(object):
send_email_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") send_email_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 每隔1分钟检测回信解析邮件。 # 每隔1分钟检测回信解析邮件。
parsed_email_flag = False parsed_email_flag = False
datetime.time.sleep(60) while not parsed_email_flag:
while parsed_email_flag: time.sleep(60) # 每次尝试前等待 60 秒
parse_states, sale_price, sale_share, fee = parse_return_email(
self.user_email, send_email_time
)
parse_states, sale_price, sale_share, fee = parse_return_email(self.user_email, send_email_time) if parse_states:
if parse_states == True:
parsed_email_flag = True parsed_email_flag = True
break break
else:
datetime.time.sleep(60)
# 成功卖出 # 成功卖出
@ -519,16 +518,15 @@ class TurtleTrading_OnTime(object):
# 每隔1分钟检测回信解析邮件。 # 每隔1分钟检测回信解析邮件。
parsed_email_flag = False parsed_email_flag = False
datetime.time.sleep(60) while not parsed_email_flag:
while parsed_email_flag: time.sleep(60) # 每次尝试前等待 60 秒
parse_states, sale_price, sale_share, fee = parse_return_email(
self.user_email, send_email_time
)
parse_states, sale_price, sale_share, fee = parse_return_email(self.user_email, send_email_time) if parse_states:
if parse_states == True:
parsed_email_flag = True parsed_email_flag = True
break break
else:
datetime.time.sleep(60)
# 成功卖出 # 成功卖出
self.turtle.TrigerTime = 0 self.turtle.TrigerTime = 0
@ -548,6 +546,90 @@ class TurtleTrading_OnTime(object):
Net_value=sale_price * sale_share, Net_value=sale_price * sale_share,
Net_return=abs(self.turtle.Capital - available_cash)) Net_return=abs(self.turtle.Capital - available_cash))
self.turtle.tradeslog.append(sale_this_time) self.turtle.tradeslog.append(sale_this_time)
def run_short_trading_loop(self):
while True:
# 获取当前时间
now = datetime.now().time()
# 判断当前时间是否在交易时段内9:30-11:30 或 13:00-15:00
is_trading_time = (
(now.hour == 9 and now.minute >= 30) or
(now.hour == 10 and 0 <= now.minute <= 59) or
(now.hour == 11 and now.minute <= 30) or
(now.hour == 13 and 0 <= now.minute <= 59) or
(now.hour == 14 and 0 <= now.minute <= 59) or
(now.hour == 15 and now.minute <= 0)
)
if not is_trading_time:
# 非交易时间,等待 1 分钟后继续循环
time.sleep(60)
continue
# 获取股票和ETF数据
stock_data, etf_data = self.get_stocks_data()
# 根据类型获取当前价格
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
):
self.Buy_stock(self.turtle.PriceNow)
elif self.turtle.system1EnterSafe(
self.turtle.PriceNow,
self.turtle.Donchian_50_up
):
self.Buy_stock(self.turtle.PriceNow)
elif 1 <= self.turtle.TrigerTime <= 3:
# 加仓状态
if self.turtle.system1EnterNormal(
self.turtle.PriceNow,
self.turtle.Donchian_20_up,
self.turtle.BreakOutLog
):
self.Buy_stock(self.turtle.PriceNow)
elif self.turtle.system1EnterSafe(
self.turtle.PriceNow,
self.turtle.Donchian_50_up
):
self.Buy_stock(self.turtle.PriceNow)
elif self.turtle.add(self.turtle.PriceNow):
self.Buy_stock(self.turtle.PriceNow)
elif self.turtle.system_1_stop(self.turtle.PriceNow):
self.stop_sale_stock(self.turtle.PriceNow)
elif self.turtle.system_1_Out(
self.turtle.PriceNow,
self.turtle.Donchian_10_down
):
self.out_sale_stock(self.turtle.PriceNow)
elif self.turtle.TrigerTime == 4:
# 满仓状态
if self.turtle.system_1_stop(self.turtle.PriceNow):
self.stop_sale_stock(self.turtle.PriceNow)
elif self.turtle.system_1_Out(
self.turtle.PriceNow,
self.turtle.Donchian_10_down
):
self.out_sale_stock(self.turtle.PriceNow)
# 等待 1 分钟后下一次循环
time.sleep(60)
def Start_short_system(self): def Start_short_system(self):
"""启动short系统 """启动short系统
@ -566,71 +648,13 @@ class TurtleTrading_OnTime(object):
# 判断是否是新的一周 # 判断是否是新的一周
if datetime.now().weekday() == 0: if datetime.now().weekday() == 0:
self.turtle.CalPositionSize() self.turtle.CalPositionSize()
# 每分钟获取一次数据,判断是否触发条件 9:30-11:30 13:00-15:00 # 每分钟获取一次数据,判断是否触发条件 9:30-11:30 13:00-15:00
stock_data, etf_data = self.get_stocks_data() self.run_short_trading_loop()
# 根据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):
# 发出买入指令
self.Buy_stock(self.turtle.PriceNow)
elif self.turtle.system1EnterSafe(self.turtle.PriceNow, self.turtle.Donchian_50_up):
# 发出买入指令
self.Buy_stock(self.turtle.PriceNow)
# 已有仓位,加仓 / 止损 / 退出
elif 1<=self.turtle.TrigerTime <= 3:
# ---------------------加仓---------------------
# 继续突破
if self.turtle.system1EnterNormal(self.turtle.PriceNow, self.turtle.Donchian_20_up, self.turtle.BreakOutLog):
# 发出买入指令
self.Buy_stock(self.turtle.PriceNow)
#
elif self.turtle.system1EnterSafe(self.turtle.PriceNow, self.turtle.Donchian_50_up):
# 发出买入指令
self.Buy_stock(self.turtle.PriceNow)
# 触发加仓价格
elif self.turtle.add(self.turtle.PriceNow):
# 发出买入指令
self.Buy_stock(self.turtle.PriceNow)
# ---------------------止损-------------------
elif self.turtle.system_1_stop(self.turtle.PriceNow):
# 发出卖出指令
self.stop_sale_stock(self.turtle.PriceNow)
# ---------------------止盈退出---------------------
elif self.turtle.system_1_Out(self.turtle.PriceNow, self.turtle.Donchian_10_down):
# 发出卖出指令
self.out_sale_stock(self.turtle.PriceNow)
# 满仓 止损 / 退出
elif self.turtle.TrigerTime == 4:
# ---------------------止损-------------------
if self.turtle.system_1_stop(self.turtle.PriceNow):
# 发出卖出指令
self.stop_sale_stock(self.turtle.PriceNow)
# ---------------------止盈退出---------------------
elif self.turtle.system_1_Out(self.turtle.PriceNow, self.turtle.Donchian_10_down):
# 发出卖出指令
self.out_sale_stock(self.turtle.PriceNow)
# ------------------结束阶段-------------------- # ------------------结束阶段--------------------
# 数据库更新当天数据增加ATR、donchian数据 # 数据库更新当天数据增加ATR、donchian数据
pass pass
time.sleep(16.5*600)
if __name__ == '__main__': if __name__ == '__main__':
user_email = "guoyize2209@163.com" user_email = "guoyize2209@163.com"

1
stock Submodule

@ -0,0 +1 @@
Subproject commit 5976a37056ae4f021d0bef20e3063814093af754