From 48028edf5661c3fbab70223c44d758c936537688 Mon Sep 17 00:00:00 2001 From: 27942 <2794236280@qq.com> Date: Mon, 13 Oct 2025 10:20:23 +0800 Subject: [PATCH] dededdew --- models/__init__.py | 4 + models/weex.py | 33 ++++++ test.py | 88 +++++++++++++++- weex/{test.py => 抓取数据.py} | 183 +++++++++++++++++----------------- weex/读取文件分析.py | 4 +- 5 files changed, 216 insertions(+), 96 deletions(-) create mode 100644 models/__init__.py create mode 100644 models/weex.py rename weex/{test.py => 抓取数据.py} (54%) diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..7d2c775 --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,4 @@ +from peewee import * + +# 连接到 SQLite 数据库,如果文件不存在会自动创建 +db = SqliteDatabase('database.db') diff --git a/models/weex.py b/models/weex.py new file mode 100644 index 0000000..37b0390 --- /dev/null +++ b/models/weex.py @@ -0,0 +1,33 @@ +from peewee import * + +from models import db + + +class Weex(Model): + id = IntegerField(primary_key=True) + open = FloatField(null=True) + high = FloatField(null=True) + low = FloatField(null=True) + close = FloatField(null=True) + + class Meta: + database = db + table_name = 'weex' + +# 连接到数据库 +db.connect() + +# 创建表(如果表不存在) +db.create_tables([Weex]) + +# 示例数据 +data = ['100', '101', '99', '100.5', 1] + +# 使用 get_or_create 方法插入数据 +Weex.get_or_create( + id=data[1], + open=data[0], + high=data[1], + low=data[2], + close=data[3] +) \ No newline at end of file diff --git a/test.py b/test.py index a8f7ab0..a1cb125 100644 --- a/test.py +++ b/test.py @@ -1,6 +1,86 @@ -import datetime +import requests -time_ser = datetime.datetime(2025, 9, 1) # 修正为2024年9月 -start_of_day = time_ser.replace(hour=0, minute=0, second=0, microsecond=0) +from models.weex import Weex -print(start_of_day.timestamp()) +headers = { + 'accept': 'application/json, text/plain, */*', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', + 'appversion': '2.0.0', + 'bundleid': '', + 'cache-control': 'no-cache', + 'dnt': '1', + 'language': 'zh_CN', + 'origin': 'https://www.weeaxs.site', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'referer': 'https://www.weeaxs.site/', + 'sec-ch-ua': '"Chromium";v="140", "Not=A?Brand";v="24", "Microsoft Edge";v="140"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'cross-site', + 'sidecar': '01bfdfef90d2d6213c86b09f3a00d696d366752996a0b6692a33969a67fcd243df', + 'terminalcode': '89adf61538715df59eb4f6414981484e', + 'terminaltype': '1', + 'traceid': 'mgoh8eoehxp15lxnbv', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0', + 'vs': 'G5h7sX78yNSykC9xtTmA7O2lSKqAk6Sp', + 'x-sig': '74ec6a65f3886f24a8b062e3b41edb1a', + 'x-timestamp': '1760320261454', +} + +klineId = None +klineTime = None +contractId = None + +for i in range(2): + params = { + 'languageType': '1', + 'sign': 'SIGN', + 'timeZone': 'string', + 'contractId': '10000002', + 'productCode': 'ethusdt', + 'priceType': 'LAST_PRICE', + 'klineType': 'MINUTE_15', + 'limit': '329', + } + + if klineId: + params['nextKey.klineId'] = klineId + params['nextKey.contractId'] = contractId + + if klineTime: + params['nextKey.klineTime'] = klineTime + + response = requests.get('https://http-gateway1.janapw.com/api/v1/public/quote/v1/getKlineV2', params=params, + headers=headers) + + klineId = response.json()["data"]["nextKey"]["klineId"] + klineTime = response.json()["data"]["nextKey"]["klineTime"] + contractId = response.json()["data"]["nextKey"]["contractId"] + + for data in response.json()["data"]["dataList"]: + # print(data) + + # datas.append( + # { + # "open": data[3], + # "high": data[1], + # "low": data[2], + # "close": data[0], + # "id": data[4], + # } + # ) + + print(data) + + Weex.get_or_create( + id=int(data[4]), + defaults={ + 'open': float(data[3]), + 'high': float(data[1]), + 'low': float(data[2]), + 'close': float(data[0]), + } + ) diff --git a/weex/test.py b/weex/抓取数据.py similarity index 54% rename from weex/test.py rename to weex/抓取数据.py index a93adab..025b4b5 100644 --- a/weex/test.py +++ b/weex/抓取数据.py @@ -93,43 +93,43 @@ def simulate_trade(direction, entry_price, future_candles, take_profit_diff=30, if __name__ == '__main__': - zh_project = 0 # 累计盈亏 - all_trades = [] # 保存所有交易明细 - - # 四种信号类型的统计 - signal_stats = { - "bear_bull_engulf": {"count": 0, "wins": 0, "total_profit": 0, "name": "涨包跌"}, - "bull_bear_engulf": {"count": 0, "wins": 0, "total_profit": 0, "name": "跌包涨"}, - # "bull_bull_engulf": {"count": 0, "wins": 0, "total_profit": 0, "name": "涨包涨"}, - # "bear_bear_engulf": {"count": 0, "wins": 0, "total_profit": 0, "name": "跌包跌"} - } + # zh_project = 0 # 累计盈亏 + # all_trades = [] # 保存所有交易明细 + # + # # 四种信号类型的统计 + # signal_stats = { + # "bear_bull_engulf": {"count": 0, "wins": 0, "total_profit": 0, "name": "涨包跌"}, + # "bull_bear_engulf": {"count": 0, "wins": 0, "total_profit": 0, "name": "跌包涨"}, + # # "bull_bull_engulf": {"count": 0, "wins": 0, "total_profit": 0, "name": "涨包涨"}, + # # "bear_bear_engulf": {"count": 0, "wins": 0, "total_profit": 0, "name": "跌包跌"} + # } headers = { 'accept': 'application/json, text/plain, */*', - 'accept-language': 'zh-CN,zh;q=0.9', + 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'appversion': '2.0.0', 'bundleid': '', 'cache-control': 'no-cache', + 'dnt': '1', 'language': 'zh_CN', 'origin': 'https://www.weeaxs.site', 'pragma': 'no-cache', 'priority': 'u=1, i', 'referer': 'https://www.weeaxs.site/', - 'sec-ch-ua': '"Google Chrome";v="141", "Not?A_Brand";v="8", "Chromium";v="141"', + 'sec-ch-ua': '"Chromium";v="140", "Not=A?Brand";v="24", "Microsoft Edge";v="140"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'cross-site', - 'sidecar': '0148e5be00be63a67540447fd47c4d0977aeb6aa56c3fde73f5841b534db3bf815', - 'terminalcode': '4a2cc45598d8543222359a255cdbef17', + 'sidecar': '01bfdfef90d2d6213c86b09f3a00d696d366752996a0b6692a33969a67fcd243df', + 'terminalcode': '89adf61538715df59eb4f6414981484e', 'terminaltype': '1', - 'traceid': 'mgkm2gayjxzpnfjpuv', - 'u-token': 'eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI1NjBlNDg4Yy1jYzYxLTQzNTUtOTRjOC0yYWYwNTdkMGIyMzkxNDIyODc0MDY0IiwidWlkIjoidEQzQ1FIaFJUblVYcm5MNFNwckw3UT09Iiwic3ViIjoieXgyMDI1KioqKkBnbWFpbC5jb20iLCJpcCI6ImcwRzMydVRYUDF1ZGt3MjVFanZQenc9PSIsImRpZCI6Ii9DckplOTBGbURHREFCTnVzY0N5V0x0Nkk3R04yemRJS3RxZ0VPeU9HRk9nMk12cVptaUhFNmJ0YSt0OUgrcUEiLCJzdHMiOjAsImlhdCI6MTc2MDA4MDk5OSwiZXhwIjoxNzY3ODU2OTk5LCJwdXNoaWQiOiJvTmpMNm1ab2h4T203V3ZyZlIvcWdBPT0iLCJhdGwiOiIwIiwiaXNzIjoidXBleCJ9.64PHFr48cwtphejC-bFw8aLu9lx5jP81GBvrb0IHwBYM8EaWrcMU9VGT7zLL1mFYYUpedmTlS7EHzNvjuHNb8cUEEZGpAXKIGgQkyE48LrzhlQVASn3h0P7Wd9hWlLwcu1bOswo4Xgocecl0tpXaZVwAZccq4n13bqkEAouZLFM', - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36', - 'vs': 'v5b7p4i8zCMwEj9kSmzH7KMajbx3b6cS', - 'x-sig': 'e178e9659b38b516ed81ad87a8c5e741', - 'x-timestamp': '1760086517003', + 'traceid': 'mgoh8eoehxp15lxnbv', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0', + 'vs': 'G5h7sX78yNSykC9xtTmA7O2lSKqAk6Sp', + 'x-sig': '74ec6a65f3886f24a8b062e3b41edb1a', + 'x-timestamp': '1760320261454', } datas = [] @@ -138,8 +138,6 @@ if __name__ == '__main__': klineTime = None for i in range(500): - print(i) - params = { 'languageType': '1', 'sign': 'SIGN', @@ -148,11 +146,16 @@ if __name__ == '__main__': 'productCode': 'ethusdt', 'priceType': 'LAST_PRICE', 'klineType': 'MINUTE_15', - 'limit': '200', - 'nextKey.contractId': '10000002', - 'nextKey.klineId': klineId if klineId else '6593862509827714', - 'nextKey.klineTime': klineTime if klineTime else '1759851900000', + 'limit': '329', } + print(params) + + # if klineId: + # params['nextKey.klineId'] = klineId + # params['nextKey.contractId'] = '10000002' + # + # if klineTime: + # params['nextKey.klineTime'] = klineTime response = requests.get( 'https://http-gateway2.janapw.com/api/v1/public/quote/v1/getKlineV2', @@ -175,7 +178,7 @@ if __name__ == '__main__': "id": data[4], } ) - # {'open': '4514.40', 'high': '4533.91', 'low': '4513.51', 'close': '4532.93', 'id': '1758003300000'} + datas = sorted(datas, key=lambda x: x["id"]) for data in datas: print(data) @@ -188,66 +191,66 @@ if __name__ == '__main__': print("数据已成功保存到 stock_data.xlsx 文件中。") - daily_signals = 0 # 信号总数 - daily_wins = 0 - daily_profit = 0 # 价差总和 - - # 遍历每根K线,寻找信号 - for idx in range(1, len(datas) - 2): # 留出未来K线 - prev, curr = datas[idx - 1], datas[idx] # 前一笔,当前一笔 - entry_candle = datas[idx + 1] # 下一根开盘价作为入场价 - future_candles = datas[idx + 2:] # 未来行情 - - entry_open = float(entry_candle['open']) # 开仓价格 - direction, signal_type = check_signal(prev, curr) # 判断开仓方向和信号类型 - - if direction and signal_type: - daily_signals += 1 - - exit_price, diff, exit_time = simulate_trade(direction, entry_open, future_candles, take_profit_diff=30, - stop_loss_diff=-2) - - # 统计该信号类型的表现 - signal_stats[signal_type]["count"] += 1 - signal_stats[signal_type]["total_profit"] += diff - if diff > 0: - signal_stats[signal_type]["wins"] += 1 - daily_wins += 1 - - daily_profit += diff - - # 将时间戳转换为本地时间 - local_time = datetime.datetime.fromtimestamp(int(entry_candle['id']) / 1000) - formatted_time = local_time.strftime("%Y-%m-%d %H:%M:%S") - - # 保存交易详情 - all_trades.append( - ( - f"{formatted_time}号", - "做多" if direction == "long" else "做空", - signal_stats[signal_type]["name"], - entry_open, - exit_price, - diff, - exit_time - ) - ) - - # ===== 输出每笔交易详情 ===== - logger.info("===== 每笔交易详情 =====") - n = n1 = 0 # n = 总盈利,n1 = 总手续费 - for date, direction, signal_name, entry, exit, diff, end_time in all_trades: - profit_amount = diff / entry * 10000 # 计算盈利金额 - close_fee = 10000 / entry * exit * 0.0005 # 平仓手续费 - - logger.info( - f"{date} {direction}({signal_name}) 入场={entry:.2f} 出场={exit:.2f} 出场时间={end_time} " - f"差价={diff:.2f} 盈利={profit_amount:.2f} " - f"开仓手续费=5u 平仓手续费={close_fee:.2f}" - ) - n1 += 5 + close_fee - n += profit_amount - - print(f'一共笔数:{len(all_trades)}') - print(f"一共盈利:{n:.2f}") - print(f'一共手续费:{n1:.2f}') + # daily_signals = 0 # 信号总数 + # daily_wins = 0 + # daily_profit = 0 # 价差总和 + # + # # 遍历每根K线,寻找信号 + # for idx in range(1, len(datas) - 2): # 留出未来K线 + # prev, curr = datas[idx - 1], datas[idx] # 前一笔,当前一笔 + # entry_candle = datas[idx + 1] # 下一根开盘价作为入场价 + # future_candles = datas[idx + 2:] # 未来行情 + # + # entry_open = float(entry_candle['open']) # 开仓价格 + # direction, signal_type = check_signal(prev, curr) # 判断开仓方向和信号类型 + # + # if direction and signal_type: + # daily_signals += 1 + # + # exit_price, diff, exit_time = simulate_trade(direction, entry_open, future_candles, take_profit_diff=30, + # stop_loss_diff=-2) + # + # # 统计该信号类型的表现 + # signal_stats[signal_type]["count"] += 1 + # signal_stats[signal_type]["total_profit"] += diff + # if diff > 0: + # signal_stats[signal_type]["wins"] += 1 + # daily_wins += 1 + # + # daily_profit += diff + # + # # 将时间戳转换为本地时间 + # local_time = datetime.datetime.fromtimestamp(int(entry_candle['id']) / 1000) + # formatted_time = local_time.strftime("%Y-%m-%d %H:%M:%S") + # + # # 保存交易详情 + # all_trades.append( + # ( + # f"{formatted_time}号", + # "做多" if direction == "long" else "做空", + # signal_stats[signal_type]["name"], + # entry_open, + # exit_price, + # diff, + # exit_time + # ) + # ) + # + # # ===== 输出每笔交易详情 ===== + # logger.info("===== 每笔交易详情 =====") + # n = n1 = 0 # n = 总盈利,n1 = 总手续费 + # for date, direction, signal_name, entry, exit, diff, end_time in all_trades: + # profit_amount = diff / entry * 10000 # 计算盈利金额 + # close_fee = 10000 / entry * exit * 0.0005 # 平仓手续费 + # + # logger.info( + # f"{date} {direction}({signal_name}) 入场={entry:.2f} 出场={exit:.2f} 出场时间={end_time} " + # f"差价={diff:.2f} 盈利={profit_amount:.2f} " + # f"开仓手续费=5u 平仓手续费={close_fee:.2f}" + # ) + # n1 += 5 + close_fee + # n += profit_amount + # + # print(f'一共笔数:{len(all_trades)}') + # print(f"一共盈利:{n:.2f}") + # print(f'一共手续费:{n1:.2f}') diff --git a/weex/读取文件分析.py b/weex/读取文件分析.py index 7cf0f3d..0b400ee 100644 --- a/weex/读取文件分析.py +++ b/weex/读取文件分析.py @@ -158,7 +158,7 @@ def fetch_kline(day: int, year: int = 2025, month: int = 9, file_path: str = "st if __name__ == '__main__': datas = [] - for i in range(1, 2): + for i in range(1, 31): data = fetch_kline(year=2025, month=9, day=i) datas.extend(data) @@ -196,7 +196,7 @@ if __name__ == '__main__': daily_signals += 1 exit_price, diff, exit_time = simulate_trade(direction, entry_open, future_candles, take_profit_diff=30, - stop_loss_diff=-2) + stop_loss_diff=-5) # 统计该信号类型的表现 signal_stats[signal_type]["count"] += 1