Compare commits
4 Commits
aa7d0b5e00
...
3414c4fa7c
Author | SHA1 | Date | |
---|---|---|---|
3414c4fa7c | |||
20818eb580 | |||
cd299b891a | |||
a2faa7c616 |
@ -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,7 +167,7 @@ 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:
|
||||||
|
204
TurtleOnTime.py
204
TurtleOnTime.py
@ -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
|
||||||
@ -549,6 +547,90 @@ class TurtleTrading_OnTime(object):
|
|||||||
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()
|
||||||
|
|
||||||
# 根据type,code, 取得实时价格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
1
stock
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 5976a37056ae4f021d0bef20e3063814093af754
|
Loading…
x
Reference in New Issue
Block a user