From 3414c4fa7c117fb73fab442c1fc790e4b085f877 Mon Sep 17 00:00:00 2001 From: guoyz Date: Thu, 8 May 2025 23:06:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=97=B6=E9=97=B4=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TurtleOnTime.py | 208 +++++++++++++++++++++++++++--------------------- stock | 1 + 2 files changed, 117 insertions(+), 92 deletions(-) create mode 160000 stock diff --git a/TurtleOnTime.py b/TurtleOnTime.py index b8126e8..bcd4cec 100644 --- a/TurtleOnTime.py +++ b/TurtleOnTime.py @@ -10,7 +10,7 @@ import stock_database import mysql_database from EmailTest import send_email, parse_return_email from dataclasses import dataclass - +import time @dataclass class BuyState: trigger_time: float # 触发次数 @@ -356,16 +356,16 @@ class TurtleTrading_OnTime(object): #每隔1分钟检测回信,解析邮件。 parsed_email_flag = False - datetime.time.sleep(60) - while parsed_email_flag: + while not 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 == True: + if parse_states: parsed_email_flag = True break - else: - datetime.time.sleep(60) + # 成功买入 self.turtle.TrigerTime += 1 # 记录self.turtle.BuyStates @@ -408,16 +408,15 @@ class TurtleTrading_OnTime(object): #每隔1分钟检测回信,解析邮件。 parsed_email_flag = False - datetime.time.sleep(60) - while parsed_email_flag: + while not 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 == True: + if parse_states: parsed_email_flag = True break - else: - datetime.time.sleep(60) # 成功买入 self.turtle.TrigerTime += 1 @@ -470,17 +469,17 @@ class TurtleTrading_OnTime(object): send_email_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 每隔1分钟检测回信,解析邮件。 + parsed_email_flag = False - datetime.time.sleep(60) - while parsed_email_flag: + while not 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 == True: + if parse_states: parsed_email_flag = True - break - else: - datetime.time.sleep(60) + break # 成功卖出 @@ -519,16 +518,15 @@ class TurtleTrading_OnTime(object): # 每隔1分钟检测回信,解析邮件。 parsed_email_flag = False - datetime.time.sleep(60) - while parsed_email_flag: + while not 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 == True: + if parse_states: parsed_email_flag = True - break - else: - datetime.time.sleep(60) + break # 成功卖出 self.turtle.TrigerTime = 0 @@ -548,6 +546,90 @@ class TurtleTrading_OnTime(object): Net_value=sale_price * sale_share, Net_return=abs(self.turtle.Capital - available_cash)) 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): """启动short系统 @@ -566,71 +648,13 @@ class TurtleTrading_OnTime(object): # 判断是否是新的一周 if datetime.now().weekday() == 0: self.turtle.CalPositionSize() + # 每分钟获取一次数据,判断是否触发条件 9:30-11:30 13:00-15:00 - stock_data, etf_data = self.get_stocks_data() - - # 根据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) - + self.run_short_trading_loop() # ------------------结束阶段-------------------- # 数据库更新当天数据,增加ATR、donchian数据 pass + time.sleep(16.5*600) if __name__ == '__main__': user_email = "guoyize2209@163.com" diff --git a/stock b/stock new file mode 160000 index 0000000..5976a37 --- /dev/null +++ b/stock @@ -0,0 +1 @@ +Subproject commit 5976a37056ae4f021d0bef20e3063814093af754