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