From 6bbfbbb16d792f7737ec86cabdba5c0e98dcf4b4 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期五, 29 八月 2025 17:41:29 +0800 Subject: [PATCH] 有涨停买撤单要触发撤单计算 --- utils/tool.py | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 150 insertions(+), 13 deletions(-) diff --git a/utils/tool.py b/utils/tool.py index 6aa8236..e191df7 100644 --- a/utils/tool.py +++ b/utils/tool.py @@ -21,6 +21,22 @@ return wrapper +def singleton(cls): + """ + 鍗曚緥瑁呴グ鍣� + @param cls: + @return: + """ + instances = {} + + def get_instance(*args, **kwargs): + if cls not in instances: + instances[cls] = cls(*args, **kwargs) + return instances[cls] + + return get_instance + + def get_expire(): now = int(t.time()) end = int(t.time()) + 60 * 60 * 24 @@ -28,7 +44,7 @@ end = int(t.mktime(t.strptime(local_time, "%Y-%m-%d"))) expire = end - now # 鍔犻殢鏈烘暟锛岄槻姝竴璧烽攢姣佹暟鎹� - expire += random.randint(0, 60 * 60) + expire += random.randint(0, 60 * 30) return expire @@ -51,6 +67,18 @@ def get_now_time_str(): time_str = datetime.datetime.now().strftime("%H:%M:%S") + return time_str + + +def get_now_time_as_int(): + time_str = datetime.datetime.now().strftime("%H:%M:%S") + return int(time_str.replace(":", "")) + + +def get_now_time_with_ms_str(): + now = datetime.datetime.now() + ms = int(now.microsecond / 1000) + time_str = now.strftime(f"%H:%M:%S.{ms:03d}") return time_str @@ -157,9 +185,9 @@ def get_time_as_millionsecond(time_str): - s_str,ms_str = time_str.split(".") + s_str, ms_str = time_str.split(".") ts = s_str.split(":") - return int(ts[0]) * 3600 + int(ts[1]) * 60 + int(ts[2])*1000 + int(ms_str) + return (int(ts[0]) * 3600 + int(ts[1]) * 60 + int(ts[2])) * 1000 + int(ms_str) # 灏嗙鏁版牸寮忓寲涓烘椂闂� @@ -179,6 +207,16 @@ return "{0:0>2}:{1:0>2}:{2:0>2}.{3:0>3}".format(h, m, s, ms) +def timestamp_format(timestamp, format): + """ + 鏃堕棿鎴虫牸寮忓寲 + @param timestamp: + @param format: + @return: + """ + return datetime.datetime.fromtimestamp(timestamp).strftime(format) + + # 浜ゆ槗鏅傞枔鐨勫樊鍊� # 濡�11:29:59 涓� 13:00:00鍙浉宸�1s def trade_time_sub(time_str_1, time_str_2): @@ -192,20 +230,25 @@ return time_1 - time_2 + def trade_time_sub_with_ms(time_str_1, time_str_2): - split_time = get_time_as_second("11:30:00")*1000 + split_time = get_time_as_second("11:30:00") * 1000 time_1 = get_time_as_millionsecond(time_str_1) time_2 = get_time_as_millionsecond(time_str_2) if time_1 < split_time < time_2: - time_2 = time_2 - 90 * 60*1000 + time_2 = time_2 - 90 * 60 * 1000 elif time_2 < split_time < time_1: - time_2 = time_2 + 90 * 60*1000 + time_2 = time_2 + 90 * 60 * 1000 return time_1 - time_2 def compare_time(time_1: str, time_2: str): return int(time_1.replace(":", "")) - int(time_2.replace(":", "")) + + +def compare_time_with_ms(time_1: str, time_2: str): + return int(time_1.replace(":", "").replace(".", "")) - int(time_2.replace(":", "").replace(".", "")) # 浜ゆ槗鏃堕棿鍔犲嚑s @@ -237,6 +280,16 @@ s = int(ts[0]) * 3600 + int(ts[1]) * 60 + int(ts[2]) cha = (s - 2) % 3 return time_seconds_format(s - 2 - cha) + + +def to_time_with_ms(time_s_str, time_ms): + """ + 灏嗘椂闂�+姣鏁� 杞负瀛楃涓� + @param time_s_str: 鏃堕棿濡�:10:00:00 + @param time_ms: 姣濡�: 12 + @return: 濡�:10:00:00.001 + """ + return f"{time_s_str}." + "{0:0>3}".format(time_ms) # 鍏ㄨ杞崐瑙� @@ -271,7 +324,11 @@ # if price - 0.1 < fprice: # fprice = price - 0.1 # return round(fprice, 2) - return round(get_buy_min_price(price) - 0.03, 2) + if price < 20: + return round(get_buy_min_price(price) - 0.03, 2) + else: + # 澶ц偂浠风洿鎺ュ悜涓嬪彇2% + return round(price * (1 - 0.02), 2) if __name__ == "__main__": @@ -297,11 +354,39 @@ return False, None -# 鏄惁涓轰富鏉夸唬鐮� -def is_shsz_code(code): - if code.find("00") == 0 or code.find("60") == 0: +def is_can_buy_code(code): + if code.find("00") == 0 or code.find("60") == 0 or code.find("30") == 0: return True return False + + +def is_target_code(code): + """ + 鏄惁鏄洰鏍囦唬鐮� + @param code: + @return: + """ + prefixes = ["00", "60", "30"] + for prefix in prefixes: + if code.find(prefix) == 0: + return True + return False + + +def get_limit_up_rate(code): + # 鑾峰彇娑ㄥ仠鍊嶆暟 + if code.find("00") == 0 or code.find("60") == 0: + return 1.1 + else: + return 1.2 + + +def get_limit_down_rate(code): + # 鑾峰彇娑ㄥ仠鍊嶆暟 + if code.find("00") == 0 or code.find("60") == 0: + return 0.9 + else: + return 0.8 def get_thread_id(): @@ -317,12 +402,64 @@ def get_buy_volume(limit_up_price): - count = (constant.BUY_MONEY_PER_CODE // int(round(float(limit_up_price) * 100))) * 100 + return get_buy_volume_by_money(limit_up_price, constant.BUY_MONEY_PER_CODE) + + +def get_buy_volume_by_money(limit_up_price, money): + count = (money // int(round(float(limit_up_price) * 100))) * 100 if count < 100: count = 100 return count +# 娣辫瘉 +MARKET_TYPE_SZSE = 1 +# 涓婅瘉 +MARKET_TYPE_SSE = 0 +# 鏈煡 +MARKET_TYPE_UNKNOWN = -1 + + +def get_market_type(code): + """ + 鏍规嵁鑲$エ浠g爜 + :param code: + :return: + """ + if code.find("00") == 0 or code.find("30") == 0 or code.find("12") == 0: + return MARKET_TYPE_SZSE + elif code.find("60") == 0 or code.find("68") == 0 or code.find("11") == 0: + return MARKET_TYPE_SSE + else: + return MARKET_TYPE_UNKNOWN + + +def is_sh_code(code): + """ + 鏄惁鏄笂璇� + @param code: + @return: + """ + return get_market_type(code) == MARKET_TYPE_SSE + + +def is_sz_code(code): + """ + 鏄惁鏄繁璇� + @param code: + @return: + """ + return get_market_type(code) == MARKET_TYPE_SZSE + + +def is_ge_code(code): + """ + 鏄惁鏄垱涓氭澘 + @param code: + @return: + """ + return code.find("30") == 0 + + if __name__ == "__main__": - print(trade_time_add_millionsecond("10:36:00.123", 1000)) - print(trade_time_add_millionsecond("11:29:59.123", 1888)) + print(timestamp_format(1726034271, "%H%M%S")) -- Gitblit v1.8.0