更新待办任务

This commit is contained in:
gyz 2025-05-20 19:22:00 +08:00
parent 92f4d2d02d
commit 195341b70c

View File

@ -11,6 +11,14 @@ 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 import time
'''
todo
1 运行过程框架调整支持多个turtle同时监测
2 增加运行状态写入yaml文件读取文件恢复状态
'''
@dataclass @dataclass
class BuyState: class BuyState:
trigger_time: float # 触发次数 trigger_time: float # 触发次数
@ -620,110 +628,88 @@ 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): def run_short_trading_loop(self, stock_data, etf_data):
while True:
# 获取当前时间
now = datetime.now().time()
# 判断当前时间是否在交易时段内9:30-11:30 或 13:00-15:00 now = datetime.now().time()
is_trading_time = ( # 根据类型获取当前价格
(now.hour == 9 and now.minute >= 30) or if self.turtle.type == "stock":
(now.hour == 10 and 0 <= now.minute <= 59) or self.turtle.PriceNow = float(stock_data.loc[etf_data['代码'] == self.turtle.TradeCode, '最新价'].values[0])
(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)
)
elif self.turtle.type == "etf":
# self.turtle.PriceNow = float(etf_data.loc[etf_data['基金代码'] == self.turtle.TradeCode, '当前-单位净值'].values[0])
self.turtle.PriceNow = float(etf_data.loc[etf_data['代码'] == self.turtle.TradeCode, '最新价'].values[0])
# # 9点30 判断是否跳空高开
if now.hour == 9 and now.minute == 30 and self.turtle.PriceNow > self.turtle.prev_heigh:
self.turtle.is_gap_up = True
# 判断当前仓位状态并执行相应操作
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)
# if not is_trading_time: # 突破 记录self.turtle.breakoutlog
# # 非交易时间,等待 1 分钟后继续循环 today = datetime.now().strftime("%Y-%m-%d")
# time.sleep(60) breakout_this_time = BreakOutLog(today,
# continue self.turtle.Donchian_20_up,
self.turtle.Donchian_20_up - 2 * self.turtle.N,
'valid',
None)
self.turtle.BreakOutLog.append(breakout_this_time)
# 获取股票和ETF数据 elif self.turtle.system1EnterSafe(
stock_data, etf_data = self.get_stocks_data() self.turtle.PriceNow,
self.turtle.Donchian_50_up
):
self.Buy_stock(self.turtle.PriceNow)
# 根据类型获取当前价格 elif 1 <= self.turtle.TrigerTime <= 3:
if self.turtle.type == "stock": # # 突破状态
self.turtle.PriceNow = float(stock_data.loc[etf_data['代码'] == self.turtle.TradeCode, '最新价'].values[0]) # if self.turtle.system1EnterNormal(
# self.turtle.PriceNow,
elif self.turtle.type == "etf": # self.turtle.Donchian_20_up,
# self.turtle.PriceNow = float(etf_data.loc[etf_data['基金代码'] == self.turtle.TradeCode, '当前-单位净值'].values[0]) # self.turtle.BreakOutLog
self.turtle.PriceNow = float(etf_data.loc[etf_data['代码'] == self.turtle.TradeCode, '最新价'].values[0]) # ):
# self.Buy_stock(self.turtle.PriceNow)
# # 9点30 判断是否跳空高开 # elif self.turtle.system1EnterSafe(
if now.hour == 9 and now.minute == 30 and self.turtle.PriceNow > self.turtle.prev_heigh: # self.turtle.PriceNow,
self.turtle.is_gap_up = True # self.turtle.Donchian_50_up
# ):
# self.Buy_stock(self.turtle.PriceNow)
# 加仓状态
if self.turtle.add(self.turtle.PriceNow):
self.add_stock(self.turtle.PriceNow)
# 止损状态
# 判断当前仓位状态并执行相应操作 elif self.turtle.system_1_stop(self.turtle.PriceNow):
if self.turtle.TrigerTime == 0: self.stop_sale_stock(self.turtle.PriceNow)
# 空仓状态
if self.turtle.system1EnterNormal( # 止盈
self.turtle.PriceNow, elif self.turtle.system_1_Out(
self.turtle.Donchian_20_up, self.turtle.PriceNow,
self.turtle.BreakOutLog self.turtle.Donchian_10_down
): ):
self.Buy_stock(self.turtle.PriceNow) self.out_sale_stock(self.turtle.PriceNow)
# 突破 记录self.turtle.breakoutlog
today = datetime.now().strftime("%Y-%m-%d")
breakout_this_time = BreakOutLog(today,
self.turtle.Donchian_20_up,
self.turtle.Donchian_20_up - 2 * self.turtle.N,
'valid',
None)
self.turtle.BreakOutLog.append(breakout_this_time)
elif self.turtle.system1EnterSafe( elif self.turtle.TrigerTime == 4:
self.turtle.PriceNow, # 满仓 止损 止盈
self.turtle.Donchian_50_up if self.turtle.system_1_stop(self.turtle.PriceNow):
): self.stop_sale_stock(self.turtle.PriceNow)
self.Buy_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 1 <= self.turtle.TrigerTime <= 3: # 等待 1 分钟后下一次循环
# # 突破状态 time.sleep(60)
# 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)
# 加仓状态
if self.turtle.add(self.turtle.PriceNow):
self.add_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系统
@ -745,7 +731,34 @@ class TurtleTrading_OnTime(object):
self.turtle.CalPositionSize() self.turtle.CalPositionSize()
# 每分钟获取一次数据,判断是否触发条件 9:30-11:30 13:00-15:00 # 每分钟获取一次数据,判断是否触发条件 9:30-11:30 13:00-15:00
self.run_short_trading_loop() 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
is_stop_time = (now.hour > 15 and now.minute > 0) #收盘时间
if is_stop_time:
break
# 获取股票和ETF数据
stock_data, etf_data = self.get_stocks_data()
self.run_short_trading_loop(stock_data, etf_data)
# ------------------结束阶段-------------------- # ------------------结束阶段--------------------
# 数据库更新当天数据增加ATR、donchian数据 # 数据库更新当天数据增加ATR、donchian数据
# 直接做个新表 # 直接做个新表
@ -754,6 +767,7 @@ class TurtleTrading_OnTime(object):
time.sleep(16.5*600) time.sleep(16.5*600)
if __name__ == '__main__': if __name__ == '__main__':
user_email = "guoyize2209@163.com" user_email = "guoyize2209@163.com"
t = TurtleTrading('513870', "etf", 0.0025, 100000, 200000) t = TurtleTrading('513870', "etf", 0.0025, 100000, 200000)
# t.get_ready(100) # t.get_ready(100)