From 97adad8d289123cdac041063cc1286e3dde92fdb Mon Sep 17 00:00:00 2001 From: liwq <122639653@qq.com> Date: Thu, 29 Jan 2026 17:54:53 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PyModel/batch_predict_betting_v8.py | 50 +++++++++++++----- PyModel/conf.ini | 4 +- PyModel/predict_model_v14_profit_maximizer.py | 15 ++++-- bocai.db | Bin 225280 -> 245760 bytes run-project.bat | 4 +- run-project.sh | 21 -------- .../java/com/tem/bocai/BocaiApplication.java | 2 +- .../java/com/tem/bocai/config/TessConfig.java | 2 +- .../com/tem/bocai/schedules/BetSchedule.java | 15 ++++-- 9 files changed, 63 insertions(+), 50 deletions(-) delete mode 100644 run-project.sh diff --git a/PyModel/batch_predict_betting_v8.py b/PyModel/batch_predict_betting_v8.py index 2ca139c..8ff249c 100644 --- a/PyModel/batch_predict_betting_v8.py +++ b/PyModel/batch_predict_betting_v8.py @@ -63,6 +63,15 @@ def get_history_records(data_dirs): return all_records +def generate_time_series(start, end): + current = start + series = [] + while current <= end: + series.append(current) + current += timedelta(minutes=5) + return series + + def main(next_period_time, df): entry = { "id": next_period_time.strftime('%Y%m%d%H%M'), @@ -77,22 +86,37 @@ def main(next_period_time, df): if next_period_time.strftime('%H:%M:%S') in EMPTY_TIME_WINDOWS: return entry + result = [] predictor = LotteryPredictorV14Profit() - next_period_time = pd.to_datetime(next_period_time) - recent_x = df[df['time'] < next_period_time].tail(10000) - predictor.check_init_daily_pnl_tracker(next_period_time) - predictions = predictor.predict(next_period_time, recent_x) + start_time, _ = predictor.check_init_daily_pnl_tracker(next_period_time) + time_series = generate_time_series(start_time, next_period_time) - for pos, nums_bet in predictions.items(): - if not nums_bet: - continue - entry['result'][pos] = nums_bet + for dt in time_series: + entry = { + "id": dt.strftime('%Y%m%d%H%M'), + "time": dt.strftime('%Y-%m-%d %H:%M:%S'), + "result": {i: {n: None for n in range(1, 11)} for i in range(10)}, + "result_detail": {i: {"单": None, "双": None, "大": None, "小": None} for i in range(10)}, + "winner": {}, + "GD1": {"冠亚大": None, "冠亚小": None}, + "GD2": {"冠亚单": None, "冠亚双": None}, + "GLH_result": {} + } + current_time = pd.to_datetime(dt) + recent_x = df[df['time'] < current_time].tail(10000) + predictions = predictor.predict(current_time, recent_x) - last_result = df[df['time'] == next_period_time] - if last_result.size != 0: - predictor.update_result(last_result, entry) - return entry + for pos, nums_bet in predictions.items(): + if not nums_bet: + continue + entry['result'][pos] = nums_bet + + last_result = df[df['time'] == current_time] + if last_result.size != 0: + predictor.update_result(last_result, entry) + result.append(entry) + return result[-1] if __name__ == "__main__": @@ -101,7 +125,7 @@ if __name__ == "__main__": all_records = get_history_records(data_dirs) parser = argparse.ArgumentParser(description="下一期时间 next_period_time, 例: 2026-01-02 06:00:00") # 必选位置参数(直接传入值,无需前缀) - parser.add_argument("--next_period_time", type=str, help="下一期时间, 例: 2026-01-02 06:00:00", default="2026-01-02 06:00:00") + parser.add_argument("--next_period_time", type=str, help="下一期时间, 例: 2026-01-02 06:00:00", default="2026-01-02 07:05:00") args = parser.parse_args() fmt = "%Y-%m-%d %H:%M:%S" next_period_time = datetime.strptime(args.next_period_time, fmt) diff --git a/PyModel/conf.ini b/PyModel/conf.ini index e4e14ca..e8fae19 100644 --- a/PyModel/conf.ini +++ b/PyModel/conf.ini @@ -1,8 +1,6 @@ [init] ODDS = 9.599 -BASE_BET_UNIT = 100 -BET_THIS_ROUND = 100 -INITIAL_CAPITAL = 20000 +BASE_BET_UNIT = 20 DAILY_STOP_LOSS_RATE = 0.30 [dynamic] diff --git a/PyModel/predict_model_v14_profit_maximizer.py b/PyModel/predict_model_v14_profit_maximizer.py index 2452326..e110d2e 100644 --- a/PyModel/predict_model_v14_profit_maximizer.py +++ b/PyModel/predict_model_v14_profit_maximizer.py @@ -19,7 +19,7 @@ class LotteryPredictorV14Profit: ODDS = float(conf["init"]["ODDS"]) REBATE_RATE = float(conf["dynamic"]["REBATE_RATE"]) BASE_BET_UNIT = int(conf["init"]["BASE_BET_UNIT"]) - _bet_this_round = int(conf["init"]["BET_THIS_ROUND"]) + _bet_this_round = BASE_BET_UNIT SAFE_BET_LEVEL_1 = 0.05 SAFE_BET_LEVEL_2 = 0.10 SAFE_BET_LEVEL_3 = 0.15 @@ -28,7 +28,7 @@ class LotteryPredictorV14Profit: RADICAL_BET_LEVEL_0 = 0.05 RADICAL_BET_LEVEL_1 = 0.1 RADICAL_BET_LEVEL_2 = 0.2 - INITIAL_CAPITAL = int(conf["init"]["INITIAL_CAPITAL"]) + INITIAL_CAPITAL = BASE_BET_UNIT * 200 DAILY_STOP_LOSS_RATE = float(conf["init"]["DAILY_STOP_LOSS_RATE"]) # 绝佳熔断点:6000元熔断 POSITION_LOOKBACK_PERIODS = int(conf["dynamic"]["POSITION_LOOKBACK_PERIODS"]) OMISSIONS_LEVEL_1 = int(conf["dynamic"]["OMISSIONS_LEVEL_1"]) @@ -126,10 +126,17 @@ class LotteryPredictorV14Profit: start_time, end_time = date_range if start_time <= current_date <= end_time: _date_range = (start_time, end_time) + break if not _date_range: - current_date_start_time = pd.to_datetime(current_date.date()) + timedelta(hours=7, minutes=5) - current_date_end_time = current_date_start_time + timedelta(hours=22, minutes=55) + + if current_date.hour <= 6: + current_date_start_time = pd.to_datetime(current_date.date()) + timedelta(days=-1, hours=7, minutes=5) + current_date_end_time = current_date_start_time + timedelta(hours=22, minutes=55) + else: + current_date_start_time = pd.to_datetime(current_date.date()) + timedelta(hours=7, minutes=5) + current_date_end_time = current_date_start_time + timedelta(hours=22, minutes=55) + _date_range = (current_date_start_time, current_date_end_time) self.daily_pnl_tracker[_date_range] = {'pnl': 0, 'bets': 0, 'miss_count': 0} diff --git a/bocai.db b/bocai.db index 8521b7e69b4d15bdda41e354aac720f112897542..f7e9cf2795e869bdc5452010e14d5f6b359a5bcf 100644 GIT binary patch delta 17382 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 Y;oX{>rsuPEd;^g28b)|0h6ddHFBO^_UH||9 delta 3227 zcmai0eNa@_6@T~M$9}y1c)M#w4V2}>FRa3QZ6lDx&}kjoG=OMqKAecDoyHlM_P$+N_N9Lm z=H9*Mch32}bI!Zx>;{8;aKO@-V(DNQCZDe8U(@t_)NyKME6;t%IQSr@phq#=vW$)T zWx8*4L0xjhYn#a{wTs86@ozHvP{>bBriJ!AMn9&68Yb~4=^-t&_m>fH1_UeSuThz? z@!#^-@PvqC>F@c6d6I=BLGlQq-1p~9N zQ!nXXr9vk3IdNv>Z~fD4x*p~V8e!mGkjzlpDwisM9I7Y#biY-WROQ-VB+aCnJVPEQ zev(TpBuxodO|m$#fUUaIXhips?wYdjZo!k1Pw?fHJQvNJ((8@!7e*DHl7JSVmRi7F zQlSN0C6&1i3=IyZ+&J&O4L zwHhT$E?03&;){@6?&4sj7RZ-3DxZxwl}|_P$~n4@jo6ge=;uo#4rL4dETwBXT?^=Pjo7E;mv9LL zUQzUxXq!&-l^B%k!)eMF!w%*0uwCh*>-exea^;6(gtlE4R_cbc>wKc%lh-Ct`9x8W z*JuGzE>$nbgD&z3-aL7=7VyZc5?xe_pce4Rby^@_e!)iS;$wocdgbj}6Q8_I1Na2_ zc`e|TtF?en-jE20f*@CE0a30T0~SfN0FqoWhNyr`j$PTk{6~A)=^t?fAa6losP|=IB!S*O(!T%S; zL-#%+#4!gf+ebuIOoqnucnW;g6c@LXsj$6?2rLa`J=mLx7aUD7zGMhCk`*yGe;t|t z7k@|ZdErr#6En_eCD|%AH)e9An40(}A}jpR_JCgTFXUn19U{jZuFpralz~(Z_PjIt zzkZ|AiEybZDV46^_h-^M?K<+rf|iq-7{JuP6zAm-t04$cJQ z4eaQ=KZqaK)B50a_<1%-(Mwzt!z3+*kd34e7xy9@@ewC+b35TFAIV7C!7%J4xITlV zz{vv2R$D;ECB2eCiZR$`Qg;{ka$KNZFU8zNZddd`+3OjG48wDUWF~wykrJ#aB$-gG zZdrxI0iVq#HX?GBaB()Bap$Q7uhY;wci+ZoWUO|5xitP0IoL@HcDQ2*Bfo`SpbAvP zjFn3Ohd_=PP!U>%cA=w9p{LkrXc=WRPSKPC`JoVOtrtHOZP(n{-R}gzf^rpPz2+vM#mUwA5J4 z<|Age>0{GxxVzjg?jd8FalWC~5HKKpvp)M&Xcfz@4TVdg=_>NVDj*ULuYpiA&IaKO zt?K<2BI58`n75J4g7%-%OTDLsxKJ4EZocH<($EklSu$a}0;tmRg{rPVUW+#9i{KWSi}X(=#5 zMiG5sNBkrm_yG9{9G*v#;c$THuy0If1Is#MhROh$m|);dG^m|NZ-thDra4qfDQA`u z8xmUrBnwuS(I!0*ARO|mlqQr`qvY& z^Z0u52aM-Nqm;lJAmib35#0_2h#t?0!ddWc5jFpjuJD1*I{$xlvlEhjkd#_7mj3b- F{tK81g)jgB diff --git a/run-project.bat b/run-project.bat index 5c25593..a1ee8fd 100644 --- a/run-project.bat +++ b/run-project.bat @@ -2,14 +2,14 @@ rem 启动后端Spring Boot应用 echo 正在启动后端应用... -start "后端服务" cmd /k "cd /d e:\git_resp\bocai && java -jar target/bocai-0.0.1-SNAPSHOT.jar" +start "后端服务" cmd /k "cd /d C:\Users\admin\Desktop\boc && java -jar target/bocai-0.0.1-SNAPSHOT.jar" rem 等待后端启动 ping 127.0.0.1 -n 5 > nul rem 启动前端Vue应用 echo 正在启动前端应用... -start "前端服务" cmd /k "cd /d e:\git_resp\bocai\frontend && npm run dev" +start "前端服务" cmd /k "cd /d C:\Users\admin\Desktop\boc\frontend && npm run dev" echo 前后端应用已启动! echo 后端服务:http://localhost:8080 diff --git a/run-project.sh b/run-project.sh deleted file mode 100644 index b2e6c93..0000000 --- a/run-project.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# 启动后端Spring Boot应用 -echo "正在启动后端应用..." -cd "$(dirname "$0")" && java -jar target/bocai-0.0.1-SNAPSHOT.jar & - -# 等待后端启动 -sleep 5 - -# 启动前端Vue应用 -echo "正在启动前端应用..." -cd frontend && npm run dev & - -echo "前后端应用已启动!" -echo "后端服务:http://localhost:8080" -echo "前端服务:通常为 http://localhost:5173 (具体端口请查看前端启动日志)" -echo "按 Ctrl+C 停止所有服务..." - -# 等待用户中断 -trap "kill 0" EXIT -wait \ No newline at end of file diff --git a/src/main/java/com/tem/bocai/BocaiApplication.java b/src/main/java/com/tem/bocai/BocaiApplication.java index 758869d..17a6a31 100644 --- a/src/main/java/com/tem/bocai/BocaiApplication.java +++ b/src/main/java/com/tem/bocai/BocaiApplication.java @@ -17,7 +17,7 @@ public class BocaiApplication { // // 依次执行三个任务 // -// // 1. 执行CrawlerSchedule方法 + // 1. 执行CrawlerSchedule方法 System.out.println("\n=== 开始执行CrawlerSchedule任务 ==="); CrawlerSchedule crawlerSchedule = context.getBean(CrawlerSchedule.class); crawlerSchedule.executeLotteryDraw(); diff --git a/src/main/java/com/tem/bocai/config/TessConfig.java b/src/main/java/com/tem/bocai/config/TessConfig.java index f544dd1..d685f2c 100644 --- a/src/main/java/com/tem/bocai/config/TessConfig.java +++ b/src/main/java/com/tem/bocai/config/TessConfig.java @@ -12,7 +12,7 @@ public class TessConfig { Tesseract instance = new Tesseract(); instance.setLanguage("oci"); // 设置语言包,这里使用英语 - instance.setDatapath("src/main/resources/tessdata"); // 设置语言包路径 + instance.setDatapath("tessdata"); // 设置语言包路径 return instance; } } diff --git a/src/main/java/com/tem/bocai/schedules/BetSchedule.java b/src/main/java/com/tem/bocai/schedules/BetSchedule.java index 8bf8a10..e768edf 100644 --- a/src/main/java/com/tem/bocai/schedules/BetSchedule.java +++ b/src/main/java/com/tem/bocai/schedules/BetSchedule.java @@ -2,6 +2,7 @@ package com.tem.bocai.schedules; import com.tem.bocai.util.TokenCacheService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -142,7 +143,7 @@ public class BetSchedule { // 调用投注接口 System.out.println(" - 提交投注..."); - String betResult = callBetApi(betData, loginInfo); + String betResult = callBetApi(betData, null); System.out.println(" - 投注结果: " + betResult); // 记录投注结果 @@ -167,7 +168,7 @@ public class BetSchedule { /** * 调用投注接口 */ - private String callBetApi(String betData, LoginInfoResult loginInfo) throws IOException, InterruptedException { + private String callBetApi(String betData, String token) throws IOException, InterruptedException { // 假设投注接口地址为http://localhost:8080/api/bet String apiUrl = "https://4701268539-esh.qdk63ayw8g.com/member/bet"; @@ -176,7 +177,7 @@ public class BetSchedule { HttpRequest.Builder requestBuilder = HttpRequest.newBuilder() .uri(URI.create(apiUrl)) .header("Content-Type", "application/json") - .header("cookie", "token=" + tokenCacheService.getToken()); + .header("cookie", "token=" + (StringUtils.isBlank(token)?tokenCacheService.getToken():token)); HttpRequest request = requestBuilder .POST(HttpRequest.BodyPublishers.ofString(betData)) @@ -187,10 +188,14 @@ public class BetSchedule { // 解析响应 if (response.statusCode() == 200) { - log.info("投注成功"); return null; - } else { + }else if (response.statusCode() == 302){ + String tokenSqlite = tokenCacheService.getTokenSqlite(); + callBetApi(betData, tokenSqlite); + return null; + } + else { return "error: " + response.statusCode(); } }