调整金额
This commit is contained in:
@@ -63,6 +63,15 @@ def get_history_records(data_dirs):
|
|||||||
return all_records
|
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):
|
def main(next_period_time, df):
|
||||||
entry = {
|
entry = {
|
||||||
"id": next_period_time.strftime('%Y%m%d%H%M'),
|
"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:
|
if next_period_time.strftime('%H:%M:%S') in EMPTY_TIME_WINDOWS:
|
||||||
return entry
|
return entry
|
||||||
|
|
||||||
|
result = []
|
||||||
predictor = LotteryPredictorV14Profit()
|
predictor = LotteryPredictorV14Profit()
|
||||||
|
|
||||||
next_period_time = pd.to_datetime(next_period_time)
|
next_period_time = pd.to_datetime(next_period_time)
|
||||||
recent_x = df[df['time'] < next_period_time].tail(10000)
|
start_time, _ = predictor.check_init_daily_pnl_tracker(next_period_time)
|
||||||
predictor.check_init_daily_pnl_tracker(next_period_time)
|
time_series = generate_time_series(start_time, next_period_time)
|
||||||
predictions = predictor.predict(next_period_time, recent_x)
|
|
||||||
|
|
||||||
for pos, nums_bet in predictions.items():
|
for dt in time_series:
|
||||||
if not nums_bet:
|
entry = {
|
||||||
continue
|
"id": dt.strftime('%Y%m%d%H%M'),
|
||||||
entry['result'][pos] = nums_bet
|
"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]
|
for pos, nums_bet in predictions.items():
|
||||||
if last_result.size != 0:
|
if not nums_bet:
|
||||||
predictor.update_result(last_result, entry)
|
continue
|
||||||
return entry
|
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__":
|
if __name__ == "__main__":
|
||||||
@@ -101,7 +125,7 @@ if __name__ == "__main__":
|
|||||||
all_records = get_history_records(data_dirs)
|
all_records = get_history_records(data_dirs)
|
||||||
parser = argparse.ArgumentParser(description="下一期时间 next_period_time, 例: 2026-01-02 06:00:00")
|
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()
|
args = parser.parse_args()
|
||||||
fmt = "%Y-%m-%d %H:%M:%S"
|
fmt = "%Y-%m-%d %H:%M:%S"
|
||||||
next_period_time = datetime.strptime(args.next_period_time, fmt)
|
next_period_time = datetime.strptime(args.next_period_time, fmt)
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
[init]
|
[init]
|
||||||
ODDS = 9.599
|
ODDS = 9.599
|
||||||
BASE_BET_UNIT = 100
|
BASE_BET_UNIT = 20
|
||||||
BET_THIS_ROUND = 100
|
|
||||||
INITIAL_CAPITAL = 20000
|
|
||||||
DAILY_STOP_LOSS_RATE = 0.30
|
DAILY_STOP_LOSS_RATE = 0.30
|
||||||
|
|
||||||
[dynamic]
|
[dynamic]
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class LotteryPredictorV14Profit:
|
|||||||
ODDS = float(conf["init"]["ODDS"])
|
ODDS = float(conf["init"]["ODDS"])
|
||||||
REBATE_RATE = float(conf["dynamic"]["REBATE_RATE"])
|
REBATE_RATE = float(conf["dynamic"]["REBATE_RATE"])
|
||||||
BASE_BET_UNIT = int(conf["init"]["BASE_BET_UNIT"])
|
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_1 = 0.05
|
||||||
SAFE_BET_LEVEL_2 = 0.10
|
SAFE_BET_LEVEL_2 = 0.10
|
||||||
SAFE_BET_LEVEL_3 = 0.15
|
SAFE_BET_LEVEL_3 = 0.15
|
||||||
@@ -28,7 +28,7 @@ class LotteryPredictorV14Profit:
|
|||||||
RADICAL_BET_LEVEL_0 = 0.05
|
RADICAL_BET_LEVEL_0 = 0.05
|
||||||
RADICAL_BET_LEVEL_1 = 0.1
|
RADICAL_BET_LEVEL_1 = 0.1
|
||||||
RADICAL_BET_LEVEL_2 = 0.2
|
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元熔断
|
DAILY_STOP_LOSS_RATE = float(conf["init"]["DAILY_STOP_LOSS_RATE"]) # 绝佳熔断点:6000元熔断
|
||||||
POSITION_LOOKBACK_PERIODS = int(conf["dynamic"]["POSITION_LOOKBACK_PERIODS"])
|
POSITION_LOOKBACK_PERIODS = int(conf["dynamic"]["POSITION_LOOKBACK_PERIODS"])
|
||||||
OMISSIONS_LEVEL_1 = int(conf["dynamic"]["OMISSIONS_LEVEL_1"])
|
OMISSIONS_LEVEL_1 = int(conf["dynamic"]["OMISSIONS_LEVEL_1"])
|
||||||
@@ -126,10 +126,17 @@ class LotteryPredictorV14Profit:
|
|||||||
start_time, end_time = date_range
|
start_time, end_time = date_range
|
||||||
if start_time <= current_date <= end_time:
|
if start_time <= current_date <= end_time:
|
||||||
_date_range = (start_time, end_time)
|
_date_range = (start_time, end_time)
|
||||||
|
break
|
||||||
|
|
||||||
if not _date_range:
|
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)
|
_date_range = (current_date_start_time, current_date_end_time)
|
||||||
|
|
||||||
self.daily_pnl_tracker[_date_range] = {'pnl': 0, 'bets': 0, 'miss_count': 0}
|
self.daily_pnl_tracker[_date_range] = {'pnl': 0, 'bets': 0, 'miss_count': 0}
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
rem 启动后端Spring Boot应用
|
rem 启动后端Spring Boot应用
|
||||||
echo 正在启动后端应用...
|
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 等待后端启动
|
rem 等待后端启动
|
||||||
ping 127.0.0.1 -n 5 > nul
|
ping 127.0.0.1 -n 5 > nul
|
||||||
|
|
||||||
rem 启动前端Vue应用
|
rem 启动前端Vue应用
|
||||||
echo 正在启动前端应用...
|
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 前后端应用已启动!
|
||||||
echo 后端服务:http://localhost:8080
|
echo 后端服务:http://localhost:8080
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -17,7 +17,7 @@ public class BocaiApplication {
|
|||||||
|
|
||||||
// // 依次执行三个任务
|
// // 依次执行三个任务
|
||||||
//
|
//
|
||||||
// // 1. 执行CrawlerSchedule方法
|
// 1. 执行CrawlerSchedule方法
|
||||||
System.out.println("\n=== 开始执行CrawlerSchedule任务 ===");
|
System.out.println("\n=== 开始执行CrawlerSchedule任务 ===");
|
||||||
CrawlerSchedule crawlerSchedule = context.getBean(CrawlerSchedule.class);
|
CrawlerSchedule crawlerSchedule = context.getBean(CrawlerSchedule.class);
|
||||||
crawlerSchedule.executeLotteryDraw();
|
crawlerSchedule.executeLotteryDraw();
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ public class TessConfig {
|
|||||||
|
|
||||||
Tesseract instance = new Tesseract();
|
Tesseract instance = new Tesseract();
|
||||||
instance.setLanguage("oci"); // 设置语言包,这里使用英语
|
instance.setLanguage("oci"); // 设置语言包,这里使用英语
|
||||||
instance.setDatapath("src/main/resources/tessdata"); // 设置语言包路径
|
instance.setDatapath("tessdata"); // 设置语言包路径
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.tem.bocai.schedules;
|
|||||||
|
|
||||||
import com.tem.bocai.util.TokenCacheService;
|
import com.tem.bocai.util.TokenCacheService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -142,7 +143,7 @@ public class BetSchedule {
|
|||||||
|
|
||||||
// 调用投注接口
|
// 调用投注接口
|
||||||
System.out.println(" - 提交投注...");
|
System.out.println(" - 提交投注...");
|
||||||
String betResult = callBetApi(betData, loginInfo);
|
String betResult = callBetApi(betData, null);
|
||||||
System.out.println(" - 投注结果: " + betResult);
|
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
|
// 假设投注接口地址为http://localhost:8080/api/bet
|
||||||
String apiUrl = "https://4701268539-esh.qdk63ayw8g.com/member/bet";
|
String apiUrl = "https://4701268539-esh.qdk63ayw8g.com/member/bet";
|
||||||
|
|
||||||
@@ -176,7 +177,7 @@ public class BetSchedule {
|
|||||||
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
|
HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
|
||||||
.uri(URI.create(apiUrl))
|
.uri(URI.create(apiUrl))
|
||||||
.header("Content-Type", "application/json")
|
.header("Content-Type", "application/json")
|
||||||
.header("cookie", "token=" + tokenCacheService.getToken());
|
.header("cookie", "token=" + (StringUtils.isBlank(token)?tokenCacheService.getToken():token));
|
||||||
|
|
||||||
HttpRequest request = requestBuilder
|
HttpRequest request = requestBuilder
|
||||||
.POST(HttpRequest.BodyPublishers.ofString(betData))
|
.POST(HttpRequest.BodyPublishers.ofString(betData))
|
||||||
@@ -187,10 +188,14 @@ public class BetSchedule {
|
|||||||
|
|
||||||
// 解析响应
|
// 解析响应
|
||||||
if (response.statusCode() == 200) {
|
if (response.statusCode() == 200) {
|
||||||
|
|
||||||
log.info("投注成功");
|
log.info("投注成功");
|
||||||
return null;
|
return null;
|
||||||
} else {
|
}else if (response.statusCode() == 302){
|
||||||
|
String tokenSqlite = tokenCacheService.getTokenSqlite();
|
||||||
|
callBetApi(betData, tokenSqlite);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
return "error: " + response.statusCode();
|
return "error: " + response.statusCode();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user