From 09f84c4ecae2a71e07f6dd64e6066563599a62b6 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期二, 17 六月 2025 17:59:40 +0800
Subject: [PATCH] ‘功能完善

---
 strategy/strategy_script_v7.py |  167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 167 insertions(+), 0 deletions(-)

diff --git a/strategy/strategy_script_v7.py b/strategy/strategy_script_v7.py
new file mode 100644
index 0000000..191dd45
--- /dev/null
+++ b/strategy/strategy_script_v7.py
@@ -0,0 +1,167 @@
+import logging
+
+from strategy.strategy_params_settings import StrategyParamsSettings
+from strategy.strategy_variable import StockVariables
+
+sv = StockVariables()
+settings = StrategyParamsSettings()
+target_code = ''
+
+
+def format_time(huaxin_timestamp):
+    huaxin_timestamp = str(huaxin_timestamp)
+    if huaxin_timestamp.find("9") == 0:
+        return f"0{huaxin_timestamp[0]}:{huaxin_timestamp[1: 3]}:{huaxin_timestamp[3: 5]}"
+    return f"{huaxin_timestamp[0:2]}:{huaxin_timestamp[2: 4]}:{huaxin_timestamp[4: 6]}"
+
+
+def can_buy():
+    """
+    @return: 鏄惁鍙拱, 涓嶈兘涔扮殑鍘熷洜/鍙拱鐨勬澘鍧�, 鏄惁閲忓
+    """
+    # print(f"{target_code}:鎵ц绛栫暐")
+    if not settings.can_buy_ge_code:
+        if target_code.find("60") != 0 and target_code.find("00") != 0:
+            return False, "鍒涗笟鏉�/绉戝垱鏉跨殑绁ㄤ笉涔�"
+    else:
+        if target_code.find("60") != 0 and target_code.find("00") != 0 and target_code.find("30") != 0:
+            return False, "绉戝垱鏉跨殑绁ㄤ笉涔�"
+
+    if sv.鏉垮潡鎴愪氦浠g爜:
+        deal_codes = set()
+        for p in sv.鏉垮潡鎴愪氦浠g爜:
+            deal_codes |= set(sv.鏉垮潡鎴愪氦浠g爜[p])
+        if len(deal_codes) >= settings.max_buy_codes_count:
+            return False, f"涔板叆浠g爜鏁拌秴闄�({len(deal_codes)}/{settings.max_buy_codes_count})"
+
+    # 鐩爣绁ㄦ澘鍧楁定鍋滀釜鏁�>=2
+    can_buy_plates = set()
+    for plate in sv.浠g爜鏉垮潡:
+        if not sv.璧勯噾娴佸叆鏉垮潡 or plate not in sv.璧勯噾娴佸叆鏉垮潡:
+            continue
+        if plate in sv.杩炵画鑰侀鏉�:
+            continue
+        if plate in sv.鏃ュ嚭鐜扮殑鏉垮潡_2:
+            # 鑰侀鏉�
+            threshold_count = settings.limit_up_count_of_old_plate
+        else:
+            # 鏂伴鏉�
+            threshold_count = settings.limit_up_count_of_new_plate
+        if len(sv.寮�鐩樺暒鏈�姝f澘鍧楁定鍋�.get(plate, [])) >= threshold_count:
+            can_buy_plates.add(plate)
+
+    if not sv.褰撳墠浠�:
+        return False, "鏃犲綋鍓嶄环"
+
+    # if getattr(sv, f"娑ㄥ仠鏁癬{settings.has_limit_up_days}") < 1 and getattr(sv, f"鐐告澘鏁癬{settings.has_limit_up_days}") < 1:
+    #     return False, f"杩憑settings.has_limit_up_days}涓氦鏄撴棩鏃犳定鍋�/鏃犵偢鏉�"
+
+    if settings.cant_yesterday_limit_down and not sv.鏄ㄦ棩闈炶穼鍋�:
+        return False, "鏄ㄦ棩璺屽仠"
+    if settings.cant_yesterday_limit_up and not sv.鏄ㄦ棩闈炴定鍋�:
+        return False, "鏄ㄦ棩娑ㄥ仠"
+    if settings.cant_yesterday_open_limit_up and not sv.鏄ㄦ棩闈炵偢鏉�:
+        return False, "鏄ㄦ棩鐐告澘"
+
+    if sv.浠婃棩娑ㄥ仠浠� > settings.price_range[1] or sv.浠婃棩娑ㄥ仠浠� < settings.price_range[0]:
+        return False, f"浠婃棩娑ㄥ仠浠烽珮浜巤settings.price_range[1]}/浣庝簬{settings.price_range[0]}"
+
+    if sv.鑷敱娴侀�氬競鍊� > settings.zyltgb_range[1] * 1e8 or sv.鑷敱娴侀�氬競鍊� < settings.zyltgb_range[0] * 1e8:
+        return False, f"鑷敱甯傚�硷紙{sv.鑷敱娴侀�氬競鍊紏锛変笉婊¤冻瑕佹眰"
+
+    if sv.鍏釜浜ゆ槗鏃ユ定骞呰繃楂�:
+        return False, f"6涓氦鏄撴棩娑ㄥ箙杩囬珮"
+
+    if sv.鏃ヤ笁鏉夸釜鏁癬10 >= 1:
+        return False, f"10涓氦鏄撴棩鏈�>=3杩炴澘"
+
+    # if sv.褰撳墠浠� > sv.鏄ㄦ棩鏈�浣庝环 * 1.1:
+    #     return False, f"涔板叆鏃剁殑浠锋牸蹇呴』鈮ゆ槰鏃ユ渶浣庝环*110%"
+
+    if (sv.褰撳墠浠� - sv.浠婃棩鏈�浣庝环) / sv.鏄ㄦ棩鏀剁洏浠� > 0.03:
+        return False, f"涔板叆鏃剁殑浠锋牸涓嶈兘楂樹簬浠婃棩鏈�浣庝环鐨�3%"
+
+    # if abs((sv.褰撳墠浠� - round(sv.浠婃棩鎴愪氦棰� / sv.浠婃棩鎴愪氦閲�, 2)) / sv.鏄ㄦ棩鏀剁洏浠�) >= settings.max_rate_than_average_price:
+    #     return False, f"涔板叆浠烽珮浜庡潎浠穥settings.max_rate_than_average_price}({abs((sv.褰撳墠浠� - round(sv.浠婃棩鎴愪氦棰� / sv.浠婃棩鎴愪氦閲�, 2)) / sv.鏄ㄦ棩鏀剁洏浠�)})"
+    #
+    # if (sv.浠婃棩鏈�楂樹环淇℃伅[0] - sv.褰撳墠浠�) / sv.鏄ㄦ棩鏀剁洏浠� > settings.min_rate_of_highest_and_price:
+    #     return False, f"浣庝簬鍒嗘椂楂樹环{settings.min_rate_of_highest_and_price}"
+
+    if not settings.can_buy_limited_up and abs(sv.浠婃棩鏈�楂樹环淇℃伅[0] - sv.浠婃棩娑ㄥ仠浠�) <= 0.001:
+        return False, f"浠婃棩鏈夋定鍋�"
+
+    # if sv.娑ㄥ仠鏁癬30 <= 0 and not sv.鏃ユ斁鍊嶉噺鏃ユ湡_15:
+    #     return False, "30涓氦鏄撴棩鏃犳定鍋滀笖15涓氦鏄撴棩鏃犲�嶉噺"
+
+    # 鐩爣绁ㄦ澘鍧楁定鍋滀釜鏁�>=2
+
+    # 鏉垮潡鍙兘涔板叆涓�涓唬鐮�
+    # if sv.鏉垮潡鎴愪氦浠g爜:
+    #     can_buy_plates -= set(sv.鏉垮潡鎴愪氦浠g爜.keys())
+
+    if not can_buy_plates:
+        return False, f"娌℃湁娑ㄥ仠鐨勬澘鍧�: {[(plate, sv.寮�鐩樺暒鏈�姝f澘鍧楁定鍋�.get(plate)) for plate in sv.浠g爜鏉垮潡 if sv.寮�鐩樺暒鏈�姝f澘鍧楁定鍋淽}  杩炵画鑰侀鏉愶細{sv.杩炵画鑰侀鏉恾"
+    # new_plates = set(can_buy_plates) - sv.鏃ュ嚭鐜扮殑鏉垮潡_2
+    # if new_plates:
+    #     # 鏈夋柊棰樻潗锛屽垽鏂槸鍚﹁繃鏄ㄦ棩鍓嶉珮
+    #     if sv.浠婃棩鏈�楂樹环淇℃伅[0] - sv.鏄ㄦ棩鏈�楂樹环 < 0.02:
+    #         return False, "浠婃棩鏈�楂樹环闇�澶т簬鏄ㄦ棩鏈�楂樹环"
+    # else:
+    #     if sv.浠婃棩鏈�楂樹环淇℃伅[0] - sv.鏃ユ渶楂樹环_5 < 0.02:
+    #         return False, "浠婃棩鏈�楂樹环闇�澶т簬5鏃ユ渶楂樹环"
+
+    if settings.trade_days_count_of_limit_up_price_over_high and sv.浠婃棩娑ㄥ仠浠� <= getattr(sv,
+                                                                                     f"鏃ユ渶楂樹环_{settings.trade_days_count_of_limit_up_price_over_high}"):
+        return False, f"浠婃棩娑ㄥ仠浠疯绐佺牬{settings.trade_days_count_of_limit_up_price_over_high}鏃ユ渶楂樹环"
+
+    # if sv.浠婃棩鎴愪氦閲� < sv.鏄ㄦ棩鎴愪氦閲� * 0.8:
+    #     return False, f"瀹炴椂鎴愪氦閲忓繀椤烩墺80%鏄ㄦ棩鎬绘垚浜ら噺"
+
+    # =======鎴愪氦澶у崟=====
+    big_order_money = 0
+    if sv.浠婃棩澶у崟鏁版嵁:
+        # print(sv.浠婃棩澶у崟鏁版嵁[-1][3], format_time(sv.浠婃棩澶у崟鏁版嵁[-1][3]))
+        # filter_orders = [(o[0], o[2]) for o in sv.浠婃棩澶у崟鏁版嵁 if format_time(o[3]) >= sv.浠婃棩閲忓淇℃伅[0]]
+        filter_orders = [(o[0], o[2]) for o in sv.浠婃棩澶у崟鏁版嵁 if o[2] >= 299e4 and o[4] > sv.鏄ㄦ棩鏀剁洏浠穄
+        if not filter_orders:
+            return False, "鏃犳定骞呭ぇ浜�0%鐨勫ぇ鍗�"
+        filter_orders = [(o[0], o[2]) for o in sv.浠婃棩澶у崟鏁版嵁 if o[2] >= 299e4]
+        filter_orders.reverse()
+        orderids = set()
+        for o in filter_orders:
+            if o[0] in orderids:
+                continue
+            orderids.add(o[0])
+            big_order_money += o[1]
+    big_sell_order_money = 0
+    if sv.浠婃棩鍗栧ぇ鍗曟暟鎹�:
+        filter_orders = [(o[0], o[2]) for o in sv.浠婃棩鍗栧ぇ鍗曟暟鎹� if o[2] >= 100e4]
+        filter_orders.reverse()
+        orderids = set()
+        for o in filter_orders:
+            if o[0] in orderids:
+                continue
+            orderids.add(o[0])
+            big_sell_order_money += o[1]
+
+    threshold_money = max(sv.鑷敱娴侀�氬競鍊� // 1000, 200e4)
+
+    limit_up_codes_count = max([(p, len(sv.寮�鐩樺暒鏈�姝f澘鍧楁定鍋�.get(p, []))) for p in can_buy_plates], key=lambda x: x[1])[1]
+
+    # threshold_money *= max(min(10 - limit_up_codes_count + 1, 10), 5) / 10
+    threshold_money *= 0.5
+
+    # print(target_code, sv.鑷敱娴侀�氬競鍊�, threshold_money, limit_up_codes_count)
+
+    # threshold_money = 200e4  # int(sv.鏄ㄦ棩鎴愪氦閲� * 0.2 * sv.浠婃棩娑ㄥ仠浠� * 0.05)
+
+    final_big_order_money = big_order_money - big_sell_order_money
+
+    if final_big_order_money <= 200e4:
+        # 澶у崟鍑�棰濊澶т簬200w
+        return False, f"({round(final_big_order_money / 1e4, 2)}涓�/{round(threshold_money / 1e4, 2)}涓�)澶у崟閲戦涓嶈冻"
+
+    return True, f" \n\t澶у崟淇℃伅锛歿round(final_big_order_money / 1e4, 2)}涓囷紙涔帮細{round(big_order_money / 1e4, 2)}涓� 鍗栵細{round(big_sell_order_money / 1e4, 2)}涓囷級/{round(threshold_money / 1e4, 2)}涓�  \n\t閲忓淇℃伅锛歿sv.浠婃棩閲忓淇℃伅}\n\t浠婃棩鏈�楂樹环:{sv.浠婃棩鏈�楂樹环淇℃伅} \n\t5鏃ユ渶楂樹环锛歿sv.鏃ユ渶楂樹环_5}", f"\n\t鏉垮潡淇℃伅锛歿[(p, sv.寮�鐩樺暒鏈�姝f澘鍧楁定鍋�.get(p)) for p in can_buy_plates]}", can_buy_plates
+
+
+compute_result = can_buy()

--
Gitblit v1.8.0