From 0de75438180380f4d20a3b8b1768e8df411670b0 Mon Sep 17 00:00:00 2001 From: gyz Date: Wed, 16 Apr 2025 22:22:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?email=E6=94=B6=E4=BB=B6=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E8=B5=B0=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EmailTest.py | 38 ++++++++++++++++++++++++++++++-------- TurtleOnTime.py | 3 +++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/EmailTest.py b/EmailTest.py index 311f644..1e76536 100755 --- a/EmailTest.py +++ b/EmailTest.py @@ -52,15 +52,37 @@ def get_latest_email_body(to_email): # print(f"Search Status: {status}") print(f"Matching Emails: {messages}") - response = mail.fetch(messages, ['FLAGS', 'RFC822.SIZE']) + for msgid, data in mail.fetch(messages, ['ENVELOPE', 'BODY[]']).items(): + envelope = data[b'ENVELOPE'] + raw_email = data[b'BODY[]'] + + # 使用 email 库解析原始内容 + email_message = email.message_from_bytes(raw_email) + + # 获取邮件正文(处理多部分的情况) + body = "" + if email_message.is_multipart(): + for part in email_message.walk(): + content_type = part.get_content_type() + content_disposition = str(part.get("Content-Disposition")) + if content_type == "text/plain" and "attachment" not in content_disposition: + body = part.get_payload(decode=True).decode(part.get_content_charset() or 'utf-8') + break + else: + body = email_message.get_payload(decode=True).decode(email_message.get_content_charset() or 'utf-8') + + raw_subject = envelope.subject.decode() + + # 然后 decode_header 接受 str 类型 + decoded_parts = decode_header(raw_subject) + subject = ''.join( + part.decode(encoding or 'utf-8') if isinstance(part, bytes) else part + for part, encoding in decoded_parts + ) + + print('ID #%d: "%s" received %s' % (msgid, subject, envelope.date)) + print('Body:', body) - # `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__": diff --git a/TurtleOnTime.py b/TurtleOnTime.py index 69b2ced..4f7e3d9 100644 --- a/TurtleOnTime.py +++ b/TurtleOnTime.py @@ -8,6 +8,7 @@ import mplfinance as mpf import sqlite3 import stock_database import mysql_database +from EmailTest import send_email def calc_sma_atr_pd(kdf,period): """计算TR与ATR @@ -346,6 +347,7 @@ class TurtleTrading_OnTime(object): 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): # 发出买入指令 @@ -397,6 +399,7 @@ class TurtleTrading_OnTime(object): pass if __name__ == '__main__': + user_email = "guoyize2209@163.com" t = TurtleTrading('513300', "etf", 0.25, 100000, 200000) # t.get_ready(100) From d2272641f2fa9596e4d01f29f9dd05b42463181c Mon Sep 17 00:00:00 2001 From: gyz Date: Thu, 17 Apr 2025 21:16:43 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=9E=84=E6=80=9D=E4=B9=B0=E5=85=A5?= =?UTF-8?q?=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TurtleOnTime.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/TurtleOnTime.py b/TurtleOnTime.py index 4f7e3d9..c7739e5 100644 --- a/TurtleOnTime.py +++ b/TurtleOnTime.py @@ -9,7 +9,18 @@ import sqlite3 import stock_database import mysql_database from EmailTest import send_email +from dataclasses import dataclass +@dataclass +class BuyState: + trigger_time: float + buy_price: float + add_price: float + stop_price: float + quantity: int + n: int + available_cash: float + def calc_sma_atr_pd(kdf,period): """计算TR与ATR @@ -47,7 +58,7 @@ class TurtleTrading(object): self.Capital = Capital self.cash = cash self.TrigerTime = 0 - self.BuyStates = [[0, None, None, 0, 0, self.cash]] + self.BuyStates = list[BuyState] = [] self.tradeslog = [] # 交易记录 @@ -315,6 +326,15 @@ class TurtleTrading_OnTime(object): # mysql_database.insert_db(etf_data, "etf_price", True, "代码") return stock_data, etf_data + def Buy_stock(self, price_now): + # 发送邮件 代码self.turtle.TradeCode, 建议买入价格price_now,买入份额self.turtle.IntPositionSize + send_email() + + # 每隔1分钟检测回信,解析邮件。 + + # 记录self.turtle.BuyStates + pass + def Start_short_system(self): """启动short系统 """