feat: implement multi-symbol dashboard with updated data handling
- Added support for multi-symbol trading (XRP, TRX, DOGE) in the dashboard. - Updated bot log messages to include [SYMBOL] prefix for better tracking. - Enhanced log parser for multi-symbol state tracking and updated database schema. - Introduced new API endpoints and UI components for symbol filtering and display. - Added new model files and backtest results for multi-symbol strategies. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
169
docs/plans/2026-03-06-multi-symbol-dashboard-design.md
Normal file
169
docs/plans/2026-03-06-multi-symbol-dashboard-design.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# Multi-Symbol Dashboard Design
|
||||
|
||||
## 배경
|
||||
|
||||
멀티심볼 트레이딩(XRP, TRX, DOGE) 지원 이후 대시보드가 단일 심볼 기준으로 되어있어 수정 필요. 봇 로그 형식 통일, 파서/DB/API/UI 전체 레이어 변경.
|
||||
|
||||
## 접근 방식
|
||||
|
||||
**A안 채택**: 기존 단일 DB에 `symbol` 컬럼 추가. 대시보드 DB는 로그 파싱으로 재생성 가능하므로 초기화 비용 없음.
|
||||
|
||||
## 1. 봇 로그 수정
|
||||
|
||||
모든 핵심 로그에 `[SYMBOL]` 프리픽스를 일관되게 추가.
|
||||
|
||||
변경 대상 (`src/bot.py`):
|
||||
- `신호: {signal} | 현재가:` → `[{self.symbol}] 신호: ...`
|
||||
- `{signal} 진입: 가격=` → `[{self.symbol}] {signal} 진입: ...`
|
||||
- `기존 포지션 복구:` → `[{self.symbol}] 기존 포지션 복구: ...`
|
||||
- `기준 잔고 설정:` → `[{self.symbol}] 기준 잔고 설정: ...`
|
||||
- `포지션 청산(...)` → `[{self.symbol}] 포지션 청산(...)`
|
||||
- `OI=..., OI변화율=...` → `[{self.symbol}] OI=...` (debug→info로 변경 또는 그대로 debug 유지)
|
||||
|
||||
변경 대상 (`src/user_data_stream.py`):
|
||||
- `청산 감지({reason}):` → `[{self.symbol}] 청산 감지({reason}): ...`
|
||||
|
||||
이미 `[{self.symbol}]`이 있는 로그는 그대로 유지.
|
||||
|
||||
## 2. Log Parser (`log_parser.py`)
|
||||
|
||||
### 정규식 변경
|
||||
|
||||
모든 패턴에 `\[(?P<symbol>\w+)\]` 프리픽스 추가:
|
||||
|
||||
```python
|
||||
"signal": re.compile(
|
||||
r"(?P<ts>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})"
|
||||
r".*\[(?P<symbol>\w+)\] 신호: (?P<signal>\w+) \| 현재가: (?P<price>[\d.]+) USDT"
|
||||
),
|
||||
```
|
||||
|
||||
### 상태 추적 멀티심볼 대응
|
||||
|
||||
- `_current_position: dict` → `_current_positions: dict[str, dict]` (심볼별)
|
||||
- `_pending_candle: dict` → `_pending_candles: dict[str, dict[str, dict]]` (심볼별 타임스탬프별)
|
||||
- `_bot_config["symbol"]` 제거, 정규식에서 심볼 직접 파싱
|
||||
|
||||
### 핸들러 변경
|
||||
|
||||
**`_handle_entry`**: symbol을 정규식에서 직접 받음. 중복 체크를 `symbol+direction` 기준으로.
|
||||
|
||||
**`_handle_close`**: `WHERE status='OPEN' AND symbol=?`로 해당 심볼만 닫음.
|
||||
|
||||
### bot_status 키 형식
|
||||
|
||||
- 심볼별: `{symbol}:current_price`, `{symbol}:position_status`, `{symbol}:current_signal` 등
|
||||
- 전역: `balance`, `ml_threshold` 그대로
|
||||
|
||||
## 3. DB 스키마 변경
|
||||
|
||||
### candles 테이블
|
||||
|
||||
```sql
|
||||
CREATE TABLE candles (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
symbol TEXT NOT NULL,
|
||||
ts TEXT NOT NULL,
|
||||
price REAL NOT NULL,
|
||||
signal TEXT,
|
||||
adx REAL,
|
||||
oi REAL,
|
||||
oi_change REAL,
|
||||
funding_rate REAL,
|
||||
UNIQUE(symbol, ts)
|
||||
);
|
||||
CREATE INDEX idx_candles_symbol_ts ON candles(symbol, ts);
|
||||
```
|
||||
|
||||
### daily_pnl 테이블
|
||||
|
||||
```sql
|
||||
CREATE TABLE daily_pnl (
|
||||
symbol TEXT NOT NULL,
|
||||
date TEXT NOT NULL,
|
||||
cumulative_pnl REAL DEFAULT 0,
|
||||
trade_count INTEGER DEFAULT 0,
|
||||
wins INTEGER DEFAULT 0,
|
||||
losses INTEGER DEFAULT 0,
|
||||
last_updated TEXT,
|
||||
PRIMARY KEY(symbol, date)
|
||||
);
|
||||
```
|
||||
|
||||
### trades 테이블
|
||||
|
||||
기존 `symbol` 컬럼 있음. `DEFAULT 'XRPUSDT'` 제거, 파서에서 항상 명시적으로 심볼 전달.
|
||||
|
||||
### bot_status 테이블
|
||||
|
||||
스키마 변경 없음. 키 네이밍만 `{symbol}:{key}` 형태로 변경.
|
||||
|
||||
### 마이그레이션
|
||||
|
||||
`_init_db()`에서 `DROP TABLE IF EXISTS` → 재생성. 기존 데이터는 로그 재파싱으로 복구.
|
||||
|
||||
## 4. API (`dashboard_api.py`)
|
||||
|
||||
모든 엔드포인트에 `symbol` 쿼리 파라미터 추가. 없으면 전체.
|
||||
|
||||
### 변경 엔드포인트
|
||||
|
||||
| 엔드포인트 | 변경 |
|
||||
|-----------|------|
|
||||
| `GET /api/position` | 심볼별 OPEN 포지션 목록 반환. `{"positions": [...], "bot": {...}}` |
|
||||
| `GET /api/trades` | `?symbol=` 필터 추가 |
|
||||
| `GET /api/stats` | `?symbol=` 필터 추가 |
|
||||
| `GET /api/daily` | `?symbol=` 필터 추가 |
|
||||
| `GET /api/candles` | `?symbol=` 필수 파라미터 |
|
||||
|
||||
### 새 엔드포인트
|
||||
|
||||
```
|
||||
GET /api/symbols → {"symbols": ["XRPUSDT", "TRXUSDT", "DOGEUSDT"]}
|
||||
```
|
||||
|
||||
`bot_status`에서 `{symbol}:last_start` 키가 있는 심볼 목록 반환.
|
||||
|
||||
## 5. UI (`App.jsx`)
|
||||
|
||||
### 헤더
|
||||
|
||||
- "XRP/USDT" 하드코딩 제거 → `Live · 3 symbols`
|
||||
- 오픈 포지션 카드를 심볼별 복수 표시 (가로 나열)
|
||||
|
||||
### 심볼 필터 탭
|
||||
|
||||
기존 탭(Overview/Trades/Chart) 위에 심볼 필터 추가: `ALL | XRP | TRX | DOGE`
|
||||
- `/api/symbols`에서 동적 생성
|
||||
- `ALL`: 전체 합산, 개별 심볼: 해당 심볼만
|
||||
|
||||
### Overview 탭
|
||||
|
||||
- `ALL`: 전체 합산 StatCard + 일별 PnL + 최근 거래(심볼 뱃지 표시)
|
||||
- 개별 심볼: 해당 심볼만
|
||||
|
||||
### Trades 탭
|
||||
|
||||
- 선택된 심볼로 필터링
|
||||
|
||||
### Chart 탭
|
||||
|
||||
- `ALL` 선택 시 첫 번째 심볼 자동 선택 (캔들은 심볼별)
|
||||
- 차트 제목 동적: `{SYMBOL}/USDT 15m 가격`
|
||||
|
||||
### 데이터 페칭
|
||||
|
||||
- `fetchAll`에서 선택된 심볼을 쿼리 파라미터로 전달
|
||||
- 심볼 변경 시 즉시 리페치
|
||||
|
||||
## 6. 변경 범위 요약
|
||||
|
||||
| 레이어 | 파일 | 변경 |
|
||||
|--------|------|------|
|
||||
| 봇 | `src/bot.py` | 로그에 `[SYMBOL]` 프리픽스 추가 |
|
||||
| 봇 | `src/user_data_stream.py` | 청산 로그에 `[SYMBOL]` 프리픽스 추가 |
|
||||
| 파서 | `dashboard/api/log_parser.py` | 정규식, 상태 추적, 핸들러 멀티심볼 대응 |
|
||||
| API | `dashboard/api/dashboard_api.py` | `symbol` 파라미터, `/api/symbols` |
|
||||
| UI | `dashboard/ui/src/App.jsx` | 심볼 필터 탭, 복수 포지션, 동적 헤더 |
|
||||
|
||||
봇 이미지와 대시보드 이미지 모두 재빌드 필요.
|
||||
1259
docs/plans/2026-03-06-multi-symbol-dashboard-plan.md
Normal file
1259
docs/plans/2026-03-06-multi-symbol-dashboard-plan.md
Normal file
File diff suppressed because it is too large
Load Diff
BIN
models/dogeusdt/lgbm_filter_prev.pkl
Normal file
BIN
models/dogeusdt/lgbm_filter_prev.pkl
Normal file
Binary file not shown.
BIN
models/trxusdt/lgbm_filter_prev.pkl
Normal file
BIN
models/trxusdt/lgbm_filter_prev.pkl
Normal file
Binary file not shown.
BIN
models/xrpusdt/lgbm_filter_prev.pkl
Normal file
BIN
models/xrpusdt/lgbm_filter_prev.pkl
Normal file
Binary file not shown.
31436
results/combined/backtest_20260306_222250.json
Normal file
31436
results/combined/backtest_20260306_222250.json
Normal file
File diff suppressed because it is too large
Load Diff
455
results/combined/backtest_20260306_222611.json
Normal file
455
results/combined/backtest_20260306_222611.json
Normal file
@@ -0,0 +1,455 @@
|
||||
{
|
||||
"config": {
|
||||
"symbols": [
|
||||
"XRPUSDT",
|
||||
"TRXUSDT",
|
||||
"DOGEUSDT"
|
||||
],
|
||||
"start": null,
|
||||
"end": null,
|
||||
"initial_balance": 1000.0,
|
||||
"leverage": 10,
|
||||
"fee_pct": 0.04,
|
||||
"slippage_pct": 0.01,
|
||||
"use_ml": true,
|
||||
"ml_threshold": 0.55,
|
||||
"max_daily_loss_pct": 0.05,
|
||||
"max_positions": 3,
|
||||
"max_same_direction": 2,
|
||||
"margin_max_ratio": 0.5,
|
||||
"margin_min_ratio": 0.2,
|
||||
"margin_decay_rate": 0.0006,
|
||||
"atr_sl_mult": 1.5,
|
||||
"atr_tp_mult": 3.0,
|
||||
"min_notional": 5.0
|
||||
},
|
||||
"summary": {
|
||||
"total_trades": 15,
|
||||
"total_pnl": 198.4051,
|
||||
"return_pct": 19.84,
|
||||
"win_rate": 53.33,
|
||||
"avg_win": 32.5332,
|
||||
"avg_loss": -8.8372,
|
||||
"profit_factor": 4.21,
|
||||
"max_drawdown_pct": 2.24,
|
||||
"sharpe_ratio": 79.77,
|
||||
"total_fees": 18.8564,
|
||||
"close_reasons": {
|
||||
"TAKE_PROFIT": 7,
|
||||
"REVERSE_SIGNAL": 3,
|
||||
"STOP_LOSS": 5
|
||||
}
|
||||
},
|
||||
"trades": [
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-05-23 02:15:00+00:00",
|
||||
"exit_time": "2025-05-23 04:30:00+00:00",
|
||||
"entry_price": 2.470853,
|
||||
"exit_price": 2.438268,
|
||||
"quantity": 674.5,
|
||||
"sl": 2.487145,
|
||||
"tp": 2.438268,
|
||||
"gross_pnl": 21.978348,
|
||||
"entry_fee": 0.666636,
|
||||
"exit_fee": 0.657845,
|
||||
"net_pnl": 20.653867,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5847,
|
||||
"indicators": {
|
||||
"rsi": 75.08406565689027,
|
||||
"macd_hist": 0.004905452274126379,
|
||||
"atr": 0.010861550575088958,
|
||||
"adx": 21.704459542796908
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-05-30 00:45:00+00:00",
|
||||
"exit_time": "2025-05-30 02:15:00+00:00",
|
||||
"entry_price": 2.155015,
|
||||
"exit_price": 2.207692,
|
||||
"quantity": 770.0,
|
||||
"sl": 2.128677,
|
||||
"tp": 2.207692,
|
||||
"gross_pnl": 40.56076,
|
||||
"entry_fee": 0.663745,
|
||||
"exit_fee": 0.679969,
|
||||
"net_pnl": 39.217046,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.7602,
|
||||
"indicators": {
|
||||
"rsi": 13.158390769693794,
|
||||
"macd_hist": -0.00797002840932291,
|
||||
"atr": 0.01755877038478085,
|
||||
"adx": 31.17699185815243
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-06-14 04:15:00+00:00",
|
||||
"exit_time": "2025-06-14 08:15:00+00:00",
|
||||
"entry_price": 2.164584,
|
||||
"exit_price": 2.169417,
|
||||
"quantity": 757.7,
|
||||
"sl": 2.175701,
|
||||
"tp": 2.142349,
|
||||
"gross_pnl": -3.662267,
|
||||
"entry_fee": 0.656042,
|
||||
"exit_fee": 0.657507,
|
||||
"net_pnl": -4.975816,
|
||||
"close_reason": "REVERSE_SIGNAL",
|
||||
"ml_proba": 0.6115,
|
||||
"indicators": {
|
||||
"rsi": 69.92512937431012,
|
||||
"macd_hist": 0.0026939087409630215,
|
||||
"atr": 0.007411409293121909,
|
||||
"adx": 20.278562659091943
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-08-14 12:30:00+00:00",
|
||||
"exit_time": "2025-08-14 21:30:00+00:00",
|
||||
"entry_price": 3.132487,
|
||||
"exit_price": 3.035326,
|
||||
"quantity": 524.6,
|
||||
"sl": 3.181067,
|
||||
"tp": 3.035326,
|
||||
"gross_pnl": 50.970515,
|
||||
"entry_fee": 0.657321,
|
||||
"exit_fee": 0.636933,
|
||||
"net_pnl": 49.676261,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.8857,
|
||||
"indicators": {
|
||||
"rsi": 20.976757311144258,
|
||||
"macd_hist": -0.0032317207367513617,
|
||||
"atr": 0.032386907216145205,
|
||||
"adx": 38.70665879423988
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-01 00:15:00+00:00",
|
||||
"exit_time": "2025-09-01 02:45:00+00:00",
|
||||
"entry_price": 2.750075,
|
||||
"exit_price": 2.73304,
|
||||
"quantity": 586.2,
|
||||
"sl": 2.73304,
|
||||
"tp": 2.784144,
|
||||
"gross_pnl": -9.985662,
|
||||
"entry_fee": 0.644838,
|
||||
"exit_fee": 0.640843,
|
||||
"net_pnl": -11.271343,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5754,
|
||||
"indicators": {
|
||||
"rsi": 20.77769666120342,
|
||||
"macd_hist": -0.0054454742314916215,
|
||||
"atr": 0.01135637668410908,
|
||||
"adx": 32.97685850211662
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-10-05 19:00:00+00:00",
|
||||
"exit_time": "2025-10-06 02:45:00+00:00",
|
||||
"entry_price": 2.953995,
|
||||
"exit_price": 2.990353,
|
||||
"quantity": 548.6,
|
||||
"sl": 2.935817,
|
||||
"tp": 2.990353,
|
||||
"gross_pnl": 19.945579,
|
||||
"entry_fee": 0.648225,
|
||||
"exit_fee": 0.656203,
|
||||
"net_pnl": 18.641151,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.6037,
|
||||
"indicators": {
|
||||
"rsi": 22.68978567945751,
|
||||
"macd_hist": -0.003579814992577557,
|
||||
"atr": 0.012119078271027253,
|
||||
"adx": 40.35268005132035
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-10-10 20:45:00+00:00",
|
||||
"exit_time": "2025-10-10 21:00:00+00:00",
|
||||
"entry_price": 2.49595,
|
||||
"exit_price": 2.373231,
|
||||
"quantity": 643.9,
|
||||
"sl": 2.55731,
|
||||
"tp": 2.373231,
|
||||
"gross_pnl": 79.019141,
|
||||
"entry_fee": 0.642857,
|
||||
"exit_fee": 0.611249,
|
||||
"net_pnl": 77.765034,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.8864,
|
||||
"indicators": {
|
||||
"rsi": 17.950089434981262,
|
||||
"macd_hist": -0.010381022790605134,
|
||||
"atr": 0.0409065283069771,
|
||||
"adx": 56.13982003832872
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-10-14 16:15:00+00:00",
|
||||
"exit_time": "2025-10-15 02:15:00+00:00",
|
||||
"entry_price": 2.508449,
|
||||
"exit_price": 2.523552,
|
||||
"quantity": 612.4,
|
||||
"sl": 2.544104,
|
||||
"tp": 2.437139,
|
||||
"gross_pnl": -9.2492,
|
||||
"entry_fee": 0.61447,
|
||||
"exit_fee": 0.618169,
|
||||
"net_pnl": -10.481839,
|
||||
"close_reason": "REVERSE_SIGNAL",
|
||||
"ml_proba": 0.5683,
|
||||
"indicators": {
|
||||
"rsi": 68.85343626442496,
|
||||
"macd_hist": 0.010657476860447013,
|
||||
"atr": 0.023769893751947626,
|
||||
"adx": 39.4255156509299
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-10-27 16:00:00+00:00",
|
||||
"exit_time": "2025-10-27 21:00:00+00:00",
|
||||
"entry_price": 2.674233,
|
||||
"exit_price": 2.623904,
|
||||
"quantity": 578.8,
|
||||
"sl": 2.699397,
|
||||
"tp": 2.623904,
|
||||
"gross_pnl": 29.129941,
|
||||
"entry_fee": 0.619138,
|
||||
"exit_fee": 0.607486,
|
||||
"net_pnl": 27.903316,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5625,
|
||||
"indicators": {
|
||||
"rsi": 66.34709912155408,
|
||||
"macd_hist": 0.005634259928464551,
|
||||
"atr": 0.01677605457389115,
|
||||
"adx": 23.34205636197947
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-11-28 01:45:00+00:00",
|
||||
"exit_time": "2025-11-28 05:30:00+00:00",
|
||||
"entry_price": 2.171517,
|
||||
"exit_price": 2.200054,
|
||||
"quantity": 699.4,
|
||||
"sl": 2.157249,
|
||||
"tp": 2.200054,
|
||||
"gross_pnl": 19.958706,
|
||||
"entry_fee": 0.607504,
|
||||
"exit_fee": 0.615487,
|
||||
"net_pnl": 18.735716,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.6381,
|
||||
"indicators": {
|
||||
"rsi": 22.942287299402874,
|
||||
"macd_hist": -0.003478384036068617,
|
||||
"atr": 0.009512299239799599,
|
||||
"adx": 35.89384138114383
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-12-19 13:15:00+00:00",
|
||||
"exit_time": "2025-12-19 15:15:00+00:00",
|
||||
"entry_price": 1.878712,
|
||||
"exit_price": 1.889911,
|
||||
"quantity": 796.9,
|
||||
"sl": 1.889911,
|
||||
"tp": 1.856315,
|
||||
"gross_pnl": -8.924064,
|
||||
"entry_fee": 0.598858,
|
||||
"exit_fee": 0.602428,
|
||||
"net_pnl": -10.12535,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5945,
|
||||
"indicators": {
|
||||
"rsi": 68.16547032772114,
|
||||
"macd_hist": -4.5929936914913816e-05,
|
||||
"atr": 0.007465649526915487,
|
||||
"adx": 40.69667585881617
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-12-25 22:45:00+00:00",
|
||||
"exit_time": "2025-12-25 23:30:00+00:00",
|
||||
"entry_price": 1.844884,
|
||||
"exit_price": 1.836907,
|
||||
"quantity": 818.5,
|
||||
"sl": 1.836907,
|
||||
"tp": 1.86084,
|
||||
"gross_pnl": -6.529692,
|
||||
"entry_fee": 0.604015,
|
||||
"exit_fee": 0.601403,
|
||||
"net_pnl": -7.735111,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.6099,
|
||||
"indicators": {
|
||||
"rsi": 22.431779710524914,
|
||||
"macd_hist": -0.0022220637884117073,
|
||||
"atr": 0.005318421811566107,
|
||||
"adx": 20.682478174103885
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2026-01-17 15:00:00+00:00",
|
||||
"exit_time": "2026-01-17 15:15:00+00:00",
|
||||
"entry_price": 2.074093,
|
||||
"exit_price": 2.080899,
|
||||
"quantity": 732.6,
|
||||
"sl": 2.080899,
|
||||
"tp": 2.06048,
|
||||
"gross_pnl": -4.986389,
|
||||
"entry_fee": 0.607792,
|
||||
"exit_fee": 0.609787,
|
||||
"net_pnl": -6.203967,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.594,
|
||||
"indicators": {
|
||||
"rsi": 69.16433708427633,
|
||||
"macd_hist": 0.0015812464458042678,
|
||||
"atr": 0.004537618137465387,
|
||||
"adx": 16.189151941493567
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2026-01-30 01:30:00+00:00",
|
||||
"exit_time": "2026-01-30 02:15:00+00:00",
|
||||
"entry_price": 1.743626,
|
||||
"exit_price": 1.733473,
|
||||
"quantity": 875.8,
|
||||
"sl": 1.766432,
|
||||
"tp": 1.698012,
|
||||
"gross_pnl": 8.891376,
|
||||
"entry_fee": 0.610827,
|
||||
"exit_fee": 0.60727,
|
||||
"net_pnl": 7.673278,
|
||||
"close_reason": "REVERSE_SIGNAL",
|
||||
"ml_proba": 0.6829,
|
||||
"indicators": {
|
||||
"rsi": 19.89605260729724,
|
||||
"macd_hist": -0.003114826868995284,
|
||||
"atr": 0.015204543588406344,
|
||||
"adx": 20.39618087837
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2026-02-28 06:15:00+00:00",
|
||||
"exit_time": "2026-02-28 06:30:00+00:00",
|
||||
"entry_price": 1.331433,
|
||||
"exit_price": 1.322797,
|
||||
"quantity": 1141.2,
|
||||
"sl": 1.322797,
|
||||
"tp": 1.348705,
|
||||
"gross_pnl": -9.855576,
|
||||
"entry_fee": 0.607773,
|
||||
"exit_fee": 0.60383,
|
||||
"net_pnl": -11.067179,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.7416,
|
||||
"indicators": {
|
||||
"rsi": 22.07257216583472,
|
||||
"macd_hist": -0.0019878129960472814,
|
||||
"atr": 0.005757434514952236,
|
||||
"adx": 36.23941502849302
|
||||
}
|
||||
}
|
||||
],
|
||||
"validation": {
|
||||
"overall": "FAIL",
|
||||
"checks": [
|
||||
{
|
||||
"name": "exit_after_entry",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "모든 트레이드에서 청산 > 진입"
|
||||
},
|
||||
{
|
||||
"name": "sl_tp_direction",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "SL/TP 방향 정합"
|
||||
},
|
||||
{
|
||||
"name": "no_overlap",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "포지션 비중첩 확인"
|
||||
},
|
||||
{
|
||||
"name": "positive_fees",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "수수료 양수 확인"
|
||||
},
|
||||
{
|
||||
"name": "no_negative_balance",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "잔고 양수 유지"
|
||||
},
|
||||
{
|
||||
"name": "win_rate_high",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "승률 정상 (53.3%)"
|
||||
},
|
||||
{
|
||||
"name": "win_rate_low",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "승률 정상 (53.3%)"
|
||||
},
|
||||
{
|
||||
"name": "mdd_nonzero",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "MDD 정상 (2.2%)"
|
||||
},
|
||||
{
|
||||
"name": "trade_frequency",
|
||||
"passed": false,
|
||||
"level": "WARNING",
|
||||
"message": "월 평균 1.6건 < 5건 — 신호 생성 부족"
|
||||
},
|
||||
{
|
||||
"name": "profit_factor_high",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "PF 정상 (4.21)"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
3744
results/combined/strategy_sweep_20260306_232337.json
Normal file
3744
results/combined/strategy_sweep_20260306_232337.json
Normal file
File diff suppressed because it is too large
Load Diff
3405
results/combined/wf_backtest_20260306_224143.json
Normal file
3405
results/combined/wf_backtest_20260306_224143.json
Normal file
File diff suppressed because it is too large
Load Diff
1241
results/dogeusdt/wf_backtest_20260306_224128.json
Normal file
1241
results/dogeusdt/wf_backtest_20260306_224128.json
Normal file
File diff suppressed because it is too large
Load Diff
1236
results/dogeusdt/wf_backtest_20260306_231221.json
Normal file
1236
results/dogeusdt/wf_backtest_20260306_231221.json
Normal file
File diff suppressed because it is too large
Load Diff
1167
results/trxusdt/wf_backtest_20260306_224117.json
Normal file
1167
results/trxusdt/wf_backtest_20260306_224117.json
Normal file
File diff suppressed because it is too large
Load Diff
900
results/trxusdt/wf_backtest_20260306_231211.json
Normal file
900
results/trxusdt/wf_backtest_20260306_231211.json
Normal file
@@ -0,0 +1,900 @@
|
||||
{
|
||||
"mode": "walk_forward",
|
||||
"config": {
|
||||
"symbols": [
|
||||
"TRXUSDT"
|
||||
],
|
||||
"start": null,
|
||||
"end": null,
|
||||
"initial_balance": 1000.0,
|
||||
"leverage": 10,
|
||||
"fee_pct": 0.04,
|
||||
"slippage_pct": 0.01,
|
||||
"use_ml": false,
|
||||
"ml_threshold": 0.55,
|
||||
"max_daily_loss_pct": 0.05,
|
||||
"max_positions": 3,
|
||||
"max_same_direction": 2,
|
||||
"margin_max_ratio": 0.5,
|
||||
"margin_min_ratio": 0.2,
|
||||
"margin_decay_rate": 0.0006,
|
||||
"atr_sl_mult": 1.0,
|
||||
"atr_tp_mult": 2.0,
|
||||
"min_notional": 5.0,
|
||||
"signal_threshold": 3,
|
||||
"adx_threshold": 20.0,
|
||||
"volume_multiplier": 2.5,
|
||||
"train_months": 3,
|
||||
"test_months": 1,
|
||||
"time_weight_decay": 2.0,
|
||||
"negative_ratio": 5
|
||||
},
|
||||
"summary": {
|
||||
"total_trades": 30,
|
||||
"total_pnl": 82.5579,
|
||||
"return_pct": 8.26,
|
||||
"win_rate": 56.67,
|
||||
"avg_win": 18.6156,
|
||||
"avg_loss": -17.9929,
|
||||
"profit_factor": 1.35,
|
||||
"max_drawdown_pct": 9.39,
|
||||
"sharpe_ratio": 17.82,
|
||||
"total_fees": 115.4404,
|
||||
"close_reasons": {
|
||||
"STOP_LOSS": 13,
|
||||
"TAKE_PROFIT": 17
|
||||
}
|
||||
},
|
||||
"folds": [
|
||||
{
|
||||
"fold": 1,
|
||||
"train_period": "2025-03-05 ~ 2025-06-05",
|
||||
"test_period": "2025-06-05 ~ 2025-07-05",
|
||||
"summary": {
|
||||
"total_trades": 7,
|
||||
"total_pnl": -93.5562,
|
||||
"return_pct": -9.36,
|
||||
"win_rate": 28.57,
|
||||
"avg_win": 21.9794,
|
||||
"avg_loss": -27.503,
|
||||
"profit_factor": 0.32,
|
||||
"max_drawdown_pct": 9.39,
|
||||
"sharpe_ratio": -83.68,
|
||||
"total_fees": 25.9916,
|
||||
"close_reasons": {
|
||||
"STOP_LOSS": 5,
|
||||
"TAKE_PROFIT": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"fold": 2,
|
||||
"train_period": "2025-06-05 ~ 2025-09-05",
|
||||
"test_period": "2025-09-05 ~ 2025-10-05",
|
||||
"summary": {
|
||||
"total_trades": 15,
|
||||
"total_pnl": 155.2593,
|
||||
"return_pct": 15.53,
|
||||
"win_rate": 66.67,
|
||||
"avg_win": 22.197,
|
||||
"avg_loss": -13.3422,
|
||||
"profit_factor": 3.33,
|
||||
"max_drawdown_pct": 2.95,
|
||||
"sharpe_ratio": 63.82,
|
||||
"total_fees": 57.5397,
|
||||
"close_reasons": {
|
||||
"TAKE_PROFIT": 10,
|
||||
"STOP_LOSS": 5
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"fold": 3,
|
||||
"train_period": "2025-09-05 ~ 2025-12-05",
|
||||
"test_period": "2025-12-05 ~ 2026-01-05",
|
||||
"summary": {
|
||||
"total_trades": 8,
|
||||
"total_pnl": 20.8549,
|
||||
"return_pct": 2.09,
|
||||
"win_rate": 62.5,
|
||||
"avg_win": 10.1073,
|
||||
"avg_loss": -9.8938,
|
||||
"profit_factor": 1.7,
|
||||
"max_drawdown_pct": 0.99,
|
||||
"sharpe_ratio": 41.49,
|
||||
"total_fees": 31.9091,
|
||||
"close_reasons": {
|
||||
"TAKE_PROFIT": 5,
|
||||
"STOP_LOSS": 3
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"trades": [
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-06-11 17:00:00",
|
||||
"exit_time": "2025-06-11 17:45:00",
|
||||
"entry_price": 0.282968,
|
||||
"exit_price": 0.281514,
|
||||
"quantity": 17671.6,
|
||||
"sl": 0.281514,
|
||||
"tp": 0.285877,
|
||||
"gross_pnl": -25.701813,
|
||||
"entry_fee": 2.000201,
|
||||
"exit_fee": 1.98992,
|
||||
"net_pnl": -29.691935,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 21.310011221387928,
|
||||
"macd_hist": -0.0009208923407909242,
|
||||
"atr": 0.001454413485759152,
|
||||
"adx": 32.474695496414746
|
||||
},
|
||||
"fold": 1
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-06-13 00:00:00",
|
||||
"exit_time": "2025-06-13 00:15:00",
|
||||
"entry_price": 0.268723,
|
||||
"exit_price": 0.269681,
|
||||
"quantity": 18015.0,
|
||||
"sl": 0.269681,
|
||||
"tp": 0.266808,
|
||||
"gross_pnl": -17.253496,
|
||||
"entry_fee": 1.936419,
|
||||
"exit_fee": 1.94332,
|
||||
"net_pnl": -21.133235,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 26.966927261980565,
|
||||
"macd_hist": -1.9569743207310678e-05,
|
||||
"atr": 0.0009577294352106148,
|
||||
"adx": 26.838036717103265
|
||||
},
|
||||
"fold": 1
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-06-16 12:30:00",
|
||||
"exit_time": "2025-06-16 12:45:00",
|
||||
"entry_price": 0.281208,
|
||||
"exit_price": 0.278854,
|
||||
"quantity": 16808.4,
|
||||
"sl": 0.278854,
|
||||
"tp": 0.285916,
|
||||
"gross_pnl": -39.565619,
|
||||
"entry_fee": 1.890663,
|
||||
"exit_fee": 1.874837,
|
||||
"net_pnl": -43.33112,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 84.3200899004785,
|
||||
"macd_hist": 0.0005755897383287943,
|
||||
"atr": 0.0023539194130354013,
|
||||
"adx": 24.98726333785949
|
||||
},
|
||||
"fold": 1
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-06-16 23:45:00",
|
||||
"exit_time": "2025-06-17 00:00:00",
|
||||
"entry_price": 0.273887,
|
||||
"exit_price": 0.272484,
|
||||
"quantity": 16432.1,
|
||||
"sl": 0.272484,
|
||||
"tp": 0.276694,
|
||||
"gross_pnl": -23.061898,
|
||||
"entry_fee": 1.800218,
|
||||
"exit_fee": 1.790993,
|
||||
"net_pnl": -26.653109,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 28.74454185909087,
|
||||
"macd_hist": -0.0006231433167976357,
|
||||
"atr": 0.0014034662689071044,
|
||||
"adx": 28.215673425255815
|
||||
},
|
||||
"fold": 1
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-06-22 14:15:00",
|
||||
"exit_time": "2025-06-22 14:45:00",
|
||||
"entry_price": 0.264836,
|
||||
"exit_price": 0.267254,
|
||||
"quantity": 16456.4,
|
||||
"sl": 0.263628,
|
||||
"tp": 0.267254,
|
||||
"gross_pnl": 39.776618,
|
||||
"entry_fee": 1.743302,
|
||||
"exit_fee": 1.759213,
|
||||
"net_pnl": 36.274103,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 23.816317652581944,
|
||||
"macd_hist": -0.0007482968367435475,
|
||||
"atr": 0.0012085455367911535,
|
||||
"adx": 28.05756581397983
|
||||
},
|
||||
"fold": 1
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-06-28 07:00:00",
|
||||
"exit_time": "2025-06-28 07:45:00",
|
||||
"entry_price": 0.274403,
|
||||
"exit_price": 0.273718,
|
||||
"quantity": 16508.7,
|
||||
"sl": 0.274745,
|
||||
"tp": 0.273718,
|
||||
"gross_pnl": 11.304155,
|
||||
"entry_fee": 1.812012,
|
||||
"exit_fee": 1.80749,
|
||||
"net_pnl": 7.684653,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 69.9178346428632,
|
||||
"macd_hist": 0.00010551255130301432,
|
||||
"atr": 0.0003423696394189119,
|
||||
"adx": 24.542335118437286
|
||||
},
|
||||
"fold": 1
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-07-04 14:15:00",
|
||||
"exit_time": "2025-07-04 15:15:00",
|
||||
"entry_price": 0.283728,
|
||||
"exit_price": 0.282916,
|
||||
"quantity": 16072.7,
|
||||
"sl": 0.282916,
|
||||
"tp": 0.285354,
|
||||
"gross_pnl": -13.062601,
|
||||
"entry_fee": 1.824112,
|
||||
"exit_fee": 1.818887,
|
||||
"net_pnl": -16.705601,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 27.74105415081286,
|
||||
"macd_hist": -0.0003117196058060476,
|
||||
"atr": 0.0008127197629142321,
|
||||
"adx": 32.363795146724236
|
||||
},
|
||||
"fold": 1
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-09-06 20:45:00",
|
||||
"exit_time": "2025-09-06 21:00:00",
|
||||
"entry_price": 0.321678,
|
||||
"exit_price": 0.319715,
|
||||
"quantity": 15541.9,
|
||||
"sl": 0.322659,
|
||||
"tp": 0.319715,
|
||||
"gross_pnl": 30.509805,
|
||||
"entry_fee": 1.999794,
|
||||
"exit_fee": 1.98759,
|
||||
"net_pnl": 26.522421,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 14.50979679434796,
|
||||
"macd_hist": -0.0001481211181555309,
|
||||
"atr": 0.0009815339390825979,
|
||||
"adx": 64.7935479437538
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-06 22:00:00",
|
||||
"exit_time": "2025-09-06 22:15:00",
|
||||
"entry_price": 0.305541,
|
||||
"exit_price": 0.31122,
|
||||
"quantity": 16274.0,
|
||||
"sl": 0.302701,
|
||||
"tp": 0.31122,
|
||||
"gross_pnl": 92.431123,
|
||||
"entry_fee": 1.988947,
|
||||
"exit_fee": 2.025919,
|
||||
"net_pnl": 88.416257,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 7.92971732591285,
|
||||
"macd_hist": -0.0020195476384628087,
|
||||
"atr": 0.0028398403210786296,
|
||||
"adx": 72.55182590993492
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-08 09:15:00",
|
||||
"exit_time": "2025-09-08 10:00:00",
|
||||
"entry_price": 0.332173,
|
||||
"exit_price": 0.333369,
|
||||
"quantity": 14497.5,
|
||||
"sl": 0.331575,
|
||||
"tp": 0.333369,
|
||||
"gross_pnl": 17.330829,
|
||||
"entry_fee": 1.926272,
|
||||
"exit_fee": 1.933205,
|
||||
"net_pnl": 13.471352,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 65.07783460048826,
|
||||
"macd_hist": 1.5209076637119471e-05,
|
||||
"atr": 0.0005977178625434464,
|
||||
"adx": 29.94633147610989
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-10 12:30:00",
|
||||
"exit_time": "2025-09-10 12:45:00",
|
||||
"entry_price": 0.338144,
|
||||
"exit_price": 0.337604,
|
||||
"quantity": 14159.5,
|
||||
"sl": 0.337604,
|
||||
"tp": 0.339223,
|
||||
"gross_pnl": -7.639274,
|
||||
"entry_fee": 1.915179,
|
||||
"exit_fee": 1.912123,
|
||||
"net_pnl": -11.466576,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 69.27306940076188,
|
||||
"macd_hist": 1.761110324105758e-05,
|
||||
"atr": 0.0005395157903468375,
|
||||
"adx": 28.042143316321827
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-09-13 05:30:00",
|
||||
"exit_time": "2025-09-13 06:45:00",
|
||||
"entry_price": 0.354365,
|
||||
"exit_price": 0.353225,
|
||||
"quantity": 13598.9,
|
||||
"sl": 0.354934,
|
||||
"tp": 0.353225,
|
||||
"gross_pnl": 15.499603,
|
||||
"entry_fee": 1.927587,
|
||||
"exit_fee": 1.921387,
|
||||
"net_pnl": 11.650628,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 75.09668428355302,
|
||||
"macd_hist": 0.00010590971216388305,
|
||||
"atr": 0.0005698844413077655,
|
||||
"adx": 40.031791993546236
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-18 16:15:00",
|
||||
"exit_time": "2025-09-18 17:00:00",
|
||||
"entry_price": 0.349035,
|
||||
"exit_price": 0.350709,
|
||||
"quantity": 13743.4,
|
||||
"sl": 0.348198,
|
||||
"tp": 0.350709,
|
||||
"gross_pnl": 23.014546,
|
||||
"entry_fee": 1.91877,
|
||||
"exit_fee": 1.927976,
|
||||
"net_pnl": 19.167799,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 71.40338684709819,
|
||||
"macd_hist": 2.7945430776989415e-05,
|
||||
"atr": 0.0008372944810174205,
|
||||
"adx": 41.403707409730266
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-09-19 15:00:00",
|
||||
"exit_time": "2025-09-20 02:00:00",
|
||||
"entry_price": 0.344696,
|
||||
"exit_price": 0.342745,
|
||||
"quantity": 13787.0,
|
||||
"sl": 0.345671,
|
||||
"tp": 0.342745,
|
||||
"gross_pnl": 26.891239,
|
||||
"entry_fee": 1.900927,
|
||||
"exit_fee": 1.89017,
|
||||
"net_pnl": 23.100142,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 36.3929743759645,
|
||||
"macd_hist": -4.9173165000631076e-05,
|
||||
"atr": 0.0009752389588793218,
|
||||
"adx": 20.73583082347764
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-09-21 08:15:00",
|
||||
"exit_time": "2025-09-21 09:15:00",
|
||||
"entry_price": 0.344206,
|
||||
"exit_price": 0.343239,
|
||||
"quantity": 13636.7,
|
||||
"sl": 0.344689,
|
||||
"tp": 0.343239,
|
||||
"gross_pnl": 13.180653,
|
||||
"entry_fee": 1.877531,
|
||||
"exit_fee": 1.872259,
|
||||
"net_pnl": 9.430863,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 30.782692658162308,
|
||||
"macd_hist": -7.421870424645718e-05,
|
||||
"atr": 0.0004832786824330342,
|
||||
"adx": 31.221203425283278
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-21 23:00:00",
|
||||
"exit_time": "2025-09-22 00:15:00",
|
||||
"entry_price": 0.342464,
|
||||
"exit_price": 0.342008,
|
||||
"quantity": 13644.1,
|
||||
"sl": 0.342008,
|
||||
"tp": 0.343378,
|
||||
"gross_pnl": -6.231495,
|
||||
"entry_fee": 1.869047,
|
||||
"exit_fee": 1.866554,
|
||||
"net_pnl": -9.967096,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 32.492156959618264,
|
||||
"macd_hist": -0.00011844966177527712,
|
||||
"atr": 0.0004567172002937059,
|
||||
"adx": 30.86524355608222
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-09-22 06:00:00",
|
||||
"exit_time": "2025-09-22 06:30:00",
|
||||
"entry_price": 0.334297,
|
||||
"exit_price": 0.335684,
|
||||
"quantity": 14077.5,
|
||||
"sl": 0.335684,
|
||||
"tp": 0.331521,
|
||||
"gross_pnl": -19.537013,
|
||||
"entry_fee": 1.882424,
|
||||
"exit_fee": 1.890239,
|
||||
"net_pnl": -23.309675,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 19.554287882129668,
|
||||
"macd_hist": -0.00022792604366828832,
|
||||
"atr": 0.0013878183290049766,
|
||||
"adx": 30.760886738521233
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-23 09:00:00",
|
||||
"exit_time": "2025-09-23 09:15:00",
|
||||
"entry_price": 0.341044,
|
||||
"exit_price": 0.342135,
|
||||
"quantity": 14000.1,
|
||||
"sl": 0.340499,
|
||||
"tp": 0.342135,
|
||||
"gross_pnl": 15.274224,
|
||||
"entry_fee": 1.909861,
|
||||
"exit_fee": 1.91597,
|
||||
"net_pnl": 11.448393,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 60.568797010213174,
|
||||
"macd_hist": 4.5460317085828014e-05,
|
||||
"atr": 0.0005455040859896886,
|
||||
"adx": 20.641276471653338
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-27 08:00:00",
|
||||
"exit_time": "2025-09-27 08:30:00",
|
||||
"entry_price": 0.336534,
|
||||
"exit_price": 0.33605,
|
||||
"quantity": 14114.3,
|
||||
"sl": 0.33605,
|
||||
"tp": 0.337501,
|
||||
"gross_pnl": -6.829669,
|
||||
"entry_fee": 1.899975,
|
||||
"exit_fee": 1.897243,
|
||||
"net_pnl": -10.626887,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 28.90053605935814,
|
||||
"macd_hist": -0.00025988593478820746,
|
||||
"atr": 0.00048388294790651314,
|
||||
"adx": 26.380156011508365
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-29 10:00:00",
|
||||
"exit_time": "2025-09-29 10:45:00",
|
||||
"entry_price": 0.332323,
|
||||
"exit_price": 0.333211,
|
||||
"quantity": 14390.1,
|
||||
"sl": 0.331879,
|
||||
"tp": 0.333211,
|
||||
"gross_pnl": 12.782308,
|
||||
"entry_fee": 1.912866,
|
||||
"exit_fee": 1.917979,
|
||||
"net_pnl": 8.951463,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 19.362378267287347,
|
||||
"macd_hist": -0.0002291318308186226,
|
||||
"atr": 0.00044413546950098455,
|
||||
"adx": 29.645494050123773
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-30 03:30:00",
|
||||
"exit_time": "2025-09-30 04:00:00",
|
||||
"entry_price": 0.337134,
|
||||
"exit_price": 0.336601,
|
||||
"quantity": 14131.8,
|
||||
"sl": 0.336601,
|
||||
"tp": 0.3382,
|
||||
"gross_pnl": -7.532294,
|
||||
"entry_fee": 1.905722,
|
||||
"exit_fee": 1.90271,
|
||||
"net_pnl": -11.340726,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 58.81934618554273,
|
||||
"macd_hist": 9.633358724452359e-06,
|
||||
"atr": 0.0005330031631932522,
|
||||
"adx": 34.07177915564808
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-10-01 08:15:00",
|
||||
"exit_time": "2025-10-01 08:45:00",
|
||||
"entry_price": 0.335354,
|
||||
"exit_price": 0.336308,
|
||||
"quantity": 14305.7,
|
||||
"sl": 0.334876,
|
||||
"tp": 0.336308,
|
||||
"gross_pnl": 13.654332,
|
||||
"entry_fee": 1.918987,
|
||||
"exit_fee": 1.924449,
|
||||
"net_pnl": 9.810896,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 70.24789531394917,
|
||||
"macd_hist": 4.729285330987371e-05,
|
||||
"atr": 0.0004772339591884286,
|
||||
"adx": 31.542285567700812
|
||||
},
|
||||
"fold": 2
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-12-08 23:15:00",
|
||||
"exit_time": "2025-12-09 00:00:00",
|
||||
"entry_price": 0.281402,
|
||||
"exit_price": 0.28061,
|
||||
"quantity": 17766.4,
|
||||
"sl": 0.281798,
|
||||
"tp": 0.28061,
|
||||
"gross_pnl": 14.063894,
|
||||
"entry_fee": 1.999799,
|
||||
"exit_fee": 1.994174,
|
||||
"net_pnl": 10.069921,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 22.36971195563758,
|
||||
"macd_hist": -5.3411406416355763e-05,
|
||||
"atr": 0.0003958003322855375,
|
||||
"adx": 36.500835949606106
|
||||
},
|
||||
"fold": 3
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-12-12 07:45:00",
|
||||
"exit_time": "2025-12-12 08:15:00",
|
||||
"entry_price": 0.278582,
|
||||
"exit_price": 0.277953,
|
||||
"quantity": 17915.9,
|
||||
"sl": 0.278897,
|
||||
"tp": 0.277953,
|
||||
"gross_pnl": 11.265055,
|
||||
"entry_fee": 1.99642,
|
||||
"exit_fee": 1.991914,
|
||||
"net_pnl": 7.276721,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 29.438038967517357,
|
||||
"macd_hist": -2.5520992386730775e-05,
|
||||
"atr": 0.0003143870866373587,
|
||||
"adx": 26.711440675930646
|
||||
},
|
||||
"fold": 3
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-12-12 15:30:00",
|
||||
"exit_time": "2025-12-12 15:45:00",
|
||||
"entry_price": 0.276062,
|
||||
"exit_price": 0.275244,
|
||||
"quantity": 18057.8,
|
||||
"sl": 0.276471,
|
||||
"tp": 0.275244,
|
||||
"gross_pnl": 14.773959,
|
||||
"entry_fee": 1.994032,
|
||||
"exit_fee": 1.988122,
|
||||
"net_pnl": 10.791805,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 28.751521638219945,
|
||||
"macd_hist": -8.36146151699088e-06,
|
||||
"atr": 0.00040907415881422674,
|
||||
"adx": 39.02029513782675
|
||||
},
|
||||
"fold": 3
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-12-13 08:00:00",
|
||||
"exit_time": "2025-12-13 10:15:00",
|
||||
"entry_price": 0.272847,
|
||||
"exit_price": 0.272547,
|
||||
"quantity": 18235.1,
|
||||
"sl": 0.272547,
|
||||
"tp": 0.273447,
|
||||
"gross_pnl": -5.469501,
|
||||
"entry_fee": 1.990159,
|
||||
"exit_fee": 1.987971,
|
||||
"net_pnl": -9.447632,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 29.793316197464588,
|
||||
"macd_hist": -7.840319164560051e-05,
|
||||
"atr": 0.00029994358844533694,
|
||||
"adx": 21.992497694217974
|
||||
},
|
||||
"fold": 3
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-12-15 00:00:00",
|
||||
"exit_time": "2025-12-15 01:00:00",
|
||||
"entry_price": 0.277738,
|
||||
"exit_price": 0.27865,
|
||||
"quantity": 17963.3,
|
||||
"sl": 0.277282,
|
||||
"tp": 0.27865,
|
||||
"gross_pnl": 16.381607,
|
||||
"entry_fee": 1.995635,
|
||||
"exit_fee": 2.002187,
|
||||
"net_pnl": 12.383784,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 67.78500804560913,
|
||||
"macd_hist": 4.083572769007836e-06,
|
||||
"atr": 0.00045597430865612724,
|
||||
"adx": 21.311964821547978
|
||||
},
|
||||
"fold": 3
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-12-26 15:00:00",
|
||||
"exit_time": "2025-12-26 15:30:00",
|
||||
"entry_price": 0.277452,
|
||||
"exit_price": 0.277801,
|
||||
"quantity": 17933.7,
|
||||
"sl": 0.277801,
|
||||
"tp": 0.276756,
|
||||
"gross_pnl": -6.246853,
|
||||
"entry_fee": 1.990298,
|
||||
"exit_fee": 1.992797,
|
||||
"net_pnl": -10.229948,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 29.51622507815984,
|
||||
"macd_hist": -4.6760678561223154e-05,
|
||||
"atr": 0.0003483303942996465,
|
||||
"adx": 36.669526375660595
|
||||
},
|
||||
"fold": 3
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-12-27 20:00:00",
|
||||
"exit_time": "2025-12-27 22:00:00",
|
||||
"entry_price": 0.283318,
|
||||
"exit_price": 0.284114,
|
||||
"quantity": 17616.7,
|
||||
"sl": 0.282921,
|
||||
"tp": 0.284114,
|
||||
"gross_pnl": 14.012606,
|
||||
"entry_fee": 1.996454,
|
||||
"exit_fee": 2.002059,
|
||||
"net_pnl": 10.014094,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 77.49503286668957,
|
||||
"macd_hist": 3.5147071292014305e-05,
|
||||
"atr": 0.00039770804019150625,
|
||||
"adx": 43.053847108404184
|
||||
},
|
||||
"fold": 3
|
||||
},
|
||||
{
|
||||
"symbol": "TRXUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2026-01-04 00:00:00",
|
||||
"exit_time": "2026-01-04 00:30:00",
|
||||
"entry_price": 0.294841,
|
||||
"exit_price": 0.295197,
|
||||
"quantity": 16893.5,
|
||||
"sl": 0.295197,
|
||||
"tp": 0.294128,
|
||||
"gross_pnl": -6.016701,
|
||||
"entry_fee": 1.992355,
|
||||
"exit_fee": 1.994762,
|
||||
"net_pnl": -10.003818,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": null,
|
||||
"indicators": {
|
||||
"rsi": 66.6678799584072,
|
||||
"macd_hist": -3.2551549800375387e-05,
|
||||
"atr": 0.00035615479915180313,
|
||||
"adx": 74.06247870613235
|
||||
},
|
||||
"fold": 3
|
||||
}
|
||||
],
|
||||
"validation": {
|
||||
"overall": "FAIL",
|
||||
"checks": [
|
||||
{
|
||||
"name": "exit_after_entry",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "모든 트레이드에서 청산 > 진입"
|
||||
},
|
||||
{
|
||||
"name": "sl_tp_direction",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "SL/TP 방향 정합"
|
||||
},
|
||||
{
|
||||
"name": "no_overlap",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "포지션 비중첩 확인"
|
||||
},
|
||||
{
|
||||
"name": "positive_fees",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "수수료 양수 확인"
|
||||
},
|
||||
{
|
||||
"name": "no_negative_balance",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "잔고 양수 유지"
|
||||
},
|
||||
{
|
||||
"name": "win_rate_high",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "승률 정상 (56.7%)"
|
||||
},
|
||||
{
|
||||
"name": "win_rate_low",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "승률 정상 (56.7%)"
|
||||
},
|
||||
{
|
||||
"name": "mdd_nonzero",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "MDD 정상 (9.4%)"
|
||||
},
|
||||
{
|
||||
"name": "trade_frequency",
|
||||
"passed": false,
|
||||
"level": "WARNING",
|
||||
"message": "월 평균 4.4건 < 5건 — 신호 생성 부족"
|
||||
},
|
||||
{
|
||||
"name": "profit_factor_high",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "PF 정상 (1.35)"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
10767
results/xrpusdt/backtest_20260306_222136.json
Normal file
10767
results/xrpusdt/backtest_20260306_222136.json
Normal file
File diff suppressed because it is too large
Load Diff
10803
results/xrpusdt/backtest_20260306_222219.json
Normal file
10803
results/xrpusdt/backtest_20260306_222219.json
Normal file
File diff suppressed because it is too large
Load Diff
453
results/xrpusdt/backtest_20260306_222244.json
Normal file
453
results/xrpusdt/backtest_20260306_222244.json
Normal file
@@ -0,0 +1,453 @@
|
||||
{
|
||||
"config": {
|
||||
"symbols": [
|
||||
"XRPUSDT"
|
||||
],
|
||||
"start": null,
|
||||
"end": null,
|
||||
"initial_balance": 1000.0,
|
||||
"leverage": 10,
|
||||
"fee_pct": 0.04,
|
||||
"slippage_pct": 0.01,
|
||||
"use_ml": true,
|
||||
"ml_threshold": 0.55,
|
||||
"max_daily_loss_pct": 0.05,
|
||||
"max_positions": 3,
|
||||
"max_same_direction": 2,
|
||||
"margin_max_ratio": 0.5,
|
||||
"margin_min_ratio": 0.2,
|
||||
"margin_decay_rate": 0.0006,
|
||||
"atr_sl_mult": 1.5,
|
||||
"atr_tp_mult": 3.0,
|
||||
"min_notional": 5.0
|
||||
},
|
||||
"summary": {
|
||||
"total_trades": 15,
|
||||
"total_pnl": 539.9409,
|
||||
"return_pct": 53.99,
|
||||
"win_rate": 53.33,
|
||||
"avg_win": 84.5208,
|
||||
"avg_loss": -19.4607,
|
||||
"profit_factor": 4.96,
|
||||
"max_drawdown_pct": 3.57,
|
||||
"sharpe_ratio": 83.64,
|
||||
"total_fees": 45.0812,
|
||||
"close_reasons": {
|
||||
"TAKE_PROFIT": 7,
|
||||
"REVERSE_SIGNAL": 3,
|
||||
"STOP_LOSS": 5
|
||||
}
|
||||
},
|
||||
"trades": [
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-05-23 02:15:00+00:00",
|
||||
"exit_time": "2025-05-23 04:30:00+00:00",
|
||||
"entry_price": 2.470853,
|
||||
"exit_price": 2.438268,
|
||||
"quantity": 2023.4,
|
||||
"sl": 2.487145,
|
||||
"tp": 2.438268,
|
||||
"gross_pnl": 65.931784,
|
||||
"entry_fee": 1.999809,
|
||||
"exit_fee": 1.973437,
|
||||
"net_pnl": 61.958538,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5847,
|
||||
"indicators": {
|
||||
"rsi": 75.08406565689027,
|
||||
"macd_hist": 0.004905452274126379,
|
||||
"atr": 0.010861550575088958,
|
||||
"adx": 21.704459542796908
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-05-30 00:45:00+00:00",
|
||||
"exit_time": "2025-05-30 02:15:00+00:00",
|
||||
"entry_price": 2.155015,
|
||||
"exit_price": 2.207692,
|
||||
"quantity": 2282.6,
|
||||
"sl": 2.128677,
|
||||
"tp": 2.207692,
|
||||
"gross_pnl": 120.238948,
|
||||
"entry_fee": 1.967615,
|
||||
"exit_fee": 2.015711,
|
||||
"net_pnl": 116.255622,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.7602,
|
||||
"indicators": {
|
||||
"rsi": 13.158390769693794,
|
||||
"macd_hist": -0.00797002840932291,
|
||||
"atr": 0.01755877038478085,
|
||||
"adx": 31.17699185815243
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-06-14 04:15:00+00:00",
|
||||
"exit_time": "2025-06-14 08:15:00+00:00",
|
||||
"entry_price": 2.164584,
|
||||
"exit_price": 2.169417,
|
||||
"quantity": 2145.0,
|
||||
"sl": 2.175701,
|
||||
"tp": 2.142349,
|
||||
"gross_pnl": -10.367643,
|
||||
"entry_fee": 1.857213,
|
||||
"exit_fee": 1.86136,
|
||||
"net_pnl": -14.086215,
|
||||
"close_reason": "REVERSE_SIGNAL",
|
||||
"ml_proba": 0.6115,
|
||||
"indicators": {
|
||||
"rsi": 69.92512937431012,
|
||||
"macd_hist": 0.0026939087409630215,
|
||||
"atr": 0.007411409293121909,
|
||||
"adx": 20.278562659091943
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-08-14 12:30:00+00:00",
|
||||
"exit_time": "2025-08-14 21:30:00+00:00",
|
||||
"entry_price": 3.132487,
|
||||
"exit_price": 3.035326,
|
||||
"quantity": 1497.5,
|
||||
"sl": 3.181067,
|
||||
"tp": 3.035326,
|
||||
"gross_pnl": 145.498181,
|
||||
"entry_fee": 1.87636,
|
||||
"exit_fee": 1.81816,
|
||||
"net_pnl": 141.803661,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.8857,
|
||||
"indicators": {
|
||||
"rsi": 20.976757311144258,
|
||||
"macd_hist": -0.0032317207367513617,
|
||||
"atr": 0.032386907216145205,
|
||||
"adx": 38.70665879423988
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-01 00:15:00+00:00",
|
||||
"exit_time": "2025-09-01 02:45:00+00:00",
|
||||
"entry_price": 2.750075,
|
||||
"exit_price": 2.73304,
|
||||
"quantity": 1515.8,
|
||||
"sl": 2.73304,
|
||||
"tp": 2.784144,
|
||||
"gross_pnl": -25.820994,
|
||||
"entry_fee": 1.667425,
|
||||
"exit_fee": 1.657097,
|
||||
"net_pnl": -29.145516,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5754,
|
||||
"indicators": {
|
||||
"rsi": 20.77769666120342,
|
||||
"macd_hist": -0.0054454742314916215,
|
||||
"atr": 0.01135637668410908,
|
||||
"adx": 32.97685850211662
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-10-05 19:00:00+00:00",
|
||||
"exit_time": "2025-10-06 02:45:00+00:00",
|
||||
"entry_price": 2.953995,
|
||||
"exit_price": 2.990353,
|
||||
"quantity": 1457.0,
|
||||
"sl": 2.935817,
|
||||
"tp": 2.990353,
|
||||
"gross_pnl": 52.972491,
|
||||
"entry_fee": 1.721589,
|
||||
"exit_fee": 1.742777,
|
||||
"net_pnl": 49.508125,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.6037,
|
||||
"indicators": {
|
||||
"rsi": 22.68978567945751,
|
||||
"macd_hist": -0.003579814992577557,
|
||||
"atr": 0.012119078271027253,
|
||||
"adx": 40.35268005132035
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-10-10 20:45:00+00:00",
|
||||
"exit_time": "2025-10-10 21:00:00+00:00",
|
||||
"entry_price": 2.49595,
|
||||
"exit_price": 2.373231,
|
||||
"quantity": 1638.0,
|
||||
"sl": 2.55731,
|
||||
"tp": 2.373231,
|
||||
"gross_pnl": 201.01468,
|
||||
"entry_fee": 1.635347,
|
||||
"exit_fee": 1.554941,
|
||||
"net_pnl": 197.824393,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.8864,
|
||||
"indicators": {
|
||||
"rsi": 17.950089434981262,
|
||||
"macd_hist": -0.010381022790605134,
|
||||
"atr": 0.0409065283069771,
|
||||
"adx": 56.13982003832872
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-10-14 16:15:00+00:00",
|
||||
"exit_time": "2025-10-15 02:15:00+00:00",
|
||||
"entry_price": 2.508449,
|
||||
"exit_price": 2.523552,
|
||||
"quantity": 1204.9,
|
||||
"sl": 2.544104,
|
||||
"tp": 2.437139,
|
||||
"gross_pnl": -18.197846,
|
||||
"entry_fee": 1.208972,
|
||||
"exit_fee": 1.216251,
|
||||
"net_pnl": -20.623069,
|
||||
"close_reason": "REVERSE_SIGNAL",
|
||||
"ml_proba": 0.5683,
|
||||
"indicators": {
|
||||
"rsi": 68.85343626442496,
|
||||
"macd_hist": 0.010657476860447013,
|
||||
"atr": 0.023769893751947626,
|
||||
"adx": 39.4255156509299
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-10-27 16:00:00+00:00",
|
||||
"exit_time": "2025-10-27 21:00:00+00:00",
|
||||
"entry_price": 2.674233,
|
||||
"exit_price": 2.623904,
|
||||
"quantity": 1148.8,
|
||||
"sl": 2.699397,
|
||||
"tp": 2.623904,
|
||||
"gross_pnl": 57.816994,
|
||||
"entry_fee": 1.228863,
|
||||
"exit_fee": 1.205737,
|
||||
"net_pnl": 55.382395,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5625,
|
||||
"indicators": {
|
||||
"rsi": 66.34709912155408,
|
||||
"macd_hist": 0.005634259928464551,
|
||||
"atr": 0.01677605457389115,
|
||||
"adx": 23.34205636197947
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-11-28 01:45:00+00:00",
|
||||
"exit_time": "2025-11-28 05:30:00+00:00",
|
||||
"entry_price": 2.171517,
|
||||
"exit_price": 2.200054,
|
||||
"quantity": 1421.9,
|
||||
"sl": 2.157249,
|
||||
"tp": 2.200054,
|
||||
"gross_pnl": 40.576615,
|
||||
"entry_fee": 1.235072,
|
||||
"exit_fee": 1.251303,
|
||||
"net_pnl": 38.09024,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.6381,
|
||||
"indicators": {
|
||||
"rsi": 22.942287299402874,
|
||||
"macd_hist": -0.003478384036068617,
|
||||
"atr": 0.009512299239799599,
|
||||
"adx": 35.89384138114383
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-12-19 13:15:00+00:00",
|
||||
"exit_time": "2025-12-19 15:15:00+00:00",
|
||||
"entry_price": 1.878712,
|
||||
"exit_price": 1.889911,
|
||||
"quantity": 1682.4,
|
||||
"sl": 1.889911,
|
||||
"tp": 1.856315,
|
||||
"gross_pnl": -18.840313,
|
||||
"entry_fee": 1.264298,
|
||||
"exit_fee": 1.271834,
|
||||
"net_pnl": -21.376445,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5945,
|
||||
"indicators": {
|
||||
"rsi": 68.16547032772114,
|
||||
"macd_hist": -4.5929936914913816e-05,
|
||||
"atr": 0.007465649526915487,
|
||||
"adx": 40.69667585881617
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-12-25 22:45:00+00:00",
|
||||
"exit_time": "2025-12-25 23:30:00+00:00",
|
||||
"entry_price": 1.844884,
|
||||
"exit_price": 1.836907,
|
||||
"quantity": 1689.1,
|
||||
"sl": 1.836907,
|
||||
"tp": 1.86084,
|
||||
"gross_pnl": -13.475019,
|
||||
"entry_fee": 1.246478,
|
||||
"exit_fee": 1.241088,
|
||||
"net_pnl": -15.962585,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.6099,
|
||||
"indicators": {
|
||||
"rsi": 22.431779710524914,
|
||||
"macd_hist": -0.0022220637884117073,
|
||||
"atr": 0.005318421811566107,
|
||||
"adx": 20.682478174103885
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2026-01-17 15:00:00+00:00",
|
||||
"exit_time": "2026-01-17 15:15:00+00:00",
|
||||
"entry_price": 2.074093,
|
||||
"exit_price": 2.080899,
|
||||
"quantity": 1485.5,
|
||||
"sl": 2.080899,
|
||||
"tp": 2.06048,
|
||||
"gross_pnl": -10.110948,
|
||||
"entry_fee": 1.232426,
|
||||
"exit_fee": 1.23647,
|
||||
"net_pnl": -12.579844,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.594,
|
||||
"indicators": {
|
||||
"rsi": 69.16433708427633,
|
||||
"macd_hist": 0.0015812464458042678,
|
||||
"atr": 0.004537618137465387,
|
||||
"adx": 16.189151941493567
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2026-01-30 01:30:00+00:00",
|
||||
"exit_time": "2026-01-30 02:15:00+00:00",
|
||||
"entry_price": 1.743626,
|
||||
"exit_price": 1.733473,
|
||||
"quantity": 1751.2,
|
||||
"sl": 1.766432,
|
||||
"tp": 1.698012,
|
||||
"gross_pnl": 17.77869,
|
||||
"entry_fee": 1.221375,
|
||||
"exit_fee": 1.214263,
|
||||
"net_pnl": 15.343052,
|
||||
"close_reason": "REVERSE_SIGNAL",
|
||||
"ml_proba": 0.6829,
|
||||
"indicators": {
|
||||
"rsi": 19.89605260729724,
|
||||
"macd_hist": -0.003114826868995284,
|
||||
"atr": 0.015204543588406344,
|
||||
"adx": 20.39618087837
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2026-02-28 06:15:00+00:00",
|
||||
"exit_time": "2026-02-28 06:30:00+00:00",
|
||||
"entry_price": 1.331433,
|
||||
"exit_price": 1.322797,
|
||||
"quantity": 2315.1,
|
||||
"sl": 1.322797,
|
||||
"tp": 1.348705,
|
||||
"gross_pnl": -19.993555,
|
||||
"entry_fee": 1.23296,
|
||||
"exit_fee": 1.224963,
|
||||
"net_pnl": -22.451478,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.7416,
|
||||
"indicators": {
|
||||
"rsi": 22.07257216583472,
|
||||
"macd_hist": -0.0019878129960472814,
|
||||
"atr": 0.005757434514952236,
|
||||
"adx": 36.23941502849302
|
||||
}
|
||||
}
|
||||
],
|
||||
"validation": {
|
||||
"overall": "FAIL",
|
||||
"checks": [
|
||||
{
|
||||
"name": "exit_after_entry",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "모든 트레이드에서 청산 > 진입"
|
||||
},
|
||||
{
|
||||
"name": "sl_tp_direction",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "SL/TP 방향 정합"
|
||||
},
|
||||
{
|
||||
"name": "no_overlap",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "포지션 비중첩 확인"
|
||||
},
|
||||
{
|
||||
"name": "positive_fees",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "수수료 양수 확인"
|
||||
},
|
||||
{
|
||||
"name": "no_negative_balance",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "잔고 양수 유지"
|
||||
},
|
||||
{
|
||||
"name": "win_rate_high",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "승률 정상 (53.3%)"
|
||||
},
|
||||
{
|
||||
"name": "win_rate_low",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "승률 정상 (53.3%)"
|
||||
},
|
||||
{
|
||||
"name": "mdd_nonzero",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "MDD 정상 (3.6%)"
|
||||
},
|
||||
{
|
||||
"name": "trade_frequency",
|
||||
"passed": false,
|
||||
"level": "WARNING",
|
||||
"message": "월 평균 1.6건 < 5건 — 신호 생성 부족"
|
||||
},
|
||||
{
|
||||
"name": "profit_factor_high",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "PF 정상 (4.96)"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
729
results/xrpusdt/backtest_20260306_222616.json
Normal file
729
results/xrpusdt/backtest_20260306_222616.json
Normal file
@@ -0,0 +1,729 @@
|
||||
{
|
||||
"config": {
|
||||
"symbols": [
|
||||
"XRPUSDT"
|
||||
],
|
||||
"start": null,
|
||||
"end": null,
|
||||
"initial_balance": 1000.0,
|
||||
"leverage": 10,
|
||||
"fee_pct": 0.04,
|
||||
"slippage_pct": 0.01,
|
||||
"use_ml": true,
|
||||
"ml_threshold": 0.5,
|
||||
"max_daily_loss_pct": 0.05,
|
||||
"max_positions": 3,
|
||||
"max_same_direction": 2,
|
||||
"margin_max_ratio": 0.5,
|
||||
"margin_min_ratio": 0.2,
|
||||
"margin_decay_rate": 0.0006,
|
||||
"atr_sl_mult": 1.5,
|
||||
"atr_tp_mult": 3.0,
|
||||
"min_notional": 5.0
|
||||
},
|
||||
"summary": {
|
||||
"total_trades": 27,
|
||||
"total_pnl": 578.3703,
|
||||
"return_pct": 57.84,
|
||||
"win_rate": 44.44,
|
||||
"avg_win": 76.4564,
|
||||
"avg_loss": -22.6071,
|
||||
"profit_factor": 2.71,
|
||||
"max_drawdown_pct": 5.94,
|
||||
"sharpe_ratio": 56.92,
|
||||
"total_fees": 78.3336,
|
||||
"close_reasons": {
|
||||
"TAKE_PROFIT": 11,
|
||||
"STOP_LOSS": 13,
|
||||
"REVERSE_SIGNAL": 3
|
||||
}
|
||||
},
|
||||
"trades": [
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-04-22 21:30:00+00:00",
|
||||
"exit_time": "2025-04-22 21:45:00+00:00",
|
||||
"entry_price": 2.193119,
|
||||
"exit_price": 2.231438,
|
||||
"quantity": 2280.1,
|
||||
"sl": 2.17396,
|
||||
"tp": 2.231438,
|
||||
"gross_pnl": 87.370701,
|
||||
"entry_fee": 2.000213,
|
||||
"exit_fee": 2.035161,
|
||||
"net_pnl": 83.335328,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5255,
|
||||
"indicators": {
|
||||
"rsi": 71.28868810200514,
|
||||
"macd_hist": 0.0011497360749260716,
|
||||
"atr": 0.01277293415280779,
|
||||
"adx": 21.692956014763777
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-04-30 13:45:00+00:00",
|
||||
"exit_time": "2025-04-30 17:30:00+00:00",
|
||||
"entry_price": 2.126213,
|
||||
"exit_price": 2.178374,
|
||||
"quantity": 2294.9,
|
||||
"sl": 2.100132,
|
||||
"tp": 2.178374,
|
||||
"gross_pnl": 119.704067,
|
||||
"entry_fee": 1.951778,
|
||||
"exit_fee": 1.99966,
|
||||
"net_pnl": 115.752629,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5189,
|
||||
"indicators": {
|
||||
"rsi": 18.339202470468877,
|
||||
"macd_hist": -0.009422791981245153,
|
||||
"atr": 0.01738696923950385,
|
||||
"adx": 37.751592918358305
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-05-12 07:00:00+00:00",
|
||||
"exit_time": "2025-05-12 07:45:00+00:00",
|
||||
"entry_price": 2.429643,
|
||||
"exit_price": 2.406718,
|
||||
"quantity": 1883.8,
|
||||
"sl": 2.406718,
|
||||
"tp": 2.475492,
|
||||
"gross_pnl": -43.185431,
|
||||
"entry_fee": 1.830785,
|
||||
"exit_fee": 1.81351,
|
||||
"net_pnl": -46.829726,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5212,
|
||||
"indicators": {
|
||||
"rsi": 69.38835524860481,
|
||||
"macd_hist": 0.0015144198204793255,
|
||||
"atr": 0.01528309116959292,
|
||||
"adx": 13.164741033292744
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-05-23 02:15:00+00:00",
|
||||
"exit_time": "2025-05-23 04:30:00+00:00",
|
||||
"entry_price": 2.470853,
|
||||
"exit_price": 2.438268,
|
||||
"quantity": 1912.0,
|
||||
"sl": 2.487145,
|
||||
"tp": 2.438268,
|
||||
"gross_pnl": 62.301854,
|
||||
"entry_fee": 1.889708,
|
||||
"exit_fee": 1.864788,
|
||||
"net_pnl": 58.547358,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5847,
|
||||
"indicators": {
|
||||
"rsi": 75.08406565689027,
|
||||
"macd_hist": 0.004905452274126379,
|
||||
"atr": 0.010861550575088958,
|
||||
"adx": 21.704459542796908
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-05-30 00:45:00+00:00",
|
||||
"exit_time": "2025-05-30 02:15:00+00:00",
|
||||
"entry_price": 2.155015,
|
||||
"exit_price": 2.207692,
|
||||
"quantity": 2111.2,
|
||||
"sl": 2.128677,
|
||||
"tp": 2.207692,
|
||||
"gross_pnl": 111.210228,
|
||||
"entry_fee": 1.819867,
|
||||
"exit_fee": 1.864352,
|
||||
"net_pnl": 107.526009,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.7602,
|
||||
"indicators": {
|
||||
"rsi": 13.158390769693794,
|
||||
"macd_hist": -0.00797002840932291,
|
||||
"atr": 0.01755877038478085,
|
||||
"adx": 31.17699185815243
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-06-14 04:15:00+00:00",
|
||||
"exit_time": "2025-06-14 08:15:00+00:00",
|
||||
"entry_price": 2.164584,
|
||||
"exit_price": 2.169417,
|
||||
"quantity": 1902.7,
|
||||
"sl": 2.175701,
|
||||
"tp": 2.142349,
|
||||
"gross_pnl": -9.19651,
|
||||
"entry_fee": 1.647421,
|
||||
"exit_fee": 1.6511,
|
||||
"net_pnl": -12.495031,
|
||||
"close_reason": "REVERSE_SIGNAL",
|
||||
"ml_proba": 0.6115,
|
||||
"indicators": {
|
||||
"rsi": 69.92512937431012,
|
||||
"macd_hist": 0.0026939087409630215,
|
||||
"atr": 0.007411409293121909,
|
||||
"adx": 20.278562659091943
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-08-09 05:00:00+00:00",
|
||||
"exit_time": "2025-08-09 13:15:00+00:00",
|
||||
"entry_price": 3.312231,
|
||||
"exit_price": 3.292646,
|
||||
"quantity": 1263.4,
|
||||
"sl": 3.292646,
|
||||
"tp": 3.351402,
|
||||
"gross_pnl": -24.744208,
|
||||
"entry_fee": 1.673869,
|
||||
"exit_fee": 1.663971,
|
||||
"net_pnl": -28.082049,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5224,
|
||||
"indicators": {
|
||||
"rsi": 59.23947009852718,
|
||||
"macd_hist": 0.0003900966619318647,
|
||||
"atr": 0.013056940780994142,
|
||||
"adx": 10.004914128021252
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-08-14 12:30:00+00:00",
|
||||
"exit_time": "2025-08-14 21:30:00+00:00",
|
||||
"entry_price": 3.132487,
|
||||
"exit_price": 3.035326,
|
||||
"quantity": 1377.0,
|
||||
"sl": 3.181067,
|
||||
"tp": 3.035326,
|
||||
"gross_pnl": 133.790314,
|
||||
"entry_fee": 1.725374,
|
||||
"exit_fee": 1.671858,
|
||||
"net_pnl": 130.393082,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.8857,
|
||||
"indicators": {
|
||||
"rsi": 20.976757311144258,
|
||||
"macd_hist": -0.0032317207367513617,
|
||||
"atr": 0.032386907216145205,
|
||||
"adx": 38.70665879423988
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-09-01 00:15:00+00:00",
|
||||
"exit_time": "2025-09-01 02:45:00+00:00",
|
||||
"entry_price": 2.750075,
|
||||
"exit_price": 2.73304,
|
||||
"quantity": 1337.1,
|
||||
"sl": 2.73304,
|
||||
"tp": 2.784144,
|
||||
"gross_pnl": -22.776917,
|
||||
"entry_fee": 1.47085,
|
||||
"exit_fee": 1.461739,
|
||||
"net_pnl": -25.709506,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5754,
|
||||
"indicators": {
|
||||
"rsi": 20.77769666120342,
|
||||
"macd_hist": -0.0054454742314916215,
|
||||
"atr": 0.01135637668410908,
|
||||
"adx": 32.97685850211662
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-10-05 19:00:00+00:00",
|
||||
"exit_time": "2025-10-06 02:45:00+00:00",
|
||||
"entry_price": 2.953995,
|
||||
"exit_price": 2.990353,
|
||||
"quantity": 1296.0,
|
||||
"sl": 2.935817,
|
||||
"tp": 2.990353,
|
||||
"gross_pnl": 47.118976,
|
||||
"entry_fee": 1.531351,
|
||||
"exit_fee": 1.550199,
|
||||
"net_pnl": 44.037426,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.6037,
|
||||
"indicators": {
|
||||
"rsi": 22.68978567945751,
|
||||
"macd_hist": -0.003579814992577557,
|
||||
"atr": 0.012119078271027253,
|
||||
"adx": 40.35268005132035
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-10-10 03:30:00+00:00",
|
||||
"exit_time": "2025-10-10 04:30:00+00:00",
|
||||
"entry_price": 2.824282,
|
||||
"exit_price": 2.80916,
|
||||
"quantity": 1270.4,
|
||||
"sl": 2.80916,
|
||||
"tp": 2.854527,
|
||||
"gross_pnl": -19.211087,
|
||||
"entry_fee": 1.435187,
|
||||
"exit_fee": 1.427503,
|
||||
"net_pnl": -22.073778,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5018,
|
||||
"indicators": {
|
||||
"rsi": 62.01041612364824,
|
||||
"macd_hist": 0.0007930491111498017,
|
||||
"atr": 0.010081385063037305,
|
||||
"adx": 15.010710180807658
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-10-10 20:45:00+00:00",
|
||||
"exit_time": "2025-10-10 21:00:00+00:00",
|
||||
"entry_price": 2.49595,
|
||||
"exit_price": 2.373231,
|
||||
"quantity": 1491.6,
|
||||
"sl": 2.55731,
|
||||
"tp": 2.373231,
|
||||
"gross_pnl": 183.048533,
|
||||
"entry_fee": 1.489184,
|
||||
"exit_fee": 1.415964,
|
||||
"net_pnl": 180.143385,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.8864,
|
||||
"indicators": {
|
||||
"rsi": 17.950089434981262,
|
||||
"macd_hist": -0.010381022790605134,
|
||||
"atr": 0.0409065283069771,
|
||||
"adx": 56.13982003832872
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-10-14 16:15:00+00:00",
|
||||
"exit_time": "2025-10-15 02:15:00+00:00",
|
||||
"entry_price": 2.508449,
|
||||
"exit_price": 2.523552,
|
||||
"quantity": 1246.9,
|
||||
"sl": 2.544104,
|
||||
"tp": 2.437139,
|
||||
"gross_pnl": -18.83218,
|
||||
"entry_fee": 1.251114,
|
||||
"exit_fee": 1.258647,
|
||||
"net_pnl": -21.341941,
|
||||
"close_reason": "REVERSE_SIGNAL",
|
||||
"ml_proba": 0.5683,
|
||||
"indicators": {
|
||||
"rsi": 68.85343626442496,
|
||||
"macd_hist": 0.010657476860447013,
|
||||
"atr": 0.023769893751947626,
|
||||
"adx": 39.4255156509299
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-10-27 16:00:00+00:00",
|
||||
"exit_time": "2025-10-27 21:00:00+00:00",
|
||||
"entry_price": 2.674233,
|
||||
"exit_price": 2.623904,
|
||||
"quantity": 1152.7,
|
||||
"sl": 2.699397,
|
||||
"tp": 2.623904,
|
||||
"gross_pnl": 58.013274,
|
||||
"entry_fee": 1.233035,
|
||||
"exit_fee": 1.20983,
|
||||
"net_pnl": 55.570409,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5625,
|
||||
"indicators": {
|
||||
"rsi": 66.34709912155408,
|
||||
"macd_hist": 0.005634259928464551,
|
||||
"atr": 0.01677605457389115,
|
||||
"adx": 23.34205636197947
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-11-09 23:00:00+00:00",
|
||||
"exit_time": "2025-11-10 00:00:00+00:00",
|
||||
"entry_price": 2.367437,
|
||||
"exit_price": 2.346123,
|
||||
"quantity": 1348.3,
|
||||
"sl": 2.346123,
|
||||
"tp": 2.410064,
|
||||
"gross_pnl": -28.737235,
|
||||
"entry_fee": 1.276806,
|
||||
"exit_fee": 1.265311,
|
||||
"net_pnl": -31.279352,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5333,
|
||||
"indicators": {
|
||||
"rsi": 70.79337728670897,
|
||||
"macd_hist": 0.0008725935921229458,
|
||||
"atr": 0.014209120053368062,
|
||||
"adx": 35.31657325998852
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-11-28 01:45:00+00:00",
|
||||
"exit_time": "2025-11-28 05:30:00+00:00",
|
||||
"entry_price": 2.171517,
|
||||
"exit_price": 2.200054,
|
||||
"quantity": 1439.9,
|
||||
"sl": 2.157249,
|
||||
"tp": 2.200054,
|
||||
"gross_pnl": 41.090279,
|
||||
"entry_fee": 1.250707,
|
||||
"exit_fee": 1.267143,
|
||||
"net_pnl": 38.572429,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.6381,
|
||||
"indicators": {
|
||||
"rsi": 22.942287299402874,
|
||||
"macd_hist": -0.003478384036068617,
|
||||
"atr": 0.009512299239799599,
|
||||
"adx": 35.89384138114383
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2025-12-19 13:15:00+00:00",
|
||||
"exit_time": "2025-12-19 15:15:00+00:00",
|
||||
"entry_price": 1.878712,
|
||||
"exit_price": 1.889911,
|
||||
"quantity": 1703.8,
|
||||
"sl": 1.889911,
|
||||
"tp": 1.856315,
|
||||
"gross_pnl": -19.07996,
|
||||
"entry_fee": 1.28038,
|
||||
"exit_fee": 1.288012,
|
||||
"net_pnl": -21.648352,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5945,
|
||||
"indicators": {
|
||||
"rsi": 68.16547032772114,
|
||||
"macd_hist": -4.5929936914913816e-05,
|
||||
"atr": 0.007465649526915487,
|
||||
"adx": 40.69667585881617
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2025-12-25 22:45:00+00:00",
|
||||
"exit_time": "2025-12-25 23:30:00+00:00",
|
||||
"entry_price": 1.844884,
|
||||
"exit_price": 1.836907,
|
||||
"quantity": 1710.5,
|
||||
"sl": 1.836907,
|
||||
"tp": 1.86084,
|
||||
"gross_pnl": -13.645741,
|
||||
"entry_fee": 1.26227,
|
||||
"exit_fee": 1.256812,
|
||||
"net_pnl": -16.164822,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.6099,
|
||||
"indicators": {
|
||||
"rsi": 22.431779710524914,
|
||||
"macd_hist": -0.0022220637884117073,
|
||||
"atr": 0.005318421811566107,
|
||||
"adx": 20.682478174103885
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2026-01-11 12:45:00+00:00",
|
||||
"exit_time": "2026-01-11 14:45:00+00:00",
|
||||
"entry_price": 2.10289,
|
||||
"exit_price": 2.108508,
|
||||
"quantity": 1483.7,
|
||||
"sl": 2.108508,
|
||||
"tp": 2.091653,
|
||||
"gross_pnl": -8.336295,
|
||||
"entry_fee": 1.248023,
|
||||
"exit_fee": 1.251357,
|
||||
"net_pnl": -10.835676,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5098,
|
||||
"indicators": {
|
||||
"rsi": 67.90556933822843,
|
||||
"macd_hist": 0.0011236246859926337,
|
||||
"atr": 0.0037457236024969268,
|
||||
"adx": 14.695994703326152
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2026-01-17 15:00:00+00:00",
|
||||
"exit_time": "2026-01-17 15:15:00+00:00",
|
||||
"entry_price": 2.074093,
|
||||
"exit_price": 2.080899,
|
||||
"quantity": 1492.7,
|
||||
"sl": 2.080899,
|
||||
"tp": 2.06048,
|
||||
"gross_pnl": -10.159954,
|
||||
"entry_fee": 1.238399,
|
||||
"exit_fee": 1.242463,
|
||||
"net_pnl": -12.640816,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.594,
|
||||
"indicators": {
|
||||
"rsi": 69.16433708427633,
|
||||
"macd_hist": 0.0015812464458042678,
|
||||
"atr": 0.004537618137465387,
|
||||
"adx": 16.189151941493567
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2026-01-28 09:45:00+00:00",
|
||||
"exit_time": "2026-01-28 14:15:00+00:00",
|
||||
"entry_price": 1.931393,
|
||||
"exit_price": 1.921506,
|
||||
"quantity": 1588.9,
|
||||
"sl": 1.921506,
|
||||
"tp": 1.951168,
|
||||
"gross_pnl": -15.71035,
|
||||
"entry_fee": 1.227516,
|
||||
"exit_fee": 1.221232,
|
||||
"net_pnl": -18.159098,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5361,
|
||||
"indicators": {
|
||||
"rsi": 69.49360491728265,
|
||||
"macd_hist": 0.0009318141405021494,
|
||||
"atr": 0.006591708992321306,
|
||||
"adx": 23.59253632415462
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2026-01-29 14:15:00+00:00",
|
||||
"exit_time": "2026-01-29 14:30:00+00:00",
|
||||
"entry_price": 1.853915,
|
||||
"exit_price": 1.862898,
|
||||
"quantity": 1634.1,
|
||||
"sl": 1.862898,
|
||||
"tp": 1.835947,
|
||||
"gross_pnl": -14.680593,
|
||||
"entry_fee": 1.211793,
|
||||
"exit_fee": 1.217665,
|
||||
"net_pnl": -17.110051,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5373,
|
||||
"indicators": {
|
||||
"rsi": 27.456064937316995,
|
||||
"macd_hist": -0.0003642198670342086,
|
||||
"atr": 0.00598926765439418,
|
||||
"adx": 29.652186976597193
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2026-01-29 15:30:00+00:00",
|
||||
"exit_time": "2026-01-29 17:15:00+00:00",
|
||||
"entry_price": 1.792279,
|
||||
"exit_price": 1.830034,
|
||||
"quantity": 1687.4,
|
||||
"sl": 1.773402,
|
||||
"tp": 1.830034,
|
||||
"gross_pnl": 63.70772,
|
||||
"entry_fee": 1.209717,
|
||||
"exit_fee": 1.2352,
|
||||
"net_pnl": 61.262804,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5189,
|
||||
"indicators": {
|
||||
"rsi": 16.64017828809098,
|
||||
"macd_hist": -0.007714360437304368,
|
||||
"atr": 0.012584986826922885,
|
||||
"adx": 45.78370985540058
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "SHORT",
|
||||
"entry_time": "2026-01-30 01:30:00+00:00",
|
||||
"exit_time": "2026-01-30 02:15:00+00:00",
|
||||
"entry_price": 1.743626,
|
||||
"exit_price": 1.733473,
|
||||
"quantity": 1785.3,
|
||||
"sl": 1.766432,
|
||||
"tp": 1.698012,
|
||||
"gross_pnl": 18.124883,
|
||||
"entry_fee": 1.245158,
|
||||
"exit_fee": 1.237908,
|
||||
"net_pnl": 15.641817,
|
||||
"close_reason": "REVERSE_SIGNAL",
|
||||
"ml_proba": 0.6829,
|
||||
"indicators": {
|
||||
"rsi": 19.89605260729724,
|
||||
"macd_hist": -0.003114826868995284,
|
||||
"atr": 0.015204543588406344,
|
||||
"adx": 20.39618087837
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2026-02-21 14:00:00+00:00",
|
||||
"exit_time": "2026-02-21 14:30:00+00:00",
|
||||
"entry_price": 1.447345,
|
||||
"exit_price": 1.460803,
|
||||
"quantity": 2171.1,
|
||||
"sl": 1.440616,
|
||||
"tp": 1.460803,
|
||||
"gross_pnl": 29.219526,
|
||||
"entry_fee": 1.256932,
|
||||
"exit_fee": 1.26862,
|
||||
"net_pnl": 26.693974,
|
||||
"close_reason": "TAKE_PROFIT",
|
||||
"ml_proba": 0.5205,
|
||||
"indicators": {
|
||||
"rsi": 65.66004200808446,
|
||||
"macd_hist": 0.0002040437812304472,
|
||||
"atr": 0.004486132335137116,
|
||||
"adx": 22.48469775979257
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2026-02-25 01:00:00+00:00",
|
||||
"exit_time": "2026-02-25 03:15:00+00:00",
|
||||
"entry_price": 1.383138,
|
||||
"exit_price": 1.370396,
|
||||
"quantity": 2308.7,
|
||||
"sl": 1.370396,
|
||||
"tp": 1.408624,
|
||||
"gross_pnl": -29.418901,
|
||||
"entry_fee": 1.277301,
|
||||
"exit_fee": 1.265533,
|
||||
"net_pnl": -31.961735,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.5054,
|
||||
"indicators": {
|
||||
"rsi": 73.1504226046038,
|
||||
"macd_hist": 0.0014379189881605118,
|
||||
"atr": 0.008495084124686957,
|
||||
"adx": 16.57739949935574
|
||||
}
|
||||
},
|
||||
{
|
||||
"symbol": "XRPUSDT",
|
||||
"side": "LONG",
|
||||
"entry_time": "2026-02-28 06:15:00+00:00",
|
||||
"exit_time": "2026-02-28 06:30:00+00:00",
|
||||
"entry_price": 1.331433,
|
||||
"exit_price": 1.322797,
|
||||
"quantity": 2348.4,
|
||||
"sl": 1.322797,
|
||||
"tp": 1.348705,
|
||||
"gross_pnl": -20.281139,
|
||||
"entry_fee": 1.250695,
|
||||
"exit_fee": 1.242583,
|
||||
"net_pnl": -22.774416,
|
||||
"close_reason": "STOP_LOSS",
|
||||
"ml_proba": 0.7416,
|
||||
"indicators": {
|
||||
"rsi": 22.07257216583472,
|
||||
"macd_hist": -0.0019878129960472814,
|
||||
"atr": 0.005757434514952236,
|
||||
"adx": 36.23941502849302
|
||||
}
|
||||
}
|
||||
],
|
||||
"validation": {
|
||||
"overall": "FAIL",
|
||||
"checks": [
|
||||
{
|
||||
"name": "exit_after_entry",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "모든 트레이드에서 청산 > 진입"
|
||||
},
|
||||
{
|
||||
"name": "sl_tp_direction",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "SL/TP 방향 정합"
|
||||
},
|
||||
{
|
||||
"name": "no_overlap",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "포지션 비중첩 확인"
|
||||
},
|
||||
{
|
||||
"name": "positive_fees",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "수수료 양수 확인"
|
||||
},
|
||||
{
|
||||
"name": "no_negative_balance",
|
||||
"passed": true,
|
||||
"level": "FAIL",
|
||||
"message": "잔고 양수 유지"
|
||||
},
|
||||
{
|
||||
"name": "win_rate_high",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "승률 정상 (44.4%)"
|
||||
},
|
||||
{
|
||||
"name": "win_rate_low",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "승률 정상 (44.4%)"
|
||||
},
|
||||
{
|
||||
"name": "mdd_nonzero",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "MDD 정상 (5.9%)"
|
||||
},
|
||||
{
|
||||
"name": "trade_frequency",
|
||||
"passed": false,
|
||||
"level": "WARNING",
|
||||
"message": "월 평균 2.6건 < 5건 — 신호 생성 부족"
|
||||
},
|
||||
{
|
||||
"name": "profit_factor_high",
|
||||
"passed": true,
|
||||
"level": "WARNING",
|
||||
"message": "PF 정상 (2.71)"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
1281
results/xrpusdt/backtest_20260306_222621.json
Normal file
1281
results/xrpusdt/backtest_20260306_222621.json
Normal file
File diff suppressed because it is too large
Load Diff
10803
results/xrpusdt/backtest_20260306_223141.json
Normal file
10803
results/xrpusdt/backtest_20260306_223141.json
Normal file
File diff suppressed because it is too large
Load Diff
8750
results/xrpusdt/strategy_sweep_20260306_225408.json
Normal file
8750
results/xrpusdt/strategy_sweep_20260306_225408.json
Normal file
File diff suppressed because it is too large
Load Diff
7579
results/xrpusdt/strategy_sweep_20260306_230357.json
Normal file
7579
results/xrpusdt/strategy_sweep_20260306_230357.json
Normal file
File diff suppressed because it is too large
Load Diff
1267
results/xrpusdt/wf_backtest_20260306_223446.json
Normal file
1267
results/xrpusdt/wf_backtest_20260306_223446.json
Normal file
File diff suppressed because it is too large
Load Diff
3016
results/xrpusdt/wf_backtest_20260306_223459.json
Normal file
3016
results/xrpusdt/wf_backtest_20260306_223459.json
Normal file
File diff suppressed because it is too large
Load Diff
1267
results/xrpusdt/wf_backtest_20260306_224057.json
Normal file
1267
results/xrpusdt/wf_backtest_20260306_224057.json
Normal file
File diff suppressed because it is too large
Load Diff
3016
results/xrpusdt/wf_backtest_20260306_224241.json
Normal file
3016
results/xrpusdt/wf_backtest_20260306_224241.json
Normal file
File diff suppressed because it is too large
Load Diff
3016
results/xrpusdt/wf_backtest_20260306_224303.json
Normal file
3016
results/xrpusdt/wf_backtest_20260306_224303.json
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user