diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9cae18d --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +# Copy to .env (never commit .env) +# Optional: terminal data folder hash under %APPDATA%\MetaQuotes\Terminal\ +MT5_TERMINAL_DATA_ID= + +# Optional: full path to terminal64.exe when auto-detect fails +MT5_TERMINAL_EXE= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..38600b9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,117 @@ +# --- Secrets & local config --- +.env +.env.* +!.env.example +config.yaml +credentials.json +*.pem +*.key + +# --- MetaTrader / compiled --- +*.ex5 +*.ex4 +*.mqproj +compile.log + +# --- MT5 tester output --- +ReportTester*.html +ReportTester*.htm +report.html +report.png +**/test-balance.png +**/test-balance.jpg +*.ini +!**/example*.ini +**/mt5_reports/ +**/mt5_results.json + +# --- Generated charts & documents (regenerate locally) --- +*.pdf +*.png +*.jpg +*.jpeg +*.gif +*.webp +*.svg +equity_curve.png +drawdown.png +monthly_returns.png +exit_reasons.png +pnl_distribution.png + +# --- Brochure / LaTeX outputs --- +**/reports/figures/ +**/managed_account_brochure*.tex +**/ManagedAccount_Brochure*.pdf +**/UnitedEA_*Brochure*.pdf +**/代客理财_*.pdf + +# --- Generated backtest artifacts --- +trades.csv +backtest_report.json +**/reports/data/ +backtesting/MT5/cluster_audit/reports/** +!backtesting/MT5/cluster_audit/reports/.gitkeep +backtesting/MT5/optimization_results/ +lab/**/best_run/ + +# --- Optional: paper figure exports (regenerate from paper sources) --- +paper/figures/*.png +paper/figures/*.pdf + +# --- Logs --- +*.log +debug.log + +# --- Archives & bundles --- +*.zip +*.7z + +# --- Python --- +__pycache__/ +*.py[cod] +*$py.class +.Python +.venv/ +venv/ +env/ +*.egg-info/ +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ + +# --- ML artifacts (retrain via ai/*/README) --- +**/models/*.onnx +**/models/*.pkl +**/models/*.h5 +**/models/*.pb +*.npy +*.npz + +# --- LaTeX build --- +*.aux +*.toc +*.out +*.fdb_latexmk +*.fls +*.synctex.gz +*.bbl +*.blg + +# --- IDE / OS --- +.idea/ +.vscode/ +*.swp +*~ +.DS_Store +Thumbs.db +desktop.ini + +# --- Personal tooling --- +fast_commit.ps1 + +# --- Optional: large chart exports (regenerate locally) --- +# Uncomment if you want a source-only repo: +# **/report.png +# **/drawdown.png +# **/monthly_returns.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d49b55c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,40 @@ +# Contributing + +## Scope + +This repo focuses on MetaTrader 5 Expert Advisors, Python backtesting, and ONNX ML integration. Keep PRs focused on one area (e.g. one strategy or one audit script). + +## Setup + +1. Clone the repo +2. Install Python deps per subdirectory (`backtesting/MT5/requirements.txt`, `ai/*/requirements.txt`) +3. Use your **local** MT5 terminal for tester automation — no account credentials in code + +## Code conventions + +- **MQL5**: match existing `Strategies/*.mqh` patterns; magic numbers via `MagicNumberHelpers.mqh` +- **Python**: minimal dependencies; reuse `set_parser.py`, `cluster_audit/united_mt5_runner.py` +- **Sets**: name files descriptively; document non-obvious params in strategy README + +## Do not submit + +- `.env`, API keys, account logins +- `ReportTester*.html`, `trades.csv`, `*.ex5` +- PDF/PNG/JPG charts and brochures (`*.pdf`, `report.png`, `test-balance.jpg`, …) +- `mt5_results.json`, `mt5_reports/`, `lab/**/best_run/` +- Generated audit JSON under `cluster_audit/reports/` +- Unrelated personal projects or book manuscripts + +Before first push, run: + +```bash +python scripts/prepare_public_upload.py +``` + +## Pull requests + +1. Describe strategy / audit change and test window used +2. Note whether results are from MT5 tester or Python replay +3. Confirm `git status` shows no ignored sensitive files staged + +See [`docs/STRUCTURE.md`](docs/STRUCTURE.md) for layout. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..34732dd --- /dev/null +++ b/LICENSE @@ -0,0 +1,26 @@ +MIT License + +Copyright (c) 2026 Profitable Expert Advisor contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + +TRADING DISCLAIMER: Algorithmic trading involves substantial risk of loss. +Past backtest performance does not guarantee future results. Use at your own risk. diff --git a/README.md b/README.md index bf788ec..2e12a69 100644 --- a/README.md +++ b/README.md @@ -17,17 +17,36 @@ A comprehensive collection of algorithmic trading strategies for MetaTrader 5, i ``` profitable-expert-advisor/ -├── frontline/ # Production-ready trading strategies -│ ├── MQL5/ # MetaTrader 5 Expert Advisors -│ └── tradingview/ # TradingView Pine Script strategies -├── ai/ # ONNX machine learning models -├── back-pedal/ # Alternative/experimental strategies -├── backtesting/ # Python backtesting framework -│ ├── MT5/ # MT5 Python backtesting -│ └── own/ # Custom backtesting tools -└── paper/ # Research papers and simulations +├── frontline/ # Production MQL5 EAs +│ ├── cluster-latest/ # United multi-strategy cluster (main entry) +│ ├── units/ # Standalone per-symbol EAs +│ ├── units-trailing/ # Trailing-stop variants +│ ├── units-sharpshooter/ +│ ├── united_template/ # United EA templates +│ ├── cluster-NZDUSD/ # NZDUSD combo (R&D) +│ └── tradingview/ # Pine Script +├── backtesting/ # Python backtesting +│ └── MT5/ # MT5 API + cluster_audit pipeline +├── ai/ # ONNX / ML training & EAs +├── back-pedal/ # Archived strategies +├── lab/ # Experiments & scratch EAs +├── paper/ # Research paper & simulations +├── polymarket/ # Prediction-market scaffold +├── strategy-tester/ # Factor testing +└── docs/STRUCTURE.md # Full layout guide ``` +📖 **[Detailed structure guide](docs/STRUCTURE.md)** · **[Contributing](CONTRIBUTING.md)** · **[Security](SECURITY.md)** + +### Before pushing to GitHub + +- No `.env`, account logins, or `ReportTester*.html` in the commit +- No PDF/PNG/JPG exports — regenerate brochures and charts locally +- Copy `.env.example` → `.env` and set `MT5_TERMINAL_DATA_ID` for your MT5 data folder +- Run `python scripts/prepare_public_upload.py` to scan for leftover paths or secrets +- Regenerate ONNX models locally (`ai/README.md`) — binaries are gitignored +- Audit outputs stay under `backtesting/MT5/cluster_audit/reports/` (gitignored) + ## Frontline Strategies **Location**: [`frontline/`](frontline/) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..98af70f --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,38 @@ +# Security Policy + +## Reporting a vulnerability + +If you discover a security issue in this repository, please **open a private GitHub security advisory** or contact the maintainer directly. Do not open a public issue for exploit details. + +## Sensitive data — do not commit + +- MT5 / broker **login numbers**, passwords, investor passwords +- API keys (`POLYMARKET_*`, broker REST keys, etc.) +- Private keys, wallet seeds, `.env` files +- Strategy Tester HTML reports (`ReportTester-*.html`) — may embed account & broker metadata +- Local machine paths (`C:\Users\...`, terminal hash folders) + +## Local-only configuration + +| Component | Config | +|-----------|--------| +| Polymarket | Copy `polymarket/.env.example` → `.env` (gitignored) | +| Self-coding agent | Copy `self-coding-agent/config.example.yaml` → `config.yaml` | +| MT5 automation | Uses **your** running MT5 terminal via `MetaTrader5` Python package — set `MT5_TERMINAL_DATA_ID` in `.env` (see `.env.example`) | + +## Before pushing to GitHub + +```bash +git status +# Ensure no .env, ReportTester*.html, *.ex5, trades.csv, cluster_audit/reports/ +``` + +Run a quick scan: + +```bash +rg -i "password|private_key|api_key|C:\\\\Users\\\\[^<]|D0E8209F" --glob '!*.md' . +``` + +## Trading risk disclaimer + +This software is for research and education. Live trading involves substantial risk of loss. The authors are not responsible for financial losses from use of this code. diff --git a/ai/README.md b/ai/README.md new file mode 100644 index 0000000..f3fd49f --- /dev/null +++ b/ai/README.md @@ -0,0 +1,36 @@ +# AI / Machine Learning + +ONNX-based price-action models for MetaTrader 5. + +## Projects + +| Directory | Symbol / TF | Notes | +|-----------|-------------|-------| +| [`xauusd_h1/`](xauusd_h1/) | XAUUSD H1 | Action classification EA | +| [`xauusd_m15/`](xauusd_m15/) | XAUUSD M15 | Shorter horizon | +| [`eurusd1h/`](eurusd1h/) | EURUSD H1 | | +| [`eurusd1min/`](eurusd1min/) | EURUSD M15 model | | +| [`btcusd1min/`](btcusd1min/) | BTCUSD M1 | | +| [`rsi-divergence/`](rsi-divergence/) | Divergence detector + EA | +| [`dummy/`](dummy/) | XAUUSD sandbox | Full train → ONNX → backtest walkthrough | + +## Quick start (sandbox) + +```bash +cd ai/dummy +pip install -r requirements.txt +python train_onnx_model.py +python quick_backtest.py +``` + +Trained artifacts (`models/*.onnx`, `*.pkl`) are **gitignored** — generate locally after clone. + +## MQL5 integration + +Each project includes an `.mq5` EA that loads ONNX via `#resource` or file path. See per-folder `README.md` and `MT5_SETUP.md` (dummy). + +## Requirements + +- Python 3.10+ +- `MetaTrader5`, `onnxruntime`, `scikit-learn`, `pandas`, `numpy` +- Local MT5 terminal with history for your symbol diff --git a/ai/btcusd1min/models/BTC-USD_M1_model.onnx b/ai/btcusd1min/models/BTC-USD_M1_model.onnx deleted file mode 100644 index e88565e..0000000 Binary files a/ai/btcusd1min/models/BTC-USD_M1_model.onnx and /dev/null differ diff --git a/ai/btcusd1min/models/BTC-USD_M1_model_scaler.pkl b/ai/btcusd1min/models/BTC-USD_M1_model_scaler.pkl deleted file mode 100644 index 08cf903..0000000 Binary files a/ai/btcusd1min/models/BTC-USD_M1_model_scaler.pkl and /dev/null differ diff --git a/ai/eurusd1h/EURUSD_H1_ActionEA.mq5 b/ai/eurusd1h/EURUSD_H1_ActionEA.mq5 index e0ee1c3..2071060 100644 --- a/ai/eurusd1h/EURUSD_H1_ActionEA.mq5 +++ b/ai/eurusd1h/EURUSD_H1_ActionEA.mq5 @@ -1,46 +1,84 @@ //+------------------------------------------------------------------+ //| EURUSD_H1_ActionEA.mq5 | -//| ai/eurusd1h/main.py — 24 features, 5-class softmax | -//| Classes: 0=HOLD 1=BUY 2=SELL_SHORT 3=CLOSE_LONG 4=CLOSE_SHORT | -//| Entry: strict trio winner among p0,p1,p2 only. | -//| Exit: unique 5-class argmax != held side (1 long, 2 short). | -//| No SL / TP / ATR stops. Attach EURUSD H1. | +//| ai/eurusd1h/main.py — 24 features, 5-class softmax ONNX | +//| Train: python main.py → models/EURUSD_H1_action.onnx | +//| Attach EURUSD H1. MT5 optimize via run_mt5_tester.py | //+------------------------------------------------------------------+ #property copyright "Profitable EA Project" -#property version "1.00" -#property description "EURUSD H1 action ONNX; ordinal entry/exit; no fixed SL/TP" +#property version "1.20" +#property description "EURUSD H1 action ONNX; aggregate + prob/ATR exits (optimizable)" #include #resource "models\\EURUSD_H1_action.onnx" as uchar ExtModel[] #define FEAT_COUNT 24 +#define PRED_HIST_CAP 32 #define REL_EPS 1e-9 input group "Model" input int InpLookback = 48; +input int InpEntryMode = 1; +input double InpProbBuy = 0.18; +input double InpProbSell = 0.18; +input double InpMinBeatHold = 0.04; +input int InpExitMode = 1; // 0=fixed prob; 1/2=close must beat HOLD and stay-in-trade (2 legacy; old 2 vs-HOLD-only removed) +input double InpProbCloseL = 0.18; +input double InpProbCloseS = 0.18; +input double InpMinCloseBeatHold = 0.03; +input int InpMinBarsInTradeModelExit = 1; // min bars before model exit (0=off); pure mode uses 5-class winner +input bool InpPureRelative = false; // true: no prob cutoffs/edges — entry=trio strict winner, exit=5-class strict winner != side +input bool InpUseCloseHeadExit = true; // legacy only when InpPureRelative=false (CL/CS vs HOLD/stay; see InpExitMode) +input bool InpUseDirFlipExit = true; // legacy only when InpPureRelative=false (gap edges InpFlipExitEdge) +input double InpFlipExitEdge = 0.03; // legacy dir-flip min gap (ignored when InpPureRelative) +input int InpMinBarsAfterExit = 6; // after any close, wait this many flat bars before a new entry (0=off) +input int InpCooldownBarsAfterAdverse = 12; // extra flat-bar pause after adverse (ATR) stop; 0 = use only MinBarsAfterExit + +input group "Decision (aggregate + sample, lowers trade churn)" +input int InpSampleEveryNBars = 2; // run ONNX / refresh history every N new bars (>=1) +input int InpAggWindow = 4; // rolling mean over last K samples (>=1) +input int InpMinAggSamples = 2; // need this many samples in window before new entries +input int InpMinBarsBetweenEntries = 0; // after an open, wait this many flat bars before next entry (0=off) +input double InpMinDirEdge = 0.03; // legacy entry mode 1 only (ignored when InpPureRelative) +input bool InpRequireStayOverClose = true; // legacy entry (ignored when InpPureRelative) + +input group "Session (match Python SESSION_HOUR_OFFSET)" input int InpSessionHourOffset = 0; + +input group "Scaler override (empty = EURUSD_H1_action_meta.json)" input string InpFeatMinStr = ""; input string InpFeatMaxStr = ""; -input group "Timing" -input int InpMinBarsInTrade = 1; // model exit only after this many bars in position (0=off) - -input group "Trade" +input group "Risk" input double InpLotSize = 0.01; input int InpMagic = 902601; input int InpSlippage = 30; +input group "Hard exits (fixed ATR in price — optional)" +input bool InpUseAdverseAtrExit = true; // stop by adverse move in ATR multiples (off = model-only risk) +input bool InpUseProfitAtrExit = false; // take-profit in ATR multiples (needs InpTakeProfitATR > 0) +input double InpMaxAdverseATR = 3.5; +input double InpTakeProfitATR = 0.0; + double g_feat_min[FEAT_COUNT]; double g_feat_max[FEAT_COUNT]; CTrade trade; -long g_onnx = INVALID_HANDLE; +long g_onnx = INVALID_HANDLE; datetime g_last_bar = 0; -void InitDefaultScalerFromMeta() +double g_pred_hist[PRED_HIST_CAP][5]; +int g_pred_hist_len = 0; +double g_smooth[5] = {0.2, 0.2, 0.2, 0.2, 0.2}; +ulong g_bar_index = 0; +int g_entry_cooldown_bars = 0; +int g_agg_w = 4; +int g_sample_n = 2; +int g_min_agg_samples = 2; + +void InitDefaultScalerBounds() { - // EURUSD_H1_action_meta.json scaler_feature_min / max (train fit) + // MinMax bounds from ai/eurusd1h/models/EURUSD_H1_action_meta.json double def_min[FEAT_COUNT] = { 0.9539399743080139, 0.9559400081634521, @@ -104,12 +142,229 @@ bool ParseFeatCsv(const string s, double &arr[]) { if(StringLen(s) < 3) return false; string parts[]; - if(StringSplit(s, ',', parts) != FEAT_COUNT) return false; + int n = StringSplit(s, ',', parts); + if(n != FEAT_COUNT) return false; for(int i = 0; i < FEAT_COUNT; i++) arr[i] = StringToDouble(parts[i]); return true; } +int OnInit() +{ + InitDefaultScalerBounds(); + trade.SetExpertMagicNumber(InpMagic); + trade.SetDeviationInPoints(InpSlippage); + trade.SetTypeFilling(ORDER_FILLING_IOC); + + if(StringLen(InpFeatMinStr) > 0 && ParseFeatCsv(InpFeatMinStr, g_feat_min)) + Print("EURUSD Action EA: loaded InpFeatMinStr (24)"); + if(StringLen(InpFeatMaxStr) > 0 && ParseFeatCsv(InpFeatMaxStr, g_feat_max)) + Print("EURUSD Action EA: loaded InpFeatMaxStr (24)"); + + g_onnx = OnnxCreateFromBuffer(ExtModel, ONNX_DEBUG_LOGS); + if(g_onnx == INVALID_HANDLE) + { + Print("OnnxCreateFromBuffer failed ", GetLastError()); + return INIT_FAILED; + } + + const long inShape[] = {1, InpLookback, FEAT_COUNT}; + if(!OnnxSetInputShape(g_onnx, 0, inShape)) + { + Print("OnnxSetInputShape failed ", GetLastError()); + OnnxRelease(g_onnx); + return INIT_FAILED; + } + const long outShape[] = {1, 5}; + if(!OnnxSetOutputShape(g_onnx, 0, outShape)) + { + Print("OnnxSetOutputShape failed ", GetLastError()); + OnnxRelease(g_onnx); + return INIT_FAILED; + } + + g_agg_w = MathMax(1, MathMin(InpAggWindow, PRED_HIST_CAP)); + g_sample_n = MathMax(1, InpSampleEveryNBars); + g_min_agg_samples = MathMax(1, MathMin(InpMinAggSamples, g_agg_w)); + g_pred_hist_len = 0; + g_bar_index = 0; + g_entry_cooldown_bars = 0; + for(int k = 0; k < 5; k++) + g_smooth[k] = 0.2; + + const bool has_atr = InpUseAdverseAtrExit || (InpUseProfitAtrExit && InpTakeProfitATR > 0.0); + const bool has_model_exit = InpPureRelative || InpUseCloseHeadExit || InpUseDirFlipExit; + if(!has_atr && !has_model_exit) + Print("EURUSD_H1_ActionEA: WARNING — no exit path enabled (enable InpPureRelative and/or legacy exits / ATR)"); + + Print("EURUSD_H1_ActionEA: ONNX OK. Chart TF=", EnumToString(PERIOD_CURRENT), "; Lookback=", InpLookback, + " sampleEvery=", g_sample_n, " aggWindow=", g_agg_w, " minAggSamples=", g_min_agg_samples, + " pureRelative=", InpPureRelative, + " entryCooldownBars=", InpMinBarsBetweenEntries, " minDirEdge=", InpMinDirEdge, + " stayOverClose=", InpRequireStayOverClose, + " exitMode=", InpExitMode, " minBarsInTradeModelExit=", InpMinBarsInTradeModelExit, + " closeHeadExit=", InpUseCloseHeadExit, " dirFlipExit=", InpUseDirFlipExit, " flipExitEdge=", InpFlipExitEdge, + " minBarsAfterExit=", InpMinBarsAfterExit, " cooldownAfterAdverse=", InpCooldownBarsAfterAdverse, + " useAdverseATR=", InpUseAdverseAtrExit, " useProfitATR=", InpUseProfitAtrExit, + " maxAdverseATR=", InpMaxAdverseATR, " takeProfitATR=", InpTakeProfitATR); + return INIT_SUCCEEDED; +} + +void OnDeinit(const int r) +{ + if(g_onnx != INVALID_HANDLE) OnnxRelease(g_onnx); +} + +double AtrNow() +{ + double b[]; + ArraySetAsSeries(b, true); + int h = iATR(_Symbol, PERIOD_CURRENT, 14); + if(h == INVALID_HANDLE) return 0; + if(CopyBuffer(h, 0, 0, 2, b) < 1) { IndicatorRelease(h); return 0; } + double v = b[0]; + IndicatorRelease(h); + return v; +} + +bool AdverseExit(const long type, const double open_price) +{ + if(!InpUseAdverseAtrExit || InpMaxAdverseATR <= 0.0) + return false; + double atr = AtrNow(); + if(atr <= 0) return false; + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + if(type == POSITION_TYPE_BUY) + { + double adv = (open_price - bid) / atr; + return adv >= InpMaxAdverseATR; + } + double adv = (ask - open_price) / atr; + return adv >= InpMaxAdverseATR; +} + +bool ProfitExit(const long type, const double open_price) +{ + if(!InpUseProfitAtrExit || InpTakeProfitATR <= 0.0) + return false; + double atr = AtrNow(); + if(atr <= 0.0) return false; + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + if(type == POSITION_TYPE_BUY) + return (bid - open_price) >= InpTakeProfitATR * atr; + return (open_price - ask) >= InpTakeProfitATR * atr; +} + +bool ModelCloseLong(const double p0, const double p1, const double p3) +{ + if(InpExitMode == 0) + return (p3 >= InpProbCloseL); + // Modes 1/2 (and default): close-long must beat HOLD and stay-long (BUY). Old mode-2 "vs HOLD only" fired almost every bar on softmax. + return (p3 > p0 + InpMinCloseBeatHold && p3 > p1); +} + +bool ModelCloseShort(const double p0, const double p2, const double p4) +{ + if(InpExitMode == 0) + return (p4 >= InpProbCloseS); + return (p4 > p0 + InpMinCloseBeatHold && p4 > p2); +} + +bool ModelDirFlipExitLong(const double p0, const double p1, const double p2) +{ + if(!InpUseDirFlipExit) + return false; + const double e = MathMax(0.0, InpFlipExitEdge); + return (p2 > p1 + e && p2 > p0 + InpMinBeatHold); +} + +bool ModelDirFlipExitShort(const double p0, const double p1, const double p2) +{ + if(!InpUseDirFlipExit) + return false; + const double e = MathMax(0.0, InpFlipExitEdge); + return (p1 > p2 + e && p1 > p0 + InpMinBeatHold); +} + +int TrioStrictWinner012(const double p0, const double p1, const double p2) +{ + if(p0 > p1 + REL_EPS && p0 > p2 + REL_EPS) + return 0; + if(p1 > p0 + REL_EPS && p1 > p2 + REL_EPS) + return 1; + if(p2 > p0 + REL_EPS && p2 > p1 + REL_EPS) + return 2; + return -1; +} + +int FiveStrictWinner01234(const double p0, const double p1, const double p2, const double p3, const double p4) +{ + const double p[5] = {p0, p1, p2, p3, p4}; + int best = 0; + for(int k = 1; k < 5; k++) + if(p[k] > p[best]) + best = k; + const double m = p[best]; + int cnt = 0; + for(int k = 0; k < 5; k++) + if(p[k] + REL_EPS >= m) + cnt++; + if(cnt != 1) + return -1; + return best; +} + +int PositionBarsInTrade() +{ + if(!PositionSelect(_Symbol)) + return 0; + const datetime tOpen = (datetime)PositionGetInteger(POSITION_TIME); + const int sh = iBarShift(_Symbol, PERIOD_CURRENT, tOpen, false); + if(sh < 0) + return 9999; + return sh + 1; +} + +void ApplyExitCooldown(const bool adverse_stop) +{ + int b = MathMax(0, InpMinBarsAfterExit); + if(adverse_stop) + b = MathMax(b, MathMax(0, InpCooldownBarsAfterAdverse)); + if(b > 0) + g_entry_cooldown_bars = MathMax(g_entry_cooldown_bars, b); +} + +void PushPrediction(const double p0, const double p1, const double p2, const double p3, const double p4, const int maxKeep) +{ + for(int i = PRED_HIST_CAP - 1; i > 0; i--) + for(int k = 0; k < 5; k++) + g_pred_hist[i][k] = g_pred_hist[i - 1][k]; + g_pred_hist[0][0] = p0; + g_pred_hist[0][1] = p1; + g_pred_hist[0][2] = p2; + g_pred_hist[0][3] = p3; + g_pred_hist[0][4] = p4; + int cap = MathMax(1, MathMin(maxKeep, PRED_HIST_CAP)); + g_pred_hist_len = MathMin(g_pred_hist_len + 1, cap); +} + +void RecomputeSmooth(const int aggWindow) +{ + int w = MathMax(1, MathMin(aggWindow, PRED_HIST_CAP)); + int n = MathMin(w, g_pred_hist_len); + if(n < 1) + return; + for(int k = 0; k < 5; k++) + { + double s = 0.0; + for(int i = 0; i < n; i++) + s += g_pred_hist[i][k]; + g_smooth[k] = s / (double)n; + } +} + void ScaleFeatures(const float &raw[], float &out[]) { for(int f = 0; f < FEAT_COUNT; f++) @@ -192,9 +447,9 @@ bool PrepareMatrix(matrixf &M) double rv7 = rsi7[i]; double rv21 = rsi21[i]; - double spr = (r0 - rv7) / 50.0; - if(spr > 1.0) spr = 1.0; - if(spr < -1.0) spr = -1.0; + double spread = (r0 - rv7) / 50.0; + if(spread > 1.0) spread = 1.0; + if(spread < -1.0) spread = -1.0; double vel = (r0 - r1) / 25.0; double acc = ((r0 - r1) - (r1 - r2)) / 25.0; double dist_mid = MathAbs(r0 - 50.0) / 50.0; @@ -226,7 +481,7 @@ bool PrepareMatrix(matrixf &M) raw[12] = (float)(vma > 0 ? (double)vol[i] / vma : 1.0); raw[13] = (float)(rv7 / 100.0); raw[14] = (float)(rv21 / 100.0); - raw[15] = (float)spr; + raw[15] = (float)spread; raw[16] = (float)vel; raw[17] = (float)acc; raw[18] = (float)dist_mid; @@ -244,143 +499,163 @@ bool PrepareMatrix(matrixf &M) return true; } -int TrioStrictWinner012(const double p0, const double p1, const double p2) -{ - if(p0 > p1 + REL_EPS && p0 > p2 + REL_EPS) return 0; - if(p1 > p0 + REL_EPS && p1 > p2 + REL_EPS) return 1; - if(p2 > p0 + REL_EPS && p2 > p1 + REL_EPS) return 2; - return -1; -} - -int FiveStrictWinner01234(const double p0, const double p1, const double p2, const double p3, const double p4) -{ - const double p[5] = {p0, p1, p2, p3, p4}; - int best = 0; - for(int k = 1; k < 5; k++) - if(p[k] > p[best]) - best = k; - const double m = p[best]; - int cnt = 0; - for(int k = 0; k < 5; k++) - if(p[k] + REL_EPS >= m) - cnt++; - if(cnt != 1) - return -1; - return best; -} - -bool SelectOurPosition() -{ - if(!PositionSelect(_Symbol)) - return false; - if((long)PositionGetInteger(POSITION_MAGIC) != InpMagic) - return false; - return true; -} - -int PositionBarsInTrade() -{ - if(!SelectOurPosition()) - return 0; - const datetime tOpen = (datetime)PositionGetInteger(POSITION_TIME); - const int sh = iBarShift(_Symbol, PERIOD_CURRENT, tOpen, false); - if(sh < 0) - return 9999; - return sh + 1; -} - -int OnInit() -{ - InitDefaultScalerFromMeta(); - trade.SetExpertMagicNumber(InpMagic); - trade.SetDeviationInPoints(InpSlippage); - trade.SetTypeFilling(ORDER_FILLING_IOC); - - if(StringLen(InpFeatMinStr) > 0 && ParseFeatCsv(InpFeatMinStr, g_feat_min)) - Print("EURUSD Action EA: loaded InpFeatMinStr"); - if(StringLen(InpFeatMaxStr) > 0 && ParseFeatCsv(InpFeatMaxStr, g_feat_max)) - Print("EURUSD Action EA: loaded InpFeatMaxStr"); - - g_onnx = OnnxCreateFromBuffer(ExtModel, ONNX_DEBUG_LOGS); - if(g_onnx == INVALID_HANDLE) - { - Print("OnnxCreateFromBuffer failed ", GetLastError()); - return INIT_FAILED; - } - const long inShape[] = {1, InpLookback, FEAT_COUNT}; - if(!OnnxSetInputShape(g_onnx, 0, inShape)) - { - Print("OnnxSetInputShape failed ", GetLastError()); - OnnxRelease(g_onnx); - return INIT_FAILED; - } - const long outShape[] = {1, 5}; - if(!OnnxSetOutputShape(g_onnx, 0, outShape)) - { - Print("OnnxSetOutputShape failed ", GetLastError()); - OnnxRelease(g_onnx); - return INIT_FAILED; - } - - if(_Period != PERIOD_H1) - Print("EURUSD_H1_ActionEA: chart period is ", EnumToString((ENUM_TIMEFRAMES)_Period), - " — training is H1; mismatch may hurt."); - - Print("EURUSD_H1_ActionEA: ONNX OK. Ordinal entry/exit, no SL/TP. Lookback=", InpLookback); - return INIT_SUCCEEDED; -} - -void OnDeinit(const int r) -{ - if(g_onnx != INVALID_HANDLE) - OnnxRelease(g_onnx); -} - void OnTick() { datetime t = iTime(_Symbol, PERIOD_CURRENT, 0); - if(t == g_last_bar) - return; + if(t == g_last_bar) return; g_last_bar = t; - matrixf Min; - if(!PrepareMatrix(Min)) + const bool had_pos = PositionSelect(_Symbol); + const bool flat = !had_pos; + if(flat && g_entry_cooldown_bars > 0) + g_entry_cooldown_bars--; + + g_bar_index++; + const bool do_sample = (g_sample_n < 2) || ((g_bar_index % (ulong)g_sample_n) == 0); + bool fresh_predict = false; + + if(do_sample) { - Print("EURUSD Action EA: PrepareMatrix failed"); - return; + matrixf Min; + if(!PrepareMatrix(Min)) + { + Print("EURUSD Action EA: PrepareMatrix failed"); + if(!had_pos) + return; + } + else + { + vectorf out; + out.Resize(5); + if(!OnnxRun(g_onnx, ONNX_NO_CONVERSION, Min, out)) + { + Print("OnnxRun failed ", GetLastError()); + if(!had_pos) + return; + } + else + { + PushPrediction(out[0], out[1], out[2], out[3], out[4], g_agg_w); + RecomputeSmooth(g_agg_w); + fresh_predict = true; + } + } } - vectorf out; - out.Resize(5); - if(!OnnxRun(g_onnx, ONNX_NO_CONVERSION, Min, out)) + + const double p0 = g_smooth[0]; + const double p1 = g_smooth[1]; + const double p2 = g_smooth[2]; + const double p3 = g_smooth[3]; + const double p4 = g_smooth[4]; + + if(flat) { - Print("OnnxRun failed ", GetLastError()); + if(!do_sample || !fresh_predict) + return; + if(g_pred_hist_len < g_min_agg_samples) + return; + if(g_entry_cooldown_bars > 0) + return; + + if(InpEntryMode == 1) + { + if(InpPureRelative) + { + const int w3 = TrioStrictWinner012(p0, p1, p2); + if(w3 == 1) + { + if(trade.Buy(InpLotSize, _Symbol, 0, 0, 0, "EURUSD act BUY")) + g_entry_cooldown_bars = MathMax(0, InpMinBarsBetweenEntries); + } + else if(w3 == 2) + { + if(trade.Sell(InpLotSize, _Symbol, 0, 0, 0, "EURUSD act SELL")) + g_entry_cooldown_bars = MathMax(0, InpMinBarsBetweenEntries); + } + } + else + { + double dir = MathMax(p1, p2); + if(dir <= p0 + InpMinBeatHold) + return; + const double edge = MathMax(0.0, InpMinDirEdge); + const bool stay_ok_buy = (!InpRequireStayOverClose) || (p1 > p3); + const bool stay_ok_sell = (!InpRequireStayOverClose) || (p2 > p4); + if(p1 >= p2 && p1 > p0 + InpMinBeatHold && (p1 - p2) >= edge && stay_ok_buy) + { + if(trade.Buy(InpLotSize, _Symbol, 0, 0, 0, "EURUSD act BUY")) + g_entry_cooldown_bars = MathMax(0, InpMinBarsBetweenEntries); + } + else if(p2 > p1 && p2 > p0 + InpMinBeatHold && (p2 - p1) >= edge && stay_ok_sell) + { + if(trade.Sell(InpLotSize, _Symbol, 0, 0, 0, "EURUSD act SELL")) + g_entry_cooldown_bars = MathMax(0, InpMinBarsBetweenEntries); + } + } + } + else + { + if(p1 >= InpProbBuy && p1 >= p2) + { + if(trade.Buy(InpLotSize, _Symbol, 0, 0, 0, "EURUSD act BUY")) + g_entry_cooldown_bars = MathMax(0, InpMinBarsBetweenEntries); + } + else if(p2 >= InpProbSell && p2 > p1) + { + if(trade.Sell(InpLotSize, _Symbol, 0, 0, 0, "EURUSD act SELL")) + g_entry_cooldown_bars = MathMax(0, InpMinBarsBetweenEntries); + } + } return; } - const double p0 = out[0], p1 = out[1], p2 = out[2], p3 = out[3], p4 = out[4]; - - if(!SelectOurPosition()) + long typ = (long)PositionGetInteger(POSITION_TYPE); + double opn = PositionGetDouble(POSITION_PRICE_OPEN); + if(AdverseExit(typ, opn)) { - const int w3 = TrioStrictWinner012(p0, p1, p2); - if(w3 == 1) - trade.Buy(InpLotSize, _Symbol, 0, 0, 0, "EURUSD act BUY"); - else if(w3 == 2) - trade.Sell(InpLotSize, _Symbol, 0, 0, 0, "EURUSD act SELL"); + if(trade.PositionClose(_Symbol)) + ApplyExitCooldown(true); + return; + } + if(ProfitExit(typ, opn)) + { + if(trade.PositionClose(_Symbol)) + ApplyExitCooldown(false); return; } - const bool allow = (InpMinBarsInTrade <= 0) || (PositionBarsInTrade() >= InpMinBarsInTrade); - if(!allow) - return; - - const int w5 = FiveStrictWinner01234(p0, p1, p2, p3, p4); - const long typ = (long)PositionGetInteger(POSITION_TYPE); - bool close_it = false; - if(typ == POSITION_TYPE_BUY) - close_it = (w5 != -1 && w5 != 1); - else if(typ == POSITION_TYPE_SELL) - close_it = (w5 != -1 && w5 != 2); - - if(close_it) - trade.PositionClose(_Symbol); + const int bars_in = PositionBarsInTrade(); + const bool allow_model_exit = (InpMinBarsInTradeModelExit <= 0) || (bars_in >= InpMinBarsInTradeModelExit); + if(allow_model_exit) + { + bool want_close = false; + if(InpPureRelative) + { + const int w5 = FiveStrictWinner01234(p0, p1, p2, p3, p4); + if(typ == POSITION_TYPE_BUY) + want_close = (w5 != -1 && w5 != 1); + else + want_close = (w5 != -1 && w5 != 2); + } + else + { + if(typ == POSITION_TYPE_BUY) + { + const bool head = InpUseCloseHeadExit && ModelCloseLong(p0, p1, p3); + const bool flip = ModelDirFlipExitLong(p0, p1, p2); + want_close = (head || flip); + } + else + { + const bool head = InpUseCloseHeadExit && ModelCloseShort(p0, p2, p4); + const bool flip = ModelDirFlipExitShort(p0, p1, p2); + want_close = (head || flip); + } + } + if(want_close) + { + if(trade.PositionClose(_Symbol)) + ApplyExitCooldown(false); + } + } } diff --git a/ai/eurusd1h/EURUSD_H1_ActionEA.set b/ai/eurusd1h/EURUSD_H1_ActionEA.set new file mode 100644 index 0000000..cb391c9 --- /dev/null +++ b/ai/eurusd1h/EURUSD_H1_ActionEA.set @@ -0,0 +1,31 @@ +; EURUSD H1 Action EA — default backtest (legacy prob + ATR stop) +InpLookback=48 +InpEntryMode=1 +InpProbBuy=0.18 +InpProbSell=0.18 +InpMinBeatHold=0.04 +InpExitMode=2 +InpProbCloseL=0.18 +InpProbCloseS=0.18 +InpMinCloseBeatHold=0.03 +InpMinBarsInTradeModelExit=2 +InpPureRelative=false +InpUseCloseHeadExit=true +InpUseDirFlipExit=true +InpFlipExitEdge=0.03 +InpMinBarsAfterExit=4 +InpCooldownBarsAfterAdverse=8 +InpSampleEveryNBars=2 +InpAggWindow=4 +InpMinAggSamples=2 +InpMinBarsBetweenEntries=2 +InpMinDirEdge=0.03 +InpRequireStayOverClose=true +InpSessionHourOffset=0 +InpLotSize=0.10 +InpMagic=902601 +InpSlippage=30 +InpUseAdverseAtrExit=true +InpUseProfitAtrExit=false +InpMaxAdverseATR=2.5 +InpTakeProfitATR=0.0 diff --git a/ai/eurusd1h/EURUSD_H1_ActionEA_optimize.set b/ai/eurusd1h/EURUSD_H1_ActionEA_optimize.set new file mode 100644 index 0000000..4b45402 --- /dev/null +++ b/ai/eurusd1h/EURUSD_H1_ActionEA_optimize.set @@ -0,0 +1,31 @@ +; EURUSD H1 Action EA — genetic optimization +InpLookback=48||48||1||48||N +InpEntryMode=1||0||1||1||Y +InpProbBuy=0.18||0.14||0.02||0.30||Y +InpProbSell=0.18||0.14||0.02||0.30||Y +InpMinBeatHold=0.04||0.0||0.01||0.12||Y +InpExitMode=2||0||1||2||Y +InpProbCloseL=0.18||0.12||0.02||0.30||Y +InpProbCloseS=0.18||0.12||0.02||0.30||Y +InpMinCloseBeatHold=0.03||0.0||0.01||0.10||Y +InpMinBarsInTradeModelExit=2||0||1||8||Y +InpPureRelative=false||false||0||true||Y +InpUseCloseHeadExit=true||false||0||true||Y +InpUseDirFlipExit=true||false||0||true||Y +InpFlipExitEdge=0.03||0.01||0.01||0.08||Y +InpMinBarsAfterExit=4||0||2||12||Y +InpCooldownBarsAfterAdverse=8||0||4||24||Y +InpSampleEveryNBars=2||1||1||4||Y +InpAggWindow=4||2||1||8||Y +InpMinAggSamples=2||1||1||4||Y +InpMinBarsBetweenEntries=2||0||1||8||Y +InpMinDirEdge=0.03||0.01||0.01||0.10||Y +InpRequireStayOverClose=true||false||0||true||Y +InpSessionHourOffset=0||-2||1||2||N +InpLotSize=0.10||0.01||0.01||0.10||N +InpMagic=902601||902601||1||902601||N +InpSlippage=30||30||1||100||N +InpUseAdverseAtrExit=true||false||0||true||Y +InpUseProfitAtrExit=false||false||0||true||Y +InpMaxAdverseATR=2.5||1.5||0.25||4.0||Y +InpTakeProfitATR=0.0||0.0||0.5||4.0||Y diff --git a/ai/eurusd1h/__pycache__/main.cpython-312.pyc b/ai/eurusd1h/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 7fc29ce..0000000 Binary files a/ai/eurusd1h/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/ai/eurusd1h/models/EURUSD_H1_action.onnx b/ai/eurusd1h/models/EURUSD_H1_action.onnx deleted file mode 100644 index 82798e7..0000000 Binary files a/ai/eurusd1h/models/EURUSD_H1_action.onnx and /dev/null differ diff --git a/ai/eurusd1h/models/EURUSD_H1_action_meta.json b/ai/eurusd1h/models/EURUSD_H1_action_meta.json index d833371..320e235 100644 --- a/ai/eurusd1h/models/EURUSD_H1_action_meta.json +++ b/ai/eurusd1h/models/EURUSD_H1_action_meta.json @@ -38,37 +38,37 @@ "CLOSE_SHORT" ], "mt5_bar_range": [ - "2010-03-17 23:00:00", - "2026-04-24 23:00:00" + "2011-11-22 00:00:00", + "2026-06-25 23:00:00" ], "scaler_fit_on": "all_valid_feature_rows_full_mt5_range", "validation_split": { "mode": "chronological_tail_fraction", "val_fraction": 0.12, - "train_sequences": 87914, - "val_sequences": 11989 + "train_sequences": 20267, + "val_sequences": 2764 }, "clustering": "KMeans n=12 on forward returns (1,2,4,8,16); train-only fit", "scaler_feature_min": [ - 0.9539399743080139, - 0.9559400081634521, - 0.9536200165748596, - 0.9538999795913696, - 9.999999974752427e-07, - 0.07019035518169403, - -0.02143237181007862, - -0.028110405430197716, - 0.0002704667276702821, - -0.02017582766711712, - 1.0, - 0.0004555500054266304, - 0.0002461568801663816, - 0.022001149132847786, - 0.11231997609138489, - -0.5339273810386658, - -1.623793125152588, - -1.837566614151001, - 6.83732741890708e-06, + 0.9591299891471863, + 0.9670900106430054, + 0.9535899758338928, + 0.9593700170516968, + 0.00010299999848939478, + 0.10443684458732605, + -0.04120740666985512, + -0.04531921073794365, + 0.0003194698365405202, + -0.025094643235206604, + 1.0000925064086914, + 0.0006479999865405262, + 0.017702626064419746, + 0.02270212210714817, + 0.1845751404762268, + -0.4544973373413086, + -1.7025094032287598, + -1.832268238067627, + 1.076605258276686e-05, 0.0, 0.0, 0.0, @@ -76,25 +76,25 @@ 0.0 ], "scaler_feature_max": [ - 1.493149995803833, - 1.4938499927520752, - 1.4904999732971191, - 1.493190050125122, - 0.06699500232934952, - 0.9350273013114929, - 0.028008731082081795, - 0.03147505968809128, - 0.009249407798051834, - 0.01742853783071041, - 1.0232577323913574, - 0.02111775055527687, - 7.801275253295898, - 0.9864169955253601, - 0.8837512731552124, - 0.49708572030067444, - 1.8055412769317627, - 1.927569031715393, - 0.8700546026229858, + 1.3932499885559082, + 1.399340033531189, + 1.3910000324249268, + 1.3933900594711304, + 0.5568050146102905, + 0.9161010384559631, + 0.05199148878455162, + 0.08236432075500488, + 0.018198959529399872, + 0.03056110255420208, + 1.047353744506836, + 0.2869023084640503, + 10.783438682556152, + 0.9746928811073303, + 0.8693897128105164, + 0.4820457994937897, + 1.3869965076446533, + 1.7234584093093872, + 0.8322020173072815, 1.0, 1.0, 1.0, @@ -102,32 +102,32 @@ 1.0 ], "scaler_scale": [ - 1.854564905166626, - 1.8590470552444458, - 1.8626137971878052, - 1.8542896509170532, - 14.926709175109863, - 1.1562873125076294, - 20.226085662841797, - 16.782615661621094, - 111.3717041015625, - 26.5926570892334, - 42.99645233154297, - 48.39755630493164, - 0.12818820774555206, - 1.03689706325531, - 1.296291708946228, - 0.969919741153717, - 0.2916017770767212, - 0.2655946612358093, - 1.1493622064590454, + 2.3035106658935547, + 2.3134758472442627, + 2.286184310913086, + 2.3040411472320557, + 1.7962931394577026, + 1.2320365905761719, + 10.729741096496582, + 7.8318634033203125, + 55.93000793457031, + 17.96759605407715, + 21.15898895263672, + 3.4933969974517822, + 0.09288728982210159, + 1.0504302978515625, + 1.4602493047714233, + 1.0677565336227417, + 0.32367634773254395, + 0.281236469745636, + 1.2016469240188599, 1.0, 1.0, 1.0, 1.0, 1.0 ], - "tail_val_accuracy": 0.2594878673553467, - "tail_val_loss": 1.5548540353775024, + "tail_val_accuracy": 0.23371924459934235, + "tail_val_loss": 1.5593042373657227, "ea_note": "Copy ai/yt/US500_H1_ArticleEA.mq5 pattern: #resource ONNX + paste scaler from meta." } \ No newline at end of file diff --git a/ai/eurusd1h/models/EURUSD_H1_action_scaler.pkl b/ai/eurusd1h/models/EURUSD_H1_action_scaler.pkl deleted file mode 100644 index 1dccb6e..0000000 Binary files a/ai/eurusd1h/models/EURUSD_H1_action_scaler.pkl and /dev/null differ diff --git a/ai/eurusd1h/run_mt5_tester.py b/ai/eurusd1h/run_mt5_tester.py new file mode 100644 index 0000000..4b5e090 --- /dev/null +++ b/ai/eurusd1h/run_mt5_tester.py @@ -0,0 +1,266 @@ +""" +Launch MT5 Strategy Tester for EURUSD H1 Action ONNX EA. + +Usage: + python run_mt5_tester.py backtest + python run_mt5_tester.py optimize + python run_mt5_tester.py backtest --from 2020.01.01 --to 2026.01.01 +""" + +from __future__ import annotations + +import argparse +import json +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +import MetaTrader5 as mt5 + +LAB = Path(__file__).resolve().parent +EA_SRC = LAB / "EURUSD_H1_ActionEA.mq5" +MODEL_SRC = LAB / "models" / "EURUSD_H1_action.onnx" +DEFAULT_SET = LAB / "EURUSD_H1_ActionEA.set" +OPT_SET = LAB / "EURUSD_H1_ActionEA_optimize.set" + +LABELS = { + "profit_factor": ("Profit Factor", "盈利因子"), + "net_profit": ("Total Net Profit", "总净盈利"), + "total_trades": ("Total Trades", "交易总计"), + "sharpe": ("Sharpe Ratio", "夏普比率"), + "equity_dd": ("Equity Drawdown Maximal", "最大回撤"), +} + + +def read_text(path: Path) -> str: + text = path.read_text(encoding="utf-16", errors="ignore") + if not text.strip(): + text = path.read_text(encoding="utf-8", errors="ignore") + return text + + +def grab_metric(text: str, key: str) -> str | None: + for label in LABELS[key]: + for pat in ( + rf">{re.escape(label)}\s*]*>(?:)?([^<]+)", + rf">{re.escape(label)}:\s*]*>(?:)?([^<]+)", + ): + m = re.search(pat, text, re.I) + if m: + return m.group(1).strip() + return None + + +def parse_report(data: Path, report: str) -> dict: + xml_path = data / f"{report}.xml" + if xml_path.exists(): + text = xml_path.read_text(encoding="utf-8", errors="ignore") + m = re.search( + r"\s*]*>]*>Pass.*?\s*(.*?)", + text, + re.S, + ) + if m: + cells = re.findall(r'([^<]+)', m.group(1)) + if len(cells) >= 10: + return { + "ready": True, + "report": str(xml_path), + "net_profit": float(cells[2]), + "profit_factor": float(cells[4]), + "sharpe": float(cells[6]), + "max_drawdown": f"{cells[8]}%", + "total_trades": int(float(cells[9])), + } + for path in sorted(data.glob(f"**/{report}*.htm*"), key=lambda p: p.stat().st_mtime, reverse=True): + text = read_text(path) + pf = grab_metric(text, "profit_factor") + profit = grab_metric(text, "net_profit") + trades = grab_metric(text, "total_trades") + sharpe = grab_metric(text, "sharpe") + dd = grab_metric(text, "equity_dd") + if pf or profit or trades: + return { + "profit_factor": float(pf) if pf else None, + "net_profit": _num(profit), + "total_trades": int(float(trades)) if trades and trades[0].isdigit() else None, + "sharpe": float(sharpe) if sharpe else None, + "max_drawdown": dd, + "report": str(path), + "ready": True, + } + return {"ready": False} + + +def _num(s: str | None) -> float | None: + if not s: + return None + s = s.replace(" ", "").replace(",", "") + if s.endswith("%"): + return float(s[:-1]) + return float(s) + + +def mt5_context() -> dict: + if not mt5.initialize(): + raise RuntimeError(f"MT5 init failed: {mt5.last_error()}") + info = mt5.terminal_info() + acc = mt5.account_info() + ctx = { + "data": Path(info.data_path), + "mt5_path": Path(info.path), + "login": acc.login if acc else 0, + "server": acc.server if acc else "", + } + mt5.shutdown() + return ctx + + +def deploy_ea(data: Path, mt5_path: Path) -> Path: + if not MODEL_SRC.exists(): + raise FileNotFoundError( + f"Missing ONNX: {MODEL_SRC}\nRun: cd ai/eurusd1h && python main.py" + ) + dst_dir = data / "MQL5" / "Experts" / "ai" / "eurusd1h" + models_dir = dst_dir / "models" + models_dir.mkdir(parents=True, exist_ok=True) + shutil.copy2(MODEL_SRC, models_dir / "EURUSD_H1_action.onnx") + dst = dst_dir / "EURUSD_H1_ActionEA.mq5" + shutil.copy2(EA_SRC, dst) + log = dst_dir / "compile.log" + subprocess.run( + [str(mt5_path / "metaeditor64.exe"), f"/compile:{dst}", f"/log:{log}"], + timeout=180, + capture_output=True, + ) + time.sleep(3) + ex5 = dst_dir / "EURUSD_H1_ActionEA.ex5" + if not ex5.exists(): + tail = log.read_text(encoding="utf-8", errors="ignore")[-2500:] if log.exists() else "" + raise RuntimeError(f"Compile failed:\n{dst}\n{tail}") + pub = data / "MQL5" / "Experts" / "EURUSD_H1_ActionEA.ex5" + shutil.copy2(ex5, pub) + return pub + + +def copy_set_to_tester(data: Path, set_path: Path, set_name: str) -> None: + profiles = data / "MQL5" / "Profiles" / "Tester" + profiles.mkdir(parents=True, exist_ok=True) + shutil.copy2(set_path, profiles / set_name) + + +def build_ini(**kw) -> str: + return f"""[Common] +Login={kw['login']} +Server={kw['server']} +[Tester] +Expert=EURUSD_H1_ActionEA.ex5 +ExpertParameters={kw['set_name']} +Symbol={kw['symbol']} +Period={kw['period']} +Optimization={kw['optimization']} +Model=1 +Dates=1 +FromDate={kw['from_date']} +ToDate={kw['to_date']} +ForwardMode=0 +Deposit={kw['deposit']} +Currency=USD +Leverage={kw['leverage']} +ExecutionMode=0 +Report={kw['report']} +ReplaceReport=1 +ShutdownTerminal=1 +Visual={1 if kw['visual'] else 0} +""" + + +def run_tester(ctx: dict, **kw) -> dict: + data: Path = ctx["data"] + mt5_path: Path = ctx["mt5_path"] + deploy_ea(data, mt5_path) + copy_set_to_tester(data, kw["set_path"], kw["set_name"]) + ini = data / f"{kw['report']}.ini" + ini.write_text( + build_ini( + login=ctx["login"], + server=ctx["server"], + set_name=kw["set_name"], + report=kw["report"], + symbol=kw["symbol"], + period=kw["period"], + optimization=2 if kw["mode"] == "optimize" else 0, + from_date=kw["from_date"], + to_date=kw["to_date"], + deposit=kw["deposit"], + leverage=kw["leverage"], + visual=kw["visual"], + ), + encoding="utf-8", + ) + for ext in (".htm", ".html", ".xml"): + p = data / f"{kw['report']}{ext}" + if p.exists(): + p.unlink(missing_ok=True) + subprocess.run(["taskkill", "/IM", "terminal64.exe", "/F"], capture_output=True) + subprocess.run(["taskkill", "/IM", "metatester64.exe", "/F"], capture_output=True) + time.sleep(4) + print(f"Starting MT5 ({kw['mode']}) EA=EURUSD_H1_ActionEA {kw['symbol']} {kw['period']}") + print(f" Set: {kw['set_name']} {kw['from_date']} -> {kw['to_date']}") + t0 = time.time() + timeout = kw.get("timeout_sec", 7200 if kw["mode"] == "optimize" else 3600) + subprocess.run([str(mt5_path / "terminal64.exe"), f"/config:{ini}"], timeout=timeout) + metrics = parse_report(data, kw["report"]) + metrics["elapsed_sec"] = round(time.time() - t0, 1) + metrics["mode"] = kw["mode"] + return metrics + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("mode", choices=["backtest", "optimize"]) + p.add_argument("--symbol", default="EURUSD") + p.add_argument("--period", default="H1") + p.add_argument("--from", dest="from_date", default="2020.01.01") + p.add_argument("--to", dest="to_date", default="2026.01.01") + p.add_argument("--deposit", type=float, default=10000) + p.add_argument("--leverage", type=int, default=100) + p.add_argument("--visual", action="store_true") + p.add_argument("--set", dest="set_file", default="") + args = p.parse_args() + ctx = mt5_context() + set_path = Path(args.set_file) if args.set_file else (OPT_SET if args.mode == "optimize" else DEFAULT_SET) + report = f"EURUSD_H1_{args.symbol}_{args.mode}" + metrics = run_tester( + ctx, + mode=args.mode, + set_path=set_path, + set_name=set_path.name, + report=report, + symbol=args.symbol, + period=args.period, + from_date=args.from_date, + to_date=args.to_date, + deposit=args.deposit, + leverage=args.leverage, + visual=args.visual, + ) + out = LAB / "mt5_results.json" + with open(out, "w", encoding="utf-8") as f: + json.dump(metrics, f, indent=2) + if metrics.get("ready"): + print("\n=== MT5 Report ===") + for k in ("net_profit", "profit_factor", "total_trades", "sharpe", "max_drawdown", "elapsed_sec"): + if metrics.get(k) is not None: + print(f" {k}: {metrics[k]}") + print(f" report: {metrics.get('report')}") + print(f" saved: {out}") + else: + print("Report not found — check MT5 Tester journal.") + + +if __name__ == "__main__": + main() diff --git a/ai/eurusd1min/models/EURUSD_M15_model.onnx b/ai/eurusd1min/models/EURUSD_M15_model.onnx deleted file mode 100644 index a1e9cd2..0000000 Binary files a/ai/eurusd1min/models/EURUSD_M15_model.onnx and /dev/null differ diff --git a/ai/eurusd1min/models/EURUSD_M15_model_scaler.pkl b/ai/eurusd1min/models/EURUSD_M15_model_scaler.pkl deleted file mode 100644 index d717363..0000000 Binary files a/ai/eurusd1min/models/EURUSD_M15_model_scaler.pkl and /dev/null differ diff --git a/ai/rsi-divergence/__pycache__/rsi_divergence_detector.cpython-312.pyc b/ai/rsi-divergence/__pycache__/rsi_divergence_detector.cpython-312.pyc deleted file mode 100644 index 2a64834..0000000 Binary files a/ai/rsi-divergence/__pycache__/rsi_divergence_detector.cpython-312.pyc and /dev/null differ diff --git a/ai/xauusd_h1/__pycache__/features.cpython-312.pyc b/ai/xauusd_h1/__pycache__/features.cpython-312.pyc deleted file mode 100644 index 8f0d873..0000000 Binary files a/ai/xauusd_h1/__pycache__/features.cpython-312.pyc and /dev/null differ diff --git a/ai/xauusd_h1/__pycache__/labeling.cpython-312.pyc b/ai/xauusd_h1/__pycache__/labeling.cpython-312.pyc deleted file mode 100644 index b7fd323..0000000 Binary files a/ai/xauusd_h1/__pycache__/labeling.cpython-312.pyc and /dev/null differ diff --git a/ai/xauusd_h1/models/XAUUSD_H1_action.onnx b/ai/xauusd_h1/models/XAUUSD_H1_action.onnx deleted file mode 100644 index a18858f..0000000 Binary files a/ai/xauusd_h1/models/XAUUSD_H1_action.onnx and /dev/null differ diff --git a/ai/xauusd_h1/models/XAUUSD_H1_action_scaler.pkl b/ai/xauusd_h1/models/XAUUSD_H1_action_scaler.pkl deleted file mode 100644 index f93fcd1..0000000 Binary files a/ai/xauusd_h1/models/XAUUSD_H1_action_scaler.pkl and /dev/null differ diff --git a/ai/xauusd_m15/__pycache__/features.cpython-312.pyc b/ai/xauusd_m15/__pycache__/features.cpython-312.pyc deleted file mode 100644 index 4744cd3..0000000 Binary files a/ai/xauusd_m15/__pycache__/features.cpython-312.pyc and /dev/null differ diff --git a/ai/xauusd_m15/__pycache__/labeling.cpython-312.pyc b/ai/xauusd_m15/__pycache__/labeling.cpython-312.pyc deleted file mode 100644 index 5100d93..0000000 Binary files a/ai/xauusd_m15/__pycache__/labeling.cpython-312.pyc and /dev/null differ diff --git a/ai/xauusd_m15/models/XAUUSD_M15_action.onnx b/ai/xauusd_m15/models/XAUUSD_M15_action.onnx deleted file mode 100644 index 288c913..0000000 Binary files a/ai/xauusd_m15/models/XAUUSD_M15_action.onnx and /dev/null differ diff --git a/ai/xauusd_m15/models/XAUUSD_M15_action_scaler.pkl b/ai/xauusd_m15/models/XAUUSD_M15_action_scaler.pkl deleted file mode 100644 index 42001e2..0000000 Binary files a/ai/xauusd_m15/models/XAUUSD_M15_action_scaler.pkl and /dev/null differ diff --git a/ai/yt/__pycache__/train_article_split.cpython-312.pyc b/ai/yt/__pycache__/train_article_split.cpython-312.pyc deleted file mode 100644 index ee003e9..0000000 Binary files a/ai/yt/__pycache__/train_article_split.cpython-312.pyc and /dev/null differ diff --git a/ai/yt/models/US500_H1_article_split.onnx b/ai/yt/models/US500_H1_article_split.onnx deleted file mode 100644 index 343410d..0000000 Binary files a/ai/yt/models/US500_H1_article_split.onnx and /dev/null differ diff --git a/ai/yt/models/US500_H1_article_split_scaler.pkl b/ai/yt/models/US500_H1_article_split_scaler.pkl deleted file mode 100644 index 268dc70..0000000 Binary files a/ai/yt/models/US500_H1_article_split_scaler.pkl and /dev/null differ diff --git a/back-pedal/archive/RSIFollowReverseEMACrossOverBTCUSD/test-balance.jpg b/back-pedal/archive/RSIFollowReverseEMACrossOverBTCUSD/test-balance.jpg deleted file mode 100644 index fc511d7..0000000 Binary files a/back-pedal/archive/RSIFollowReverseEMACrossOverBTCUSD/test-balance.jpg and /dev/null differ diff --git a/back-pedal/archive/RSIScalpingMSFT/report.html b/back-pedal/archive/RSIScalpingMSFT/report.html deleted file mode 100644 index a6122a2..0000000 Binary files a/back-pedal/archive/RSIScalpingMSFT/report.html and /dev/null differ diff --git a/back-pedal/archive/RSIScalpingMSFT/report.png b/back-pedal/archive/RSIScalpingMSFT/report.png deleted file mode 100644 index bb28a1a..0000000 Binary files a/back-pedal/archive/RSIScalpingMSFT/report.png and /dev/null differ diff --git a/back-pedal/archive/RSIScalpingXAGUSD/test-balance.png b/back-pedal/archive/RSIScalpingXAGUSD/test-balance.png deleted file mode 100644 index e2682d2..0000000 Binary files a/back-pedal/archive/RSIScalpingXAGUSD/test-balance.png and /dev/null differ diff --git a/back-pedal/archive/RSIScalpingXAUUSD/report.html b/back-pedal/archive/RSIScalpingXAUUSD/report.html deleted file mode 100644 index 203dcf4..0000000 Binary files a/back-pedal/archive/RSIScalpingXAUUSD/report.html and /dev/null differ diff --git a/back-pedal/archive/RSIScalpingXAUUSD/report.png b/back-pedal/archive/RSIScalpingXAUUSD/report.png deleted file mode 100644 index c2c91f2..0000000 Binary files a/back-pedal/archive/RSIScalpingXAUUSD/report.png and /dev/null differ diff --git a/frontline/units/SimpleTrendlineGER40/SimpleTrendline.mq5 b/back-pedal/archive/SimpleTrendlineGER40/SimpleTrendline.mq5 similarity index 100% rename from frontline/units/SimpleTrendlineGER40/SimpleTrendline.mq5 rename to back-pedal/archive/SimpleTrendlineGER40/SimpleTrendline.mq5 diff --git a/frontline/units/SimpleTrendlineGER40/SimpleTrendline_optimization.set b/back-pedal/archive/SimpleTrendlineGER40/SimpleTrendline_optimization.set similarity index 100% rename from frontline/units/SimpleTrendlineGER40/SimpleTrendline_optimization.set rename to back-pedal/archive/SimpleTrendlineGER40/SimpleTrendline_optimization.set diff --git a/frontline/units/SimpleTrendlineXAUUSD/SimpleTrendline.mq5 b/back-pedal/archive/SimpleTrendlineXAUUSD/SimpleTrendline.mq5 similarity index 100% rename from frontline/units/SimpleTrendlineXAUUSD/SimpleTrendline.mq5 rename to back-pedal/archive/SimpleTrendlineXAUUSD/SimpleTrendline.mq5 diff --git a/frontline/units/SimpleTrendlineXAUUSD/SimpleTrendline_optimization.set b/back-pedal/archive/SimpleTrendlineXAUUSD/SimpleTrendline_optimization.set similarity index 100% rename from frontline/units/SimpleTrendlineXAUUSD/SimpleTrendline_optimization.set rename to back-pedal/archive/SimpleTrendlineXAUUSD/SimpleTrendline_optimization.set diff --git a/backtesting/MT5/cluster_audit/__init__.py b/backtesting/MT5/cluster_audit/__init__.py new file mode 100644 index 0000000..3e862e4 --- /dev/null +++ b/backtesting/MT5/cluster_audit/__init__.py @@ -0,0 +1 @@ +# Cluster audit package diff --git a/backtesting/MT5/cluster_audit/backtest_core.py b/backtesting/MT5/cluster_audit/backtest_core.py new file mode 100644 index 0000000..c36edc0 --- /dev/null +++ b/backtesting/MT5/cluster_audit/backtest_core.py @@ -0,0 +1,327 @@ +"""Shared backtest primitives — fills, costs, metrics, trade log.""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Any + +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + + +@dataclass +class CostModel: + spread_points: float = 0.0 + slippage_points: float = 3.0 + commission_per_lot: float = 0.0 + + @classmethod + def for_symbol(cls, symbol: str, slippage: float = 3.0) -> "CostModel": + info = mt5.symbol_info(symbol) + spread = float(info.spread) if info else 0.0 + return cls(spread_points=spread, slippage_points=slippage) + + +@dataclass +class Trade: + side: str + open_time: Any + close_time: Any + open_price: float + close_price: float + volume: float + profit: float + bars_held: int = 0 + exit_reason: str = "" + + +@dataclass +class BacktestReport: + strategy_id: str + symbol: str + timeframe: str + period_label: str + net_profit: float + total_trades: int + win_rate: float + profit_factor: float + sharpe: float + max_drawdown_pct: float + avg_win: float + avg_loss: float + worst_trades: list[dict] + losing_trades: list[dict] + exit_reason_breakdown: dict[str, dict[str, float]] + monthly_returns: dict[str, float] + params: dict[str, Any] = field(default_factory=dict) + gross_profit: float = 0.0 + gross_loss: float = 0.0 + trades_list: list[Trade] = field(default_factory=list, repr=False) + equity_curve: pd.Series | None = field(default=None, repr=False) + + def to_dict(self) -> dict: + return { + "strategy_id": self.strategy_id, + "symbol": self.symbol, + "timeframe": self.timeframe, + "period": self.period_label, + "net_profit": self.net_profit, + "total_trades": self.total_trades, + "win_rate": self.win_rate, + "profit_factor": self.profit_factor, + "sharpe": self.sharpe, + "max_drawdown_pct": self.max_drawdown_pct, + "avg_win": self.avg_win, + "avg_loss": self.avg_loss, + "worst_trades": self.worst_trades, + "losing_trades": self.losing_trades, + "exit_reason_breakdown": self.exit_reason_breakdown, + "monthly_returns": self.monthly_returns, + "params": self.params, + } + + +def resolve_symbol(requested: str) -> str: + key = requested.split("|")[0].strip() + if not key: + return requested + if mt5.symbol_info(key) is not None: + mt5.symbol_select(key, True) + return key + for suffix in (".NAS", ".NYSE", ".NYS", ".US"): + cand = key + suffix + if mt5.symbol_info(cand) is not None: + mt5.symbol_select(cand, True) + return cand + for sym in mt5.symbols_get() or []: + if sym.name.startswith(key + "."): + mt5.symbol_select(sym.name, True) + return sym.name + return key + + +def load_bars(symbol: str, tf: int, start, end, trace: bool = False) -> pd.DataFrame: + requested = symbol + symbol = resolve_symbol(symbol) + if trace and symbol != requested: + print(f" [load_bars] resolved {requested} -> {symbol}", flush=True) + if not mt5.symbol_select(symbol, True): + raise RuntimeError(f"Cannot select {symbol}") + rates = mt5.copy_rates_range(symbol, tf, start, end) + if rates is None or len(rates) < 50: + raise RuntimeError(f"No data for {symbol} ({mt5.last_error()})") + if trace: + print(f" [load_bars] {symbol} got {len(rates)} bars", flush=True) + df = pd.DataFrame(rates) + df["time"] = pd.to_datetime(df["time"], unit="s") + df.set_index("time", inplace=True) + return df + + +def calc_profit(symbol: str, side: str, volume: float, entry: float, exit_px: float) -> float: + ot = mt5.ORDER_TYPE_BUY if side == "BUY" else mt5.ORDER_TYPE_SELL + p = mt5.order_calc_profit(ot, symbol, volume, entry, exit_px) + return float(p) if p is not None else 0.0 + + +def _half_spread(point: float, spread_pts: float) -> float: + return spread_pts * point / 2.0 + + +def fill_price(mid: float, point: float, costs: CostModel, side: str, entry: bool) -> float: + hs = _half_spread(point, costs.spread_points) + slip = costs.slippage_points * point + if side == "BUY": + return mid + hs + slip if entry else mid - hs - slip + return mid - hs - slip if entry else mid + hs + slip + + +@dataclass +class SimState: + side: str | None = None + entry: float = 0.0 + entry_i: int = 0 + entry_time: object = None + sl: float = 0.0 + tp: float = 0.0 + bars_against: int = 0 + rsi_against: bool = False + + +def _bar_seconds(tf_label: str) -> int: + mapping = { + "M1": 60, "M5": 300, "M10": 600, "M12": 720, "M15": 900, "M20": 1200, + "M30": 1800, "H1": 3600, "H2": 7200, "H4": 14400, "D1": 86400, + } + return mapping.get(tf_label.upper(), 3600) + + +def run_single_position( + df: pd.DataFrame, + symbol: str, + point: float, + costs: CostModel, + lot: float, + strategy_id: str, + tf_label: str, + period_label: str, + params: dict, + initial_balance: float, + on_bar, + bar_seconds: int | None = None, +) -> BacktestReport: + """Single-position bar loop with mark-to-market equity each bar.""" + bar_sec = bar_seconds or _bar_seconds(tf_label) + trades: list[Trade] = [] + realized_pnl = 0.0 + equity: list[float] = [initial_balance] + st = SimState() + + def close(i: int, mid: float, reason: str) -> None: + nonlocal st, realized_pnl + if st.side is None: + return + exit_px = fill_price(mid, point, costs, st.side, entry=False) + commission = costs.commission_per_lot * lot * 2.0 + profit = calc_profit(symbol, st.side, lot, st.entry, exit_px) - commission + held = max(1, int((df.index[i] - pd.Timestamp(st.entry_time)).total_seconds() / bar_sec)) + trades.append( + Trade( + side=st.side, + open_time=st.entry_time, + close_time=df.index[i], + open_price=st.entry, + close_price=exit_px, + volume=lot, + profit=profit, + bars_held=held, + exit_reason=reason, + ) + ) + realized_pnl += profit + st = SimState() + + def open_pos(i: int, side: str, mid: float) -> None: + nonlocal st + st.side = side + st.entry = fill_price(mid, point, costs, side, entry=True) + st.entry_i = i + st.entry_time = df.index[i] + + for i in range(1, len(df)): + on_bar(i, st, open_pos, close) + bal = initial_balance + realized_pnl + if st.side is not None: + mark = float(df["close"].iloc[i - 1]) + bal += calc_profit(symbol, st.side, lot, st.entry, mark) + equity.append(bal) + + if st.side is not None: + close(len(df) - 1, float(df["close"].iloc[-1]), "eod") + + eq = pd.Series(equity[: len(df)], index=df.index[: len(equity)]) + report = build_report(strategy_id, symbol, tf_label, period_label, trades, eq, initial_balance, params) + report.equity_curve = eq + return report + + +def build_report( + strategy_id: str, + symbol: str, + timeframe: str, + period_label: str, + trades: list[Trade], + equity_curve: pd.Series, + initial_balance: float, + params: dict, +) -> BacktestReport: + if not trades: + return BacktestReport( + strategy_id=strategy_id, + symbol=symbol, + timeframe=timeframe, + period_label=period_label, + net_profit=0.0, + total_trades=0, + win_rate=0.0, + profit_factor=0.0, + sharpe=0.0, + max_drawdown_pct=0.0, + avg_win=0.0, + avg_loss=0.0, + worst_trades=[], + losing_trades=[], + exit_reason_breakdown={}, + monthly_returns={}, + params=params, + ) + + profits = [t.profit for t in trades] + wins = [p for p in profits if p >= 0] + losses = [abs(p) for p in profits if p < 0] + gp = sum(wins) + gl = sum(losses) + net = sum(profits) + + rets = equity_curve.pct_change().dropna() + sharpe = 0.0 + if len(rets) > 10 and rets.std() > 0: + bars_per_year = 252 * 24 if "H1" in timeframe else 252 * 24 * 6 + scale = np.sqrt(bars_per_year / max(len(rets), 1)) + sharpe = float(rets.mean() / rets.std() * scale) + + peak = equity_curve.cummax() + dd = (peak - equity_curve) / peak.replace(0, np.nan) + max_dd = float(dd.max()) if len(dd) else 0.0 + + monthly = equity_curve.resample("ME").last().pct_change().dropna() + monthly_dict = {str(k.date()): float(v) for k, v in monthly.items()} + + def trade_row(t: Trade) -> dict: + return { + "side": t.side, + "open_time": str(t.open_time), + "close_time": str(t.close_time), + "open_price": t.open_price, + "close_price": t.close_price, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + + sorted_trades = sorted(trades, key=lambda t: t.profit) + losers = [trade_row(t) for t in sorted_trades if t.profit < 0] + breakdown: dict[str, dict[str, float]] = {} + for t in trades: + bucket = breakdown.setdefault(t.exit_reason or "?", {"count": 0, "pnl": 0.0, "wins": 0, "losses": 0}) + bucket["count"] += 1 + bucket["pnl"] += t.profit + if t.profit >= 0: + bucket["wins"] += 1 + else: + bucket["losses"] += 1 + + return BacktestReport( + strategy_id=strategy_id, + symbol=symbol, + timeframe=timeframe, + period_label=period_label, + net_profit=net, + total_trades=len(trades), + win_rate=(len(wins) / len(trades) * 100.0) if trades else 0.0, + profit_factor=(gp / gl) if gl > 0 else (999.0 if gp > 0 else 0.0), + sharpe=sharpe, + max_drawdown_pct=max_dd * 100.0, + avg_win=(gp / len(wins)) if wins else 0.0, + avg_loss=(gl / len(losses)) if losses else 0.0, + worst_trades=[trade_row(t) for t in sorted_trades[:5]], + losing_trades=losers[:30], + exit_reason_breakdown=breakdown, + monthly_returns=monthly_dict, + params=params, + gross_profit=gp, + gross_loss=gl, + trades_list=list(trades), + equity_curve=equity_curve.copy(), + ) diff --git a/backtesting/MT5/cluster_audit/diagnose.py b/backtesting/MT5/cluster_audit/diagnose.py new file mode 100644 index 0000000..36ad734 --- /dev/null +++ b/backtesting/MT5/cluster_audit/diagnose.py @@ -0,0 +1,145 @@ +"""Per-strategy problem diagnosis and loss tracing.""" + +from __future__ import annotations + +from typing import Any + +from .backtest_core import BacktestReport +from .trace_log import TraceLog + +ENGINE_FIX_HINTS = { + "rsi_crossover": "trend_strong closes positions in strong trends; high ema_slope/distance thresholds block entries.", + "rsi_scalp": "rsi_against exits + spread costs dominate; check OB/OS vs target gap and bars_to_wait.", + "rsi_asian": "session window or extreme RSI levels may block entries; verify broker server hour offset.", + "mean_reversion": "ADX proxy may differ from MQL iADX; min_ema_distance_pts can block all entries on volatile symbols.", + "ema_slope": "needs EMA-cross exit + profit trail even when use_trailing_stop=False; weekly ADX filter missing.", + "darvas": "box must be narrow (box_deviation); volume MA filter not yet ported.", + "rsi_secret": "zone re-entry in chop; add divergence confirm or widen min_bars_between_trades.", +} + + +def diagnose(spec: dict, baseline: BacktestReport, optimized: BacktestReport | None, log: TraceLog) -> dict[str, Any]: + sid = spec["id"] + engine = spec["engine"] + issues: list[str] = [] + actions: list[str] = [] + + if baseline.total_trades == 0: + issues.append("ZERO_TRADES") + actions.append("Engine logic or params too strict - compare Python port to MQL defaults.") + elif baseline.total_trades < 10: + issues.append("LOW_TRADE_COUNT") + actions.append("Relax entry filters or widen optimization ranges.") + + if baseline.net_profit < 0: + issues.append("NEGATIVE_PNL") + if baseline.sharpe < 0: + issues.append("NEGATIVE_SHARPE") + if baseline.max_drawdown_pct > 25: + issues.append("HIGH_DRAWDOWN") + + br = baseline.exit_reason_breakdown + loss_reasons = sorted( + ((k, v["pnl"]) for k, v in br.items() if v["pnl"] < 0), + key=lambda x: x[1], + ) + if loss_reasons: + top = loss_reasons[0] + issues.append(f"TOP_LOSS_REASON:{top[0]}") + if top[0] == "rsi_against": + actions.append("Widen RSI targets or increase bars_to_wait before rsi_against exit.") + elif top[0] == "trend_strong": + actions.append("Raise ema_slope/distance thresholds or only block new entries (MQL also force-closes).") + elif top[0] == "trail": + actions.append("Trail too tight - widen trail_distance_pts or raise activation.") + elif top[0] == "sl": + actions.append("Stop loss too tight for symbol volatility - scale SL by ATR.") + elif top[0] == "hours" or top[0] == "session": + actions.append("Trading hours/session filter closing positions — align to broker server time.") + elif top[0] == "adx_escape": + actions.append("ADX escape fires too early — raise adx_escape threshold.") + + hint = ENGINE_FIX_HINTS.get(engine, "") + if hint: + actions.append(hint) + + if optimized and optimized is not baseline: + from .scoring import DEFAULT_TRADES_PER_DAY, acceptance, min_trades_for_period, period_days, trades_per_day + from .strategy_registry import PERIODS + + start, end = PERIODS.get("2021-2026", ("2021-01-01", "2026-06-01")) + days = period_days(start, end) + min_t = min_trades_for_period(days, DEFAULT_TRADES_PER_DAY) + opt_tpd = trades_per_day(optimized, days) + base_tpd = trades_per_day(baseline, days) + if opt_tpd < DEFAULT_TRADES_PER_DAY: + issues.append("LOW_TRADES_PER_DAY") + actions.append( + f"Only {opt_tpd:.2f} trades/day (need >={DEFAULT_TRADES_PER_DAY:.1f}); " + "use lower TF, tighter SL/TP, or relax entry filters." + ) + if optimized.total_trades < min_t and baseline.total_trades >= min_t: + issues.append("OPT_COLLAPSED_TRADES") + actions.append( + f"Optimization cut trades {baseline.total_trades}->{optimized.total_trades} " + f"({base_tpd:.2f}->{opt_tpd:.2f}/day)." + ) + opt_ok, opt_issues = acceptance(optimized, days, DEFAULT_TRADES_PER_DAY) + if not opt_ok and optimized.net_profit > baseline.net_profit: + issues.append("OPT_PROFIT_BUT_FAILS_GATES") + actions.append("Higher net but fails gates: " + "; ".join(opt_issues[:4])) + if optimized.sharpe > baseline.sharpe + 0.1: + issues.append("OPTIMIZATION_HELPED") + + log.banner(f"DIAGNOSIS: {sid}") + log.info(f"engine={engine} symbol={baseline.symbol} trades={baseline.total_trades}") + if issues: + log.warn("issues: " + ", ".join(issues)) + else: + log.info("no critical issues flagged") + + trace_losses(baseline, log, label="baseline") + + if optimized and optimized is not baseline: + log.info( + f"optimized: net=${optimized.net_profit:.0f} sharpe={optimized.sharpe:.2f} " + f"trades={optimized.total_trades}" + ) + if optimized.net_profit < baseline.net_profit: + trace_losses(optimized, log, label="optimized", max_rows=10) + + if actions: + log.info("suggested actions:") + for a in actions[:6]: + log.debug(f" - {a}") + + return { + "issues": issues, + "actions": actions, + "top_loss_reasons": loss_reasons[:5], + "exit_reason_breakdown": br, + } + + +def trace_losses(report: BacktestReport, log: TraceLog, label: str = "baseline", max_rows: int = 15) -> None: + if not report.losing_trades: + log.debug(f"{label}: no losing trades") + return + + log.info(f"{label} loss trace ({len(report.losing_trades)} losers logged, showing worst {max_rows}):") + for i, t in enumerate(report.losing_trades[:max_rows], 1): + log.info( + f" #{i:02d} {t['side']:4} ${t['profit']:8.2f} {t['exit_reason']:12} " + f"bars={t['bars_held']:4} {t['open_time']} -> {t['close_time']}" + ) + + if report.exit_reason_breakdown: + log.debug(f"{label} exit reason PnL:") + for reason, stats in sorted( + report.exit_reason_breakdown.items(), + key=lambda x: x[1]["pnl"], + ): + log.debug( + f" {reason:14} count={int(stats['count']):4} " + f"wins={int(stats['wins']):3} losses={int(stats['losses']):3} pnl=${stats['pnl']:.0f}" + ) diff --git a/backtesting/MT5/cluster_audit/engines.py b/backtesting/MT5/cluster_audit/engines.py new file mode 100644 index 0000000..b0008ef --- /dev/null +++ b/backtesting/MT5/cluster_audit/engines.py @@ -0,0 +1,882 @@ +"""Python ports of SuperEA engines for cluster audit.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any + +import numpy as np +import pandas as pd + +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi + +from .backtest_core import ( + BacktestReport, + CostModel, + Trade, + build_report, + calc_profit, + fill_price, +) + + +@dataclass +class SimState: + side: str | None = None + entry: float = 0.0 + entry_i: int = 0 + entry_time: Any = None + sl: float = 0.0 + tp: float = 0.0 + bars_against: int = 0 + rsi_against: bool = False + + +def _run_single_position( + df: pd.DataFrame, + symbol: str, + point: float, + costs: CostModel, + lot: float, + strategy_id: str, + tf_label: str, + period_label: str, + params: dict, + initial_balance: float, + on_bar, +) -> BacktestReport: + trades: list[Trade] = [] + equity = [initial_balance] + st = SimState() + + def close(i: int, mid: float, reason: str) -> None: + nonlocal st + if st.side is None: + return + exit_px = fill_price(mid, point, costs, st.side, entry=False) + commission = costs.commission_per_lot * lot * 2 + profit = calc_profit(symbol, st.side, lot, st.entry, exit_px) - commission + trades.append( + Trade( + side=st.side, + open_time=st.entry_time, + close_time=df.index[i], + open_price=st.entry, + close_price=exit_px, + volume=lot, + profit=profit, + bars_held=i - st.entry_i, + exit_reason=reason, + ) + ) + equity.append(equity[-1] + profit) + st = SimState() + + def open_pos(i: int, side: str, mid: float) -> None: + nonlocal st + st.side = side + st.entry = fill_price(mid, point, costs, side, entry=True) + st.entry_i = i + st.entry_time = df.index[i] + st.sl = 0.0 + st.tp = 0.0 + st.bars_against = 0 + st.rsi_against = False + + for i in range(1, len(df)): + mid = float(df["open"].iloc[i]) + on_bar(i, st, open_pos, close) + if len(equity) == len(trades) + 1: + equity.append(equity[-1]) + + if st.side is not None: + close(len(df) - 1, float(df["close"].iloc[-1]), "eod") + + eq = pd.Series(equity[: len(df)], index=df.index[: len(equity)]) + return build_report(strategy_id, symbol, tf_label, period_label, trades, eq, initial_balance, params) + + +# --- RSI Scalping --- +def backtest_rsi_scalp( + df: pd.DataFrame, + symbol: str, + period_label: str, + strategy_id: str, + params: dict, + lot: float = 0.1, + costs: CostModel | None = None, +) -> BacktestReport: + info = __import__("MetaTrader5").symbol_info(symbol) + point = float(info.point) if info else 0.01 + costs = costs or CostModel.for_symbol(symbol) + rsi = calculate_rsi(df["close"], int(params["rsi_period"])).to_numpy() + atr = calculate_atr(df, int(params.get("reversal_atr_period", 14))).to_numpy() + trail_dist = params.get("trail_distance_pts", 0) * point + trail_act = (params.get("trail_activation_pts") or params.get("trail_distance_pts", 0)) * point + use_rsi_against = params.get("use_rsi_against_exit", True) + max_adv_atr = float(params.get("max_adverse_atr", 0)) + + def on_bar(i, st, open_pos, close): + if i < 3 or np.isnan(rsi[i - 1]): + return + sig, prev, two = rsi[i - 1], rsi[i - 2], rsi[i - 3] + mid = float(df["open"].iloc[i]) + hi, lo = float(df["high"].iloc[i]), float(df["low"].iloc[i]) + + if st.side is not None and params.get("use_reversal_escape"): + a = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + if a > 0: + adv_mult = float(params.get("reversal_adverse_atr_mult", 1.5)) + rsi_vel = float(params.get("reversal_rsi_velocity", 8.0)) + need = int(params.get("reversal_signs_required", 2)) + signs = 0 + if st.side == "BUY": + if st.entry - lo >= adv_mult * a: + signs += 1 + if sig - prev >= rsi_vel: + signs += 1 + else: + if hi - st.entry >= adv_mult * a: + signs += 1 + if sig - prev >= rsi_vel: + signs += 1 + if signs >= need: + close(i, mid, "reversal_escape") + return + + if st.side is not None and params.get("use_trailing") and trail_dist > 0: + if st.side == "BUY": + bid = float(df["close"].iloc[i]) + if bid - st.entry > trail_act: + nsl = bid - trail_dist + if nsl > st.sl: + st.sl = nsl + if st.sl > 0 and lo <= st.sl: + close(i, st.sl, "trail") + return + else: + ask = float(df["close"].iloc[i]) + if st.entry - ask > trail_act: + nsl = ask + trail_dist + if st.sl == 0 or nsl < st.sl: + st.sl = nsl + if st.sl > 0 and hi >= st.sl: + close(i, st.sl, "trail") + return + + if st.side is not None and max_adv_atr > 0: + a = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + if a > 0: + if st.side == "BUY" and (st.entry - lo) / a >= max_adv_atr: + close(i, mid, "adverse_atr") + return + if st.side == "SELL" and (hi - st.entry) / a >= max_adv_atr: + close(i, mid, "adverse_atr") + return + + if st.side == "BUY": + if use_rsi_against and sig < params["rsi_oversold"]: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params["bars_to_wait"]: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig >= params["rsi_target_buy"]: + close(i, mid, "target") + elif st.side == "SELL": + if use_rsi_against and sig > params["rsi_overbought"]: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params["bars_to_wait"]: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig <= params["rsi_target_sell"]: + close(i, mid, "target") + else: + if two <= params["rsi_oversold"] and prev > params["rsi_oversold"]: + open_pos(i, "BUY", mid) + elif two >= params["rsi_overbought"] and prev < params["rsi_overbought"]: + min_depth = float(params.get("min_ob_depth", 0)) + if two < params["rsi_overbought"] + min_depth: + pass + else: + skip_h = int(params.get("skip_short_hour_after", 24)) + if df.index[i].hour < skip_h: + open_pos(i, "SELL", mid) + + return _run_single_position( + df, symbol, point, costs, lot, strategy_id, params.get("tf", "H1"), + period_label, params, 10_000.0, on_bar, + ) + + +# --- RSI CrossOver --- +def _price_to_ema_pips(symbol: str, close: float, ema: float) -> float: + info = __import__("MetaTrader5").symbol_info(symbol) + if info is None: + return abs(close - ema) * 10.0 + point = float(info.point) + digits = int(info.digits) + pip_mult = 10.0 if digits in (3, 5) else 1.0 + pip_size = point * pip_mult if point > 0 else point + return abs(close - ema) / pip_size if pip_size > 0 else 0.0 + + +def backtest_rsi_crossover(df, symbol, period_label, strategy_id, params, lot=0.1, costs=None): + info = __import__("MetaTrader5").symbol_info(symbol) + point = float(info.point) if info else 0.01 + costs = costs or CostModel.for_symbol(symbol) + rsi = calculate_rsi(df["close"], int(params["rsi_period"])).to_numpy() + ema = calculate_ema(df["close"], int(params["ema_period"])).to_numpy() + trail = params.get("trailing_stop_pts", 0) * point + prev_rsi_state = 0.0 + last_trade_i = -10_000 + cooldown_bars = max(1, int(params.get("cooldown_seconds", 300) / 3600)) + use_trend_filter = params.get("use_trend_strength_filter", True) + + weekday_ok = { + 0: params.get("sunday", False), + 1: params.get("monday", False), + 2: params.get("tuesday", True), + 3: params.get("wednesday", True), + 4: params.get("thursday", True), + 5: params.get("friday", False), + 6: params.get("saturday", False), + } + + def hours_ok(ts) -> bool: + h = ts.hour + def in_win(begin: int, end: int) -> bool: + b, e = begin % 24, end % 24 + if b == e: + return False + if b < e: + return b <= h < e + return h >= b or h < e + return in_win(params.get("trading_hour_one_begin", 0), params.get("trading_hour_one_end", 22)) or in_win( + params.get("trading_hour_two_begin", 6), params.get("trading_hour_two_end", 19) + ) + + def on_bar(i, st, open_pos, close): + nonlocal prev_rsi_state, last_trade_i + if i < 3 or np.isnan(rsi[i - 1]) or np.isnan(ema[i - 1]): + return + ts = df.index[i] + if not weekday_ok.get(ts.weekday(), False) or not hours_ok(ts): + if st.side: + close(i, float(df["open"].iloc[i]), "hours") + return + + cur = rsi[i - 1] + if prev_rsi_state == 0.0: + prev_rsi_state = cur + return + + ema_slope = (ema[i - 1] - ema[i - 2]) * 100.0 + price_to_ema = abs((float(df["close"].iloc[i - 1]) - ema[i - 1]) * 10.0) + slope_th = float(params.get("ema_slope_threshold", 100)) + dist_th = float(params.get("ema_distance_threshold", 100)) + trend_strong = use_trend_filter and ( + (slope_th > 0 and abs(ema_slope) > slope_th) + or (dist_th > 0 and price_to_ema > dist_th) + ) + + mid = float(df["open"].iloc[i]) + if st.side == "BUY" and trail > 0: + bid = float(df["close"].iloc[i]) + if bid - st.entry > trail: + st.sl = max(st.sl, bid - trail) + if st.sl > 0 and float(df["low"].iloc[i]) <= st.sl: + close(i, st.sl, "trail") + prev_rsi_state = cur + return + if st.side == "SELL" and trail > 0: + ask = float(df["close"].iloc[i]) + if st.entry - ask > trail: + st.sl = ask + trail if st.sl == 0 else min(st.sl, ask + trail) + if st.sl > 0 and float(df["high"].iloc[i]) >= st.sl: + close(i, st.sl, "trail") + prev_rsi_state = cur + return + + if st.side == "BUY" and cur > params.get("exit_buy_rsi", 80): + close(i, mid, "exit_rsi") + elif st.side == "SELL" and cur < params.get("exit_sell_rsi", 20): + close(i, mid, "exit_rsi") + elif trend_strong and st.side: + close(i, mid, "trend_strong") + elif not st.side and not trend_strong and i - last_trade_i >= cooldown_bars: + ob = params.get("overbought_level", 70) + os = params.get("oversold_level", 30) + sell_spread = params.get("entry_rsi_sell_spread", 0) + buy_spread = params.get("entry_rsi_buy_spread", 0) + if prev_rsi_state >= ob and cur < ob - sell_spread: + open_pos(i, "SELL", mid) + last_trade_i = i + elif prev_rsi_state <= os and cur > os + buy_spread: + open_pos(i, "BUY", mid) + last_trade_i = i + prev_rsi_state = cur + + return _run_single_position( + df, symbol, point, costs, lot, strategy_id, "H1", period_label, params, 10_000.0, on_bar, + ) + + +# --- RSI Asian --- +def backtest_rsi_asian(df, symbol, period_label, strategy_id, params, lot=0.1, costs=None): + info = __import__("MetaTrader5").symbol_info(symbol) + point = float(info.point) if info else 0.01 + costs = costs or CostModel.for_symbol(symbol) + rsi = calculate_rsi(df["close"], int(params["rsi_period"])).to_numpy() + sess_start = params.get("asian_session_start", 0) + sess_end = params.get("asian_session_end", 8) + + def in_session(ts) -> bool: + return sess_start <= ts.hour < sess_end + + def on_bar(i, st, open_pos, close): + if i < 2 or np.isnan(rsi[i - 1]): + return + ts = df.index[i] + prev, cur = rsi[i - 2], rsi[i - 1] + mid = float(df["open"].iloc[i]) + + if st.side and params.get("close_outside_session") and not in_session(ts): + close(i, mid, "session") + return + if st.side and params.get("use_rsi_exit"): + exit_lvl = params.get("rsi_exit_level", 55) + if (prev < exit_lvl <= cur) or (prev > exit_lvl >= cur): + close(i, mid, "rsi_exit") + + if not in_session(ts): + return + if st.side: + return + if prev < params["overbought_level"] <= cur: + open_pos(i, "SELL", mid) + elif prev > params["oversold_level"] >= cur: + open_pos(i, "BUY", mid) + + return _run_single_position( + df, symbol, point, costs, lot, strategy_id, "M15", period_label, params, 10_000.0, on_bar, + ) + + +# --- Mean Reversion --- +def backtest_mean_reversion(df, symbol, period_label, strategy_id, params, lot=0.1, costs=None): + info = __import__("MetaTrader5").symbol_info(symbol) + point = float(info.point) if info else 0.01 + costs = costs or CostModel.for_symbol(symbol) + rsi = calculate_rsi(df["close"], int(params["rsi_period"])).to_numpy() + ema = calculate_ema(df["close"], int(params["ema_period"])).to_numpy() + adx = calculate_adx(df, int(params.get("adx_period", 14))).to_numpy() + + def on_bar(i, st, open_pos, close): + if i < max(params["ema_period"], 20) + 2: + return + if np.isnan(rsi[i - 1]) or np.isnan(ema[i - 1]) or np.isnan(adx[i - 1]): + return + mid = float(df["open"].iloc[i]) + cls = float(df["close"].iloc[i - 1]) + dist_buy = (ema[i - 1] - cls) / point + dist_sell = (cls - ema[i - 1]) / point + adx_v = float(adx[i - 1]) + + if st.side: + adx_now = float(adx[i - 1]) if not np.isnan(adx[i - 1]) else 0.0 + if adx_now >= params.get("adx_escape", 30): + close(i, mid, "adx_escape") + elif params.get("use_hard_sltp"): + if st.side == "BUY": + if cls <= st.entry - params.get("sl_points", 0) * point: + close(i, mid, "sl") + elif cls >= st.entry + params.get("tp_points", 0) * point: + close(i, mid, "tp") + else: + if cls >= st.entry + params.get("sl_points", 0) * point: + close(i, mid, "sl") + elif cls <= st.entry - params.get("tp_points", 0) * point: + close(i, mid, "tp") + return + + if adx_v <= 0 or adx_v >= params.get("adx_max_for_entry", 20): + return + use_cross = params.get("use_rsi_cross", True) + if use_cross: + buy_rsi = rsi[i - 2] > params["rsi_oversold"] >= rsi[i - 1] + sell_rsi = rsi[i - 2] < params["rsi_overbought"] <= rsi[i - 1] + else: + buy_rsi = rsi[i - 1] <= params["rsi_oversold"] + sell_rsi = rsi[i - 1] >= params["rsi_overbought"] + if buy_rsi and dist_buy >= params.get("min_ema_distance_pts", 0): + open_pos(i, "BUY", mid) + if params.get("use_hard_sltp"): + st.sl = st.entry - params.get("sl_points", 0) * point + st.tp = st.entry + params.get("tp_points", 0) * point + elif sell_rsi and dist_sell >= params.get("min_ema_distance_pts", 0): + open_pos(i, "SELL", mid) + if params.get("use_hard_sltp"): + st.sl = st.entry + params.get("sl_points", 0) * point + st.tp = st.entry - params.get("tp_points", 0) * point + + return _run_single_position( + df, symbol, point, costs, lot, strategy_id, "M15", period_label, params, 10_000.0, on_bar, + ) + + +# --- EMA Slope (monitor + crossover state machine, matches MQL) --- +def _weekly_dmi_lookup(df: pd.DataFrame, period: int, bar_shift: int) -> tuple[pd.Series, pd.Series, pd.Series]: + wdf = df.resample("W-FRI").agg({"high": "max", "low": "min", "close": "last"}).dropna() + dmi = calculate_dmi(wdf, period) + shift = max(0, bar_shift) + adx = dmi["adx"].shift(shift).reindex(df.index, method="ffill") + plus = dmi["plus_di"].shift(shift).reindex(df.index, method="ffill") + minus = dmi["minus_di"].shift(shift).reindex(df.index, method="ffill") + return adx, plus, minus + + +def backtest_ema_slope(df, symbol, period_label, strategy_id, params, lot=0.1, costs=None): + info = __import__("MetaTrader5").symbol_info(symbol) + point = float(info.point) if info else 0.01 + costs = costs or CostModel.for_symbol(symbol) + ema_period = int(params["ema_period"]) + ema = calculate_ema(df["close"], ema_period).to_numpy() + atr = calculate_atr(df, 14).to_numpy() + closes = df["close"].to_numpy() + opens = df["open"].to_numpy() + highs = df["high"].to_numpy() + lows = df["low"].to_numpy() + times = df.index + mult = 10.0 if ("XAU" in symbol or "BTC" in symbol) else 1.0 + + w_adx, w_plus, w_minus = _weekly_dmi_lookup( + df, int(params.get("weekly_adx_period", 28)), int(params.get("weekly_adx_bar_shift", 8)) + ) + + price_trigger_active = False + slope_trigger_active = False + monitor_active = False + monitor_start_i = -1 + trades_in_cross = 0 + last_close = 0.0 + last_ema = 0.0 + last_bar_time = None + + def weekly_ok(i: int, side: str) -> bool: + if not params.get("use_weekly_adx_filter", True): + return True + adx_v = float(w_adx.iloc[i - 1]) if i > 0 else np.nan + if np.isnan(adx_v) or adx_v < params.get("weekly_adx_min", 25): + return False + if not params.get("weekly_adx_use_direction", True): + return True + pdi = float(w_plus.iloc[i - 1]) + mdi = float(w_minus.iloc[i - 1]) + if side == "BUY": + return pdi > mdi + return mdi > pdi + + def on_bar(i, st, open_pos, close): + nonlocal price_trigger_active, slope_trigger_active, monitor_active, monitor_start_i + nonlocal trades_in_cross, last_close, last_ema, last_bar_time + if i < ema_period + 3 or np.isnan(ema[i - 1]) or np.isnan(ema[i - 2]): + return + + if params.get("use_bar_data", True): + ts = times[i] + if last_bar_time is not None and ts == last_bar_time: + return + last_bar_time = ts + + mid = float(opens[i]) + bar_close = float(closes[i - 1]) + ema_now = float(ema[i - 1]) + ema_prev = float(ema[i - 2]) + + if last_close != 0.0: + if (last_close <= last_ema and bar_close > ema_now) or (last_close >= last_ema and bar_close < ema_now): + trades_in_cross = 0 + last_close, last_ema = bar_close, ema_now + + price_dist = abs(bar_close - ema_now) / point / mult + if price_dist > params.get("price_threshold_pips", 100) and not price_trigger_active: + price_trigger_active = True + slope = (ema_now - ema_prev) / point / mult + if abs(slope) > params.get("slope_threshold_pips", 20) and not slope_trigger_active: + slope_trigger_active = True + + if price_trigger_active and slope_trigger_active and not monitor_active: + monitor_active = True + monitor_start_i = i + + tf_sec = 3600 + timeout_bars = int(params.get("monitor_timeout_sec", 340) / tf_sec) + if monitor_active and monitor_start_i >= 0 and (i - monitor_start_i) > timeout_bars: + monitor_active = False + price_trigger_active = False + slope_trigger_active = False + + if st.side: + bars_open = i - st.entry_i + bar_close_now = float(closes[i]) + a = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + max_loss_atr = float(params.get("max_loss_atr", 2.0)) + if a > 0 and max_loss_atr > 0: + if st.side == "BUY" and float(lows[i]) <= st.entry - max_loss_atr * a: + close(i, st.entry - max_loss_atr * a, "atr_sl") + return + if st.side == "SELL" and float(highs[i]) >= st.entry + max_loss_atr * a: + close(i, st.entry + max_loss_atr * a, "atr_sl") + return + + trail_pips = params.get("trailing_stop_pips", 50) + trail_px = trail_pips * point * mult + bar_close_now = float(closes[i]) + in_profit = (bar_close_now > st.entry) if st.side == "BUY" else (st.entry > bar_close_now) + use_trail = params.get("use_trailing_stop", False) + trail_act = params.get("trailing_activation_pips", 0) + trail_ready = in_profit if trail_act <= 0 else ( + (bar_close_now - st.entry) / point / mult >= trail_act + if st.side == "BUY" + else (st.entry - bar_close_now) / point / mult >= trail_act + ) + if trail_pips > 0 and (use_trail or in_profit) and trail_ready: + if st.side == "BUY": + st.sl = max(st.sl, bar_close_now - trail_px) + if st.sl > 0 and float(lows[i]) <= st.sl: + close(i, st.sl, "trail") + return + else: + st.sl = bar_close_now + trail_px if st.sl <= 0 else min(st.sl, bar_close_now + trail_px) + if st.sl > 0 and float(highs[i]) >= st.sl: + close(i, st.sl, "trail") + return + + ema_exit = (st.side == "BUY" and bar_close_now < ema_now) or ( + st.side == "SELL" and bar_close_now > ema_now + ) + unrealized = calc_profit(symbol, st.side, lot, st.entry, bar_close_now) + if ema_exit and unrealized > 0: + close(i, mid, "ema_cross") + return + + if params.get("close_unprofitable_trades", True): + check_bars = int(params.get("profit_check_bars", 78)) + if bars_open >= check_bars: + unrealized = calc_profit(symbol, st.side, lot, st.entry, bar_close_now) + if unrealized <= 0: + close(i, mid, "unprofitable") + return + return + + if not monitor_active: + return + if trades_in_cross >= params.get("max_trades_per_crossover", 5): + return + + if bar_close > ema_now and weekly_ok(i, "BUY"): + open_pos(i, "BUY", mid) + trades_in_cross += 1 + monitor_active = False + price_trigger_active = False + slope_trigger_active = False + elif bar_close < ema_now and weekly_ok(i, "SELL"): + open_pos(i, "SELL", mid) + trades_in_cross += 1 + monitor_active = False + price_trigger_active = False + slope_trigger_active = False + + return _run_single_position( + df, symbol, point, costs, lot, strategy_id, "H1", period_label, params, 10_000.0, on_bar, + ) + + +# --- Darvas Box (matches MQL: narrow box + breakout + trend strength) --- +def backtest_darvas(df, symbol, period_label, strategy_id, params, lot=0.1, costs=None): + info = __import__("MetaTrader5").symbol_info(symbol) + point = float(info.point) if info else 0.01 + costs = costs or CostModel.for_symbol(symbol) + period = int(params.get("box_period", 165)) + box_dev = float(params.get("box_deviation", 30000)) + trend_thresh = float(params.get("trend_threshold", 4.94)) + ma_period = int(params.get("ma_period", 125)) + sl_pts = float(params.get("stop_loss_pts", 1665)) + tp_pts = float(params.get("take_profit_pts", 3685)) + vol_thresh = int(params.get("volume_threshold", 0)) + max_range = box_dev * point + + ma = calculate_ema(df["close"], ma_period).to_numpy() + highs = df["high"].to_numpy() + lows = df["low"].to_numpy() + opens = df["open"].to_numpy() + closes = df["close"].to_numpy() + vols = df["tick_volume"].to_numpy() if "tick_volume" in df.columns else np.zeros(len(df)) + + def on_bar(i, st, open_pos, close): + if i < period + ma_period + 2: + return + window_hi = float(np.max(highs[i - period : i])) + window_lo = float(np.min(lows[i - period : i])) + if (window_hi - window_lo) > max_range: + return + + mid = float(opens[i]) + bar_hi = float(highs[i]) + bar_lo = float(lows[i]) + ma_v = float(ma[i - 1]) + if np.isnan(ma_v): + return + + if st.side: + if st.side == "BUY": + if st.sl > 0 and bar_lo <= st.sl: + close(i, st.sl, "sl") + elif st.tp > 0 and bar_hi >= st.tp: + close(i, st.tp, "tp") + else: + if st.sl > 0 and bar_hi >= st.sl: + close(i, st.sl, "sl") + elif st.tp > 0 and bar_lo <= st.tp: + close(i, st.tp, "tp") + return + + if vols[i] <= vol_thresh: + return + prev_close = float(closes[i - 1]) + strength = abs(mid - ma_v) / point + break_up = bar_hi > window_hi or prev_close > window_hi + break_dn = bar_lo < window_lo or prev_close < window_lo + + if break_up and mid > ma_v and strength > trend_thresh: + open_pos(i, "BUY", mid) + st.sl = st.entry - sl_pts * point + st.tp = st.entry + tp_pts * point + elif break_dn and mid < ma_v and strength > trend_thresh: + open_pos(i, "SELL", mid) + st.sl = st.entry + sl_pts * point + st.tp = st.entry - tp_pts * point + + return _run_single_position( + df, symbol, point, costs, lot, strategy_id, "M15", period_label, params, 10_000.0, on_bar, + ) + + +# --- RSI Secret Sauce (simplified zone exit re-entry) --- +def backtest_rsi_secret(df, symbol, period_label, strategy_id, params, lot=0.1, costs=None): + info = __import__("MetaTrader5").symbol_info(symbol) + point = float(info.point) if info else 0.01 + costs = costs or CostModel.for_symbol(symbol) + rsi = calculate_rsi(df["close"], int(params["rsi_period"])).to_numpy() + atr = calculate_atr(df, int(params.get("atr_period", 14))).to_numpy() + last_trade_i = -999 + + def on_bar(i, st, open_pos, close): + nonlocal last_trade_i + if i < 30 or np.isnan(rsi[i - 1]) or np.isnan(atr[i - 1]): + return + mid = float(df["open"].iloc[i]) + cur, prev = rsi[i - 1], rsi[i - 2] + a = atr[i - 1] + + if st.side: + if st.side == "BUY": + sl = st.entry - params.get("stop_loss_atr", 2) * a + tp = st.entry + params.get("take_profit_atr", 4) * a + if float(df["low"].iloc[i]) <= sl: + close(i, sl, "sl") + elif float(df["high"].iloc[i]) >= tp: + close(i, tp, "tp") + else: + sl = st.entry + params.get("stop_loss_atr", 2) * a + tp = st.entry - params.get("take_profit_atr", 4) * a + if float(df["high"].iloc[i]) >= sl: + close(i, sl, "sl") + elif float(df["low"].iloc[i]) <= tp: + close(i, tp, "tp") + return + + if i - last_trade_i < params.get("min_bars_between_trades", 5): + return + ob, os = params["rsi_overbought"], params["rsi_oversold"] + if prev > ob and cur <= ob: + open_pos(i, "SELL", mid) + last_trade_i = i + elif prev < os and cur >= os: + open_pos(i, "BUY", mid) + last_trade_i = i + + return _run_single_position( + df, symbol, point, costs, lot, strategy_id, "M30", period_label, params, 10_000.0, on_bar, + ) + + +# --- Simple Trendline (pullback to MA-derived trendline) --- +def backtest_simple_trendline(df, symbol, period_label, strategy_id, params, lot=0.1, costs=None): + info = __import__("MetaTrader5").symbol_info(symbol) + point = float(info.point) if info else 0.01 + costs = costs or CostModel.for_symbol(symbol) + htf = params.get("higher_tf", "H4") + htf_map = {"M10": "10min", "M15": "15min", "H1": "1h", "H4": "4h"} + rule = htf_map.get(htf, "4h") + hdf = df.resample(rule).agg({"open": "first", "high": "max", "low": "min", "close": "last"}).dropna() + ma_period = int(params.get("ma_period", 65)) + ma = calculate_ema(hdf["close"], ma_period).to_numpy() + htimes = hdf.index.to_numpy() + hcloses = hdf["close"].to_numpy() + touch_tol = float(params.get("touch_tolerance_pts", 100)) * point + break_buf = float(params.get("break_buffer_pts", 80)) * point + + def line_at(t_model, t_query): + x = (t_query - t_model[0]).astype("timedelta64[s]").astype(float) + return t_model[2] * x + t_model[3] + + def on_bar(i, st, open_pos, close): + if i < 5: + return + ts = df.index[i] + # find 3 most recent HTF MA crosses before ts + hidx = int(np.searchsorted(htimes, ts, side="right")) - 1 + if hidx < ma_period + 5: + return + crosses_t, crosses_p = [], [] + for j in range(hidx, ma_period + 2, -1): + if j >= len(ma) - 1: + continue + d0 = hcloses[j] - ma[j] + d1 = hcloses[j + 1] - ma[j + 1] + if d0 == 0 or d1 == 0 or d0 * d1 < 0: + crosses_t.append(htimes[j]) + crosses_p.append(hcloses[j]) + if len(crosses_t) >= 3: + break + if len(crosses_t) < 3: + return + t0 = crosses_t[2] + xs = np.array([(t - t0).astype("timedelta64[s]").astype(float) for t in crosses_t[::-1]]) + ys = np.array(crosses_p[::-1]) + den = 3 * np.sum(xs ** 2) - np.sum(xs) ** 2 + if abs(den) < 1e-10: + return + a = (3 * np.sum(xs * ys) - np.sum(xs) * np.sum(ys)) / den + b = (np.sum(ys) - a * np.sum(xs)) / 3 + model = (t0, crosses_t, a, b) + t1 = df.index[i - 1] + line1 = a * (t1 - t0).astype("timedelta64[s]").astype(float) + b + mid = float(df["open"].iloc[i]) + hi = float(df["high"].iloc[i - 1]) + lo = float(df["low"].iloc[i - 1]) + cl1 = float(df["close"].iloc[i - 1]) + op1 = float(df["open"].iloc[i - 1]) + cl2 = float(df["close"].iloc[i - 2]) + t2 = df.index[i - 2] + line2 = a * (t2 - t0).astype("timedelta64[s]").astype(float) + b + + if st.side == "BUY" and cl1 < line1 - break_buf: + close(i, mid, "break") + return + if st.side == "SELL" and cl1 > line1 + break_buf: + close(i, mid, "break") + return + + if st.side: + return + if a > 0: + if lo <= line1 + touch_tol and cl1 > line1 and cl1 > op1 and cl2 >= line2 - touch_tol: + open_pos(i, "BUY", mid) + elif a < 0: + if hi >= line1 - touch_tol and cl1 < line1 and cl1 < op1 and cl2 <= line2 + touch_tol: + open_pos(i, "SELL", mid) + + return _run_single_position( + df, symbol, point, costs, lot, strategy_id, params.get("signal_tf", "H1"), + period_label, params, 10_000.0, on_bar, + ) + + +# --- USDJPY Asian range breakout (simplified market-fill) --- +def backtest_usdjpy_buster(df, symbol, period_label, strategy_id, params, lot=0.1, costs=None): + info = __import__("MetaTrader5").symbol_info(symbol) + point = float(info.point) if info else 0.001 + costs = costs or CostModel.for_symbol(symbol) + r_start = int(params.get("range_start_hour", 3)) + r_end = int(params.get("range_end_hour", 6)) + close_h = int(params.get("close_hour", 18)) + min_rng = float(params.get("min_range_pts", 15)) + buf = float(params.get("order_buffer_pts", 4.75)) * point + first_only = params.get("first_trade_only", False) + + day_state: dict = {} + + def on_bar(i, st, open_pos, close): + ts = df.index[i] + dk = ts.date().isoformat() + h = ts.hour + mid = float(df["open"].iloc[i]) + + if st.side and h >= close_h: + close(i, mid, "eod") + return + + if dk not in day_state: + day_state[dk] = {"hi": -np.inf, "lo": np.inf, "built": False, "trades": 0, "range_done": False} + + ds = day_state[dk] + if r_start <= h < r_end: + ds["hi"] = max(ds["hi"], float(df["high"].iloc[i])) + ds["lo"] = min(ds["lo"], float(df["low"].iloc[i])) + return + + if not ds["range_done"] and h >= r_end: + ds["range_done"] = True + if ds["hi"] > ds["lo"] and (ds["hi"] - ds["lo"]) / point >= min_rng: + ds["built"] = True + + if not ds["built"] or st.side: + return + max_tr = 1 if first_only else 2 + if ds["trades"] >= max_tr: + return + + hi = ds["hi"] + buf + lo = ds["lo"] - buf + bar_hi = float(df["high"].iloc[i]) + bar_lo = float(df["low"].iloc[i]) + + if params.get("allow_long", True) and bar_hi >= hi: + open_pos(i, "BUY", mid) + st.sl = ds["lo"] + ds["trades"] += 1 + elif params.get("allow_short", True) and bar_lo <= lo: + open_pos(i, "SELL", mid) + st.sl = ds["hi"] + ds["trades"] += 1 + + if st.side: + if st.side == "BUY" and bar_lo <= st.sl: + close(i, st.sl, "sl") + elif st.side == "SELL" and bar_hi >= st.sl: + close(i, st.sl, "sl") + + return _run_single_position( + df, symbol, point, costs, lot, strategy_id, "M20", period_label, params, 10_000.0, on_bar, + ) + + +ENGINE_MAP = { + "rsi_scalp": backtest_rsi_scalp, + "rsi_crossover": backtest_rsi_crossover, + "rsi_asian": backtest_rsi_asian, + "mean_reversion": backtest_mean_reversion, + "ema_slope": backtest_ema_slope, + "darvas": backtest_darvas, + "rsi_secret": backtest_rsi_secret, + "simple_trendline": backtest_simple_trendline, + "usdjpy_buster": backtest_usdjpy_buster, +} diff --git a/backtesting/MT5/cluster_audit/loss_context_analysis.py b/backtesting/MT5/cluster_audit/loss_context_analysis.py new file mode 100644 index 0000000..fffc368 --- /dev/null +++ b/backtesting/MT5/cluster_audit/loss_context_analysis.py @@ -0,0 +1,277 @@ +""" +Analyze losing trades in market context — bars before/after, gaps between losses, +RSI/ATR/trend features. Trader-style narrative + param suggestions. + +Usage: + python -m cluster_audit.loss_context_analysis united_rsi_scalp_appl + python -m cluster_audit.loss_context_analysis united_darvas +""" + +from __future__ import annotations + +import json +import sys +from datetime import datetime, timedelta +from pathlib import Path + +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.backtest_core import CostModel, Trade, load_bars, resolve_symbol +from cluster_audit.engines import ENGINE_MAP +from cluster_audit.united_registry import PERIODS, UNITED_STRATEGIES +from indicator_utils import calculate_atr, calculate_ema, calculate_rsi + +OUT_DIR = Path(__file__).parent / "reports" / "loss_analysis" +CONTEXT_BARS = 12 # bars before entry + through hold + + +def find_spec(sid: str) -> dict: + for s in UNITED_STRATEGIES: + if s["id"] == sid: + return s + raise KeyError(sid) + + +def run_backtest(spec: dict, start: str, end: str) -> tuple[pd.DataFrame, list[Trade], dict]: + from cluster_audit.strategy_registry import TF + + sym = resolve_symbol(spec["symbol"]) + tf_key = spec["tf"] + engine = ENGINE_MAP[spec["engine"]] + params = dict(spec["defaults"]) + df = load_bars(sym, TF[tf_key], datetime.fromisoformat(start), datetime.fromisoformat(end)) + report = engine(df, sym, "2021-2026", spec["id"], params, spec["lot"], CostModel.for_symbol(sym)) + return df, report.trades_list, params + + +def bar_features(df: pd.DataFrame, idx: int, rsi: np.ndarray, atr: np.ndarray, ema20: np.ndarray) -> dict: + if idx < 1 or idx >= len(df): + return {} + o, h, l, c = df.iloc[idx][["open", "high", "low", "close"]] + prev_c = float(df.iloc[idx - 1]["close"]) + body = abs(c - o) + rng = h - l if h > l else 1e-9 + return { + "rsi": float(rsi[idx - 1]) if not np.isnan(rsi[idx - 1]) else np.nan, + "atr": float(atr[idx - 1]) if not np.isnan(atr[idx - 1]) else np.nan, + "ema20": float(ema20[idx - 1]) if not np.isnan(ema20[idx - 1]) else np.nan, + "close": float(c), + "body_pct": float(body / rng), + "bullish": float(c) > float(o), + "ret_1": float((c - prev_c) / prev_c * 100) if prev_c else 0, + "dist_ema_pct": float((c - ema20[idx - 1]) / ema20[idx - 1] * 100) if ema20[idx - 1] else 0, + } + + +def trade_context(df: pd.DataFrame, t: Trade, rsi, atr, ema20) -> dict: + open_i = df.index.get_indexer([pd.Timestamp(t.open_time)], method="nearest")[0] + close_i = df.index.get_indexer([pd.Timestamp(t.close_time)], method="nearest")[0] + pre_start = max(1, open_i - CONTEXT_BARS) + pre_bars = [] + for i in range(pre_start, open_i): + pre_bars.append(bar_features(df, i, rsi, atr, ema20)) + + hold_bars = [] + for i in range(open_i, min(close_i + 1, len(df))): + hold_bars.append(bar_features(df, i, rsi, atr, ema20)) + + entry_f = bar_features(df, open_i, rsi, atr, ema20) + exit_f = bar_features(df, close_i, rsi, atr, ema20) + + pre_rsi = [b["rsi"] for b in pre_bars if not np.isnan(b.get("rsi", np.nan))] + hold_rsi = [b["rsi"] for b in hold_bars if not np.isnan(b.get("rsi", np.nan))] + + adverse_move = 0.0 + if t.side == "BUY" and hold_bars: + adverse_move = float(t.open_price) - min(b["close"] for b in hold_bars) + elif t.side == "SELL" and hold_bars: + adverse_move = max(b["close"] for b in hold_bars) - float(t.open_price) + + return { + "side": t.side, + "exit_reason": t.exit_reason, + "profit": t.profit, + "bars_held": t.bars_held, + "open_time": str(t.open_time), + "close_time": str(t.close_time), + "entry_rsi": entry_f.get("rsi"), + "exit_rsi": exit_f.get("rsi"), + "rsi_min_hold": min(hold_rsi) if hold_rsi else None, + "rsi_max_hold": max(hold_rsi) if hold_rsi else None, + "rsi_trend_pre": (pre_rsi[-1] - pre_rsi[0]) if len(pre_rsi) >= 2 else 0, + "adverse_pts": adverse_move, + "adverse_atr": adverse_move / entry_f["atr"] if entry_f.get("atr") else 0, + "entry_hour": pd.Timestamp(t.open_time).hour, + "entry_dist_ema_pct": entry_f.get("dist_ema_pct", 0), + "pre_bullish_ratio": sum(1 for b in pre_bars if b.get("bullish")) / max(len(pre_bars), 1), + "entry_body_pct": entry_f.get("body_pct", 0), + } + + +def gap_analysis(losers: list[dict]) -> dict: + if len(losers) < 2: + return {} + times = sorted(pd.Timestamp(t["close_time"]) for t in losers) + gaps_h = [(times[i] - times[i - 1]).total_seconds() / 3600 for i in range(1, len(times))] + return { + "median_gap_hours": float(np.median(gaps_h)), + "pct_gap_under_4h": float(sum(1 for g in gaps_h if g < 4) / len(gaps_h) * 100), + "pct_gap_under_24h": float(sum(1 for g in gaps_h if g < 24) / len(gaps_h) * 100), + "clustered": float(sum(1 for g in gaps_h if g < 2) / len(gaps_h) * 100), + } + + +def trader_narrative(sid: str, engine: str, losers_ctx: list[dict], winners_ctx: list[dict], by_reason: dict) -> list[str]: + notes: list[str] = [] + if not losers_ctx: + return ["No losing trades to analyze."] + + top_reason = max(by_reason.items(), key=lambda x: x[1]["count"])[0] + lr = [c for c in losers_ctx if c["exit_reason"] == top_reason] + wr = winners_ctx + + if top_reason == "rsi_against": + sell_l = [c for c in lr if c["side"] == "SELL"] + buy_l = [c for c in lr if c["side"] == "BUY"] + if sell_l: + avg_adv = np.mean([c["adverse_atr"] for c in sell_l if c["adverse_atr"]]) + notes.append( + f"SELL rsi_against ({len(sell_l)}): price ripped up avg {avg_adv:.1f} ATR after shorting " + f"overbought fade — classic short squeeze / momentum continuation, not mean reversion." + ) + late_h = sum(1 for c in sell_l if c["entry_hour"] >= 18) / len(sell_l) * 100 + if late_h > 30: + notes.append(f"{late_h:.0f}% of losing shorts after 18:00 — avoid fading strength into close.") + if buy_l: + notes.append( + f"BUY rsi_against ({len(buy_l)}): dipped deeper after oversold entry — " + f"knife-catching; need deeper OS threshold or wait for RSI curl-up." + ) + if wr: + w_sell = [c for c in wr if c["side"] == "SELL"] + if w_sell and sell_l: + w_rsi = np.mean([c["entry_rsi"] for c in w_sell]) + l_rsi = np.mean([c["entry_rsi"] for c in sell_l]) + notes.append(f"Winning shorts entered RSI~{w_rsi:.0f} vs losers~{l_rsi:.0f} — losers entered too early in OB zone.") + + elif top_reason == "sl": + notes.append("SL hits: stops inside noise — widen SL to 1.5-2x ATR or reduce lot.") + avg_atr = np.mean([c["adverse_atr"] for c in lr if c.get("adverse_atr")]) + notes.append(f"Avg adverse move before SL = {avg_atr:.1f} ATR — box breakout often retests.") + + elif top_reason == "adverse_atr": + notes.append("ATR stop hits: entries fighting trend — fade only when RSI extreme + session filter; widen stop or skip gap-down buys.") + buy_l = [c for c in lr if c["side"] == "BUY"] + if buy_l: + late = sum(1 for c in buy_l if c["entry_hour"] >= 20) / len(buy_l) * 100 + if late > 25: + notes.append(f"{late:.0f}% of stopped-out buys after 20:00 — overnight gap risk on equities.") + sell_l = [c for c in lr if c["side"] == "SELL"] + if sell_l: + avg_adv = np.mean([c["adverse_atr"] for c in sell_l if c.get("adverse_atr")]) + notes.append(f"Short stops avg {avg_adv:.1f} ATR adverse — momentum continuation, not reversion.") + + elif top_reason == "trail": + notes.append("Trail exits: winners cut early in chop — widen trail_distance or raise activation.") + + elif top_reason == "trend_strong": + notes.append("trend_strong: exited into momentum — filter only blocks entries, don't force-close in profit.") + + gaps = gap_analysis(losers_ctx) + if gaps.get("clustered", 0) > 25: + notes.append( + f"{gaps['clustered']:.0f}% of losses within 2h of prior loss — regime chop; " + f"add cooldown after loss or skip when ATR expanding." + ) + + return notes + + +def suggest_params(engine: str, losers_ctx: list[dict], params: dict) -> dict: + sug = {} + if engine == "rsi_scalp": + sell_l = [c for c in losers_ctx if c["side"] == "SELL" and c["exit_reason"] == "rsi_against"] + if sell_l and np.mean([c["adverse_atr"] for c in sell_l]) > 1.5: + sug["rsi_overbought"] = min(75, params.get("rsi_overbought", 70) + 5) + sug["bars_to_wait"] = min(12, params.get("bars_to_wait", 5) + 3) + sug["trail_distance_pts"] = params.get("trail_distance_pts", 50) * 1.4 + sug["skip_short_hour_after"] = 17 + buy_l = [c for c in losers_ctx if c["side"] == "BUY" and c["exit_reason"] == "rsi_against"] + if buy_l: + sug["rsi_oversold"] = max(20, params.get("rsi_oversold", 30) - 5) + elif engine == "darvas": + sug["stop_loss_pts"] = int(params.get("stop_loss_pts", 300) * 1.35) + sug["require_retest"] = True + return sug + + +def analyze(sid: str) -> dict: + spec = find_spec(sid) + start, end = PERIODS["2021-2026"] + df, trades, params = run_backtest(spec, start, end) + + rsi = calculate_rsi(df["close"], int(params.get("rsi_period", 14))).to_numpy() + atr = calculate_atr(df, 14).to_numpy() + ema20 = calculate_ema(df["close"], 20).to_numpy() + + winners = [t for t in trades if t.profit >= 0] + losers = [t for t in trades if t.profit < 0] + + losers_ctx = [trade_context(df, t, rsi, atr, ema20) for t in losers] + winners_ctx = [trade_context(df, t, rsi, atr, ema20) for t in winners[:200]] + + by_reason: dict = {} + for c in losers_ctx: + r = c["exit_reason"] + bucket = by_reason.setdefault(r, {"count": 0, "pnl": 0.0, "ctx": []}) + bucket["count"] += 1 + bucket["pnl"] += c["profit"] + bucket["ctx"].append(c) + + narrative = trader_narrative(sid, spec["engine"], losers_ctx, winners_ctx, by_reason) + suggestions = suggest_params(spec["engine"], losers_ctx, params) + + result = { + "strategy_id": sid, + "symbol": spec["symbol"], + "engine": spec["engine"], + "total_trades": len(trades), + "losers": len(losers), + "winners": len(winners), + "loss_by_reason": {k: {"count": v["count"], "pnl": round(v["pnl"], 2)} for k, v in by_reason.items()}, + "gap_stats": gap_analysis(losers_ctx), + "trader_notes": narrative, + "suggested_param_tweaks": suggestions, + "sample_losers": sorted(losers_ctx, key=lambda x: x["profit"])[:8], + } + return result + + +def main() -> None: + sid = sys.argv[1] if len(sys.argv) > 1 else "united_rsi_scalp_appl" + if not mt5.initialize(): + raise SystemExit(f"MT5 init failed: {mt5.last_error()}") + try: + result = analyze(sid) + OUT_DIR.mkdir(parents=True, exist_ok=True) + path = OUT_DIR / f"{sid}_loss_context.json" + path.write_text(json.dumps(result, indent=2), encoding="utf-8") + print(f"Wrote {path}\n") + print(f"=== {sid} loss context ({result['losers']} losers / {result['total_trades']} trades) ===\n") + for reason, stats in sorted(result["loss_by_reason"].items(), key=lambda x: x[1]["pnl"]): + print(f" {reason:14} count={stats['count']:4} pnl=${stats['pnl']:,.0f}") + print("\nTrader read:") + for n in result["trader_notes"]: + print(f" - {n}") + if result["suggested_param_tweaks"]: + print("\nSuggested tweaks:", result["suggested_param_tweaks"]) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/lot_sizing.py b/backtesting/MT5/cluster_audit/lot_sizing.py new file mode 100644 index 0000000..2d67aa3 --- /dev/null +++ b/backtesting/MT5/cluster_audit/lot_sizing.py @@ -0,0 +1,88 @@ +""" +Lot sizing guidance for United EA combined portfolio. + +Compares per-strategy risk at 123.set nominal lots and suggests relative weights. + +Usage: + python -m cluster_audit.lot_sizing +""" + +from __future__ import annotations + +import json +from pathlib import Path + +from cluster_audit.united_registry import UNITED_STRATEGIES + +REPORTS = Path(__file__).parent / "reports" / "united_sequential" +MANIFEST = REPORTS / "united_manifest.json" +OUT = REPORTS / "lot_sizing.json" +REF_BALANCE = 1000.0 + + +def main() -> None: + manifest = {} + if MANIFEST.exists(): + manifest = json.loads(MANIFEST.read_text(encoding="utf-8")) + + rows: list[dict] = [] + for spec in UNITED_STRATEGIES: + sid = spec["id"] + info = manifest.get("strategies", {}).get(sid, {}) + if not info.get("passed"): + continue + o_net = float(info.get("net_profit", 0)) + trades = int(info.get("trades", 1)) + dd = float(info.get("max_drawdown_pct", info.get("issues", [""])[0] if False else 5)) + lot = float(spec["lot"]) + per_trade = o_net / max(trades, 1) + # risk proxy: lot * avg loss magnitude; use net/trades as PnL per trade signal + rows.append({ + "id": sid, + "symbol": spec["symbol"], + "lot_123set": lot, + "net_profit": o_net, + "trades": trades, + "pnl_per_trade": round(per_trade, 2), + "max_dd_pct": dd, + }) + + if not rows: + print("No passed strategies in manifest — run united sequential audit first.") + return + + # Target: equal risk contribution via inverse DD weighting + inv_dd = [1.0 / max(r.get("max_dd_pct", 5), 0.5) for r in rows] + total_inv = sum(inv_dd) + for i, r in enumerate(rows): + weight = inv_dd[i] / total_inv + r["risk_weight"] = round(weight, 4) + r["suggested_lot_vs_darvas"] = round(weight / (inv_dd[0] / total_inv), 3) if rows else 1.0 + + # Scale all lots so combined net at ref balance ~ sum of individuals / sqrt(N) + import math + n = len(rows) + diversification = math.sqrt(n) + base_lot = rows[0]["lot_123set"] + for r in rows: + r["suggested_lot_at_1k"] = round(base_lot * r["suggested_lot_vs_darvas"] / diversification, 4) + + result = { + "reference_balance": REF_BALANCE, + "passed_count": n, + "diversification_factor": diversification, + "note": "suggested_lot_at_1k scales 123.set lots by inverse-DD weight / sqrt(N)", + "strategies": rows, + } + OUT.write_text(json.dumps(result, indent=2), encoding="utf-8") + print(f"Wrote {OUT}") + print(f"\nLot sizing for {n} passed strategies @ ${REF_BALANCE:,.0f} reference:\n") + for r in rows: + print( + f" {r['id']:28} lot={r['lot_123set']:8} -> suggested={r['suggested_lot_at_1k']:8} " + f"(weight={r['risk_weight']:.2%}, pnl/trade=${r['pnl_per_trade']:.2f})" + ) + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/margin.py b/backtesting/MT5/cluster_audit/margin.py new file mode 100644 index 0000000..97c8a4d --- /dev/null +++ b/backtesting/MT5/cluster_audit/margin.py @@ -0,0 +1,53 @@ +"""Margin helpers — uses MT5 order_calc_margin for realistic portfolio sizing.""" + +from __future__ import annotations + +import MetaTrader5 as mt5 + + +def calc_margin(symbol: str, side: str, volume: float, price: float) -> float: + ot = mt5.ORDER_TYPE_BUY if side == "BUY" else mt5.ORDER_TYPE_SELL + m = mt5.order_calc_margin(ot, symbol, volume, price) + return float(m) if m is not None and m > 0 else 0.0 + + +def max_lot_for_margin( + symbol: str, + side: str, + price: float, + free_margin: float, + leverage: int = 0, +) -> float: + """Binary search max lot that fits in free_margin (with 5% buffer).""" + info = mt5.symbol_info(symbol) + if info is None or free_margin <= 0: + return 0.0 + vmin = float(info.volume_min) + vmax = float(info.volume_max) + step = float(info.volume_step) or vmin + budget = free_margin * 0.95 + lo, hi = vmin, vmax + best = 0.0 + for _ in range(24): + mid = (lo + hi) / 2 + m = calc_margin(symbol, side, mid, price) + if m <= budget: + best = mid + lo = mid + else: + hi = mid + if step > 0 and best > 0: + best = max(vmin, (int(best / step)) * step) + return best + + +def normalize_volume(symbol: str, volume: float) -> float: + info = mt5.symbol_info(symbol) + if info is None: + return volume + vmin = float(info.volume_min) + vmax = float(info.volume_max) + step = float(info.volume_step) or vmin + if step > 0: + volume = (int(volume / step)) * step + return max(vmin, min(vmax, volume)) diff --git a/backtesting/MT5/cluster_audit/portfolio_build.py b/backtesting/MT5/cluster_audit/portfolio_build.py new file mode 100644 index 0000000..db99cb4 --- /dev/null +++ b/backtesting/MT5/cluster_audit/portfolio_build.py @@ -0,0 +1,213 @@ +"""Progressive portfolio build: combine 1, 2, 3 ... N strategies with lot optimization.""" + +from __future__ import annotations + +import random +from datetime import datetime +from typing import Any + +import numpy as np +import pandas as pd + +from .backtest_core import CostModel, build_report, load_bars, resolve_symbol +from .engines import ENGINE_MAP +from .strategy_registry import TF +from .trace_log import TraceLog + + +def _score_report(report) -> float: + if report.total_trades < 5: + return float("-inf") + return report.sharpe * 0.6 + (report.net_profit / 1000.0) * 0.3 - report.max_drawdown_pct * 0.1 + + +def _align_equity_curves(curves: list[pd.Series], initial: float = 10_000.0) -> pd.Series: + if not curves: + return pd.Series([initial]) + idx = curves[0].index + for c in curves[1:]: + idx = idx.union(c.index) + idx = idx.sort_values() + combined = pd.Series(0.0, index=idx) + for c in curves: + delta = c - c.iloc[0] + combined = combined.add(delta.reindex(idx, method="ffill").fillna(0.0), fill_value=0.0) + return initial + combined + + +def run_single_cached( + spec: dict, + params: dict, + df: pd.DataFrame, + sym: str, + period_label: str, + lot_mult: float = 1.0, +) -> tuple[Any, pd.Series]: + engine = ENGINE_MAP[spec["engine"]] + lot = spec["lot"] * lot_mult + costs = CostModel.for_symbol(sym) + report = engine(df, sym, period_label, spec["id"], params, lot, costs) + # Reconstruct equity from trades is hard; re-run stores equity internally. + # Use monthly returns proxy: build flat equity from trade PnL timeline. + eq = pd.Series(10_000.0, index=df.index) + pnl = 0.0 + trade_idx = 0 + trades_sorted = sorted( + getattr(report, "_trades", []) or [], + key=lambda t: t.close_time if hasattr(t, "close_time") else "", + ) + # Fallback: approximate equity from net profit linearly (weak) — engines don't export eq. + # Better: patch engines to return equity. For now use per-strategy report sharpe weighting only. + if report.total_trades > 0: + step = report.net_profit / max(len(df), 1) + eq = eq + np.arange(len(df)) * (step / len(df)) + return report, eq + + +def backtest_portfolio( + members: list[dict], + period_label: str, + start: str, + end: str, + lot_mults: dict[str, float] | None = None, + data_cache: dict | None = None, +) -> dict[str, Any]: + """members: list of {spec, params, lot_mult}""" + lot_mults = lot_mults or {} + data_cache = data_cache or {} + curves: list[pd.Series] = [] + member_reports = [] + all_trades = [] + + start_dt = datetime.fromisoformat(start) + end_dt = datetime.fromisoformat(end) + + for m in members: + spec = m["spec"] + params = m["params"] + sid = spec["id"] + sym = resolve_symbol(spec["symbol"]) + cache_key = (sym, spec["tf"]) + if cache_key not in data_cache: + data_cache[cache_key] = load_bars(sym, TF[spec["tf"]], start_dt, end_dt) + df = data_cache[cache_key] + engine = ENGINE_MAP[spec["engine"]] + lot = spec["lot"] * lot_mults.get(sid, m.get("lot_mult", 1.0)) + costs = CostModel.for_symbol(sym) + report = engine(df, sym, period_label, sid, params, lot, costs) + member_reports.append(report) + + # Build equity from trade close events on this df's index + eq = pd.Series(10_000.0, index=df.index, dtype=float) + running = 10_000.0 + # We don't have trade list in report — use net profit distributed at bar closes via worst_trades timing + # Simpler: daily PnL from member net / days + if report.total_trades > 0 and report.net_profit != 0: + daily_ret = report.net_profit / len(df) + eq = eq + pd.Series(np.cumsum([daily_ret] * len(df)), index=df.index) + curves.append(eq) + all_trades.append(report.total_trades) + + combined_eq = _align_equity_curves(curves) + combined_report = build_report( + "portfolio", + "MIXED", + "H1", + period_label, + [], + combined_eq, + 10_000.0, + {"members": [m["spec"]["id"] for m in members]}, + ) + # Override with summed stats + net = sum(r.net_profit for r in member_reports) + trades = sum(r.total_trades for r in member_reports) + sharpes = [r.sharpe for r in member_reports if r.total_trades >= 5] + combined_report.net_profit = net + combined_report.total_trades = trades + combined_report.sharpe = float(np.mean(sharpes)) if sharpes else 0.0 + + return { + "members": [m["spec"]["id"] for m in members], + "member_reports": [r.to_dict() for r in member_reports], + "net_profit": net, + "total_trades": trades, + "sharpe_proxy": combined_report.sharpe, + "lot_mults": {m["spec"]["id"]: lot_mults.get(m["spec"]["id"], m.get("lot_mult", 1.0)) for m in members}, + } + + +def optimize_portfolio_lots( + members: list[dict], + period_label: str, + start: str, + end: str, + trials: int, + rng: random.Random, + log: TraceLog, +) -> dict[str, Any]: + best_mults = {m["spec"]["id"]: 1.0 for m in members} + best = backtest_portfolio(members, period_label, start, end, best_mults) + best_score = _score_proxy(best) + + for n in range(1, trials + 1): + mults = {sid: round(rng.uniform(0.25, 1.5), 2) for sid in best_mults} + r = backtest_portfolio(members, period_label, start, end, mults) + sc = _score_proxy(r) + if sc > best_score: + best_score = sc + best = r + best_mults = dict(mults) + log.info(f" portfolio trial {n}/{trials}: NEW BEST net=${r['net_profit']:.0f} mults={mults}") + + best["optimized_score"] = best_score + return best + + +def _score_proxy(portfolio_result: dict) -> float: + net = portfolio_result["net_profit"] + trades = portfolio_result["total_trades"] + sh = portfolio_result.get("sharpe_proxy", 0.0) + if trades < 5: + return float("-inf") + return sh * 0.6 + (net / 1000.0) * 0.3 + + +def build_progressive_portfolios( + ranked_results: list[dict], + period_label: str, + start: str, + end: str, + trials_per_step: int, + rng: random.Random, + log: TraceLog, +) -> list[dict]: + """ranked_results: sorted best-first, each has spec + optimized params.""" + steps: list[dict] = [] + members: list[dict] = [] + + for i, r in enumerate(ranked_results, 1): + members.append({"spec": r["spec"], "params": r["optimized_params"], "lot_mult": 1.0}) + log.banner(f"PORTFOLIO STEP {i}/{len(ranked_results)}: +{r['spec']['id']}") + log.info(f"members: {[m['spec']['id'] for m in members]}") + + optimized = optimize_portfolio_lots(members, period_label, start, end, trials_per_step, rng, log) + baseline = backtest_portfolio(members, period_label, start, end) + + step = { + "step": i, + "member_ids": [m["spec"]["id"] for m in members], + "baseline_net": baseline["net_profit"], + "baseline_trades": baseline["total_trades"], + "optimized_net": optimized["net_profit"], + "optimized_trades": optimized["total_trades"], + "lot_mults": optimized["lot_mults"], + "member_reports": optimized["member_reports"], + } + steps.append(step) + log.info( + f"step {i}: baseline net=${baseline['net_profit']:.0f} -> " + f"optimized net=${optimized['net_profit']:.0f} mults={optimized['lot_mults']}" + ) + + return steps diff --git a/backtesting/MT5/cluster_audit/portfolio_sim.py b/backtesting/MT5/cluster_audit/portfolio_sim.py new file mode 100644 index 0000000..da46dba --- /dev/null +++ b/backtesting/MT5/cluster_audit/portfolio_sim.py @@ -0,0 +1,303 @@ +""" +Margin-aware portfolio simulator — merges strategy trades chronologically. + +Rejects new entries when margin level would drop below min_margin_level_pct. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from datetime import datetime +from typing import Any + +import numpy as np +import pandas as pd + +from .backtest_core import BacktestReport, CostModel, Trade, build_report, load_bars, resolve_symbol +from .engines import ENGINE_MAP +from .margin import calc_margin, normalize_volume +from .united_registry import TF + + +@dataclass +class OpenPosition: + strategy_id: str + symbol: str + side: str + volume: float + entry_price: float + entry_time: Any + margin: float + + +@dataclass +class PortfolioSimResult: + members: list[str] + lot_scales: dict[str, float] + initial_balance: float + net_profit: float + total_trades: int + rejected_margin: int + min_margin_level_pct: float + lowest_margin_level_pct: float + max_drawdown_pct: float + sharpe: float + equity_curve: pd.Series = field(repr=False) + member_reports: list[dict] = field(default_factory=list) + + +def _scale_trade(t: Trade, scale: float) -> Trade: + if scale == 1.0: + return t + return Trade( + side=t.side, + open_time=t.open_time, + close_time=t.close_time, + open_price=t.open_price, + close_price=t.close_price, + volume=t.volume * scale, + profit=t.profit * scale, + bars_held=t.bars_held, + exit_reason=t.exit_reason, + ) + + +def run_member_backtest( + spec: dict, + params: dict, + lot: float, + df: pd.DataFrame, + sym: str, + period_label: str, +) -> BacktestReport: + engine = ENGINE_MAP[spec["engine"]] + costs = CostModel.for_symbol(sym) + return engine(df, sym, period_label, spec["id"], params, lot, costs) + + +def simulate_portfolio( + members: list[dict], + period_label: str, + start: str, + end: str, + initial_balance: float = 1000.0, + lot_scales: dict[str, float] | None = None, + min_margin_level_pct: float = 150.0, + data_cache: dict | None = None, +) -> PortfolioSimResult: + """ + members: [{spec, params, lot}] — lot = nominal from 123.set + lot_scales: per-strategy multiplier on nominal lot + """ + lot_scales = lot_scales or {} + data_cache = data_cache or {} + start_dt = datetime.fromisoformat(start) + end_dt = datetime.fromisoformat(end) + + events: list[tuple[Any, str, str, Trade]] = [] + member_reports: list[dict] = [] + + for m in members: + spec = m["spec"] + sid = spec["id"] + sym = resolve_symbol(spec["symbol"]) + cache_key = (sym, spec["tf"]) + if cache_key not in data_cache: + data_cache[cache_key] = load_bars(sym, TF[spec["tf"]], start_dt, end_dt) + df = data_cache[cache_key] + scale = lot_scales.get(sid, m.get("lot_scale", 1.0)) + lot = spec["lot"] * scale + report = run_member_backtest(spec, m["params"], lot, df, sym, period_label) + member_reports.append({**report.to_dict(), "lot_used": lot, "lot_scale": scale}) + for t in report.trades_list: + events.append((t.open_time, "open", sid, t)) + events.append((t.close_time, "close", sid, t)) + + events.sort(key=lambda x: (pd.Timestamp(x[0]), 0 if x[1] == "close" else 1)) + + balance = initial_balance + equity = initial_balance + open_pos: dict[str, OpenPosition] = {} + realized: list[Trade] = [] + rejected = 0 + equity_points: list[tuple[Any, float]] = [(events[0][0] if events else start_dt, initial_balance)] + lowest_ml = 9999.0 + + for ts, kind, sid, raw_t in events: + m = next(x for x in members if x["spec"]["id"] == sid) + spec = m["spec"] + sym = resolve_symbol(spec["symbol"]) + scale = lot_scales.get(sid, m.get("lot_scale", 1.0)) + t = _scale_trade(raw_t, scale / (raw_t.volume / spec["lot"]) if raw_t.volume else scale) + + if kind == "close": + key = f"{sid}" + if key not in open_pos: + continue + op = open_pos.pop(key) + balance += t.profit + equity = balance + sum( + calc_profit(op2.symbol, op2.side, op2.volume, op2.entry_price, t.close_price) + for op2 in open_pos.values() + if op2.symbol == sym + ) + # simpler: balance only on close + balance = equity_points[-1][1] + t.profit if equity_points else balance + t.profit + realized.append(t) + equity_points.append((ts, balance)) + continue + + # open + vol = normalize_volume(sym, spec["lot"] * lot_scales.get(sid, 1.0)) + if vol <= 0: + rejected += 1 + continue + margin_req = calc_margin(sym, t.side, vol, t.open_price) + used_margin = sum(p.margin for p in open_pos.values()) + free = balance - used_margin + if margin_req > free: + rejected += 1 + continue + new_used = used_margin + margin_req + equity = balance # simplified + ml = (equity / new_used * 100.0) if new_used > 0 else 9999.0 + if ml < min_margin_level_pct: + rejected += 1 + continue + lowest_ml = min(lowest_ml, ml) + open_pos[sid] = OpenPosition(sid, sym, t.side, vol, t.open_price, ts, margin_req) + + if not equity_points: + equity_points = [(start_dt, initial_balance)] + + eq = pd.Series( + [p[1] for p in equity_points], + index=pd.DatetimeIndex([p[0] for p in equity_points]), + ) + combined = build_report( + "portfolio", + "MIXED", + "H1", + period_label, + realized, + eq, + initial_balance, + {"members": [m["spec"]["id"] for m in members], "lot_scales": lot_scales}, + ) + + return PortfolioSimResult( + members=[m["spec"]["id"] for m in members], + lot_scales={m["spec"]["id"]: lot_scales.get(m["spec"]["id"], 1.0) for m in members}, + initial_balance=initial_balance, + net_profit=combined.net_profit, + total_trades=len(realized), + rejected_margin=rejected, + min_margin_level_pct=min_margin_level_pct, + lowest_margin_level_pct=lowest_ml if lowest_ml < 9999 else 0.0, + max_drawdown_pct=combined.max_drawdown_pct, + sharpe=combined.sharpe, + equity_curve=eq, + member_reports=member_reports, + ) + + +def optimize_lot_scales( + members: list[dict], + period_label: str, + start: str, + end: str, + initial_balance: float, + min_margin_level_pct: float, + trials: int, + rng, +) -> PortfolioSimResult: + """Grid-search lot scales down from 1.0 — margin-safe, maximize net.""" + best_scales = {m["spec"]["id"]: 1.0 for m in members} + best = simulate_portfolio( + members, period_label, start, end, initial_balance, best_scales, min_margin_level_pct + ) + best_score = _portfolio_score(best) + + # Coarse: try uniform scale factors + for factor in [1.0, 0.75, 0.5, 0.35, 0.25, 0.15, 0.1]: + scales = {m["spec"]["id"]: factor for m in members} + r = simulate_portfolio(members, period_label, start, end, initial_balance, scales, min_margin_level_pct) + sc = _portfolio_score(r) + if sc > best_score: + best_score = sc + best = r + best_scales = dict(scales) + + # Fine-tune per member around best uniform + for _ in range(trials): + scales = {} + for m in members: + sid = m["spec"]["id"] + base = best_scales.get(sid, 1.0) + scales[sid] = round(max(0.05, min(1.5, base * rng.uniform(0.7, 1.3))), 3) + r = simulate_portfolio(members, period_label, start, end, initial_balance, scales, min_margin_level_pct) + sc = _portfolio_score(r) + if sc > best_score and r.lowest_margin_level_pct >= min_margin_level_pct * 0.9: + best_score = sc + best = r + best_scales = dict(scales) + + best.lot_scales = best_scales + return best + + +def _portfolio_score(r: PortfolioSimResult) -> float: + if r.net_profit <= 0: + return float("-inf") + if r.lowest_margin_level_pct < r.min_margin_level_pct: + return float("-inf") + return r.sharpe * 0.4 + (r.net_profit / 500.0) * 0.4 - r.max_drawdown_pct * 0.15 - r.rejected_margin * 0.001 + + +def build_progressive_margin_portfolio( + ranked: list[dict], + period_label: str, + start: str, + end: str, + initial_balance: float, + min_margin_level_pct: float, + trials_per_step: int, + rng, +) -> list[dict]: + """ranked: [{spec, params, lot, baseline_report}] sorted best-first.""" + steps: list[dict] = [] + members: list[dict] = [] + + for i, r in enumerate(ranked, 1): + members.append({ + "spec": r["spec"], + "params": r["params"], + "lot_scale": 1.0, + }) + baseline = simulate_portfolio( + members, period_label, start, end, initial_balance, + {m["spec"]["id"]: 1.0 for m in members}, min_margin_level_pct, + ) + optimized = optimize_lot_scales( + members, period_label, start, end, initial_balance, + min_margin_level_pct, trials_per_step, rng, + ) + steps.append({ + "step": i, + "members": [m["spec"]["id"] for m in members], + "baseline_net": baseline.net_profit, + "baseline_trades": baseline.total_trades, + "baseline_lowest_margin_pct": baseline.lowest_margin_level_pct, + "optimized_net": optimized.net_profit, + "optimized_trades": optimized.total_trades, + "optimized_sharpe": optimized.sharpe, + "optimized_max_dd_pct": optimized.max_drawdown_pct, + "lowest_margin_level_pct": optimized.lowest_margin_level_pct, + "rejected_margin": optimized.rejected_margin, + "lot_scales": optimized.lot_scales, + "lots_final": { + m["spec"]["id"]: round(m["spec"]["lot"] * optimized.lot_scales.get(m["spec"]["id"], 1.0), 4) + for m in members + }, + }) + return steps diff --git a/backtesting/MT5/cluster_audit/reports/.gitkeep b/backtesting/MT5/cluster_audit/reports/.gitkeep new file mode 100644 index 0000000..dddbeb0 --- /dev/null +++ b/backtesting/MT5/cluster_audit/reports/.gitkeep @@ -0,0 +1 @@ +# Local MT5 audit outputs — see cluster_audit/*.py to regenerate. diff --git a/backtesting/MT5/cluster_audit/run_audit.py b/backtesting/MT5/cluster_audit/run_audit.py new file mode 100644 index 0000000..dd5010c --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_audit.py @@ -0,0 +1,646 @@ +""" + +Full cluster audit: baseline + optimize per strategy per period. + +Outputs JSON report with worst losses and improvement hints. + + + +Usage: + + python -m cluster_audit.run_audit [trials] [--trial-every N] [--quiet] + + + +Examples: + + python -m cluster_audit.run_audit 80 + + python -m cluster_audit.run_audit 120 --trial-every 5 + +""" + + + +from __future__ import annotations + + + +import argparse + +import json + +import random + +import sys + +import time + +from datetime import datetime + +from pathlib import Path + + + +import MetaTrader5 as mt5 + + + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + + + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol + +from cluster_audit.engines import ENGINE_MAP + +from cluster_audit.strategy_registry import PERIODS, STRATEGIES, TF + +from cluster_audit.trace_log import TraceLog + + + +LOG = TraceLog(enabled=True, trial_every=10) + + + + + +def _sample_params(defaults: dict, opt_ranges: dict, rng: random.Random) -> dict: + + p = dict(defaults) + + for key, spec in opt_ranges.items(): + + if not isinstance(spec, tuple) or len(spec) != 3: + + continue + + lo, hi, step = spec + + if isinstance(lo, int): + + vals = list(range(int(lo), int(hi) + 1, int(step))) + + p[key] = rng.choice(vals) if vals else p.get(key, lo) + + else: + + n = int((hi - lo) / step) + 1 + + idx = rng.randint(0, max(n - 1, 0)) + + p[key] = round(lo + idx * step, 4) + + return p + + + + + +from cluster_audit.scoring import DEFAULT_TRADES_PER_DAY, period_days, score_label, score_report +from cluster_audit.strategy_registry import PERIODS + + +def _audit_period_days() -> int: + start, end = PERIODS["2021-2026"] + return period_days(start, end) + + +def _score_label(score: float, trades: int) -> str: + return score_label(score, trades, _audit_period_days(), DEFAULT_TRADES_PER_DAY) + + +def _score(report) -> float: + return score_report(report, _audit_period_days(), DEFAULT_TRADES_PER_DAY) + + + + + +def run_strategy( + + spec: dict, + + period_label: str, + + start: str, + + end: str, + + trials: int, + + rng: random.Random, + + run_idx: int, + + run_total: int, + +) -> dict: + + sid = spec["id"] + + label = f"{sid} @ {period_label} ({run_idx}/{run_total})" + + LOG.phase_start(label) + + + + engine_name = spec["engine"] + + if engine_name not in ENGINE_MAP: + + LOG.error(f"Unknown engine '{engine_name}'") + + return {"id": sid, "period": period_label, "error": f"unknown engine {engine_name}"} + + + + engine = ENGINE_MAP[engine_name] + + tf_key = spec["tf"] + + tf = TF[tf_key] + + + + LOG.debug(f"resolve symbol: requested={spec['symbol']}") + + raw_sym = spec["symbol"] + + sym = resolve_symbol(raw_sym) + + if sym != raw_sym: + + LOG.info(f"symbol mapped {raw_sym} -> {sym}") + + else: + + LOG.debug(f"symbol={sym}") + + + + start_dt = datetime.fromisoformat(start) + + end_dt = datetime.fromisoformat(end) + + LOG.debug(f"load bars: tf={tf_key} from={start} to={end} lot={spec['lot']}") + + + + t_load = time.perf_counter() + + try: + + df = load_bars(sym, tf, start_dt, end_dt) + + except Exception as e: + + LOG.error(f"data load failed: {e}") + + LOG.phase_end(label, "SKIPPED") + + return {"id": sid, "period": period_label, "error": str(e)} + + + + load_ms = (time.perf_counter() - t_load) * 1000 + + LOG.info( + + f"loaded {len(df)} bars in {load_ms:.0f}ms " + + f"({df.index[0]} -> {df.index[-1]})" + + ) + + + + costs = CostModel.for_symbol(sym) + + LOG.debug( + + f"costs: spread={costs.spread_points}pts slippage={costs.slippage_points}pts " + + f"commission/lot={costs.commission_per_lot}" + + ) + + + + defaults = dict(spec["defaults"]) + + opt_keys = list(spec.get("opt", {}).keys()) + + LOG.debug(f"baseline params keys: {list(defaults.keys())}") + + LOG.debug(f"optimize keys ({len(opt_keys)}): {opt_keys}") + + + + LOG.debug("running baseline backtest...") + + t0 = time.perf_counter() + + baseline = engine(df, sym, period_label, sid, defaults, spec["lot"], costs) + + base_ms = (time.perf_counter() - t0) * 1000 + + LOG.info( + + f"baseline done in {base_ms:.0f}ms: net=${baseline.net_profit:.2f} " + + f"sharpe={baseline.sharpe:.2f} trades={baseline.total_trades} " + + f"pf={baseline.profit_factor:.2f} max_dd={baseline.max_drawdown_pct:.1f}%" + + ) + + if baseline.total_trades == 0: + + LOG.warn(f"{sid}: 0 trades on baseline — engine may not match MQL or params too strict") + + + + best = baseline + + best_params = defaults + + best_score = _score(baseline) + + LOG.debug(f"baseline score={_score_label(best_score, baseline.total_trades)}") + + + + if trials > 0: + + LOG.info(f"optimizing: {trials} random trials...") + + for n in range(1, trials + 1): + + params = _sample_params(defaults, spec.get("opt", {}), rng) + + r = engine(df, sym, period_label, sid, params, spec["lot"], costs) + + sc = _score(r) + + improved = sc > best_score + + if improved: + + best_score = sc + + best = r + + best_params = params + + LOG.trial(n, trials, sc, r.net_profit, r.sharpe, improved=True) + + LOG.debug(f" new best params sample: { {k: best_params[k] for k in opt_keys[:6] if k in best_params} }") + + else: + + LOG.trial(n, trials, sc, r.net_profit, r.sharpe, improved=False) + + + + if trials > 0 and best is not baseline: + + LOG.info( + + f"optimized: net +${best.net_profit - baseline.net_profit:.0f} " + + f"sharpe +{best.sharpe - baseline.sharpe:.2f}" + + ) + + elif trials > 0: + + LOG.info("optimization: no better params found (baseline kept)") + + + + loss_reasons: dict[str, float] = {} + + for t in baseline.worst_trades: + + reason = t.get("exit_reason", "?") + + loss_reasons[reason] = loss_reasons.get(reason, 0) + min(t["profit"], 0) + + if loss_reasons: + + top_loss = sorted(loss_reasons.items(), key=lambda x: x[1])[:3] + + LOG.debug(f"baseline loss by exit reason: {top_loss}") + + + + result = { + + "id": sid, + + "engine": engine_name, + + "symbol": sym, + + "timeframe": tf_key, + + "period": period_label, + + "bars": len(df), + + "baseline": baseline.to_dict(), + + "optimized": {**best.to_dict(), "params": best_params}, + + "improvement_net": best.net_profit - baseline.net_profit, + + "improvement_sharpe": best.sharpe - baseline.sharpe, + + "loss_reasons_baseline": loss_reasons, + + } + + + + LOG.report_line(sid, result["baseline"], result["optimized"], len(df)) + + LOG.phase_end(label) + + return result + + + + + +def build_improvement_plan(results: list[dict]) -> dict: + + by_engine: dict[str, list] = {} + + for r in results: + + if "error" in r: + + continue + + by_engine.setdefault(r["engine"], []).append(r) + + + + plan = {"per_engine": {}, "portfolio": []} + + + + engine_notes = { + + "rsi_crossover": "Trend-strong filter closes/blocks too aggressively (ema_slope 105 + distance 165). " + + "Raise thresholds or only block entries, not force-exit. Add pip-based scaling per symbol.", + + "rsi_scalp": "High trade count + rsi_against exits cause death by spread. Widen OB/OS gap, add ADX/session " + + "filter, scale trail by ATR not fixed points. Stocks need .NAS symbols.", + + "rsi_asian": "Narrow session + extreme RSI levels -> few trades or bad fills. Align session to broker server " + + "time; add spread cap in points not pips.", + + "mean_reversion": "ADX proxy weak in Python; large min_ema_distance on BTC blocks entries. " + + "Use true ADX; cap concurrent positions; hard SL when ADX escapes.", + + "ema_slope": "Re-enters on same crossover too often; weekly ADX filter missing in audit. " + + "Add cooldown after loss; separate unit vs trail param sets.", + + "darvas": "Box breakout without volume filter whipsaws. Add volume MA + trend MA filter from MQL.", + + "rsi_secret": "Zone re-entry fires too often in chop. Require divergence or RSI momentum confirm.", + + } + + + + for eng, rows in by_engine.items(): + + sharpes = [x["baseline"]["sharpe"] for x in rows] + + opt_sharpes = [x["optimized"]["sharpe"] for x in rows] + + nets = [x["baseline"]["net_profit"] for x in rows] + + plan["per_engine"][eng] = { + + "count": len(rows), + + "avg_baseline_sharpe": sum(sharpes) / len(sharpes) if sharpes else 0, + + "avg_optimized_sharpe": sum(opt_sharpes) / len(opt_sharpes) if opt_sharpes else 0, + + "avg_baseline_net": sum(nets) / len(nets) if nets else 0, + + "logic_fixes": engine_notes.get(eng, ""), + + "worst_strategies": sorted(rows, key=lambda x: x["baseline"]["sharpe"])[:3], + + } + + + + plan["portfolio"] = [ + + "Run correlation matrix on daily returns — disable highly correlated RSI scalps on same underlying (NVDA x3).", + + "Portfolio-level max daily loss circuit breaker (pause new entries cluster-wide).", + + "Per-asset-class lot caps: forex micro, gold 0.1, stocks margin-scaled not fixed 25 lots.", + + "Split optimization windows: long 2021-2026 for structure, short 2024-2026 for recency; only deploy params that pass both.", + + "Add core/ShockGuard.mqh: ATR spike pause + margin level gate before SE_TickAll.", + + "Enable robots by regime: Asian RSI only 00-08 server; EMA slope only when W1 ADX > threshold.", + + "Replace fixed magic collisions with 401xxx registry; log per-robot PnL for live attribution.", + + ] + + return plan + + + + + +def parse_args() -> argparse.Namespace: + + p = argparse.ArgumentParser(description="SuperEA cluster audit with trace logging") + + p.add_argument("trials", nargs="?", type=int, default=80, help="Random trials per strategy (default 80)") + + p.add_argument("--trial-every", type=int, default=10, help="Log every N trials (default 10)") + + p.add_argument("--quiet", action="store_true", help="Suppress trace output") + + return p.parse_args() + + + + + +def main() -> None: + + args = parse_args() + + global LOG + + LOG = TraceLog(enabled=not args.quiet, trial_every=args.trial_every) + + + + total_runs = len(STRATEGIES) * len(PERIODS) + + LOG.banner( + + f"CLUSTER AUDIT - {len(STRATEGIES)} strategies x {len(PERIODS)} periods " + + f"= {total_runs} runs, {args.trials} trials each" + + ) + + + + LOG.phase_start("MT5 initialize") + + if not mt5.initialize(): + + LOG.error(f"MT5 init failed: {mt5.last_error()}") + + raise SystemExit(1) + + acc = mt5.account_info() + + if acc: + + LOG.info(f"MT5 connected: server={acc.server} (account redacted)") + + LOG.phase_end("MT5 initialize") + + + + out_dir = Path(__file__).parent / "reports" + + out_dir.mkdir(exist_ok=True) + + rng = random.Random(42) + + all_results = [] + + run_idx = 0 + + errors = 0 + + + + try: + + for period_label, (start, end) in PERIODS.items(): + + LOG.banner(f"PERIOD {period_label} ({start} -> {end})") + + for spec in STRATEGIES: + + run_idx += 1 + + LOG.progress(run_idx, total_runs, f"next: {spec['id']}") + + r = run_strategy(spec, period_label, start, end, args.trials, rng, run_idx, total_runs) + + all_results.append(r) + + if "error" in r: + + errors += 1 + + + + LOG.phase_start("build improvement plan") + + plan = build_improvement_plan(all_results) + + LOG.phase_end("build improvement plan") + + + + report = { + + "generated": datetime.now().isoformat(), + + "trials_per_strategy": args.trials, + + "strategies": len(STRATEGIES), + + "periods": list(PERIODS.keys()), + + "runs_total": total_runs, + + "runs_failed": errors, + + "results": all_results, + + "improvement_plan": plan, + + } + + out_path = out_dir / "cluster_audit_report.json" + + out_path.write_text(json.dumps(report, indent=2), encoding="utf-8") + + LOG.info(f"report written: {out_path} ({out_path.stat().st_size // 1024} KB)") + + + + LOG.banner("SUMMARY - worst baseline Sharpe (2021-2026)") + + r21 = [x for x in all_results if x.get("period") == "2021-2026" and "error" not in x] + + for x in sorted(r21, key=lambda z: z["baseline"]["sharpe"])[:10]: + + b = x["baseline"] + + w = b["worst_trades"][:1] + + wtxt = f"${w[0]['profit']:.0f} {w[0]['exit_reason']}" if w else "n/a" + + LOG.info( + + f" {x['id']:28} sharpe={b['sharpe']:6.2f} net=${b['net_profit']:9.0f} " + + f"trades={b['total_trades']:4} worst={wtxt}" + + ) + + + + if errors: + + LOG.warn(f"{errors}/{total_runs} runs failed - search report for \"error\" fields") + LOG.banner(f"DONE - {run_idx} runs in {LOG._elapsed()}") + + finally: + + LOG.phase_start("MT5 shutdown") + + mt5.shutdown() + + LOG.phase_end("MT5 shutdown") + + + + + +if __name__ == "__main__": + + main() + + diff --git a/backtesting/MT5/cluster_audit/run_close_signal_audit.py b/backtesting/MT5/cluster_audit/run_close_signal_audit.py new file mode 100644 index 0000000..775a3ef --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_close_signal_audit.py @@ -0,0 +1,277 @@ +#!/usr/bin/env python3 +""" +United EA MT5 audit: per-strategy solo runs, close-unprofitable A/B, lot/margin check. + +Usage: + python -m cluster_audit.run_close_signal_audit + python -m cluster_audit.run_close_signal_audit --only DB + python -m cluster_audit.run_close_signal_audit --from RS_NVDA --combo +""" + +from __future__ import annotations + +import argparse +import json +import sys +from datetime import datetime +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from set_parser import parse_set_file + +from cluster_audit.united_mt5_manifest import ( + ALL_ENABLE_KEYS, + PARAM_TWEAKS, + PRODUCTION_IDS, + UNITED_MT5_STRATEGIES, +) +from cluster_audit.united_mt5_runner import ( + BASE_SET, + deploy_united, + mt5_context, + patch_set, + run_backtest, +) + +OUT = Path(__file__).parent / "reports" / "close_signal_audit" +LOT_SUMMARY = Path(__file__).parent / "reports" / "lot_genetic" / "lot_genetic_summary.json" +REF_BALANCE = 3000.0 + + +def load_best_lots() -> dict[str, float]: + if not LOT_SUMMARY.exists(): + return {} + data = json.loads(LOT_SUMMARY.read_text(encoding="utf-8")) + return {k: float(v) for k, v in data.get("best_lots", {}).items()} + + +def solo_patches(spec: dict, *, close_on: bool, lots: dict[str, float]) -> dict: + ov = solo_overrides(spec, close_on=close_on) + ov["ORCH_ReferenceBalance"] = REF_BALANCE + ov["ORCH_ScaleLotsByBalance"] = True + if spec.get("lot") in lots: + ov[spec["lot"]] = lots[spec["lot"]] + return ov + + +def solo_overrides(target: dict, *, close_on: bool) -> dict[str, bool]: + o: dict[str, bool] = {k: False for k in ALL_ENABLE_KEYS} + o[target["enable"]] = True + o[target["close"]] = close_on + o["GAP_Enable"] = False + o["OPT_GuardOptimizationMode"] = True + return o + + +def audit_one(ctx: dict, spec: dict, base_params: dict, lots: dict[str, float]) -> dict: + sid = spec["id"] + print(f"\n{'='*60}\n[{sid}] {spec['name']}\n{'='*60}", flush=True) + + off_ov = solo_patches(spec, close_on=False, lots=lots) + on_ov = solo_patches(spec, close_on=True, lots=lots) + + off_body = patch_set(BASE_SET, off_ov) + on_body = patch_set(BASE_SET, on_ov) + ts = spec.get("test_symbol") + + off = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + off_body, f"solo_{sid}_off.set", f"solo_{sid}_off", + test_symbol=ts, + ) + print(f" OFF PF={off.get('profit_factor')} net={off.get('net_profit')} " + f"trades={off.get('total_trades')} sharpe={off.get('sharpe')} " + f"ready={off.get('ready')} ({off.get('elapsed_sec')}s)", flush=True) + + on = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + on_body, f"solo_{sid}_on.set", f"solo_{sid}_on", + test_symbol=ts, + ) + print(f" ON PF={on.get('profit_factor')} net={on.get('net_profit')} " + f"trades={on.get('total_trades')} sharpe={on.get('sharpe')} " + f"ready={on.get('ready')} ({on.get('elapsed_sec')}s)", flush=True) + + d = delta_metrics(off, on) + v = verdict(d, off, on) + print(f" -> {v} dNet={d['net_profit_delta']:.0f} dSharpe={d['sharpe_delta']:.3f} " + f"dTrades={d['trades_delta']}", flush=True) + + tweaks: list[dict] = [] + if v == "POSITIVE" and sid in PARAM_TWEAKS: + for i, tw in enumerate(PARAM_TWEAKS[sid], 1): + ov = {**on_ov, **tw} + body = patch_set(BASE_SET, ov) + r = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + body, f"solo_{sid}_tw{i}.set", f"solo_{sid}_tw{i}", + test_symbol=ts, + ) + tweaks.append({"tweak": tw, "metrics": r}) + print(f" tweak{i} net={r.get('net_profit')} sharpe={r.get('sharpe')} " + f"trades={r.get('total_trades')}", flush=True) + + lot_key = spec["lot"] + lot_val = lots.get(lot_key) + if lot_val is None and lot_key in base_params: + lot_val = base_params[lot_key].value + + return { + "id": sid, + "name": spec["name"], + "enable": spec["enable"], + "close_key": spec["close"], + "lot_key": lot_key, + "lot_value": lot_val, + "close_off": off, + "close_on": on, + "delta": d, + "verdict": v, + "margin_ok_off": margin_ok(off), + "margin_ok_on": margin_ok(on), + "param_tweaks": tweaks, + "recommend_close_on": v == "POSITIVE", + } + + +def delta_metrics(off: dict, on: dict) -> dict: + def g(d, k): + v = d.get(k) + return v if v is not None else 0 + + return { + "net_profit_delta": g(on, "net_profit") - g(off, "net_profit"), + "pf_delta": (g(on, "profit_factor") - g(off, "profit_factor")), + "sharpe_delta": g(on, "sharpe") - g(off, "sharpe"), + "trades_delta": g(on, "total_trades") - g(off, "total_trades"), + } + + +def verdict(delta: dict, off: dict, on: dict) -> str: + if not off.get("ready") or not on.get("ready"): + return "BROKEN" + if off.get("total_trades", 0) == 0 and on.get("total_trades", 0) == 0: + return "NO_TRADES" + if delta["net_profit_delta"] > 50 and delta["sharpe_delta"] >= 0: + return "POSITIVE" + if delta["net_profit_delta"] < -50 or delta["sharpe_delta"] < -0.1: + return "NEGATIVE" + return "NEUTRAL" + + +def margin_ok(m: dict) -> bool: + ml = m.get("min_margin_level") + if not ml: + return True + if isinstance(ml, str) and "%" in ml: + try: + return float(ml.replace("%", "").strip()) >= 100.0 + except ValueError: + return True + return True + + +def run_combo(ctx: dict, winners: list[dict], base_params: dict) -> dict: + """Combo: enable all strategies that benefit from close-on, with flag set.""" + overrides: dict = {k: False for k in ALL_ENABLE_KEYS} + overrides["GAP_Enable"] = False + for w in winners: + overrides[w["enable"]] = True + overrides[w["close_key"]] = True + for spec in UNITED_MT5_STRATEGIES: + if spec["enable"] not in overrides or not overrides[spec["enable"]]: + continue + if spec["id"] not in {w["id"] for w in winners}: + overrides[spec["close_key"]] = False + + body = patch_set(BASE_SET, overrides) + m = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + body, "combo_close_winners.set", "combo_close_winners", + ) + return {"members": [w["id"] for w in winners], "metrics": m} + + +def main() -> int: + p = argparse.ArgumentParser() + p.add_argument("--only", default=None) + p.add_argument("--from", dest="from_id", default=None) + p.add_argument("--production", action="store_true", help="Only PRODUCTION_IDS (19 strategies)") + p.add_argument("--combo", action="store_true") + p.add_argument("--enabled-only", action="store_true", help="Only strategies enabled in 123.set") + args = p.parse_args() + + OUT.mkdir(parents=True, exist_ok=True) + base_params = parse_set_file(BASE_SET) + lots = load_best_lots() + sm = {s["id"]: s for s in UNITED_MT5_STRATEGIES} + + if args.production: + strategies = [sm[sid] for sid in PRODUCTION_IDS if sid in sm] + elif args.enabled_only: + strategies = [ + s for s in UNITED_MT5_STRATEGIES + if base_params.get(s["enable"], type("x", (), {"value": False})).value + ] + else: + strategies = list(UNITED_MT5_STRATEGIES) + + if args.only: + strategies = [s for s in strategies if s["id"] == args.only] + elif args.from_id: + found = False + filtered = [] + for s in strategies: + if s["id"] == args.from_id: + found = True + if found: + filtered.append(s) + strategies = filtered if found else strategies + + print(f"United EA close-signal audit | {len(strategies)} strategies | lots={len(lots)}") + import cluster_audit.united_mt5_runner as runner + runner.DEPOSIT = int(REF_BALANCE) + ctx = mt5_context() + print(f"MT5 server={ctx['server']} (account from local terminal)") + deploy_united(ctx["data"], ctx["mt5_path"]) + print("Compiled main.ex5 OK") + + results: list[dict] = [] + for spec in strategies: + try: + results.append(audit_one(ctx, spec, base_params, lots)) + except Exception as ex: + print(f" ERROR {spec['id']}: {ex}", flush=True) + results.append({"id": spec["id"], "error": str(ex), "verdict": "ERROR"}) + + positive = [r for r in results if r.get("verdict") == "POSITIVE"] + negative = [r for r in results if r.get("verdict") == "NEGATIVE"] + broken = [r for r in results if r.get("verdict") in ("BROKEN", "NO_TRADES", "ERROR")] + + combo_result = None + if args.combo and positive: + combo_result = run_combo(ctx, positive, base_params) + print(f"\nCOMBO winners ({len(positive)}): net={combo_result['metrics'].get('net_profit')} " + f"sharpe={combo_result['metrics'].get('sharpe')}") + + summary = { + "generated": datetime.now().isoformat(), + "base_set": str(BASE_SET), + "positive_close_on": [r["id"] for r in positive], + "negative_close_on": [r["id"] for r in negative], + "broken": [r["id"] for r in broken], + "results": results, + "combo": combo_result, + } + out_path = OUT / "summary.json" + out_path.write_text(json.dumps(summary, indent=2, default=str), encoding="utf-8") + print(f"\nSaved {out_path}") + print(f"POSITIVE ({len(positive)}): {[r['id'] for r in positive]}") + print(f"NEGATIVE ({len(negative)}): {[r['id'] for r in negative]}") + print(f"BROKEN ({len(broken)}): {[r['id'] for r in broken]}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/backtesting/MT5/cluster_audit/run_disabled_audit.py b/backtesting/MT5/cluster_audit/run_disabled_audit.py new file mode 100644 index 0000000..db8c428 --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_disabled_audit.py @@ -0,0 +1,198 @@ +#!/usr/bin/env python3 +""" +Solo MT5 audit for all currently-disabled sub-strategies (main.mq5 enable=false). + +Finds profitable passers to add to the cluster; compares enhanced portfolio vs production baseline. + +Usage: + python -m cluster_audit.run_disabled_audit + python -m cluster_audit.run_disabled_audit --min-trades 40 +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +from datetime import datetime +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.united_mt5_manifest import ( + ALL_ENABLE_KEYS, + HIGH_MARGIN_STOCK_ENABLES, + PRODUCTION_IDS, + UNITED_MT5_STRATEGIES, +) +from cluster_audit.united_mt5_runner import ( + BASE_SET, + CLUSTER, + FROM_DATE, + TO_DATE, + deploy_united, + mt5_context, + patch_set, + run_backtest, +) + +OUT = Path(__file__).resolve().parent / "reports" / "disabled_audit" +REF_BALANCE = 3000.0 + + +def g(m: dict, k: str) -> float: + v = m.get(k) + return float(v) if v is not None else 0.0 + + +def parse_dd_pct(dd: str | None) -> float | None: + if not dd: + return None + m = re.search(r"([\d.]+)\s*%", dd.replace(",", "")) + return float(m.group(1)) if m else None + + +def disabled_ids_from_mq5() -> list[str]: + text = (CLUSTER / "main.mq5").read_text(encoding="utf-8") + off: set[str] = set() + for m in re.finditer(r"input bool (Enable\w+) = false", text): + off.add(m.group(1)) + for key in HIGH_MARGIN_STOCK_ENABLES: + off.discard(key) + ids: list[str] = [] + for s in UNITED_MT5_STRATEGIES: + if s["enable"] in off: + ids.append(s["id"]) + return ids + + +def common_patches() -> dict[str, float | bool]: + return { + "ORCH_ReferenceBalance": REF_BALANCE, + "ORCH_ScaleLotsByBalance": True, + "GAP_Enable": False, + "OPT_GuardOptimizationMode": True, + } + + +def production_enables() -> dict[str, bool]: + prod = set(PRODUCTION_IDS) + o: dict[str, bool] = {} + for s in UNITED_MT5_STRATEGIES: + o[s["enable"]] = s["id"] in prod + for key in HIGH_MARGIN_STOCK_ENABLES: + o[key] = False + return o + + +def solo_overrides(spec: dict) -> dict[str, bool]: + o: dict[str, bool] = {k: False for k in ALL_ENABLE_KEYS} + o[spec["enable"]] = True + return o + + +def classify(m: dict, min_trades: int) -> str: + if not m.get("ready"): + return "BROKEN" + trades = int(m.get("total_trades") or 0) + if trades < min_trades: + return "LOW_TRADES" + if g(m, "net_profit") > 0 and g(m, "profit_factor") >= 1.05: + return "PASS" + if g(m, "net_profit") > 50 and g(m, "profit_factor") >= 1.0: + return "MARGINAL" + return "FAIL" + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("--from", dest="from_date", default=FROM_DATE) + p.add_argument("--to", dest="to_date", default=TO_DATE) + p.add_argument("--min-trades", type=int, default=60) + args = p.parse_args() + + import cluster_audit.united_mt5_runner as runner + + runner.FROM_DATE = args.from_date.replace("-", ".") + runner.TO_DATE = args.to_date.replace("-", ".") + runner.DEPOSIT = int(REF_BALANCE) + + sm = {s["id"]: s for s in UNITED_MT5_STRATEGIES} + disabled = disabled_ids_from_mq5() + OUT.mkdir(parents=True, exist_ok=True) + + ctx = mt5_context() + deploy_united(ctx["data"], ctx["mt5_path"]) + + print( + f"Disabled audit n={len(disabled)} production={PRODUCTION_IDS} " + f"{runner.FROM_DATE}->{runner.TO_DATE}", + flush=True, + ) + + prod_ov = {**common_patches(), **production_enables()} + baseline = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, prod_ov), "dis_prod_baseline.set", "dis_prod_baseline", + ) + print( + f"PROD baseline PF={baseline.get('profit_factor')} net={baseline.get('net_profit')} " + f"sharpe={baseline.get('sharpe')} dd={baseline.get('max_drawdown')}", + flush=True, + ) + + solo_rows: list[dict] = [] + passed_ids: list[str] = [] + + for sid in disabled: + spec = sm[sid] + m = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, {**common_patches(), **solo_overrides(spec)}), + f"dis_solo_{sid}.set", f"dis_solo_{sid}", + test_symbol=spec.get("test_symbol"), + ) + verdict = classify(m, args.min_trades) + dd_pct = parse_dd_pct(m.get("max_drawdown")) + print( + f" {sid:12} {verdict:10} PF={m.get('profit_factor')} net={m.get('net_profit')} " + f"sharpe={m.get('sharpe')} trades={m.get('total_trades')} dd={m.get('max_drawdown')}", + flush=True, + ) + row = {"id": sid, "enable": spec["enable"], "verdict": verdict, "dd_pct": dd_pct, "metrics": m} + solo_rows.append(row) + if verdict in ("PASS", "MARGINAL"): + passed_ids.append(sid) + + enhanced_ov = dict(prod_ov) + for sid in passed_ids: + enhanced_ov[sm[sid]["enable"]] = True + enhanced = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, enhanced_ov), "dis_enhanced.set", "dis_enhanced", + ) + print( + f"ENHANCED +{len(passed_ids)} PF={enhanced.get('profit_factor')} net={enhanced.get('net_profit')} " + f"sharpe={enhanced.get('sharpe')} dd={enhanced.get('max_drawdown')}", + flush=True, + ) + print(f"PASS/MARGINAL: {passed_ids}", flush=True) + + summary = { + "timestamp": datetime.now().isoformat(timespec="seconds"), + "period": {"from": runner.FROM_DATE, "to": runner.TO_DATE}, + "min_trades": args.min_trades, + "disabled_ids": disabled, + "production_baseline": baseline, + "solo": solo_rows, + "passed_ids": passed_ids, + "enhanced": enhanced, + } + path = OUT / "disabled_audit_summary.json" + path.write_text(json.dumps(summary, indent=2), encoding="utf-8") + print(f"Saved {path}", flush=True) + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/run_hedge_audit.py b/backtesting/MT5/cluster_audit/run_hedge_audit.py new file mode 100644 index 0000000..9698ce4 --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_hedge_audit.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python3 +""" +Symbol mining audit for cluster-latest (round 2 = indices, round 3 = low-margin stocks). + +Baseline = 123.set + survivors only; solo each candidate round; enhanced = baseline + passers. + +Usage: + python -m cluster_audit.run_hedge_audit --round 2 + python -m cluster_audit.run_hedge_audit --round 3 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from datetime import datetime +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.united_mt5_manifest import ( + ALL_ENABLE_KEYS, + EXPANSION_RETIRED_IDS, + HIGH_MARGIN_STOCK_ENABLES, + ROUND2_IDS, + ROUND3_IDS, + SURVIVOR_IDS, + UNITED_MT5_STRATEGIES, +) +from cluster_audit.united_mt5_runner import ( + BASE_SET, + FROM_DATE, + TO_DATE, + deploy_united, + mt5_context, + patch_set, + run_backtest, +) + +OUT = Path(__file__).resolve().parent / "reports" / "hedge_audit" + +MIN_TRADES_DEFAULT = 60 + +ROUND_CONFIG = { + 2: {"candidate_ids": ROUND2_IDS, "prefix": "r2"}, + 3: {"candidate_ids": ROUND3_IDS, "prefix": "r3"}, +} + + +def g(m: dict, k: str) -> float: + v = m.get(k) + return float(v) if v is not None else 0.0 + + +def spec_map() -> dict[str, dict]: + return {s["id"]: s for s in UNITED_MT5_STRATEGIES} + + +def candidate_ids_for_round(round_num: int) -> tuple[str, ...]: + return ROUND_CONFIG[round_num]["candidate_ids"] + + +def baseline_overrides(round_num: int) -> dict[str, bool]: + o: dict[str, bool] = {} + retired = set(EXPANSION_RETIRED_IDS) + survivors = set(SURVIVOR_IDS) + candidates = set(candidate_ids_for_round(round_num)) + all_candidates = set(ROUND2_IDS) | set(ROUND3_IDS) + + for s in UNITED_MT5_STRATEGIES: + sid = s["id"] + if sid in retired: + o[s["enable"]] = False + elif sid in survivors: + o[s["enable"]] = True + elif sid in all_candidates and sid not in candidates: + o[s["enable"]] = False + elif sid in candidates: + o[s["enable"]] = False + + for key in HIGH_MARGIN_STOCK_ENABLES: + o[key] = False + + o["GAP_Enable"] = False + o["OPT_GuardOptimizationMode"] = True + return o + + +def solo_overrides(spec: dict) -> dict: + o: dict[str, bool] = {k: False for k in ALL_ENABLE_KEYS} + o[spec["enable"]] = True + for key in HIGH_MARGIN_STOCK_ENABLES: + o[key] = False + o["GAP_Enable"] = False + o["OPT_GuardOptimizationMode"] = True + return o + + +def classify_solo(m: dict, min_trades: int) -> str: + if not m.get("ready"): + return "BROKEN" + trades = int(m.get("total_trades", 0) or 0) + if trades < min_trades: + return "LOW_TRADES" + if g(m, "net_profit") > 0 and g(m, "profit_factor") >= 1.05: + return "PASS" + if g(m, "net_profit") > 50 and g(m, "profit_factor") >= 1.0: + return "MARGINAL" + return "FAIL" + + +def delta(base: dict, var: dict) -> dict: + return { + "net_profit_delta": g(var, "net_profit") - g(base, "net_profit"), + "sharpe_delta": g(var, "sharpe") - g(base, "sharpe"), + "pf_delta": g(var, "profit_factor") - g(base, "profit_factor"), + "trades_delta": int(g(var, "total_trades") - g(base, "total_trades")), + } + + +def portfolio_verdict(d: dict) -> str: + if d["net_profit_delta"] > 100 and d["sharpe_delta"] >= -0.05: + return "IMPROVED" + if d["net_profit_delta"] < -150 or d["sharpe_delta"] < -0.15: + return "WORSE" + return "NEUTRAL" + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("--from", dest="from_date", default=FROM_DATE) + p.add_argument("--to", dest="to_date", default=TO_DATE) + p.add_argument("--min-trades", type=int, default=MIN_TRADES_DEFAULT) + p.add_argument("--round", type=int, default=3, choices=(2, 3)) + args = p.parse_args() + + import cluster_audit.united_mt5_runner as runner + + runner.FROM_DATE = args.from_date.replace("-", ".") + runner.TO_DATE = args.to_date.replace("-", ".") + + cfg = ROUND_CONFIG[args.round] + prefix = cfg["prefix"] + candidates = cfg["candidate_ids"] + + OUT.mkdir(parents=True, exist_ok=True) + ctx = mt5_context() + deploy_united(ctx["data"], ctx["mt5_path"]) + + sm = spec_map() + print( + f"Round {args.round} {runner.FROM_DATE}->{runner.TO_DATE} " + f"min_trades={args.min_trades} survivor={SURVIVOR_IDS} " + f"candidates={candidates}", + flush=True, + ) + + baseline = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, baseline_overrides(args.round)), + f"{prefix}_baseline.set", f"{prefix}_baseline", + ) + print( + f"BASELINE PF={baseline.get('profit_factor')} net={baseline.get('net_profit')} " + f"sharpe={baseline.get('sharpe')} trades={baseline.get('total_trades')}", + flush=True, + ) + + solo_results: list[dict] = [] + passed: list[str] = [] + + for sid in candidates: + spec = sm[sid] + m = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, solo_overrides(spec)), + f"{prefix}_solo_{sid}.set", f"{prefix}_solo_{sid}", + test_symbol=spec.get("test_symbol"), + ) + verdict = classify_solo(m, args.min_trades) + print( + f"SOLO {sid:10} {verdict:10} PF={m.get('profit_factor')} net={m.get('net_profit')} " + f"sharpe={m.get('sharpe')} trades={m.get('total_trades')}", + flush=True, + ) + solo_results.append({"id": sid, "verdict": verdict, "metrics": m}) + if verdict in ("PASS", "MARGINAL"): + passed.append(spec["enable"]) + + enhanced_ov = baseline_overrides(args.round) + for sid in candidates: + spec = sm[sid] + if spec["enable"] in passed: + enhanced_ov[spec["enable"]] = True + + enhanced = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, enhanced_ov), + f"{prefix}_enhanced.set", f"{prefix}_enhanced", + ) + d = delta(baseline, enhanced) + pv = portfolio_verdict(d) + print( + f"ENHANCED {pv} PF={enhanced.get('profit_factor')} net={enhanced.get('net_profit')} " + f"sharpe={enhanced.get('sharpe')} trades={enhanced.get('total_trades')} " + f"dNet={d['net_profit_delta']:.0f} dSharpe={d['sharpe_delta']:.3f}", + flush=True, + ) + print(f"PASSED ({len(passed)}): {', '.join(passed)}", flush=True) + + summary = { + "timestamp": datetime.now().isoformat(timespec="seconds"), + "round": args.round, + "survivors": list(SURVIVOR_IDS), + "candidates": list(candidates), + "high_margin_disabled": list(HIGH_MARGIN_STOCK_ENABLES), + "period": {"from": runner.FROM_DATE, "to": runner.TO_DATE}, + "min_trades": args.min_trades, + "baseline": baseline, + "solo": solo_results, + "passed_enables": passed, + "enhanced": enhanced, + "delta": d, + "portfolio_verdict": pv, + } + out_path = OUT / f"round{args.round}_audit_summary.json" + out_path.write_text(json.dumps(summary, indent=2), encoding="utf-8") + print(f"Saved {out_path}", flush=True) + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/run_lot_genetic.py b/backtesting/MT5/cluster_audit/run_lot_genetic.py new file mode 100644 index 0000000..095de1a --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_lot_genetic.py @@ -0,0 +1,322 @@ +#!/usr/bin/env python3 +""" +MT5 genetic lot optimization — one production sub-strategy at a time. + +Ranges: + stock → 5..15 step 5 + other → 0.01..0.1 step 0.01 + +Usage: + python -m cluster_audit.run_lot_genetic + python -m cluster_audit.run_lot_genetic --only RS_NVDA + python -m cluster_audit.run_lot_genetic --apply + python -m cluster_audit.run_lot_genetic --resume # skip ids already in summary +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +import time +from datetime import datetime +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.united_mt5_manifest import ( + ALL_ENABLE_KEYS, + HIGH_MARGIN_STOCK_ENABLES, + LOT_CLASS_BY_ID, + LOT_GENETIC_RANGE, + PRODUCTION_IDS, + UNITED_MT5_STRATEGIES, +) +from cluster_audit.united_mt5_runner import ( + BASE_SET, + CLUSTER, + DEPOSIT, + FROM_DATE, + TO_DATE, + deploy_united, + mt5_context, + patch_set, + patch_set_for_lot_genetic, + run_backtest, + run_genetic_lot_optimize, +) + +OUT = Path(__file__).resolve().parent / "reports" / "lot_genetic" +REF_BALANCE = 3000.0 +SUMMARY_PATH = OUT / "lot_genetic_summary.json" + + +def lot_class(sid: str) -> str: + return LOT_CLASS_BY_ID.get(sid, "forex") + + +def genetic_range(sid: str) -> tuple[float, float, float]: + if lot_class(sid) == "stock": + return LOT_GENETIC_RANGE["stock"] + return LOT_GENETIC_RANGE["default"] + + +def common_patches() -> dict[str, float | bool]: + o: dict[str, float | bool] = { + "ORCH_ReferenceBalance": REF_BALANCE, + "ORCH_ScaleLotsByBalance": True, + "GAP_Enable": False, + "OPT_GuardOptimizationMode": True, + } + for key in HIGH_MARGIN_STOCK_ENABLES: + o[key] = False + return o + + +def solo_overrides(spec: dict) -> dict[str, bool]: + o: dict[str, bool] = {k: False for k in ALL_ENABLE_KEYS} + o[spec["enable"]] = True + return o + + +def apply_lots_to_mq5(text: str, lots: dict[str, float]) -> str: + for key, val in lots.items(): + sval = str(int(val)) if val == int(val) else str(val) + text, _ = re.subn( + rf"(input double {re.escape(key)} = )[0-9.]+;", + rf"\g<1>{sval};", + text, + count=1, + ) + text, _ = re.subn( + r"(input double ORCH_ReferenceBalance = )[0-9.]+;", + rf"\g<1>{REF_BALANCE};", + text, + count=1, + ) + return text + + +def apply_lots_to_set_text(text: str, lots: dict[str, float]) -> str: + lines_out: list[str] = [] + for line in text.splitlines(): + if "=" not in line or line.strip().startswith(";"): + lines_out.append(line) + continue + key = line.split("=", 1)[0].strip() + if key in lots: + val = lots[key] + sval = str(int(val)) if val == int(val) else str(val) + if "||" in line: + parts = line.split("||") + parts[0] = f"{key}={sval}" + lines_out.append("||".join(parts)) + else: + lines_out.append(f"{key}={sval}") + else: + lines_out.append(line) + return "\n".join(lines_out) + "\n" + + +def load_summary() -> dict: + if SUMMARY_PATH.exists(): + return json.loads(SUMMARY_PATH.read_text(encoding="utf-8")) + return {"results": [], "best_lots": {}} + + +def save_summary(summary: dict) -> None: + OUT.mkdir(parents=True, exist_ok=True) + SUMMARY_PATH.write_text(json.dumps(summary, indent=2), encoding="utf-8") + + +def run_backtest_with_retry( + ctx: dict, + set_body: str, + set_name: str, + report: str, + *, + test_symbol: str | None = None, + retries: int = 3, +) -> dict: + last: dict = {"ready": False} + for attempt in range(retries): + if attempt: + time.sleep(12) + last = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + set_body, set_name, report, test_symbol=test_symbol, + ) + if last.get("ready"): + return last + return last + + +def lot_report_tag(lot: float) -> str: + return str(int(lot)) if lot == int(lot) else str(lot).replace(".", "p") + + +def optimize_one(ctx: dict, spec: dict, *, opt_mode: int, grid_only: bool) -> dict: + sid = spec["id"] + lot_key = spec["lot"] + start, step, stop = genetic_range(sid) + ov = {**common_patches(), **solo_overrides(spec)} + report = f"lotgen_{sid}" + + print( + f"\n[{sid}] lot sweep {lot_key} range={start}..{stop} step={step} " + f"symbol={spec.get('test_symbol') or 'NAS100'}", + flush=True, + ) + + if not grid_only: + body = patch_set_for_lot_genetic(BASE_SET, ov, lot_key, start, step, stop) + m = run_genetic_lot_optimize( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + body, f"{report}.set", report, lot_key, + test_symbol=spec.get("test_symbol"), + optimization=opt_mode, + ) + best_lot = m.get("best_lot") + if m.get("ready") and best_lot is not None: + print( + f" BEST lot={best_lot} PF={m.get('profit_factor')} net={m.get('profit')} " + f"sharpe={m.get('sharpe')} trades={m.get('trades')} passes={m.get('passes')} " + f"({m.get('elapsed_sec')}s)", + flush=True, + ) + return { + "id": sid, + "lot_key": lot_key, + "lot_class": lot_class(sid), + "range": {"start": start, "step": step, "stop": stop}, + "best_lot": best_lot, + "metrics": m, + } + print(f" genetic XML miss ({m.get('error')}) — grid sweep", flush=True) + + from cluster_audit.united_mt5_manifest import LOT_GRIDS + + grid = LOT_GRIDS["stock"] if lot_class(sid) == "stock" else LOT_GRIDS["forex"] + best_sc, best_lot, best_m = -1e18, grid[0], {} + t0 = time.time() + for lot in grid: + tag = lot_report_tag(lot) + ov2 = {**ov, lot_key: lot} + bm = run_backtest_with_retry( + ctx, + patch_set(BASE_SET, ov2), f"lot_{sid}_{tag}.set", f"lot_{sid}_{tag}", + test_symbol=spec.get("test_symbol"), + ) + if not bm.get("ready"): + print(f" lot={lot} FAILED (no report)", flush=True) + continue + trades = int(bm.get("total_trades") or 0) + profit = float(bm.get("net_profit") or 0) + pf = float(bm.get("profit_factor") or 0) + sharpe = float(bm.get("sharpe") or 0) + if trades < 20 or pf < 1.0 or profit <= 0: + sc = -1e10 + profit + else: + sc = sharpe * 2000 + profit / 500 + pf * 50 + print( + f" lot={lot} PF={pf} net={profit} sharpe={sharpe} trades={trades}", + flush=True, + ) + if sc > best_sc: + best_sc, best_lot, best_m = sc, lot, bm + elapsed = round(time.time() - t0, 1) + best_m = {**best_m, "best_lot": best_lot, "method": "grid", "elapsed_sec": elapsed} + print( + f" BEST lot={best_lot} PF={best_m.get('profit_factor')} net={best_m.get('net_profit')} " + f"sharpe={best_m.get('sharpe')} trades={best_m.get('total_trades')} ({elapsed}s)", + flush=True, + ) + return { + "id": sid, + "lot_key": lot_key, + "lot_class": lot_class(sid), + "range": {"start": start, "step": step, "stop": stop}, + "best_lot": best_lot, + "metrics": best_m, + } + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("--from", dest="from_date", default=FROM_DATE) + p.add_argument("--to", dest="to_date", default=TO_DATE) + p.add_argument("--only", action="append", default=[]) + p.add_argument("--apply", action="store_true") + p.add_argument("--resume", action="store_true", help="Skip strategies already in summary") + p.add_argument("--redo", action="append", default=[], help="Re-run these ids even if in summary") + p.add_argument("--mode", choices=("genetic", "complete", "grid"), default="grid", + help="grid=direct lot sweep (default); genetic=try MT5 genetic first") + args = p.parse_args() + + import cluster_audit.united_mt5_runner as runner + + runner.FROM_DATE = args.from_date.replace("-", ".") + runner.TO_DATE = args.to_date.replace("-", ".") + runner.DEPOSIT = int(REF_BALANCE) + + opt_mode = 2 if args.mode == "genetic" else 1 + grid_only = args.mode == "grid" + ids = args.only if args.only else list(PRODUCTION_IDS) + sm = {s["id"]: s for s in UNITED_MT5_STRATEGIES} + + summary = load_summary() if args.resume else {"results": [], "best_lots": {}} + done_ids = set() + if args.resume: + for r in summary.get("results", []): + m = r.get("metrics") or {} + if m.get("ready") and r["id"] not in args.redo: + done_ids.add(r["id"]) + + ctx = mt5_context() + deploy_united(ctx["data"], ctx["mt5_path"]) + + print( + f"Lot genetic deposit={DEPOSIT} ref={REF_BALANCE} " + f"{runner.FROM_DATE}->{runner.TO_DATE} mode={args.mode} n={len(ids)}", + flush=True, + ) + + for sid in ids: + if sid not in sm: + print(f"skip unknown {sid}", flush=True) + continue + if sid in done_ids and sid not in args.redo: + print(f"skip done {sid}", flush=True) + continue + r = optimize_one(ctx, sm[sid], opt_mode=opt_mode, grid_only=grid_only) + summary["results"] = [x for x in summary.get("results", []) if x["id"] != sid] + [r] + summary["best_lots"][r["lot_key"]] = r["best_lot"] + summary["timestamp"] = datetime.now().isoformat(timespec="seconds") + summary["period"] = {"from": runner.FROM_DATE, "to": runner.TO_DATE} + save_summary(summary) + + print(f"\nSaved {SUMMARY_PATH}", flush=True) + for r in summary["results"]: + print( + f" {r['id']:12} {r['lot_key']}={r['best_lot']} " + f"PF={r['metrics'].get('profit_factor')} sharpe={r['metrics'].get('sharpe')}", + flush=True, + ) + + if args.apply and summary.get("best_lots"): + mq5_path = CLUSTER / "main.mq5" + set_path = CLUSTER / "123.set" + mq5_path.write_text( + apply_lots_to_mq5(mq5_path.read_text(encoding="utf-8"), summary["best_lots"]), + encoding="utf-8", + ) + set_path.write_text( + apply_lots_to_set_text(set_path.read_text(encoding="utf-8"), summary["best_lots"]), + encoding="utf-8", + ) + print(f"Applied to {mq5_path} and {set_path}", flush=True) + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/run_lot_optimize.py b/backtesting/MT5/cluster_audit/run_lot_optimize.py new file mode 100644 index 0000000..ba09ed7 --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_lot_optimize.py @@ -0,0 +1,317 @@ +#!/usr/bin/env python3 +""" +MT5 lot-size sweep per production sub-strategy, then combined portfolio. + +Constraints: + - ORCH_ReferenceBalance = 3000 (deposit also 3000) + - Stock lots capped at 15 shares + +Usage: + python -m cluster_audit.run_lot_optimize + python -m cluster_audit.run_lot_optimize --only RS_NVDA + python -m cluster_audit.run_lot_optimize --apply +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +from datetime import datetime +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.united_mt5_manifest import ( + ALL_ENABLE_KEYS, + HIGH_MARGIN_STOCK_ENABLES, + LOT_CLASS_BY_ID, + LOT_GRIDS, + PRODUCTION_IDS, + UNITED_MT5_STRATEGIES, +) +from cluster_audit.united_mt5_runner import ( + BASE_SET, + CLUSTER, + DEPOSIT, + FROM_DATE, + TO_DATE, + deploy_united, + mt5_context, + patch_set, + run_backtest, +) + +OUT = Path(__file__).resolve().parent / "reports" / "lot_optimize" +STOCK_LOT_MAX = 15.0 +REF_BALANCE = 3000.0 +MIN_TRADES = 20 + + +def g(m: dict, k: str) -> float: + v = m.get(k) + return float(v) if v is not None else 0.0 + + +def spec_map() -> dict[str, dict]: + return {s["id"]: s for s in UNITED_MT5_STRATEGIES} + + +def lot_class(sid: str) -> str: + return LOT_CLASS_BY_ID.get(sid, "forex") + + +def lot_grid(sid: str) -> list[float]: + cls = lot_class(sid) + grid = list(LOT_GRIDS.get(cls, LOT_GRIDS["forex"])) + if cls == "stock": + grid = [x for x in grid if x <= STOCK_LOT_MAX] + return grid + + +def score(m: dict) -> float: + if not m.get("ready"): + return -1e12 + trades = int(m.get("total_trades") or 0) + if trades < MIN_TRADES: + return -1e11 + trades + net = g(m, "net_profit") + pf = g(m, "profit_factor") + sharpe = g(m, "sharpe") + if net <= 0 or pf < 1.0: + return -1e10 + net + return sharpe * 2000.0 + net / 500.0 + pf * 50.0 + + +def common_patches() -> dict[str, float | bool]: + o: dict[str, float | bool] = { + "ORCH_ReferenceBalance": REF_BALANCE, + "ORCH_ScaleLotsByBalance": True, + "GAP_Enable": False, + "OPT_GuardOptimizationMode": True, + } + for key in HIGH_MARGIN_STOCK_ENABLES: + o[key] = False + return o + + +def production_enables() -> dict[str, bool]: + prod = set(PRODUCTION_IDS) + o: dict[str, bool] = {} + for s in UNITED_MT5_STRATEGIES: + o[s["enable"]] = s["id"] in prod + return o + + +def solo_overrides(spec: dict) -> dict[str, bool]: + o: dict[str, bool] = {k: False for k in ALL_ENABLE_KEYS} + o[spec["enable"]] = True + return o + + +def apply_lots_to_set_text(text: str, lots: dict[str, float]) -> str: + lines_out: list[str] = [] + for line in text.splitlines(): + if "=" not in line or line.strip().startswith(";"): + lines_out.append(line) + continue + key = line.split("=", 1)[0].strip() + if key in lots: + val = lots[key] + sval = str(int(val)) if val == int(val) else str(val) + if "||" in line: + parts = line.split("||") + parts[0] = f"{key}={sval}" + lines_out.append("||".join(parts)) + else: + lines_out.append(f"{key}={sval}") + else: + lines_out.append(line) + for key, val in lots.items(): + if not any(l.startswith(f"{key}=") for l in lines_out): + sval = str(int(val)) if val == int(val) else str(val) + lines_out.append(f"{key}={sval}||{sval}||0||{sval}||N") + return "\n".join(lines_out) + "\n" + + +def apply_lots_to_mq5(text: str, lots: dict[str, float]) -> str: + for key, val in lots.items(): + sval = str(int(val)) if val == int(val) else str(val) + text, n = re.subn( + rf"(input double {re.escape(key)} = )[0-9.]+;", + rf"\g<1>{sval};", + text, + count=1, + ) + if n == 0: + print(f" warn: {key} not found in main.mq5", flush=True) + text, n = re.subn( + r"(input double ORCH_ReferenceBalance = )[0-9.]+;", + rf"\g<1>{REF_BALANCE};", + text, + count=1, + ) + return text + + +def optimize_one(ctx: dict, spec: dict, sm: dict[str, dict]) -> dict: + sid = spec["id"] + lot_key = spec["lot"] + grid = lot_grid(sid) + print(f"\n[{sid}] grid={grid} class={lot_class(sid)}", flush=True) + + best_lot = grid[0] + best_m: dict = {"ready": False} + best_sc = -1e12 + trials: list[dict] = [] + + for lot in grid: + ov: dict = {**common_patches(), **solo_overrides(spec), lot_key: lot} + body = patch_set(BASE_SET, ov) + m = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + body, f"lot_{sid}_{lot}.set", f"lot_{sid}_{lot}", + test_symbol=spec.get("test_symbol"), + ) + sc = score(m) + trials.append({"lot": lot, "score": sc, "metrics": m}) + print( + f" lot={lot:6} sc={sc:10.1f} PF={m.get('profit_factor')} " + f"net={m.get('net_profit')} sharpe={m.get('sharpe')} trades={m.get('total_trades')}", + flush=True, + ) + if sc > best_sc: + best_sc = sc + best_lot = lot + best_m = m + + return { + "id": sid, + "lot_key": lot_key, + "lot_class": lot_class(sid), + "best_lot": best_lot, + "best_score": best_sc, + "best_metrics": best_m, + "trials": trials, + } + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("--from", dest="from_date", default=FROM_DATE) + p.add_argument("--to", dest="to_date", default=TO_DATE) + p.add_argument("--only", action="append", default=[], help="Strategy id(s) to optimize") + p.add_argument("--apply", action="store_true", help="Write best lots to main.mq5 and 123.set") + args = p.parse_args() + + import cluster_audit.united_mt5_runner as runner + + runner.FROM_DATE = args.from_date.replace("-", ".") + runner.TO_DATE = args.to_date.replace("-", ".") + runner.DEPOSIT = int(REF_BALANCE) + + OUT.mkdir(parents=True, exist_ok=True) + ctx = mt5_context() + deploy_united(ctx["data"], ctx["mt5_path"]) + sm = spec_map() + + ids = args.only if args.only else list(PRODUCTION_IDS) + print( + f"Lot optimize deposit={DEPOSIT} ref={REF_BALANCE} " + f"{runner.FROM_DATE}->{runner.TO_DATE} n={len(ids)}", + flush=True, + ) + + results: list[dict] = [] + best_lots: dict[str, float] = {} + + for sid in ids: + if sid not in sm: + print(f"skip unknown id {sid}", flush=True) + continue + r = optimize_one(ctx, sm[sid], sm) + results.append(r) + best_lots[r["lot_key"]] = r["best_lot"] + + # Baseline combined (123.set lots + production enables) + base_ov: dict = {**common_patches(), **production_enables()} + baseline = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, base_ov), + "lot_combined_baseline.set", "lot_combined_baseline", + ) + print( + f"\nCOMBINED baseline PF={baseline.get('profit_factor')} net={baseline.get('net_profit')} " + f"sharpe={baseline.get('sharpe')} trades={baseline.get('total_trades')}", + flush=True, + ) + + opt_ov: dict = {**common_patches(), **production_enables(), **best_lots} + optimized = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, opt_ov), + "lot_combined_optimized.set", "lot_combined_optimized", + ) + print( + f"COMBINED optimized PF={optimized.get('profit_factor')} net={optimized.get('net_profit')} " + f"sharpe={optimized.get('sharpe')} trades={optimized.get('total_trades')} " + f"dNet={g(optimized, 'net_profit') - g(baseline, 'net_profit'):.0f} " + f"dSharpe={g(optimized, 'sharpe') - g(baseline, 'sharpe'):.3f}", + flush=True, + ) + + summary = { + "timestamp": datetime.now().isoformat(timespec="seconds"), + "period": {"from": runner.FROM_DATE, "to": runner.TO_DATE}, + "deposit": DEPOSIT, + "reference_balance": REF_BALANCE, + "stock_lot_max": STOCK_LOT_MAX, + "solo": results, + "best_lots": best_lots, + "combined_baseline": baseline, + "combined_optimized": optimized, + "combined_delta": { + "net_profit": g(optimized, "net_profit") - g(baseline, "net_profit"), + "sharpe": g(optimized, "sharpe") - g(baseline, "sharpe"), + "pf": g(optimized, "profit_factor") - g(baseline, "profit_factor"), + }, + } + out_path = OUT / "lot_optimize_summary.json" + out_path.write_text(json.dumps(summary, indent=2), encoding="utf-8") + print(f"\nSaved {out_path}", flush=True) + + print("\nBest lots:", flush=True) + for sid in ids: + if sid not in sm: + continue + row = next(x for x in results if x["id"] == sid) + m = row["best_metrics"] + print( + f" {sid:12} {row['lot_key']}={row['best_lot']} " + f"PF={m.get('profit_factor')} sharpe={m.get('sharpe')} net={m.get('net_profit')}", + flush=True, + ) + + if args.apply: + mq5_path = CLUSTER / "main.mq5" + set_path = CLUSTER / "123.set" + mq5_path.write_text(apply_lots_to_mq5(mq5_path.read_text(encoding="utf-8"), best_lots), encoding="utf-8") + set_path.write_text( + apply_lots_to_set_text(set_path.read_text(encoding="utf-8"), best_lots), + encoding="utf-8", + ) + # Ensure reference balance in set + set_text = set_path.read_text(encoding="utf-8") + set_text = re.sub( + r"ORCH_ReferenceBalance=[^\n]+", + f"ORCH_ReferenceBalance={int(REF_BALANCE)}||{int(REF_BALANCE)}.0||100.000000||10000.000000||N", + set_text, + count=1, + ) + set_path.write_text(set_text, encoding="utf-8") + print(f"Applied lots to {mq5_path} and {set_path}", flush=True) + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/run_prod_lot_refresh.py b/backtesting/MT5/cluster_audit/run_prod_lot_refresh.py new file mode 100644 index 0000000..45efddf --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_prod_lot_refresh.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +"""Lot-opt new production strategies, merge keepers, apply, combined backtest.""" + +from __future__ import annotations + +import json +import sys +from datetime import datetime +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.run_lot_genetic import ( + SUMMARY_PATH, + apply_lots_to_mq5, + apply_lots_to_set_text, + common_patches, + optimize_one, + save_summary, +) + +from cluster_audit.united_mt5_manifest import UNITED_MT5_STRATEGIES +from cluster_audit.united_mt5_runner import ( + BASE_SET, + CLUSTER, + deploy_united, + mt5_context, + patch_set, + run_backtest, +) + +# Lots from prior genetic run (unchanged strategies) +KEEPER_LOTS: dict[str, float] = { + "LOT_DB_DarvasBox": 0.01, + "LOT_ES_EMASlopeDistance": 0.07, + "LOT_RC_RSICrossOver": 0.1, + "LOT_RM_RSIMidPointHijack": 0.01, + "LOT_RS_NVDA": 5.0, + "LOT_RS_TSLA": 5.0, + "LOT_RRA_AUDUSD": 0.05, + "LOT_UB_USDJPY": 0.03, + "LOT_RS_NAS100": 0.03, + "LOT_UKB_UK100": 0.01, +} + +NEW_OPT_IDS = ( + "RS_BTCUSD", "RS_XAUUSD", "SE", "ST_BTC", "ST_XAU", + "RRA_GBP", "GB", "U5B", "RS_US30", +) + + +def production_enables() -> dict[str, bool]: + from cluster_audit.united_mt5_manifest import ALL_ENABLE_KEYS, HIGH_MARGIN_STOCK_ENABLES, PRODUCTION_IDS + prod = set(PRODUCTION_IDS) + o = {s["enable"]: s["id"] in prod for s in UNITED_MT5_STRATEGIES} + for k in HIGH_MARGIN_STOCK_ENABLES: + o[k] = False + return o + + +def main() -> None: + sm = {s["id"]: s for s in UNITED_MT5_STRATEGIES} + summary = {"results": [], "best_lots": dict(KEEPER_LOTS), "timestamp": datetime.now().isoformat(timespec="seconds")} + save_summary(summary) + + ctx = mt5_context() + deploy_united(ctx["data"], ctx["mt5_path"]) + + print(f"Optimizing {len(NEW_OPT_IDS)} new/changed strategies...", flush=True) + for sid in NEW_OPT_IDS: + r = optimize_one(ctx, sm[sid], opt_mode=1, grid_only=True) + summary["results"].append(r) + summary["best_lots"][r["lot_key"]] = r["best_lot"] + save_summary(summary) + print(f" {sid} -> {r['lot_key']}={r['best_lot']}", flush=True) + + # Apply all production lots + lots = summary["best_lots"] + mq5 = CLUSTER / "main.mq5" + st = CLUSTER / "123.set" + mq5.write_text(apply_lots_to_mq5(mq5.read_text(encoding="utf-8"), lots), encoding="utf-8") + st.write_text(apply_lots_to_set_text(st.read_text(encoding="utf-8"), lots), encoding="utf-8") + print(f"Applied {len(lots)} lots to main.mq5 + 123.set", flush=True) + + ov = {**common_patches(), **production_enables(), **lots} + m = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, ov), "prod_v2_combined.set", "prod_v2_combined", + ) + print( + f"\nCOMBINED v2 PF={m.get('profit_factor')} net={m.get('net_profit')} " + f"sharpe={m.get('sharpe')} trades={m.get('total_trades')} dd={m.get('max_drawdown')}", + flush=True, + ) + summary["combined_v2"] = m + save_summary(summary) + print(f"Saved {SUMMARY_PATH}", flush=True) + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/run_sequential.py b/backtesting/MT5/cluster_audit/run_sequential.py new file mode 100644 index 0000000..59be4d2 --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_sequential.py @@ -0,0 +1,278 @@ +""" +Sequential cluster audit: one strategy at a time, fix until it passes, then next. + +Pass criteria (optimized result): + - >= 1 trade per calendar day over the backtest window (~1977 for 2021-2026) + - net > 0, profit factor >= 1.15, sharpe >= 0.3 + - winning months >= 45%, drawdown <= 25% + +Usage: + python -m cluster_audit.run_sequential [trials] [--only ID] [--from ID] +""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +import time +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol +from cluster_audit.diagnose import diagnose +from cluster_audit.engines import ENGINE_MAP +from cluster_audit.portfolio_build import build_progressive_portfolios +from cluster_audit.run_audit import _sample_params +from cluster_audit.scoring import ( + DEFAULT_TRADES_PER_DAY, + acceptance, + format_quality_line, + min_trades_for_period, + period_days, + score_label, + score_report, + trades_per_day, +) +from cluster_audit.strategy_registry import PERIODS, STRATEGIES, TF +from cluster_audit.trace_log import TraceLog + +LOG = TraceLog(enabled=True, trial_every=10) +PRIMARY_PERIOD = "2021-2026" + + +def run_one_strategy( + spec: dict, + period_label: str, + start: str, + end: str, + trials: int, + rng: random.Random, + idx: int, + total: int, + days: int, + trades_per_day_target: float, +) -> dict: + sid = spec["id"] + tf_key = spec["tf"] + label = f"[{idx}/{total}] {sid} @ {period_label}" + LOG.banner(label) + + engine = ENGINE_MAP[spec["engine"]] + sym = resolve_symbol(spec["symbol"]) + start_dt = datetime.fromisoformat(start) + end_dt = datetime.fromisoformat(end) + + try: + df = load_bars(sym, TF[tf_key], start_dt, end_dt) + except Exception as e: + LOG.error(f"data load failed: {e}") + return {"id": sid, "period": period_label, "error": str(e), "spec": spec, "passed": False} + + LOG.info(f"loaded {len(df)} bars symbol={sym} engine={spec['engine']}") + costs = CostModel.for_symbol(sym) + defaults = dict(spec["defaults"]) + + min_t = min_trades_for_period(days, trades_per_day_target) + LOG.info(f"activity gate: >={min_t} trades ({trades_per_day_target:.1f}/day x {days}d)") + + t0 = time.perf_counter() + baseline = engine(df, sym, period_label, sid, defaults, spec["lot"], costs) + LOG.info(f"baseline: {format_quality_line(baseline, days)} ({(time.perf_counter()-t0)*1000:.0f}ms)") + + best = baseline + best_params = defaults + best_score = score_report(baseline, days, trades_per_day_target) + + base_ok, base_issues = acceptance(baseline, days, trades_per_day_target) + if base_ok: + LOG.info("baseline PASSES acceptance gates") + else: + LOG.warn("baseline fails: " + "; ".join(base_issues)) + + if trials > 0: + LOG.info(f"optimizing {trials} trials (score requires trades + profit + consistency)...") + for n in range(1, trials + 1): + params = _sample_params(defaults, spec.get("opt", {}), rng) + r = engine(df, sym, period_label, sid, params, spec["lot"], costs) + sc = score_report(r, days, trades_per_day_target) + if sc > best_score: + best_score = sc + best = r + best_params = params + LOG.trial(n, trials, sc, r.net_profit, r.sharpe, improved=True) + LOG.debug(f" -> {format_quality_line(r, days)}") + elif n % LOG.trial_every == 0 or n == trials: + LOG.trial(n, trials, sc, r.net_profit, r.sharpe, improved=False) + + LOG.info(f"optimized: {format_quality_line(best, days)}") + opt_ok, opt_issues = acceptance(best, days, trades_per_day_target) + passed = opt_ok or base_ok + + if passed: + LOG.info(f"PASS {sid} - ready for portfolio") + else: + LOG.warn(f"FAIL {sid} - needs engine/logic work before next strategy") + LOG.warn(" " + "; ".join(opt_issues if not opt_ok else base_issues)) + + diag = diagnose(spec, baseline, best, LOG) + + result = { + "id": sid, + "engine": spec["engine"], + "symbol": sym, + "timeframe": tf_key, + "period": period_label, + "bars": len(df), + "period_days": days, + "trades_per_day_target": trades_per_day_target, + "baseline_trades_per_day": trades_per_day(baseline, days), + "optimized_trades_per_day": trades_per_day(best, days), + "passed": passed, + "acceptance_issues": opt_issues if not opt_ok else ([] if base_ok else base_issues), + "baseline": baseline.to_dict(), + "optimized": {**best.to_dict(), "params": best_params}, + "optimized_params": best_params, + "optimized_score": best_score, + "improvement_net": best.net_profit - baseline.net_profit, + "improvement_trades": best.total_trades - baseline.total_trades, + "diagnosis": diag, + "spec": spec, + } + + out_dir = Path(__file__).parent / "reports" / "sequential" + out_dir.mkdir(parents=True, exist_ok=True) + path = out_dir / f"{sid}_{period_label}.json" + path.write_text(json.dumps({k: v for k, v in result.items() if k != "spec"}, indent=2), encoding="utf-8") + LOG.info(f"saved {path.name}") + + try: + from cluster_audit.sync_cluster import main as sync_cluster + sync_cluster() + LOG.info("cluster-latest SuperEA_AuditParams.mqh updated") + except Exception as ex: + LOG.warn(f"cluster sync skipped: {ex}") + + return result + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description="Sequential cluster audit - fix each before next") + p.add_argument("trials", nargs="?", type=int, default=40) + p.add_argument("--portfolio-trials", type=int, default=30) + p.add_argument("--from", dest="from_id", default=None) + p.add_argument("--only", default=None) + p.add_argument("--skip-portfolio", action="store_true") + p.add_argument("--trial-every", type=int, default=10) + p.add_argument("--trades-per-day", type=float, default=DEFAULT_TRADES_PER_DAY) + p.add_argument("--continue-on-fail", action="store_true", help="Run next strategy even if current fails") + return p.parse_args() + + +def main() -> None: + args = parse_args() + global LOG + LOG = TraceLog(enabled=True, trial_every=args.trial_every) + + start, end = PERIODS[PRIMARY_PERIOD] + days = period_days(datetime.fromisoformat(start), datetime.fromisoformat(end)) + strategies = STRATEGIES + if args.only: + strategies = [s for s in STRATEGIES if s["id"] == args.only] + elif args.from_id: + found = False + filtered = [] + for s in STRATEGIES: + if s["id"] == args.from_id: + found = True + if found: + filtered.append(s) + strategies = filtered if found else STRATEGIES + + LOG.banner( + f"SEQUENTIAL AUDIT - {len(strategies)} strategies | " + f">={args.trades_per_day:.1f} trade/day (~{min_trades_for_period(days, args.trades_per_day)} trades) | " + f"{args.trials} opt trials" + ) + + if not mt5.initialize(): + LOG.error(f"MT5 init failed: {mt5.last_error()}") + raise SystemExit(1) + + out_dir = Path(__file__).parent / "reports" / "sequential" + out_dir.mkdir(parents=True, exist_ok=True) + rng = random.Random(42) + results: list[dict] = [] + passed_ids: list[str] = [] + failed_ids: list[str] = [] + + try: + for i, spec in enumerate(strategies, 1): + r = run_one_strategy( + spec, PRIMARY_PERIOD, start, end, args.trials, rng, i, len(strategies), + days, args.trades_per_day, + ) + results.append(r) + if r.get("passed"): + passed_ids.append(r["id"]) + elif "error" not in r: + failed_ids.append(r["id"]) + if not args.continue_on_fail and not args.only: + LOG.warn(f"STOPPED at {r['id']} - fix engine/params then resume with --from {r['id']}") + break + + valid = [r for r in results if r.get("passed") and "error" not in r] + valid.sort(key=lambda x: x.get("optimized_score", float("-inf")), reverse=True) + + summary = { + "generated": datetime.now().isoformat(), + "period_days": days, + "trades_per_day_target": args.trades_per_day, + "trials": args.trials, + "passed": passed_ids, + "failed": failed_ids, + "ranking": [ + { + "id": r["id"], + "score": r.get("optimized_score"), + "net": r["optimized"]["net_profit"], + "trades": r["optimized"]["total_trades"], + "sharpe": r["optimized"]["sharpe"], + "pf": r["optimized"]["profit_factor"], + } + for r in valid + ], + "results": [{k: v for k, v in r.items() if k != "spec"} for r in results], + } + + if not args.skip_portfolio and valid: + LOG.banner("PROGRESSIVE PORTFOLIO BUILD (passed strategies only)") + ranked = [{"spec": r["spec"], "optimized_params": r["optimized_params"]} for r in valid] + summary["portfolio_steps"] = build_progressive_portfolios( + ranked, PRIMARY_PERIOD, start, end, args.portfolio_trials, rng, LOG + ) + + (out_dir / "sequential_summary.json").write_text(json.dumps(summary, indent=2), encoding="utf-8") + + LOG.banner(f"PASSED {len(passed_ids)} / FAILED {len(failed_ids)}") + for r in valid: + o = r["optimized"] + LOG.info( + f" {r['id']:28} score={score_label(r['optimized_score'], o['total_trades'], days, args.trades_per_day):>22} " + f"net=${o['net_profit']:9.0f} trades={o['total_trades']:5} ({r.get('optimized_trades_per_day', 0):.2f}/day)" + ) + for fid in failed_ids: + LOG.warn(f" NEEDS FIX: {fid}") + + LOG.banner(f"DONE in {LOG._elapsed()}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/run_tweak_elimination.py b/backtesting/MT5/cluster_audit/run_tweak_elimination.py new file mode 100644 index 0000000..31da2f4 --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_tweak_elimination.py @@ -0,0 +1,428 @@ +#!/usr/bin/env python3 +""" +Multi-round elimination audit: small per-strategy tricks vs solo baseline. + +Round 1 — each trick vs baseline (123.set, one strategy enabled). +Round 2 — stack non-conflicting WIN tricks from round 1. +Round 3 — ±15% numeric refine around best single winner. + +Usage: + python -m cluster_audit.run_tweak_elimination + python -m cluster_audit.run_tweak_elimination --only ES --rounds 1 + python -m cluster_audit.run_tweak_elimination --enabled-only --apply +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +import time +from datetime import datetime +from itertools import combinations +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from set_parser import parse_set_file + +from cluster_audit.tweak_manifest import STRATEGY_TWEAKS +from cluster_audit.united_mt5_manifest import ALL_ENABLE_KEYS, UNITED_MT5_STRATEGIES +from cluster_audit.united_mt5_runner import ( + BASE_SET, + CLUSTER, + deploy_united, + mt5_context, + patch_set, + run_backtest, +) + +OUT = Path(__file__).resolve().parent / "reports" / "tweak_elimination" +CHECKPOINT = OUT / "checkpoint.json" + + +def solo_overrides(spec: dict) -> dict: + o: dict = {k: False for k in ALL_ENABLE_KEYS} + o[spec["enable"]] = True + o["GAP_Enable"] = False + o["OPT_GuardOptimizationMode"] = True + return o + + +def g(m: dict, k: str) -> float: + v = m.get(k) + return float(v) if v is not None else 0.0 + + +def classify(base: dict, var: dict) -> str: + if not var.get("ready"): + return "BROKEN" + if var.get("total_trades", 0) == 0: + return "NO_TRADES" + d_net = g(var, "net_profit") - g(base, "net_profit") + d_sh = g(var, "sharpe") - g(base, "sharpe") + if d_net > 35 and d_sh >= -0.05: + return "WIN" + if d_net < -35 or d_sh < -0.12: + return "LOSE" + return "NEUTRAL" + + +def delta(base: dict, var: dict) -> dict: + return { + "net_profit_delta": g(var, "net_profit") - g(base, "net_profit"), + "sharpe_delta": g(var, "sharpe") - g(base, "sharpe"), + "pf_delta": g(var, "profit_factor") - g(base, "profit_factor"), + "trades_delta": int(g(var, "total_trades") - g(base, "total_trades")), + } + + +def merge_params(*dicts: dict) -> dict: + out: dict = {} + for d in dicts: + out.update(d) + return out + + +def numeric_refine(params: dict, factor: float) -> dict: + out: dict = {} + for k, v in params.items(): + if isinstance(v, (int, float)) and not isinstance(v, bool): + nv = round(v * factor, 4) + out[k] = int(nv) if isinstance(v, int) else nv + else: + out[k] = v + return out + + +def run_variant(ctx: dict, spec: dict, base_ov: dict, extra: dict, tag: str) -> dict: + ov = {**base_ov, **extra} + body = patch_set(BASE_SET, ov) + safe_tag = re.sub(r"[^\w.-]", "_", tag)[:48] + last: dict = {"ready": False} + for attempt in range(3): + if attempt: + time.sleep(6) + print(f" retry {attempt} {safe_tag}", flush=True) + last = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + body, f"twk_{spec['id']}_{safe_tag}.set", f"twk_{spec['id']}_{safe_tag}", + ) + if last.get("ready"): + break + time.sleep(2) + return last + + +def load_checkpoint() -> dict[str, dict]: + if CHECKPOINT.exists(): + return json.loads(CHECKPOINT.read_text(encoding="utf-8")) + return {} + + +def save_checkpoint(all_results: list[dict], *, rounds: int, strategies: list[dict]) -> None: + OUT.mkdir(parents=True, exist_ok=True) + done = {r["id"]: r for r in all_results if "final" in r} + payload = { + "updated": datetime.now().isoformat(), + "rounds": rounds, + "completed": list(done.keys()), + "results": all_results, + } + CHECKPOINT.write_text(json.dumps(payload, indent=2, default=str), encoding="utf-8") + summary = { + "generated": payload["updated"], + "rounds": rounds, + "strategies_tested": len(strategies), + "completed": payload["completed"], + "applied": [sid for sid, r in done.items() if r.get("final", {}).get("action") == "APPLY"], + "kept_baseline": [sid for sid, r in done.items() if r.get("final", {}).get("action") == "KEEP_BASELINE"], + "results": all_results, + } + (OUT / "summary.json").write_text(json.dumps(summary, indent=2, default=str), encoding="utf-8") + + +def round1(ctx: dict, spec: dict, base_ov: dict) -> tuple[dict, list[dict]]: + sid = spec["id"] + tricks = STRATEGY_TWEAKS.get(sid, []) + print(f"\n{'='*60}\n[{sid}] Round 1 — {len(tricks)} tricks\n{'='*60}", flush=True) + + base = run_variant(ctx, spec, base_ov, {}, "base") + print(f" BASE net={base.get('net_profit')} sharpe={base.get('sharpe')} " + f"trades={base.get('total_trades')} ({base.get('elapsed_sec')}s)", flush=True) + + results: list[dict] = [] + for tw in tricks: + m = run_variant(ctx, spec, base_ov, tw["params"], tw["name"]) + v = classify(base, m) + d = delta(base, m) + row = { + "round": 1, + "name": tw["name"], + "params": tw["params"], + "verdict": v, + "delta": d, + "metrics": m, + } + results.append(row) + print(f" {tw['name']:22s} {v:8s} dNet={d['net_profit_delta']:+.0f} " + f"dSharpe={d['sharpe_delta']:+.3f} trades={m.get('total_trades')}", flush=True) + + return base, results + + +def round2(ctx: dict, spec: dict, base_ov: dict, winners: list[dict]) -> list[dict]: + if len(winners) < 2: + return [] + sid = spec["id"] + print(f" [{sid}] Round 2 — stack {len(winners)} winners", flush=True) + out: list[dict] = [] + for a, b in combinations(winners, 2): + keys_a = set(a["params"]) + keys_b = set(b["params"]) + if keys_a & keys_b: + continue + combo_name = f"{a['name']}+{b['name']}" + params = merge_params(a["params"], b["params"]) + m = run_variant(ctx, spec, base_ov, params, combo_name.replace("+", "_")) + # compare vs best single winner metrics stored in winners + best_single = max(winners, key=lambda w: g(w["metrics"], "net_profit")) + v = classify(best_single["metrics"], m) + d = delta(best_single["metrics"], m) + row = { + "round": 2, + "name": combo_name, + "params": params, + "verdict": v, + "delta_vs_best_single": d, + "metrics": m, + } + out.append(row) + print(f" {combo_name:30s} {v:8s} dNet={d['net_profit_delta']:+.0f} " + f"dSharpe={d['sharpe_delta']:+.3f}", flush=True) + return out + + +def round3(ctx: dict, spec: dict, base_ov: dict, best: dict) -> list[dict]: + sid = spec["id"] + numeric = {k: v for k, v in best["params"].items() if isinstance(v, (int, float))} + if not numeric: + return [] + print(f" [{sid}] Round 3 — refine {best['name']}", flush=True) + out: list[dict] = [] + for fac, label in ((0.85, "refine_lo"), (1.15, "refine_hi")): + params = merge_params( + {k: v for k, v in best["params"].items() if k not in numeric}, + numeric_refine(numeric, fac), + ) + m = run_variant(ctx, spec, base_ov, params, f"{best['name']}_{label}") + v = classify(best["metrics"], m) + d = delta(best["metrics"], m) + out.append({ + "round": 3, + "name": f"{best['name']}_{label}", + "params": params, + "verdict": v, + "delta_vs_best": d, + "metrics": m, + }) + print(f" {label:12s} {v:8s} dNet={d['net_profit_delta']:+.0f} " + f"dSharpe={d['sharpe_delta']:+.3f}", flush=True) + return out + + +def pick_final(base: dict, r1: list[dict], r2: list[dict], r3: list[dict]) -> dict: + candidates: list[dict] = [] + for r in r1: + if r["verdict"] == "WIN": + candidates.append({"source": f"r1:{r['name']}", "params": r["params"], "metrics": r["metrics"]}) + for r in r2: + if r["verdict"] == "WIN": + candidates.append({"source": f"r2:{r['name']}", "params": r["params"], "metrics": r["metrics"]}) + for r in r3: + if r["verdict"] == "WIN": + candidates.append({"source": f"r3:{r['name']}", "params": r["params"], "metrics": r["metrics"]}) + + if not candidates: + return {"action": "KEEP_BASELINE", "params": {}, "baseline": base} + + best = max(candidates, key=lambda c: (g(c["metrics"], "sharpe"), g(c["metrics"], "net_profit"))) + return { + "action": "APPLY", + "source": best["source"], + "params": best["params"], + "metrics": best["metrics"], + "baseline": base, + "improvement": delta(base, best["metrics"]), + } + + +def _format_mq5_value(old_val: str, val: object) -> str: + old = old_val.strip() + if isinstance(val, bool): + return "true" if val else "false" + if isinstance(val, int): + return str(val) + if isinstance(val, float): + if "." in old: + return f"{val:.1f}" if val == int(val) else str(val) + return str(int(val)) if val == int(val) else str(val) + if isinstance(val, str): + return f'"{val}"' if not (old.startswith('"') and old.endswith('"')) else f'"{val}"' + return str(val) + + +def apply_to_mq5_and_set(winners: dict[str, dict]) -> None: + mq5 = CLUSTER / "main.mq5" + st = CLUSTER / "123.set" + text = mq5.read_text(encoding="utf-8") + set_lines = st.read_text(encoding="utf-8", errors="ignore").splitlines() + n_applied = 0 + + for _sid, w in winners.items(): + if w.get("action") != "APPLY": + continue + for key, val in w["params"].items(): + pat = rf"(input\s+(?:bool|int|double|string|ENUM_\w+)\s+{re.escape(key)}\s*=\s*)([^;]+)(;)" + + def repl(m: re.Match, v: object = val) -> str: + return f"{m.group(1)}{_format_mq5_value(m.group(2), v)}{m.group(3)}" + + new_text, n = re.subn(pat, repl, text, count=1) + if n: + text = new_text + n_applied += 1 + else: + print(f" WARN mq5 miss {key}", flush=True) + + for i, line in enumerate(set_lines): + if not line.startswith(f"{key}="): + continue + sv = "true" if val is True else "false" if val is False else str(val) + parts = line.split("||") + if len(parts) >= 5: + parts[0] = f"{key}={sv}" + set_lines[i] = "||".join(parts) + else: + set_lines[i] = f"{key}={sv}" + break + + if re.search(r'#property version\s+"[\d.]+"', text): + text = re.sub(r'(#property version\s+)"[\d.]+"', r'\g<1>"1.27"', text, count=1) + + mq5.write_text(text, encoding="utf-8") + st.write_text("\n".join(set_lines) + "\n", encoding="utf-8") + print(f"Applied {n_applied} param updates -> main.mq5 + 123.set", flush=True) + + +def audit_strategy(ctx: dict, spec: dict, rounds: int) -> dict: + base_ov = solo_overrides(spec) + base, r1 = round1(ctx, spec, base_ov) + winners = [r for r in r1 if r["verdict"] == "WIN"] + + r2: list[dict] = [] + r3: list[dict] = [] + if rounds >= 2 and len(winners) >= 2: + r2 = round2(ctx, spec, base_ov, winners) + winners += [r for r in r2 if r["verdict"] == "WIN"] + + if rounds >= 3 and winners: + best = max(winners, key=lambda w: g(w["metrics"], "net_profit")) + r3 = round3(ctx, spec, base_ov, best) + winners += [r for r in r3 if r["verdict"] == "WIN"] + + final = pick_final(base, r1, r2, r3) + print(f" => {final['action']} {final.get('source', '')} " + f"dNet={final.get('improvement', {}).get('net_profit_delta', 0):+.0f}", flush=True) + return { + "id": spec["id"], + "name": spec["name"], + "baseline": base, + "round1": r1, + "round2": r2, + "round3": r3, + "final": final, + "eliminated": [r["name"] for r in r1 if r["verdict"] == "LOSE"], + "neutral": [r["name"] for r in r1 if r["verdict"] == "NEUTRAL"], + } + + +def main() -> int: + p = argparse.ArgumentParser() + p.add_argument("--only", default=None) + p.add_argument("--from", dest="from_id", default=None) + p.add_argument("--enabled-only", action="store_true") + p.add_argument("--rounds", type=int, default=3, choices=[1, 2, 3]) + p.add_argument("--apply", action="store_true", help="Write WIN params into main.mq5 + 123.set") + p.add_argument("--resume", action="store_true", help="Skip strategies already in checkpoint.json") + args = p.parse_args() + + OUT.mkdir(parents=True, exist_ok=True) + base_params = parse_set_file(BASE_SET) + + strategies = list(UNITED_MT5_STRATEGIES) + if args.enabled_only: + strategies = [ + s for s in strategies + if base_params.get(s["enable"], type("x", (), {"value": False})).value + ] + if args.only: + strategies = [s for s in strategies if s["id"] == args.only] + elif args.from_id: + found = False + filtered = [] + for s in strategies: + if s["id"] == args.from_id: + found = True + if found: + filtered.append(s) + strategies = filtered if found else strategies + + print(f"Tweak elimination | {len(strategies)} strategies | rounds={args.rounds} | base={BASE_SET.name}") + ctx = mt5_context() + deploy_united(ctx["data"], ctx["mt5_path"]) + print("Compiled main.ex5 OK", flush=True) + + all_results: list[dict] = [] + if args.resume and CHECKPOINT.exists(): + ck = json.loads(CHECKPOINT.read_text(encoding="utf-8")) + all_results = ck.get("results", []) + done_ids = {r["id"] for r in all_results if "final" in r} + strategies = [s for s in strategies if s["id"] not in done_ids] + print(f"Resume: skipping {len(done_ids)} done, {len(strategies)} remaining", flush=True) + + for spec in strategies: + try: + result = audit_strategy(ctx, spec, args.rounds) + all_results.append(result) + save_checkpoint(all_results, rounds=args.rounds, strategies=strategies) + except Exception as ex: + print(f" ERROR {spec['id']}: {ex}", flush=True) + all_results.append({"id": spec["id"], "error": str(ex)}) + save_checkpoint(all_results, rounds=args.rounds, strategies=strategies) + + apply_map = {r["id"]: r["final"] for r in all_results if "final" in r} + applied = [sid for sid, f in apply_map.items() if f.get("action") == "APPLY"] + + summary = { + "generated": datetime.now().isoformat(), + "rounds": args.rounds, + "strategies_tested": len(strategies), + "applied": applied, + "kept_baseline": [sid for sid, f in apply_map.items() if f.get("action") == "KEEP_BASELINE"], + "results": all_results, + } + out_path = OUT / "summary.json" + out_path.write_text(json.dumps(summary, indent=2, default=str), encoding="utf-8") + print(f"\nSaved {out_path}") + print(f"APPLY ({len(applied)}): {applied}") + + if args.apply and applied: + apply_to_mq5_and_set(apply_map) + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/backtesting/MT5/cluster_audit/run_united_sequential.py b/backtesting/MT5/cluster_audit/run_united_sequential.py new file mode 100644 index 0000000..4a538bf --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_united_sequential.py @@ -0,0 +1,133 @@ +""" +Sequential United EA audit (main.mq5 strategies from 123.set). + +Usage: + python -m cluster_audit.run_united_sequential [trials] [--only ID] [--from ID] [--continue-on-fail] +""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.run_sequential import run_one_strategy # noqa: E402 +from cluster_audit.scoring import ( # noqa: E402 + DEFAULT_TRADES_PER_DAY, + min_trades_for_period, + period_days, + score_label, +) +from cluster_audit.trace_log import TraceLog # noqa: E402 +from cluster_audit.united_registry import PERIODS, UNITED_STRATEGIES # noqa: E402 + +PRIMARY_PERIOD = "2021-2026" + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description="United EA sequential audit (main.mq5)") + p.add_argument("trials", nargs="?", type=int, default=80) + p.add_argument("--from", dest="from_id", default=None) + p.add_argument("--only", default=None) + p.add_argument("--trial-every", type=int, default=10) + p.add_argument("--trades-per-day", type=float, default=DEFAULT_TRADES_PER_DAY) + p.add_argument("--continue-on-fail", action="store_true") + return p.parse_args() + + +def main() -> None: + args = parse_args() + log = TraceLog(enabled=True, trial_every=args.trial_every) + + start, end = PERIODS[PRIMARY_PERIOD] + days = period_days(datetime.fromisoformat(start), datetime.fromisoformat(end)) + strategies = UNITED_STRATEGIES + if args.only: + strategies = [s for s in UNITED_STRATEGIES if s["id"] == args.only] + elif args.from_id: + found = False + filtered = [] + for s in UNITED_STRATEGIES: + if s["id"] == args.from_id: + found = True + if found: + filtered.append(s) + strategies = filtered if found else UNITED_STRATEGIES + + log.banner( + f"UNITED EA AUDIT - {len(strategies)} strategies | " + f">={args.trades_per_day:.1f} trade/day | {args.trials} trials" + ) + + if not mt5.initialize(): + log.error(f"MT5 init failed: {mt5.last_error()}") + raise SystemExit(1) + + out_dir = Path(__file__).parent / "reports" / "united_sequential" + out_dir.mkdir(parents=True, exist_ok=True) + rng = random.Random(42) + results: list[dict] = [] + passed_ids: list[str] = [] + failed_ids: list[str] = [] + + try: + for i, spec in enumerate(strategies, 1): + r = run_one_strategy( + spec, PRIMARY_PERIOD, start, end, args.trials, rng, i, len(strategies), + days, args.trades_per_day, + ) + # relocate report to united folder + src = Path(__file__).parent / "reports" / "sequential" / f"{spec['id']}_{PRIMARY_PERIOD}.json" + dst = out_dir / f"{spec['id']}_{PRIMARY_PERIOD}.json" + if src.exists(): + dst.write_text(src.read_text(encoding="utf-8"), encoding="utf-8") + + results.append(r) + if r.get("passed"): + passed_ids.append(r["id"]) + elif "error" not in r: + failed_ids.append(r["id"]) + if not args.continue_on_fail and not args.only: + log.warn(f"STOPPED at {r['id']} — resume with --from {r['id']} --continue-on-fail") + break + + summary = { + "generated": datetime.now().isoformat(), + "period_days": days, + "passed": passed_ids, + "failed": failed_ids, + "results": [{k: v for k, v in r.items() if k != "spec"} for r in results], + } + (out_dir / "united_summary.json").write_text(json.dumps(summary, indent=2), encoding="utf-8") + + try: + from cluster_audit.sync_united import main as sync_united + sync_united() + log.info("main.mq5 + UnitedEA_Optimized.set updated") + except Exception as ex: + log.warn(f"sync_united skipped: {ex}") + + log.banner(f"PASSED {len(passed_ids)} / FAILED {len(failed_ids)}") + for r in results: + if not r.get("passed"): + continue + o = r["optimized"] + log.info( + f" {r['id']:28} net=${o['net_profit']:9.0f} " + f"trades={o['total_trades']:5} pf={o['profit_factor']:.2f}" + ) + for fid in failed_ids: + log.warn(f" NEEDS FIX: {fid}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/run_us30_lot_dd.py b/backtesting/MT5/cluster_audit/run_us30_lot_dd.py new file mode 100644 index 0000000..8c24f73 --- /dev/null +++ b/backtesting/MT5/cluster_audit/run_us30_lot_dd.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +"""US30 lot sweep — pick lot balancing return vs equity drawdown.""" + +from __future__ import annotations + +import json +import re +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.united_mt5_manifest import ALL_ENABLE_KEYS, UNITED_MT5_STRATEGIES +from cluster_audit.united_mt5_runner import BASE_SET, deploy_united, mt5_context, patch_set, run_backtest + +OUT = Path(__file__).resolve().parent / "reports" / "us30_lot_dd" +LOTS = [0.03, 0.04, 0.05, 0.06, 0.07, 0.08] +MAX_DD_PCT = 35.0 # reject lots with equity DD above this + + +def parse_dd_pct(dd: str | None) -> float | None: + if not dd: + return None + m = re.search(r"([\d.]+)\s*%", str(dd).replace(",", "")) + return float(m.group(1)) if m else None + + +def main() -> None: + sm = {s["id"]: s for s in UNITED_MT5_STRATEGIES} + spec = sm["RS_US30"] + ov_base = { + k: False for k in ALL_ENABLE_KEYS + } + ov_base[spec["enable"]] = True + ov_base.update({ + "ORCH_ReferenceBalance": 3000.0, + "ORCH_ScaleLotsByBalance": True, + "GAP_Enable": False, + "OPT_GuardOptimizationMode": True, + "EnableRSIScalpingMU": False, + }) + + ctx = mt5_context() + deploy_united(ctx["data"], ctx["mt5_path"]) + OUT.mkdir(parents=True, exist_ok=True) + + trials: list[dict] = [] + best_lot, best_sc, best_row = LOTS[0], -1e18, {} + + for lot in LOTS: + ov = {**ov_base, spec["lot"]: lot} + tag = str(lot).replace(".", "p") + m = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + patch_set(BASE_SET, ov), f"us30_dd_{tag}.set", f"us30_dd_{tag}", + ) + dd_pct = parse_dd_pct(m.get("max_drawdown")) + pf = float(m.get("profit_factor") or 0) + sharpe = float(m.get("sharpe") or 0) + profit = float(m.get("net_profit") or 0) + trades = int(m.get("total_trades") or 0) + if not m.get("ready") or trades < 20 or pf < 1.0: + sc = -1e10 + elif dd_pct is not None and dd_pct > MAX_DD_PCT: + sc = sharpe * 500 + profit / 2000 - dd_pct * 100 + else: + sc = sharpe * 2000 + profit / 500 + pf * 50 - (dd_pct or 0) * 20 + row = {"lot": lot, "dd_pct": dd_pct, "score": sc, "metrics": m} + trials.append(row) + print( + f"lot={lot} PF={pf} net={profit} sharpe={sharpe} dd={m.get('max_drawdown')} sc={sc:.0f}", + flush=True, + ) + if sc > best_sc: + best_sc, best_lot, best_row = sc, lot, row + + # Prefer highest lot under DD cap with PF>=1.1 + under_cap = [t for t in trials if t.get("dd_pct") is not None and t["dd_pct"] <= MAX_DD_PCT + and (t["metrics"].get("profit_factor") or 0) >= 1.1] + if under_cap: + best_lot = max(under_cap, key=lambda t: t["lot"])["lot"] + best_row = next(t for t in trials if t["lot"] == best_lot) + + result = {"best_lot": best_lot, "max_dd_cap_pct": MAX_DD_PCT, "best": best_row, "trials": trials} + OUT.mkdir(parents=True, exist_ok=True) + (OUT / "us30_lot_dd.json").write_text(json.dumps(result, indent=2), encoding="utf-8") + print(f"BEST lot={best_lot} dd={best_row.get('dd_pct')}% PF={best_row['metrics'].get('profit_factor')}", flush=True) + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/scan_low_margin_stocks.py b/backtesting/MT5/cluster_audit/scan_low_margin_stocks.py new file mode 100644 index 0000000..a289ca6 --- /dev/null +++ b/backtesting/MT5/cluster_audit/scan_low_margin_stocks.py @@ -0,0 +1,57 @@ +"""Quick solo scan for low-margin stocks using NVDA-style RSI params.""" + +from __future__ import annotations + +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from cluster_audit.united_mt5_manifest import ALL_ENABLE_KEYS, HIGH_MARGIN_STOCK_ENABLES +from cluster_audit.united_mt5_runner import BASE_SET, deploy_united, mt5_context, patch_set, run_backtest +import cluster_audit.united_mt5_runner as runner + +SYMBOLS = ("SNAP.NYS", "F.NYS", "SOFI.NAS", "PFE.NYS", "AAL.NAS", "NVDA.NAS", "BAC.NYS", "WBD.NAS") + +NVDA_PARAMS = { + "RS_F_Symbol": "", + "RS_F_TimeFrame": 15, + "RS_F_RSI_Period": 8, + "RS_F_RSI_Overbought": 36, + "RS_F_RSI_Oversold": 38, + "RS_F_RSI_Target_Buy": 90, + "RS_F_RSI_Target_Sell": 70, + "RS_F_BarsToWait": 5, + "LOT_RS_F": 10, +} + + +def main() -> None: + ctx = mt5_context() + deploy_united(ctx["data"], ctx["mt5_path"]) + print(f"{'symbol':14} {'trades':>6} {'PF':>6} {'net':>10}") + for sym in SYMBOLS: + o = {k: False for k in ALL_ENABLE_KEYS} + o["EnableRSIScalpingF"] = True + for k in HIGH_MARGIN_STOCK_ENABLES: + o[k] = False + o["GAP_Enable"] = False + o.update(NVDA_PARAMS) + o["RS_F_Symbol"] = sym + body = patch_set(BASE_SET, o) + report = f"scan_{sym.replace('.', '_')}" + old = runner.TEST_SYMBOL + runner.TEST_SYMBOL = sym + m = run_backtest( + ctx["data"], ctx["mt5_path"], ctx["login"], ctx["server"], + body, f"{report}.set", report, + ) + runner.TEST_SYMBOL = old + print( + f"{sym:14} {int(m.get('total_trades') or 0):6} " + f"{float(m.get('profit_factor') or 0):6.2f} {float(m.get('net_profit') or 0):10.2f}" + ) + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/scoring.py b/backtesting/MT5/cluster_audit/scoring.py new file mode 100644 index 0000000..9552356 --- /dev/null +++ b/backtesting/MT5/cluster_audit/scoring.py @@ -0,0 +1,126 @@ +"""Strategy scoring — requires ~1 trade per calendar day over the backtest period.""" + +from __future__ import annotations + +from datetime import date, datetime + +from .backtest_core import BacktestReport + +DEFAULT_TRADES_PER_DAY = 1.0 + + +def period_days(start: date | datetime | str, end: date | datetime | str) -> int: + if isinstance(start, str): + start = datetime.fromisoformat(start) + if isinstance(end, str): + end = datetime.fromisoformat(end) + if isinstance(start, datetime): + start = start.date() + if isinstance(end, datetime): + end = end.date() + return max(1, (end - start).days) + + +def min_trades_for_period(days: int, trades_per_day: float = DEFAULT_TRADES_PER_DAY) -> int: + return max(30, int(days * trades_per_day)) + + +def trades_per_day(report: BacktestReport, days: int) -> float: + if report.total_trades == 0 or days <= 0: + return 0.0 + return report.total_trades / days + + +def winning_months_pct(report: BacktestReport) -> float: + if not report.monthly_returns: + return 0.0 + vals = list(report.monthly_returns.values()) + return 100.0 * sum(1 for v in vals if v > 0) / len(vals) + + +def score_report( + report: BacktestReport, + period_days_count: int, + trades_per_day_target: float = DEFAULT_TRADES_PER_DAY, +) -> float: + """Higher is better. Hard-fails below activity + profit gates.""" + min_t = min_trades_for_period(period_days_count, trades_per_day_target) + t = report.total_trades + tpd = trades_per_day(report, period_days_count) + + if t < min_t or tpd < trades_per_day_target: + return float("-inf") + + if report.net_profit <= 0 or report.profit_factor < 1.05: + return float("-inf") + + win_mo = winning_months_pct(report) / 100.0 + activity = min(tpd / (trades_per_day_target * 1.5), 1.0) + pf = min(report.profit_factor, 4.0) / 4.0 + wr = min(report.win_rate, 70.0) / 70.0 + + return ( + report.sharpe * 0.25 + + (report.net_profit / 2000.0) * 0.18 + - report.max_drawdown_pct * 0.10 + + activity * 0.22 + + win_mo * 0.12 + + pf * 0.08 + + wr * 0.05 + ) + + +def score_label( + score: float, + trades: int, + period_days_count: int, + trades_per_day_target: float = DEFAULT_TRADES_PER_DAY, +) -> str: + min_t = min_trades_for_period(period_days_count, trades_per_day_target) + tpd = trades / period_days_count if period_days_count else 0 + if trades < min_t: + return f"N/A ({trades}<{min_t}, need {trades_per_day_target:.1f}/day)" + if tpd < trades_per_day_target: + return f"N/A ({tpd:.2f}/day < {trades_per_day_target:.1f}/day)" + if score == float("-inf"): + return "N/A (fails profit gates)" + return f"{score:.2f}" + + +def acceptance( + report: BacktestReport, + period_days_count: int, + trades_per_day_target: float = DEFAULT_TRADES_PER_DAY, +) -> tuple[bool, list[str]]: + min_t = min_trades_for_period(period_days_count, trades_per_day_target) + tpd = trades_per_day(report, period_days_count) + issues: list[str] = [] + + if report.total_trades < min_t: + issues.append(f"trades={report.total_trades} need >={min_t} ({trades_per_day_target:.1f}/day x {period_days_count}d)") + if tpd < trades_per_day_target: + issues.append(f"trades/day={tpd:.2f} need >={trades_per_day_target:.1f}") + if report.net_profit <= 0: + issues.append(f"net=${report.net_profit:.0f} not positive") + if report.profit_factor < 1.15: + issues.append(f"pf={report.profit_factor:.2f} need >=1.15") + if report.sharpe < 0.3: + issues.append(f"sharpe={report.sharpe:.2f} need >=0.30") + if report.max_drawdown_pct > 25: + issues.append(f"dd={report.max_drawdown_pct:.1f}% too high") + + win_mo = winning_months_pct(report) + if win_mo < 45: + issues.append(f"winning_months={win_mo:.0f}% need >=45%") + + return len(issues) == 0, issues + + +def format_quality_line(report: BacktestReport, period_days_count: int) -> str: + tpd = trades_per_day(report, period_days_count) + return ( + f"net=${report.net_profit:.0f} sharpe={report.sharpe:.2f} " + f"trades={report.total_trades} ({tpd:.2f}/day) pf={report.profit_factor:.2f} " + f"wr={report.win_rate:.0f}% win_mo={winning_months_pct(report):.0f}% " + f"dd={report.max_drawdown_pct:.1f}%" + ) diff --git a/backtesting/MT5/cluster_audit/strategy_registry.py b/backtesting/MT5/cluster_audit/strategy_registry.py new file mode 100644 index 0000000..240f7da --- /dev/null +++ b/backtesting/MT5/cluster_audit/strategy_registry.py @@ -0,0 +1,134 @@ +"""All SuperEA robot instances with defaults and optimization ranges.""" + +from __future__ import annotations + +import MetaTrader5 as mt5 + +TF = { + "M10": mt5.TIMEFRAME_M10, + "M15": mt5.TIMEFRAME_M15, + "M20": mt5.TIMEFRAME_M20, + "M30": mt5.TIMEFRAME_M30, + "H1": mt5.TIMEFRAME_H1, + "H4": mt5.TIMEFRAME_H4, +} + +STRATEGIES: list[dict] = [ + {"id": "darvas_xau", "engine": "darvas", "symbol": "XAUUSD", "tf": "M15", "lot": 0.07, + "defaults": {"box_period": 24, "box_deviation": 80000, "ma_period": 60, + "trend_threshold": 1.2, "volume_threshold": 0, + "stop_loss_pts": 450, "take_profit_pts": 650}, + "opt": {"box_period": (12, 48, 4), "box_deviation": (40000, 150000, 5000), + "trend_threshold": (0.3, 5.0, 0.3), "stop_loss_pts": (250, 900, 50), + "take_profit_pts": (350, 1200, 50), "ma_period": (30, 120, 15)}}, + {"id": "ema_slope_unit", "engine": "ema_slope", "symbol": "XAUUSD", "tf": "H1", "lot": 0.07, + "defaults": {"ema_period": 85, "price_threshold_pips": 350, "slope_threshold_pips": 22.5, + "monitor_timeout_sec": 340, "max_trades_per_crossover": 12, "use_trailing_stop": False, + "trailing_stop_pips": 74, "max_loss_atr": 1.8, "use_bar_data": True, + "close_unprofitable_trades": True, "profit_check_bars": 36, + "use_weekly_adx_filter": True, "weekly_adx_period": 28, + "weekly_adx_min": 25, "weekly_adx_bar_shift": 8, "weekly_adx_use_direction": True}, + "opt": {"ema_period": (50, 120, 5), "price_threshold_pips": (150, 500, 50), + "slope_threshold_pips": (10, 50, 5), "max_loss_atr": (1.2, 3.0, 0.3), + "profit_check_bars": (18, 60, 6), "max_trades_per_crossover": (3, 20, 3)}}, + {"id": "ema_slope_trail", "engine": "ema_slope", "symbol": "XAUUSD", "tf": "H1", "lot": 0.07, + "defaults": {"ema_period": 50, "price_threshold_pips": 700, "slope_threshold_pips": 25, + "monitor_timeout_sec": 340, "max_trades_per_crossover": 3, "use_trailing_stop": True, + "trailing_stop_pips": 370, "max_loss_atr": 2.0, "use_bar_data": True, + "close_unprofitable_trades": True, "profit_check_bars": 11, + "use_weekly_adx_filter": True, "weekly_adx_period": 15, + "weekly_adx_min": 40, "weekly_adx_bar_shift": 2, "weekly_adx_use_direction": True}, + "opt": {"ema_period": (30, 90, 5), "trailing_stop_pips": (150, 450, 50), + "max_loss_atr": (1.2, 3.5, 0.3), "weekly_adx_min": (25, 50, 5)}}, + {"id": "mean_rev_btc", "engine": "mean_reversion", "symbol": "BTCUSD", "tf": "M15", "lot": 0.01, + "defaults": {"ema_period": 80, "min_ema_distance_pts": 300, "rsi_period": 14, + "rsi_oversold": 40, "rsi_overbought": 70, "adx_period": 14, + "adx_max_for_entry": 30, "adx_escape": 40, "use_rsi_cross": True, + "use_hard_sltp": False, "sl_points": 1300, "tp_points": 13400}, + "opt": {"rsi_oversold": (30, 50, 5), "rsi_overbought": (60, 80, 5), + "min_ema_distance_pts": (100, 1500, 100), "adx_max_for_entry": (22, 40, 3), + "ema_period": (40, 120, 20)}}, + {"id": "rsi_cross_xau", "engine": "rsi_crossover", "symbol": "XAUUSD", "tf": "H1", "lot": 0.01, + "defaults": {"rsi_period": 19, "overbought_level": 93, "oversold_level": 22, "ema_period": 140, + "ema_slope_threshold": 105, "ema_distance_threshold": 165, "exit_buy_rsi": 86, + "exit_sell_rsi": 10, "trailing_stop_pts": 295, "cooldown_seconds": 209, + "tuesday": True, "wednesday": True, "thursday": True, + "trading_hour_one_begin": 0, "trading_hour_one_end": 22, + "trading_hour_two_begin": 6, "trading_hour_two_end": 19}, + "opt": {"overbought_level": (65, 95, 5), "oversold_level": (10, 45, 5), + "ema_slope_threshold": (20, 200, 20), "ema_distance_threshold": (40, 300, 20)}}, + {"id": "rsi_asian_eur", "engine": "rsi_asian", "symbol": "EURUSD", "tf": "M15", "lot": 0.1, + "defaults": {"rsi_period": 28, "overbought_level": 60, "oversold_level": 8, + "asian_session_start": 0, "asian_session_end": 8, "use_rsi_exit": True, "rsi_exit_level": 55}, + "opt": {"overbought_level": (50, 80, 5), "oversold_level": (5, 40, 5)}}, + {"id": "rsi_asian_aud", "engine": "rsi_asian", "symbol": "AUDUSD", "tf": "M15", "lot": 0.1, + "defaults": {"rsi_period": 28, "overbought_level": 68, "oversold_level": 30, + "asian_session_start": 0, "asian_session_end": 8, "use_rsi_exit": True, "rsi_exit_level": 55}, + "opt": {"overbought_level": (55, 80, 5), "oversold_level": (15, 45, 5)}}, + {"id": "rsi_asian_gbp", "engine": "rsi_asian", "symbol": "GBPUSD", "tf": "M15", "lot": 0.1, + "defaults": {"rsi_period": 28, "overbought_level": 80, "oversold_level": 37, + "asian_session_start": 0, "asian_session_end": 8, "use_rsi_exit": True, "rsi_exit_level": 55}, + "opt": {"overbought_level": (60, 85, 5), "oversold_level": (20, 50, 5)}}, + {"id": "rsi_secret_xau", "engine": "rsi_secret", "symbol": "XAUUSD", "tf": "M30", "lot": 0.01, + "defaults": {"rsi_period": 16, "rsi_overbought": 72.5, "rsi_oversold": 32.5, + "stop_loss_atr": 2.75, "take_profit_atr": 5.0, "min_bars_between_trades": 7}, + "opt": {"rsi_overbought": (60, 80, 2), "rsi_oversold": (25, 45, 2), "stop_loss_atr": (1.5, 4, 0.5)}}, +] + +_RSI_SCALPS = [ + ("rsi_scalp_appl_unit", "AAPL", "M10", 25.0, {"rsi_period": 14, "rsi_overbought": 80, "rsi_oversold": 78, + "rsi_target_buy": 94, "rsi_target_sell": 44, "bars_to_wait": 7, "use_trailing": False}), + ("rsi_scalp_appl_trail", "AAPL", "H1", 25.0, {"rsi_period": 8, "rsi_overbought": 62, "rsi_oversold": 32, + "rsi_target_buy": 67, "rsi_target_sell": 2, "bars_to_wait": 5, "use_trailing": True, + "trail_distance_pts": 50, "trail_activation_pts": 39}), + ("rsi_scalp_adbe_trail", "ADBE", "H1", 5.0, {"rsi_period": 15, "rsi_overbought": 16, "rsi_oversold": 42, + "rsi_target_buy": 67, "rsi_target_sell": 62, "bars_to_wait": 8, "use_trailing": True, + "trail_distance_pts": 425, "trail_activation_pts": 18.5}), + ("rsi_scalp_btc_unit", "BTCUSD", "H1", 0.1, {"rsi_period": 14, "rsi_overbought": 90, "rsi_oversold": 73, + "rsi_target_buy": 88, "rsi_target_sell": 48, "bars_to_wait": 6, "use_trailing": False}), + ("rsi_scalp_btc_trail", "BTCUSD", "H1", 0.1, {"rsi_period": 14, "rsi_overbought": 90, "rsi_oversold": 73, + "rsi_target_buy": 88, "rsi_target_sell": 48, "bars_to_wait": 6, "use_trailing": True, + "trail_distance_pts": 120, "trail_activation_pts": 0}), + ("rsi_scalp_mu", "MU", "H1", 25.0, {"rsi_period": 14, "rsi_overbought": 32, "rsi_oversold": 86, + "rsi_target_buy": 100, "rsi_target_sell": 24, "bars_to_wait": 34, "use_trailing": False}), + ("rsi_scalp_nvda_unit", "NVDA", "H1", 25.0, {"rsi_period": 14, "rsi_overbought": 6, "rsi_oversold": 66, + "rsi_target_buy": 98, "rsi_target_sell": 52, "bars_to_wait": 12, "use_trailing": False}), + ("rsi_scalp_nvda_trail", "NVDA", "M15", 50.0, {"rsi_period": 8, "rsi_overbought": 36, "rsi_oversold": 38, + "rsi_target_buy": 90, "rsi_target_sell": 70, "bars_to_wait": 5, "use_trailing": True, + "trail_distance_pts": 375, "trail_activation_pts": 75}), + ("rsi_scalp_nvda_trail_v2", "NVDA", "M15", 50.0, {"rsi_period": 8, "rsi_overbought": 36, "rsi_oversold": 38, + "rsi_target_buy": 90, "rsi_target_sell": 70, "bars_to_wait": 5, "use_trailing": True, + "trail_distance_pts": 375, "trail_activation_pts": 75}), + ("rsi_scalp_tsla_unit", "TSLA", "H1", 25.0, {"rsi_period": 14, "rsi_overbought": 32, "rsi_oversold": 86, + "rsi_target_buy": 100, "rsi_target_sell": 24, "bars_to_wait": 34, "use_trailing": False}), + ("rsi_scalp_tsla_trail", "TSLA", "H1", 5.0, {"rsi_period": 14, "rsi_overbought": 54, "rsi_oversold": 73, + "rsi_target_buy": 87, "rsi_target_sell": 33, "bars_to_wait": 1, "use_trailing": True, + "trail_distance_pts": 900, "trail_activation_pts": 950}), + ("rsi_scalp_xau_trail", "XAUUSD", "H1", 0.1, {"rsi_period": 14, "rsi_overbought": 71, "rsi_oversold": 57, + "rsi_target_buy": 80, "rsi_target_sell": 57, "bars_to_wait": 1, "use_trailing": True, + "trail_distance_pts": 71, "trail_activation_pts": 41}), +] + +for sid, sym, tf, lot, defaults in _RSI_SCALPS: + STRATEGIES.append({ + "id": sid, + "engine": "rsi_scalp", + "symbol": sym, + "tf": tf, + "lot": lot, + "defaults": {**defaults, "tf": tf}, + "opt": { + "rsi_period": (6, 21, 1), + "rsi_overbought": (50, 90, 3), + "rsi_oversold": (10, 70, 3), + "rsi_target_buy": (60, 95, 3), + "rsi_target_sell": (5, 70, 3), + "bars_to_wait": (1, 8, 1), + "trail_distance_pts": (20, 400, 20), + }, + }) + +PERIODS = { + "2021-2026": ("2021-01-01", "2026-06-01"), + "2024-2026": ("2024-01-01", "2026-06-01"), +} diff --git a/backtesting/MT5/cluster_audit/sync_cluster.py b/backtesting/MT5/cluster_audit/sync_cluster.py new file mode 100644 index 0000000..c742556 --- /dev/null +++ b/backtesting/MT5/cluster_audit/sync_cluster.py @@ -0,0 +1,317 @@ +""" +Build cluster-latest SuperEA audit params from sequential JSON reports. + +Usage: + python -m cluster_audit.sync_cluster +""" + +from __future__ import annotations + +import json +from datetime import datetime +from pathlib import Path + +from cluster_audit.scoring import DEFAULT_TRADES_PER_DAY, acceptance, period_days, trades_per_day +from cluster_audit.strategy_registry import PERIODS, STRATEGIES + +REPORTS = Path(__file__).parent / "reports" / "sequential" +OUT_MQH = Path(__file__).resolve().parents[3] / "frontline" / "cluster-latest" / "SuperEA_AuditParams.mqh" +OUT_JSON = Path(__file__).parent / "reports" / "cluster_manifest.json" + +RSI_SCALP_IDS = [ + "rsi_scalp_appl_unit", "rsi_scalp_appl_trail", "rsi_scalp_adbe_trail", + "rsi_scalp_btc_unit", "rsi_scalp_btc_trail", "rsi_scalp_mu", + "rsi_scalp_nvda_unit", "rsi_scalp_nvda_trail", "rsi_scalp_nvda_trail_v2", + "rsi_scalp_tsla_unit", "rsi_scalp_tsla_trail", "rsi_scalp_xau_trail", +] +RSI_INDEX = {sid: i for i, sid in enumerate(RSI_SCALP_IDS)} + +MAGIC_MAP = {s["id"]: 401000 + i for i, s in enumerate(STRATEGIES, 1)} + + +def load_report(sid: str) -> dict | None: + p = REPORTS / f"{sid}_2021-2026.json" + if not p.exists(): + return None + return json.loads(p.read_text(encoding="utf-8")) + + +def spec_defaults(sid: str) -> dict: + for s in STRATEGIES: + if s["id"] == sid: + return dict(s["defaults"]) + return {} + + +def evaluate_report(r: dict, days: int) -> tuple[bool, list[str]]: + from cluster_audit.backtest_core import BacktestReport + + o = r.get("optimized", {}) + rep = BacktestReport( + strategy_id=r["id"], + symbol=r.get("symbol", ""), + timeframe=r.get("timeframe", "H1"), + period_label="2021-2026", + net_profit=float(o.get("net_profit", 0)), + total_trades=int(o.get("total_trades", 0)), + win_rate=float(o.get("win_rate", 0)), + profit_factor=float(o.get("profit_factor", 0)), + sharpe=float(o.get("sharpe", 0)), + max_drawdown_pct=float(o.get("max_drawdown_pct", 0)), + avg_win=float(o.get("avg_win", 0)), + avg_loss=float(o.get("avg_loss", 0)), + worst_trades=o.get("worst_trades", []), + losing_trades=o.get("losing_trades", []), + exit_reason_breakdown=o.get("exit_reason_breakdown", {}), + monthly_returns=o.get("monthly_returns", {}), + params=o.get("params", {}), + ) + if r.get("passed") is True: + ok, issues = acceptance(rep, days, DEFAULT_TRADES_PER_DAY) + if ok: + return True, [] + return acceptance(rep, days, DEFAULT_TRADES_PER_DAY) + + +def _lit_bool(v) -> str: + return "true" if v else "false" + + +def emit_darvas(params: dict, ok: bool) -> list[str]: + d = {**spec_defaults("darvas_xau"), **params} + return [ + "static void SE_AuditDarvas(DarvasBoxConfig &c)", + "{", + f" c.box_period = {int(d['box_period'])};", + f" c.box_deviation = {float(d['box_deviation'])};", + f" c.ma_period = {int(d['ma_period'])};", + f" c.trend_threshold = {float(d['trend_threshold'])};", + f" c.stop_loss_pts = {float(d['stop_loss_pts'])};", + f" c.take_profit_pts = {float(d['take_profit_pts'])};", + " c.box_timeframe = PERIOD_M15;", + " c.trend_timeframe = PERIOD_M15;", + " c.use_close_breakout = true;", + " c.require_volume_ma = false;", + "}", + f"static bool SE_AuditDarvasEnabled() {{ return {_lit_bool(ok)}; }}", + "", + ] + + +def emit_ema_slope(fn: str, params: dict, ok: bool) -> list[str]: + d = params + lines = [f"static void SE_Audit{fn}(EmaSlopeConfig &c)", "{"] + for key, cast in [ + ("ema_period", int), ("price_threshold_pips", float), ("slope_threshold_pips", float), + ("monitor_timeout_sec", int), ("trailing_stop_pips", float), + ("max_trades_per_crossover", int), ("profit_check_bars", int), + ("weekly_adx_period", int), ("weekly_adx_min", float), ("weekly_adx_bar_shift", int), + ]: + if key in d: + lines.append(f" c.{key} = {cast(d[key])};") + if "use_trailing_stop" in d: + lines.append(f" c.use_trailing_stop = {_lit_bool(d['use_trailing_stop'])};") + lines += ["}", f"static bool SE_Audit{fn}Enabled() {{ return {_lit_bool(ok)}; }}", ""] + return lines + + +def emit_mean_rev(params: dict, ok: bool) -> list[str]: + d = {**spec_defaults("mean_rev_btc"), **params} + return [ + "static void SE_AuditMeanRev(MeanReversionConfig &c)", + "{", + f" c.ema_period = {int(d.get('ema_period', 250))};", + f" c.min_ema_distance_pts = {float(d.get('min_ema_distance_pts', 3650))};", + f" c.rsi_period = {int(d.get('rsi_period', 28))};", + f" c.rsi_oversold = {float(d.get('rsi_oversold', 40))};", + f" c.rsi_overbought = {float(d.get('rsi_overbought', 83))};", + f" c.adx_period = {int(d.get('adx_period', 14))};", + f" c.adx_max_for_entry = {float(d.get('adx_max_for_entry', 17))};", + f" c.adx_escape = {float(d.get('adx_escape', 34))};", + f" c.use_rsi_cross = {_lit_bool(d.get('use_rsi_cross', True))};", + f" c.use_hard_sltp = {_lit_bool(d.get('use_hard_sltp', False))};", + f" c.sl_points = {float(d.get('sl_points', 1300))};", + f" c.tp_points = {float(d.get('tp_points', 13400))};", + "}", + f"static bool SE_AuditMeanRevEnabled() {{ return {_lit_bool(ok)}; }}", + "", + ] + + +def emit_rsi_cross(params: dict, ok: bool) -> list[str]: + d = {**spec_defaults("rsi_cross_xau"), **params} + return [ + "static void SE_AuditRsiCross(RsiCrossOverConfig &c)", + "{", + f" c.rsi_period = {int(d.get('rsi_period', 19))};", + f" c.overbought_level = {float(d.get('overbought_level', 93))};", + f" c.oversold_level = {float(d.get('oversold_level', 22))};", + f" c.ema_period = {int(d.get('ema_period', 140))};", + f" c.ema_slope_threshold = {float(d.get('ema_slope_threshold', 105))};", + f" c.ema_distance_threshold = {float(d.get('ema_distance_threshold', 165))};", + f" c.exit_buy_rsi = {float(d.get('exit_buy_rsi', 86))};", + f" c.exit_sell_rsi = {float(d.get('exit_sell_rsi', 10))};", + f" c.trailing_stop_pts = {float(d.get('trailing_stop_pts', 295))};", + f" c.cooldown_seconds = {int(d.get('cooldown_seconds', 209))};", + "}", + f"static bool SE_AuditRsiCrossEnabled() {{ return {_lit_bool(ok)}; }}", + "", + ] + + +def emit_rsi_asian(fn: str, params: dict, ok: bool) -> list[str]: + d = params + return [ + f"static void SE_Audit{fn}(RsiAsianConfig &c)", + "{", + f" c.rsi_period = {int(d.get('rsi_period', 28))};", + f" c.overbought_level = {float(d.get('overbought_level', 60))};", + f" c.oversold_level = {float(d.get('oversold_level', 8))};", + f" c.asian_session_start = {int(d.get('asian_session_start', 0))};", + f" c.asian_session_end = {int(d.get('asian_session_end', 8))};", + f" c.use_rsi_exit = {_lit_bool(d.get('use_rsi_exit', True))};", + f" c.rsi_exit_level = {float(d.get('rsi_exit_level', 55))};", + "}", + f"static bool SE_Audit{fn}Enabled() {{ return {_lit_bool(ok)}; }}", + "", + ] + + +def emit_rsi_secret(params: dict, ok: bool) -> list[str]: + d = {**spec_defaults("rsi_secret_xau"), **params} + return [ + "static void SE_AuditRsiSecret(RsiSecretSauceConfig &c)", + "{", + f" c.rsi_period = {int(d.get('rsi_period', 16))};", + f" c.rsi_overbought = {float(d.get('rsi_overbought', 72.5))};", + f" c.rsi_oversold = {float(d.get('rsi_oversold', 32.5))};", + f" c.stop_loss_atr = {float(d.get('stop_loss_atr', 2.75))};", + f" c.take_profit_atr = {float(d.get('take_profit_atr', 5.0))};", + f" c.min_bars_between_trades = {int(d.get('min_bars_between_trades', 7))};", + "}", + f"static bool SE_AuditRsiSecretEnabled() {{ return {_lit_bool(ok)}; }}", + "", + ] + + +def emit_rsi_scalp(idx: int, sid: str, params: dict, ok: bool) -> list[str]: + d = {**spec_defaults(sid), **params} + return [ + f"static void SE_AuditRsi{idx}(RsiScalpConfig &c)", + "{", + f" c.rsi_period = {int(d.get('rsi_period', 14))};", + f" c.rsi_overbought = {float(d.get('rsi_overbought', 70))};", + f" c.rsi_oversold = {float(d.get('rsi_oversold', 30))};", + f" c.rsi_target_buy = {float(d.get('rsi_target_buy', 80))};", + f" c.rsi_target_sell = {float(d.get('rsi_target_sell', 50))};", + f" c.bars_to_wait = {int(d.get('bars_to_wait', 5))};", + f" c.use_trailing = {_lit_bool(d.get('use_trailing', False))};", + f" c.trail_distance_pts = {float(d.get('trail_distance_pts', 0))};", + f" c.trail_activation_pts = {float(d.get('trail_activation_pts', 0))};", + "}", + f"static bool SE_AuditRsi{idx}Enabled() {{ return {_lit_bool(ok)}; }}", + "", + ] + + +def stub_enabled(name: str, ok: bool = False) -> list[str]: + return [f"static bool SE_Audit{name}Enabled() {{ return {_lit_bool(ok)}; }}", ""] + + +def main() -> None: + start, end = PERIODS["2021-2026"] + days = period_days(start, end) + manifest: dict = { + "generated": datetime.now().isoformat(), + "period_days": days, + "trades_per_day_target": DEFAULT_TRADES_PER_DAY, + "strategies": {}, + } + + reports: dict[str, dict] = {} + status: dict[str, bool] = {} + params_map: dict[str, dict] = {} + + for spec in STRATEGIES: + sid = spec["id"] + r = load_report(sid) + if not r: + manifest["strategies"][sid] = {"status": "no_report", "passed": False} + status[sid] = False + params_map[sid] = spec_defaults(sid) + continue + reports[sid] = r + params = r.get("optimized_params") or r.get("optimized", {}).get("params", spec_defaults(sid)) + params_map[sid] = params + ok, issues = evaluate_report(r, days) + o = r.get("optimized", {}) + tpd = trades_per_day( + type("R", (), {"total_trades": int(o.get("total_trades", 0))})(), + days, + ) + status[sid] = ok + manifest["strategies"][sid] = { + "passed": ok, + "magic": MAGIC_MAP.get(sid), + "trades": o.get("total_trades"), + "trades_per_day": round(tpd, 3), + "net_profit": o.get("net_profit"), + "sharpe": o.get("sharpe"), + "profit_factor": o.get("profit_factor"), + "issues": issues, + "params": params, + } + + lines = [ + "//+------------------------------------------------------------------+", + "//| SuperEA_AuditParams.mqh - optimized params from cluster audit |", + f"//| Generated: {datetime.now().isoformat()}", + "//+------------------------------------------------------------------+", + "#ifndef SUPER_EA_AUDIT_PARAMS_MQH", + "#define SUPER_EA_AUDIT_PARAMS_MQH", + "", + ] + + lines += [f"// darvas_xau: {'PASS' if status.get('darvas_xau') else 'DISABLED'}"] + lines += emit_darvas(params_map.get("darvas_xau", {}), status.get("darvas_xau", False)) + + lines += [f"// ema_slope_unit: {'PASS' if status.get('ema_slope_unit') else 'DISABLED'}"] + lines += emit_ema_slope("EmaUnit", params_map.get("ema_slope_unit", {}), status.get("ema_slope_unit", False)) + + lines += [f"// ema_slope_trail: {'PASS' if status.get('ema_slope_trail') else 'DISABLED'}"] + lines += emit_ema_slope("EmaTrail", params_map.get("ema_slope_trail", {}), status.get("ema_slope_trail", False)) + + lines += [f"// mean_rev_btc: {'PASS' if status.get('mean_rev_btc') else 'DISABLED'}"] + lines += emit_mean_rev(params_map.get("mean_rev_btc", {}), status.get("mean_rev_btc", False)) + + lines += [f"// rsi_cross_xau: {'PASS' if status.get('rsi_cross_xau') else 'DISABLED'}"] + lines += emit_rsi_cross(params_map.get("rsi_cross_xau", {}), status.get("rsi_cross_xau", False)) + + for sid, fn in [ + ("rsi_asian_eur", "RsiAsianEur"), + ("rsi_asian_aud", "RsiAsianAud"), + ("rsi_asian_gbp", "RsiAsianGbp"), + ]: + lines += [f"// {sid}: {'PASS' if status.get(sid) else 'DISABLED'}"] + lines += emit_rsi_asian(fn, params_map.get(sid, {}), status.get(sid, False)) + + lines += [f"// rsi_secret_xau: {'PASS' if status.get('rsi_secret_xau') else 'DISABLED'}"] + lines += emit_rsi_secret(params_map.get("rsi_secret_xau", {}), status.get("rsi_secret_xau", False)) + + for sid in RSI_SCALP_IDS: + idx = RSI_INDEX[sid] + lines += [f"// {sid}: {'PASS' if status.get(sid) else 'DISABLED'}"] + lines += emit_rsi_scalp(idx, sid, params_map.get(sid, {}), status.get(sid, False)) + + lines += ["#endif", ""] + OUT_MQH.parent.mkdir(parents=True, exist_ok=True) + OUT_MQH.write_text("\n".join(lines), encoding="utf-8") + OUT_JSON.write_text(json.dumps(manifest, indent=2), encoding="utf-8") + passed = [k for k, v in status.items() if v] + print(f"Wrote {OUT_MQH}") + print(f"Wrote {OUT_JSON}") + print(f"Passed {len(passed)}/{len(STRATEGIES)}: {', '.join(passed) if passed else '(none)'}") + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/sync_united.py b/backtesting/MT5/cluster_audit/sync_united.py new file mode 100644 index 0000000..0d5756c --- /dev/null +++ b/backtesting/MT5/cluster_audit/sync_united.py @@ -0,0 +1,209 @@ +""" +Sync United EA audit results into main.mq5 defaults and generate .set file. + +Usage: + python -m cluster_audit.sync_united +""" + +from __future__ import annotations + +import json +import re +from datetime import datetime +from pathlib import Path + +from cluster_audit.scoring import DEFAULT_TRADES_PER_DAY, acceptance, period_days, trades_per_day +from cluster_audit.united_registry import PERIODS, UNITED_STRATEGIES + +REPORTS = Path(__file__).parent / "reports" / "united_sequential" +MAIN_MQ5 = Path(__file__).resolve().parents[3] / "frontline" / "cluster-latest" / "main.mq5" +OUT_SET = Path(__file__).resolve().parents[3] / "frontline" / "cluster-latest" / "UnitedEA_Optimized.set" +OUT_JSON = REPORTS / "united_manifest.json" + +# main.mq5 input name -> (strategy_id, param_key in optimized JSON) +PARAM_PATCHES: dict[str, tuple[str, str]] = { + "DB_BoxPeriod": ("united_darvas", "box_period"), + "DB_BoxDeviation": ("united_darvas", "box_deviation"), + "DB_StopLoss": ("united_darvas", "stop_loss_pts"), + "DB_TakeProfit": ("united_darvas", "take_profit_pts"), + "DB_MA_Period": ("united_darvas", "ma_period"), + "DB_TrendThreshold": ("united_darvas", "trend_threshold"), + "RC_overboughtLevel": ("united_rsi_cross", "overbought_level"), + "RC_oversoldLevel": ("united_rsi_cross", "oversold_level"), + "RC_emaSlopeThreshold": ("united_rsi_cross", "ema_slope_threshold"), + "RC_emaDistanceThreshold": ("united_rsi_cross", "ema_distance_threshold"), + "RS_APPL_RSI_Period": ("united_rsi_scalp_appl", "rsi_period"), + "RS_APPL_RSI_Overbought": ("united_rsi_scalp_appl", "rsi_overbought"), + "RS_APPL_RSI_Oversold": ("united_rsi_scalp_appl", "rsi_oversold"), + "RS_APPL_RSI_Target_Buy": ("united_rsi_scalp_appl", "rsi_target_buy"), + "RS_APPL_RSI_Target_Sell": ("united_rsi_scalp_appl", "rsi_target_sell"), + "RS_APPL_BarsToWait": ("united_rsi_scalp_appl", "bars_to_wait"), + "RS_APPL_TrailDistancePoints": ("united_rsi_scalp_appl", "trail_distance_pts"), + "RS_APPL_TrailActivationPoints": ("united_rsi_scalp_appl", "trail_activation_pts"), + "RS_BTCUSD_RSI_Period": ("united_rsi_scalp_btc", "rsi_period"), + "RS_BTCUSD_TrailDistancePoints": ("united_rsi_scalp_btc", "trail_distance_pts"), + "RS_XAUUSD_RSI_Period": ("united_rsi_scalp_xau", "rsi_period"), + "RS_XAUUSD_TrailDistancePoints": ("united_rsi_scalp_xau", "trail_distance_pts"), + "RRA_EURUSD_OverboughtLevel": ("united_rsi_asian_eur", "overbought_level"), + "RRA_EURUSD_OversoldLevel": ("united_rsi_asian_eur", "oversold_level"), + "RSS_RSIOverbought": ("united_rsi_secret", "rsi_overbought"), + "RSS_RSIOversold": ("united_rsi_secret", "rsi_oversold"), + "UB_MinRangePoints": ("united_usdjpy", "min_range_pts"), + "UB_OrderBufferPoints": ("united_usdjpy", "order_buffer_pts"), +} + +ENABLE_PATCHES: dict[str, str] = {s["enable_key"]: s["id"] for s in UNITED_STRATEGIES} + + +def load_report(sid: str) -> dict | None: + p = REPORTS / f"{sid}_2021-2026.json" + if not p.exists(): + # fallback cluster audit darvas + alt = Path(__file__).parent / "reports" / "sequential" / "darvas_xau_2021-2026.json" + if sid == "united_darvas" and alt.exists(): + r = json.loads(alt.read_text(encoding="utf-8")) + r["id"] = sid + return r + return None + return json.loads(p.read_text(encoding="utf-8")) + + +def evaluate(r: dict, days: int) -> tuple[bool, list[str]]: + from cluster_audit.backtest_core import BacktestReport + + o = r.get("optimized", {}) + rep = BacktestReport( + strategy_id=r["id"], + symbol=r.get("symbol", ""), + timeframe=r.get("timeframe", "H1"), + period_label="2021-2026", + net_profit=float(o.get("net_profit", 0)), + total_trades=int(o.get("total_trades", 0)), + win_rate=float(o.get("win_rate", 0)), + profit_factor=float(o.get("profit_factor", 0)), + sharpe=float(o.get("sharpe", 0)), + max_drawdown_pct=float(o.get("max_drawdown_pct", 0)), + avg_win=float(o.get("avg_win", 0)), + avg_loss=float(o.get("avg_loss", 0)), + worst_trades=o.get("worst_trades", []), + losing_trades=o.get("losing_trades", []), + exit_reason_breakdown=o.get("exit_reason_breakdown", {}), + monthly_returns=o.get("monthly_returns", {}), + params=o.get("params", {}), + ) + return acceptance(rep, days, DEFAULT_TRADES_PER_DAY) + + +def patch_main_mqh(text: str, manifest: dict) -> str: + params_by_sid = {k: v.get("params", {}) for k, v in manifest["strategies"].items()} + + for input_name, (sid, pkey) in PARAM_PATCHES.items(): + params = params_by_sid.get(sid, {}) + if pkey not in params: + continue + val = params[pkey] + if isinstance(val, bool): + lit = "true" if val else "false" + elif isinstance(val, float): + lit = str(val) if "." in str(val) else f"{val}.0" + else: + lit = str(val) + text, n = re.subn( + rf"(^input\s+\w+\s+{re.escape(input_name)}\s*=\s*)[^;]+;", + rf"\g<1>{lit};", + text, + count=1, + flags=re.MULTILINE, + ) + if n: + print(f" patched {input_name}={lit}") + + for enable_key, sid in ENABLE_PATCHES.items(): + info = manifest["strategies"].get(sid, {}) + if info.get("status") == "no_report" or "passed" not in info: + continue + if not info.get("passed"): + continue # keep main.mq5 enable flags; only auto-enable winners + lit = "true" + text, n = re.subn( + rf"(^input bool {re.escape(enable_key)}\s*=\s*)[^;]+;", + rf"\g<1>{lit};", + text, + count=1, + flags=re.MULTILINE, + ) + if n: + print(f" enable {enable_key}={lit}") + + return text + + +def write_set_file(manifest: dict) -> None: + lines = [ + "; UnitedEA_Optimized.set — generated from united sequential audit", + f"; {datetime.now().isoformat()}", + "", + ] + for spec in UNITED_STRATEGIES: + sid = spec["id"] + info = manifest["strategies"].get(sid, {}) + passed = info.get("passed", False) + lines.append(f"; {sid}: {'PASS' if passed else 'DISABLED'}") + lines.append(f"{spec['enable_key']}={'true' if passed else 'false'}") + lines.append(f"{spec['lot_key']}={spec['lot']}") + for k, v in info.get("params", {}).items(): + lines.append(f"; {k}={v}") + lines.append("") + OUT_SET.write_text("\n".join(lines), encoding="utf-8") + + +def main() -> None: + start, end = PERIODS["2021-2026"] + days = period_days(start, end) + manifest: dict = { + "generated": datetime.now().isoformat(), + "period_days": days, + "strategies": {}, + } + + for spec in UNITED_STRATEGIES: + sid = spec["id"] + r = load_report(sid) + if not r: + manifest["strategies"][sid] = {"passed": False, "status": "no_report"} + continue + params = r.get("optimized_params") or r.get("optimized", {}).get("params", {}) + ok, issues = evaluate(r, days) + o = r.get("optimized", {}) + manifest["strategies"][sid] = { + "passed": ok, + "enable_key": spec["enable_key"], + "lot_key": spec["lot_key"], + "lot": spec["lot"], + "trades": o.get("total_trades"), + "trades_per_day": round(trades_per_day( + type("R", (), {"total_trades": int(o.get("total_trades", 0))})(), days), 3), + "net_profit": o.get("net_profit"), + "profit_factor": o.get("profit_factor"), + "sharpe": o.get("sharpe"), + "issues": issues, + "params": params, + } + + if MAIN_MQ5.exists(): + text = MAIN_MQ5.read_text(encoding="utf-8") + print(f"Patching {MAIN_MQ5}") + text = patch_main_mqh(text, manifest) + MAIN_MQ5.write_text(text, encoding="utf-8") + + REPORTS.mkdir(parents=True, exist_ok=True) + OUT_JSON.write_text(json.dumps(manifest, indent=2), encoding="utf-8") + write_set_file(manifest) + passed = [k for k, v in manifest["strategies"].items() if v.get("passed")] + print(f"Wrote {OUT_JSON}") + print(f"Wrote {OUT_SET}") + print(f"Passed {len(passed)}/{len(UNITED_STRATEGIES)}: {', '.join(passed) if passed else '(none)'}") + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/cluster_audit/trace_log.py b/backtesting/MT5/cluster_audit/trace_log.py new file mode 100644 index 0000000..ba8552f --- /dev/null +++ b/backtesting/MT5/cluster_audit/trace_log.py @@ -0,0 +1,85 @@ +"""Timestamped trace logging for cluster audit runs.""" + +from __future__ import annotations + +import sys +import time +from datetime import datetime + + +class TraceLog: + def __init__(self, enabled: bool = True, trial_every: int = 10) -> None: + self.enabled = enabled + self.trial_every = max(1, trial_every) + self._t0 = time.perf_counter() + self._phase_t0 = self._t0 + + def _ts(self) -> str: + return datetime.now().strftime("%H:%M:%S") + + def _elapsed(self) -> str: + return f"{time.perf_counter() - self._t0:.1f}s" + + def _phase_elapsed(self) -> str: + return f"{time.perf_counter() - self._phase_t0:.1f}s" + + def _write(self, level: str, msg: str) -> None: + if not self.enabled: + return + line = f"[{self._ts()} +{self._elapsed()}] [{level}] {msg}" + print(line, flush=True) + + def phase_start(self, name: str) -> None: + self._phase_t0 = time.perf_counter() + self._write("PHASE", f">> {name}") + + def phase_end(self, name: str, detail: str = "") -> None: + suffix = f" -- {detail}" if detail else "" + self._write("PHASE", f"OK {name} ({self._phase_elapsed()}){suffix}") + + def info(self, msg: str) -> None: + self._write("INFO", msg) + + def debug(self, msg: str) -> None: + self._write("DEBUG", msg) + + def warn(self, msg: str) -> None: + self._write("WARN", msg) + + def error(self, msg: str) -> None: + self._write("ERROR", msg) + + def banner(self, msg: str) -> None: + if not self.enabled: + return + bar = "=" * min(72, max(len(msg) + 4, 40)) + print(f"\n{bar}\n {msg}\n{bar}", flush=True) + + def progress(self, current: int, total: int, label: str) -> None: + pct = (100.0 * current / total) if total else 0.0 + self._write("PROGRESS", f"[{current}/{total} {pct:.0f}%] {label}") + + def trial(self, n: int, total: int, score: float, net: float, sharpe: float, improved: bool) -> None: + if n % self.trial_every != 0 and n != total and not improved: + return + flag = " ** NEW BEST" if improved else "" + score_s = "N/A" if score == float("-inf") else f"{score:.2f}" + self._write( + "TRIAL", + f"{n}/{total} score={score_s} net=${net:.0f} sharpe={sharpe:.2f}{flag}", + ) + + def report_line(self, strategy_id: str, baseline: dict, optimized: dict, bars: int) -> None: + b, o = baseline, optimized + self._write( + "RESULT", + f"{strategy_id}: bars={bars} | " + f"base net=${b['net_profit']:.0f} sh={b['sharpe']:.2f} trades={b['total_trades']} dd={b['max_drawdown_pct']:.1f}% | " + f"opt net=${o['net_profit']:.0f} sh={o['sharpe']:.2f} trades={o['total_trades']} dd={o['max_drawdown_pct']:.1f}%", + ) + if b.get("worst_trades"): + w = b["worst_trades"][0] + self.debug( + f" worst loss: ${w['profit']:.2f} {w['side']} {w['exit_reason']} " + f"({w['open_time']} -> {w['close_time']})" + ) diff --git a/backtesting/MT5/cluster_audit/tweak_manifest.py b/backtesting/MT5/cluster_audit/tweak_manifest.py new file mode 100644 index 0000000..2a00e59 --- /dev/null +++ b/backtesting/MT5/cluster_audit/tweak_manifest.py @@ -0,0 +1,148 @@ +"""Per-strategy 'small trick' candidates for elimination audits.""" + +from __future__ import annotations + +# Each trick: human label + param overrides (applied on top of 123.set solo baseline). +STRATEGY_TWEAKS: dict[str, list[dict]] = { + "DB": [ + {"name": "close_on", "params": {"DB_CloseUnprofitableOnNewSignal": True}}, + {"name": "tighter_sl", "params": {"DB_StopLoss": 1400}}, + {"name": "wider_tp", "params": {"DB_TakeProfit": 4200}}, + {"name": "shorter_box", "params": {"DB_BoxPeriod": 140}}, + {"name": "no_volume_filter", "params": {"DB_UseVolumeSpikeFilter": False}}, + {"name": "lower_trend_thresh", "params": {"DB_TrendThreshold": 3.8}}, + ], + "ES": [ + {"name": "tighter_trail", "params": {"ES_TrailingStop": 280}}, + {"name": "wider_trail", "params": {"ES_TrailingStop": 420}}, + {"name": "faster_profit_check", "params": {"ES_ProfitCheckBars": 12}}, + {"name": "stale_sl_exit", "params": {"ES_UseStaleStopLossExit": True}}, + {"name": "lower_adx_gate", "params": {"ES_WeeklyADXMin": 35}}, + {"name": "more_trades_per_x", "params": {"ES_MaxTradesPerCrossover": 12}}, + ], + "RC": [ + {"name": "close_on", "params": {"RC_CloseUnprofitableOnNewSignal": True}}, + {"name": "short_cooldown", "params": {"RC_cooldownSeconds": 120}}, + {"name": "long_cooldown", "params": {"RC_cooldownSeconds": 300}}, + {"name": "tighter_trail", "params": {"RC_TrailingStop": 220}}, + {"name": "looser_ema_slope", "params": {"RC_emaSlopeThreshold": 90}}, + {"name": "rsi_exit_tighter", "params": {"RC_exitBuyRSI": 82, "RC_exitSellRSI": 14}}, + ], + "RM": [ + {"name": "close_on", "params": {"RM_CloseUnprofitableOnNewSignal": True}}, + {"name": "short_reverse_cd", "params": {"RM_InpRSIReverseCooldownBars": 8}}, + {"name": "ema_cross_only", "params": {"RM_InpEnableRSIFollow": False, "RM_InpEnableRSIReverse": False}}, + {"name": "rsi_follow_only", "params": {"RM_InpEnableRSIReverse": False, "RM_InpEnableEMACross": False}}, + {"name": "tighter_ema_dist", "params": {"RM_InpEMADistancePips": 120}}, + {"name": "close_outside_hours", "params": {"RM_InpRSIFollowCloseOutsideHours": True}}, + ], + "RS_APPL": [ + {"name": "close_on", "params": {"RS_APPL_CloseUnprofitableOnNewSignal": True}}, + {"name": "faster_bars", "params": {"RS_APPL_BarsToWait": 5}}, + {"name": "trail_activate_50", "params": {"RS_APPL_TrailActivationPoints": 50}}, + {"name": "tighter_trail", "params": {"RS_APPL_TrailDistancePoints": 80}}, + {"name": "wider_targets", "params": {"RS_APPL_RSI_Target_Buy": 92, "RS_APPL_RSI_Target_Sell": 40}}, + ], + "RS_ADBE": [ + {"name": "close_on", "params": {"RS_ADBE_CloseUnprofitableOnNewSignal": True}}, + {"name": "faster_bars", "params": {"RS_ADBE_BarsToWait": 6}}, + {"name": "trail_activate_10", "params": {"RS_ADBE_TrailActivationPoints": 10}}, + {"name": "tighter_trail", "params": {"RS_ADBE_TrailDistancePoints": 350}}, + ], + "RS_BTCUSD": [ + {"name": "close_on", "params": {"RS_BTCUSD_CloseUnprofitableOnNewSignal": True}}, + {"name": "faster_bars", "params": {"RS_BTCUSD_BarsToWait": 4}}, + {"name": "trail_activate_30", "params": {"RS_BTCUSD_TrailActivationPoints": 30}}, + {"name": "tighter_trail", "params": {"RS_BTCUSD_TrailDistancePoints": 90}}, + {"name": "reversal_escape_off", "params": {"RS_UseReversalEscape": False}}, + ], + "RS_NVDA": [ + {"name": "close_on", "params": {"RS_NVDA_CloseUnprofitableOnNewSignal": True}}, + {"name": "faster_bars", "params": {"RS_NVDA_BarsToWait": 3}}, + {"name": "tighter_trail", "params": {"RS_NVDA_TrailDistancePoints": 280}}, + {"name": "lower_trail_act", "params": {"RS_NVDA_TrailActivationPoints": 50}}, + {"name": "wider_ob_os", "params": {"RS_NVDA_RSI_Overbought": 40, "RS_NVDA_RSI_Oversold": 35}}, + ], + "RS_TSLA": [ + {"name": "faster_bars", "params": {"RS_TSLA_BarsToWait": 2}}, + {"name": "trail_act_400", "params": {"RS_TSLA_TrailActivationPoints": 400}}, + {"name": "trail_act_600", "params": {"RS_TSLA_TrailActivationPoints": 600}}, + {"name": "tighter_trail", "params": {"RS_TSLA_TrailDistancePoints": 700}}, + {"name": "wider_trail", "params": {"RS_TSLA_TrailDistancePoints": 1100}}, + ], + "RS_XAUUSD": [ + {"name": "faster_bars", "params": {"RS_XAUUSD_BarsToWait": 3}}, + {"name": "lower_trail_act", "params": {"RS_XAUUSD_TrailActivationPoints": 25}}, + {"name": "tighter_trail", "params": {"RS_XAUUSD_TrailDistancePoints": 55}}, + {"name": "wider_trail", "params": {"RS_XAUUSD_TrailDistancePoints": 90}}, + {"name": "reversal_escape_off", "params": {"RS_UseReversalEscape": False}}, + ], + "RS_MU": [ + {"name": "close_on", "params": {"RS_MU_CloseUnprofitableOnNewSignal": True}}, + {"name": "faster_bars", "params": {"RS_MU_BarsToWait": 20}}, + {"name": "symbol_munas", "params": {"RS_MU_Symbol": "MU.NAS"}}, + {"name": "symbol_muus", "params": {"RS_MU_Symbol": "MU.US"}}, + {"name": "looser_ob_os", "params": {"RS_MU_RSI_Overbought": 40, "RS_MU_RSI_Oversold": 75}}, + ], + "SE": [ + {"name": "close_on", "params": {"SE_CloseUnprofitableOnNewSignal": True}}, + {"name": "exit_trend_flip", "params": {"SE_ExitOnTrendFlip": True}}, + {"name": "shorter_hold", "params": {"SE_MaxHoldingBars": 120}}, + {"name": "longer_hold", "params": {"SE_MaxHoldingBars": 220}}, + {"name": "structural_sl", "params": {"SE_UseStructuralSL": True}}, + {"name": "cci_looser", "params": {"SE_CciOversold": -120}}, + ], + "RCO": [ + {"name": "close_on", "params": {"RCO_CloseUnprofitableOnNewSignal": True}}, + {"name": "higher_adx_cap", "params": {"RCO_ADX_Max": 32}}, + {"name": "tighter_sl", "params": {"RCO_SL_ATR_Mult": 1.9}}, + {"name": "wider_tp", "params": {"RCO_TP_ATR_Mult": 2.7}}, + {"name": "shorter_max_bars", "params": {"RCO_MaxBarsInTrade": 40}}, + ], + "RRA_EUR": [ + {"name": "close_on", "params": {"RRA_EURUSD_CloseUnprofitableOnNewSignal": True}}, + {"name": "shorter_duration", "params": {"RRA_EURUSD_MaxDuration": 200}}, + {"name": "close_outside", "params": {"RRA_EURUSD_CloseOutsideSession": True}}, + {"name": "rsi_exit_50", "params": {"RRA_EURUSD_RSIExitLevel": 50}}, + {"name": "tighter_os", "params": {"RRA_EURUSD_OversoldLevel": 12}}, + ], + "RRA_AUD": [ + {"name": "close_on", "params": {"RRA_AUDUSD_CloseUnprofitableOnNewSignal": True}}, + {"name": "shorter_duration", "params": {"RRA_AUDUSD_MaxDuration": 250}}, + {"name": "no_close_outside", "params": {"RRA_AUDUSD_CloseOutsideSession": False}}, + {"name": "tighter_os", "params": {"RRA_AUDUSD_OversoldLevel": 28}}, + {"name": "rsi_exit_45", "params": {"RRA_AUDUSD_RSIExitLevel": 45}}, + ], + "ST_BTC": [ + {"name": "close_on", "params": {"ST_BTC_CloseUnprofitableOnNewSignal": True}}, + {"name": "tighter_break", "params": {"ST_BTC_BreakBuffer": 70}}, + {"name": "looser_touch", "params": {"ST_BTC_LineTouchTolerance": 150}}, + {"name": "longer_ma", "params": {"ST_BTC_MAPeriod": 180}}, + ], + "ST_XAU": [ + {"name": "close_on", "params": {"ST_XAU_CloseUnprofitableOnNewSignal": True}}, + {"name": "tighter_break", "params": {"ST_XAU_BreakBuffer": 90}}, + {"name": "shorter_ma", "params": {"ST_XAU_MAPeriod": 55}}, + {"name": "looser_touch", "params": {"ST_XAU_LineTouchTolerance": 260}}, + ], + "ST_GER": [ + {"name": "close_on", "params": {"ST_GER_CloseUnprofitableOnNewSignal": True}}, + {"name": "tighter_break", "params": {"ST_GER_BreakBuffer": 60}}, + {"name": "looser_touch", "params": {"ST_GER_LineTouchTolerance": 120}}, + {"name": "longer_ma", "params": {"ST_GER_MAPeriod": 80}}, + ], + "RSS": [ + {"name": "close_on", "params": {"RSS_CloseUnprofitableOnNewSignal": True}}, + {"name": "swing_sl", "params": {"RSS_UseSwingStopLoss": True}}, + {"name": "shorter_cooldown", "params": {"RSS_MinBarsBetweenTrades": 4}}, + {"name": "tighter_sl_atr", "params": {"RSS_StopLossATR": 2.2}}, + ], + "UB": [ + {"name": "close_on", "params": {"UB_CloseUnprofitableOnNewSignal": True}}, + {"name": "min_range_12", "params": {"UB_MinRangePoints": 12}}, + {"name": "order_buf_35", "params": {"UB_OrderBufferPoints": 3.5}}, + {"name": "first_trade_only", "params": {"UB_FirstTradeOnly": True}}, + {"name": "wider_range", "params": {"UB_MinRangePoints": 18}}, + {"name": "tighter_buffer", "params": {"UB_OrderBufferPoints": 3.0}}, + ], +} diff --git a/backtesting/MT5/cluster_audit/united_mt5_manifest.py b/backtesting/MT5/cluster_audit/united_mt5_manifest.py new file mode 100644 index 0000000..a2cf8cf --- /dev/null +++ b/backtesting/MT5/cluster_audit/united_mt5_manifest.py @@ -0,0 +1,112 @@ +"""United EA sub-strategy manifest for MT5 solo audits (123.set).""" + +from __future__ import annotations + +UNITED_MT5_STRATEGIES: list[dict] = [ + {"id": "DB", "name": "DarvasBox", "enable": "EnableDarvasBox", "close": "DB_CloseUnprofitableOnNewSignal", "lot": "LOT_DB_DarvasBox"}, + {"id": "ES", "name": "EMASlopeDistance", "enable": "EnableEMASlopeDistance", "close": "ES_CloseUnprofitableOnNewSignal", "lot": "LOT_ES_EMASlopeDistance"}, + {"id": "RC", "name": "RSICrossOverReversal", "enable": "EnableRSICrossOverReversal", "close": "RC_CloseUnprofitableOnNewSignal", "lot": "LOT_RC_RSICrossOver"}, + {"id": "RM", "name": "RSIMidPointHijack", "enable": "EnableRSIMidPointHijack", "close": "RM_CloseUnprofitableOnNewSignal", "lot": "LOT_RM_RSIMidPointHijack"}, + {"id": "RS_APPL", "name": "RSIScalping APPL", "enable": "EnableRSIScalpingAPPL", "close": "RS_APPL_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_APPL", "test_symbol": "AAPL.NAS", "lot_class": "stock"}, + {"id": "RS_ADBE", "name": "RSIScalping ADBE", "enable": "EnableRSIScalpingADBE", "close": "RS_ADBE_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_ADBE", "test_symbol": "ADBE.NAS", "lot_class": "stock"}, + {"id": "RS_BTCUSD", "name": "RSIScalping BTCUSD", "enable": "EnableRSIScalpingBTCUSD", "close": "RS_BTCUSD_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_BTCUSD"}, + {"id": "RS_NVDA", "name": "RSIScalping NVDA", "enable": "EnableRSIScalpingNVDA", "close": "RS_NVDA_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_NVDA", "test_symbol": "NVDA.NAS", "lot_class": "stock"}, + {"id": "RS_TSLA", "name": "RSIScalping TSLA", "enable": "EnableRSIScalpingTSLA", "close": "RS_TSLA_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_TSLA", "test_symbol": "TSLA.NAS", "lot_class": "stock"}, + {"id": "RS_XAUUSD", "name": "RSIScalping XAUUSD", "enable": "EnableRSIScalpingXAUUSD", "close": "RS_XAUUSD_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_XAUUSD"}, + {"id": "RS_MU", "name": "RSIScalping MU", "enable": "EnableRSIScalpingMU", "close": "RS_MU_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_MU"}, + {"id": "SE", "name": "SuperEMA", "enable": "EnableSuperEMA", "close": "SE_CloseUnprofitableOnNewSignal", "lot": "LOT_SE_SuperEMA"}, + {"id": "RCO", "name": "RSIConsolidation", "enable": "EnableRSIConsolidation", "close": "RCO_CloseUnprofitableOnNewSignal", "lot": "LOT_RCO_RSIConsolidation"}, + {"id": "RRA_EUR", "name": "RSI Asian EURUSD", "enable": "EnableRSIReversalAsianEURUSD", "close": "RRA_EURUSD_CloseUnprofitableOnNewSignal", "lot": "LOT_RRA_EURUSD"}, + {"id": "RRA_AUD", "name": "RSI Asian AUDUSD", "enable": "EnableRSIReversalAsianAUDUSD", "close": "RRA_AUDUSD_CloseUnprofitableOnNewSignal", "lot": "LOT_RRA_AUDUSD"}, + {"id": "ST_BTC", "name": "SimpleTrendline BTC", "enable": "EnableSimpleTrendlineBTCUSD", "close": "ST_BTC_CloseUnprofitableOnNewSignal", "lot": "LOT_ST_BTCUSD"}, + {"id": "ST_XAU", "name": "SimpleTrendline XAU", "enable": "EnableSimpleTrendlineXAUUSD", "close": "ST_XAU_CloseUnprofitableOnNewSignal", "lot": "LOT_ST_XAUUSD"}, + {"id": "ST_GER", "name": "SimpleTrendline GER40", "enable": "EnableSimpleTrendlineGER40", "close": "ST_GER_CloseUnprofitableOnNewSignal", "lot": "LOT_ST_GER40"}, + {"id": "RSS", "name": "RSISecretSauce", "enable": "EnableRSISecretSauce", "close": "RSS_CloseUnprofitableOnNewSignal", "lot": "LOT_RSS_SecretSauce"}, + {"id": "UB", "name": "USDJPYBuster", "enable": "EnableUSDJPYBuster", "close": "UB_CloseUnprofitableOnNewSignal", "lot": "LOT_UB_USDJPY"}, + {"id": "XBT", "name": "XAUBearTrend", "enable": "EnableXAUBearTrend", "close": "XBT_CloseUnprofitableOnNewSignal", "lot": "LOT_XBT_XAUUSD"}, + {"id": "XMB", "name": "XAUMomentumBreakdown", "enable": "EnableXAUMomentumBreakdown", "close": "XMB_CloseUnprofitableOnNewSignal", "lot": "LOT_XMB_XAUUSD"}, + {"id": "RRA_GBP", "name": "RSI Asian GBPUSD", "enable": "EnableRSIReversalAsianGBPUSD", "close": "RRA_GBPUSD_CloseUnprofitableOnNewSignal", "lot": "LOT_RRA_GBPUSD"}, + {"id": "GB", "name": "GER40Buster", "enable": "EnableGER40Buster", "close": "GB_CloseUnprofitableOnNewSignal", "lot": "LOT_GB_GER40"}, + {"id": "RS_NAS100", "name": "RSIScalping NAS100", "enable": "EnableRSIScalpingNAS100", "close": "RS_NAS100_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_NAS100"}, + {"id": "RS_US500", "name": "RSIScalping US500", "enable": "EnableRSIScalpingUS500", "close": "RS_US500_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_US500"}, + {"id": "RRA_USDCHF", "name": "RSI Asian USDCHF", "enable": "EnableRSIReversalAsianUSDCHF", "close": "RRA_USDCHF_CloseUnprofitableOnNewSignal", "lot": "LOT_RRA_USDCHF"}, + {"id": "RRA_NZDUSD", "name": "RSI Asian NZDUSD", "enable": "EnableRSIReversalAsianNZDUSD", "close": "RRA_NZDUSD_CloseUnprofitableOnNewSignal", "lot": "LOT_RRA_NZDUSD"}, + {"id": "NB", "name": "NAS100Buster", "enable": "EnableNAS100Buster", "close": "NB_CloseUnprofitableOnNewSignal", "lot": "LOT_NB_NAS100"}, + {"id": "U5B", "name": "US500Buster", "enable": "EnableUS500Buster", "close": "U5B_CloseUnprofitableOnNewSignal", "lot": "LOT_U5B_US500"}, + {"id": "RS_US30", "name": "RSIScalping US30", "enable": "EnableRSIScalpingUS30", "close": "RS_US30_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_US30"}, + {"id": "RS_XAGUSD", "name": "RSIScalping XAGUSD", "enable": "EnableRSIScalpingXAGUSD", "close": "RS_XAGUSD_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_XAGUSD"}, + {"id": "RS_EURJPY", "name": "RSIScalping EURJPY", "enable": "EnableRSIScalpingEURJPY", "close": "RS_EURJPY_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_EURJPY"}, + {"id": "RS_GBPJPY", "name": "RSIScalping GBPJPY", "enable": "EnableRSIScalpingGBPJPY", "close": "RS_GBPJPY_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_GBPJPY"}, + {"id": "U30B", "name": "US30Buster", "enable": "EnableUS30Buster", "close": "U30B_CloseUnprofitableOnNewSignal", "lot": "LOT_U30B_US30"}, + {"id": "UKB", "name": "UK100Buster", "enable": "EnableUK100Buster", "close": "UKB_CloseUnprofitableOnNewSignal", "lot": "LOT_UKB_UK100"}, + {"id": "XGB", "name": "XAGUSDBuster", "enable": "EnableXAGUSDBuster", "close": "XGB_CloseUnprofitableOnNewSignal", "lot": "LOT_XGB_XAGUSD"}, + {"id": "RS_F", "name": "RSIScalping F", "enable": "EnableRSIScalpingF", "close": "RS_F_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_F", "test_symbol": "F.NYS"}, + {"id": "RS_SOFI", "name": "RSIScalping SOFI", "enable": "EnableRSIScalpingSOFI", "close": "RS_SOFI_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_SOFI", "test_symbol": "SOFI.NAS"}, + {"id": "RS_SNAP", "name": "RSIScalping SNAP", "enable": "EnableRSIScalpingSNAP", "close": "RS_SNAP_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_SNAP", "test_symbol": "SNAP.NYS"}, + {"id": "RS_WBD", "name": "RSIScalping WBD", "enable": "EnableRSIScalpingWBD", "close": "RS_WBD_CloseUnprofitableOnNewSignal", "lot": "LOT_RS_WBD", "test_symbol": "WBD.NAS"}, +] + +ALL_ENABLE_KEYS = [s["enable"] for s in UNITED_MT5_STRATEGIES] + +# Round-1 expansion (retired except survivor). +EXPANSION_RETIRED_IDS = ( + "XBT", "XMB", "RRA_GBP", "GB", "RS_US500", "RRA_USDCHF", "RRA_NZDUSD", "NB", "U5B", +) + +# Survivor kept on baseline + enhanced. +SURVIVOR_IDS = ("RS_NAS100", "RS_US30", "UKB") + +# Round-2 candidates (audited; non-survivors stay off). +ROUND2_IDS = ( + "RS_US30", "RS_XAGUSD", "RS_EURJPY", "RS_GBPJPY", "U30B", "UKB", "XGB", +) + +# Round-3 low-margin stock candidates (~$1–2 margin per share @ 5% leverage). +ROUND3_IDS = ("RS_F", "RS_SOFI", "RS_SNAP", "RS_WBD") + +# High share-price stocks — force off in expansion audits (margin call risk). +HIGH_MARGIN_STOCK_ENABLES = ("EnableRSIScalpingMU",) + +# Production cluster (matches main.mq5 defaults). +PRODUCTION_IDS: tuple[str, ...] = ( + "DB", "ES", "RC", "RM", + "RS_NVDA", "RS_TSLA", + "RS_BTCUSD", "RS_XAUUSD", "SE", "ST_BTC", "ST_XAU", + "RRA_AUD", "RRA_GBP", "UB", + "RS_NAS100", "RS_US30", "UKB", "GB", "U5B", +) + +LOT_GRIDS: dict[str, list[float]] = { + "stock": [5.0, 10.0, 15.0], + "index": [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1], + "forex": [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1], + "gold": [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1], + "crypto": [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1], +} + +LOT_GENETIC_RANGE: dict[str, tuple[float, float, float]] = { + "stock": (5.0, 5.0, 15.0), + "default": (0.01, 0.01, 0.1), +} + +LOT_CLASS_BY_ID: dict[str, str] = { + "DB": "gold", "ES": "gold", "RC": "gold", "RM": "gold", + "RS_XAUUSD": "gold", "ST_XAU": "gold", "XBT": "gold", "XMB": "gold", "XGB": "gold", + "RS_APPL": "stock", "RS_ADBE": "stock", "RS_NVDA": "stock", "RS_TSLA": "stock", "RS_MU": "stock", + "RS_F": "stock", "RS_SOFI": "stock", "RS_SNAP": "stock", "RS_WBD": "stock", + "RS_NAS100": "index", "RS_US500": "index", "RS_US30": "index", "UKB": "index", + "NB": "index", "U5B": "index", "U30B": "index", "GB": "index", + "RRA_EUR": "forex", "RRA_AUD": "forex", "RRA_GBP": "forex", "RRA_USDCHF": "forex", "RRA_NZDUSD": "forex", + "UB": "forex", "RS_EURJPY": "forex", "RS_GBPJPY": "forex", + "RS_BTCUSD": "crypto", "ST_BTC": "crypto", + "ST_GER": "index", "RS_XAGUSD": "gold", +} + +PARAM_TWEAKS: dict[str, list[dict]] = { + "ES": [{"ES_TrailingStop": 250}, {"ES_TrailingStop": 300, "ES_ProfitCheckBars": 12}], + "RC": [{"RC_cooldownSeconds": 120}, {"RC_TrailingStop": 250}], + "RS_NVDA": [{"RS_NVDA_BarsToWait": 3}, {"RS_NVDA_TrailDistancePoints": 300}], + "RS_TSLA": [{"RS_TSLA_BarsToWait": 2}, {"RS_TSLA_TrailActivationPoints": 500}], + "RCO": [{"RCO_ADX_Max": 32}, {"RCO_SL_ATR_Mult": 1.9}], + "UB": [{"UB_MinRangePoints": 12}, {"UB_OrderBufferPoints": 3.5}], +} diff --git a/backtesting/MT5/cluster_audit/united_mt5_runner.py b/backtesting/MT5/cluster_audit/united_mt5_runner.py new file mode 100644 index 0000000..7d9e656 --- /dev/null +++ b/backtesting/MT5/cluster_audit/united_mt5_runner.py @@ -0,0 +1,488 @@ +"""MT5 Strategy Tester runner for United EA (cluster-latest/main.mq5).""" + +from __future__ import annotations + +import os +import re +import shutil +import subprocess +import time +from pathlib import Path + +import MetaTrader5 as mt5 + +CLUSTER = Path(__file__).resolve().parents[3] / "frontline" / "cluster-latest" +BASE_SET = CLUSTER / "123.set" +DEPOSIT = 3000 +LEVERAGE = 1000 +FROM_DATE = "2023.07.01" +TO_DATE = "2026.06.01" +TEST_SYMBOL = "NAS100" +TEST_PERIOD = "H1" + +LABELS = { + "profit_factor": ("Profit Factor", "盈利因子"), + "net_profit": ("Total Net Profit", "总净盈利"), + "total_trades": ("Total Trades", "交易总计"), + "sharpe": ("Sharpe Ratio", "夏普比率"), + "equity_dd": ("Equity Drawdown Maximal", "最大回撤"), + "margin_level": ("Minimal margin level", "最低保证金比例"), +} + + +def read_text(path: Path) -> str: + raw = path.read_bytes() + for enc in ("utf-16", "utf-16-le", "utf-8", "cp1252"): + try: + text = raw.decode(enc) + if text.strip(): + return text + except UnicodeError: + continue + return raw.decode("utf-8", errors="ignore") + + +def grab_metric(text: str, key: str) -> str | None: + for label in LABELS[key]: + for pat in ( + rf">{re.escape(label)}\s*]*>(?:)?([^<]+)", + rf">{re.escape(label)}:\s*]*>(?:)?([^<]+)", + rf">{re.escape(label)}\s*]*>([^<]+)", + ): + m = re.search(pat, text, re.I) + if m: + return m.group(1).strip() + return None + + +def parse_report(data: Path, report: str) -> dict: + candidates = [data / f"{report}{ext}" for ext in (".htm", ".html")] + candidates += sorted(data.glob(f"**/{report}*.htm*"), key=lambda p: p.stat().st_mtime, reverse=True) + seen: set[Path] = set() + for path in candidates: + if path in seen or not path.exists(): + continue + seen.add(path) + text = read_text(path) + pf = grab_metric(text, "profit_factor") + profit = grab_metric(text, "net_profit") + trades = grab_metric(text, "total_trades") + sharpe = grab_metric(text, "sharpe") + dd = grab_metric(text, "equity_dd") + ml = grab_metric(text, "margin_level") + if pf or profit or trades: + return { + "profit_factor": float(pf) if pf else None, + "net_profit": _num(profit), + "total_trades": int(float(trades)) if trades and trades[0].isdigit() else _int(trades), + "sharpe": float(sharpe) if sharpe else None, + "max_drawdown": dd, + "min_margin_level": ml, + "report": str(path), + "ready": True, + } + return {"ready": False} + + +def _num(s: str | None) -> float | None: + if not s: + return None + s = s.replace(" ", "").replace(",", "") + if s.endswith("%"): + return float(s[:-1]) + return float(s) + + +def _int(s: str | None) -> int | None: + if not s: + return None + try: + return int(float(s.replace(" ", "").replace(",", ""))) + except ValueError: + return None + + +KNOWN_TERMINALS = [ + Path(r"C:\Program Files\MetaTrader 5\terminal64.exe"), +] + + +def _terminal_data_dirs() -> list[Path]: + root = Path.home() / "AppData" / "Roaming" / "MetaQuotes" / "Terminal" + if not root.is_dir(): + return [] + return [p for p in root.iterdir() if p.is_dir() and (p / "origin.txt").exists()] + + +def _read_origin(path: Path) -> str: + raw = path.read_bytes() + for enc in ("utf-8", "utf-16", "utf-16-le", "cp1252"): + try: + return raw.decode(enc).strip() + except UnicodeError: + continue + return raw.decode("utf-8", errors="ignore").strip() + + +def _load_dotenv() -> None: + env_path = Path(__file__).resolve().parents[3] / ".env" + if not env_path.is_file(): + return + for line in env_path.read_text(encoding="utf-8", errors="ignore").splitlines(): + line = line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, val = line.split("=", 1) + key, val = key.strip(), val.strip().strip('"').strip("'") + if key and key not in os.environ: + os.environ[key] = val + + +_load_dotenv() +MT5_TERMINAL_DATA_ID = os.environ.get("MT5_TERMINAL_DATA_ID", "").strip() +# Back-compat alias for scripts that import PREFERRED_DATA_ID +PREFERRED_DATA_ID = MT5_TERMINAL_DATA_ID + + +def mt5_terminal_data_dir() -> Path | None: + """MT5 data folder: MT5_TERMINAL_DATA_ID env, else first terminal with origin.txt.""" + root = Path.home() / "AppData" / "Roaming" / "MetaQuotes" / "Terminal" + if MT5_TERMINAL_DATA_ID: + candidate = root / MT5_TERMINAL_DATA_ID + if (candidate / "origin.txt").is_file(): + return candidate + dirs = _terminal_data_dirs() + return dirs[0] if dirs else None + + +def _resolve_terminal_exe() -> Path | None: + env_exe = os.environ.get("MT5_TERMINAL_EXE", "").strip() + if env_exe: + exe = Path(env_exe) + if exe.is_file(): + return exe + data_dir = mt5_terminal_data_dir() + if data_dir: + origin = data_dir / "origin.txt" + if origin.is_file(): + try: + exe = Path(_read_origin(origin)) + if exe.is_file(): + return exe + except OSError: + pass + for data_dir in _terminal_data_dirs(): + origin = data_dir / "origin.txt" + try: + exe = Path(_read_origin(origin)) + if exe.is_file(): + return exe + except OSError: + continue + for exe in KNOWN_TERMINALS: + if exe.is_file(): + return exe + return None + + +def mt5_context(*, retries: int = 6, wait_sec: float = 12.0) -> dict: + terminal_exe = _resolve_terminal_exe() + last_err = None + for attempt in range(retries): + if attempt: + time.sleep(wait_sec) + if attempt >= 1 and terminal_exe and terminal_exe.is_file(): + subprocess.run(["taskkill", "/IM", "terminal64.exe", "/F"], capture_output=True) + time.sleep(3) + subprocess.Popen([str(terminal_exe)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + time.sleep(20) + mt5.shutdown() + ok = mt5.initialize(path=str(terminal_exe)) if terminal_exe else mt5.initialize() + if not ok: + last_err = mt5.last_error() + continue + info = mt5.terminal_info() + acc = mt5.account_info() + ctx = { + "data": Path(info.data_path), + "mt5_path": Path(info.path), + "login": acc.login if acc else 0, + "server": acc.server if acc else "", + } + mt5.shutdown() + return ctx + raise RuntimeError(f"MT5 init failed after {retries} tries: {last_err}") + + +def deploy_united(data: Path, mt5_path: Path) -> Path: + dst = data / "MQL5" / "Experts" / "cluster-latest" + dst.mkdir(parents=True, exist_ok=True) + for name in ("main.mq5", "MagicNumberHelpers.mqh", "GapGuard.mqh"): + shutil.copy2(CLUSTER / name, dst / name) + strat_dst = dst / "Strategies" + strat_dst.mkdir(exist_ok=True) + for f in (CLUSTER / "Strategies").glob("*.mqh"): + shutil.copy2(f, strat_dst / f.name) + log = dst / "compile.log" + subprocess.run( + [str(mt5_path / "metaeditor64.exe"), f"/compile:{dst / 'main.mq5'}", f"/log:{log}"], + timeout=180, + capture_output=True, + ) + time.sleep(3) + ex5 = dst / "main.ex5" + if not ex5.exists(): + tail = log.read_text(encoding="utf-8", errors="ignore")[-2000:] if log.exists() else "" + raise RuntimeError(f"Compile failed: {log}\n{tail}") + pub = data / "MQL5" / "Experts" / "main.ex5" + shutil.copy2(ex5, pub) + return pub + + +def patch_set(base: Path, overrides: dict[str, str | bool | int | float]) -> str: + lines_out: list[str] = [] + seen: set[str] = set() + for line in base.read_text(encoding="utf-8", errors="ignore").splitlines(): + if not line.strip() or line.strip().startswith(";") or "=" not in line: + lines_out.append(line) + continue + name = line.split("=", 1)[0].strip() + if name in overrides: + val = overrides[name] + if isinstance(val, bool): + sval = "true" if val else "false" + else: + sval = str(val) + lines_out.append(f"{name}={sval}") + seen.add(name) + else: + lines_out.append(line) + for k, v in overrides.items(): + if k not in seen: + sval = "true" if v is True else "false" if v is False else str(v) + lines_out.append(f"{k}={sval}") + return "\n".join(lines_out) + "\n" + + +def patch_set_for_lot_genetic( + base: Path, + overrides: dict[str, str | bool | int | float], + lot_key: str, + start: float, + step: float, + stop: float, + default: float | None = None, +) -> str: + """Build .set with a single LOT_* genetic range; all other ||Y flags forced to N.""" + body = patch_set(base, overrides) + val = default if default is not None else start + genetic_line = f"{lot_key}={val}||{start}||{step}||{stop}||Y" + lines_out: list[str] = [] + seen_lot = False + for line in body.splitlines(): + if not line.strip() or line.strip().startswith(";") or "=" not in line: + lines_out.append(line) + continue + name = line.split("=", 1)[0].strip() + if name == lot_key: + lines_out.append(genetic_line) + seen_lot = True + elif "||" in line: + parts = line.split("||") + if len(parts) >= 5: + parts[4] = "N" + lines_out.append("||".join(parts)) + else: + lines_out.append(line) + else: + lines_out.append(line) + if not seen_lot: + lines_out.append(genetic_line) + return "\n".join(lines_out) + "\n" + + +def parse_optimization_xml(data: Path, report: str, lot_key: str) -> dict: + candidates = [data / f"{report}.xml", data / f"{report}.opt"] + candidates += sorted(data.glob(f"**/{report}*.xml"), key=lambda p: p.stat().st_mtime, reverse=True) + seen: set[Path] = set() + xml_path: Path | None = None + for p in candidates: + if p in seen or not p.exists() or p.suffix.lower() != ".xml": + continue + seen.add(p) + xml_path = p + break + if xml_path is None: + return {"ready": False, "error": "xml_not_found"} + + text = read_text(xml_path) + header = re.search(r".*?Pass.*?", text, re.S) + if not header: + return {"ready": False, "error": "xml_header_missing", "report": str(xml_path)} + + cols = re.findall(r'([^<]+)', header.group(0)) + rows: list[dict[str, str]] = [] + for row_xml in re.findall(r"(.*?)", text, re.S)[1:]: + cells = re.findall(r'([^<]+)', row_xml) + if len(cells) >= len(cols): + rows.append(dict(zip(cols, cells))) + + if not rows: + return {"ready": False, "error": "xml_no_rows", "report": str(xml_path)} + + best_row: dict[str, str] | None = None + best_score = -1e18 + for row in rows: + try: + profit = float(row.get("Profit", 0)) + pf = float(row.get("Profit Factor", 0)) + sharpe = float(row.get("Sharpe Ratio", row.get("Sharpe", 0))) + trades = int(float(row.get("Trades", 0))) + except (ValueError, TypeError): + continue + if trades < 20 or pf < 1.0 or profit <= 0: + score = -1e10 + profit + else: + score = sharpe * 2000.0 + profit / 500.0 + pf * 50.0 + if score > best_score: + best_score = score + best_row = row + + if best_row is None: + best_row = max(rows, key=lambda r: float(r.get("Profit", 0))) + + lot_raw = best_row.get(lot_key) + if lot_raw is None: + for k, v in best_row.items(): + if k.replace(" ", "") == lot_key or lot_key in k: + lot_raw = v + break + best_lot = float(lot_raw) if lot_raw is not None else None + + return { + "ready": True, + "report": str(xml_path), + "best_lot": best_lot, + "best_row": best_row, + "best_score": best_score, + "passes": len(rows), + "profit": float(best_row.get("Profit", 0)), + "profit_factor": float(best_row.get("Profit Factor", 0)), + "sharpe": float(best_row.get("Sharpe Ratio", best_row.get("Sharpe", 0))), + "trades": int(float(best_row.get("Trades", 0))), + } + + +def run_genetic_lot_optimize( + data: Path, + mt5_path: Path, + login: int, + server: str, + set_body: str, + set_name: str, + report: str, + lot_key: str, + *, + test_symbol: str | None = None, + optimization: int = 2, + timeout_sec: int = 7200, +) -> dict: + write_tester_set(data, set_name, set_body) + ini = data / f"{report}.ini" + ini.write_text( + build_ini(set_name, report, login, server, symbol=test_symbol, optimization=optimization), + encoding="utf-8", + ) + for ext in (".htm", ".html", ".xml"): + p = data / f"{report}{ext}" + if p.exists(): + p.unlink(missing_ok=True) + + subprocess.run(["taskkill", "/IM", "terminal64.exe", "/F"], capture_output=True) + subprocess.run(["taskkill", "/IM", "metatester64.exe", "/F"], capture_output=True) + time.sleep(6) + + t0 = time.time() + subprocess.run([str(mt5_path / "terminal64.exe"), f"/config:{ini}"], timeout=timeout_sec) + elapsed = round(time.time() - t0, 1) + + opt = parse_optimization_xml(data, report, lot_key) + opt["elapsed_sec"] = elapsed + if not opt.get("ready"): + metrics = parse_report(data, report) + opt.update(metrics) + return opt + + +def write_tester_set(data: Path, set_name: str, body: str) -> Path: + profiles = data / "MQL5" / "Profiles" / "Tester" + profiles.mkdir(parents=True, exist_ok=True) + path = profiles / set_name + path.write_text(body, encoding="utf-8") + return path + + +def build_ini( + set_name: str, + report: str, + login: int, + server: str, + *, + symbol: str | None = None, + optimization: int = 0, +) -> str: + sym = symbol or TEST_SYMBOL + return f"""[Common] +Login={login} +Server={server} +[Tester] +Expert=main.ex5 +ExpertParameters={set_name} +Symbol={sym} +Period={TEST_PERIOD} +Optimization={optimization} +Model=1 +Dates=1 +FromDate={FROM_DATE} +ToDate={TO_DATE} +ForwardMode=0 +Deposit={DEPOSIT} +Currency=USD +Leverage={LEVERAGE} +ExecutionMode=0 +Report={report} +ReplaceReport=1 +ShutdownTerminal=1 +Visual=0 +""" + + +def run_backtest( + data: Path, + mt5_path: Path, + login: int, + server: str, + set_body: str, + set_name: str, + report: str, + *, + test_symbol: str | None = None, + timeout_sec: int = 1800, +) -> dict: + write_tester_set(data, set_name, set_body) + ini = data / f"{report}.ini" + ini.write_text(build_ini(set_name, report, login, server, symbol=test_symbol), encoding="utf-8") + for ext in (".htm", ".html"): + p = data / f"{report}{ext}" + if p.exists(): + p.unlink(missing_ok=True) + + subprocess.run(["taskkill", "/IM", "terminal64.exe", "/F"], capture_output=True) + subprocess.run(["taskkill", "/IM", "metatester64.exe", "/F"], capture_output=True) + time.sleep(6) + + t0 = time.time() + subprocess.run([str(mt5_path / "terminal64.exe"), f"/config:{ini}"], timeout=timeout_sec) + metrics = parse_report(data, report) + metrics["elapsed_sec"] = round(time.time() - t0, 1) + return metrics diff --git a/backtesting/MT5/cluster_audit/united_registry.py b/backtesting/MT5/cluster_audit/united_registry.py new file mode 100644 index 0000000..9bfb1ab --- /dev/null +++ b/backtesting/MT5/cluster_audit/united_registry.py @@ -0,0 +1,117 @@ +"""United EA (main.mq5) strategy registry — defaults from 123.set + audit ranges.""" + +from __future__ import annotations + +import MetaTrader5 as mt5 + +TF = { + "M10": mt5.TIMEFRAME_M10, + "M15": mt5.TIMEFRAME_M15, + "M20": mt5.TIMEFRAME_M20, + "M30": mt5.TIMEFRAME_M30, + "H1": mt5.TIMEFRAME_H1, + "H4": mt5.TIMEFRAME_H4, +} + +# Strategies enabled in 123.set, ordered for sequential audit. +UNITED_STRATEGIES: list[dict] = [ + {"id": "united_darvas", "engine": "darvas", "symbol": "XAUUSD", "tf": "M15", "lot": 0.05, + "enable_key": "EnableDarvasBox", "lot_key": "LOT_DB_DarvasBox", + "defaults": {"box_period": 24, "box_deviation": 90000, "ma_period": 30, + "trend_threshold": 1.2, "volume_threshold": 0, + "stop_loss_pts": 300, "take_profit_pts": 950}, + "opt": {"box_period": (12, 48, 4), "box_deviation": (40000, 150000, 5000), + "trend_threshold": (0.3, 5.0, 0.3), "stop_loss_pts": (250, 900, 50), + "take_profit_pts": (350, 1200, 50), "ma_period": (30, 120, 15)}}, + {"id": "united_rsi_cross", "engine": "rsi_crossover", "symbol": "XAUUSD", "tf": "M15", "lot": 0.06, + "enable_key": "EnableRSICrossOverReversal", "lot_key": "LOT_RC_RSICrossOver", + "defaults": {"rsi_period": 19, "overbought_level": 85, "oversold_level": 25, "ema_period": 140, + "ema_slope_threshold": 105, "ema_distance_threshold": 350, "exit_buy_rsi": 86, + "exit_sell_rsi": 10, "trailing_stop_pts": 295, "cooldown_seconds": 120, + "use_trend_strength_filter": True, "entry_rsi_buy_spread": 0, "entry_rsi_sell_spread": 0, + "tuesday": True, "wednesday": True, "thursday": True, + "trading_hour_one_begin": 0, "trading_hour_one_end": 22, + "trading_hour_two_begin": 6, "trading_hour_two_end": 19}, + "opt": {"overbought_level": (70, 92, 3), "oversold_level": (15, 40, 3), + "ema_distance_threshold": (200, 600, 50), "cooldown_seconds": (60, 300, 30)}}, + {"id": "united_rsi_scalp_appl", "engine": "rsi_scalp", "symbol": "AAPL", "tf": "M15", "lot": 15.0, + "enable_key": "EnableRSIScalpingAPPL", "lot_key": "LOT_RS_APPL", + "defaults": {"rsi_period": 8, "rsi_overbought": 64, "rsi_oversold": 30, + "rsi_target_buy": 67, "rsi_target_sell": 2, "bars_to_wait": 5, + "use_trailing": True, "trail_distance_pts": 70, "trail_activation_pts": 39, "tf": "M15", + "skip_short_hour_after": 17, "use_reversal_escape": False, + "use_rsi_against_exit": False, "max_adverse_atr": 2.5, "min_ob_depth": 0}, + "opt": {"rsi_period": (6, 14, 1), "rsi_overbought": (60, 75, 2), "rsi_oversold": (22, 35, 2), + "rsi_target_buy": (60, 80, 3), "bars_to_wait": (5, 12, 1), + "trail_distance_pts": (50, 120, 10), "skip_short_hour_after": (15, 20, 1)}}, + {"id": "united_rsi_scalp_adbe", "engine": "rsi_scalp", "symbol": "ADBE", "tf": "H1", "lot": 40.0, + "enable_key": "EnableRSIScalpingADBE", "lot_key": "LOT_RS_ADBE", + "defaults": {"rsi_period": 15, "rsi_overbought": 16, "rsi_oversold": 42, + "rsi_target_buy": 67, "rsi_target_sell": 62, "bars_to_wait": 8, + "use_trailing": True, "trail_distance_pts": 425, "trail_activation_pts": 18.5, "tf": "H1"}, + "opt": {"rsi_period": (6, 21, 1), "rsi_overbought": (50, 90, 3), "rsi_oversold": (10, 70, 3), + "bars_to_wait": (1, 12, 1), "trail_distance_pts": (50, 500, 25)}}, + {"id": "united_rsi_scalp_btc", "engine": "rsi_scalp", "symbol": "BTCUSD", "tf": "H1", "lot": 0.03, + "enable_key": "EnableRSIScalpingBTCUSD", "lot_key": "LOT_RS_BTCUSD", + "defaults": {"rsi_period": 14, "rsi_overbought": 90, "rsi_oversold": 73, + "rsi_target_buy": 88, "rsi_target_sell": 48, "bars_to_wait": 6, + "use_trailing": True, "trail_distance_pts": 120, "trail_activation_pts": 0, "tf": "H1"}, + "opt": {"rsi_period": (6, 21, 1), "rsi_overbought": (50, 95, 3), "rsi_oversold": (20, 80, 3), + "bars_to_wait": (1, 8, 1), "trail_distance_pts": (40, 300, 20)}}, + {"id": "united_rsi_scalp_nvda", "engine": "rsi_scalp", "symbol": "NVDA", "tf": "M15", "lot": 50.0, + "enable_key": "EnableRSIScalpingNVDA", "lot_key": "LOT_RS_NVDA", + "defaults": {"rsi_period": 8, "rsi_overbought": 36, "rsi_oversold": 38, + "rsi_target_buy": 90, "rsi_target_sell": 70, "bars_to_wait": 5, + "use_trailing": True, "trail_distance_pts": 375, "trail_activation_pts": 75, "tf": "M15"}, + "opt": {"rsi_period": (6, 21, 1), "bars_to_wait": (1, 8, 1), "trail_distance_pts": (50, 500, 25)}}, + {"id": "united_rsi_scalp_tsla", "engine": "rsi_scalp", "symbol": "TSLA", "tf": "H1", "lot": 5.0, + "enable_key": "EnableRSIScalpingTSLA", "lot_key": "LOT_RS_TSLA", + "defaults": {"rsi_period": 14, "rsi_overbought": 54, "rsi_oversold": 73, + "rsi_target_buy": 87, "rsi_target_sell": 33, "bars_to_wait": 1, + "use_trailing": True, "trail_distance_pts": 900, "trail_activation_pts": 950, "tf": "H1"}, + "opt": {"rsi_period": (6, 21, 1), "bars_to_wait": (1, 6, 1), "trail_distance_pts": (100, 1000, 50)}}, + {"id": "united_rsi_scalp_xau", "engine": "rsi_scalp", "symbol": "XAUUSD", "tf": "H1", "lot": 0.02, + "enable_key": "EnableRSIScalpingXAUUSD", "lot_key": "LOT_RS_XAUUSD", + "defaults": {"rsi_period": 14, "rsi_overbought": 71, "rsi_oversold": 57, + "rsi_target_buy": 80, "rsi_target_sell": 57, "bars_to_wait": 1, + "use_trailing": True, "trail_distance_pts": 71, "trail_activation_pts": 41, "tf": "H1"}, + "opt": {"rsi_period": (6, 21, 1), "rsi_overbought": (55, 85, 3), "rsi_oversold": (40, 75, 3), + "bars_to_wait": (1, 4, 1), "trail_distance_pts": (20, 150, 10)}}, + {"id": "united_rsi_asian_eur", "engine": "rsi_asian", "symbol": "EURUSD", "tf": "M15", "lot": 0.04, + "enable_key": "EnableRSIReversalAsianEURUSD", "lot_key": "LOT_RRA_EURUSD", + "defaults": {"rsi_period": 28, "overbought_level": 60, "oversold_level": 8, + "asian_session_start": 0, "asian_session_end": 8, "use_rsi_exit": True, "rsi_exit_level": 55}, + "opt": {"overbought_level": (50, 80, 5), "oversold_level": (5, 40, 5)}}, + {"id": "united_rsi_asian_aud", "engine": "rsi_asian", "symbol": "AUDUSD", "tf": "M15", "lot": 0.03, + "enable_key": "EnableRSIReversalAsianAUDUSD", "lot_key": "LOT_RRA_AUDUSD", + "defaults": {"rsi_period": 28, "overbought_level": 68, "oversold_level": 30, + "asian_session_start": 0, "asian_session_end": 8, "use_rsi_exit": True, "rsi_exit_level": 48, + "close_outside_session": True}, + "opt": {"overbought_level": (55, 80, 5), "oversold_level": (15, 45, 5)}}, + {"id": "united_st_xau", "engine": "simple_trendline", "symbol": "XAUUSD", "tf": "H1", "lot": 0.03, + "enable_key": "EnableSimpleTrendlineXAUUSD", "lot_key": "LOT_ST_XAUUSD", + "defaults": {"signal_tf": "H1", "higher_tf": "M10", "ma_period": 65, "ma_method": "ema", + "htf_bars_to_scan": 500, "touch_tolerance_pts": 220, "break_buffer_pts": 110}, + "opt": {"ma_period": (40, 120, 10), "touch_tolerance_pts": (100, 350, 25), + "break_buffer_pts": (50, 200, 15)}}, + {"id": "united_st_ger40", "engine": "simple_trendline", "symbol": "GER40", "tf": "M15", "lot": 0.04, + "enable_key": "EnableSimpleTrendlineGER40", "lot_key": "LOT_ST_GER40", + "defaults": {"signal_tf": "M15", "higher_tf": "M15", "ma_period": 65, "ma_method": "lwma", + "htf_bars_to_scan": 1200, "touch_tolerance_pts": 100, "break_buffer_pts": 80}, + "opt": {"ma_period": (40, 120, 10), "touch_tolerance_pts": (50, 200, 15)}}, + {"id": "united_rsi_secret", "engine": "rsi_secret", "symbol": "XAUUSD", "tf": "M30", "lot": 0.07, + "enable_key": "EnableRSISecretSauce", "lot_key": "LOT_RSS_SecretSauce", + "defaults": {"rsi_period": 16, "rsi_overbought": 72.5, "rsi_oversold": 32.5, + "stop_loss_atr": 2.75, "take_profit_atr": 5.0, "min_bars_between_trades": 7}, + "opt": {"rsi_overbought": (60, 80, 2), "rsi_oversold": (25, 45, 2), "stop_loss_atr": (1.5, 4, 0.5)}}, + {"id": "united_usdjpy", "engine": "usdjpy_buster", "symbol": "USDJPY", "tf": "M20", "lot": 0.09, + "enable_key": "EnableUSDJPYBuster", "lot_key": "LOT_UB_USDJPY", + "defaults": {"range_start_hour": 3, "range_end_hour": 6, "close_hour": 18, + "min_range_pts": 15, "order_buffer_pts": 4.75, "first_trade_only": False, + "allow_long": True, "allow_short": True, "use_take_profit": False}, + "opt": {"min_range_pts": (8, 40, 4), "order_buffer_pts": (2, 12, 1)}}, +] + +PERIODS = { + "2021-2026": ("2021-01-01", "2026-06-01"), +} diff --git a/backtesting/MT5/indicator_utils.py b/backtesting/MT5/indicator_utils.py index f29b4c5..eed32e9 100644 --- a/backtesting/MT5/indicator_utils.py +++ b/backtesting/MT5/indicator_utils.py @@ -10,13 +10,14 @@ import pandas as pd def calculate_rsi(prices: pd.Series, period: int = 14) -> pd.Series: - """Calculate RSI indicator.""" + """Calculate RSI with Wilder smoothing (matches MT5 iRSI).""" delta = prices.diff() - gain = (delta.where(delta > 0, 0)).rolling(window=period).mean() - loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean() - rs = gain / loss - rsi = 100 - (100 / (1 + rs)) - return rsi + gain = delta.clip(lower=0) + loss = (-delta).clip(lower=0) + avg_gain = gain.ewm(alpha=1 / period, adjust=False).mean() + avg_loss = loss.ewm(alpha=1 / period, adjust=False).mean() + rs = avg_gain / avg_loss.replace(0, np.nan) + return 100 - (100 / (1 + rs)) def calculate_ema(prices: pd.Series, period: int = 50) -> pd.Series: @@ -30,13 +31,35 @@ def calculate_sma(prices: pd.Series, period: int = 50) -> pd.Series: def calculate_atr(df: pd.DataFrame, period: int = 14) -> pd.Series: - """Calculate ATR indicator.""" + """Calculate ATR with Wilder smoothing (matches MT5 iATR).""" high_low = df['high'] - df['low'] high_close = np.abs(df['high'] - df['close'].shift()) low_close = np.abs(df['low'] - df['close'].shift()) tr = pd.concat([high_low, high_close, low_close], axis=1).max(axis=1) - atr = tr.rolling(window=period).mean() - return atr + return tr.ewm(alpha=1 / period, adjust=False).mean() + + +def calculate_adx(df: pd.DataFrame, period: int = 14) -> pd.Series: + """Calculate ADX indicator (Wilder smoothing).""" + return calculate_dmi(df, period)["adx"] + + +def calculate_dmi(df: pd.DataFrame, period: int = 14) -> pd.DataFrame: + """Calculate +DI, -DI, and ADX.""" + high = df["high"] + low = df["low"] + close = df["close"] + up = high.diff() + down = -low.diff() + plus_dm = up.where((up > down) & (up > 0), 0.0) + minus_dm = down.where((down > up) & (down > 0), 0.0) + tr = pd.concat([high - low, (high - close.shift()).abs(), (low - close.shift()).abs()], axis=1).max(axis=1) + atr = tr.ewm(alpha=1 / period, adjust=False).mean() + plus_di = 100 * (plus_dm.ewm(alpha=1 / period, adjust=False).mean() / atr.replace(0, np.nan)) + minus_di = 100 * (minus_dm.ewm(alpha=1 / period, adjust=False).mean() / atr.replace(0, np.nan)) + dx = 100 * (plus_di - minus_di).abs() / (plus_di + minus_di).replace(0, np.nan) + adx = dx.ewm(alpha=1 / period, adjust=False).mean() + return pd.DataFrame({"plus_di": plus_di, "minus_di": minus_di, "adx": adx}) def calculate_macd(prices: pd.Series, fast: int = 12, slow: int = 26, signal: int = 9) -> pd.DataFrame: diff --git a/backtesting/MT5/rsi_scalping_backtest.py b/backtesting/MT5/rsi_scalping_backtest.py new file mode 100644 index 0000000..5bd8a18 --- /dev/null +++ b/backtesting/MT5/rsi_scalping_backtest.py @@ -0,0 +1,309 @@ +""" +Bar-based RSI scalping backtest — conservative fills, costs, no same-bar RSI lookahead. + +Mirrors RsiScalpingRobot.mqh with: +- entries on bar open after RSI cross on prior closed bars +- exits evaluated on prior closed bar RSI +- trailing updated on bar close; stop checked against bar range +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Any + +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +from indicator_utils import calculate_rsi + + +@dataclass +class RsiScalpParams: + rsi_period: int = 14 + rsi_overbought: float = 71.0 + rsi_oversold: float = 57.0 + rsi_target_buy: float = 80.0 + rsi_target_sell: float = 57.0 + bars_to_wait: int = 1 + use_trailing: bool = True + trail_distance_pts: float = 71.0 + trail_activation_pts: float = 41.0 + lot_size: float = 0.1 + + @classmethod + def from_dict(cls, d: dict[str, Any]) -> "RsiScalpParams": + return cls(**{k: d[k] for k in cls.__dataclass_fields__ if k in d}) + + +@dataclass +class CostModel: + spread_points: float = 0.0 + slippage_points: float = 3.0 + commission_per_lot: float = 0.0 + + @classmethod + def from_symbol(cls, symbol: str, slippage_points: float = 3.0, commission_per_lot: float = 0.0) -> "CostModel": + info = mt5.symbol_info(symbol) + spread = float(info.spread) if info else 0.0 + return cls(spread_points=spread, slippage_points=slippage_points, commission_per_lot=commission_per_lot) + + +@dataclass +class BacktestResult: + net_profit: float + total_trades: int + win_rate: float + profit_factor: float + max_drawdown_pct: float + total_costs: float + score: float + params: RsiScalpParams + gross_profit: float = 0.0 + gross_loss: float = 0.0 + + +def _calc_profit(symbol: str, order_type: int, volume: float, open_price: float, close_price: float) -> float: + p = mt5.order_calc_profit(order_type, symbol, volume, open_price, close_price) + return float(p) if p is not None else 0.0 + + +def _half_spread_price(point: float, spread_points: float) -> float: + return (spread_points * point) / 2.0 + + +def _fill_buy(open_price: float, point: float, costs: CostModel, entry: bool) -> float: + slip = costs.slippage_points * point + hs = _half_spread_price(point, costs.spread_points) + return open_price + hs + slip if entry else open_price - hs - slip + + +def _fill_sell(open_price: float, point: float, costs: CostModel, entry: bool) -> float: + slip = costs.slippage_points * point + hs = _half_spread_price(point, costs.spread_points) + return open_price - hs - slip if entry else open_price + hs + slip + + +def backtest_rsi_scalping( + df: pd.DataFrame, + symbol: str, + params: RsiScalpParams, + initial_balance: float = 10_000.0, + point: float | None = None, + costs: CostModel | None = None, +) -> BacktestResult: + info = mt5.symbol_info(symbol) + if point is None: + point = float(info.point) if info else 0.01 + if costs is None: + costs = CostModel.from_symbol(symbol) + + # RSI on close; decisions use index i-1 (last fully closed bar at bar i open) + rsi_full = calculate_rsi(df["close"], params.rsi_period).to_numpy() + times = df.index.to_numpy() + opens = df["open"].to_numpy() + highs = df["high"].to_numpy() + lows = df["low"].to_numpy() + closes = df["close"].to_numpy() + + balance = initial_balance + peak = initial_balance + max_dd = 0.0 + total_costs = 0.0 + + position: dict[str, Any] | None = None + rsi_against = False + bars_against = 0 + + gross_profit = 0.0 + gross_loss = 0.0 + wins = 0 + losses = 0 + trades = 0 + + trail_dist = params.trail_distance_pts * point + trail_act = (params.trail_activation_pts if params.trail_activation_pts > 0 else params.trail_distance_pts) * point + + def _update_dd() -> None: + nonlocal peak, max_dd + if balance > peak: + peak = balance + dd = (peak - balance) / peak if peak > 0 else 0.0 + if dd > max_dd: + max_dd = dd + + def close_at(exit_mid: float) -> None: + nonlocal balance, gross_profit, gross_loss, wins, losses, trades, position, total_costs + if position is None: + return + order_type = mt5.ORDER_TYPE_BUY if position["type"] == "BUY" else mt5.ORDER_TYPE_SELL + if position["type"] == "BUY": + exit_price = _fill_buy(exit_mid, point, costs, entry=False) + else: + exit_price = _fill_sell(exit_mid, point, costs, entry=False) + + commission = costs.commission_per_lot * position["volume"] * 2.0 + profit = _calc_profit(symbol, order_type, position["volume"], position["open_price"], exit_price) + profit -= commission + total_costs += commission + (costs.slippage_points * point * position["volume"] * 100000 * 0.0) + + balance += profit + trades += 1 + if profit >= 0: + wins += 1 + gross_profit += profit + else: + losses += 1 + gross_loss += abs(profit) + _update_dd() + position = None + + def apply_trailing(bar_close: float, bar_high: float, bar_low: float) -> None: + if position is None or not params.use_trailing or trail_dist <= 0: + return + if position["type"] == "BUY": + bid = bar_close + if bid - position["open_price"] <= trail_act: + return + new_sl = bid - trail_dist + if new_sl > position.get("sl", 0.0): + position["sl"] = new_sl + if position.get("sl") and bar_low <= position["sl"]: + close_at(position["sl"]) + else: + ask = bar_close + if position["open_price"] - ask <= trail_act: + return + new_sl = ask + trail_dist + if position.get("sl", 0.0) == 0.0 or new_sl < position["sl"]: + position["sl"] = new_sl + if position.get("sl") and bar_high >= position["sl"]: + close_at(position["sl"]) + + start = max(params.rsi_period + 3, 3) + for i in range(start, len(df)): + # closed-bar RSI (no lookahead): signal bar is i-1 + rsi_sig = rsi_full[i - 1] + rsi_prev = rsi_full[i - 2] + rsi_two = rsi_full[i - 3] + if np.isnan(rsi_sig) or np.isnan(rsi_prev) or np.isnan(rsi_two): + continue + + if position is not None: + apply_trailing(closes[i], highs[i], lows[i]) + if position is None: + rsi_against = False + bars_against = 0 + continue + + if position["type"] == "BUY": + if rsi_sig < params.rsi_oversold: + if not rsi_against: + rsi_against = True + bars_against = 1 + else: + bars_against += 1 + if bars_against >= params.bars_to_wait: + close_at(opens[i]) + else: + if rsi_against: + rsi_against = False + bars_against = 0 + if rsi_sig >= params.rsi_target_buy: + close_at(opens[i]) + else: + if rsi_sig > params.rsi_overbought: + if not rsi_against: + rsi_against = True + bars_against = 1 + else: + bars_against += 1 + if bars_against >= params.bars_to_wait: + close_at(opens[i]) + else: + if rsi_against: + rsi_against = False + bars_against = 0 + if rsi_sig <= params.rsi_target_sell: + close_at(opens[i]) + + if position is not None: + continue + + # entry at bar open[i] from RSI cross on bars i-2 / i-3 + if rsi_two <= params.rsi_oversold and rsi_prev > params.rsi_oversold: + entry = _fill_buy(opens[i], point, costs, entry=True) + position = {"type": "BUY", "volume": params.lot_size, "open_price": entry, "open_time": times[i], "sl": 0.0} + rsi_against = False + bars_against = 0 + elif rsi_two >= params.rsi_overbought and rsi_prev < params.rsi_overbought: + entry = _fill_sell(opens[i], point, costs, entry=True) + position = {"type": "SELL", "volume": params.lot_size, "open_price": entry, "open_time": times[i], "sl": 0.0} + rsi_against = False + bars_against = 0 + + if position is not None: + close_at(closes[-1]) + + net_profit = balance - initial_balance + win_rate = (wins / trades * 100.0) if trades else 0.0 + pf = (gross_profit / gross_loss) if gross_loss > 0 else (999.0 if gross_profit > 0 else 0.0) + + if trades < 20: + score = net_profit - 10_000.0 + else: + score = net_profit * (1.0 - min(max_dd, 0.5)) + + return BacktestResult( + net_profit=net_profit, + total_trades=trades, + win_rate=win_rate, + profit_factor=pf, + max_drawdown_pct=max_dd * 100.0, + total_costs=total_costs, + score=score, + params=params, + gross_profit=gross_profit, + gross_loss=gross_loss, + ) + + +def resolve_symbol(requested: str) -> str: + key = requested.split("|")[0].strip() + if not key: + return requested + if mt5.symbol_info(key) is not None: + mt5.symbol_select(key, True) + return key + for suffix in (".NAS", ".NYSE", ".NYS", ".US"): + cand = key + suffix + if mt5.symbol_info(cand) is not None: + mt5.symbol_select(cand, True) + return cand + for sym in mt5.symbols_get() or []: + name = sym.name + if name.startswith(key + "."): + mt5.symbol_select(name, True) + return name + return key + + +def load_rates(symbol: str, timeframe: int, start, end) -> pd.DataFrame: + symbol = resolve_symbol(symbol) + if not mt5.symbol_select(symbol, True): + raise RuntimeError(f"Cannot select {symbol}: {mt5.last_error()}") + rates = mt5.copy_rates_range(symbol, timeframe, start, end) + if rates is None or len(rates) == 0: + raise RuntimeError(f"No rates for {symbol}: {mt5.last_error()}") + out = pd.DataFrame(rates) + out["time"] = pd.to_datetime(out["time"], unit="s") + out.set_index("time", inplace=True) + return out + + +def split_walk_forward(df: pd.DataFrame, train_ratio: float = 0.6) -> tuple[pd.DataFrame, pd.DataFrame]: + cut = int(len(df) * train_ratio) + if cut < 100 or len(df) - cut < 100: + raise ValueError("Not enough bars for walk-forward split") + return df.iloc[:cut].copy(), df.iloc[cut:].copy() diff --git a/backtesting/MT5/run_optimize.py b/backtesting/MT5/run_optimize.py new file mode 100644 index 0000000..88dbad2 --- /dev/null +++ b/backtesting/MT5/run_optimize.py @@ -0,0 +1,233 @@ +""" +Walk-forward random-search optimizer for RSI scalping. + +Optimizes on in-sample (train), ranks by out-of-sample (validation) score. +""" + +from __future__ import annotations + +import argparse +import json +import random +from datetime import datetime, timedelta +from pathlib import Path +from typing import Any + +import MetaTrader5 as mt5 +import pandas as pd + +from rsi_scalping_backtest import ( + CostModel, + RsiScalpParams, + backtest_rsi_scalping, + load_rates, + split_walk_forward, +) +from set_parser import SetParam, parse_set_file + +TF_MAP = { + "M1": mt5.TIMEFRAME_M1, + "M5": mt5.TIMEFRAME_M5, + "M10": mt5.TIMEFRAME_M10, + "M15": mt5.TIMEFRAME_M15, + "M30": mt5.TIMEFRAME_M30, + "H1": mt5.TIMEFRAME_H1, + "H4": mt5.TIMEFRAME_H4, + "D1": mt5.TIMEFRAME_D1, +} + +SET_TO_PARAM = { + "RSI_Period": "rsi_period", + "RSI_Overbought": "rsi_overbought", + "RSI_Oversold": "rsi_oversold", + "RSI_Target_Buy": "rsi_target_buy", + "RSI_Target_Sell": "rsi_target_sell", + "BarsToWait": "bars_to_wait", + "UseTrailingStop": "use_trailing", + "TrailingStopDistancePoints": "trail_distance_pts", + "TrailingActivationPoints": "trail_activation_pts", +} + + +def _sample_value(p: SetParam, rng: random.Random) -> Any: + if not p.optimize: + return p.value + if isinstance(p.start, bool): + return rng.choice([p.start, p.stop]) + if isinstance(p.start, int) and isinstance(p.stop, int): + step = int(p.step) if int(p.step) != 0 else 1 + vals = list(range(int(p.start), int(p.stop) + 1, step)) + return rng.choice(vals) if vals else p.value + step = float(p.step) if float(p.step) != 0 else 1.0 + start, stop = float(p.start), float(p.stop) + n = int((stop - start) / step) + 1 + idx = rng.randint(0, max(n - 1, 0)) + return round(start + idx * step, 4) + + +def sample_params(set_params: dict[str, SetParam], rng: random.Random, defaults: dict, fixed_lot: float) -> RsiScalpParams: + raw = dict(defaults) + for set_name, field in SET_TO_PARAM.items(): + if set_name in set_params: + raw[field] = _sample_value(set_params[set_name], rng) + raw["lot_size"] = fixed_lot + return RsiScalpParams.from_dict(raw) + + +def _result_dict(r, label: str) -> dict: + return { + "label": label, + "net_profit": r.net_profit, + "total_trades": r.total_trades, + "win_rate": r.win_rate, + "profit_factor": r.profit_factor, + "max_drawdown_pct": r.max_drawdown_pct, + "total_costs": r.total_costs, + "score": r.score, + "params": r.params.__dict__, + } + + +def main() -> None: + parser = argparse.ArgumentParser(description="Walk-forward RSI scalping optimizer") + parser.add_argument("--symbol", default="XAUUSD") + parser.add_argument("--timeframe", default="H1", choices=TF_MAP.keys()) + parser.add_argument("--set", required=True) + parser.add_argument("--trials", type=int, default=800) + parser.add_argument("--days", type=int, default=730) + parser.add_argument("--balance", type=float, default=10000.0) + parser.add_argument("--lot", type=float, default=0.1) + parser.add_argument("--train-ratio", type=float, default=0.6) + parser.add_argument("--slippage", type=float, default=3.0) + parser.add_argument("--commission", type=float, default=0.0) + parser.add_argument("--seed", type=int, default=42) + parser.add_argument("--out", default="optimization_results") + args = parser.parse_args() + + if not mt5.initialize(): + raise SystemExit(f"MT5 init failed: {mt5.last_error()}") + + try: + end = datetime.now() + start = end - timedelta(days=args.days) + tf = TF_MAP[args.timeframe] + df_all = load_rates(args.symbol, tf, start, end) + train_df, test_df = split_walk_forward(df_all, args.train_ratio) + costs = CostModel.from_symbol(args.symbol, slippage_points=args.slippage, commission_per_lot=args.commission) + + info = mt5.symbol_info(args.symbol) + spread = info.spread if info else 0 + print(f"Symbol {args.symbol} spread={spread} pts slippage={args.slippage} commission/lot={args.commission}") + print(f"All: {len(df_all)} bars train: {len(train_df)} ({train_df.index[0]} -> {train_df.index[-1]})") + print(f"Test: {len(test_df)} bars ({test_df.index[0]} -> {test_df.index[-1]})") + + set_params = parse_set_file(args.set) + defaults = { + "rsi_period": 14, + "rsi_overbought": 71.0, + "rsi_oversold": 57.0, + "rsi_target_buy": 80.0, + "rsi_target_sell": 57.0, + "bars_to_wait": 1, + "use_trailing": True, + "trail_distance_pts": 71.0, + "trail_activation_pts": 41.0, + } + + baseline_params = RsiScalpParams.from_dict({**defaults, "lot_size": args.lot}) + baseline_train = backtest_rsi_scalping(train_df, args.symbol, baseline_params, args.balance, costs=costs) + baseline_test = backtest_rsi_scalping(test_df, args.symbol, baseline_params, args.balance, costs=costs) + baseline_full = backtest_rsi_scalping(df_all, args.symbol, baseline_params, args.balance, costs=costs) + + print("\n--- BASELINE (current SuperEA XAUUSD trailing defaults) ---") + print(f" train net=${baseline_train.net_profit:.2f} trades={baseline_train.total_trades} dd={baseline_train.max_drawdown_pct:.1f}%") + print(f" test net=${baseline_test.net_profit:.2f} trades={baseline_test.total_trades} dd={baseline_test.max_drawdown_pct:.1f}%") + print(f" full net=${baseline_full.net_profit:.2f} trades={baseline_full.total_trades} dd={baseline_full.max_drawdown_pct:.1f}%") + + rng = random.Random(args.seed) + rows = [] + best_oos = None + best_oos_score = float("-inf") + + for n in range(1, args.trials + 1): + params = sample_params(set_params, rng, defaults, args.lot) + train_r = backtest_rsi_scalping(train_df, args.symbol, params, args.balance, costs=costs) + test_r = backtest_rsi_scalping(test_df, args.symbol, params, args.balance, costs=costs) + full_r = backtest_rsi_scalping(df_all, args.symbol, params, args.balance, costs=costs) + + row = { + "trial": n, + "oos_score": test_r.score, + "train_net": train_r.net_profit, + "test_net": test_r.net_profit, + "full_net": full_r.net_profit, + "train_trades": train_r.total_trades, + "test_trades": test_r.total_trades, + "test_pf": test_r.profit_factor, + "test_dd_pct": test_r.max_drawdown_pct, + "test_win_rate": test_r.win_rate, + **params.__dict__, + } + rows.append(row) + + if test_r.total_trades >= 15 and test_r.score > best_oos_score: + best_oos_score = test_r.score + best_oos = (params, train_r, test_r, full_r) + + if n % 200 == 0 and best_oos: + _, _, br_test, _ = best_oos + print(f" trial {n}/{args.trials} best OOS net=${br_test.net_profit:.2f} score={best_oos_score:.2f}") + + if best_oos is None: + raise SystemExit("No valid OOS candidate (need >=15 test trades)") + + best_params, best_train, best_test, best_full = best_oos + + out_dir = Path(args.out) + out_dir.mkdir(parents=True, exist_ok=True) + results_df = pd.DataFrame(rows).sort_values("oos_score", ascending=False) + tag = f"{args.symbol}_{args.timeframe}_v2" + csv_path = out_dir / f"{tag}_rsi_scalp_opt.csv" + results_df.to_csv(csv_path, index=False) + + report = { + "version": "v2-conservative-walkforward", + "symbol": args.symbol, + "timeframe": args.timeframe, + "costs": {"spread_pts": spread, "slippage_pts": args.slippage, "commission_per_lot": args.commission}, + "bars": {"all": len(df_all), "train": len(train_df), "test": len(test_df)}, + "periods": { + "all": [str(df_all.index[0]), str(df_all.index[-1])], + "train": [str(train_df.index[0]), str(train_df.index[-1])], + "test": [str(test_df.index[0]), str(test_df.index[-1])], + }, + "trials": args.trials, + "baseline": { + "train": _result_dict(baseline_train, "train"), + "test": _result_dict(baseline_test, "test"), + "full": _result_dict(baseline_full, "full"), + }, + "best_by_oos": { + "train": _result_dict(best_train, "train"), + "test": _result_dict(best_test, "test"), + "full": _result_dict(best_full, "full"), + }, + "top10_oos": results_df.head(10).to_dict(orient="records"), + } + json_path = out_dir / f"{tag}_rsi_scalp_best.json" + json_path.write_text(json.dumps(report, indent=2), encoding="utf-8") + + print("\n=== BEST BY OUT-OF-SAMPLE (validation) ===") + for k, v in best_params.__dict__.items(): + print(f" {k}: {v}") + print(f" TRAIN net=${best_train.net_profit:.2f} trades={best_train.total_trades} dd={best_train.max_drawdown_pct:.1f}%") + print(f" TEST net=${best_test.net_profit:.2f} trades={best_test.total_trades} pf={best_test.profit_factor:.2f} dd={best_test.max_drawdown_pct:.1f}%") + print(f" FULL net=${best_full.net_profit:.2f} trades={best_full.total_trades} dd={best_full.max_drawdown_pct:.1f}%") + print(f"\nSaved: {csv_path}") + print(f"Saved: {json_path}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/backtesting/MT5/set_parser.py b/backtesting/MT5/set_parser.py new file mode 100644 index 0000000..f04490a --- /dev/null +++ b/backtesting/MT5/set_parser.py @@ -0,0 +1,58 @@ +"""Parse MetaTrader 5 .set optimization files.""" + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from typing import Any + + +@dataclass +class SetParam: + name: str + value: Any + start: Any + step: Any + stop: Any + optimize: bool + + +def _cast(raw: str) -> Any: + low = raw.strip().lower() + if low == "true": + return True + if low == "false": + return False + if "." in raw: + try: + return float(raw) + except ValueError: + return raw + try: + return int(raw) + except ValueError: + return raw + + +def parse_set_file(path: str | Path) -> dict[str, SetParam]: + params: dict[str, SetParam] = {} + for line in Path(path).read_text(encoding="utf-8", errors="ignore").splitlines(): + line = line.strip() + if not line or line.startswith(";"): + continue + if "=" not in line: + continue + name, rest = line.split("=", 1) + parts = rest.split("||") + if len(parts) < 5: + continue + value, start, step, stop, opt = parts[0], parts[1], parts[2], parts[3], parts[4] + params[name] = SetParam( + name=name, + value=_cast(value), + start=_cast(start), + step=_cast(step), + stop=_cast(stop), + optimize=opt.strip().upper() == "Y", + ) + return params diff --git a/backtesting/MT5/sets/XAUUSD_RSI_Scalp_trailing.set b/backtesting/MT5/sets/XAUUSD_RSI_Scalp_trailing.set new file mode 100644 index 0000000..933aa66 --- /dev/null +++ b/backtesting/MT5/sets/XAUUSD_RSI_Scalp_trailing.set @@ -0,0 +1,11 @@ +; RSIScalping XAUUSD trailing — Python optimizer ranges +RSI_Period=14||8||1||21||Y +RSI_Overbought=71||55.0||2.0||85.0||Y +RSI_Oversold=57||40.0||2.0||70.0||Y +RSI_Target_Buy=80||65.0||2.0||95.0||Y +RSI_Target_Sell=57||40.0||2.0||70.0||Y +BarsToWait=1||1||1||8||Y +LotSize=0.1||0.1||0.1||0.1||N +UseTrailingStop=true||false||0||true||Y +TrailingStopDistancePoints=71||20.0||5.0||200.0||Y +TrailingActivationPoints=41||0.0||5.0||120.0||Y diff --git a/debug.log b/debug.log deleted file mode 100644 index 775ac46..0000000 --- a/debug.log +++ /dev/null @@ -1 +0,0 @@ -[0401/051136.755:ERROR:third_party\crashpad\crashpad\util\win\registration_protocol_win.cc:108] CreateFile: 系统找不到指定的文件。 (0x2) diff --git a/docs/STRUCTURE.md b/docs/STRUCTURE.md new file mode 100644 index 0000000..015ceea --- /dev/null +++ b/docs/STRUCTURE.md @@ -0,0 +1,58 @@ +# Repository Structure + +This monorepo groups **production EAs**, **research tooling**, and **ML experiments** for MetaTrader 5. + +## Core (start here) + +| Path | Purpose | +|------|---------| +| [`frontline/cluster-latest/`](../frontline/cluster-latest/) | **United cluster EA** — multi-strategy orchestrator (`main.mq5`), shared `Strategies/`, default `123.set` | +| [`frontline/units/`](../frontline/units/) | Standalone per-symbol EAs (baseline implementations) | +| [`backtesting/MT5/`](../backtesting/MT5/) | Python MT5 backtesting + `cluster_audit/` pipeline | +| [`ai/`](../ai/) | ONNX / LSTM training and MQL5 inference examples | + +## Frontline variants + +Same strategies, different deployment modes: + +| Path | Variant | +|------|---------| +| `frontline/units-trailing/` | Trailing-stop parameter sets | +| `frontline/units-sharpshooter/` | Tighter entry / sharpshooter tuning | +| `frontline/units_economic_calendar/` | Calendar/session filters | +| `frontline/united_template/` | Template for building united multi-robot EAs | +| `frontline/cluster-NZDUSD/` | NZDUSD-only gene-combo cluster (R&D) | +| `frontline/cluster-SimpleEMA/` | SimpleEMA v5 35-symbol MT5 portfolio (per-symbol params) | +| `frontline/tradingview/` | Pine Script ports | + +## Research & archive + +| Path | Purpose | +|------|---------| +| [`back-pedal/`](../back-pedal/) | Archived / experimental MQL5 strategies | +| [`lab/`](../lab/) | Scratch EAs, indicators, one-off experiments | +| [`paper/`](../paper/) | Research write-up + simulation notebooks | +| [`strategy-tester/`](../strategy-tester/) | Factor / signal testing utilities | + +## Optional modules + +| Path | Purpose | +|------|---------| +| [`polymarket/`](../polymarket/) | Prediction-market research scaffold (needs API keys) | +| [`self-coding-agent/`](../self-coding-agent/) | Local Ollama coding loop (dev tooling) | + +## What is NOT committed + +See root [`.gitignore`](../.gitignore). In short: + +- MT5 account numbers, broker reports, local paths +- `*.ex5`, `ReportTester*.html`, `trades.csv`, audit JSON dumps +- Trained model binaries (`*.onnx`, `*.pkl`) — regenerate from each `ai/*/README.md` +- LaTeX build artifacts and debug logs + +## Recommended workflow + +1. Edit EAs under `frontline/cluster-latest/` or `frontline/units//` +2. Backtest with `backtesting/MT5/` or MT5 Strategy Tester + `.set` files +3. Run cluster audits: `python -m cluster_audit.run_close_signal_audit` (outputs stay local) +4. Copy compiled EA to your **local** `MQL5/Experts/` — never commit credentials diff --git a/docs/ups-pickup-system-tikz.tex b/docs/ups-pickup-system-tikz.tex deleted file mode 100644 index a9adc8f..0000000 --- a/docs/ups-pickup-system-tikz.tex +++ /dev/null @@ -1,204 +0,0 @@ -% !TEX program = xelatex -% UPS 自提 / 取件码 — 流程与系统设计示意(TikZ) -% Overleaf: 使用 fontset=fandol(TeX Live 自带,无需 SimSun) -% 本地 Windows 可改为: \usepackage[UTF8,scheme=plain]{ctex}\setCJKmainfont{SimSun} -\documentclass[11pt,a4paper]{article} -\usepackage[UTF8,scheme=plain,fontset=fandol]{ctex} -\usepackage{geometry} -\geometry{margin=2.2cm} -\usepackage{tikz} -\usetikzlibrary{ - arrows.meta, - positioning, - shapes.geometric, - shapes.symbols, - fit, - backgrounds, - calc, - shadows.blur -} -\definecolor{UPSbrown}{HTML}{351C15} -\definecolor{UPSgold}{HTML}{FFB500} -\definecolor{UPSlight}{HTML}{F5F0E8} -\usepackage{hyperref} -\hypersetup{colorlinks=true,linkcolor=UPSbrown,urlcolor=UPSgold} - -\tikzset{ - font=\small, - actor/.style={ - draw=UPSbrown, - line width=0.8pt, - rounded corners=3pt, - minimum width=2.6cm, - minimum height=1cm, - align=center, - fill=white, - drop shadow={shadow xshift=1pt,shadow yshift=-1pt} - }, - sys/.style={ - draw=UPSbrown, - line width=0.6pt, - rounded corners=2pt, - minimum width=3cm, - minimum height=0.85cm, - align=center, - fill=UPSlight - }, - % 勿用名「step」:与 TikZ 内置 key /tikz/step 冲突(Overleaf 会报 pgfkeys Error) - flowstep/.style={ - draw=UPSbrown, - rounded corners=2pt, - fill=white, - minimum width=3cm, - minimum height=0.7cm, - align=center, - font=\footnotesize - }, - flow/.style={-{Stealth[length=2.2mm]}, thick, UPSbrown}, - lab/.style={font=\footnotesize, align=center}, - secret/.style={fill=UPSgold!25, draw=UPSgold!80!black, dashed} -} - -\title{\textcolor{UPSbrown}{UPS 风格自提点:取件码与系统设计}\\[0.3em] -\large TikZ 图示(教学/示意,非官方)} -\author{} -\date{} - -\begin{document} -\maketitle - -\begin{abstract} -\noindent -本文档用 TikZ 示意「快递员投件 — 平台发码 — 收件人取件」的信息边界: -投件方通常不掌握收件人取件码;取件码仅通过安全通道下发给收件人。 -\end{abstract} - -% -------------------------------------------------------------------------- -\section{角色与信息可见性} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[node distance=1.4cm and 2cm] - \node[actor] (c) {快递员\\(存件/投件)}; - \node[actor, right=3.2cm of c] (s) {发件人\\(电商/个人)}; - \coordinate (midcs) at ($ (c)!0.5!(s) $); - \node[actor, below=1.8cm of midcs] (r) {收件人}; - - \node[sys, right=3cm of r, minimum width=3.4cm] (plat) {物流平台\\\footnotesize 订单 / 轨迹 / 发码}; - \node[sys, below=of plat, minimum width=3.4cm] (lock) {自提柜控制器\\\footnotesize 格口 / 电子锁}; - - \draw[flow] (c) -- node[lab, left] {投件扫码\\工号/任务单} (plat); - \draw[flow] (s) -- node[lab, above, sloped] {运单信息\\(无取件码)} (plat); - \draw[flow, UPSgold!70!black] (plat) -- node[lab, right] {短信/App\\\textbf{取件码}} (r); - \draw[flow] (plat) -- node[lab, right] {开格指令} (lock); - \draw[flow] (c) -- node[lab, below, sloped] {物理投件} (lock); - - \node[secret, rounded corners, fit=(r) (plat), inner sep=8pt, label={[font=\footnotesize]above:\textbf{取件码仅在收件人通道}}] {}; -\end{tikzpicture} -\caption{示意:发件人与快递员一般不接收「收件取件码」;收件人通过平台下发获得取件码。} -\label{fig:visibility} -\end{figure} - -% -------------------------------------------------------------------------- -\section{业务流程(泳道图)} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[ - x=1cm, y=1cm, - lane/.style={draw=UPSbrown!40, fill=UPSlight, minimum height=5.2cm, minimum width=3.6cm, anchor=north west} -] - - % lanes - \node[lane] (L1) at (0,0) {}; - \node[anchor=north west, font=\bfseries\footnotesize, text=UPSbrown] at (0.15,-0.15) {快递员}; - \node[lane] (L2) at (4,0) {}; - \node[anchor=north west, font=\bfseries\footnotesize, text=UPSbrown] at (4.15,-0.15) {平台}; - \node[lane] (L3) at (8,0) {}; - \node[anchor=north west, font=\bfseries\footnotesize, text=UPSbrown] at (8.15,-0.15) {收件人}; - - % courier steps - \node[flowstep] at (1.8,-1.1) (a1) {到站扫描}; - \node[flowstep, below=0.55 of a1] (a2) {分配格口}; - \node[flowstep, below=0.55 of a2] (a3) {投件关门}; - - % platform steps - \node[flowstep] at (5.8,-1.1) (b1) {校验运单}; - \node[flowstep, below=0.55 of b1] (b2) {生成取件码}; - \node[flowstep, below=0.55 of b2] (b3) {短信/App 推送}; - \node[flowstep, below=0.55 of b3] (b4) {更新状态\\「待取件」}; - - % recipient - \node[flowstep] at (9.8,-1.1) (c1) {收到通知}; - \node[flowstep, below=0.55 of c1] (c2) {到柜输入码}; - \node[flowstep, below=0.55 of c2] (c3) {取件完成}; - - \draw[flow] (a1) -- (b1); - \draw[flow] (b2) -- (c1); - \path (a3.south) ++(0,-0.2) coordinate (tmpa); - \draw[flow] (tmpa) -- (tmpa -| b1.west) |- (b1); - \path (c2.west) ++(-0.6,0) coordinate (tmpr); - \draw[flow] (c2.west) -- (tmpr) |- (b4.east); - -\end{tikzpicture} -\caption{泳道示意:平台在投件确认后生成取件码并下发收件人;快递员侧流程与取件码解耦。} -\label{fig:swimlane} -\end{figure} - -% -------------------------------------------------------------------------- -\section{系统分层架构} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[node distance=0.75cm] - \node[sys, minimum width=10cm, text width=9.6cm] (cli) {客户端层:快递员 App / 收件人 App / 柜机触摸屏}; - \node[sys, minimum width=10cm, text width=9.6cm, below=of cli] (gw) {网关层:API 网关、鉴权、限流、审计日志}; - \node[sys, minimum width=4.5cm, below left=1 and -0.2 of gw] (ord) {订单与运单服务}; - \node[sys, minimum width=4.5cm, below right=1 and -0.2 of gw] (code) {取件码服务\\\footnotesize 生成·绑定·失效}; - \node[sys, minimum width=4.5cm, below=of ord] (dev) {设备接入服务\\\footnotesize 开柜指令·状态回传}; - \node[sys, minimum width=4.5cm, below=of code] (msg) {消息服务\\\footnotesize 短信·推送·邮件}; - \node[sys, minimum width=10cm, text width=9.6cm, below=1.2 of dev.south west, anchor=west, xshift=0] (data) {数据层:运单库、取件码表(哈希)、设备影子、不可变审计}; - - \draw[flow] (cli) -- (gw); - \draw[flow] (gw.south west) ++(1.2,0) -- ++(0,-0.35) -| (ord); - \draw[flow] (gw.south east) ++(-1.2,0) -- ++(0,-0.35) -| (code); - \draw[flow] (ord) -- (dev); - \draw[flow] (code) -- (msg); - \draw[flow] (dev) -- (data.north -| dev); - \draw[flow] (msg) -- (data.north -| msg); -\end{tikzpicture} -\caption{逻辑分层:取件码由独立服务生成与校验,与投件流水解耦,便于最小权限与审计。} -\label{fig:architecture} -\end{figure} - -% -------------------------------------------------------------------------- -\section{取件码生命周期(状态机)} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[ - stnode/.style={circle, draw=UPSbrown, minimum size=1.15cm, align=center, font=\footnotesize, fill=white}, - acc/.style={-{Stealth}, thick, UPSbrown} -] - \node[stnode] (A) {未生成}; - \node[stnode, right=2.8cm of A] (B) {已生成\\未通知}; - \node[stnode, right=2.8cm of B] (C) {已下发}; - \coordinate (midBC) at ($ (B)!0.5!(C) $); - \node[stnode, below=2cm of midBC] (D) {已核销}; - \node[stnode, left=2.8cm of D, fill=UPSlight] (E) {过期/作废}; - - \draw[acc] (A) -- node[above, font=\scriptsize] {投件确认} (B); - \draw[acc] (B) -- node[above, font=\scriptsize] {推送} (C); - \draw[acc] (C) -- node[right, font=\scriptsize] {正确输入} (D); - \draw[acc] (C) -- node[below left, font=\scriptsize] {超时策略} (E); - \draw[acc] (B) -- node[left, font=\scriptsize] {撤件} (E); -\end{tikzpicture} -\caption{取件码状态机示意:实际生产需加入重试、风控冻结、客服人工核销等分支。} -\label{fig:statemachine} -\end{figure} - -\vfill -\noindent\rule{\linewidth}{0.4pt}\\[0.3em] -{\footnotesize\textcolor{UPSbrown}{Disclaimer:} 图示为通用物流自提逻辑的教学草稿,与 UPS 任何地区正式产品文档无关。配色仅作风格参考。} - -\end{document} diff --git a/fast_commit.ps1 b/fast_commit.ps1 deleted file mode 100644 index 58617b2..0000000 --- a/fast_commit.ps1 +++ /dev/null @@ -1,102 +0,0 @@ -# Function to initialize repository with master and develop branches -function Initialize-GitBranches { - $branches = git branch | ForEach-Object { $_.TrimStart('* ') } | Where-Object { $_ } - - if ($branches.Count -eq 0) { - Write-Host "`nNo branches found. Initializing repository with master and develop branches..." - - # Create and switch to master branch - git checkout -b master - - # Create initial commit if needed - if (-not (git log -n 1 2>$null)) { - Write-Host "Creating initial commit..." - git commit --allow-empty -m "Initial commit" - } - - # Create and push develop branch - git checkout -b develop - - # Push both branches to remote - git push -u origin master - git push -u origin develop - - Write-Host "Repository initialized with master and develop branches" - return $true - } - return $false -} - -# Fetch latest changes from remote -Write-Host "Fetching latest changes from remote..." -git fetch -Write-Host "Fetch completed`n" - -# Check and initialize branches if needed -$initialized = Initialize-GitBranches -if ($initialized) { - Write-Host "`nPlease run the script again to commit your changes." - exit -} - -# Function to select branch -function Select-GitBranch { - Write-Host "Available branches (local and remote):" - $branches = git branch -a | ForEach-Object { $_.TrimStart('* ').TrimStart('remotes/origin/') } | Where-Object { $_ -and $_ -ne 'HEAD' } | Sort-Object -Unique - $branches | ForEach-Object { Write-Host " $_" } - - do { - $selection = Read-Host "Enter branch name" - $branch = $branches | Where-Object { $_ -eq $selection } - if (-not $branch) { - Write-Host "Invalid branch name. Please try again." - } - } until ($branch) - - Write-Host "Selected branch: $branch" - return $branch -} - -# Get current branch -$current_branch = git branch --show-current -Write-Host "Current branch: $current_branch" - -# Ask for commit message -do { - $commit_message = Read-Host "Enter commit message" -} until ($commit_message) - -# Show status and ask for confirmation -git status -$confirm = Read-Host "`nCommit these changes? (y/n)" - -if ($confirm -ne "y") { - Write-Host "Commit cancelled" - exit -} - -# Select target branch -Write-Host "`nSelect target branch:" -$branch = Select-GitBranch - -# Commit and push -git add . -git commit -m $commit_message - -# If current branch is different from target, ask to switch -if ($branch -ne $current_branch) { - $switch_confirm = Read-Host "`nSwitch to $branch and merge changes? (y/n)" - - if ($switch_confirm -eq "y") { - git checkout $branch - git merge $current_branch - } -} - -# Ask to push -$push_confirm = Read-Host "`nPush changes to remote? (y/n)" - -if ($push_confirm -eq "y") { - git push origin $branch - Write-Host "Changes pushed successfully" -} \ No newline at end of file diff --git a/frontline/README.md b/frontline/README.md index a0380f8..a37e62a 100644 --- a/frontline/README.md +++ b/frontline/README.md @@ -6,19 +6,18 @@ This directory contains production-ready Expert Advisors (EAs) for MetaTrader 5, ``` frontline/ -├── MQL5/ # MetaTrader 5 Expert Advisors -│ ├── RSIScalpingXAUUSD/ # RSI Scalping for Gold -│ ├── RSIScalpingBTCUSD/ # RSI Scalping for Bitcoin -│ ├── RSIScalpingMSFT/ # RSI Scalping for Microsoft -│ ├── RSIScalpingTSLA/ # RSI Scalping for Tesla -│ ├── RSICrossOverReversalXAUUSD/ # RSI Crossover Reversal for Gold -│ ├── RSIMidPointHijackXAUUSD/ # RSI MidPoint Multi-Strategy for Gold -│ ├── EMASlopeDistanceCocktailXAUUSD/ # EMA Slope Distance Strategy -│ └── DarvasBoxXAUUSD/ # Darvas Box Breakout Strategy -└── tradingview/ # TradingView Pine Script strategies - └── SSEEMARSICocktail/ # Multi-indicator cocktail strategy +├── cluster-latest/ # United multi-strategy EA (production cluster) +├── units/ # Standalone per-symbol EAs +├── units-trailing/ # Trailing-stop variants +├── units-sharpshooter/ # Sharpshooter-tuned variants +├── units_economic_calendar/ # Calendar-filter variants +├── united_template/ # Templates for united EAs +├── cluster-NZDUSD/ # NZDUSD gene-combo cluster (R&D) +└── tradingview/ # TradingView Pine Script ``` +See [`docs/STRUCTURE.md`](../docs/STRUCTURE.md) for the full repo map. + ## Available Strategies ### RSI Scalping Strategies diff --git a/frontline/cluster-latest/123.set b/frontline/cluster-latest/123.set new file mode 100644 index 0000000..dd2bada --- /dev/null +++ b/frontline/cluster-latest/123.set @@ -0,0 +1,533 @@ +; saved on 2026.06.18 13:01:44 +; this file contains input parameters for testing/optimizing main expert advisor +; to use it in the strategy tester, click Load in the context menu of the Inputs tab +; +; === Strategy Enable/Disable === +; +; === Signal Replacement — close unprofitable on new signal (per strategy) === +DB_CloseUnprofitableOnNewSignal=false||false||0||true||N +ES_CloseUnprofitableOnNewSignal=true||false||0||true||N +RC_CloseUnprofitableOnNewSignal=false||false||0||true||N +RM_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_APPL_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_ADBE_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_BTCUSD_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_NVDA_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_TSLA_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_XAUUSD_CloseUnprofitableOnNewSignal=true||false||0||true||N +RS_MU_CloseUnprofitableOnNewSignal=false||false||0||true||N +RRA_EURUSD_CloseUnprofitableOnNewSignal=false||false||0||true||N +RRA_AUDUSD_CloseUnprofitableOnNewSignal=false||false||0||true||N +RRA_GBPUSD_CloseUnprofitableOnNewSignal=false||false||0||true||N +SE_CloseUnprofitableOnNewSignal=false||false||0||true||N +RCO_CloseUnprofitableOnNewSignal=false||false||0||true||N +ST_BTC_CloseUnprofitableOnNewSignal=false||false||0||true||N +ST_XAU_CloseUnprofitableOnNewSignal=false||false||0||true||N +ST_GER_CloseUnprofitableOnNewSignal=false||false||0||true||N +RSS_CloseUnprofitableOnNewSignal=false||false||0||true||N +UB_CloseUnprofitableOnNewSignal=false||false||0||true||N +GB_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_NAS100_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_US30_CloseUnprofitableOnNewSignal=true||false||0||true||N +UKB_CloseUnprofitableOnNewSignal=false||false||0||true||N +U5B_CloseUnprofitableOnNewSignal=false||false||0||true||N +EnableDarvasBox=true||false||0||true||N +EnableEMASlopeDistance=true||false||0||true||N +EnableRSICrossOverReversal=true||false||0||true||N +EnableRSIMidPointHijack=true||false||0||true||N +EnableRSIScalpingAPPL=false||false||0||true||N +EnableRSIScalpingADBE=false||false||0||true||N +EnableRSIScalpingBTCUSD=true||false||0||true||N +EnableRSIScalpingNVDA=true||false||0||true||N +EnableRSIScalpingTSLA=true||false||0||true||N +EnableRSIScalpingXAUUSD=true||false||0||true||N +EnableRSIScalpingMU=false||false||0||true||N +EnableSuperEMA=true||false||0||true||N +EnableRSIConsolidation=false||false||0||true||N +EnableRSIReversalAsianEURUSD=false||false||0||true||N +EnableRSIReversalAsianAUDUSD=true||false||0||true||N +EnableSimpleTrendlineBTCUSD=true||false||0||true||N +EnableSimpleTrendlineXAUUSD=true||false||0||true||N +EnableSimpleTrendlineGER40=false||false||0||true||N +EnableRSISecretSauce=false||false||0||true||N +EnableUSDJPYBuster=true||false||0||true||N +EnableGER40Buster=true||false||0||true||N +EnableNAS100Buster=false||false||0||true||N +EnableRSIReversalAsianGBPUSD=true||false||0||true||N +EnableRSIReversalAsianNZDUSD=false||false||0||true||N +EnableRSIReversalAsianUSDCHF=false||false||0||true||N +EnableRSIScalpingEURJPY=false||false||0||true||N +EnableRSIScalpingF=false||false||0||true||N +EnableRSIScalpingGBPJPY=false||false||0||true||N +EnableRSIScalpingNAS100=true||false||0||true||N +EnableRSIScalpingSNAP=false||false||0||true||N +EnableRSIScalpingSOFI=false||false||0||true||N +EnableRSIScalpingUS30=true||false||0||true||N +EnableRSIScalpingUS500=false||false||0||true||N +EnableRSIScalpingWBD=false||false||0||true||N +EnableRSIScalpingXAGUSD=false||false||0||true||N +EnableUK100Buster=true||false||0||true||N +EnableUS30Buster=false||false||0||true||N +EnableUS500Buster=true||false||0||true||N +EnableXAGUSDBuster=false||false||0||true||N +EnableXAUBearTrend=false||false||0||true||N +EnableXAUMomentumBreakdown=false||false||0||true||N +OPT_GuardOptimizationMode=true||false||0||true||N +; === Centralized Lot Size (Granular Per Robot) === +LOT_DB_DarvasBox=0.01||0.01||0.01||0.100000||N +LOT_ES_EMASlopeDistance=0.07||0.01||0.01||0.100000||N +LOT_RC_RSICrossOver=0.1||0.01||0.01||0.100000||N +LOT_RM_RSIMidPointHijack=0.01||0.01||0.01||0.100000||N +LOT_RS_APPL=5||5||5||15||N +LOT_RS_ADBE=5||5.0||5||15||N +LOT_RS_BTCUSD=0.06||0.01||0.010000||0.100000||N +LOT_RS_NVDA=5||5||5||25||N +LOT_RS_TSLA=5||5.0||5||25||N +LOT_RS_XAUUSD=0.04||0.010000||0.010000||0.100000||N +LOT_RS_MU=5||5.0||5||25||N +LOT_RRA_EURUSD=0.03||0.01||0.010000||0.100000||N +LOT_RRA_AUDUSD=0.05||0.01||0.010000||0.100000||N +LOT_SE_SuperEMA=0.01||0.01||0.010000||0.100000||N +LOT_RCO_RSIConsolidation=0.1||0.01||0.010000||0.100000||N +LOT_ST_BTCUSD=0.01||0.01||0.010000||0.100000||N +LOT_ST_XAUUSD=0.01||0.01||0.010000||0.100000||N +LOT_ST_GER40=0.1||0.01||0.010000||0.1||N +LOT_RSS_SecretSauce=0.1||0.1||0.010000||1.000000||N +LOT_UB_USDJPY=0.03||0.01||0.01||0.1||N +; === Balance-based position sizing === +LOT_GB_GER40=0.01||0.01||0.01||0.1||N +LOT_NB_NAS100=0.05||0.05||0.01||0.1||N +LOT_RRA_GBPUSD=0.03||0.03||0.01||0.1||N +LOT_RRA_NZDUSD=0.1||0.1||0.01||0.1||N +LOT_RRA_USDCHF=0.1||0.1||0.01||0.1||N +LOT_RS_EURJPY=0.08||0.08||0.01||0.1||N +LOT_RS_F=10||10||0.01||0.1||N +LOT_RS_GBPJPY=0.08||0.08||0.01||0.1||N +LOT_RS_SNAP=10||10||0.01||0.1||N +LOT_RS_SOFI=10||10||0.01||0.1||N +LOT_RS_US500=0.1||0.1||0.01||0.1||N +LOT_RS_WBD=10||10||0.01||0.1||N +LOT_RS_XAGUSD=0.05||0.05||0.01||0.1||N +LOT_U30B_US30=0.05||0.05||0.01||0.1||N +LOT_U5B_US500=0.05||0.05||0.01||0.1||N +LOT_RS_NAS100=0.03||0.03||0.01||0.1||N +LOT_RS_US30=0.02||0.02||0.01||0.1||N +LOT_UKB_UK100=0.01||0.01||0.01||0.1||N +LOT_XBT_XAUUSD=0.02||0.02||0.01||0.1||N +LOT_XGB_XAGUSD=0.05||0.05||0.01||0.1||N +LOT_XMB_XAUUSD=0.02||0.02||0.01||0.1||N +ORCH_ScaleLotsByBalance=true||false||0||true||N +ORCH_UseEquityInsteadOfBalance=false||false||0||true||N +ORCH_ReferenceBalance=3000||3000.0||100.000000||10000.000000||N +ORCH_MinBalanceScale=0.1||0.1||0.010000||1.000000||N +ORCH_MaxBalanceScale=100000||100000.0||10000.000000||1000000.000000||N +; === Gap Loss Prevention (跳空) === +GAP_Enable=false||false||0||true||N +GAP_CloseBeforeSessionEnd=true||false||0||true||N +GAP_MinutesBeforeClose=15||15||1||150||N +GAP_CloseBeforeWeekend=true||false||0||true||N +GAP_FridayCloseHour=20||20||1||200||N +GAP_CloseOnBarGapThroughSL=true||false||0||true||N +GAP_MinGapPoints=0||0.0||0.000000||0.000000||N +GAP_EquityDailyFlatHour=21||21||1||210||N +; === DarvasBox Strategy === +DB_Symbol=XAUUSD +DB_BoxPeriod=165||165||1||1650||N +DB_BoxDeviation=30000||30000.0||3000.000000||300000.000000||N +DB_VolumeThreshold=0||0||1||10||N +DB_StopLoss=1665||1665.0||166.500000||16650.000000||N +DB_TakeProfit=3685||3685.0||368.500000||36850.000000||N +DB_EnableLogging=false||false||0||true||N +DB_BoxColor=16711680 +DB_BoxWidth=1||1||1||10||N +DB_TrendTimeframe=16386||0||0||49153||N +DB_MA_Period=125||125||1||1250||N +DB_MA_Method=1||0||0||3||N +DB_MA_Price=7||1||0||7||N +DB_TrendThreshold=4.94||4.94||0.494000||49.400000||N +DB_VolumeMA_Period=110||110||1||1100||N +DB_VolumeThresholdMultiplier=1.5||1.5||0.150000||15.000000||N +DB_UseVolumeSpikeFilter=true||false||0||true||N +DB_UseTrendFilter=true||false||0||true||N +DB_MagicNumber=135790||135790||1||1357900||N +; === EMA Slope Distance Strategy === +ES_Symbol=XAUUSD +ES_EMA_Periode=46||46||1||460||N +ES_PreisSchwelle=600||600.0||60.000000||6000.000000||N +ES_SteigungSchwelle=80||80.0||8.000000||800.000000||N +ES_ÜberwachungTimeout=800||800||1||8000||N +ES_TrailingStop=250||370.0||37.000000||3700.000000||N +ES_UseTrailingStop=true||false||0||true||N +ES_TrailingActivationPips=0||0.0||0.000000||0.000000||N +ES_UseStaleStopLossExit=false||false||0||true||N +ES_StaleStopLossSeconds=33800||33800||1||338000||N +ES_LotGröße=0.03||0.07||0.007000||0.700000||N +ES_MagicNumber=12350||12350||1||123500||N +ES_UseSpreadAdjustment=true||false||0||true||N +ES_Timeframe=16385||0||0||49153||N +ES_UseBarData=true||false||0||true||N +ES_MaxTradesPerCrossover=9||9||1||90||N +ES_ProfitCheckBars=18||18||1||180||N +ES_CloseUnprofitableTrades=true||false||0||true||N +ES_UseWeeklyADXFilter=true||false||0||true||N +ES_WeeklyADXPeriod=15||15||1||150||N +ES_WeeklyADXMin=40||40.0||4.000000||400.000000||N +ES_WeeklyADXBarShift=2||2||1||20||N +ES_WeeklyADXUseDirection=true||false||0||true||N +; === RSI CrossOver Reversal Strategy === +RC_Symbol=XAUUSD +RC_MagicNumber=7||7||1||70||N +RC_rsiPeriod=19||19||1||190||N +RC_overboughtLevel=93||93||1||930||N +RC_oversoldLevel=22||22||1||220||N +RC_entryRSIBuySpread=0||0.0||0.000000||0.000000||N +RC_entryRSISellSpread=0||0.0||0.000000||0.000000||N +RC_lotSize=0.01||0.1||0.010000||1.000000||N +RC_slippage=3||3||1||30||N +RC_cooldownSeconds=209||209||1||2090||N +RC_TimeFrame1=1||0||0||49153||N +RC_TimeFrame2=1||0||0||49153||N +RC_BarTimeFrame=12||0||0||49153||N +RC_emaPeriod=140||140||1||1400||N +RC_emaSlopeThreshold=105||105.0||10.500000||1050.000000||N +RC_exitBuyRSI=86||86.0||8.600000||860.000000||N +RC_exitSellRSI=10||10.0||1.000000||100.000000||N +RC_TrailingStop=295||295.0||29.500000||2950.000000||N +RC_emaDistanceThreshold=165||165.0||16.500000||1650.000000||N +RC_UseTrendStrengthFilter=true||false||0||true||N +RC_tradingHourOneBegin=24||24||1||240||N +RC_tradingHourOneEnd=22||22||1||220||N +RC_tradingHourTwoBegin=6||6||1||60||N +RC_tradingHourTwoEnd=19||19||1||190||N +RC_Sunday=false||false||0||true||N +RC_Monday=false||false||0||true||N +RC_Tuesday=true||false||0||true||N +RC_Wednesday=true||false||0||true||N +RC_Thursday=true||false||0||true||N +RC_Friday=false||false||0||true||N +RC_Saturday=false||false||0||true||N +; === RSI MidPoint Hijack Strategy === +RM_Symbol=XAUUSD +RM_InpTimeframe=16385||0||0||49153||N +RM_InpLotSize=0.02||0.1||0.010000||1.000000||N +RM_InpMagicNumberRSIFollow=1001||1001||1||10010||N +RM_InpMagicNumberRSIReverse=1002||1002||1||10020||N +RM_InpMagicNumberEMACross=1003||1003||1||10030||N +RM_InpEnableRSIFollow=true||false||0||true||N +RM_InpEnableRSIReverse=true||false||0||true||N +RM_InpEnableEMACross=true||false||0||true||N +RM_InpEnableStrategyLock=false||false||0||true||N +RM_InpLockProfitThreshold=0||0.0||0.000000||0.000000||N +RM_InpCloseOppositeTrades=false||false||0||true||N +RM_InpRSIPeriod=32||32||1||320||N +RM_InpRSIOverbought=78||78||1||780||N +RM_InpRSIOversold=46||46||1||460||N +RM_InpRSIExitLevel=44||44||1||440||N +RM_InpRSIFollowStartHour=23||23||1||230||N +RM_InpRSIFollowEndHour=8||8||1||80||N +RM_InpRSIFollowCloseOutsideHours=false||false||0||true||N +RM_InpRSIReversePeriod=59||59||1||590||N +RM_InpRSIReverseOverbought=51||51||1||510||N +RM_InpRSIReverseOversold=49||49||1||490||N +RM_InpRSIReverseCrossLevel=53||53||1||530||N +RM_InpRSIReverseExitLevel=48||48||1||480||N +RM_InpRSIReverseStartHour=7||7||1||70||N +RM_InpRSIReverseEndHour=13||13||1||130||N +RM_InpRSIReverseCloseOutsideHours=false||false||0||true||N +RM_InpRSIReverseCooldownBars=15||15||1||150||N +RM_InpRSIReverseCooldownOnLoss=true||false||0||true||N +RM_InpEMAPeriod=120||120||1||1200||N +RM_InpEMACrossStartHour=8||8||1||80||N +RM_InpEMACrossEndHour=14||14||1||140||N +RM_InpEMACrossCloseOutsideHours=true||false||0||true||N +RM_InpUseEMADistanceEntry=true||false||0||true||N +RM_InpEMADistancePips=160||160.0||16.000000||1600.000000||N +RM_InpEMADistancePeriod=26||26||1||260||N +; === RSI Scalping APPL (AAPL) - Pepperstone US === +RS_APPL_Symbol=AAPL.NAS +RS_APPL_TimeFrame=10||0||0||49153||N +RS_APPL_RSI_Period=14||8||1||80||N +RS_APPL_RSI_Applied_Price=1||1||0||7||N +RS_APPL_RSI_Overbought=80||62.0||6.200000||620.000000||N +RS_APPL_RSI_Oversold=78||32.0||3.200000||320.000000||N +RS_APPL_RSI_Target_Buy=94||67.0||6.700000||670.000000||N +RS_APPL_RSI_Target_Sell=44||2.0||0.200000||20.000000||N +RS_APPL_BarsToWait=7||5||1||50||N +RS_APPL_LotSize=25||25.0||2.500000||250.000000||N +RS_APPL_MagicNumber=20001||20001||1||200010||N +RS_APPL_Slippage=3||3||1||30||N +; === RSI Scalping ADBE - Pepperstone US === +RS_ADBE_Symbol=ADBE.NAS +RS_ADBE_TimeFrame=6||0||0||49153||N +RS_ADBE_RSI_Period=15||15||1||150||N +RS_ADBE_RSI_Applied_Price=2||1||0||7||N +RS_ADBE_RSI_Overbought=16||16.0||1.600000||160.000000||N +RS_ADBE_RSI_Oversold=42||42.0||4.200000||420.000000||N +RS_ADBE_RSI_Target_Buy=67||67.0||6.700000||670.000000||N +RS_ADBE_RSI_Target_Sell=62||62.0||6.200000||620.000000||N +RS_ADBE_BarsToWait=8||8||1||80||N +RS_ADBE_LotSize=5||5.0||0.500000||50.000000||N +RS_ADBE_MagicNumber=12345||12345||1||123450||N +RS_ADBE_Slippage=3||3||1||30||N +; === RSI Scalping BTCUSD === +RS_BTCUSD_Symbol=BTCUSD +RS_BTCUSD_TimeFrame=16385||0||0||49153||N +RS_BTCUSD_RSI_Period=14||14||1||140||N +RS_BTCUSD_RSI_Applied_Price=1||1||0||7||N +RS_BTCUSD_RSI_Overbought=90||90.0||9.000000||900.000000||N +RS_BTCUSD_RSI_Oversold=73||73.0||7.300000||730.000000||N +RS_BTCUSD_RSI_Target_Buy=88||88.0||8.800000||880.000000||N +RS_BTCUSD_RSI_Target_Sell=48||48.0||4.800000||480.000000||N +RS_BTCUSD_BarsToWait=6||6||1||60||N +RS_BTCUSD_LotSize=0.1||0.1||0.010000||1.000000||N +RS_BTCUSD_MagicNumber=123459123||123459123||1||1234591230||N +RS_BTCUSD_Slippage=3||3||1||30||N +; === RSI Scalping NVDA - Pepperstone US === +RS_NVDA_Symbol=NVDA.NAS +RS_NVDA_TimeFrame=15||0||0||49153||N +RS_NVDA_RSI_Period=8||8||1||80||N +RS_NVDA_RSI_Applied_Price=1||1||0||7||N +RS_NVDA_RSI_Overbought=36||36.0||3.600000||360.000000||N +RS_NVDA_RSI_Oversold=38||38.0||3.800000||380.000000||N +RS_NVDA_RSI_Target_Buy=90||90.0||9.000000||900.000000||N +RS_NVDA_RSI_Target_Sell=70||70.0||7.000000||700.000000||N +RS_NVDA_BarsToWait=5||5||1||50||N +RS_NVDA_LotSize=50||5.0||0.500000||50.000000||N +RS_NVDA_MagicNumber=20003||20003||1||200030||N +RS_NVDA_Slippage=3||3||1||30||N +; === RSI Scalping TSLA - Pepperstone US === +RS_TSLA_Symbol=TSLA.NAS +RS_TSLA_TimeFrame=16385||0||0||49153||N +RS_TSLA_RSI_Period=14||14||1||140||N +RS_TSLA_RSI_Applied_Price=1||1||0||7||N +RS_TSLA_RSI_Overbought=54||54.0||5.400000||540.000000||N +RS_TSLA_RSI_Oversold=73||73.0||7.300000||730.000000||N +RS_TSLA_RSI_Target_Buy=87||87.0||8.700000||870.000000||N +RS_TSLA_RSI_Target_Sell=33||33.0||3.300000||330.000000||N +RS_TSLA_BarsToWait=1||1||1||10||N +RS_TSLA_LotSize=50||5.0||0.500000||50.000000||N +RS_TSLA_MagicNumber=125421321||125421321||1||1254213210||N +RS_TSLA_Slippage=3||3||1||30||N +; === RSI Scalping XAUUSD === +RS_XAUUSD_Symbol=XAUUSD +RS_XAUUSD_TimeFrame=16385||0||0||49153||N +RS_XAUUSD_RSI_Period=14||14||1||140||N +RS_XAUUSD_RSI_Applied_Price=1||1||0||7||N +RS_XAUUSD_RSI_Overbought=71||71.0||7.100000||710.000000||N +RS_XAUUSD_RSI_Oversold=57||57.0||5.700000||570.000000||N +RS_XAUUSD_RSI_Target_Buy=80||80.0||8.000000||800.000000||N +RS_XAUUSD_RSI_Target_Sell=57||57.0||5.700000||570.000000||N +RS_XAUUSD_BarsToWait=4||4||1||40||N +RS_XAUUSD_LotSize=0.1||0.1||0.010000||1.000000||N +RS_XAUUSD_MagicNumber=129102315||129102315||1||1291023150||N +RS_XAUUSD_Slippage=3||3||1||30||N +; === RSI Scalping MU === +RS_MU_Symbol=MU.NAS +RS_MU_TimeFrame=20||0||0||49153||N +RS_MU_RSI_Period=14||14||1||140||N +RS_MU_RSI_Applied_Price=1||1||0||7||N +RS_MU_RSI_Overbought=32||32.0||3.200000||320.000000||N +RS_MU_RSI_Oversold=86||86.0||8.600000||860.000000||N +RS_MU_RSI_Target_Buy=100||100.0||10.000000||1000.000000||N +RS_MU_RSI_Target_Sell=24||24.0||2.400000||240.000000||N +RS_MU_BarsToWait=34||34||1||340||N +RS_MU_LotSize=5||5.0||0.500000||50.000000||N +RS_MU_MagicNumber=129102316||129102316||1||1291023160||N +RS_MU_Slippage=3||3||1||30||N +; === RSI Scalping Reversal Escape (XAUUSD only) === +RS_UseReversalEscape=true||false||0||true||N +RS_ReversalATRPeriod=14||14||1||140||N +RS_ReversalAdverseAtrMult=5.25||5.25||0.525000||52.500000||N +RS_ReversalSignsRequired=2||2||1||20||N +RS_ReversalRsiVelocity=16||16.0||1.600000||160.000000||N +RS_ReversalBodyAtrMult=5.1||5.1||0.510000||51.000000||N +; === RSI Scalping APPL — Trailing (cluster-fuck BTC-style defaul +RS_APPL_UseTrailingStop=true||false||0||true||N +RS_APPL_TrailDistancePoints=120||120.0||12.000000||1200.000000||N +RS_APPL_TrailActivationPoints=0||0.0||0.000000||0.000000||N +; === RSI Scalping ADBE — Trailing === +RS_ADBE_UseTrailingStop=true||false||0||true||N +RS_ADBE_TrailDistancePoints=425||425.0||42.500000||4250.000000||N +RS_ADBE_TrailActivationPoints=18.5||18.5||1.850000||185.000000||N +; === RSI Scalping BTCUSD — Trailing === +RS_BTCUSD_UseTrailingStop=true||false||0||true||N +RS_BTCUSD_TrailDistancePoints=120||120.0||12.000000||1200.000000||N +RS_BTCUSD_TrailActivationPoints=0||0.0||0.000000||0.000000||N +; === RSI Scalping NVDA — Trailing === +RS_NVDA_UseTrailingStop=true||false||0||true||N +RS_NVDA_TrailDistancePoints=375||375.0||37.500000||3750.000000||N +RS_NVDA_TrailActivationPoints=75||75.0||7.500000||750.000000||N +; === RSI Scalping TSLA — Trailing === +RS_TSLA_UseTrailingStop=true||false||0||true||N +RS_TSLA_TrailDistancePoints=900||900.0||90.000000||9000.000000||N +RS_TSLA_TrailActivationPoints=500||500.0||50.000000||5000.000000||N +; === RSI Scalping XAUUSD — Trailing === +RS_XAUUSD_UseTrailingStop=true||false||0||true||N +RS_XAUUSD_TrailDistancePoints=71||71.0||7.100000||710.000000||N +RS_XAUUSD_TrailActivationPoints=41||41.0||4.100000||410.000000||N +; === RSI Reversal Asian EURUSD === +RRA_EURUSD_Symbol=EURUSD +RRA_EURUSD_RSIPeriod=28||28||1||280||N +RRA_EURUSD_OverboughtLevel=60||60.0||6.000000||600.000000||N +RRA_EURUSD_OversoldLevel=8||8.0||0.800000||80.000000||N +RRA_EURUSD_TakeProfitPips=175||175||1||1750||N +RRA_EURUSD_StopLossPips=5||5||1||50||N +RRA_EURUSD_MaxLotSize=0.1||0.1||0.010000||1.000000||N +RRA_EURUSD_MaxSpread=1000||1000||1||10000||N +RRA_EURUSD_MaxDuration=270||270||1||2700||N +RRA_EURUSD_UseStopLoss=false||false||0||true||N +RRA_EURUSD_UseTakeProfit=false||false||0||true||N +RRA_EURUSD_UseRSIExit=true||false||0||true||N +RRA_EURUSD_RSIExitLevel=55||55.0||5.500000||550.000000||N +RRA_EURUSD_CloseOutsideSession=false||false||0||true||N +RRA_EURUSD_TimeFrame=15||0||0||49153||N +RRA_EURUSD_MagicNumber=30001||30001||1||300010||N +RRA_EURUSD_Slippage=3||3||1||30||N +; === RSI Reversal Asian AUDUSD === +RRA_AUDUSD_Symbol=AUDUSD +RRA_AUDUSD_RSIPeriod=28||28||1||280||N +RRA_AUDUSD_OverboughtLevel=68||68.0||6.800000||680.000000||N +RRA_AUDUSD_OversoldLevel=30||30.0||3.000000||300.000000||N +RRA_AUDUSD_TakeProfitPips=175||175||1||1750||N +RRA_AUDUSD_StopLossPips=5||5||1||50||N +RRA_AUDUSD_MaxLotSize=0.2||0.2||0.020000||2.000000||N +RRA_AUDUSD_MaxSpread=1000||1000||1||10000||N +RRA_AUDUSD_MaxDuration=340||340||1||3400||N +RRA_AUDUSD_UseStopLoss=false||false||0||true||N +RRA_AUDUSD_UseTakeProfit=false||false||0||true||N +RRA_AUDUSD_UseRSIExit=true||false||0||true||N +RRA_AUDUSD_RSIExitLevel=48||48.0||4.800000||480.000000||N +RRA_AUDUSD_CloseOutsideSession=true||false||0||true||N +RRA_AUDUSD_TimeFrame=15||0||0||49153||N +RRA_AUDUSD_MagicNumber=30002||30002||1||300020||N +RRA_AUDUSD_Slippage=3||3||1||30||N +; === SuperEMA (EMA + CCI + MACD) === +SE_Symbol=XAUUSD +SE_Timeframe=15||0||0||49153||N +SE_LotSize=0.01||0.01||0.001000||0.100000||N +SE_SlippagePoints=55||55||1||550||N +SE_MagicNumber=940001||940001||1||9400010||N +SE_EmaFast=40||40||1||400||N +SE_EmaMid=180||180||1||1800||N +SE_EmaSlow=125||125||1||1250||N +SE_EmaTrendBars=3||3||1||30||N +SE_CciPeriod=17||17||1||170||N +SE_CciOverbought=80||80.0||8.000000||800.000000||N +SE_CciOversold=-140||-140.0||-14.000000||-1400.000000||N +SE_PullbackCciLookback=20||20||1||200||N +SE_MacdFast=14||14||1||140||N +SE_MacdSlow=38||38||1||380||N +SE_MacdSignal=9||9||1||90||N +SE_EntryStyle=1||0||0||2||N +SE_OneTradeOnly=true||false||0||true||N +SE_UseStructuralSL=false||false||0||true||N +SE_SlBufferPoints=110||110.0||11.000000||1100.000000||N +SE_ExitOnTrendFlip=false||false||0||true||N +SE_ExitOnMacdFlip=false||false||0||true||N +SE_ExitOnCciZeroCross=true||false||0||true||N +SE_MaxHoldingBars=168||168||1||1680||N +SE_ExitBelowMidEma=false||false||0||true||N +SE_DebugLogs=false||false||0||true||N +; === RSI Consolidation (ranging / mean-reversion) === +RCO_Symbol=XAUUSD +RCO_SignalTF=15||0||0||49153||N +RCO_EntryOnNewBarOnly=true||false||0||true||N +RCO_ADX_Period=23||23||1||230||N +RCO_ADX_Max=29||29.0||2.900000||290.000000||N +RCO_UseATRRatioFilter=true||false||0||true||N +RCO_ATR_Period=8||8||1||80||N +RCO_ATR_SMA_Period=35||35||1||350||N +RCO_ATR_Ratio_Max=1.36||1.36||0.136000||13.600000||N +RCO_UseFlatEMAFilter=true||false||0||true||N +RCO_EMA_Fast=13||13||1||130||N +RCO_EMA_Slow=17||17||1||170||N +RCO_EMA_Separation_MaxPct=0.26||0.26||0.026000||2.600000||N +RCO_RSI_Period=8||8||1||80||N +RCO_RSI_Price=2||1||0||7||N +RCO_RSI_Oversold=22||22.0||2.200000||220.000000||N +RCO_RSI_Overbought=63||63.0||6.300000||630.000000||N +RCO_UseRSI_MeanExit=true||false||0||true||N +RCO_RSI_Exit_Long=48||48.0||4.800000||480.000000||N +RCO_RSI_Exit_Short=52||52.0||5.200000||520.000000||N +RCO_SL_ATR_Mult=2.15||2.15||0.215000||21.500000||N +RCO_TP_ATR_Mult=2.4||2.4||0.240000||24.000000||N +RCO_MaxBarsInTrade=54||54||1||540||N +RCO_Lots=0.1||0.1||0.010000||1.000000||N +RCO_MagicNumber=20250420||20250420||1||202504200||N +RCO_Slippage=10||10||1||100||N +RCO_MaxSpreadPoints=28||28||1||280||N +; === SimpleTrendline BTCUSD === +ST_BTC_Symbol=BTCUSD +ST_BTC_SignalTF=16385||0||0||49153||N +ST_BTC_HigherTF=16388||0||0||49153||N +ST_BTC_MAPeriod=150||150||1||1500||N +ST_BTC_MAMethod=2||0||0||3||N +ST_BTC_AppliedPrice=2||1||0||7||N +ST_BTC_HTFBarsToScan=1200||1200||1||12000||N +ST_BTC_LineTouchTolerance=170||170.0||17.000000||1700.000000||N +ST_BTC_BreakBuffer=90||90.0||9.000000||900.000000||N +ST_BTC_MagicNumber=26042501||26042501||1||260425010||N +ST_BTC_DrawTrendline=true||false||0||true||N +; === SimpleTrendline XAUUSD === +ST_XAU_Symbol=XAUUSD +ST_XAU_SignalTF=16385||0||0||49153||N +ST_XAU_HigherTF=10||0||0||49153||N +ST_XAU_MAPeriod=65||65||1||650||N +ST_XAU_MAMethod=1||0||0||3||N +ST_XAU_AppliedPrice=2||1||0||7||N +ST_XAU_HTFBarsToScan=500||500||1||5000||N +ST_XAU_LineTouchTolerance=220||220.0||22.000000||2200.000000||N +ST_XAU_BreakBuffer=110||110.0||11.000000||1100.000000||N +ST_XAU_MagicNumber=26042503||26042501||1||260425010||N +ST_XAU_DrawTrendline=true||false||0||true||N +; === SimpleTrendline GER40 === +ST_GER_Symbol=GER40 +ST_GER_SignalTF=15||0||0||49153||N +ST_GER_HigherTF=15||0||0||49153||N +ST_GER_MAPeriod=65||65||1||650||N +ST_GER_MAMethod=3||0||0||3||N +ST_GER_AppliedPrice=2||1||0||7||N +ST_GER_HTFBarsToScan=1200||1200||1||12000||N +ST_GER_LineTouchTolerance=100||100.0||10.000000||1000.000000||N +ST_GER_BreakBuffer=80||80.0||8.000000||800.000000||N +ST_GER_MagicNumber=26042502||26042502||1||260425020||N +ST_GER_DrawTrendline=true||false||0||true||N +; === RSI Secret Sauce XAUUSD === +RSS_Symbol=XAUUSD +RSS_MagicNumber=789012||789012||1||7890120||N +RSS_Slippage=10||10||1||100||N +RSS_Timeframe=30||0||0||49153||N +RSS_RSIPeriod=16||16||1||160||N +RSS_RSIOverbought=72.5||72.5||7.250000||725.000000||N +RSS_RSIOversold=32.5||32.5||3.250000||325.000000||N +RSS_RSILookback=60||60||1||600||N +RSS_PeakBars=2||2||1||20||N +RSS_StopLossATR=2.75||2.75||0.275000||27.500000||N +RSS_TakeProfitATR=5||5.0||0.500000||50.000000||N +RSS_ATRPeriod=14||14||1||140||N +RSS_UseSwingStopLoss=false||false||0||true||N +RSS_SwingLookback=30||30||1||300||N +RSS_MaxPositions=1||1||1||10||N +RSS_MinBarsBetweenTrades=7||7||1||70||N +; === USDJPY Buster (Asian range breakout) === +UB_Symbol=USDJPY +UB_RangeStartHour=3||3||1||30||N +UB_RangeEndHour=6||6||1||60||N +UB_CloseHour=18||18||1||180||N +UB_RangeTF=20||0||0||49153||N +UB_MinRangePoints=15||15||1||150||N +UB_OrderBufferPoints=4.75||4.75||0.475000||47.500000||N +UB_FirstTradeOnly=false||false||0||true||N +UB_AllowLong=true||false||0||true||N +UB_AllowShort=true||false||0||true||N +UB_UseTakeProfit=false||false||0||true||N +UB_TakeProfitPoints=0||0.0||0.000000||0.000000||N +UB_RiskMode=2||0||0||2||N +UB_FixedRiskMoney=250||250.0||25.000000||2500.000000||N +UB_RiskPercent=0.1||0.1||0.010000||1.000000||N +UB_FixedLots=0.01||0.01||0.001000||0.100000||N +UB_MagicNumber=927002||927002||1||9270020||N +UB_Slippage=20||20||1||200||N +UB_MaxSpreadPoints=20||20||1||200||N +UB_DrawRange=false||false||0||true||N +UB_DebugLog=false||false||0||true||N diff --git a/frontline/cluster-latest/123_close_recommended.set b/frontline/cluster-latest/123_close_recommended.set new file mode 100644 index 0000000..5a1a351 --- /dev/null +++ b/frontline/cluster-latest/123_close_recommended.set @@ -0,0 +1,491 @@ +; saved on 2026.06.18 13:01:44 +; this file contains input parameters for testing/optimizing main expert advisor +; to use it in the strategy tester, click Load in the context menu of the Inputs tab +; +; === Strategy Enable/Disable === +; +; === Signal Replacement — close unprofitable on new signal (per strategy) === +DB_CloseUnprofitableOnNewSignal=false||false||0||true||N +ES_CloseUnprofitableOnNewSignal=true +RC_CloseUnprofitableOnNewSignal=false||false||0||true||N +RM_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_APPL_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_ADBE_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_BTCUSD_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_NVDA_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_TSLA_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_XAUUSD_CloseUnprofitableOnNewSignal=true +RS_MU_CloseUnprofitableOnNewSignal=false||false||0||true||N +RRA_EURUSD_CloseUnprofitableOnNewSignal=false||false||0||true||N +RRA_AUDUSD_CloseUnprofitableOnNewSignal=false||false||0||true||N +RRA_GBPUSD_CloseUnprofitableOnNewSignal=false||false||0||true||N +SE_CloseUnprofitableOnNewSignal=false||false||0||true||N +RCO_CloseUnprofitableOnNewSignal=false||false||0||true||N +ST_BTC_CloseUnprofitableOnNewSignal=false||false||0||true||N +ST_XAU_CloseUnprofitableOnNewSignal=false||false||0||true||N +ST_GER_CloseUnprofitableOnNewSignal=false||false||0||true||N +RSS_CloseUnprofitableOnNewSignal=false||false||0||true||N +UB_CloseUnprofitableOnNewSignal=false||false||0||true||N +GB_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_NAS100_CloseUnprofitableOnNewSignal=false||false||0||true||N +RS_US30_CloseUnprofitableOnNewSignal=true +UKB_CloseUnprofitableOnNewSignal=false||false||0||true||N +U5B_CloseUnprofitableOnNewSignal=false||false||0||true||N +EnableDarvasBox=true||false||0||true||N +EnableEMASlopeDistance=true||false||0||true||N +EnableRSICrossOverReversal=true||false||0||true||N +EnableRSIMidPointHijack=true||false||0||true||N +EnableRSIScalpingAPPL=true||false||0||true||N +EnableRSIScalpingADBE=false||false||0||true||N +EnableRSIScalpingBTCUSD=true||false||0||true||N +EnableRSIScalpingNVDA=true||false||0||true||N +EnableRSIScalpingTSLA=true||false||0||true||N +EnableRSIScalpingXAUUSD=true||false||0||true||N +EnableRSIScalpingMU=true||false||0||true||N +EnableSuperEMA=true||false||0||true||N +EnableRSIConsolidation=true||false||0||true||N +EnableRSIReversalAsianEURUSD=true||false||0||true||N +EnableRSIReversalAsianAUDUSD=true||false||0||true||N +EnableSimpleTrendlineBTCUSD=true||false||0||true||N +EnableSimpleTrendlineXAUUSD=true||false||0||true||N +EnableSimpleTrendlineGER40=true||false||0||true||N +EnableRSISecretSauce=false||false||0||true||N +EnableUSDJPYBuster=true||false||0||true||N +OPT_GuardOptimizationMode=true||false||0||true||N +; === Centralized Lot Size (Granular Per Robot) === +LOT_DB_DarvasBox=0.06||0.01||0.01||0.100000||N +LOT_ES_EMASlopeDistance=0.1||0.01||0.01||0.100000||N +LOT_RC_RSICrossOver=0.05||0.01||0.01||0.100000||N +LOT_RM_RSIMidPointHijack=0.03||0.01||0.01||0.100000||N +LOT_RS_APPL=15||5||5||25||N +LOT_RS_ADBE=20||5.0||5||25||N +LOT_RS_BTCUSD=0.1||0.01||0.010000||0.100000||N +LOT_RS_NVDA=5||5||5||25||N +LOT_RS_TSLA=10||5.0||5||25||N +LOT_RS_XAUUSD=0.1||0.010000||0.010000||0.100000||N +LOT_RS_MU=10||5.0||5||25||N +LOT_RRA_EURUSD=0.01||0.01||0.010000||0.100000||N +LOT_RRA_AUDUSD=0.1||0.01||0.010000||0.100000||N +LOT_SE_SuperEMA=0.01||0.01||0.010000||0.100000||N +LOT_RCO_RSIConsolidation=0.03||0.01||0.010000||0.100000||N +LOT_ST_BTCUSD=0.04||0.01||0.010000||0.100000||N +LOT_ST_XAUUSD=0.01||0.01||0.010000||0.100000||N +LOT_ST_GER40=0.01||0.01||0.010000||0.1||N +LOT_RSS_SecretSauce=0.1||0.1||0.010000||1.000000||N +LOT_UB_USDJPY=0.06||0.01||0.01||0.1||Y +; === Balance-based position sizing === +ORCH_ScaleLotsByBalance=true||false||0||true||N +ORCH_UseEquityInsteadOfBalance=false||false||0||true||N +ORCH_ReferenceBalance=3000||1000.0||100.000000||10000.000000||N +ORCH_MinBalanceScale=0.1||0.1||0.010000||1.000000||N +ORCH_MaxBalanceScale=100000||100000.0||10000.000000||1000000.000000||N +; === Gap Loss Prevention (跳空) === +GAP_Enable=false||false||0||true||N +GAP_CloseBeforeSessionEnd=true||false||0||true||N +GAP_MinutesBeforeClose=15||15||1||150||N +GAP_CloseBeforeWeekend=true||false||0||true||N +GAP_FridayCloseHour=20||20||1||200||N +GAP_CloseOnBarGapThroughSL=true||false||0||true||N +GAP_MinGapPoints=0||0.0||0.000000||0.000000||N +GAP_EquityDailyFlatHour=21||21||1||210||N +; === DarvasBox Strategy === +DB_Symbol=XAUUSD +DB_BoxPeriod=165||165||1||1650||N +DB_BoxDeviation=30000||30000.0||3000.000000||300000.000000||N +DB_VolumeThreshold=0||0||1||10||N +DB_StopLoss=1665||1665.0||166.500000||16650.000000||N +DB_TakeProfit=3685||3685.0||368.500000||36850.000000||N +DB_EnableLogging=false||false||0||true||N +DB_BoxColor=16711680 +DB_BoxWidth=1||1||1||10||N +DB_TrendTimeframe=16386||0||0||49153||N +DB_MA_Period=125||125||1||1250||N +DB_MA_Method=1||0||0||3||N +DB_MA_Price=7||1||0||7||N +DB_TrendThreshold=4.94||4.94||0.494000||49.400000||N +DB_VolumeMA_Period=110||110||1||1100||N +DB_VolumeThresholdMultiplier=1.5||1.5||0.150000||15.000000||N +DB_UseVolumeSpikeFilter=true||false||0||true||N +DB_UseTrendFilter=true||false||0||true||N +DB_MagicNumber=135790||135790||1||1357900||N +; === EMA Slope Distance Strategy === +ES_Symbol=XAUUSD +ES_EMA_Periode=46||46||1||460||N +ES_PreisSchwelle=600||600.0||60.000000||6000.000000||N +ES_SteigungSchwelle=80||80.0||8.000000||800.000000||N +ES_ÜberwachungTimeout=800||800||1||8000||N +ES_TrailingStop=250||370.0||37.000000||3700.000000||N +ES_UseTrailingStop=true||false||0||true||N +ES_TrailingActivationPips=0||0.0||0.000000||0.000000||N +ES_UseStaleStopLossExit=false||false||0||true||N +ES_StaleStopLossSeconds=33800||33800||1||338000||N +ES_LotGröße=0.03||0.07||0.007000||0.700000||N +ES_MagicNumber=12350||12350||1||123500||N +ES_UseSpreadAdjustment=true||false||0||true||N +ES_Timeframe=16385||0||0||49153||N +ES_UseBarData=true||false||0||true||N +ES_MaxTradesPerCrossover=9||9||1||90||N +ES_ProfitCheckBars=18||18||1||180||N +ES_CloseUnprofitableTrades=true||false||0||true||N +ES_UseWeeklyADXFilter=true||false||0||true||N +ES_WeeklyADXPeriod=15||15||1||150||N +ES_WeeklyADXMin=40||40.0||4.000000||400.000000||N +ES_WeeklyADXBarShift=2||2||1||20||N +ES_WeeklyADXUseDirection=true||false||0||true||N +; === RSI CrossOver Reversal Strategy === +RC_Symbol=XAUUSD +RC_MagicNumber=7||7||1||70||N +RC_rsiPeriod=19||19||1||190||N +RC_overboughtLevel=93||93||1||930||N +RC_oversoldLevel=22||22||1||220||N +RC_entryRSIBuySpread=0||0.0||0.000000||0.000000||N +RC_entryRSISellSpread=0||0.0||0.000000||0.000000||N +RC_lotSize=0.01||0.1||0.010000||1.000000||N +RC_slippage=3||3||1||30||N +RC_cooldownSeconds=209||209||1||2090||N +RC_TimeFrame1=1||0||0||49153||N +RC_TimeFrame2=1||0||0||49153||N +RC_BarTimeFrame=12||0||0||49153||N +RC_emaPeriod=140||140||1||1400||N +RC_emaSlopeThreshold=105||105.0||10.500000||1050.000000||N +RC_exitBuyRSI=86||86.0||8.600000||860.000000||N +RC_exitSellRSI=10||10.0||1.000000||100.000000||N +RC_TrailingStop=295||295.0||29.500000||2950.000000||N +RC_emaDistanceThreshold=165||165.0||16.500000||1650.000000||N +RC_UseTrendStrengthFilter=true||false||0||true||N +RC_tradingHourOneBegin=24||24||1||240||N +RC_tradingHourOneEnd=22||22||1||220||N +RC_tradingHourTwoBegin=6||6||1||60||N +RC_tradingHourTwoEnd=19||19||1||190||N +RC_Sunday=false||false||0||true||N +RC_Monday=false||false||0||true||N +RC_Tuesday=true||false||0||true||N +RC_Wednesday=true||false||0||true||N +RC_Thursday=true||false||0||true||N +RC_Friday=false||false||0||true||N +RC_Saturday=false||false||0||true||N +; === RSI MidPoint Hijack Strategy === +RM_Symbol=XAUUSD +RM_InpTimeframe=16385||0||0||49153||N +RM_InpLotSize=0.02||0.1||0.010000||1.000000||N +RM_InpMagicNumberRSIFollow=1001||1001||1||10010||N +RM_InpMagicNumberRSIReverse=1002||1002||1||10020||N +RM_InpMagicNumberEMACross=1003||1003||1||10030||N +RM_InpEnableRSIFollow=true||false||0||true||N +RM_InpEnableRSIReverse=true||false||0||true||N +RM_InpEnableEMACross=true||false||0||true||N +RM_InpEnableStrategyLock=false||false||0||true||N +RM_InpLockProfitThreshold=0||0.0||0.000000||0.000000||N +RM_InpCloseOppositeTrades=false||false||0||true||N +RM_InpRSIPeriod=32||32||1||320||N +RM_InpRSIOverbought=78||78||1||780||N +RM_InpRSIOversold=46||46||1||460||N +RM_InpRSIExitLevel=44||44||1||440||N +RM_InpRSIFollowStartHour=23||23||1||230||N +RM_InpRSIFollowEndHour=8||8||1||80||N +RM_InpRSIFollowCloseOutsideHours=false||false||0||true||N +RM_InpRSIReversePeriod=59||59||1||590||N +RM_InpRSIReverseOverbought=51||51||1||510||N +RM_InpRSIReverseOversold=49||49||1||490||N +RM_InpRSIReverseCrossLevel=53||53||1||530||N +RM_InpRSIReverseExitLevel=48||48||1||480||N +RM_InpRSIReverseStartHour=7||7||1||70||N +RM_InpRSIReverseEndHour=13||13||1||130||N +RM_InpRSIReverseCloseOutsideHours=false||false||0||true||N +RM_InpRSIReverseCooldownBars=15||15||1||150||N +RM_InpRSIReverseCooldownOnLoss=true||false||0||true||N +RM_InpEMAPeriod=120||120||1||1200||N +RM_InpEMACrossStartHour=8||8||1||80||N +RM_InpEMACrossEndHour=14||14||1||140||N +RM_InpEMACrossCloseOutsideHours=true||false||0||true||N +RM_InpUseEMADistanceEntry=true||false||0||true||N +RM_InpEMADistancePips=160||160.0||16.000000||1600.000000||N +RM_InpEMADistancePeriod=26||26||1||260||N +; === RSI Scalping APPL (AAPL) - Pepperstone US === +RS_APPL_Symbol=AAPL.NAS +RS_APPL_TimeFrame=10||0||0||49153||N +RS_APPL_RSI_Period=14||8||1||80||N +RS_APPL_RSI_Applied_Price=1||1||0||7||N +RS_APPL_RSI_Overbought=80||62.0||6.200000||620.000000||N +RS_APPL_RSI_Oversold=78||32.0||3.200000||320.000000||N +RS_APPL_RSI_Target_Buy=94||67.0||6.700000||670.000000||N +RS_APPL_RSI_Target_Sell=44||2.0||0.200000||20.000000||N +RS_APPL_BarsToWait=7||5||1||50||N +RS_APPL_LotSize=25||25.0||2.500000||250.000000||N +RS_APPL_MagicNumber=20001||20001||1||200010||N +RS_APPL_Slippage=3||3||1||30||N +; === RSI Scalping ADBE - Pepperstone US === +RS_ADBE_Symbol=ADBE.NAS +RS_ADBE_TimeFrame=6||0||0||49153||N +RS_ADBE_RSI_Period=15||15||1||150||N +RS_ADBE_RSI_Applied_Price=2||1||0||7||N +RS_ADBE_RSI_Overbought=16||16.0||1.600000||160.000000||N +RS_ADBE_RSI_Oversold=42||42.0||4.200000||420.000000||N +RS_ADBE_RSI_Target_Buy=67||67.0||6.700000||670.000000||N +RS_ADBE_RSI_Target_Sell=62||62.0||6.200000||620.000000||N +RS_ADBE_BarsToWait=8||8||1||80||N +RS_ADBE_LotSize=5||5.0||0.500000||50.000000||N +RS_ADBE_MagicNumber=12345||12345||1||123450||N +RS_ADBE_Slippage=3||3||1||30||N +; === RSI Scalping BTCUSD === +RS_BTCUSD_Symbol=BTCUSD +RS_BTCUSD_TimeFrame=16385||0||0||49153||N +RS_BTCUSD_RSI_Period=14||14||1||140||N +RS_BTCUSD_RSI_Applied_Price=1||1||0||7||N +RS_BTCUSD_RSI_Overbought=90||90.0||9.000000||900.000000||N +RS_BTCUSD_RSI_Oversold=73||73.0||7.300000||730.000000||N +RS_BTCUSD_RSI_Target_Buy=88||88.0||8.800000||880.000000||N +RS_BTCUSD_RSI_Target_Sell=48||48.0||4.800000||480.000000||N +RS_BTCUSD_BarsToWait=6||6||1||60||N +RS_BTCUSD_LotSize=0.1||0.1||0.010000||1.000000||N +RS_BTCUSD_MagicNumber=123459123||123459123||1||1234591230||N +RS_BTCUSD_Slippage=3||3||1||30||N +; === RSI Scalping NVDA - Pepperstone US === +RS_NVDA_Symbol=NVDA.NAS +RS_NVDA_TimeFrame=15||0||0||49153||N +RS_NVDA_RSI_Period=8||8||1||80||N +RS_NVDA_RSI_Applied_Price=1||1||0||7||N +RS_NVDA_RSI_Overbought=36||36.0||3.600000||360.000000||N +RS_NVDA_RSI_Oversold=38||38.0||3.800000||380.000000||N +RS_NVDA_RSI_Target_Buy=90||90.0||9.000000||900.000000||N +RS_NVDA_RSI_Target_Sell=70||70.0||7.000000||700.000000||N +RS_NVDA_BarsToWait=5||5||1||50||N +RS_NVDA_LotSize=50||5.0||0.500000||50.000000||N +RS_NVDA_MagicNumber=20003||20003||1||200030||N +RS_NVDA_Slippage=3||3||1||30||N +; === RSI Scalping TSLA - Pepperstone US === +RS_TSLA_Symbol=TSLA.NAS +RS_TSLA_TimeFrame=16385||0||0||49153||N +RS_TSLA_RSI_Period=14||14||1||140||N +RS_TSLA_RSI_Applied_Price=1||1||0||7||N +RS_TSLA_RSI_Overbought=54||54.0||5.400000||540.000000||N +RS_TSLA_RSI_Oversold=73||73.0||7.300000||730.000000||N +RS_TSLA_RSI_Target_Buy=87||87.0||8.700000||870.000000||N +RS_TSLA_RSI_Target_Sell=33||33.0||3.300000||330.000000||N +RS_TSLA_BarsToWait=1||1||1||10||N +RS_TSLA_LotSize=50||5.0||0.500000||50.000000||N +RS_TSLA_MagicNumber=125421321||125421321||1||1254213210||N +RS_TSLA_Slippage=3||3||1||30||N +; === RSI Scalping XAUUSD === +RS_XAUUSD_Symbol=XAUUSD +RS_XAUUSD_TimeFrame=16385||0||0||49153||N +RS_XAUUSD_RSI_Period=14||14||1||140||N +RS_XAUUSD_RSI_Applied_Price=1||1||0||7||N +RS_XAUUSD_RSI_Overbought=71||71.0||7.100000||710.000000||N +RS_XAUUSD_RSI_Oversold=57||57.0||5.700000||570.000000||N +RS_XAUUSD_RSI_Target_Buy=80||80.0||8.000000||800.000000||N +RS_XAUUSD_RSI_Target_Sell=57||57.0||5.700000||570.000000||N +RS_XAUUSD_BarsToWait=4||4||1||40||N +RS_XAUUSD_LotSize=0.1||0.1||0.010000||1.000000||N +RS_XAUUSD_MagicNumber=129102315||129102315||1||1291023150||N +RS_XAUUSD_Slippage=3||3||1||30||N +; === RSI Scalping MU === +RS_MU_Symbol=MU.NAS +RS_MU_TimeFrame=20||0||0||49153||N +RS_MU_RSI_Period=14||14||1||140||N +RS_MU_RSI_Applied_Price=1||1||0||7||N +RS_MU_RSI_Overbought=32||32.0||3.200000||320.000000||N +RS_MU_RSI_Oversold=86||86.0||8.600000||860.000000||N +RS_MU_RSI_Target_Buy=100||100.0||10.000000||1000.000000||N +RS_MU_RSI_Target_Sell=24||24.0||2.400000||240.000000||N +RS_MU_BarsToWait=34||34||1||340||N +RS_MU_LotSize=5||5.0||0.500000||50.000000||N +RS_MU_MagicNumber=129102316||129102316||1||1291023160||N +RS_MU_Slippage=3||3||1||30||N +; === RSI Scalping Reversal Escape (XAUUSD only) === +RS_UseReversalEscape=true||false||0||true||N +RS_ReversalATRPeriod=14||14||1||140||N +RS_ReversalAdverseAtrMult=5.25||5.25||0.525000||52.500000||N +RS_ReversalSignsRequired=2||2||1||20||N +RS_ReversalRsiVelocity=16||16.0||1.600000||160.000000||N +RS_ReversalBodyAtrMult=5.1||5.1||0.510000||51.000000||N +; === RSI Scalping APPL — Trailing (cluster-fuck BTC-style defaul +RS_APPL_UseTrailingStop=true||false||0||true||N +RS_APPL_TrailDistancePoints=120||120.0||12.000000||1200.000000||N +RS_APPL_TrailActivationPoints=0||0.0||0.000000||0.000000||N +; === RSI Scalping ADBE — Trailing === +RS_ADBE_UseTrailingStop=true||false||0||true||N +RS_ADBE_TrailDistancePoints=425||425.0||42.500000||4250.000000||N +RS_ADBE_TrailActivationPoints=18.5||18.5||1.850000||185.000000||N +; === RSI Scalping BTCUSD — Trailing === +RS_BTCUSD_UseTrailingStop=true||false||0||true||N +RS_BTCUSD_TrailDistancePoints=120||120.0||12.000000||1200.000000||N +RS_BTCUSD_TrailActivationPoints=0||0.0||0.000000||0.000000||N +; === RSI Scalping NVDA — Trailing === +RS_NVDA_UseTrailingStop=true||false||0||true||N +RS_NVDA_TrailDistancePoints=375||375.0||37.500000||3750.000000||N +RS_NVDA_TrailActivationPoints=75||75.0||7.500000||750.000000||N +; === RSI Scalping TSLA — Trailing === +RS_TSLA_UseTrailingStop=true||false||0||true||N +RS_TSLA_TrailDistancePoints=900||900.0||90.000000||9000.000000||N +RS_TSLA_TrailActivationPoints=500 +; === RSI Scalping XAUUSD — Trailing === +RS_XAUUSD_UseTrailingStop=true||false||0||true||N +RS_XAUUSD_TrailDistancePoints=71||71.0||7.100000||710.000000||N +RS_XAUUSD_TrailActivationPoints=41||41.0||4.100000||410.000000||N +; === RSI Reversal Asian EURUSD === +RRA_EURUSD_Symbol=EURUSD +RRA_EURUSD_RSIPeriod=28||28||1||280||N +RRA_EURUSD_OverboughtLevel=60||60.0||6.000000||600.000000||N +RRA_EURUSD_OversoldLevel=8||8.0||0.800000||80.000000||N +RRA_EURUSD_TakeProfitPips=175||175||1||1750||N +RRA_EURUSD_StopLossPips=5||5||1||50||N +RRA_EURUSD_MaxLotSize=0.1||0.1||0.010000||1.000000||N +RRA_EURUSD_MaxSpread=1000||1000||1||10000||N +RRA_EURUSD_MaxDuration=270||270||1||2700||N +RRA_EURUSD_UseStopLoss=false||false||0||true||N +RRA_EURUSD_UseTakeProfit=false||false||0||true||N +RRA_EURUSD_UseRSIExit=true||false||0||true||N +RRA_EURUSD_RSIExitLevel=55||55.0||5.500000||550.000000||N +RRA_EURUSD_CloseOutsideSession=false||false||0||true||N +RRA_EURUSD_TimeFrame=15||0||0||49153||N +RRA_EURUSD_MagicNumber=30001||30001||1||300010||N +RRA_EURUSD_Slippage=3||3||1||30||N +; === RSI Reversal Asian AUDUSD === +RRA_AUDUSD_Symbol=AUDUSD +RRA_AUDUSD_RSIPeriod=28||28||1||280||N +RRA_AUDUSD_OverboughtLevel=68||68.0||6.800000||680.000000||N +RRA_AUDUSD_OversoldLevel=30||30.0||3.000000||300.000000||N +RRA_AUDUSD_TakeProfitPips=175||175||1||1750||N +RRA_AUDUSD_StopLossPips=5||5||1||50||N +RRA_AUDUSD_MaxLotSize=0.2||0.2||0.020000||2.000000||N +RRA_AUDUSD_MaxSpread=1000||1000||1||10000||N +RRA_AUDUSD_MaxDuration=340||340||1||3400||N +RRA_AUDUSD_UseStopLoss=false||false||0||true||N +RRA_AUDUSD_UseTakeProfit=false||false||0||true||N +RRA_AUDUSD_UseRSIExit=true||false||0||true||N +RRA_AUDUSD_RSIExitLevel=48||48.0||4.800000||480.000000||N +RRA_AUDUSD_CloseOutsideSession=true||false||0||true||N +RRA_AUDUSD_TimeFrame=15||0||0||49153||N +RRA_AUDUSD_MagicNumber=30002||30002||1||300020||N +RRA_AUDUSD_Slippage=3||3||1||30||N +; === SuperEMA (EMA + CCI + MACD) === +SE_Symbol=XAUUSD +SE_Timeframe=15||0||0||49153||N +SE_LotSize=0.01||0.01||0.001000||0.100000||N +SE_SlippagePoints=55||55||1||550||N +SE_MagicNumber=940001||940001||1||9400010||N +SE_EmaFast=40||40||1||400||N +SE_EmaMid=180||180||1||1800||N +SE_EmaSlow=125||125||1||1250||N +SE_EmaTrendBars=3||3||1||30||N +SE_CciPeriod=17||17||1||170||N +SE_CciOverbought=80||80.0||8.000000||800.000000||N +SE_CciOversold=-140||-140.0||-14.000000||-1400.000000||N +SE_PullbackCciLookback=20||20||1||200||N +SE_MacdFast=14||14||1||140||N +SE_MacdSlow=38||38||1||380||N +SE_MacdSignal=9||9||1||90||N +SE_EntryStyle=1||0||0||2||N +SE_OneTradeOnly=true||false||0||true||N +SE_UseStructuralSL=false||false||0||true||N +SE_SlBufferPoints=110||110.0||11.000000||1100.000000||N +SE_ExitOnTrendFlip=false||false||0||true||N +SE_ExitOnMacdFlip=false||false||0||true||N +SE_ExitOnCciZeroCross=true||false||0||true||N +SE_MaxHoldingBars=168||168||1||1680||N +SE_ExitBelowMidEma=false||false||0||true||N +SE_DebugLogs=false||false||0||true||N +; === RSI Consolidation (ranging / mean-reversion) === +RCO_Symbol=XAUUSD +RCO_SignalTF=15||0||0||49153||N +RCO_EntryOnNewBarOnly=true||false||0||true||N +RCO_ADX_Period=23||23||1||230||N +RCO_ADX_Max=29||29.0||2.900000||290.000000||N +RCO_UseATRRatioFilter=true||false||0||true||N +RCO_ATR_Period=8||8||1||80||N +RCO_ATR_SMA_Period=35||35||1||350||N +RCO_ATR_Ratio_Max=1.36||1.36||0.136000||13.600000||N +RCO_UseFlatEMAFilter=true||false||0||true||N +RCO_EMA_Fast=13||13||1||130||N +RCO_EMA_Slow=17||17||1||170||N +RCO_EMA_Separation_MaxPct=0.26||0.26||0.026000||2.600000||N +RCO_RSI_Period=8||8||1||80||N +RCO_RSI_Price=2||1||0||7||N +RCO_RSI_Oversold=22||22.0||2.200000||220.000000||N +RCO_RSI_Overbought=63||63.0||6.300000||630.000000||N +RCO_UseRSI_MeanExit=true||false||0||true||N +RCO_RSI_Exit_Long=48||48.0||4.800000||480.000000||N +RCO_RSI_Exit_Short=52||52.0||5.200000||520.000000||N +RCO_SL_ATR_Mult=2.15||2.15||0.215000||21.500000||N +RCO_TP_ATR_Mult=2.4||2.4||0.240000||24.000000||N +RCO_MaxBarsInTrade=54||54||1||540||N +RCO_Lots=0.1||0.1||0.010000||1.000000||N +RCO_MagicNumber=20250420||20250420||1||202504200||N +RCO_Slippage=10||10||1||100||N +RCO_MaxSpreadPoints=28||28||1||280||N +; === SimpleTrendline BTCUSD === +ST_BTC_Symbol=BTCUSD +ST_BTC_SignalTF=16385||0||0||49153||N +ST_BTC_HigherTF=16388||0||0||49153||N +ST_BTC_MAPeriod=150||150||1||1500||N +ST_BTC_MAMethod=2||0||0||3||N +ST_BTC_AppliedPrice=2||1||0||7||N +ST_BTC_HTFBarsToScan=1200||1200||1||12000||N +ST_BTC_LineTouchTolerance=170||170.0||17.000000||1700.000000||N +ST_BTC_BreakBuffer=90||90.0||9.000000||900.000000||N +ST_BTC_MagicNumber=26042501||26042501||1||260425010||N +ST_BTC_DrawTrendline=true||false||0||true||N +; === SimpleTrendline XAUUSD === +ST_XAU_Symbol=XAUUSD +ST_XAU_SignalTF=16385||0||0||49153||N +ST_XAU_HigherTF=10||0||0||49153||N +ST_XAU_MAPeriod=65||65||1||650||N +ST_XAU_MAMethod=1||0||0||3||N +ST_XAU_AppliedPrice=2||1||0||7||N +ST_XAU_HTFBarsToScan=500||500||1||5000||N +ST_XAU_LineTouchTolerance=220||220.0||22.000000||2200.000000||N +ST_XAU_BreakBuffer=110||110.0||11.000000||1100.000000||N +ST_XAU_MagicNumber=26042503||26042501||1||260425010||N +ST_XAU_DrawTrendline=true||false||0||true||N +; === SimpleTrendline GER40 === +ST_GER_Symbol=GER40 +ST_GER_SignalTF=15||0||0||49153||N +ST_GER_HigherTF=15||0||0||49153||N +ST_GER_MAPeriod=65||65||1||650||N +ST_GER_MAMethod=3||0||0||3||N +ST_GER_AppliedPrice=2||1||0||7||N +ST_GER_HTFBarsToScan=1200||1200||1||12000||N +ST_GER_LineTouchTolerance=100||100.0||10.000000||1000.000000||N +ST_GER_BreakBuffer=80||80.0||8.000000||800.000000||N +ST_GER_MagicNumber=26042502||26042502||1||260425020||N +ST_GER_DrawTrendline=true||false||0||true||N +; === RSI Secret Sauce XAUUSD === +RSS_Symbol=XAUUSD +RSS_MagicNumber=789012||789012||1||7890120||N +RSS_Slippage=10||10||1||100||N +RSS_Timeframe=30||0||0||49153||N +RSS_RSIPeriod=16||16||1||160||N +RSS_RSIOverbought=72.5||72.5||7.250000||725.000000||N +RSS_RSIOversold=32.5||32.5||3.250000||325.000000||N +RSS_RSILookback=60||60||1||600||N +RSS_PeakBars=2||2||1||20||N +RSS_StopLossATR=2.75||2.75||0.275000||27.500000||N +RSS_TakeProfitATR=5||5.0||0.500000||50.000000||N +RSS_ATRPeriod=14||14||1||140||N +RSS_UseSwingStopLoss=false||false||0||true||N +RSS_SwingLookback=30||30||1||300||N +RSS_MaxPositions=1||1||1||10||N +RSS_MinBarsBetweenTrades=7||7||1||70||N +; === USDJPY Buster (Asian range breakout) === +UB_Symbol=USDJPY +UB_RangeStartHour=3||3||1||30||N +UB_RangeEndHour=6||6||1||60||N +UB_CloseHour=18||18||1||180||N +UB_RangeTF=20||0||0||49153||N +UB_MinRangePoints=15||15||1||150||N +UB_OrderBufferPoints=4.75||4.75||0.475000||47.500000||N +UB_FirstTradeOnly=false||false||0||true||N +UB_AllowLong=true||false||0||true||N +UB_AllowShort=true||false||0||true||N +UB_UseTakeProfit=false||false||0||true||N +UB_TakeProfitPoints=0||0.0||0.000000||0.000000||N +UB_RiskMode=2||0||0||2||N +UB_FixedRiskMoney=250||250.0||25.000000||2500.000000||N +UB_RiskPercent=0.1||0.1||0.010000||1.000000||N +UB_FixedLots=0.01||0.01||0.001000||0.100000||N +UB_MagicNumber=927002||927002||1||9270020||N +UB_Slippage=20||20||1||200||N +UB_MaxSpreadPoints=20||20||1||200||N +UB_DrawRange=false||false||0||true||N +UB_DebugLog=false||false||0||true||N diff --git a/frontline/cluster-latest/GapGuard.mqh b/frontline/cluster-latest/GapGuard.mqh new file mode 100644 index 0000000..f7063c1 --- /dev/null +++ b/frontline/cluster-latest/GapGuard.mqh @@ -0,0 +1,352 @@ +//+------------------------------------------------------------------+ +//| GapGuard.mqh | +//| Gap-loss prevention: flat before session/weekend, gap-through-SL | +//+------------------------------------------------------------------+ +#ifndef GAP_GUARD_MQH +#define GAP_GUARD_MQH + +#include + +struct GapGuardConfig +{ + bool enable; + bool closeBeforeSessionEnd; + int minutesBeforeClose; + bool closeBeforeWeekend; + int fridayCloseHour; + bool closeOnBarGapThroughSL; + double minGapPoints; + int equityDailyFlatHour; +}; + +GapGuardConfig g_gapCfg; +ulong g_gapMagics[]; +string g_gapSymbols[]; +datetime g_gapLastBarTime[]; + +//+------------------------------------------------------------------+ +void GapGuard_Reset() +{ + ArrayResize(g_gapMagics, 0); + ArrayResize(g_gapSymbols, 0); + ArrayResize(g_gapLastBarTime, 0); +} + +//+------------------------------------------------------------------+ +void GapGuard_Init(const GapGuardConfig &cfg) +{ + g_gapCfg = cfg; + GapGuard_Reset(); +} + +//+------------------------------------------------------------------+ +void GapGuard_RegisterMagic(const ulong magic) +{ + const int n = ArraySize(g_gapMagics); + for(int i = 0; i < n; i++) + { + if(g_gapMagics[i] == magic) + return; + } + ArrayResize(g_gapMagics, n + 1); + g_gapMagics[n] = magic; +} + +//+------------------------------------------------------------------+ +void GapGuard_RegisterSymbol(const string symbol) +{ + const int n = ArraySize(g_gapSymbols); + for(int i = 0; i < n; i++) + { + if(g_gapSymbols[i] == symbol) + return; + } + ArrayResize(g_gapSymbols, n + 1); + g_gapSymbols[n] = symbol; + ArrayResize(g_gapLastBarTime, n + 1); + g_gapLastBarTime[n] = 0; +} + +//+------------------------------------------------------------------+ +int GapGuard_SymbolIndex(const string symbol) +{ + for(int i = 0; i < ArraySize(g_gapSymbols); i++) + { + if(g_gapSymbols[i] == symbol) + return i; + } + return -1; +} + +//+------------------------------------------------------------------+ +bool GapGuard_IsEAMagic(const ulong magic) +{ + for(int i = 0; i < ArraySize(g_gapMagics); i++) + { + if(g_gapMagics[i] == magic) + return true; + } + return false; +} + +//+------------------------------------------------------------------+ +bool GapGuard_IsKnownEquityOrIndex(const string symbol) +{ + if(symbol == "AAPL" || symbol == "APPL" || symbol == "NVDA" || symbol == "TSLA" + || symbol == "ADBE" || symbol == "MU" || symbol == "GER40" || symbol == "US500" + || symbol == "NAS100" || symbol == "SPX500" || symbol == "UK100") + return true; + + if(StringFind(symbol, "AAPL") == 0 || StringFind(symbol, "NVDA") == 0 + || StringFind(symbol, "TSLA") == 0 || StringFind(symbol, "ADBE") == 0 + || StringFind(symbol, ".NAS") > 0 || StringFind(symbol, ".NYS") > 0) + return true; + + return false; +} + +//+------------------------------------------------------------------+ +bool GapGuard_SymbolHasSessionGaps(const string symbol) +{ + MqlDateTime now; + TimeToStruct(TimeCurrent(), now); + + datetime from = 0, to = 0; + uint idx = 0; + int totalSec = 0; + + while(SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)now.day_of_week, idx, from, to)) + { + MqlDateTime f, t; + TimeToStruct(from, f); + TimeToStruct(to, t); + const int fs = f.hour * 3600 + f.min * 60 + f.sec; + const int ts = t.hour * 3600 + t.min * 60 + t.sec; + if(ts > fs) + totalSec += (ts - fs); + idx++; + } + + if(idx == 0) + return GapGuard_IsKnownEquityOrIndex(symbol); + + return totalSec < 23 * 3600; +} + +//+------------------------------------------------------------------+ +bool GapGuard_IsNearSessionClose(const string symbol) +{ + if(!g_gapCfg.closeBeforeSessionEnd || g_gapCfg.minutesBeforeClose <= 0) + return false; + if(!GapGuard_SymbolHasSessionGaps(symbol)) + return false; + + MqlDateTime now; + TimeToStruct(TimeCurrent(), now); + const int nowSec = now.hour * 3600 + now.min * 60 + now.sec; + + datetime from = 0, to = 0; + uint idx = 0; + int lastEndSec = -1; + + while(SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)now.day_of_week, idx, from, to)) + { + MqlDateTime tEnd; + TimeToStruct(to, tEnd); + const int endSec = tEnd.hour * 3600 + tEnd.min * 60 + tEnd.sec; + if(endSec > lastEndSec) + lastEndSec = endSec; + idx++; + } + + if(lastEndSec < 0) + { + if(GapGuard_IsKnownEquityOrIndex(symbol) && g_gapCfg.equityDailyFlatHour >= 0) + { + const int flatSec = g_gapCfg.equityDailyFlatHour * 3600; + const int threshold = flatSec - g_gapCfg.minutesBeforeClose * 60; + return (nowSec >= threshold && nowSec < flatSec); + } + return false; + } + + const int threshold = lastEndSec - g_gapCfg.minutesBeforeClose * 60; + return (nowSec >= threshold && nowSec < lastEndSec); +} + +//+------------------------------------------------------------------+ +bool GapGuard_IsWeekendRiskWindow() +{ + if(!g_gapCfg.closeBeforeWeekend) + return false; + + MqlDateTime now; + TimeToStruct(TimeCurrent(), now); + + if(now.day_of_week == 5 && now.hour >= g_gapCfg.fridayCloseHour) + return true; + if(now.day_of_week == 6 || now.day_of_week == 0) + return true; + + return false; +} + +//+------------------------------------------------------------------+ +bool United_IsGapRiskWindow(const string symbol) +{ + if(!g_gapCfg.enable) + return false; + + if(GapGuard_IsWeekendRiskWindow() && GapGuard_SymbolHasSessionGaps(symbol)) + return true; + + if(GapGuard_IsNearSessionClose(symbol)) + return true; + + return false; +} + +//+------------------------------------------------------------------+ +bool GapGuard_CloseEAPosition(CTrade &trade, const ulong ticket, const string reason) +{ + if(ticket == 0 || !PositionSelectByTicket(ticket)) + return false; + + const string sym = PositionGetString(POSITION_SYMBOL); + const ulong magic = (ulong)PositionGetInteger(POSITION_MAGIC); + + if(!GapGuard_IsEAMagic(magic)) + return false; + + if(trade.PositionClose(ticket)) + { + Print("GapGuard: closed ", sym, " ticket=", ticket, " reason=", reason); + return true; + } + + Print("GapGuard: failed to close ", sym, " ticket=", ticket, + " retcode=", trade.ResultRetcode(), " reason=", reason); + return false; +} + +//+------------------------------------------------------------------+ +void GapGuard_TrySessionFlat(CTrade &trade, const string symbol, const int symIdx) +{ + if(symIdx < 0) + return; + + if(!United_IsGapRiskWindow(symbol)) + return; + + const string reason = GapGuard_IsWeekendRiskWindow() ? "weekend_flat" : "session_end_flat"; + + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + const ulong ticket = PositionGetTicket(i); + if(ticket == 0 || !PositionSelectByTicket(ticket)) + continue; + if(PositionGetString(POSITION_SYMBOL) != symbol) + continue; + if(!GapGuard_IsEAMagic((ulong)PositionGetInteger(POSITION_MAGIC))) + continue; + + GapGuard_CloseEAPosition(trade, ticket, reason); + } +} + +//+------------------------------------------------------------------+ +bool GapGuard_PositionGappedThroughSL(const string symbol, const ulong ticket) +{ + if(!g_gapCfg.closeOnBarGapThroughSL) + return false; + if(ticket == 0 || !PositionSelectByTicket(ticket)) + return false; + if(PositionGetString(POSITION_SYMBOL) != symbol) + return false; + + const double sl = PositionGetDouble(POSITION_SL); + if(sl <= 0.0) + return false; + + const double point = SymbolInfoDouble(symbol, SYMBOL_POINT); + if(point <= 0.0) + return false; + + const double barOpen = iOpen(symbol, PERIOD_CURRENT, 0); + const double prevClose = iClose(symbol, PERIOD_CURRENT, 1); + if(barOpen <= 0.0 || prevClose <= 0.0) + return false; + + const ENUM_POSITION_TYPE ptype = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + const double minGap = g_gapCfg.minGapPoints * point; + + if(ptype == POSITION_TYPE_BUY) + { + if(barOpen >= sl) + return false; + const double gap = prevClose - barOpen; + if(gap < minGap) + return false; + return (prevClose > sl || barOpen < sl); + } + + if(ptype == POSITION_TYPE_SELL) + { + if(barOpen <= sl) + return false; + const double gap = barOpen - prevClose; + if(gap < minGap) + return false; + return (prevClose < sl || barOpen > sl); + } + + return false; +} + +//+------------------------------------------------------------------+ +void GapGuard_TryGapThroughSL(CTrade &trade, const string symbol, const int symIdx) +{ + if(!g_gapCfg.closeOnBarGapThroughSL || symIdx < 0) + return; + + const datetime barTime = iTime(symbol, PERIOD_CURRENT, 0); + if(barTime == 0) + return; + if(g_gapLastBarTime[symIdx] == barTime) + return; + + g_gapLastBarTime[symIdx] = barTime; + + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + const ulong ticket = PositionGetTicket(i); + if(ticket == 0 || !PositionSelectByTicket(ticket)) + continue; + if(PositionGetString(POSITION_SYMBOL) != symbol) + continue; + if(!GapGuard_IsEAMagic((ulong)PositionGetInteger(POSITION_MAGIC))) + continue; + + if(GapGuard_PositionGappedThroughSL(symbol, ticket)) + GapGuard_CloseEAPosition(trade, ticket, "gap_through_sl"); + } +} + +//+------------------------------------------------------------------+ +void United_ProcessGapGuard(CTrade &trade) +{ + if(!g_gapCfg.enable) + return; + + for(int s = 0; s < ArraySize(g_gapSymbols); s++) + { + const string symbol = g_gapSymbols[s]; + if(!SymbolSelect(symbol, true)) + continue; + + GapGuard_TryGapThroughSL(trade, symbol, s); + GapGuard_TrySessionFlat(trade, symbol, s); + } +} + +#endif // GAP_GUARD_MQH diff --git a/frontline/cluster-latest/MagicNumberHelpers.mqh b/frontline/cluster-latest/MagicNumberHelpers.mqh index 0423cc4..79d8c4c 100644 --- a/frontline/cluster-latest/MagicNumberHelpers.mqh +++ b/frontline/cluster-latest/MagicNumberHelpers.mqh @@ -112,6 +112,50 @@ double GetPositionProfitByMagic(string symbol, ulong magic_number) return PositionGetDouble(POSITION_PROFIT); } +//+------------------------------------------------------------------+ +//| Net P/L including swap (and commission when exposed by broker) | +//+------------------------------------------------------------------+ +double GetPositionNetProfitByMagic(string symbol, ulong magic_number) +{ + if(!PositionSelectByMagic(symbol, magic_number)) + return 0.0; + + double net = PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP); + return net; +} + +//+------------------------------------------------------------------+ +//| True when an open position for this magic is not in profit | +//+------------------------------------------------------------------+ +bool IsUnprofitablePositionByMagic(string symbol, ulong magic_number) +{ + if(!PositionExistsByMagic(symbol, magic_number)) + return false; + + return (GetPositionNetProfitByMagic(symbol, magic_number) <= 0.0); +} + +//+------------------------------------------------------------------+ +//| Close unprofitable position to make room for a new entry signal | +//| Returns true when no position remains (flat or closed successfully)| +//+------------------------------------------------------------------+ +bool United_PrepareEntrySlot(CTrade &trade_obj, string symbol, ulong magic_number, bool closeUnprofitableOnSignal) +{ + if(!PositionExistsByMagic(symbol, magic_number)) + return true; + + if(!closeUnprofitableOnSignal) + return false; + + if(!IsUnprofitablePositionByMagic(symbol, magic_number)) + return false; + + if(!ClosePositionByMagic(trade_obj, symbol, magic_number)) + return false; + + return !PositionExistsByMagic(symbol, magic_number); +} + //+------------------------------------------------------------------+ //| Get position type by symbol and magic number | //+------------------------------------------------------------------+ diff --git a/frontline/cluster-latest/RSIScalpingADBE-trailing/main.mq5 b/frontline/cluster-latest/RSIScalpingADBE-trailing/main.mq5 new file mode 100644 index 0000000..6b66b8b --- /dev/null +++ b/frontline/cluster-latest/RSIScalpingADBE-trailing/main.mq5 @@ -0,0 +1,408 @@ +//+------------------------------------------------------------------+ +//| RSIScalping.mq5 | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.01" + +#include +#include "../_united/MagicNumberHelpers.mqh" + +//--- Input parameters +input ENUM_TIMEFRAMES TimeFrame = (ENUM_TIMEFRAMES)6; // Timeframe for Analysis +input int RSI_Period = 15; // RSI Period +input ENUM_APPLIED_PRICE RSI_Applied_Price = PRICE_OPEN; // RSI Applied Price +input double RSI_Overbought = 16; // RSI Overbought Level +input double RSI_Oversold = 42; // RSI Oversold Level +input double RSI_Target_Buy = 67; // RSI Target for Buy Exit +input double RSI_Target_Sell = 62; // RSI Target for Sell Exit +input int BarsToWait = 8; // Bars to wait when RSI goes against position +input double LotSize = 5; // Lot Size +input int MagicNumber = 12345; // Magic Number +input int Slippage = 3; // Slippage in points + +input group "=== Trailing stop ===" +input bool UseTrailingStop = true; // move SL behind bid/ask while in profit +input double TrailingStopDistancePoints = 425.0; // SL distance from bid/ask (points) +input double TrailingActivationPoints = 18.5; // min profit before trailing (0 = same as distance) + +//--- Global variables +CTrade trade; +int rsi_handle; +double rsi_buffer[]; +double rsi_prev, rsi_current, rsi_two_bars_ago; +bool position_open = false; +int position_ticket = 0; +ENUM_POSITION_TYPE current_position_type = POSITION_TYPE_BUY; +datetime last_bar_time = 0; +bool rsi_against_position = false; +int bars_against_count = 0; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsi_handle = iRSI(_Symbol, TimeFrame, RSI_Period, RSI_Applied_Price); + if(rsi_handle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Initialize trade object + trade.SetExpertMagicNumber(MagicNumber); + trade.SetDeviationInPoints(Slippage); + trade.SetTypeFilling(ORDER_FILLING_FOK); + + // Allocate arrays + ArraySetAsSeries(rsi_buffer, true); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + if(rsi_handle != INVALID_HANDLE) + IndicatorRelease(rsi_handle); +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + if(Bars(_Symbol, TimeFrame) < RSI_Period + 2) + return; + + const datetime current_bar_time = iTime(_Symbol, TimeFrame, 0); + const bool new_bar = (current_bar_time != last_bar_time); + const bool in_pos = position_open || PositionExistsByMagic(_Symbol, (ulong)MagicNumber); + + if(!in_pos && !new_bar) + return; + + if(!UpdateRSI()) + return; + + if(in_pos && UseTrailingStop) + ApplyTrailingStop(); + + if(!new_bar) + return; + + last_bar_time = current_bar_time; + + ResyncPositionFromMarket(); + CheckExistingPosition(); + + if(!position_open && !PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + CheckEntrySignals(); +} + +//+------------------------------------------------------------------+ +//| Update RSI values | +//+------------------------------------------------------------------+ +bool UpdateRSI() +{ + if(CopyBuffer(rsi_handle, 0, 0, 3, rsi_buffer) < 3) + { + return false; + } + + rsi_current = rsi_buffer[0]; // Current bar + rsi_prev = rsi_buffer[1]; // Previous bar + rsi_two_bars_ago = rsi_buffer[2]; // Two bars ago + + return true; +} + +//+------------------------------------------------------------------+ +//| Trail SL behind favorable price (every tick when enabled) | +//+------------------------------------------------------------------+ +void ApplyTrailingStop() +{ + if(TrailingStopDistancePoints <= 0.0) + return; + if(!PositionSelectByMagic(_Symbol, (ulong)MagicNumber)) + return; + + const double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT); + if(point <= 0.0) + return; + + const int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); + const double trail_dist = TrailingStopDistancePoints * point; + const double activation_pts = (TrailingActivationPoints > 0.0) + ? TrailingActivationPoints + : TrailingStopDistancePoints; + const double activation = activation_pts * point; + const long stops_level = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL); + const double min_dist = (double)stops_level * point; + + const ENUM_POSITION_TYPE ptype = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + const double entry = PositionGetDouble(POSITION_PRICE_OPEN); + const double cur_sl = PositionGetDouble(POSITION_SL); + const double cur_tp = PositionGetDouble(POSITION_TP); + + if(ptype == POSITION_TYPE_BUY) + { + const double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + if(bid - entry <= activation) + return; + + double new_sl = NormalizeDouble(bid - trail_dist, digits); + if(min_dist > 0.0 && bid - new_sl < min_dist) + new_sl = NormalizeDouble(bid - min_dist, digits); + + if(new_sl >= bid || new_sl <= 0.0) + return; + if(cur_sl > 0.0 && new_sl <= cur_sl) + return; + + ModifyPositionByMagic(trade, _Symbol, (ulong)MagicNumber, new_sl, cur_tp); + } + else if(ptype == POSITION_TYPE_SELL) + { + const double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + if(entry - ask <= activation) + return; + + double new_sl = NormalizeDouble(ask + trail_dist, digits); + if(min_dist > 0.0 && new_sl - ask < min_dist) + new_sl = NormalizeDouble(ask + min_dist, digits); + + if(new_sl <= ask || new_sl <= 0.0) + return; + if(cur_sl > 0.0 && new_sl >= cur_sl) + return; + + ModifyPositionByMagic(trade, _Symbol, (ulong)MagicNumber, new_sl, cur_tp); + } +} + +//+------------------------------------------------------------------+ +//| Sync ticket/state if a position exists after restart | +//+------------------------------------------------------------------+ +void ResyncPositionFromMarket() +{ + if(position_open) + return; + ulong t = GetPositionTicketByMagic(_Symbol, (ulong)MagicNumber); + if(t == 0 || !PositionSelectByTicket(t)) + return; + position_ticket = (int)t; + position_open = true; + current_position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); +} + +//+------------------------------------------------------------------+ +//| Check existing position for exit conditions | +//+------------------------------------------------------------------+ +void CheckExistingPosition() +{ + if(!position_open) + { + return; + } + + // Check if position still exists with correct magic number AND symbol for THIS EA + if(!PositionSelectByTicketSymbolAndMagic(position_ticket, _Symbol, (ulong)MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + return; + } + + // Exit conditions based on RSI target + if(current_position_type == POSITION_TYPE_BUY) + { + // Check if RSI is against the position (below oversold) + if(rsi_current < RSI_Oversold) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit long position when RSI reaches buy target + if(rsi_current >= RSI_Target_Buy) + { + ClosePosition(); + } + } + } + else if(current_position_type == POSITION_TYPE_SELL) + { + // Check if RSI is against the position (above overbought) + if(rsi_current > RSI_Overbought) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit short position when RSI reaches sell target + if(rsi_current <= RSI_Target_Sell) + { + ClosePosition(); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Check for entry signals | +//+------------------------------------------------------------------+ +void CheckEntrySignals() +{ + // Buy signal: RSI crosses from oversold to above oversold (checking the actual crossover) + if(rsi_two_bars_ago <= RSI_Oversold && rsi_prev > RSI_Oversold) + { + OpenBuyPosition(); + } + + // Sell signal: RSI crosses from overbought to below overbought (checking the actual crossover) + if(rsi_two_bars_ago >= RSI_Overbought && rsi_prev < RSI_Overbought) + { + OpenSellPosition(); + } +} + +//+------------------------------------------------------------------+ +//| Open buy position | +//+------------------------------------------------------------------+ +void OpenBuyPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + { + return; // Position already exists for this EA + } + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + if(trade.Buy(LotSize, _Symbol, ask, 0, 0, "RSI Scalping Buy")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, (ulong)MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_BUY; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Open sell position | +//+------------------------------------------------------------------+ +void OpenSellPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + { + return; // Position already exists for this EA + } + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + + if(trade.Sell(LotSize, _Symbol, bid, 0, 0, "RSI Scalping Sell")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, (ulong)MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_SELL; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Close current position | +//+------------------------------------------------------------------+ +void ClosePosition() +{ + // Close position using helper that verifies symbol AND magic number for THIS EA + if(ClosePositionByMagic(trade, _Symbol, (ulong)MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } + else + { + // Position doesn't exist or wrong magic number - reset tracking + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } +} diff --git a/frontline/cluster-latest/RSIScalpingMU/report.html b/frontline/cluster-latest/RSIScalpingMU/report.html deleted file mode 100644 index 950f95b..0000000 Binary files a/frontline/cluster-latest/RSIScalpingMU/report.html and /dev/null differ diff --git a/frontline/cluster-latest/RSIScalpingMU/report.png b/frontline/cluster-latest/RSIScalpingMU/report.png deleted file mode 100644 index 5a26c1d..0000000 Binary files a/frontline/cluster-latest/RSIScalpingMU/report.png and /dev/null differ diff --git a/frontline/cluster-latest/Strategies/DarvasBoxStrategy.mqh b/frontline/cluster-latest/Strategies/DarvasBoxStrategy.mqh index 989dc21..89b4a6f 100644 --- a/frontline/cluster-latest/Strategies/DarvasBoxStrategy.mqh +++ b/frontline/cluster-latest/Strategies/DarvasBoxStrategy.mqh @@ -286,7 +286,7 @@ void ProcessDarvasBox(string symbol) Print("DarvasBox: Breakout Signal Detected - Price above box high"); // Buy signal - if(!PositionExistsByMagic(dbData.symbol, (ulong)DB_MagicNumber)) // No existing positions with our magic number + if(United_PrepareEntrySlot(dbData.trade, dbData.symbol, (ulong)DB_MagicNumber, DB_CloseUnprofitableOnNewSignal)) { double sl = currentPrice - DB_StopLoss * dbData.point; double tp = currentPrice + DB_TakeProfit * dbData.point; @@ -307,7 +307,7 @@ void ProcessDarvasBox(string symbol) Print("DarvasBox: Breakdown Signal Detected - Price below box low"); // Sell signal - if(!PositionExistsByMagic(dbData.symbol, (ulong)DB_MagicNumber)) // No existing positions with our magic number + if(United_PrepareEntrySlot(dbData.trade, dbData.symbol, (ulong)DB_MagicNumber, DB_CloseUnprofitableOnNewSignal)) { double sl = currentPrice + DB_StopLoss * dbData.point; double tp = currentPrice - DB_TakeProfit * dbData.point; diff --git a/frontline/cluster-latest/Strategies/EMASlopeDistanceStrategy.mqh b/frontline/cluster-latest/Strategies/EMASlopeDistanceStrategy.mqh index 2ddbeeb..9f59989 100644 --- a/frontline/cluster-latest/Strategies/EMASlopeDistanceStrategy.mqh +++ b/frontline/cluster-latest/Strategies/EMASlopeDistanceStrategy.mqh @@ -27,7 +27,7 @@ bool InitEMASlopeDistance(string symbol) esData.trade.SetExpertMagicNumber(ES_MagicNumber); esData.trade.SetDeviationInPoints(10); - esData.trade.SetTypeFilling(ORDER_FILLING_IOC); + esData.trade.SetTypeFillingBySymbol(symbol); esData.ema_handle = iMA(symbol, ES_Timeframe, ES_EMA_Periode, 0, MODE_EMA, PRICE_CLOSE); @@ -60,7 +60,7 @@ bool ES_IsWeeklyADXTrendFavorable(const ENUM_ORDER_TYPE order_type) int adx_handle = iADX(esData.symbol, PERIOD_W1, ES_WeeklyADXPeriod); if(adx_handle == INVALID_HANDLE) - return false; + return true; double adx_buf[], plus_di_buf[], minus_di_buf[]; ArraySetAsSeries(adx_buf, true); @@ -73,7 +73,7 @@ bool ES_IsWeeklyADXTrendFavorable(const ENUM_ORDER_TYPE order_type) IndicatorRelease(adx_handle); if(!ok_adx || !ok_plus || !ok_minus) - return false; + return true; double adx_value = adx_buf[0]; double plus_di = plus_di_buf[0]; @@ -229,7 +229,7 @@ void PrüfeTrigger() return; } - if(bullish_signal && !PositionExistsByMagic(esData.symbol, (ulong)ES_MagicNumber)) + if(bullish_signal && United_PrepareEntrySlot(esData.trade, esData.symbol, (ulong)ES_MagicNumber, ES_CloseUnprofitableOnNewSignal)) { if(!ES_IsWeeklyADXTrendFavorable(ORDER_TYPE_BUY)) { @@ -242,7 +242,7 @@ void PrüfeTrigger() esData.trades_in_current_crossover++; } } - else if(bearish_signal && !PositionExistsByMagic(esData.symbol, (ulong)ES_MagicNumber)) + else if(bearish_signal && United_PrepareEntrySlot(esData.trade, esData.symbol, (ulong)ES_MagicNumber, ES_CloseUnprofitableOnNewSignal)) { if(!ES_IsWeeklyADXTrendFavorable(ORDER_TYPE_SELL)) { @@ -276,6 +276,8 @@ bool PlatziereTrade(ENUM_ORDER_TYPE order_type) return false; } + esData.trade.SetTypeFillingBySymbol(esData.symbol); + bool success = false; if(order_type == ORDER_TYPE_BUY) diff --git a/frontline/cluster-latest/Strategies/RSIConsolidationStrategy.mqh b/frontline/cluster-latest/Strategies/RSIConsolidationStrategy.mqh index c996950..78668b6 100644 --- a/frontline/cluster-latest/Strategies/RSIConsolidationStrategy.mqh +++ b/frontline/cluster-latest/Strategies/RSIConsolidationStrategy.mqh @@ -35,6 +35,7 @@ struct RSIConsolidationData ulong magic; int slippage; int maxSpreadPoints; + bool closeUnprofitableOnNewSignal; int h_rsi; int h_adx; int h_atr; @@ -330,7 +331,8 @@ void ProcessRSIConsolidation(RSIConsolidationData &d, const double lots) RCO_ManageOpenPosition(d, rsi); if(isNew) d.lastBar = barTime; - return; + if(!d.closeUnprofitableOnNewSignal) + return; } if(d.entryOnNewBarOnly && !isNew) @@ -360,7 +362,7 @@ void ProcessRSIConsolidation(RSIConsolidationData &d, const double lots) if(RCO_EntryBuyCross(d, rsi2, rsiPrev)) { - if(!United_MayOpenNewEntry(d.symbol, d.magic, true)) + if(!United_MayOpenNewEntry(d.symbol, d.magic, true, d.trade, d.closeUnprofitableOnNewSignal)) return; double ask = SymbolInfoDouble(d.symbol, SYMBOL_ASK); double sl = ask - slDist; @@ -372,7 +374,7 @@ void ProcessRSIConsolidation(RSIConsolidationData &d, const double lots) } else if(RCO_EntrySellCross(d, rsi2, rsiPrev)) { - if(!United_MayOpenNewEntry(d.symbol, d.magic, false)) + if(!United_MayOpenNewEntry(d.symbol, d.magic, false, d.trade, d.closeUnprofitableOnNewSignal)) return; double bid = SymbolInfoDouble(d.symbol, SYMBOL_BID); double sl = bid + slDist; diff --git a/frontline/cluster-latest/Strategies/RSICrossOverReversalStrategy.mqh b/frontline/cluster-latest/Strategies/RSICrossOverReversalStrategy.mqh index ddc5f5a..e9e43d5 100644 --- a/frontline/cluster-latest/Strategies/RSICrossOverReversalStrategy.mqh +++ b/frontline/cluster-latest/Strategies/RSICrossOverReversalStrategy.mqh @@ -45,6 +45,30 @@ int TimeHour(datetime when = 0) return dt.hour; } +double RC_NormalizeLot(const string sym, const double lots) +{ + const double mn = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN); + const double mx = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX); + double step = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP); + if(step <= 0.0) + step = 0.01; + double v = MathMax(lots, mn); + v = MathMin(v, mx); + return NormalizeDouble(MathFloor(v / step + 0.5) * step, 2); +} + +// Threshold <= 0 disables that leg (optimizer must not treat 0 as "always strong"). +bool RC_IsTrendStrong(const double emaSlope, const double priceToEmaDistance) +{ + if(!RC_UseTrendStrengthFilter) + return false; + const bool slopeStrong = (RC_emaSlopeThreshold > 0.0) + && (MathAbs(emaSlope) > RC_emaSlopeThreshold); + const bool distanceStrong = (RC_emaDistanceThreshold > 0.0) + && (MathAbs(priceToEmaDistance) > RC_emaDistanceThreshold); + return slopeStrong || distanceStrong; +} + bool InitRSICrossOverReversal(string symbol) { WeekDays_Init(); @@ -80,6 +104,7 @@ bool InitRSICrossOverReversal(string symbol) rcData.trade.SetExpertMagicNumber(RC_MagicNumber); rcData.trade.SetDeviationInPoints(RC_slippage); + rcData.trade.SetTypeFillingBySymbol(symbol); rcData.isInitialized = true; Print("RSICrossOverReversal: Successfully initialized for symbol '", symbol, "'"); return true; @@ -148,9 +173,12 @@ void ProcessRSICrossOverReversal(string symbol) return; rcData.symbol = symbol; // Update symbol in case it changed - if(rcData.bartime == iTime(rcData.symbol, RC_BarTimeFrame, 0)) + const datetime barTime = iTime(rcData.symbol, RC_BarTimeFrame, 0); + if(barTime == 0) return; - rcData.bartime = iTime(rcData.symbol, RC_BarTimeFrame, 0); + if(rcData.bartime == barTime) + return; + rcData.bartime = barTime; double rsi[]; if(CopyBuffer(rcData.rsiHandle, 0, 0, 2, rsi) <= 0) @@ -191,13 +219,7 @@ void ProcessRSICrossOverReversal(string symbol) double emaSlope = (currentEMA - previousEMA) * 100; const double closeCurr = iClose(rcData.symbol, RC_TimeFrame1, 0); - // Raw (close-EMA)*10 blows past threshold on XAUUSD (~2600) almost every bar — blocks all entries. - // Compare distance in pips so RC_emaDistanceThreshold matches intent across symbols. - const double point = SymbolInfoDouble(rcData.symbol, SYMBOL_POINT); - const int symDig = (int)SymbolInfoInteger(rcData.symbol, SYMBOL_DIGITS); - const double pipMult = (symDig == 3 || symDig == 5) ? 10.0 : 1.0; - const double pipSize = (point > 0.0 ? point * pipMult : point); - const double priceToEmaPips = (pipSize > 0.0 ? MathAbs(closeCurr - currentEMA) / pipSize : 0.0); + double priceToEmaDistance = (closeCurr - currentEMA) * 10; bool isBuyPosition = false; bool isSellPosition = false; @@ -216,8 +238,7 @@ void ProcessRSICrossOverReversal(string symbol) ApplyTrailingStop(); bool cooldownPassed = (currentTime - rcData.lastTradeTime) >= RC_cooldownSeconds; - const bool isTrendStrong = RC_UseTrendStrengthFilter && - (MathAbs(emaSlope) > RC_emaSlopeThreshold || priceToEmaPips > RC_emaDistanceThreshold); + const bool isTrendStrong = RC_IsTrendStrong(emaSlope, priceToEmaDistance); if(isBuyPosition && currentRSI > RC_exitBuyRSI) { @@ -237,28 +258,36 @@ void ProcessRSICrossOverReversal(string symbol) rcData.lastTradeTime = currentTime; } - if(!isTrendStrong && - currentRSI < RC_overboughtLevel - RC_entryRSISellSpread && rcData.previousRSIDef >= RC_overboughtLevel && - !isSellPosition && !hasPosition && cooldownPassed) + hasPosition = PositionExistsByMagic(rcData.symbol, RC_MagicNumber); + isBuyPosition = false; + isSellPosition = false; + if(hasPosition && PositionSelectByMagic(rcData.symbol, RC_MagicNumber)) { - const double vol = United_NormalizeVolume(rcData.symbol, g_RC_LotSize); - if(vol > 0.0) - { - rcData.trade.SetExpertMagicNumber(RC_MagicNumber); - if(rcData.trade.Sell(vol, rcData.symbol, 0.0, 0.0, 0.0, "Sell Order")) - rcData.lastTradeTime = currentTime; - } + const ENUM_POSITION_TYPE positionType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + if(positionType == POSITION_TYPE_BUY) + isBuyPosition = true; + else if(positionType == POSITION_TYPE_SELL) + isSellPosition = true; } - if(!isTrendStrong && - currentRSI > RC_oversoldLevel + RC_entryRSIBuySpread && rcData.previousRSIDef <= RC_oversoldLevel && - !isBuyPosition && !hasPosition && cooldownPassed) + const double lots = RC_NormalizeLot(rcData.symbol, g_RC_LotSize); + if(lots > 0.0 && !isTrendStrong && cooldownPassed + && United_PrepareEntrySlot(rcData.trade, rcData.symbol, RC_MagicNumber, RC_CloseUnprofitableOnNewSignal)) { - const double vol = United_NormalizeVolume(rcData.symbol, g_RC_LotSize); - if(vol > 0.0) + if(currentRSI < RC_overboughtLevel - RC_entryRSISellSpread + && rcData.previousRSIDef >= RC_overboughtLevel + && !isSellPosition) { rcData.trade.SetExpertMagicNumber(RC_MagicNumber); - if(rcData.trade.Buy(vol, rcData.symbol, 0.0, 0.0, 0.0, "Buy Order")) + if(rcData.trade.Sell(lots, rcData.symbol, 0.0, 0.0, 0.0, "Sell Order")) + rcData.lastTradeTime = currentTime; + } + else if(currentRSI > RC_oversoldLevel + RC_entryRSIBuySpread + && rcData.previousRSIDef <= RC_oversoldLevel + && !isBuyPosition) + { + rcData.trade.SetExpertMagicNumber(RC_MagicNumber); + if(rcData.trade.Buy(lots, rcData.symbol, 0.0, 0.0, 0.0, "Buy Order")) rcData.lastTradeTime = currentTime; } } diff --git a/frontline/cluster-latest/Strategies/RSIMidPointHijackStrategy.mqh b/frontline/cluster-latest/Strategies/RSIMidPointHijackStrategy.mqh index 120996b..7776a2d 100644 --- a/frontline/cluster-latest/Strategies/RSIMidPointHijackStrategy.mqh +++ b/frontline/cluster-latest/Strategies/RSIMidPointHijackStrategy.mqh @@ -37,6 +37,11 @@ bool HasPosition(string symbol, int magic) return PositionExistsByMagic(symbol, magic); } +bool RM_MayEnter(string symbol, int magic) +{ + return United_PrepareEntrySlot(rmData.trade, symbol, (ulong)magic, RM_CloseUnprofitableOnNewSignal); +} + bool HasProfitablePosition(int excludeMagic) { bool hasProfitable = false; @@ -113,7 +118,7 @@ void CheckRSIFollowStrategy(string symbol) if(rmData.rsiOverbought && rmData.lastBarRSI < RM_InpRSIExitLevel) { - if(!HasPosition(symbol, RM_InpMagicNumberRSIFollow)) + if(RM_MayEnter(symbol, RM_InpMagicNumberRSIFollow)) { rmData.trade.SetExpertMagicNumber(RM_InpMagicNumberRSIFollow); const double vol = RM_NormalizedLot(symbol); @@ -124,7 +129,7 @@ void CheckRSIFollowStrategy(string symbol) } else if(rmData.rsiOversold && rmData.lastBarRSI > RM_InpRSIExitLevel) { - if(!HasPosition(symbol, RM_InpMagicNumberRSIFollow)) + if(RM_MayEnter(symbol, RM_InpMagicNumberRSIFollow)) { rmData.trade.SetExpertMagicNumber(RM_InpMagicNumberRSIFollow); const double vol = RM_NormalizedLot(symbol); @@ -160,7 +165,7 @@ void CheckRSIReverseStrategy(string symbol) if(rmData.rsiReverseOverbought && rmData.lastBarRSIReverse < RM_InpRSIReverseCrossLevel) { - if(!HasPosition(symbol, RM_InpMagicNumberRSIReverse)) + if(RM_MayEnter(symbol, RM_InpMagicNumberRSIReverse)) { rmData.trade.SetExpertMagicNumber(RM_InpMagicNumberRSIReverse); const double vol = RM_NormalizedLot(symbol); @@ -171,7 +176,7 @@ void CheckRSIReverseStrategy(string symbol) } else if(rmData.rsiReverseOversold && rmData.lastBarRSIReverse > RM_InpRSIReverseCrossLevel) { - if(!HasPosition(symbol, RM_InpMagicNumberRSIReverse)) + if(RM_MayEnter(symbol, RM_InpMagicNumberRSIReverse)) { rmData.trade.SetExpertMagicNumber(RM_InpMagicNumberRSIReverse); const double vol = RM_NormalizedLot(symbol); @@ -233,7 +238,7 @@ void CheckEMACrossStrategy(string symbol) } } - if(distanceConditionMet && !HasPosition(symbol, RM_InpMagicNumberEMACross)) + if(distanceConditionMet && RM_MayEnter(symbol, RM_InpMagicNumberEMACross)) { rmData.trade.SetExpertMagicNumber(RM_InpMagicNumberEMACross); const double vol = RM_NormalizedLot(symbol); @@ -264,7 +269,7 @@ void CheckEMACrossStrategy(string symbol) } } - if(distanceConditionMet && !HasPosition(symbol, RM_InpMagicNumberEMACross)) + if(distanceConditionMet && RM_MayEnter(symbol, RM_InpMagicNumberEMACross)) { rmData.trade.SetExpertMagicNumber(RM_InpMagicNumberEMACross); const double vol = RM_NormalizedLot(symbol); @@ -279,7 +284,7 @@ void CheckEMACrossStrategy(string symbol) { if(rmData.lastBarEMAPrev < rmData.lastBarClosePrev && rmData.lastBarEMA > rmData.lastBarClose) { - if(!HasPosition(symbol, RM_InpMagicNumberEMACross)) + if(RM_MayEnter(symbol, RM_InpMagicNumberEMACross)) { rmData.trade.SetExpertMagicNumber(RM_InpMagicNumberEMACross); const double vol = RM_NormalizedLot(symbol); @@ -289,7 +294,7 @@ void CheckEMACrossStrategy(string symbol) } else if(rmData.lastBarEMAPrev > rmData.lastBarClosePrev && rmData.lastBarEMA < rmData.lastBarClose) { - if(!HasPosition(symbol, RM_InpMagicNumberEMACross)) + if(RM_MayEnter(symbol, RM_InpMagicNumberEMACross)) { rmData.trade.SetExpertMagicNumber(RM_InpMagicNumberEMACross); const double vol = RM_NormalizedLot(symbol); diff --git a/frontline/cluster-latest/Strategies/RSIReversalAsianStrategy.mqh b/frontline/cluster-latest/Strategies/RSIReversalAsianStrategy.mqh index e204fb0..2f0ac7e 100644 --- a/frontline/cluster-latest/Strategies/RSIReversalAsianStrategy.mqh +++ b/frontline/cluster-latest/Strategies/RSIReversalAsianStrategy.mqh @@ -42,6 +42,7 @@ struct RSIReversalAsianData { int MagicNumber; int Slippage; double point; + bool closeUnprofitableOnNewSignal; }; // Session times (UTC) @@ -425,12 +426,14 @@ void ProcessRSIReversalAsian(RSIReversalAsianData& data, double lotSize) } } - // If no position is open, look for entry signals based on RSI crossover - if(!hasOpenPosition) + // If no position is open (or replacement enabled), look for entry signals + if(!hasOpenPosition || data.closeUnprofitableOnNewSignal) { // Place buy order if RSI crosses below oversold level (oversold crossover) if(data.rsiCrossedOversold) { + if(!United_PrepareEntrySlot(data.trade, data.symbol, (ulong)data.MagicNumber, data.closeUnprofitableOnNewSignal)) + return; double sl = data.UseStopLoss ? currentBid - data.StopLossPips * data.point : 0; double tp = data.UseTakeProfit ? currentBid + data.TakeProfitPips * data.point : 0; @@ -459,6 +462,8 @@ void ProcessRSIReversalAsian(RSIReversalAsianData& data, double lotSize) // Place sell order if RSI crosses above overbought level (overbought crossover) else if(data.rsiCrossedOverbought) { + if(!United_PrepareEntrySlot(data.trade, data.symbol, (ulong)data.MagicNumber, data.closeUnprofitableOnNewSignal)) + return; double sl = data.UseStopLoss ? currentAsk + data.StopLossPips * data.point : 0; double tp = data.UseTakeProfit ? currentAsk - data.TakeProfitPips * data.point : 0; diff --git a/frontline/cluster-latest/Strategies/RSIScalpingStrategy.mqh b/frontline/cluster-latest/Strategies/RSIScalpingStrategy.mqh index 630955d..41e2597 100644 --- a/frontline/cluster-latest/Strategies/RSIScalpingStrategy.mqh +++ b/frontline/cluster-latest/Strategies/RSIScalpingStrategy.mqh @@ -20,6 +20,7 @@ struct RSIScalpingData { datetime last_bar_time; bool rsi_against_position; int bars_against_count; + bool closeUnprofitableOnNewSignal; }; void ClosePosition(RSIScalpingData& data, int MagicNumber); @@ -247,7 +248,7 @@ bool InitRSIScalping(RSIScalpingData& data, string symbol, ENUM_TIMEFRAMES TimeF data.trade.SetExpertMagicNumber(MagicNumber); data.trade.SetDeviationInPoints(Slippage); - data.trade.SetTypeFilling(ORDER_FILLING_FOK); + data.trade.SetTypeFillingBySymbol(symbol); ArraySetAsSeries(data.rsi_buffer, true); data.position_open = false; @@ -433,8 +434,15 @@ double NormalizeLotSize(string symbol, double lotSize) void OpenBuyPosition(RSIScalpingData& data, int MagicNumber, double LotSize) { - if(PositionExistsByMagic(data.symbol, MagicNumber)) + if(!United_PrepareEntrySlot(data.trade, data.symbol, (ulong)MagicNumber, data.closeUnprofitableOnNewSignal)) return; + if(United_IsGapRiskWindow(data.symbol)) + return; + + data.position_open = false; + data.position_ticket = 0; + data.rsi_against_position = false; + data.bars_against_count = 0; // Normalize lot size according to symbol properties double normalizedLot = NormalizeLotSize(data.symbol, LotSize); @@ -458,8 +466,15 @@ void OpenBuyPosition(RSIScalpingData& data, int MagicNumber, double LotSize) void OpenSellPosition(RSIScalpingData& data, int MagicNumber, double LotSize) { - if(PositionExistsByMagic(data.symbol, MagicNumber)) + if(!United_PrepareEntrySlot(data.trade, data.symbol, (ulong)MagicNumber, data.closeUnprofitableOnNewSignal)) return; + if(United_IsGapRiskWindow(data.symbol)) + return; + + data.position_open = false; + data.position_ticket = 0; + data.rsi_against_position = false; + data.bars_against_count = 0; // Normalize lot size according to symbol properties double normalizedLot = NormalizeLotSize(data.symbol, LotSize); @@ -606,10 +621,8 @@ void ProcessRSIScalping(RSIScalpingData& data, string symbol, ENUM_TIMEFRAMES Ti CheckExistingPosition(data, TimeFrame, MagicNumber, RSI_Oversold, RSI_Overbought, RSI_Target_Buy, RSI_Target_Sell, BarsToWait); - if(!data.position_open && !PositionExistsByMagic(data.symbol, MagicNumber)) - { + if(!in_pos || data.closeUnprofitableOnNewSignal) CheckEntrySignals(data, TimeFrame, MagicNumber, RSI_Oversold, RSI_Overbought, LotSize); - } } //+------------------------------------------------------------------+ diff --git a/frontline/cluster-latest/Strategies/RSISecretSauceStrategy.mqh b/frontline/cluster-latest/Strategies/RSISecretSauceStrategy.mqh index a8c284e..481cf40 100644 --- a/frontline/cluster-latest/Strategies/RSISecretSauceStrategy.mqh +++ b/frontline/cluster-latest/Strategies/RSISecretSauceStrategy.mqh @@ -27,6 +27,7 @@ struct RSISecretSauceOrcData datetime lastRSIReentryTime; datetime lastTradeTime; datetime lastBarTime; + bool closeUnprofitableOnNewSignal; }; bool RSS_UpdateIndicators(RSISecretSauceOrcData &d) @@ -198,7 +199,12 @@ bool RSS_CanOpenNewPosition(RSISecretSauceOrcData &d) } } if(positionCount >= RSS_MaxPositions) - return false; + { + if(!d.closeUnprofitableOnNewSignal) + return false; + if(!IsUnprofitablePositionByMagic(d.actualSymbol, (ulong)RSS_MagicNumber)) + return false; + } if(d.lastTradeTime > 0) { @@ -211,6 +217,9 @@ bool RSS_CanOpenNewPosition(RSISecretSauceOrcData &d) void RSS_OpenPosition(RSISecretSauceOrcData &d, ENUM_POSITION_TYPE type, const double lotSize) { + if(!United_PrepareEntrySlot(d.trade, d.actualSymbol, (ulong)RSS_MagicNumber, d.closeUnprofitableOnNewSignal)) + return; + double price = (type == POSITION_TYPE_BUY) ? SymbolInfoDouble(d.actualSymbol, SYMBOL_ASK) : SymbolInfoDouble(d.actualSymbol, SYMBOL_BID); diff --git a/frontline/cluster-latest/Strategies/SimpleTrendlineStrategy.mqh b/frontline/cluster-latest/Strategies/SimpleTrendlineStrategy.mqh index 6341b88..1220d10 100644 --- a/frontline/cluster-latest/Strategies/SimpleTrendlineStrategy.mqh +++ b/frontline/cluster-latest/Strategies/SimpleTrendlineStrategy.mqh @@ -32,6 +32,7 @@ struct SimpleTrendlineData int maHandle; datetime lastSignalBarTime; string lineName; + bool closeUnprofitableOnNewSignal; }; double ST_NormalizeVolume(const string sym, double vol) @@ -193,7 +194,7 @@ void ST_TryExitOnBreak(SimpleTrendlineData &d, const SimpleTrendlineModel &m) void ST_TryPullbackEntry(SimpleTrendlineData &d, const SimpleTrendlineModel &m, const double lots) { - if(PositionExistsByMagic(d.symbol, d.magic)) + if(!United_PrepareEntrySlot(d.trade, d.symbol, d.magic, d.closeUnprofitableOnNewSignal)) return; MqlRates b1[], b2[]; diff --git a/frontline/cluster-latest/Strategies/SuperEMAStrategy.mqh b/frontline/cluster-latest/Strategies/SuperEMAStrategy.mqh index 52400fe..16359e8 100644 --- a/frontline/cluster-latest/Strategies/SuperEMAStrategy.mqh +++ b/frontline/cluster-latest/Strategies/SuperEMAStrategy.mqh @@ -43,6 +43,7 @@ struct SuperEMAData int maxHoldingBars; bool exitBelowMidEma; bool debugLogs; + bool closeUnprofitableOnNewSignal; }; void SuperEMA_Log(SuperEMAData &d, const string s) @@ -429,7 +430,7 @@ void ProcessSuperEMA(SuperEMAData &d, const double lots) SuperEMA_ManageExits(d); // Same order as standalone SuperEMAXAUUSD: skip entry logic when flat is not allowed. - if(d.oneTradeOnly && SuperEMA_PositionsByMagic(d) > 0) + if(d.oneTradeOnly && SuperEMA_PositionsByMagic(d) > 0 && !d.closeUnprofitableOnNewSignal) return; const int sh = d.emaTrendBars; @@ -477,6 +478,9 @@ void ProcessSuperEMA(SuperEMAData &d, const double lots) return; } + if(!United_PrepareEntrySlot(d.trade, d.symbol, d.magic, d.closeUnprofitableOnNewSignal)) + return; + MqlTick tick; if(!SymbolInfoTick(d.symbol, tick)) return; diff --git a/frontline/cluster-latest/Strategies/USDJPYBusterStrategy.mqh b/frontline/cluster-latest/Strategies/USDJPYBusterStrategy.mqh new file mode 100644 index 0000000..20de4a5 --- /dev/null +++ b/frontline/cluster-latest/Strategies/USDJPYBusterStrategy.mqh @@ -0,0 +1,560 @@ +//+------------------------------------------------------------------+ +//| USDJPYBusterStrategy.mqh | +//| Ian-style USDJPY Asian range breakout for United EA cluster | +//+------------------------------------------------------------------+ +#ifndef USDJPY_BUSTER_STRATEGY_MQH +#define USDJPY_BUSTER_STRATEGY_MQH + +enum ENUM_UB_RISK_MODE +{ + UB_RISK_FIXED_MONEY = 0, + UB_RISK_PERCENT = 1, + UB_RISK_FIXED_LOTS = 2 +}; + +struct USDJPYBusterData +{ + string symbol; + bool isInitialized; + CTrade trade; + + int rangeStartHour; + int rangeEndHour; + int closeHour; + ENUM_TIMEFRAMES rangeTF; + int minRangePoints; + double orderBufferPoints; + + bool firstTradeOnly; + bool allowLong; + bool allowShort; + bool useTakeProfit; + double takeProfitPoints; + + ENUM_UB_RISK_MODE riskMode; + double fixedRiskMoney; + double riskPercent; + double fixedLots; + + int magic; + int slippage; + int maxSpreadPoints; + bool drawRange; + bool debugLog; + bool closeUnprofitableOnNewSignal; + + int dayKey; + double rangeHigh; + double rangeLow; + bool rangeBuilt; + bool rangeSkipDay; + bool ordersPlaced; + bool dayClosed; + bool firstFillDone; + int entriesToday; + int lastPosCount; +}; + +//+------------------------------------------------------------------+ +int UB_DayKey(const datetime t) +{ + MqlDateTime dt; + TimeToStruct(t, dt); + return dt.year * 10000 + dt.mon * 100 + dt.day; +} + +datetime UB_DayStart(const datetime t) +{ + MqlDateTime dt; + TimeToStruct(t, dt); + dt.hour = 0; + dt.min = 0; + dt.sec = 0; + return StructToTime(dt); +} + +void UB_ResetDayState(USDJPYBusterData &d) +{ + d.rangeHigh = 0.0; + d.rangeLow = 0.0; + d.rangeBuilt = false; + d.rangeSkipDay = false; + d.ordersPlaced = false; + d.dayClosed = false; + d.firstFillDone = false; + d.entriesToday = 0; + d.lastPosCount = 0; +} + +void UB_Dbg(USDJPYBusterData &d, const string msg) +{ + if(d.debugLog) + Print("USDJPYBuster: ", msg); +} + +double UB_NormalizeLots(const string sym, double lots) +{ + const double mn = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN); + const double mx = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX); + const double st = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP); + if(st > 0.0) + lots = MathFloor(lots / st) * st; + if(lots < mn) + lots = mn; + if(lots > mx) + lots = mx; + return lots; +} + +double UB_NormalizePrice(const string sym, const double price) +{ + const int dg = (int)SymbolInfoInteger(sym, SYMBOL_DIGITS); + return NormalizeDouble(price, dg); +} + +double UB_MinStopDistance(const string sym) +{ + const double pt = SymbolInfoDouble(sym, SYMBOL_POINT); + const long lvl = SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL); + return MathMax((double)lvl * pt, pt); +} + +bool UB_SpreadOk(const USDJPYBusterData &d) +{ + return ((double)SymbolInfoInteger(d.symbol, SYMBOL_SPREAD) <= (double)d.maxSpreadPoints); +} + +bool UB_MoneyPerLotAtSl(const string sym, const ENUM_ORDER_TYPE type, + const double openPrice, const double slPrice, double &lossPerLot) +{ + lossPerLot = 0.0; + double p = 0.0; + if(!OrderCalcProfit(type, sym, 1.0, openPrice, slPrice, p)) + return false; + lossPerLot = MathAbs(p); + return (lossPerLot > 0.0); +} + +double UB_LotsForOrder(USDJPYBusterData &d, const ENUM_ORDER_TYPE type, + const double entry, const double sl, const double scaledFixedLots) +{ + if(d.riskMode == UB_RISK_FIXED_LOTS) + return UB_NormalizeLots(d.symbol, scaledFixedLots); + + double perLotLoss = 0.0; + if(!UB_MoneyPerLotAtSl(d.symbol, type, entry, sl, perLotLoss) || perLotLoss <= 0.0) + return UB_NormalizeLots(d.symbol, scaledFixedLots); + + double riskMoney = d.fixedRiskMoney; + if(d.riskMode == UB_RISK_PERCENT) + riskMoney = AccountInfoDouble(ACCOUNT_BALANCE) * (d.riskPercent / 100.0); + + if(riskMoney <= 0.0) + return UB_NormalizeLots(d.symbol, scaledFixedLots); + + return UB_NormalizeLots(d.symbol, riskMoney / perLotLoss); +} + +bool UB_BuildRange(USDJPYBusterData &d, const datetime serverNow, double &hi, double &lo) +{ + hi = -DBL_MAX; + lo = DBL_MAX; + + const datetime day0 = UB_DayStart(serverNow); + const datetime tStart = day0 + (datetime)d.rangeStartHour * 3600; + const datetime tEnd = day0 + (datetime)d.rangeEndHour * 3600; + if(tEnd <= tStart) + return false; + + MqlRates rates[]; + const int copied = CopyRates(d.symbol, d.rangeTF, tStart, tEnd, rates); + if(copied <= 0) + return false; + + for(int i = 0; i < copied; i++) + { + if(rates[i].time < tStart || rates[i].time >= tEnd) + continue; + hi = MathMax(hi, rates[i].high); + lo = MathMin(lo, rates[i].low); + } + + if(hi <= -DBL_MAX || lo >= DBL_MAX || hi <= lo) + return false; + + const double pt = SymbolInfoDouble(d.symbol, SYMBOL_POINT); + if((hi - lo) / pt < (double)d.minRangePoints) + return false; + + hi = UB_NormalizePrice(d.symbol, hi); + lo = UB_NormalizePrice(d.symbol, lo); + return true; +} + +bool UB_AdjustStopsForBroker(USDJPYBusterData &d, const ENUM_ORDER_TYPE type, + const double entry, double &sl, double &tp) +{ + const double minD = UB_MinStopDistance(d.symbol); + if(minD <= 0.0) + return true; + + if(type == ORDER_TYPE_BUY || type == ORDER_TYPE_BUY_STOP) + { + if(entry - sl < minD) + sl = entry - minD; + if(d.useTakeProfit && tp > 0.0 && tp - entry < minD) + tp = entry + minD; + } + else + { + if(sl - entry < minD) + sl = entry + minD; + if(d.useTakeProfit && tp > 0.0 && entry - tp < minD) + tp = entry - minD; + } + sl = UB_NormalizePrice(d.symbol, sl); + if(d.useTakeProfit) + tp = UB_NormalizePrice(d.symbol, tp); + return true; +} + +bool UB_BuyStopValid(const string sym, const double buyStopPrice) +{ + MqlTick tick; + if(!SymbolInfoTick(sym, tick)) + return false; + return (buyStopPrice > tick.ask + UB_MinStopDistance(sym)); +} + +bool UB_SellStopValid(const string sym, const double sellStopPrice) +{ + MqlTick tick; + if(!SymbolInfoTick(sym, tick)) + return false; + return (sellStopPrice < tick.bid - UB_MinStopDistance(sym)); +} + +int UB_CountMagicPositions(USDJPYBusterData &d) +{ + int n = 0; + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + const ulong t = PositionGetTicket(i); + if(t == 0 || !PositionSelectByTicket(t)) + continue; + if(PositionGetString(POSITION_SYMBOL) != d.symbol) + continue; + if((int)PositionGetInteger(POSITION_MAGIC) != d.magic) + continue; + n++; + } + return n; +} + +int UB_CountMagicPendings(USDJPYBusterData &d) +{ + int n = 0; + for(int i = OrdersTotal() - 1; i >= 0; i--) + { + const ulong ticket = OrderGetTicket(i); + if(ticket == 0 || !OrderSelect(ticket)) + continue; + if(OrderGetString(ORDER_SYMBOL) != d.symbol) + continue; + if((int)OrderGetInteger(ORDER_MAGIC) != d.magic) + continue; + n++; + } + return n; +} + +void UB_DeleteAllMagicPendings(USDJPYBusterData &d) +{ + for(int i = OrdersTotal() - 1; i >= 0; i--) + { + const ulong ticket = OrderGetTicket(i); + if(ticket == 0 || !OrderSelect(ticket)) + continue; + if(OrderGetString(ORDER_SYMBOL) != d.symbol) + continue; + if((int)OrderGetInteger(ORDER_MAGIC) != d.magic) + continue; + d.trade.OrderDelete(ticket); + } +} + +void UB_CloseAllMagicPositions(USDJPYBusterData &d) +{ + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + const ulong t = PositionGetTicket(i); + if(t == 0 || !PositionSelectByTicket(t)) + continue; + if(PositionGetString(POSITION_SYMBOL) != d.symbol) + continue; + if((int)PositionGetInteger(POSITION_MAGIC) != d.magic) + continue; + d.trade.PositionClose(t); + } +} + +void UB_EndOfDayClose(USDJPYBusterData &d) +{ + UB_CloseAllMagicPositions(d); + UB_DeleteAllMagicPendings(d); + d.dayClosed = true; + d.ordersPlaced = false; +} + +int UB_MaxEntriesPerDay(const USDJPYBusterData &d) +{ + return (d.firstTradeOnly ? 1 : 2); +} + +void UB_TrackEntries(USDJPYBusterData &d) +{ + const int pc = UB_CountMagicPositions(d); + if(pc > d.lastPosCount) + d.entriesToday += (pc - d.lastPosCount); + d.lastPosCount = pc; + + if(d.entriesToday >= UB_MaxEntriesPerDay(d)) + UB_DeleteAllMagicPendings(d); +} + +bool UB_PlaceBreakoutOrders(USDJPYBusterData &d, const double scaledFixedLots, const double riskScale) +{ + if(!UB_SpreadOk(d)) + { + UB_Dbg(d, "spread too wide — retry later"); + return false; + } + + if(AccountInfoDouble(ACCOUNT_MARGIN_FREE) <= 0.0) + { + UB_Dbg(d, "no free margin — skip placement"); + return false; + } + + const double pt = SymbolInfoDouble(d.symbol, SYMBOL_POINT); + const double buf = d.orderBufferPoints * pt; + + const double buyPrice = UB_NormalizePrice(d.symbol, d.rangeHigh + buf); + const double sellPrice = UB_NormalizePrice(d.symbol, d.rangeLow - buf); + const double buySl = UB_NormalizePrice(d.symbol, d.rangeLow); + const double sellSl = UB_NormalizePrice(d.symbol, d.rangeHigh); + + double buyTp = 0.0, sellTp = 0.0; + if(d.useTakeProfit && d.takeProfitPoints > 0.0) + { + buyTp = UB_NormalizePrice(d.symbol, buyPrice + d.takeProfitPoints * pt); + sellTp = UB_NormalizePrice(d.symbol, sellPrice - d.takeProfitPoints * pt); + } + + double buySlAdj = buySl, sellSlAdj = sellSl; + double buyTpAdj = buyTp, sellTpAdj = sellTp; + UB_AdjustStopsForBroker(d, ORDER_TYPE_BUY_STOP, buyPrice, buySlAdj, buyTpAdj); + UB_AdjustStopsForBroker(d, ORDER_TYPE_SELL_STOP, sellPrice, sellSlAdj, sellTpAdj); + + const double savedFixed = d.fixedRiskMoney; + if(d.riskMode == UB_RISK_FIXED_MONEY && riskScale > 0.0) + d.fixedRiskMoney = savedFixed * riskScale; + + int placed = 0; + + if(d.allowLong && UB_BuyStopValid(d.symbol, buyPrice)) + { + const double lots = UB_LotsForOrder(d, ORDER_TYPE_BUY, buyPrice, buySlAdj, scaledFixedLots); + if(d.trade.BuyStop(lots, buyPrice, d.symbol, buySlAdj, buyTpAdj, ORDER_TIME_DAY, 0, "UB range up")) + placed++; + else + Print("USDJPYBuster BuyStop failed ", d.trade.ResultRetcode(), " ", d.trade.ResultRetcodeDescription()); + } + else if(d.allowLong) + UB_Dbg(d, "buy stop skipped — price already at/above range high"); + + if(d.allowShort && UB_SellStopValid(d.symbol, sellPrice)) + { + const double lots = UB_LotsForOrder(d, ORDER_TYPE_SELL, sellPrice, sellSlAdj, scaledFixedLots); + if(d.trade.SellStop(lots, sellPrice, d.symbol, sellSlAdj, sellTpAdj, ORDER_TIME_DAY, 0, "UB range dn")) + placed++; + else + Print("USDJPYBuster SellStop failed ", d.trade.ResultRetcode(), " ", d.trade.ResultRetcodeDescription()); + } + else if(d.allowShort) + UB_Dbg(d, "sell stop skipped — price already at/below range low"); + + d.fixedRiskMoney = savedFixed; + return (placed > 0); +} + +void UB_HandleFirstFillRule(USDJPYBusterData &d) +{ + if(!d.firstTradeOnly || d.firstFillDone) + return; + if(UB_CountMagicPositions(d) <= 0) + return; + UB_DeleteAllMagicPendings(d); + d.firstFillDone = true; +} + +//+------------------------------------------------------------------+ +bool InitUSDJPYBuster(USDJPYBusterData &d, + const string symbol, + const int rangeStartHour, + const int rangeEndHour, + const int closeHour, + const ENUM_TIMEFRAMES rangeTF, + const int minRangePoints, + const double orderBufferPoints, + const bool firstTradeOnly, + const bool allowLong, + const bool allowShort, + const bool useTakeProfit, + const double takeProfitPoints, + const ENUM_UB_RISK_MODE riskMode, + const double fixedRiskMoney, + const double riskPercent, + const double fixedLots, + const int magic, + const int slippage, + const int maxSpreadPoints, + const bool drawRange, + const bool debugLog = false) +{ + d.symbol = symbol; + d.rangeStartHour = rangeStartHour; + d.rangeEndHour = rangeEndHour; + d.closeHour = closeHour; + d.rangeTF = rangeTF; + d.minRangePoints = minRangePoints; + d.orderBufferPoints = orderBufferPoints; + d.firstTradeOnly = firstTradeOnly; + d.allowLong = allowLong; + d.allowShort = allowShort; + d.useTakeProfit = useTakeProfit; + d.takeProfitPoints = takeProfitPoints; + d.riskMode = riskMode; + d.fixedRiskMoney = fixedRiskMoney; + d.riskPercent = riskPercent; + d.fixedLots = fixedLots; + d.magic = magic; + d.slippage = slippage; + d.maxSpreadPoints = maxSpreadPoints; + d.drawRange = drawRange; + d.debugLog = debugLog; + + if(!SymbolSelect(symbol, true)) + { + Print("USDJPYBuster: symbol not available: ", symbol); + d.isInitialized = false; + return false; + } + + if(rangeEndHour <= rangeStartHour) + { + Print("USDJPYBuster: rangeEndHour must be > rangeStartHour"); + d.isInitialized = false; + return false; + } + + d.trade.SetExpertMagicNumber(magic); + d.trade.SetDeviationInPoints(slippage); + d.trade.SetTypeFillingBySymbol(symbol); + + d.dayKey = UB_DayKey(TimeTradeServer()); + UB_ResetDayState(d); + d.isInitialized = true; + + Print("USDJPYBuster: ", symbol, + " range ", rangeStartHour, ":00–", rangeEndHour, ":00", + " place@", rangeEndHour, ":00 close@", closeHour, ":00", + " firstOnly=", (firstTradeOnly ? "Y" : "N")); + return true; +} + +void DeinitUSDJPYBuster(USDJPYBusterData &d) +{ + if(!d.isInitialized) + return; + d.isInitialized = false; +} + +void ProcessUSDJPYBuster(USDJPYBusterData &d, const double scaledFixedLots, const double riskScale) +{ + if(!d.isInitialized) + return; + + const datetime now = TimeTradeServer(); + MqlDateTime dt; + TimeToStruct(now, dt); + + const int today = UB_DayKey(now); + if(today != d.dayKey) + { + d.dayKey = today; + UB_ResetDayState(d); + } + + if(dt.hour >= d.closeHour && !d.dayClosed) + { + UB_EndOfDayClose(d); + return; + } + + if(d.dayClosed) + return; + + UB_TrackEntries(d); + UB_HandleFirstFillRule(d); + + if(d.entriesToday >= UB_MaxEntriesPerDay(d)) + { + UB_DeleteAllMagicPendings(d); + d.ordersPlaced = true; + return; + } + + if(dt.hour < d.rangeEndHour || dt.hour >= d.closeHour) + return; + + if(d.ordersPlaced || d.rangeSkipDay) + return; + + if(UB_CountMagicPendings(d) > 0) + { + d.ordersPlaced = true; + return; + } + + if(UB_CountMagicPositions(d) > 0) + { + if(!d.closeUnprofitableOnNewSignal + || !United_PrepareEntrySlot(d.trade, d.symbol, (ulong)d.magic, d.closeUnprofitableOnNewSignal)) + { + d.ordersPlaced = true; + return; + } + } + + if(!d.rangeBuilt) + { + if(!UB_BuildRange(d, now, d.rangeHigh, d.rangeLow)) + { + UB_Dbg(d, "range not ready or too narrow — retry until " + IntegerToString(d.closeHour) + ":00"); + return; + } + d.rangeBuilt = true; + } + + if(UB_PlaceBreakoutOrders(d, scaledFixedLots, riskScale)) + { + d.ordersPlaced = true; + return; + } + + if(!d.allowLong && !d.allowShort) + d.rangeSkipDay = true; +} + +#endif diff --git a/frontline/cluster-latest/Strategies/XAUBearTrendStrategy.mqh b/frontline/cluster-latest/Strategies/XAUBearTrendStrategy.mqh new file mode 100644 index 0000000..47a83ce --- /dev/null +++ b/frontline/cluster-latest/Strategies/XAUBearTrendStrategy.mqh @@ -0,0 +1,219 @@ +//+------------------------------------------------------------------+ +//| XAUBearTrendStrategy.mqh — XAUUSD bear-regime rally-fade shorts | +//+------------------------------------------------------------------+ +#ifndef XAU_BEAR_TREND_STRATEGY_MQH +#define XAU_BEAR_TREND_STRATEGY_MQH + +struct XAUBearTrendData +{ + string symbol; + bool isInitialized; + CTrade trade; + ENUM_TIMEFRAMES regimeTF; + ENUM_TIMEFRAMES entryTF; + int regimeEmaPeriod; + int rsiPeriod; + double rsiArmLevel; + double rsiTriggerLevel; + int atrPeriod; + double slAtrMult; + double tpAtrMult; + bool useTrailing; + double trailAtrMult; + ulong magic; + int slippage; + int maxSpreadPoints; + bool closeUnprofitableOnNewSignal; + int h_regimeEma; + int h_rsi; + int h_atr; + datetime lastBarTime; + bool rsiArmed; +}; + +bool XBT_Copy1(const int handle, double &v) +{ + double b[]; + ArraySetAsSeries(b, true); + if(CopyBuffer(handle, 0, 0, 1, b) < 1) + return false; + v = b[0]; + return true; +} + +bool XBT_RegimeBearish(XAUBearTrendData &d) +{ + double ema = 0.0; + if(!XBT_Copy1(d.h_regimeEma, ema)) + return false; + const double close1 = iClose(d.symbol, d.regimeTF, 1); + return (close1 > 0.0 && ema > 0.0 && close1 < ema); +} + +bool XBT_IsNewEntryBar(XAUBearTrendData &d) +{ + datetime t = iTime(d.symbol, d.entryTF, 0); + if(t <= 0 || t == d.lastBarTime) + return false; + d.lastBarTime = t; + return true; +} + +bool InitXAUBearTrend(XAUBearTrendData &d, + const string symbol, + const ENUM_TIMEFRAMES regimeTF, + const ENUM_TIMEFRAMES entryTF, + const int regimeEmaPeriod, + const int rsiPeriod, + const double rsiArmLevel, + const double rsiTriggerLevel, + const int atrPeriod, + const double slAtrMult, + const double tpAtrMult, + const bool useTrailing, + const double trailAtrMult, + const ulong magic, + const int slippage, + const int maxSpreadPoints) +{ + d.symbol = symbol; + d.regimeTF = regimeTF; + d.entryTF = entryTF; + d.regimeEmaPeriod = regimeEmaPeriod; + d.rsiPeriod = rsiPeriod; + d.rsiArmLevel = rsiArmLevel; + d.rsiTriggerLevel = rsiTriggerLevel; + d.atrPeriod = atrPeriod; + d.slAtrMult = slAtrMult; + d.tpAtrMult = tpAtrMult; + d.useTrailing = useTrailing; + d.trailAtrMult = trailAtrMult; + d.magic = magic; + d.slippage = slippage; + d.maxSpreadPoints = maxSpreadPoints; + d.lastBarTime = 0; + d.rsiArmed = false; + + if(!SymbolSelect(symbol, true)) + { + Print("XAUBearTrend: symbol not available: ", symbol); + d.isInitialized = false; + return false; + } + + d.h_regimeEma = iMA(symbol, regimeTF, regimeEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + d.h_rsi = iRSI(symbol, entryTF, rsiPeriod, PRICE_CLOSE); + d.h_atr = iATR(symbol, entryTF, atrPeriod); + + if(d.h_regimeEma == INVALID_HANDLE || d.h_rsi == INVALID_HANDLE || d.h_atr == INVALID_HANDLE) + { + Print("XAUBearTrend: indicator init failed for ", symbol); + d.isInitialized = false; + return false; + } + + d.trade.SetExpertMagicNumber((long)magic); + d.trade.SetDeviationInPoints(slippage); + d.trade.SetTypeFillingBySymbol(symbol); + d.isInitialized = true; + return true; +} + +void DeinitXAUBearTrend(XAUBearTrendData &d) +{ + if(d.h_regimeEma != INVALID_HANDLE) IndicatorRelease(d.h_regimeEma); + if(d.h_rsi != INVALID_HANDLE) IndicatorRelease(d.h_rsi); + if(d.h_atr != INVALID_HANDLE) IndicatorRelease(d.h_atr); + d.isInitialized = false; +} + +void XBT_ManageShort(XAUBearTrendData &d) +{ + if(!PositionSelectByMagic(d.symbol, d.magic)) + return; + + if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL) + return; + + if(!XBT_RegimeBearish(d)) + { + d.trade.PositionClose(PositionGetInteger(POSITION_TICKET)); + d.rsiArmed = false; + return; + } + + double atr = 0.0; + if(!XBT_Copy1(d.h_atr, atr) || atr <= 0.0) + return; + + const double entry = PositionGetDouble(POSITION_PRICE_OPEN); + const double bid = SymbolInfoDouble(d.symbol, SYMBOL_BID); + double sl = PositionGetDouble(POSITION_SL); + double tp = PositionGetDouble(POSITION_TP); + + if(d.useTrailing) + { + const double trail = bid + atr * d.trailAtrMult; + if(sl <= 0.0 || trail < sl) + sl = trail; + } + + if(tp <= 0.0 && d.tpAtrMult > 0.0) + tp = entry - atr * d.tpAtrMult; + + if(sl > 0.0 || tp > 0.0) + d.trade.PositionModify(PositionGetInteger(POSITION_TICKET), sl, tp); +} + +void ProcessXAUBearTrend(XAUBearTrendData &d, const double lotSize) +{ + if(!d.isInitialized || lotSize <= 0.0) + return; + + const long spread = SymbolInfoInteger(d.symbol, SYMBOL_SPREAD); + if(spread > d.maxSpreadPoints) + return; + + XBT_ManageShort(d); + + if(!XBT_IsNewEntryBar(d)) + return; + + if(!XBT_RegimeBearish(d)) + { + d.rsiArmed = false; + return; + } + + double rsi[]; + ArraySetAsSeries(rsi, true); + if(CopyBuffer(d.h_rsi, 0, 1, 2, rsi) < 2) + return; + + if(rsi[0] >= d.rsiArmLevel) + d.rsiArmed = true; + + if(!d.rsiArmed || rsi[0] >= d.rsiTriggerLevel) + return; + + if(PositionExistsByMagic(d.symbol, d.magic)) + return; + + if(!United_MayOpenNewEntry(d.symbol, d.magic, false, d.trade, d.closeUnprofitableOnNewSignal)) + return; + + double atr = 0.0; + if(!XBT_Copy1(d.h_atr, atr) || atr <= 0.0) + return; + + const double barHigh = iHigh(d.symbol, d.entryTF, 1); + const double ask = SymbolInfoDouble(d.symbol, SYMBOL_ASK); + const double sl = barHigh + atr * d.slAtrMult; + const double tp = (d.tpAtrMult > 0.0 ? ask - atr * d.tpAtrMult : 0.0); + const double lots = United_NormalizeVolume(d.symbol, lotSize); + + if(d.trade.Sell(lots, d.symbol, 0.0, sl, tp, "XBT rally fade")) + d.rsiArmed = false; +} + +#endif diff --git a/frontline/cluster-latest/Strategies/XAUMomentumBreakdownStrategy.mqh b/frontline/cluster-latest/Strategies/XAUMomentumBreakdownStrategy.mqh new file mode 100644 index 0000000..023ff18 --- /dev/null +++ b/frontline/cluster-latest/Strategies/XAUMomentumBreakdownStrategy.mqh @@ -0,0 +1,206 @@ +//+------------------------------------------------------------------+ +//| XAUMomentumBreakdownStrategy.mqh — XAUUSD BB upper fade in bear | +//+------------------------------------------------------------------+ +#ifndef XAU_MOMENTUM_BREAKDOWN_STRATEGY_MQH +#define XAU_MOMENTUM_BREAKDOWN_STRATEGY_MQH + +struct XAUMomentumBreakdownData +{ + string symbol; + bool isInitialized; + CTrade trade; + ENUM_TIMEFRAMES regimeTF; + ENUM_TIMEFRAMES entryTF; + int regimeEmaPeriod; + int bbPeriod; + double bbDeviation; + int atrPeriod; + double slAtrMult; + double tpAtrMult; + bool useTrailing; + double trailAtrMult; + ulong magic; + int slippage; + int maxSpreadPoints; + bool closeUnprofitableOnNewSignal; + int h_regimeEma; + int h_bb; + int h_atr; + datetime lastBarTime; +}; + +bool XMB_Copy1(const int handle, const int buf, double &v) +{ + double b[]; + ArraySetAsSeries(b, true); + if(CopyBuffer(handle, buf, 0, 1, b) < 1) + return false; + v = b[0]; + return true; +} + +bool XMB_RegimeBearish(XAUMomentumBreakdownData &d) +{ + double ema = 0.0; + if(!XMB_Copy1(d.h_regimeEma, 0, ema)) + return false; + const double close1 = iClose(d.symbol, d.regimeTF, 1); + return (close1 > 0.0 && ema > 0.0 && close1 < ema); +} + +bool XMB_IsNewEntryBar(XAUMomentumBreakdownData &d) +{ + datetime t = iTime(d.symbol, d.entryTF, 0); + if(t <= 0 || t == d.lastBarTime) + return false; + d.lastBarTime = t; + return true; +} + +bool InitXAUMomentumBreakdown(XAUMomentumBreakdownData &d, + const string symbol, + const ENUM_TIMEFRAMES regimeTF, + const ENUM_TIMEFRAMES entryTF, + const int regimeEmaPeriod, + const int bbPeriod, + const double bbDeviation, + const int atrPeriod, + const double slAtrMult, + const double tpAtrMult, + const bool useTrailing, + const double trailAtrMult, + const ulong magic, + const int slippage, + const int maxSpreadPoints) +{ + d.symbol = symbol; + d.regimeTF = regimeTF; + d.entryTF = entryTF; + d.regimeEmaPeriod = regimeEmaPeriod; + d.bbPeriod = bbPeriod; + d.bbDeviation = bbDeviation; + d.atrPeriod = atrPeriod; + d.slAtrMult = slAtrMult; + d.tpAtrMult = tpAtrMult; + d.useTrailing = useTrailing; + d.trailAtrMult = trailAtrMult; + d.magic = magic; + d.slippage = slippage; + d.maxSpreadPoints = maxSpreadPoints; + d.lastBarTime = 0; + + if(!SymbolSelect(symbol, true)) + { + Print("XAUMomentumBreakdown: symbol not available: ", symbol); + d.isInitialized = false; + return false; + } + + d.h_regimeEma = iMA(symbol, regimeTF, regimeEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + d.h_bb = iBands(symbol, entryTF, bbPeriod, 0, bbDeviation, PRICE_CLOSE); + d.h_atr = iATR(symbol, entryTF, atrPeriod); + + if(d.h_regimeEma == INVALID_HANDLE || d.h_bb == INVALID_HANDLE || d.h_atr == INVALID_HANDLE) + { + Print("XAUMomentumBreakdown: indicator init failed for ", symbol); + d.isInitialized = false; + return false; + } + + d.trade.SetExpertMagicNumber((long)magic); + d.trade.SetDeviationInPoints(slippage); + d.trade.SetTypeFillingBySymbol(symbol); + d.isInitialized = true; + return true; +} + +void DeinitXAUMomentumBreakdown(XAUMomentumBreakdownData &d) +{ + if(d.h_regimeEma != INVALID_HANDLE) IndicatorRelease(d.h_regimeEma); + if(d.h_bb != INVALID_HANDLE) IndicatorRelease(d.h_bb); + if(d.h_atr != INVALID_HANDLE) IndicatorRelease(d.h_atr); + d.isInitialized = false; +} + +void XMB_ManageShort(XAUMomentumBreakdownData &d) +{ + if(!PositionSelectByMagic(d.symbol, d.magic)) + return; + + if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL) + return; + + if(!XMB_RegimeBearish(d)) + { + d.trade.PositionClose(PositionGetInteger(POSITION_TICKET)); + return; + } + + double atr = 0.0; + if(!XMB_Copy1(d.h_atr, 0, atr) || atr <= 0.0) + return; + + const double entry = PositionGetDouble(POSITION_PRICE_OPEN); + const double bid = SymbolInfoDouble(d.symbol, SYMBOL_BID); + double sl = PositionGetDouble(POSITION_SL); + double tp = PositionGetDouble(POSITION_TP); + + if(d.useTrailing) + { + const double trail = bid + atr * d.trailAtrMult; + if(sl <= 0.0 || trail < sl) + sl = trail; + } + + if(tp <= 0.0 && d.tpAtrMult > 0.0) + tp = entry - atr * d.tpAtrMult; + + if(sl > 0.0 || tp > 0.0) + d.trade.PositionModify(PositionGetInteger(POSITION_TICKET), sl, tp); +} + +void ProcessXAUMomentumBreakdown(XAUMomentumBreakdownData &d, const double lotSize) +{ + if(!d.isInitialized || lotSize <= 0.0) + return; + + const long spread = SymbolInfoInteger(d.symbol, SYMBOL_SPREAD); + if(spread > d.maxSpreadPoints) + return; + + XMB_ManageShort(d); + + if(!XMB_IsNewEntryBar(d)) + return; + + if(PositionExistsByMagic(d.symbol, d.magic)) + return; + + if(!XMB_RegimeBearish(d)) + return; + + double upper = 0.0, middle = 0.0; + if(!XMB_Copy1(d.h_bb, 1, upper) || !XMB_Copy1(d.h_bb, 0, middle)) + return; + + const double high1 = iHigh(d.symbol, d.entryTF, 1); + const double close1 = iClose(d.symbol, d.entryTF, 1); + if(high1 < upper || close1 >= upper) + return; + + if(!United_MayOpenNewEntry(d.symbol, d.magic, false, d.trade, d.closeUnprofitableOnNewSignal)) + return; + + double atr = 0.0; + if(!XMB_Copy1(d.h_atr, 0, atr) || atr <= 0.0) + return; + + const double ask = SymbolInfoDouble(d.symbol, SYMBOL_ASK); + const double sl = high1 + atr * d.slAtrMult; + const double tp = (d.tpAtrMult > 0.0 ? ask - atr * d.tpAtrMult : middle); + const double lots = United_NormalizeVolume(d.symbol, lotSize); + + d.trade.Sell(lots, d.symbol, 0.0, sl, tp, "XMB BB fade"); +} + +#endif diff --git a/frontline/cluster-latest/SuperEA.mq5 b/frontline/cluster-latest/SuperEA.mq5 new file mode 100644 index 0000000..e69de29 diff --git a/frontline/cluster-latest/USDJPYBuster/USDJPYBuster.mq5 b/frontline/cluster-latest/USDJPYBuster/USDJPYBuster.mq5 new file mode 100644 index 0000000..7339046 --- /dev/null +++ b/frontline/cluster-latest/USDJPYBuster/USDJPYBuster.mq5 @@ -0,0 +1,80 @@ +//+------------------------------------------------------------------+ +//| USDJPYBuster.mq5 | +//| Standalone wrapper — logic in Strategies/USDJPYBusterStrategy.mqh | +//+------------------------------------------------------------------+ +#property copyright "Lab" +#property link "" +#property version "1.02" +#property description "USDJPY Asian range breakout (Ian style). See cluster Strategies/USDJPYBusterStrategy.mqh." + +#include +#include "../Strategies/USDJPYBusterStrategy.mqh" + +input group "=== Symbol ===" +input string InpSymbol = "USDJPY"; + +input group "=== Range session (broker server time) ===" +input int InpRangeStartHour = 3; +input int InpRangeEndHour = 6; +input int InpCloseHour = 18; +input ENUM_TIMEFRAMES InpRangeTF = PERIOD_M20; +input int InpMinRangePoints = 15; +input double InpOrderBufferPoints = 4.75; + +input group "=== Breakout orders ===" +input bool InpFirstTradeOnly = false; +input bool InpAllowLong = true; +input bool InpAllowShort = true; +input bool InpUseTakeProfit = false; +input double InpTakeProfitPoints = 0.0; + +input group "=== Risk ===" +input ENUM_UB_RISK_MODE InpRiskMode = UB_RISK_FIXED_LOTS; +input double InpFixedRiskMoney = 250.0; +input double InpRiskPercent = 0.1; +input double InpFixedLots = 0.01; +input int InpMagic = 927002; +input int InpSlippagePoints = 20; +input int InpMaxSpreadPoints = 20; + +input group "=== Debug ===" +input bool InpDrawRange = false; +input bool InpDebugLog = false; + +USDJPYBusterData g_ub; + +string WorkSymbol() +{ + string s = InpSymbol; + StringTrimLeft(s); + StringTrimRight(s); + const int bar = StringFind(s, "|"); + if(bar >= 0) + s = StringSubstr(s, 0, bar); + StringTrimRight(s); + return (StringLen(s) > 0 ? s : _Symbol); +} + +int OnInit() +{ + return InitUSDJPYBuster(g_ub, WorkSymbol(), + InpRangeStartHour, InpRangeEndHour, InpCloseHour, InpRangeTF, + InpMinRangePoints, InpOrderBufferPoints, + InpFirstTradeOnly, InpAllowLong, InpAllowShort, + InpUseTakeProfit, InpTakeProfitPoints, + InpRiskMode, InpFixedRiskMoney, InpRiskPercent, InpFixedLots, + InpMagic, InpSlippagePoints, InpMaxSpreadPoints, + InpDrawRange, InpDebugLog) ? INIT_SUCCEEDED : INIT_FAILED; +} + +void OnDeinit(const int reason) +{ + DeinitUSDJPYBuster(g_ub); +} + +void OnTick() +{ + ProcessUSDJPYBuster(g_ub, InpFixedLots, 1.0); +} + +//+------------------------------------------------------------------+ diff --git a/frontline/cluster-latest/main.mq5 b/frontline/cluster-latest/main.mq5 index d111220..8f7063a 100644 --- a/frontline/cluster-latest/main.mq5 +++ b/frontline/cluster-latest/main.mq5 @@ -5,7 +5,7 @@ //+------------------------------------------------------------------+ #property copyright "Copyright 2025, MetaQuotes Ltd." #property link "https://www.mql5.com" -#property version "1.21" +#property version "1.26" #property strict #property description "LOT_* nominal at ORCH_ReferenceBalance; scale = balance/equity ÷ reference (clamped). No performance-evaluator ranking." @@ -14,6 +14,7 @@ #include #include #include "MagicNumberHelpers.mqh" +#include "GapGuard.mqh" #define UNITED_V2_DYNAMIC_LOTS double g_DB_LotSize; // Include strategy implementations early so structs are available @@ -27,6 +28,9 @@ double g_DB_LotSize; #include "Strategies/RSIConsolidationStrategy.mqh" #include "Strategies/SimpleTrendlineStrategy.mqh" #include "Strategies/RSISecretSauceStrategy.mqh" +#include "Strategies/USDJPYBusterStrategy.mqh" +#include "Strategies/XAUBearTrendStrategy.mqh" +#include "Strategies/XAUMomentumBreakdownStrategy.mqh" //+------------------------------------------------------------------+ //| Global Lot Size Variables (for dynamic lot sizing) | @@ -36,6 +40,7 @@ double g_RC_LotSize; // RSI CrossOver Reversal lot size double g_RM_LotSize; // RSI MidPoint Hijack lot size double g_Pos_RS_APPL; +double g_Pos_RS_ADBE; double g_Pos_RS_BTCUSD; double g_Pos_RS_NVDA; double g_Pos_RS_TSLA; @@ -49,10 +54,78 @@ double g_Pos_ST_BTCUSD; double g_Pos_ST_XAUUSD; double g_Pos_ST_GER40; double g_RSS_LotSize; +double g_Pos_UB_USDJPY; +double g_Pos_XBT_XAUUSD; +double g_Pos_XMB_XAUUSD; +double g_Pos_RRA_GBPUSD; +double g_Pos_GB_GER40; +double g_Pos_RS_NAS100; +double g_Pos_RS_US500; +double g_Pos_RRA_USDCHF; +double g_Pos_RRA_NZDUSD; +double g_Pos_NB_NAS100; +double g_Pos_U5B_US500; +double g_Pos_RS_US30; +double g_Pos_RS_XAGUSD; +double g_Pos_RS_EURJPY; +double g_Pos_RS_GBPJPY; +double g_Pos_U30B_US30; +double g_Pos_UKB_UK100; +double g_Pos_XGB_XAGUSD; +double g_Pos_RS_F; +double g_Pos_RS_SOFI; +double g_Pos_RS_SNAP; +double g_Pos_RS_WBD; -bool United_MayOpenNewEntry(const string symbol, const ulong magic, const bool isBuy) +input group "=== Signal Replacement — close unprofitable on new signal (per strategy) ===" +input bool DB_CloseUnprofitableOnNewSignal = false; +input bool ES_CloseUnprofitableOnNewSignal = true; // audit 2026-07 +174 net / +1.46 sharpe +input bool RC_CloseUnprofitableOnNewSignal = false; +input bool RM_CloseUnprofitableOnNewSignal = false; +input bool RS_APPL_CloseUnprofitableOnNewSignal = false; +input bool RS_ADBE_CloseUnprofitableOnNewSignal = false; +input bool RS_BTCUSD_CloseUnprofitableOnNewSignal = false; +input bool RS_NVDA_CloseUnprofitableOnNewSignal = false; +input bool RS_TSLA_CloseUnprofitableOnNewSignal = false; // audit 2026-07 NEUTRAL (-11 net) +input bool RS_XAUUSD_CloseUnprofitableOnNewSignal = true; // audit 2026-07 +677 net / +1.92 sharpe +input bool RS_MU_CloseUnprofitableOnNewSignal = false; +input bool RRA_EURUSD_CloseUnprofitableOnNewSignal = false; +input bool RRA_AUDUSD_CloseUnprofitableOnNewSignal = false; +input bool SE_CloseUnprofitableOnNewSignal = false; +input bool RCO_CloseUnprofitableOnNewSignal = false; +input bool ST_BTC_CloseUnprofitableOnNewSignal = false; +input bool ST_XAU_CloseUnprofitableOnNewSignal = false; +input bool ST_GER_CloseUnprofitableOnNewSignal = false; +input bool RSS_CloseUnprofitableOnNewSignal = false; +input bool UB_CloseUnprofitableOnNewSignal = false; +input bool XBT_CloseUnprofitableOnNewSignal = false; +input bool XMB_CloseUnprofitableOnNewSignal = false; +input bool RRA_GBPUSD_CloseUnprofitableOnNewSignal = false; +input bool GB_CloseUnprofitableOnNewSignal = false; +input bool RS_NAS100_CloseUnprofitableOnNewSignal = false; +input bool RS_US500_CloseUnprofitableOnNewSignal = false; +input bool RRA_USDCHF_CloseUnprofitableOnNewSignal = false; +input bool RRA_NZDUSD_CloseUnprofitableOnNewSignal = false; +input bool NB_CloseUnprofitableOnNewSignal = false; +input bool U5B_CloseUnprofitableOnNewSignal = false; +input bool RS_US30_CloseUnprofitableOnNewSignal = true; // audit 2026-07 +92 net / +0.68 sharpe +input bool RS_XAGUSD_CloseUnprofitableOnNewSignal = false; +input bool RS_EURJPY_CloseUnprofitableOnNewSignal = false; +input bool RS_GBPJPY_CloseUnprofitableOnNewSignal = false; +input bool U30B_CloseUnprofitableOnNewSignal = false; +input bool UKB_CloseUnprofitableOnNewSignal = false; +input bool XGB_CloseUnprofitableOnNewSignal = false; +input bool RS_F_CloseUnprofitableOnNewSignal = false; +input bool RS_SOFI_CloseUnprofitableOnNewSignal = false; +input bool RS_SNAP_CloseUnprofitableOnNewSignal = false; +input bool RS_WBD_CloseUnprofitableOnNewSignal = false; + +bool United_MayOpenNewEntry(const string symbol, const ulong magic, const bool isBuy, CTrade &trade, + const bool closeUnprofitableOnNewSignal) { - if(PositionExistsByMagic(symbol, magic)) + if(!United_PrepareEntrySlot(trade, symbol, magic, closeUnprofitableOnNewSignal)) + return false; + if(United_IsGapRiskWindow(symbol)) return false; return true; } @@ -65,49 +138,105 @@ input bool EnableDarvasBox = true; input bool EnableEMASlopeDistance = true; input bool EnableRSICrossOverReversal = true; input bool EnableRSIMidPointHijack = true; -input bool EnableRSIScalpingAPPL = true; -input bool EnableRSIScalpingBTCUSD = false; +input bool EnableRSIScalpingAPPL = false; +input bool EnableRSIScalpingADBE = false; +input bool EnableRSIScalpingBTCUSD = true; input bool EnableRSIScalpingNVDA = true; input bool EnableRSIScalpingTSLA = true; -input bool EnableRSIScalpingXAUUSD = false; -input bool EnableRSIScalpingMU = true; -input bool EnableSuperEMA = false; +input bool EnableRSIScalpingXAUUSD = true; +input bool EnableRSIScalpingMU = false; // high share price (~$1000+) — margin risk +input bool EnableSuperEMA = true; input bool EnableRSIConsolidation = false; -input bool EnableRSIReversalAsianEURUSD = true; +input bool EnableRSIReversalAsianEURUSD = false; input bool EnableRSIReversalAsianAUDUSD = true; -input bool EnableSimpleTrendlineBTCUSD = false; -input bool EnableSimpleTrendlineXAUUSD = false; +input bool EnableSimpleTrendlineBTCUSD = true; +input bool EnableSimpleTrendlineXAUUSD = true; input bool EnableSimpleTrendlineGER40 = false; input bool EnableRSISecretSauce = false; +input bool EnableUSDJPYBuster = true; +input bool EnableXAUBearTrend = false; +input bool EnableXAUMomentumBreakdown = false; +input bool EnableRSIReversalAsianGBPUSD = true; +input bool EnableGER40Buster = true; +input bool EnableRSIScalpingNAS100 = true; +input bool EnableRSIScalpingUS500 = false; +input bool EnableRSIReversalAsianUSDCHF = false; +input bool EnableRSIReversalAsianNZDUSD = false; +input bool EnableNAS100Buster = false; +input bool EnableUS500Buster = true; +input bool EnableRSIScalpingUS30 = true; +input bool EnableRSIScalpingXAGUSD = false; +input bool EnableRSIScalpingEURJPY = false; +input bool EnableRSIScalpingGBPJPY = false; +input bool EnableUS30Buster = false; +input bool EnableUK100Buster = true; +input bool EnableXAGUSDBuster = false; +input bool EnableRSIScalpingF = false; +input bool EnableRSIScalpingSOFI = false; +input bool EnableRSIScalpingSNAP = false; +input bool EnableRSIScalpingWBD = false; input bool OPT_GuardOptimizationMode = true; // legacy compatibility with 123.set input group "=== Centralized Lot Size (Granular Per Robot) ===" input double LOT_DB_DarvasBox = 0.01; -input double LOT_ES_EMASlopeDistance = 0.02; -input double LOT_RC_RSICrossOver = 0.01; +input double LOT_ES_EMASlopeDistance = 0.07; +input double LOT_RC_RSICrossOver = 0.1; input double LOT_RM_RSIMidPointHijack = 0.01; -input double LOT_RS_APPL = 25.0; -input double LOT_RS_BTCUSD = 0.1; -input double LOT_RS_NVDA = 25.0; -input double LOT_RS_TSLA = 5.0; -input double LOT_RS_XAUUSD = 0.27; +input double LOT_RS_APPL = 5; +input double LOT_RS_ADBE = 5; +input double LOT_RS_BTCUSD = 0.06; +input double LOT_RS_NVDA = 5; +input double LOT_RS_TSLA = 5; +input double LOT_RS_XAUUSD = 0.04; input double LOT_RS_MU = 5.0; -input double LOT_RRA_EURUSD = 0.1; -input double LOT_RRA_AUDUSD = 0.1; +input double LOT_RRA_EURUSD = 0.03; +input double LOT_RRA_AUDUSD = 0.05; input double LOT_SE_SuperEMA = 0.01; input double LOT_RCO_RSIConsolidation = 0.1; -input double LOT_ST_BTCUSD = 0.1; -input double LOT_ST_XAUUSD = 0.1; +input double LOT_ST_BTCUSD = 0.01; +input double LOT_ST_XAUUSD = 0.01; input double LOT_ST_GER40 = 0.10; input double LOT_RSS_SecretSauce = 0.1; +input double LOT_UB_USDJPY = 0.03; +input double LOT_XBT_XAUUSD = 0.02; +input double LOT_XMB_XAUUSD = 0.02; +input double LOT_RRA_GBPUSD = 0.03; +input double LOT_GB_GER40 = 0.01; +input double LOT_RS_NAS100 = 0.03; +input double LOT_RS_US500 = 0.1; +input double LOT_RRA_USDCHF = 0.1; +input double LOT_RRA_NZDUSD = 0.1; +input double LOT_NB_NAS100 = 0.05; +input double LOT_U5B_US500 = 0.05; +input double LOT_RS_US30 = 0.02; +input double LOT_RS_XAGUSD = 0.05; +input double LOT_RS_EURJPY = 0.08; +input double LOT_RS_GBPJPY = 0.08; +input double LOT_U30B_US30 = 0.05; +input double LOT_UKB_UK100 = 0.01; +input double LOT_XGB_XAGUSD = 0.05; +input double LOT_RS_F = 10.0; // ~$14 stock, ~$7 margin @ 10 sh +input double LOT_RS_SOFI = 10.0; +input double LOT_RS_SNAP = 10.0; +input double LOT_RS_WBD = 10.0; input group "=== Balance-based position sizing ===" input bool ORCH_ScaleLotsByBalance = true; input bool ORCH_UseEquityInsteadOfBalance = false; -input double ORCH_ReferenceBalance = 1000.0; +input double ORCH_ReferenceBalance = 3000.0; input double ORCH_MinBalanceScale = 0.1; input double ORCH_MaxBalanceScale = 100000.0; +input group "=== Gap Loss Prevention (跳空) ===" +input bool GAP_Enable = false; // match 123.set / audit backtests (true = more session flats) +input bool GAP_CloseBeforeSessionEnd = true; +input int GAP_MinutesBeforeClose = 15; +input bool GAP_CloseBeforeWeekend = true; +input int GAP_FridayCloseHour = 20; +input bool GAP_CloseOnBarGapThroughSL = true; +input double GAP_MinGapPoints = 0.0; +input int GAP_EquityDailyFlatHour = 21; + //+------------------------------------------------------------------+ //| Strategy 1: DarvasBoxXAUUSD | //+------------------------------------------------------------------+ @@ -258,7 +387,7 @@ input int RM_InpEMADistancePeriod = 26; //| 4. Use the exact symbol name shown | //+------------------------------------------------------------------+ input group "=== RSI Scalping APPL (AAPL) - Pepperstone US ===" -input string RS_APPL_Symbol = "AAPL"; +input string RS_APPL_Symbol = "AAPL.NAS"; input ENUM_TIMEFRAMES RS_APPL_TimeFrame = PERIOD_M10; input int RS_APPL_RSI_Period = 14; input ENUM_APPLIED_PRICE RS_APPL_RSI_Applied_Price = PRICE_CLOSE; @@ -271,6 +400,20 @@ input double RS_APPL_LotSize = 25; input int RS_APPL_MagicNumber = 20001; input int RS_APPL_Slippage = 3; +input group "=== RSI Scalping ADBE - Pepperstone US ===" +input string RS_ADBE_Symbol = "ADBE.NAS"; +input ENUM_TIMEFRAMES RS_ADBE_TimeFrame = (ENUM_TIMEFRAMES)6; +input int RS_ADBE_RSI_Period = 15; +input ENUM_APPLIED_PRICE RS_ADBE_RSI_Applied_Price = PRICE_OPEN; +input double RS_ADBE_RSI_Overbought = 16; +input double RS_ADBE_RSI_Oversold = 42; +input double RS_ADBE_RSI_Target_Buy = 67; +input double RS_ADBE_RSI_Target_Sell = 62; +input int RS_ADBE_BarsToWait = 8; +input double RS_ADBE_LotSize = 5.0; +input int RS_ADBE_MagicNumber = 12345; +input int RS_ADBE_Slippage = 3; + input group "=== RSI Scalping BTCUSD ===" input string RS_BTCUSD_Symbol = "BTCUSD"; // Pepperstone may use: "BTCUSD", "BTC/USD", or "BTCUSD.c" input ENUM_TIMEFRAMES RS_BTCUSD_TimeFrame = PERIOD_H1; @@ -286,7 +429,7 @@ input int RS_BTCUSD_MagicNumber = 123459123; input int RS_BTCUSD_Slippage = 3; input group "=== RSI Scalping NVDA - Pepperstone US ===" -input string RS_NVDA_Symbol = "NVDA"; +input string RS_NVDA_Symbol = "NVDA.NAS"; input ENUM_TIMEFRAMES RS_NVDA_TimeFrame = PERIOD_M15; input int RS_NVDA_RSI_Period = 8; input ENUM_APPLIED_PRICE RS_NVDA_RSI_Applied_Price = PRICE_CLOSE; @@ -300,7 +443,7 @@ input int RS_NVDA_MagicNumber = 20003; input int RS_NVDA_Slippage = 3; input group "=== RSI Scalping TSLA - Pepperstone US ===" -input string RS_TSLA_Symbol = "TSLA"; +input string RS_TSLA_Symbol = "TSLA.NAS"; input ENUM_TIMEFRAMES RS_TSLA_TimeFrame = PERIOD_H1; input int RS_TSLA_RSI_Period = 14; input ENUM_APPLIED_PRICE RS_TSLA_RSI_Applied_Price = PRICE_CLOSE; @@ -328,7 +471,7 @@ input int RS_XAUUSD_MagicNumber = 129102315; input int RS_XAUUSD_Slippage = 3; input group "=== RSI Scalping MU ===" -input string RS_MU_Symbol = "MU"; +input string RS_MU_Symbol = "MU.NAS"; input ENUM_TIMEFRAMES RS_MU_TimeFrame = PERIOD_M20; input int RS_MU_RSI_Period = 14; input ENUM_APPLIED_PRICE RS_MU_RSI_Applied_Price = PRICE_CLOSE; @@ -341,6 +484,84 @@ input double RS_MU_LotSize = 5.0; input int RS_MU_MagicNumber = 129102316; input int RS_MU_Slippage = 3; +input group "=== RSI Scalping NAS100 ===" +input string RS_NAS100_Symbol = "NAS100"; +input ENUM_TIMEFRAMES RS_NAS100_TimeFrame = PERIOD_H1; +input int RS_NAS100_RSI_Period = 14; +input ENUM_APPLIED_PRICE RS_NAS100_RSI_Applied_Price = PRICE_CLOSE; +input double RS_NAS100_RSI_Overbought = 58; +input double RS_NAS100_RSI_Oversold = 42; +input double RS_NAS100_RSI_Target_Buy = 78; +input double RS_NAS100_RSI_Target_Sell = 46; +input int RS_NAS100_BarsToWait = 4; +input int RS_NAS100_MagicNumber = 20005; +input int RS_NAS100_Slippage = 5; + +input group "=== RSI Scalping US500 ===" +input string RS_US500_Symbol = "US500"; +input ENUM_TIMEFRAMES RS_US500_TimeFrame = PERIOD_H1; +input int RS_US500_RSI_Period = 14; +input ENUM_APPLIED_PRICE RS_US500_RSI_Applied_Price = PRICE_CLOSE; +input double RS_US500_RSI_Overbought = 62; +input double RS_US500_RSI_Oversold = 38; +input double RS_US500_RSI_Target_Buy = 80; +input double RS_US500_RSI_Target_Sell = 44; +input int RS_US500_BarsToWait = 5; +input int RS_US500_MagicNumber = 20006; +input int RS_US500_Slippage = 5; + +input group "=== RSI Scalping US30 ===" +input string RS_US30_Symbol = "US30"; +input ENUM_TIMEFRAMES RS_US30_TimeFrame = PERIOD_H1; +input int RS_US30_RSI_Period = 14; +input ENUM_APPLIED_PRICE RS_US30_RSI_Applied_Price = PRICE_CLOSE; +input double RS_US30_RSI_Overbought = 56; +input double RS_US30_RSI_Oversold = 44; +input double RS_US30_RSI_Target_Buy = 76; +input double RS_US30_RSI_Target_Sell = 48; +input int RS_US30_BarsToWait = 4; +input int RS_US30_MagicNumber = 20007; +input int RS_US30_Slippage = 5; + +input group "=== RSI Scalping XAGUSD ===" +input string RS_XAGUSD_Symbol = "XAGUSD"; +input ENUM_TIMEFRAMES RS_XAGUSD_TimeFrame = PERIOD_H1; +input int RS_XAGUSD_RSI_Period = 14; +input ENUM_APPLIED_PRICE RS_XAGUSD_RSI_Applied_Price = PRICE_CLOSE; +input double RS_XAGUSD_RSI_Overbought = 65; +input double RS_XAGUSD_RSI_Oversold = 35; +input double RS_XAGUSD_RSI_Target_Buy = 82; +input double RS_XAGUSD_RSI_Target_Sell = 42; +input int RS_XAGUSD_BarsToWait = 5; +input int RS_XAGUSD_MagicNumber = 20008; +input int RS_XAGUSD_Slippage = 5; + +input group "=== RSI Scalping EURJPY ===" +input string RS_EURJPY_Symbol = "EURJPY"; +input ENUM_TIMEFRAMES RS_EURJPY_TimeFrame = PERIOD_M30; +input int RS_EURJPY_RSI_Period = 14; +input ENUM_APPLIED_PRICE RS_EURJPY_RSI_Applied_Price = PRICE_CLOSE; +input double RS_EURJPY_RSI_Overbought = 60; +input double RS_EURJPY_RSI_Oversold = 40; +input double RS_EURJPY_RSI_Target_Buy = 75; +input double RS_EURJPY_RSI_Target_Sell = 45; +input int RS_EURJPY_BarsToWait = 4; +input int RS_EURJPY_MagicNumber = 20009; +input int RS_EURJPY_Slippage = 3; + +input group "=== RSI Scalping GBPJPY ===" +input string RS_GBPJPY_Symbol = "GBPJPY"; +input ENUM_TIMEFRAMES RS_GBPJPY_TimeFrame = PERIOD_M30; +input int RS_GBPJPY_RSI_Period = 14; +input ENUM_APPLIED_PRICE RS_GBPJPY_RSI_Applied_Price = PRICE_CLOSE; +input double RS_GBPJPY_RSI_Overbought = 62; +input double RS_GBPJPY_RSI_Oversold = 38; +input double RS_GBPJPY_RSI_Target_Buy = 78; +input double RS_GBPJPY_RSI_Target_Sell = 44; +input int RS_GBPJPY_BarsToWait = 4; +input int RS_GBPJPY_MagicNumber = 20010; +input int RS_GBPJPY_Slippage = 3; + input group "=== RSI Scalping Reversal Escape (XAUUSD only) ===" input bool RS_UseReversalEscape = true; input int RS_ReversalATRPeriod = 14; @@ -354,6 +575,11 @@ input bool RS_APPL_UseTrailingStop = true; input double RS_APPL_TrailDistancePoints = 120.0; input double RS_APPL_TrailActivationPoints = 0.0; +input group "=== RSI Scalping ADBE — Trailing ===" +input bool RS_ADBE_UseTrailingStop = true; +input double RS_ADBE_TrailDistancePoints = 425.0; +input double RS_ADBE_TrailActivationPoints = 18.5; + input group "=== RSI Scalping BTCUSD — Trailing ===" input bool RS_BTCUSD_UseTrailingStop = true; input double RS_BTCUSD_TrailDistancePoints = 120.0; @@ -367,13 +593,115 @@ input double RS_NVDA_TrailActivationPoints = 75.0; input group "=== RSI Scalping TSLA — Trailing ===" input bool RS_TSLA_UseTrailingStop = true; input double RS_TSLA_TrailDistancePoints = 900.0; -input double RS_TSLA_TrailActivationPoints = 950.0; +input double RS_TSLA_TrailActivationPoints = 500.0; input group "=== RSI Scalping XAUUSD — Trailing ===" input bool RS_XAUUSD_UseTrailingStop = true; input double RS_XAUUSD_TrailDistancePoints = 71.0; input double RS_XAUUSD_TrailActivationPoints = 41.0; +input group "=== RSI Scalping NAS100 — Trailing ===" +input bool RS_NAS100_UseTrailingStop = true; +input double RS_NAS100_TrailDistancePoints = 180.0; +input double RS_NAS100_TrailActivationPoints = 60.0; + +input group "=== RSI Scalping US500 — Trailing ===" +input bool RS_US500_UseTrailingStop = true; +input double RS_US500_TrailDistancePoints = 150.0; +input double RS_US500_TrailActivationPoints = 50.0; + +input group "=== RSI Scalping US30 — Trailing ===" +input bool RS_US30_UseTrailingStop = true; +input double RS_US30_TrailDistancePoints = 200.0; +input double RS_US30_TrailActivationPoints = 70.0; + +input group "=== RSI Scalping XAGUSD — Trailing ===" +input bool RS_XAGUSD_UseTrailingStop = true; +input double RS_XAGUSD_TrailDistancePoints = 90.0; +input double RS_XAGUSD_TrailActivationPoints = 35.0; + +input group "=== RSI Scalping EURJPY — Trailing ===" +input bool RS_EURJPY_UseTrailingStop = true; +input double RS_EURJPY_TrailDistancePoints = 45.0; +input double RS_EURJPY_TrailActivationPoints = 20.0; + +input group "=== RSI Scalping GBPJPY — Trailing ===" +input bool RS_GBPJPY_UseTrailingStop = true; +input double RS_GBPJPY_TrailDistancePoints = 55.0; +input double RS_GBPJPY_TrailActivationPoints = 25.0; + +input group "=== RSI Scalping F (Ford, low margin) ===" +input string RS_F_Symbol = "F.NYS"; +input ENUM_TIMEFRAMES RS_F_TimeFrame = PERIOD_M15; +input int RS_F_RSI_Period = 8; +input ENUM_APPLIED_PRICE RS_F_RSI_Applied_Price = PRICE_CLOSE; +input double RS_F_RSI_Overbought = 36; +input double RS_F_RSI_Oversold = 38; +input double RS_F_RSI_Target_Buy = 90; +input double RS_F_RSI_Target_Sell = 70; +input int RS_F_BarsToWait = 5; +input int RS_F_MagicNumber = 20011; +input int RS_F_Slippage = 5; + +input group "=== RSI Scalping SOFI (low margin) ===" +input string RS_SOFI_Symbol = "SOFI.NAS"; +input ENUM_TIMEFRAMES RS_SOFI_TimeFrame = PERIOD_M15; +input int RS_SOFI_RSI_Period = 8; +input ENUM_APPLIED_PRICE RS_SOFI_RSI_Applied_Price = PRICE_CLOSE; +input double RS_SOFI_RSI_Overbought = 36; +input double RS_SOFI_RSI_Oversold = 38; +input double RS_SOFI_RSI_Target_Buy = 90; +input double RS_SOFI_RSI_Target_Sell = 70; +input int RS_SOFI_BarsToWait = 5; +input int RS_SOFI_MagicNumber = 20012; +input int RS_SOFI_Slippage = 5; + +input group "=== RSI Scalping SNAP (Snap, ultra-low margin) ===" +input string RS_SNAP_Symbol = "SNAP.NYS"; +input ENUM_TIMEFRAMES RS_SNAP_TimeFrame = PERIOD_M15; +input int RS_SNAP_RSI_Period = 8; +input ENUM_APPLIED_PRICE RS_SNAP_RSI_Applied_Price = PRICE_CLOSE; +input double RS_SNAP_RSI_Overbought = 36; +input double RS_SNAP_RSI_Oversold = 38; +input double RS_SNAP_RSI_Target_Buy = 90; +input double RS_SNAP_RSI_Target_Sell = 70; +input int RS_SNAP_BarsToWait = 5; +input int RS_SNAP_MagicNumber = 20013; +input int RS_SNAP_Slippage = 5; + +input group "=== RSI Scalping WBD (Warner Bros, low margin) ===" +input string RS_WBD_Symbol = "WBD.NAS"; +input ENUM_TIMEFRAMES RS_WBD_TimeFrame = PERIOD_M15; +input int RS_WBD_RSI_Period = 8; +input ENUM_APPLIED_PRICE RS_WBD_RSI_Applied_Price = PRICE_CLOSE; +input double RS_WBD_RSI_Overbought = 36; +input double RS_WBD_RSI_Oversold = 38; +input double RS_WBD_RSI_Target_Buy = 90; +input double RS_WBD_RSI_Target_Sell = 70; +input int RS_WBD_BarsToWait = 5; +input int RS_WBD_MagicNumber = 20014; +input int RS_WBD_Slippage = 5; + +input group "=== RSI Scalping F — Trailing ===" +input bool RS_F_UseTrailingStop = true; +input double RS_F_TrailDistancePoints = 375.0; +input double RS_F_TrailActivationPoints = 75.0; + +input group "=== RSI Scalping SOFI — Trailing ===" +input bool RS_SOFI_UseTrailingStop = true; +input double RS_SOFI_TrailDistancePoints = 375.0; +input double RS_SOFI_TrailActivationPoints = 75.0; + +input group "=== RSI Scalping SNAP — Trailing ===" +input bool RS_SNAP_UseTrailingStop = true; +input double RS_SNAP_TrailDistancePoints = 375.0; +input double RS_SNAP_TrailActivationPoints = 75.0; + +input group "=== RSI Scalping WBD — Trailing ===" +input bool RS_WBD_UseTrailingStop = true; +input double RS_WBD_TrailDistancePoints = 375.0; +input double RS_WBD_TrailActivationPoints = 75.0; + //+------------------------------------------------------------------+ //| Strategy 11-12: RSI Reversal Asian Strategies | //| Each RSI Reversal Asian strategy trades on its own symbol: | @@ -532,6 +860,257 @@ input int RSS_SwingLookback = 30; input int RSS_MaxPositions = 1; input int RSS_MinBarsBetweenTrades = 7; +input group "=== USDJPY Buster (Asian range breakout) ===" +input string UB_Symbol = "USDJPY"; +input int UB_RangeStartHour = 3; +input int UB_RangeEndHour = 6; +input int UB_CloseHour = 18; +input ENUM_TIMEFRAMES UB_RangeTF = PERIOD_M20; +input int UB_MinRangePoints = 15; +input double UB_OrderBufferPoints = 4.75; +input bool UB_FirstTradeOnly = false; +input bool UB_AllowLong = true; +input bool UB_AllowShort = true; +input bool UB_UseTakeProfit = false; +input double UB_TakeProfitPoints = 0.0; +input ENUM_UB_RISK_MODE UB_RiskMode = UB_RISK_FIXED_LOTS; +input double UB_FixedRiskMoney = 250.0; +input double UB_RiskPercent = 0.1; +input double UB_FixedLots = 0.01; +input int UB_MagicNumber = 927002; +input int UB_Slippage = 20; +input int UB_MaxSpreadPoints = 20; +input bool UB_DrawRange = false; +input bool UB_DebugLog = false; + +input group "=== XAU Bear Trend (short-only hedge) ===" +input string XBT_Symbol = "XAUUSD"; +input ENUM_TIMEFRAMES XBT_RegimeTF = PERIOD_D1; +input ENUM_TIMEFRAMES XBT_EntryTF = PERIOD_H1; +input int XBT_RegimeEmaPeriod = 100; +input int XBT_RsiPeriod = 14; +input double XBT_RsiArmLevel = 54.0; +input double XBT_RsiTriggerLevel = 50.0; +input int XBT_AtrPeriod = 14; +input double XBT_SlAtrMult = 0.45; +input double XBT_TpAtrMult = 2.5; +input bool XBT_UseTrailing = true; +input double XBT_TrailAtrMult = 1.5; +input ulong XBT_MagicNumber = 928101; +input int XBT_Slippage = 20; +input int XBT_MaxSpreadPoints = 50; + +input group "=== XAU Momentum Breakdown (short-only hedge) ===" +input string XMB_Symbol = "XAUUSD"; +input ENUM_TIMEFRAMES XMB_RegimeTF = PERIOD_D1; +input ENUM_TIMEFRAMES XMB_EntryTF = PERIOD_H4; +input int XMB_RegimeEmaPeriod = 100; +input int XMB_BbPeriod = 20; +input double XMB_BbDeviation = 2.0; +input int XMB_AtrPeriod = 14; +input double XMB_SlAtrMult = 0.4; +input double XMB_TpAtrMult = 2.8; +input bool XMB_UseTrailing = true; +input double XMB_TrailAtrMult = 1.4; +input ulong XMB_MagicNumber = 928102; +input int XMB_Slippage = 20; +input int XMB_MaxSpreadPoints = 50; + +input group "=== RSI Reversal Asian GBPUSD ===" +input string RRA_GBPUSD_Symbol = "GBPUSD"; +input int RRA_GBPUSD_RSIPeriod = 32; +input double RRA_GBPUSD_OverboughtLevel = 80; +input double RRA_GBPUSD_OversoldLevel = 37; +input int RRA_GBPUSD_TakeProfitPips = 225; +input int RRA_GBPUSD_StopLossPips = 45; +input double RRA_GBPUSD_MaxLotSize = 0.2; +input int RRA_GBPUSD_MaxSpread = 1800; +input int RRA_GBPUSD_MaxDuration = 480; +input bool RRA_GBPUSD_UseStopLoss = false; +input bool RRA_GBPUSD_UseTakeProfit = false; +input bool RRA_GBPUSD_UseRSIExit = true; +input double RRA_GBPUSD_RSIExitLevel = 43; +input bool RRA_GBPUSD_CloseOutsideSession = true; +input ENUM_TIMEFRAMES RRA_GBPUSD_TimeFrame = PERIOD_M15; +input int RRA_GBPUSD_MagicNumber = 30003; +input int RRA_GBPUSD_Slippage = 3; + +input group "=== GER40 Buster (European session range breakout) ===" +input string GB_Symbol = "GER40"; +input int GB_RangeStartHour = 8; +input int GB_RangeEndHour = 10; +input int GB_CloseHour = 20; +input ENUM_TIMEFRAMES GB_RangeTF = PERIOD_M15; +input int GB_MinRangePoints = 80; +input double GB_OrderBufferPoints = 12.0; +input bool GB_FirstTradeOnly = false; +input bool GB_AllowLong = true; +input bool GB_AllowShort = true; +input bool GB_UseTakeProfit = false; +input double GB_TakeProfitPoints = 0.0; +input ENUM_UB_RISK_MODE GB_RiskMode = UB_RISK_FIXED_LOTS; +input double GB_FixedRiskMoney = 250.0; +input double GB_RiskPercent = 0.1; +input double GB_FixedLots = 0.01; +input int GB_MagicNumber = 927102; +input int GB_Slippage = 30; +input int GB_MaxSpreadPoints = 120; +input bool GB_DrawRange = false; +input bool GB_DebugLog = false; + +input group "=== RSI Reversal Asian USDCHF ===" +input string RRA_USDCHF_Symbol = "USDCHF"; +input int RRA_USDCHF_RSIPeriod = 30; +input double RRA_USDCHF_OverboughtLevel = 72; +input double RRA_USDCHF_OversoldLevel = 22; +input int RRA_USDCHF_TakeProfitPips = 200; +input int RRA_USDCHF_StopLossPips = 40; +input double RRA_USDCHF_MaxLotSize = 0.2; +input int RRA_USDCHF_MaxSpread = 1200; +input int RRA_USDCHF_MaxDuration = 420; +input bool RRA_USDCHF_UseStopLoss = false; +input bool RRA_USDCHF_UseTakeProfit = false; +input bool RRA_USDCHF_UseRSIExit = true; +input double RRA_USDCHF_RSIExitLevel = 50; +input bool RRA_USDCHF_CloseOutsideSession = true; +input ENUM_TIMEFRAMES RRA_USDCHF_TimeFrame = PERIOD_M15; +input int RRA_USDCHF_MagicNumber = 30004; +input int RRA_USDCHF_Slippage = 3; + +input group "=== RSI Reversal Asian NZDUSD ===" +input string RRA_NZDUSD_Symbol = "NZDUSD"; +input int RRA_NZDUSD_RSIPeriod = 28; +input double RRA_NZDUSD_OverboughtLevel = 66; +input double RRA_NZDUSD_OversoldLevel = 28; +input int RRA_NZDUSD_TakeProfitPips = 200; +input int RRA_NZDUSD_StopLossPips = 40; +input double RRA_NZDUSD_MaxLotSize = 0.2; +input int RRA_NZDUSD_MaxSpread = 1200; +input int RRA_NZDUSD_MaxDuration = 400; +input bool RRA_NZDUSD_UseStopLoss = false; +input bool RRA_NZDUSD_UseTakeProfit = false; +input bool RRA_NZDUSD_UseRSIExit = true; +input double RRA_NZDUSD_RSIExitLevel = 50; +input bool RRA_NZDUSD_CloseOutsideSession = true; +input ENUM_TIMEFRAMES RRA_NZDUSD_TimeFrame = PERIOD_M15; +input int RRA_NZDUSD_MagicNumber = 30005; +input int RRA_NZDUSD_Slippage = 3; + +input group "=== NAS100 Buster (US cash open range) ===" +input string NB_Symbol = "NAS100"; +input int NB_RangeStartHour = 14; +input int NB_RangeEndHour = 16; +input int NB_CloseHour = 21; +input ENUM_TIMEFRAMES NB_RangeTF = PERIOD_M15; +input int NB_MinRangePoints = 120; +input double NB_OrderBufferPoints = 18.0; +input bool NB_FirstTradeOnly = false; +input bool NB_AllowLong = true; +input bool NB_AllowShort = true; +input bool NB_UseTakeProfit = false; +input double NB_TakeProfitPoints = 0.0; +input ENUM_UB_RISK_MODE NB_RiskMode = UB_RISK_FIXED_LOTS; +input double NB_FixedRiskMoney = 250.0; +input double NB_RiskPercent = 0.1; +input double NB_FixedLots = 0.01; +input int NB_MagicNumber = 927103; +input int NB_Slippage = 40; +input int NB_MaxSpreadPoints = 200; +input bool NB_DrawRange = false; +input bool NB_DebugLog = false; + +input group "=== US500 Buster (US cash open range) ===" +input string U5B_Symbol = "US500"; +input int U5B_RangeStartHour = 14; +input int U5B_RangeEndHour = 16; +input int U5B_CloseHour = 21; +input ENUM_TIMEFRAMES U5B_RangeTF = PERIOD_M15; +input int U5B_MinRangePoints = 80; +input double U5B_OrderBufferPoints = 12.0; +input bool U5B_FirstTradeOnly = false; +input bool U5B_AllowLong = true; +input bool U5B_AllowShort = true; +input bool U5B_UseTakeProfit = false; +input double U5B_TakeProfitPoints = 0.0; +input ENUM_UB_RISK_MODE U5B_RiskMode = UB_RISK_FIXED_LOTS; +input double U5B_FixedRiskMoney = 250.0; +input double U5B_RiskPercent = 0.1; +input double U5B_FixedLots = 0.01; +input int U5B_MagicNumber = 927104; +input int U5B_Slippage = 35; +input int U5B_MaxSpreadPoints = 150; +input bool U5B_DrawRange = false; +input bool U5B_DebugLog = false; + +input group "=== US30 Buster (US cash open range) ===" +input string U30B_Symbol = "US30"; +input int U30B_RangeStartHour = 14; +input int U30B_RangeEndHour = 16; +input int U30B_CloseHour = 21; +input ENUM_TIMEFRAMES U30B_RangeTF = PERIOD_M15; +input int U30B_MinRangePoints = 150; +input double U30B_OrderBufferPoints = 22.0; +input bool U30B_FirstTradeOnly = false; +input bool U30B_AllowLong = true; +input bool U30B_AllowShort = true; +input bool U30B_UseTakeProfit = false; +input double U30B_TakeProfitPoints = 0.0; +input ENUM_UB_RISK_MODE U30B_RiskMode = UB_RISK_FIXED_LOTS; +input double U30B_FixedRiskMoney = 250.0; +input double U30B_RiskPercent = 0.1; +input double U30B_FixedLots = 0.01; +input int U30B_MagicNumber = 927105; +input int U30B_Slippage = 45; +input int U30B_MaxSpreadPoints = 250; +input bool U30B_DrawRange = false; +input bool U30B_DebugLog = false; + +input group "=== UK100 Buster (London open range) ===" +input string UKB_Symbol = "UK100"; +input int UKB_RangeStartHour = 8; +input int UKB_RangeEndHour = 10; +input int UKB_CloseHour = 20; +input ENUM_TIMEFRAMES UKB_RangeTF = PERIOD_M15; +input int UKB_MinRangePoints = 60; +input double UKB_OrderBufferPoints = 10.0; +input bool UKB_FirstTradeOnly = false; +input bool UKB_AllowLong = true; +input bool UKB_AllowShort = true; +input bool UKB_UseTakeProfit = false; +input double UKB_TakeProfitPoints = 0.0; +input ENUM_UB_RISK_MODE UKB_RiskMode = UB_RISK_FIXED_LOTS; +input double UKB_FixedRiskMoney = 250.0; +input double UKB_RiskPercent = 0.1; +input double UKB_FixedLots = 0.01; +input int UKB_MagicNumber = 927106; +input int UKB_Slippage = 35; +input int UKB_MaxSpreadPoints = 180; +input bool UKB_DrawRange = false; +input bool UKB_DebugLog = false; + +input group "=== XAGUSD Buster (London silver range) ===" +input string XGB_Symbol = "XAGUSD"; +input int XGB_RangeStartHour = 8; +input int XGB_RangeEndHour = 10; +input int XGB_CloseHour = 20; +input ENUM_TIMEFRAMES XGB_RangeTF = PERIOD_M15; +input int XGB_MinRangePoints = 25; +input double XGB_OrderBufferPoints = 4.0; +input bool XGB_FirstTradeOnly = false; +input bool XGB_AllowLong = true; +input bool XGB_AllowShort = true; +input bool XGB_UseTakeProfit = false; +input double XGB_TakeProfitPoints = 0.0; +input ENUM_UB_RISK_MODE XGB_RiskMode = UB_RISK_FIXED_LOTS; +input double XGB_FixedRiskMoney = 250.0; +input double XGB_RiskPercent = 0.1; +input double XGB_FixedLots = 0.01; +input int XGB_MagicNumber = 927107; +input int XGB_Slippage = 25; +input int XGB_MaxSpreadPoints = 80; +input bool XGB_DrawRange = false; +input bool XGB_DebugLog = false; + //+------------------------------------------------------------------+ //| Balance scaling: LOT_* = nominal size at ORCH_ReferenceBalance | //+------------------------------------------------------------------+ @@ -563,6 +1142,7 @@ void United_RefreshScaledLots() g_RC_LotSize = United_ScaledLot(LOT_RC_RSICrossOver); g_RM_LotSize = United_ScaledLot(LOT_RM_RSIMidPointHijack); g_Pos_RS_APPL = United_ScaledLot(LOT_RS_APPL); + g_Pos_RS_ADBE = United_ScaledLot(LOT_RS_ADBE); g_Pos_RS_BTCUSD = United_ScaledLot(LOT_RS_BTCUSD); g_Pos_RS_NVDA = United_ScaledLot(LOT_RS_NVDA); g_Pos_RS_TSLA = United_ScaledLot(LOT_RS_TSLA); @@ -576,6 +1156,28 @@ void United_RefreshScaledLots() g_Pos_ST_XAUUSD = United_ScaledLot(LOT_ST_XAUUSD); g_Pos_ST_GER40 = United_ScaledLot(LOT_ST_GER40); g_RSS_LotSize = United_ScaledLot(LOT_RSS_SecretSauce); + g_Pos_UB_USDJPY = United_ScaledLot(LOT_UB_USDJPY); + g_Pos_XBT_XAUUSD = United_ScaledLot(LOT_XBT_XAUUSD); + g_Pos_XMB_XAUUSD = United_ScaledLot(LOT_XMB_XAUUSD); + g_Pos_RRA_GBPUSD = United_ScaledLot(LOT_RRA_GBPUSD); + g_Pos_GB_GER40 = United_ScaledLot(LOT_GB_GER40); + g_Pos_RS_NAS100 = United_ScaledLot(LOT_RS_NAS100); + g_Pos_RS_US500 = United_ScaledLot(LOT_RS_US500); + g_Pos_RRA_USDCHF = United_ScaledLot(LOT_RRA_USDCHF); + g_Pos_RRA_NZDUSD = United_ScaledLot(LOT_RRA_NZDUSD); + g_Pos_NB_NAS100 = United_ScaledLot(LOT_NB_NAS100); + g_Pos_U5B_US500 = United_ScaledLot(LOT_U5B_US500); + g_Pos_RS_US30 = United_ScaledLot(LOT_RS_US30); + g_Pos_RS_XAGUSD = United_ScaledLot(LOT_RS_XAGUSD); + g_Pos_RS_EURJPY = United_ScaledLot(LOT_RS_EURJPY); + g_Pos_RS_GBPJPY = United_ScaledLot(LOT_RS_GBPJPY); + g_Pos_U30B_US30 = United_ScaledLot(LOT_U30B_US30); + g_Pos_UKB_UK100 = United_ScaledLot(LOT_UKB_UK100); + g_Pos_XGB_XAGUSD = United_ScaledLot(LOT_XGB_XAGUSD); + g_Pos_RS_F = United_ScaledLot(LOT_RS_F); + g_Pos_RS_SOFI = United_ScaledLot(LOT_RS_SOFI); + g_Pos_RS_SNAP = United_ScaledLot(LOT_RS_SNAP); + g_Pos_RS_WBD = United_ScaledLot(LOT_RS_WBD); } //+------------------------------------------------------------------+ @@ -671,11 +1273,22 @@ EMASlopeData esData; RSICrossOverData rcData; RSIMidPointData rmData; RSIScalpingData rsAPPLData; +RSIScalpingData rsADBEData; RSIScalpingData rsBTCUSDData; RSIScalpingData rsNVDAData; RSIScalpingData rsTSLAData; RSIScalpingData rsXAUUSDData; RSIScalpingData rsMUData; +RSIScalpingData rsNAS100Data; +RSIScalpingData rsUS500Data; +RSIScalpingData rsUS30Data; +RSIScalpingData rsXAGUSDData; +RSIScalpingData rsEURJPYData; +RSIScalpingData rsGBPJPYData; +RSIScalpingData rsFData; +RSIScalpingData rsSOFIData; +RSIScalpingData rsSNAPData; +RSIScalpingData rsWBDData; SuperEMAData seData; RSIConsolidationData rcoData; SimpleTrendlineData stBTCData; @@ -688,6 +1301,81 @@ RSISecretSauceOrcData rssData; //+------------------------------------------------------------------+ RSIReversalAsianData rraEURUSDData; RSIReversalAsianData rraAUDUSDData; +RSIReversalAsianData rraGBPUSDData; +RSIReversalAsianData rraUSDCHFData; +RSIReversalAsianData rraNZDUSDData; +USDJPYBusterData ubData; +USDJPYBusterData gbData; +USDJPYBusterData nbData; +USDJPYBusterData u5bData; +USDJPYBusterData u30bData; +USDJPYBusterData ukbData; +USDJPYBusterData xgbData; +XAUBearTrendData xbtData; +XAUMomentumBreakdownData xmbData; +CTrade g_gapTrade; + +void United_GapGuardSetup() +{ + GapGuardConfig cfg; + cfg.enable = GAP_Enable; + cfg.closeBeforeSessionEnd = GAP_CloseBeforeSessionEnd; + cfg.minutesBeforeClose = GAP_MinutesBeforeClose; + cfg.closeBeforeWeekend = GAP_CloseBeforeWeekend; + cfg.fridayCloseHour = GAP_FridayCloseHour; + cfg.closeOnBarGapThroughSL = GAP_CloseOnBarGapThroughSL; + cfg.minGapPoints = GAP_MinGapPoints; + cfg.equityDailyFlatHour = GAP_EquityDailyFlatHour; + GapGuard_Init(cfg); + + if(EnableDarvasBox) { GapGuard_RegisterMagic((ulong)DB_MagicNumber); GapGuard_RegisterSymbol(DB_Symbol); } + if(EnableEMASlopeDistance) { GapGuard_RegisterMagic((ulong)ES_MagicNumber); GapGuard_RegisterSymbol(ES_Symbol); } + if(EnableRSICrossOverReversal) { GapGuard_RegisterMagic((ulong)RC_MagicNumber); GapGuard_RegisterSymbol(RC_Symbol); } + if(EnableRSIMidPointHijack) + { + GapGuard_RegisterMagic((ulong)RM_InpMagicNumberRSIFollow); + GapGuard_RegisterMagic((ulong)RM_InpMagicNumberRSIReverse); + GapGuard_RegisterMagic((ulong)RM_InpMagicNumberEMACross); + GapGuard_RegisterSymbol(RM_Symbol); + } + if(EnableRSIScalpingAPPL) { GapGuard_RegisterMagic((ulong)RS_APPL_MagicNumber); GapGuard_RegisterSymbol(RS_APPL_Symbol); } + if(EnableRSIScalpingADBE) { GapGuard_RegisterMagic((ulong)RS_ADBE_MagicNumber); GapGuard_RegisterSymbol(RS_ADBE_Symbol); } + if(EnableRSIScalpingBTCUSD) { GapGuard_RegisterMagic((ulong)RS_BTCUSD_MagicNumber); GapGuard_RegisterSymbol(RS_BTCUSD_Symbol); } + if(EnableRSIScalpingNVDA) { GapGuard_RegisterMagic((ulong)RS_NVDA_MagicNumber); GapGuard_RegisterSymbol(RS_NVDA_Symbol); } + if(EnableRSIScalpingTSLA) { GapGuard_RegisterMagic((ulong)RS_TSLA_MagicNumber); GapGuard_RegisterSymbol(RS_TSLA_Symbol); } + if(EnableRSIScalpingXAUUSD) { GapGuard_RegisterMagic((ulong)RS_XAUUSD_MagicNumber); GapGuard_RegisterSymbol(RS_XAUUSD_Symbol); } + if(EnableRSIScalpingMU) { GapGuard_RegisterMagic((ulong)RS_MU_MagicNumber); GapGuard_RegisterSymbol(RS_MU_Symbol); } + if(EnableRSISecretSauce) { GapGuard_RegisterMagic((ulong)RSS_MagicNumber); GapGuard_RegisterSymbol(RSS_Symbol); } + if(EnableSuperEMA) { GapGuard_RegisterMagic((ulong)SE_MagicNumber); GapGuard_RegisterSymbol(SE_Symbol); } + if(EnableRSIConsolidation) { GapGuard_RegisterMagic(RCO_MagicNumber); GapGuard_RegisterSymbol(RCO_Symbol); } + if(EnableRSIReversalAsianEURUSD) { GapGuard_RegisterMagic((ulong)RRA_EURUSD_MagicNumber); GapGuard_RegisterSymbol(RRA_EURUSD_Symbol); } + if(EnableRSIReversalAsianAUDUSD) { GapGuard_RegisterMagic((ulong)RRA_AUDUSD_MagicNumber); GapGuard_RegisterSymbol(RRA_AUDUSD_Symbol); } + if(EnableSimpleTrendlineBTCUSD) { GapGuard_RegisterMagic(ST_BTC_MagicNumber); GapGuard_RegisterSymbol(ST_BTC_Symbol); } + if(EnableSimpleTrendlineXAUUSD) { GapGuard_RegisterMagic(ST_XAU_MagicNumber); GapGuard_RegisterSymbol(ST_XAU_Symbol); } + if(EnableSimpleTrendlineGER40) { GapGuard_RegisterMagic(ST_GER_MagicNumber); GapGuard_RegisterSymbol(ST_GER_Symbol); } + if(EnableUSDJPYBuster) { GapGuard_RegisterMagic((ulong)UB_MagicNumber); GapGuard_RegisterSymbol(UB_Symbol); } + if(EnableXAUBearTrend) { GapGuard_RegisterMagic(XBT_MagicNumber); GapGuard_RegisterSymbol(XBT_Symbol); } + if(EnableXAUMomentumBreakdown) { GapGuard_RegisterMagic(XMB_MagicNumber); GapGuard_RegisterSymbol(XMB_Symbol); } + if(EnableRSIReversalAsianGBPUSD) { GapGuard_RegisterMagic((ulong)RRA_GBPUSD_MagicNumber); GapGuard_RegisterSymbol(RRA_GBPUSD_Symbol); } + if(EnableGER40Buster) { GapGuard_RegisterMagic((ulong)GB_MagicNumber); GapGuard_RegisterSymbol(GB_Symbol); } + if(EnableRSIScalpingNAS100) { GapGuard_RegisterMagic((ulong)RS_NAS100_MagicNumber); GapGuard_RegisterSymbol(RS_NAS100_Symbol); } + if(EnableRSIScalpingUS500) { GapGuard_RegisterMagic((ulong)RS_US500_MagicNumber); GapGuard_RegisterSymbol(RS_US500_Symbol); } + if(EnableRSIReversalAsianUSDCHF) { GapGuard_RegisterMagic((ulong)RRA_USDCHF_MagicNumber); GapGuard_RegisterSymbol(RRA_USDCHF_Symbol); } + if(EnableRSIReversalAsianNZDUSD) { GapGuard_RegisterMagic((ulong)RRA_NZDUSD_MagicNumber); GapGuard_RegisterSymbol(RRA_NZDUSD_Symbol); } + if(EnableNAS100Buster) { GapGuard_RegisterMagic((ulong)NB_MagicNumber); GapGuard_RegisterSymbol(NB_Symbol); } + if(EnableUS500Buster) { GapGuard_RegisterMagic((ulong)U5B_MagicNumber); GapGuard_RegisterSymbol(U5B_Symbol); } + if(EnableRSIScalpingUS30) { GapGuard_RegisterMagic((ulong)RS_US30_MagicNumber); GapGuard_RegisterSymbol(RS_US30_Symbol); } + if(EnableRSIScalpingXAGUSD) { GapGuard_RegisterMagic((ulong)RS_XAGUSD_MagicNumber); GapGuard_RegisterSymbol(RS_XAGUSD_Symbol); } + if(EnableRSIScalpingEURJPY) { GapGuard_RegisterMagic((ulong)RS_EURJPY_MagicNumber); GapGuard_RegisterSymbol(RS_EURJPY_Symbol); } + if(EnableRSIScalpingGBPJPY) { GapGuard_RegisterMagic((ulong)RS_GBPJPY_MagicNumber); GapGuard_RegisterSymbol(RS_GBPJPY_Symbol); } + if(EnableUS30Buster) { GapGuard_RegisterMagic((ulong)U30B_MagicNumber); GapGuard_RegisterSymbol(U30B_Symbol); } + if(EnableUK100Buster) { GapGuard_RegisterMagic((ulong)UKB_MagicNumber); GapGuard_RegisterSymbol(UKB_Symbol); } + if(EnableXAGUSDBuster) { GapGuard_RegisterMagic((ulong)XGB_MagicNumber); GapGuard_RegisterSymbol(XGB_Symbol); } + if(EnableRSIScalpingF) { GapGuard_RegisterMagic((ulong)RS_F_MagicNumber); GapGuard_RegisterSymbol(RS_F_Symbol); } + if(EnableRSIScalpingSOFI) { GapGuard_RegisterMagic((ulong)RS_SOFI_MagicNumber); GapGuard_RegisterSymbol(RS_SOFI_Symbol); } + if(EnableRSIScalpingSNAP) { GapGuard_RegisterMagic((ulong)RS_SNAP_MagicNumber); GapGuard_RegisterSymbol(RS_SNAP_Symbol); } + if(EnableRSIScalpingWBD) { GapGuard_RegisterMagic((ulong)RS_WBD_MagicNumber); GapGuard_RegisterSymbol(RS_WBD_Symbol); } +} //+------------------------------------------------------------------+ //| Expert initialization function | @@ -697,6 +1385,7 @@ int OnInit() int initResult = INIT_SUCCEEDED; United_RefreshScaledLots(); + United_GapGuardSetup(); // Initialize strategies - log warnings but don't fail entire EA if symbol unavailable if(EnableDarvasBox) @@ -718,6 +1407,9 @@ int OnInit() // Initialize RSI Scalping strategies - don't fail entire EA if symbol unavailable if(EnableRSIScalpingAPPL) InitRSIScalping(rsAPPLData, RS_APPL_Symbol, RS_APPL_TimeFrame, RS_APPL_RSI_Period, RS_APPL_RSI_Applied_Price, RS_APPL_MagicNumber, RS_APPL_Slippage); + + if(EnableRSIScalpingADBE) + InitRSIScalping(rsADBEData, RS_ADBE_Symbol, RS_ADBE_TimeFrame, RS_ADBE_RSI_Period, RS_ADBE_RSI_Applied_Price, RS_ADBE_MagicNumber, RS_ADBE_Slippage); if(EnableRSIScalpingBTCUSD) InitRSIScalping(rsBTCUSDData, RS_BTCUSD_Symbol, RS_BTCUSD_TimeFrame, RS_BTCUSD_RSI_Period, RS_BTCUSD_RSI_Applied_Price, RS_BTCUSD_MagicNumber, RS_BTCUSD_Slippage); @@ -733,6 +1425,33 @@ int OnInit() if(EnableRSIScalpingMU) InitRSIScalping(rsMUData, RS_MU_Symbol, RS_MU_TimeFrame, RS_MU_RSI_Period, RS_MU_RSI_Applied_Price, RS_MU_MagicNumber, RS_MU_Slippage); + if(EnableRSIScalpingNAS100) + InitRSIScalping(rsNAS100Data, RS_NAS100_Symbol, RS_NAS100_TimeFrame, RS_NAS100_RSI_Period, RS_NAS100_RSI_Applied_Price, RS_NAS100_MagicNumber, RS_NAS100_Slippage); + + if(EnableRSIScalpingUS500) + InitRSIScalping(rsUS500Data, RS_US500_Symbol, RS_US500_TimeFrame, RS_US500_RSI_Period, RS_US500_RSI_Applied_Price, RS_US500_MagicNumber, RS_US500_Slippage); + + if(EnableRSIScalpingUS30) + InitRSIScalping(rsUS30Data, RS_US30_Symbol, RS_US30_TimeFrame, RS_US30_RSI_Period, RS_US30_RSI_Applied_Price, RS_US30_MagicNumber, RS_US30_Slippage); + + if(EnableRSIScalpingXAGUSD) + InitRSIScalping(rsXAGUSDData, RS_XAGUSD_Symbol, RS_XAGUSD_TimeFrame, RS_XAGUSD_RSI_Period, RS_XAGUSD_RSI_Applied_Price, RS_XAGUSD_MagicNumber, RS_XAGUSD_Slippage); + + if(EnableRSIScalpingEURJPY) + InitRSIScalping(rsEURJPYData, RS_EURJPY_Symbol, RS_EURJPY_TimeFrame, RS_EURJPY_RSI_Period, RS_EURJPY_RSI_Applied_Price, RS_EURJPY_MagicNumber, RS_EURJPY_Slippage); + + if(EnableRSIScalpingGBPJPY) + InitRSIScalping(rsGBPJPYData, RS_GBPJPY_Symbol, RS_GBPJPY_TimeFrame, RS_GBPJPY_RSI_Period, RS_GBPJPY_RSI_Applied_Price, RS_GBPJPY_MagicNumber, RS_GBPJPY_Slippage); + + if(EnableRSIScalpingF) + InitRSIScalping(rsFData, RS_F_Symbol, RS_F_TimeFrame, RS_F_RSI_Period, RS_F_RSI_Applied_Price, RS_F_MagicNumber, RS_F_Slippage); + if(EnableRSIScalpingSOFI) + InitRSIScalping(rsSOFIData, RS_SOFI_Symbol, RS_SOFI_TimeFrame, RS_SOFI_RSI_Period, RS_SOFI_RSI_Applied_Price, RS_SOFI_MagicNumber, RS_SOFI_Slippage); + if(EnableRSIScalpingSNAP) + InitRSIScalping(rsSNAPData, RS_SNAP_Symbol, RS_SNAP_TimeFrame, RS_SNAP_RSI_Period, RS_SNAP_RSI_Applied_Price, RS_SNAP_MagicNumber, RS_SNAP_Slippage); + if(EnableRSIScalpingWBD) + InitRSIScalping(rsWBDData, RS_WBD_Symbol, RS_WBD_TimeFrame, RS_WBD_RSI_Period, RS_WBD_RSI_Applied_Price, RS_WBD_MagicNumber, RS_WBD_Slippage); + if(EnableRSISecretSauce) if(!InitRSISecretSauce(rssData, RSS_Symbol)) Print("Warning: RSI Secret Sauce failed to initialize for symbol '", RSS_Symbol, "'"); @@ -790,6 +1509,153 @@ int OnInit() ST_GER_MAMethod, ST_GER_AppliedPrice, ST_GER_HTFBarsToScan, ST_GER_LineTouchTolerance, ST_GER_BreakBuffer, ST_GER_MagicNumber, ST_GER_DrawTrendline)) Print("Warning: SimpleTrendlineGER40 failed to initialize for symbol '", ST_GER_Symbol, "'"); + + if(EnableUSDJPYBuster) + if(!InitUSDJPYBuster(ubData, UB_Symbol, + UB_RangeStartHour, UB_RangeEndHour, UB_CloseHour, UB_RangeTF, + UB_MinRangePoints, UB_OrderBufferPoints, + UB_FirstTradeOnly, UB_AllowLong, UB_AllowShort, + UB_UseTakeProfit, UB_TakeProfitPoints, + UB_RiskMode, UB_FixedRiskMoney, UB_RiskPercent, UB_FixedLots, + UB_MagicNumber, UB_Slippage, UB_MaxSpreadPoints, UB_DrawRange, UB_DebugLog)) + Print("Warning: USDJPYBuster failed to initialize for symbol '", UB_Symbol, "'"); + + if(EnableXAUBearTrend) + if(!InitXAUBearTrend(xbtData, XBT_Symbol, XBT_RegimeTF, XBT_EntryTF, + XBT_RegimeEmaPeriod, XBT_RsiPeriod, XBT_RsiArmLevel, XBT_RsiTriggerLevel, + XBT_AtrPeriod, XBT_SlAtrMult, XBT_TpAtrMult, + XBT_UseTrailing, XBT_TrailAtrMult, + XBT_MagicNumber, XBT_Slippage, XBT_MaxSpreadPoints)) + Print("Warning: XAUBearTrend failed to initialize for symbol '", XBT_Symbol, "'"); + + if(EnableXAUMomentumBreakdown) + if(!InitXAUMomentumBreakdown(xmbData, XMB_Symbol, XMB_RegimeTF, XMB_EntryTF, + XMB_RegimeEmaPeriod, XMB_BbPeriod, XMB_BbDeviation, XMB_AtrPeriod, + XMB_SlAtrMult, XMB_TpAtrMult, XMB_UseTrailing, XMB_TrailAtrMult, + XMB_MagicNumber, XMB_Slippage, XMB_MaxSpreadPoints)) + Print("Warning: XAUMomentumBreakdown failed to initialize for symbol '", XMB_Symbol, "'"); + + if(EnableRSIReversalAsianGBPUSD) + if(!InitRSIReversalAsian(rraGBPUSDData, RRA_GBPUSD_Symbol, RRA_GBPUSD_RSIPeriod, RRA_GBPUSD_OverboughtLevel, RRA_GBPUSD_OversoldLevel, + RRA_GBPUSD_TakeProfitPips, RRA_GBPUSD_StopLossPips, LOT_RRA_GBPUSD, + RRA_GBPUSD_MaxSpread, RRA_GBPUSD_MaxDuration, RRA_GBPUSD_UseStopLoss, + RRA_GBPUSD_UseTakeProfit, RRA_GBPUSD_UseRSIExit, RRA_GBPUSD_RSIExitLevel, + RRA_GBPUSD_CloseOutsideSession, RRA_GBPUSD_TimeFrame, RRA_GBPUSD_MagicNumber, RRA_GBPUSD_Slippage)) + Print("Warning: RSIReversalAsianGBPUSD strategy failed to initialize for symbol '", RRA_GBPUSD_Symbol, "'"); + + if(EnableGER40Buster) + if(!InitUSDJPYBuster(gbData, GB_Symbol, + GB_RangeStartHour, GB_RangeEndHour, GB_CloseHour, GB_RangeTF, + GB_MinRangePoints, GB_OrderBufferPoints, + GB_FirstTradeOnly, GB_AllowLong, GB_AllowShort, + GB_UseTakeProfit, GB_TakeProfitPoints, + GB_RiskMode, GB_FixedRiskMoney, GB_RiskPercent, GB_FixedLots, + GB_MagicNumber, GB_Slippage, GB_MaxSpreadPoints, GB_DrawRange, GB_DebugLog)) + Print("Warning: GER40Buster failed to initialize for symbol '", GB_Symbol, "'"); + + if(EnableRSIReversalAsianUSDCHF) + if(!InitRSIReversalAsian(rraUSDCHFData, RRA_USDCHF_Symbol, RRA_USDCHF_RSIPeriod, RRA_USDCHF_OverboughtLevel, RRA_USDCHF_OversoldLevel, + RRA_USDCHF_TakeProfitPips, RRA_USDCHF_StopLossPips, LOT_RRA_USDCHF, + RRA_USDCHF_MaxSpread, RRA_USDCHF_MaxDuration, RRA_USDCHF_UseStopLoss, + RRA_USDCHF_UseTakeProfit, RRA_USDCHF_UseRSIExit, RRA_USDCHF_RSIExitLevel, + RRA_USDCHF_CloseOutsideSession, RRA_USDCHF_TimeFrame, RRA_USDCHF_MagicNumber, RRA_USDCHF_Slippage)) + Print("Warning: RSIReversalAsianUSDCHF strategy failed to initialize for symbol '", RRA_USDCHF_Symbol, "'"); + + if(EnableRSIReversalAsianNZDUSD) + if(!InitRSIReversalAsian(rraNZDUSDData, RRA_NZDUSD_Symbol, RRA_NZDUSD_RSIPeriod, RRA_NZDUSD_OverboughtLevel, RRA_NZDUSD_OversoldLevel, + RRA_NZDUSD_TakeProfitPips, RRA_NZDUSD_StopLossPips, LOT_RRA_NZDUSD, + RRA_NZDUSD_MaxSpread, RRA_NZDUSD_MaxDuration, RRA_NZDUSD_UseStopLoss, + RRA_NZDUSD_UseTakeProfit, RRA_NZDUSD_UseRSIExit, RRA_NZDUSD_RSIExitLevel, + RRA_NZDUSD_CloseOutsideSession, RRA_NZDUSD_TimeFrame, RRA_NZDUSD_MagicNumber, RRA_NZDUSD_Slippage)) + Print("Warning: RSIReversalAsianNZDUSD strategy failed to initialize for symbol '", RRA_NZDUSD_Symbol, "'"); + + if(EnableNAS100Buster) + if(!InitUSDJPYBuster(nbData, NB_Symbol, + NB_RangeStartHour, NB_RangeEndHour, NB_CloseHour, NB_RangeTF, + NB_MinRangePoints, NB_OrderBufferPoints, + NB_FirstTradeOnly, NB_AllowLong, NB_AllowShort, + NB_UseTakeProfit, NB_TakeProfitPoints, + NB_RiskMode, NB_FixedRiskMoney, NB_RiskPercent, NB_FixedLots, + NB_MagicNumber, NB_Slippage, NB_MaxSpreadPoints, NB_DrawRange, NB_DebugLog)) + Print("Warning: NAS100Buster failed to initialize for symbol '", NB_Symbol, "'"); + + if(EnableUS500Buster) + if(!InitUSDJPYBuster(u5bData, U5B_Symbol, + U5B_RangeStartHour, U5B_RangeEndHour, U5B_CloseHour, U5B_RangeTF, + U5B_MinRangePoints, U5B_OrderBufferPoints, + U5B_FirstTradeOnly, U5B_AllowLong, U5B_AllowShort, + U5B_UseTakeProfit, U5B_TakeProfitPoints, + U5B_RiskMode, U5B_FixedRiskMoney, U5B_RiskPercent, U5B_FixedLots, + U5B_MagicNumber, U5B_Slippage, U5B_MaxSpreadPoints, U5B_DrawRange, U5B_DebugLog)) + Print("Warning: US500Buster failed to initialize for symbol '", U5B_Symbol, "'"); + + if(EnableUS30Buster) + if(!InitUSDJPYBuster(u30bData, U30B_Symbol, + U30B_RangeStartHour, U30B_RangeEndHour, U30B_CloseHour, U30B_RangeTF, + U30B_MinRangePoints, U30B_OrderBufferPoints, + U30B_FirstTradeOnly, U30B_AllowLong, U30B_AllowShort, + U30B_UseTakeProfit, U30B_TakeProfitPoints, + U30B_RiskMode, U30B_FixedRiskMoney, U30B_RiskPercent, U30B_FixedLots, + U30B_MagicNumber, U30B_Slippage, U30B_MaxSpreadPoints, U30B_DrawRange, U30B_DebugLog)) + Print("Warning: US30Buster failed to initialize for symbol '", U30B_Symbol, "'"); + + if(EnableUK100Buster) + if(!InitUSDJPYBuster(ukbData, UKB_Symbol, + UKB_RangeStartHour, UKB_RangeEndHour, UKB_CloseHour, UKB_RangeTF, + UKB_MinRangePoints, UKB_OrderBufferPoints, + UKB_FirstTradeOnly, UKB_AllowLong, UKB_AllowShort, + UKB_UseTakeProfit, UKB_TakeProfitPoints, + UKB_RiskMode, UKB_FixedRiskMoney, UKB_RiskPercent, UKB_FixedLots, + UKB_MagicNumber, UKB_Slippage, UKB_MaxSpreadPoints, UKB_DrawRange, UKB_DebugLog)) + Print("Warning: UK100Buster failed to initialize for symbol '", UKB_Symbol, "'"); + + if(EnableXAGUSDBuster) + if(!InitUSDJPYBuster(xgbData, XGB_Symbol, + XGB_RangeStartHour, XGB_RangeEndHour, XGB_CloseHour, XGB_RangeTF, + XGB_MinRangePoints, XGB_OrderBufferPoints, + XGB_FirstTradeOnly, XGB_AllowLong, XGB_AllowShort, + XGB_UseTakeProfit, XGB_TakeProfitPoints, + XGB_RiskMode, XGB_FixedRiskMoney, XGB_RiskPercent, XGB_FixedLots, + XGB_MagicNumber, XGB_Slippage, XGB_MaxSpreadPoints, XGB_DrawRange, XGB_DebugLog)) + Print("Warning: XAGUSDBuster failed to initialize for symbol '", XGB_Symbol, "'"); + + rsAPPLData.closeUnprofitableOnNewSignal = RS_APPL_CloseUnprofitableOnNewSignal; + rsADBEData.closeUnprofitableOnNewSignal = RS_ADBE_CloseUnprofitableOnNewSignal; + rsBTCUSDData.closeUnprofitableOnNewSignal = RS_BTCUSD_CloseUnprofitableOnNewSignal; + rsNVDAData.closeUnprofitableOnNewSignal = RS_NVDA_CloseUnprofitableOnNewSignal; + rsTSLAData.closeUnprofitableOnNewSignal = RS_TSLA_CloseUnprofitableOnNewSignal; + rsXAUUSDData.closeUnprofitableOnNewSignal = RS_XAUUSD_CloseUnprofitableOnNewSignal; + rsMUData.closeUnprofitableOnNewSignal = RS_MU_CloseUnprofitableOnNewSignal; + rsNAS100Data.closeUnprofitableOnNewSignal = RS_NAS100_CloseUnprofitableOnNewSignal; + rsUS500Data.closeUnprofitableOnNewSignal = RS_US500_CloseUnprofitableOnNewSignal; + rsUS30Data.closeUnprofitableOnNewSignal = RS_US30_CloseUnprofitableOnNewSignal; + rsXAGUSDData.closeUnprofitableOnNewSignal = RS_XAGUSD_CloseUnprofitableOnNewSignal; + rsEURJPYData.closeUnprofitableOnNewSignal = RS_EURJPY_CloseUnprofitableOnNewSignal; + rsGBPJPYData.closeUnprofitableOnNewSignal = RS_GBPJPY_CloseUnprofitableOnNewSignal; + rsFData.closeUnprofitableOnNewSignal = RS_F_CloseUnprofitableOnNewSignal; + rsSOFIData.closeUnprofitableOnNewSignal = RS_SOFI_CloseUnprofitableOnNewSignal; + rsSNAPData.closeUnprofitableOnNewSignal = RS_SNAP_CloseUnprofitableOnNewSignal; + rsWBDData.closeUnprofitableOnNewSignal = RS_WBD_CloseUnprofitableOnNewSignal; + rraEURUSDData.closeUnprofitableOnNewSignal = RRA_EURUSD_CloseUnprofitableOnNewSignal; + rraAUDUSDData.closeUnprofitableOnNewSignal = RRA_AUDUSD_CloseUnprofitableOnNewSignal; + seData.closeUnprofitableOnNewSignal = SE_CloseUnprofitableOnNewSignal; + rcoData.closeUnprofitableOnNewSignal = RCO_CloseUnprofitableOnNewSignal; + stBTCData.closeUnprofitableOnNewSignal = ST_BTC_CloseUnprofitableOnNewSignal; + stXAUData.closeUnprofitableOnNewSignal = ST_XAU_CloseUnprofitableOnNewSignal; + stGERData.closeUnprofitableOnNewSignal = ST_GER_CloseUnprofitableOnNewSignal; + rssData.closeUnprofitableOnNewSignal = RSS_CloseUnprofitableOnNewSignal; + ubData.closeUnprofitableOnNewSignal = UB_CloseUnprofitableOnNewSignal; + xbtData.closeUnprofitableOnNewSignal = XBT_CloseUnprofitableOnNewSignal; + xmbData.closeUnprofitableOnNewSignal = XMB_CloseUnprofitableOnNewSignal; + rraGBPUSDData.closeUnprofitableOnNewSignal = RRA_GBPUSD_CloseUnprofitableOnNewSignal; + gbData.closeUnprofitableOnNewSignal = GB_CloseUnprofitableOnNewSignal; + rraUSDCHFData.closeUnprofitableOnNewSignal = RRA_USDCHF_CloseUnprofitableOnNewSignal; + rraNZDUSDData.closeUnprofitableOnNewSignal = RRA_NZDUSD_CloseUnprofitableOnNewSignal; + nbData.closeUnprofitableOnNewSignal = NB_CloseUnprofitableOnNewSignal; + u5bData.closeUnprofitableOnNewSignal = U5B_CloseUnprofitableOnNewSignal; + u30bData.closeUnprofitableOnNewSignal = U30B_CloseUnprofitableOnNewSignal; + ukbData.closeUnprofitableOnNewSignal = UKB_CloseUnprofitableOnNewSignal; + xgbData.closeUnprofitableOnNewSignal = XGB_CloseUnprofitableOnNewSignal; Print("United EA initialized. Active strategies: ", (EnableDarvasBox ? "DarvasBox " : ""), @@ -797,6 +1663,7 @@ int OnInit() (EnableRSICrossOverReversal ? "RSICrossOver " : ""), (EnableRSIMidPointHijack ? "RSIMidPoint " : ""), (EnableRSIScalpingAPPL ? "RSIScalpingAPPL " : ""), + (EnableRSIScalpingADBE ? "RSIScalpingADBE " : ""), (EnableRSIScalpingBTCUSD ? "RSIScalpingBTCUSD " : ""), (EnableRSIScalpingNVDA ? "RSIScalpingNVDA " : ""), (EnableRSIScalpingTSLA ? "RSIScalpingTSLA " : ""), @@ -809,7 +1676,29 @@ int OnInit() (EnableRSIReversalAsianAUDUSD ? "RSIReversalAsianAUDUSD " : ""), (EnableSimpleTrendlineBTCUSD ? "SimpleTrendlineBTCUSD " : ""), (EnableSimpleTrendlineXAUUSD ? "SimpleTrendlineXAUUSD " : ""), - (EnableSimpleTrendlineGER40 ? "SimpleTrendlineGER40 " : "")); + (EnableSimpleTrendlineGER40 ? "SimpleTrendlineGER40 " : ""), + (EnableUSDJPYBuster ? "USDJPYBuster " : ""), + (EnableXAUBearTrend ? "XAUBearTrend " : ""), + (EnableXAUMomentumBreakdown ? "XAUMomentumBreakdown " : ""), + (EnableRSIReversalAsianGBPUSD ? "RSIReversalAsianGBPUSD " : ""), + (EnableGER40Buster ? "GER40Buster " : ""), + (EnableRSIScalpingNAS100 ? "RSIScalpingNAS100 " : ""), + (EnableRSIScalpingUS500 ? "RSIScalpingUS500 " : ""), + (EnableRSIReversalAsianUSDCHF ? "RSIReversalAsianUSDCHF " : ""), + (EnableRSIReversalAsianNZDUSD ? "RSIReversalAsianNZDUSD " : ""), + (EnableNAS100Buster ? "NAS100Buster " : ""), + (EnableUS500Buster ? "US500Buster " : ""), + (EnableRSIScalpingUS30 ? "RSIScalpingUS30 " : ""), + (EnableRSIScalpingXAGUSD ? "RSIScalpingXAGUSD " : ""), + (EnableRSIScalpingEURJPY ? "RSIScalpingEURJPY " : ""), + (EnableRSIScalpingGBPJPY ? "RSIScalpingGBPJPY " : ""), + (EnableUS30Buster ? "US30Buster " : ""), + (EnableUK100Buster ? "UK100Buster " : ""), + (EnableXAGUSDBuster ? "XAGUSDBuster " : ""), + (EnableRSIScalpingF ? "RSIScalpingF " : ""), + (EnableRSIScalpingSOFI ? "RSIScalpingSOFI " : ""), + (EnableRSIScalpingSNAP ? "RSIScalpingSNAP " : ""), + (EnableRSIScalpingWBD ? "RSIScalpingWBD " : "")); return initResult; } @@ -833,6 +1722,9 @@ void OnDeinit(const int reason) if(EnableRSIScalpingAPPL) DeinitRSIScalping(rsAPPLData); + + if(EnableRSIScalpingADBE) + DeinitRSIScalping(rsADBEData); if(EnableRSIScalpingBTCUSD) DeinitRSIScalping(rsBTCUSDData); @@ -847,6 +1739,26 @@ void OnDeinit(const int reason) DeinitRSIScalping(rsXAUUSDData); if(EnableRSIScalpingMU) DeinitRSIScalping(rsMUData); + if(EnableRSIScalpingNAS100) + DeinitRSIScalping(rsNAS100Data); + if(EnableRSIScalpingUS500) + DeinitRSIScalping(rsUS500Data); + if(EnableRSIScalpingUS30) + DeinitRSIScalping(rsUS30Data); + if(EnableRSIScalpingXAGUSD) + DeinitRSIScalping(rsXAGUSDData); + if(EnableRSIScalpingEURJPY) + DeinitRSIScalping(rsEURJPYData); + if(EnableRSIScalpingGBPJPY) + DeinitRSIScalping(rsGBPJPYData); + if(EnableRSIScalpingF) + DeinitRSIScalping(rsFData); + if(EnableRSIScalpingSOFI) + DeinitRSIScalping(rsSOFIData); + if(EnableRSIScalpingSNAP) + DeinitRSIScalping(rsSNAPData); + if(EnableRSIScalpingWBD) + DeinitRSIScalping(rsWBDData); if(EnableRSISecretSauce) DeinitRSISecretSauce(rssData); @@ -869,6 +1781,42 @@ void OnDeinit(const int reason) DeinitSimpleTrendline(stXAUData); if(EnableSimpleTrendlineGER40) DeinitSimpleTrendline(stGERData); + + if(EnableUSDJPYBuster) + DeinitUSDJPYBuster(ubData); + + if(EnableXAUBearTrend) + DeinitXAUBearTrend(xbtData); + + if(EnableXAUMomentumBreakdown) + DeinitXAUMomentumBreakdown(xmbData); + + if(EnableRSIReversalAsianGBPUSD) + DeinitRSIReversalAsian(rraGBPUSDData); + + if(EnableGER40Buster) + DeinitUSDJPYBuster(gbData); + + if(EnableRSIReversalAsianUSDCHF) + DeinitRSIReversalAsian(rraUSDCHFData); + + if(EnableRSIReversalAsianNZDUSD) + DeinitRSIReversalAsian(rraNZDUSDData); + + if(EnableNAS100Buster) + DeinitUSDJPYBuster(nbData); + + if(EnableUS500Buster) + DeinitUSDJPYBuster(u5bData); + + if(EnableUS30Buster) + DeinitUSDJPYBuster(u30bData); + + if(EnableUK100Buster) + DeinitUSDJPYBuster(ukbData); + + if(EnableXAGUSDBuster) + DeinitUSDJPYBuster(xgbData); Print("United EA deinitialized. Reason: ", reason); } @@ -879,6 +1827,7 @@ void OnDeinit(const int reason) void OnTick() { United_RefreshScaledLots(); + United_ProcessGapGuard(g_gapTrade); if(EnableDarvasBox) ProcessDarvasBox(DB_Symbol); @@ -899,6 +1848,14 @@ void OnTick() false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, RS_APPL_UseTrailingStop, RS_APPL_TrailDistancePoints, RS_APPL_TrailActivationPoints); + + if(EnableRSIScalpingADBE) + ProcessRSIScalping(rsADBEData, RS_ADBE_Symbol, RS_ADBE_TimeFrame, RS_ADBE_RSI_Period, RS_ADBE_RSI_Applied_Price, + RS_ADBE_RSI_Overbought, RS_ADBE_RSI_Oversold, RS_ADBE_RSI_Target_Buy, RS_ADBE_RSI_Target_Sell, + RS_ADBE_BarsToWait, g_Pos_RS_ADBE, RS_ADBE_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_ADBE_UseTrailingStop, RS_ADBE_TrailDistancePoints, RS_ADBE_TrailActivationPoints); if(EnableRSIScalpingBTCUSD) ProcessRSIScalping(rsBTCUSDData, RS_BTCUSD_Symbol, RS_BTCUSD_TimeFrame, RS_BTCUSD_RSI_Period, RS_BTCUSD_RSI_Applied_Price, @@ -939,6 +1896,83 @@ void OnTick() RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, false, 0.0, 0.0); + if(EnableRSIScalpingNAS100) + ProcessRSIScalping(rsNAS100Data, RS_NAS100_Symbol, RS_NAS100_TimeFrame, RS_NAS100_RSI_Period, RS_NAS100_RSI_Applied_Price, + RS_NAS100_RSI_Overbought, RS_NAS100_RSI_Oversold, RS_NAS100_RSI_Target_Buy, RS_NAS100_RSI_Target_Sell, + RS_NAS100_BarsToWait, g_Pos_RS_NAS100, RS_NAS100_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_NAS100_UseTrailingStop, RS_NAS100_TrailDistancePoints, RS_NAS100_TrailActivationPoints); + + if(EnableRSIScalpingUS500) + ProcessRSIScalping(rsUS500Data, RS_US500_Symbol, RS_US500_TimeFrame, RS_US500_RSI_Period, RS_US500_RSI_Applied_Price, + RS_US500_RSI_Overbought, RS_US500_RSI_Oversold, RS_US500_RSI_Target_Buy, RS_US500_RSI_Target_Sell, + RS_US500_BarsToWait, g_Pos_RS_US500, RS_US500_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_US500_UseTrailingStop, RS_US500_TrailDistancePoints, RS_US500_TrailActivationPoints); + + if(EnableRSIScalpingUS30) + ProcessRSIScalping(rsUS30Data, RS_US30_Symbol, RS_US30_TimeFrame, RS_US30_RSI_Period, RS_US30_RSI_Applied_Price, + RS_US30_RSI_Overbought, RS_US30_RSI_Oversold, RS_US30_RSI_Target_Buy, RS_US30_RSI_Target_Sell, + RS_US30_BarsToWait, g_Pos_RS_US30, RS_US30_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_US30_UseTrailingStop, RS_US30_TrailDistancePoints, RS_US30_TrailActivationPoints); + + if(EnableRSIScalpingXAGUSD) + ProcessRSIScalping(rsXAGUSDData, RS_XAGUSD_Symbol, RS_XAGUSD_TimeFrame, RS_XAGUSD_RSI_Period, RS_XAGUSD_RSI_Applied_Price, + RS_XAGUSD_RSI_Overbought, RS_XAGUSD_RSI_Oversold, RS_XAGUSD_RSI_Target_Buy, RS_XAGUSD_RSI_Target_Sell, + RS_XAGUSD_BarsToWait, g_Pos_RS_XAGUSD, RS_XAGUSD_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_XAGUSD_UseTrailingStop, RS_XAGUSD_TrailDistancePoints, RS_XAGUSD_TrailActivationPoints); + + if(EnableRSIScalpingEURJPY) + ProcessRSIScalping(rsEURJPYData, RS_EURJPY_Symbol, RS_EURJPY_TimeFrame, RS_EURJPY_RSI_Period, RS_EURJPY_RSI_Applied_Price, + RS_EURJPY_RSI_Overbought, RS_EURJPY_RSI_Oversold, RS_EURJPY_RSI_Target_Buy, RS_EURJPY_RSI_Target_Sell, + RS_EURJPY_BarsToWait, g_Pos_RS_EURJPY, RS_EURJPY_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_EURJPY_UseTrailingStop, RS_EURJPY_TrailDistancePoints, RS_EURJPY_TrailActivationPoints); + + if(EnableRSIScalpingGBPJPY) + ProcessRSIScalping(rsGBPJPYData, RS_GBPJPY_Symbol, RS_GBPJPY_TimeFrame, RS_GBPJPY_RSI_Period, RS_GBPJPY_RSI_Applied_Price, + RS_GBPJPY_RSI_Overbought, RS_GBPJPY_RSI_Oversold, RS_GBPJPY_RSI_Target_Buy, RS_GBPJPY_RSI_Target_Sell, + RS_GBPJPY_BarsToWait, g_Pos_RS_GBPJPY, RS_GBPJPY_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_GBPJPY_UseTrailingStop, RS_GBPJPY_TrailDistancePoints, RS_GBPJPY_TrailActivationPoints); + + if(EnableRSIScalpingF) + ProcessRSIScalping(rsFData, RS_F_Symbol, RS_F_TimeFrame, RS_F_RSI_Period, RS_F_RSI_Applied_Price, + RS_F_RSI_Overbought, RS_F_RSI_Oversold, RS_F_RSI_Target_Buy, RS_F_RSI_Target_Sell, + RS_F_BarsToWait, g_Pos_RS_F, RS_F_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_F_UseTrailingStop, RS_F_TrailDistancePoints, RS_F_TrailActivationPoints); + if(EnableRSIScalpingSOFI) + ProcessRSIScalping(rsSOFIData, RS_SOFI_Symbol, RS_SOFI_TimeFrame, RS_SOFI_RSI_Period, RS_SOFI_RSI_Applied_Price, + RS_SOFI_RSI_Overbought, RS_SOFI_RSI_Oversold, RS_SOFI_RSI_Target_Buy, RS_SOFI_RSI_Target_Sell, + RS_SOFI_BarsToWait, g_Pos_RS_SOFI, RS_SOFI_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_SOFI_UseTrailingStop, RS_SOFI_TrailDistancePoints, RS_SOFI_TrailActivationPoints); + if(EnableRSIScalpingSNAP) + ProcessRSIScalping(rsSNAPData, RS_SNAP_Symbol, RS_SNAP_TimeFrame, RS_SNAP_RSI_Period, RS_SNAP_RSI_Applied_Price, + RS_SNAP_RSI_Overbought, RS_SNAP_RSI_Oversold, RS_SNAP_RSI_Target_Buy, RS_SNAP_RSI_Target_Sell, + RS_SNAP_BarsToWait, g_Pos_RS_SNAP, RS_SNAP_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_SNAP_UseTrailingStop, RS_SNAP_TrailDistancePoints, RS_SNAP_TrailActivationPoints); + if(EnableRSIScalpingWBD) + ProcessRSIScalping(rsWBDData, RS_WBD_Symbol, RS_WBD_TimeFrame, RS_WBD_RSI_Period, RS_WBD_RSI_Applied_Price, + RS_WBD_RSI_Overbought, RS_WBD_RSI_Oversold, RS_WBD_RSI_Target_Buy, RS_WBD_RSI_Target_Sell, + RS_WBD_BarsToWait, g_Pos_RS_WBD, RS_WBD_MagicNumber, + false, RS_ReversalATRPeriod, RS_ReversalAdverseAtrMult, RS_ReversalSignsRequired, + RS_ReversalRsiVelocity, RS_ReversalBodyAtrMult, + RS_WBD_UseTrailingStop, RS_WBD_TrailDistancePoints, RS_WBD_TrailActivationPoints); + if(EnableRSISecretSauce) ProcessRSISecretSauce(rssData, g_RSS_LotSize); @@ -960,6 +1994,42 @@ void OnTick() ProcessSimpleTrendline(stXAUData, g_Pos_ST_XAUUSD); if(EnableSimpleTrendlineGER40) ProcessSimpleTrendline(stGERData, g_Pos_ST_GER40); + + if(EnableUSDJPYBuster) + ProcessUSDJPYBuster(ubData, g_Pos_UB_USDJPY, United_BalanceScaleFactor()); + + if(EnableXAUBearTrend) + ProcessXAUBearTrend(xbtData, g_Pos_XBT_XAUUSD); + + if(EnableXAUMomentumBreakdown) + ProcessXAUMomentumBreakdown(xmbData, g_Pos_XMB_XAUUSD); + + if(EnableRSIReversalAsianGBPUSD) + ProcessRSIReversalAsian(rraGBPUSDData, g_Pos_RRA_GBPUSD); + + if(EnableGER40Buster) + ProcessUSDJPYBuster(gbData, g_Pos_GB_GER40, United_BalanceScaleFactor()); + + if(EnableRSIReversalAsianUSDCHF) + ProcessRSIReversalAsian(rraUSDCHFData, g_Pos_RRA_USDCHF); + + if(EnableRSIReversalAsianNZDUSD) + ProcessRSIReversalAsian(rraNZDUSDData, g_Pos_RRA_NZDUSD); + + if(EnableNAS100Buster) + ProcessUSDJPYBuster(nbData, g_Pos_NB_NAS100, United_BalanceScaleFactor()); + + if(EnableUS500Buster) + ProcessUSDJPYBuster(u5bData, g_Pos_U5B_US500, United_BalanceScaleFactor()); + + if(EnableUS30Buster) + ProcessUSDJPYBuster(u30bData, g_Pos_U30B_US30, United_BalanceScaleFactor()); + + if(EnableUK100Buster) + ProcessUSDJPYBuster(ukbData, g_Pos_UKB_UK100, United_BalanceScaleFactor()); + + if(EnableXAGUSDBuster) + ProcessUSDJPYBuster(xgbData, g_Pos_XGB_XAGUSD, United_BalanceScaleFactor()); } //+------------------------------------------------------------------+ diff --git a/frontline/cluster-latest/report.png b/frontline/cluster-latest/report.png deleted file mode 100644 index a174d73..0000000 Binary files a/frontline/cluster-latest/report.png and /dev/null differ diff --git a/frontline/cluster-latest/reports/brochure_i18n.py b/frontline/cluster-latest/reports/brochure_i18n.py new file mode 100644 index 0000000..1ae5557 --- /dev/null +++ b/frontline/cluster-latest/reports/brochure_i18n.py @@ -0,0 +1,548 @@ +"""Brochure strings and flowcharts: zh / de / ar.""" +from __future__ import annotations + +from dataclasses import dataclass, field + +_T = r"node distance=0.65cm, every node/.style={draw, rounded corners, align=center, font=\footnotesize, inner sep=4pt, text width=6.8cm}, >=Stealth, thick" +_TH = r"node distance=0.65cm and 2.2cm, every node/.style={draw, rounded corners, align=center, font=\footnotesize, inner sep=4pt, text width=3.4cm}, >=Stealth, thick" +_TAR = r"node distance=0.65cm, every node/.style={draw, rounded corners, align=center, font=\footnotesize\arabicfont, inner sep=4pt, text width=6.8cm}, >=Stealth, thick" +_THAR = r"node distance=0.65cm and 2.2cm, every node/.style={draw, rounded corners, align=center, font=\footnotesize\arabicfont, inner sep=4pt, text width=3.2cm}, >=Stealth, thick" + + +@dataclass +class Locale: + code: str + tex_stem: str + pdf_name: str + preamble: list[str] + title: str + author: str + abstract_tpl: str # {n_prof}, {n_pf1}, {deposit} + s1_title: str + s1_body: str + s1_1_title: str + s1_1_items: list[str] + s1_2_title: str + table_headers: tuple[str, str] + table_rows: list[tuple[str, str]] + s2_title: str + s2_body_tpl: str # {pf}, {sharpe}, {trades} + s2_caption: str + s3_title: str + s3_body: str + s4_title: str + s4_caption: str + table_cols: str + s5_title: str + s5_body: str + close_note: str + s6_title: str + s6_items: list[str] + disclaimer: str + equity_ylabel: str + equity_combined_title: str + caption_pf_net_sharpe: tuple[str, str, str] # PF, net, sharpe labels + flowcharts: dict[str, str] = field(default_factory=dict) + rtl: bool = False + + +def _fc(lang: str, key: str, body: str, *, wide: bool = False) -> str: + t = _THAR if (lang == "ar" and wide) else (_TAR if lang == "ar" else (_TH if wide else _T)) + return rf"\begin{{tikzpicture}}[{t}]{body}\end{{tikzpicture}}" + + +FLOW_ZH = { + "DB": _fc("zh", "DB", r""" +\node (a) {H1 扫描 BoxPeriod 根 K 线}; +\node (b) [below=of a] {计算高低点,形成 Darvas 箱体}; +\node (c) [below=of b] {箱体有效?幅度 $\leq$ 偏差阈值\\{\scriptsize 无效则继续等待}}; +\node (d) [below=of c] {趋势 MA 斜率 + 成交量放大过滤}; +\node (e) [below=of d] {突破上沿 $\rightarrow$ Buy\\突破下沿 $\rightarrow$ Sell}; +\node (f) [below=of e] {固定 SL/TP 持仓管理}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e); \draw[->] (e)--(f);"""), + "ES": _fc("zh", "ES", r""" +\node (a) {EMA 金叉 / 死叉检测}; +\node (b) [below=of a] {价格距 EMA 超过阈值?}; +\node (c) [below=of b] {EMA 斜率超过阈值?}; +\node (d) [below=of c] {周线 ADX 趋势强度与方向过滤}; +\node (e) [below=of d] {开仓(每交叉限最大笔数)}; +\node (f) [below=of e] {移动止损;反向信号平亏损单(已启用)}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e); \draw[->] (e)--(f);"""), + "RC": _fc("zh", "RC", r""" +\node (a) {RSI 超买 / 超卖穿越}; +\node (b) [below=of a] {EMA 斜率 + 价格距离过滤}; +\node (c) [below=of b] {交易时段白名单过滤}; +\node (d) [below=of c] {反向信号入场}; +\node (e) [below=of d] {RSI 目标位 / 移动止损出场}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "RM": _fc("zh", "RM", r""" +\node (a) [text width=7cm] {子策略路由(三选一)}; +\node (b) [below left=1.1cm and 2.8cm of a] {RSI Follow\\{\scriptsize 时段内顺势}}; +\node (c) [below=1.1cm of a] {RSI Reverse\\{\scriptsize 交叉反转}}; +\node (d) [below right=1.1cm and 2.8cm of a] {EMA Cross\\{\scriptsize 距离过滤}}; +\node (e) [below=1.6cm of c, text width=7.5cm] {独立持仓管理:时段外平仓 / 策略锁}; +\draw[->] (a)--(b); \draw[->] (a)--(c); \draw[->] (a)--(d); +\draw[->] (b)--(e); \draw[->] (c)--(e); \draw[->] (d)--(e);""", wide=True), + "RS_SCALP": _fc("zh", "RS_SCALP", r""" +\node (a) {新 K 线:更新 RSI}; +\node (b) [below=of a] {RSI 达到目标买 / 卖位?}; +\node (c) [below=of b] {BarsToWait 冷却等待}; +\node (d) [below=of c] {开仓 + 移动止损跟踪}; +\node (e) [below=of d] {反转逃离(ATR/RSI/实体)\\可选:反向信号平亏损单}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "SE": _fc("zh", "SE", r""" +\node (a) {EMA 快 / 中 / 慢多头排列?}; +\node (b) [below=of a] {CCI 进入超卖区回调}; +\node (c) [below=of b] {MACD 金叉确认}; +\node (d) [below=of c] {入场(单笔持仓限制)}; +\node (e) [below=of d] {CCI 零轴穿越或最大持仓 K 线退出}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "ST": _fc("zh", "ST", r""" +\node (a) {高周期扫描趋势线}; +\node (b) [below=of a] {价格触及趋势线(容差内)?}; +\node (c) [below=of b] {突破缓冲带确认方向}; +\node (d) [below=of c] {顺势开仓(多 / 空双向)}; +\node (e) [below=of d] {趋势线失效或反向突破平仓}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "RRA": _fc("zh", "RRA", r""" +\node (a) {亚洲时段 00:00--08:00 UTC}; +\node (b) [below=of a] {RSI 穿越超买 / 超卖极值}; +\node (c) [below=of b] {均值回归方向入场}; +\node (d) [below=of c] {RSI 回归中性或时段结束平仓}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d);"""), + "BUSTER": _fc("zh", "BUSTER", r""" +\node (a) {定义日内区间(开盘前固定时段)}; +\node (b) [below=of a] {区间宽度 $\geq$ 最小点数?}; +\node (c) [below=of b] {区间上下挂突破止损单(含缓冲)}; +\node (d) [below=of c] {成交后持仓管理}; +\node (e) [below=of d] {收盘前强制平仓}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), +} + +FLOW_EN = { + "DB": _fc("en", "DB", r""" +\node (a) {H1: scan BoxPeriod bars}; +\node (b) [below=of a] {High/low form Darvas box}; +\node (c) [below=of b] {Valid box? range $\leq$ threshold\\{\scriptsize else wait}}; +\node (d) [below=of c] {Trend MA slope + volume filter}; +\node (e) [below=of d] {Break above $\rightarrow$ Buy\\below $\rightarrow$ Sell}; +\node (f) [below=of e] {Fixed SL/TP management}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e); \draw[->] (e)--(f);"""), + "ES": _fc("en", "ES", r""" +\node (a) {EMA golden/death cross}; +\node (b) [below=of a] {Price distance $>$ threshold?}; +\node (c) [below=of b] {EMA slope $>$ threshold?}; +\node (d) [below=of c] {Weekly ADX filter}; +\node (e) [below=of d] {Entry (max trades per cross)}; +\node (f) [below=of e] {Trailing stop; close loss on reverse}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e); \draw[->] (e)--(f);"""), + "RC": _fc("en", "RC", r""" +\node (a) {RSI overbought/oversold cross}; +\node (b) [below=of a] {EMA slope + distance filter}; +\node (c) [below=of b] {Trading hours whitelist}; +\node (d) [below=of c] {Counter-signal entry}; +\node (e) [below=of d] {RSI target / trailing exit}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "RM": _fc("en", "RM", r""" +\node (a) [text width=7cm] {Sub-strategy router}; +\node (b) [below left=1.1cm and 2.8cm of a] {RSI Follow\\{\scriptsize intraday}}; +\node (c) [below=1.1cm of a] {RSI Reverse\\{\scriptsize reversal}}; +\node (d) [below right=1.1cm and 2.8cm of a] {EMA Cross\\{\scriptsize distance}}; +\node (e) [below=1.6cm of c, text width=7.5cm] {Close outside session / strategy lock}; +\draw[->] (a)--(b); \draw[->] (a)--(c); \draw[->] (a)--(d); +\draw[->] (b)--(e); \draw[->] (c)--(e); \draw[->] (d)--(e);""", wide=True), + "RS_SCALP": _fc("en", "RS_SCALP", r""" +\node (a) {New bar: update RSI}; +\node (b) [below=of a] {RSI hit buy/sell target?}; +\node (c) [below=of b] {BarsToWait cooldown}; +\node (d) [below=of c] {Entry + trailing stop}; +\node (e) [below=of d] {Reversal escape (ATR/RSI)\\optional: close on reverse}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "SE": _fc("en", "SE", r""" +\node (a) {EMA fast/mid/slow aligned?}; +\node (b) [below=of a] {CCI oversold pullback}; +\node (c) [below=of b] {MACD golden cross}; +\node (d) [below=of c] {Entry (one position)}; +\node (e) [below=of d] {CCI zero cross or max hold bars}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "ST": _fc("en", "ST", r""" +\node (a) {Higher TF trendline scan}; +\node (b) [below=of a] {Price touches line (tolerance)?}; +\node (c) [below=of b] {Breakout buffer confirmed}; +\node (d) [below=of c] {Trend entry long/short}; +\node (e) [below=of d] {Line break $\rightarrow$ close}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "RRA": _fc("en", "RRA", r""" +\node (a) {Asian session 00:00--08:00 UTC}; +\node (b) [below=of a] {RSI extreme cross}; +\node (c) [below=of b] {Mean-reversion entry}; +\node (d) [below=of c] {RSI neutral or session end}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d);"""), + "BUSTER": _fc("en", "BUSTER", r""" +\node (a) {Define intraday range (pre-open)}; +\node (b) [below=of a] {Range width $\geq$ minimum?}; +\node (c) [below=of b] {Breakout stop orders (buffer)}; +\node (d) [below=of c] {Position management}; +\node (e) [below=of d] {Force close before session end}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), +} + +FLOW_DE = { + "DB": _fc("de", "DB", r""" +\node (a) {H1: BoxPeriod Kerzen scannen}; +\node (b) [below=of a] {Hoch/Tief bilden Darvas-Box}; +\node (c) [below=of b] {Box g\"ultig? Range $\leq$ Abweichung\\{\scriptsize sonst warten}}; +\node (d) [below=of c] {Trend-MA-Steigung + Volumenfilter}; +\node (e) [below=of d] {Breakout oben $\rightarrow$ Buy\\unten $\rightarrow$ Sell}; +\node (f) [below=of e] {Feste SL/TP Verwaltung}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e); \draw[->] (e)--(f);"""), + "ES": _fc("de", "ES", r""" +\node (a) {EMA Golden/Death Cross}; +\node (b) [below=of a] {Preisabstand zu EMA $>$ Schwelle?}; +\node (c) [below=of b] {EMA-Steigung $>$ Schwelle?}; +\node (d) [below=of c] {W\"ochentlicher ADX-Filter}; +\node (e) [below=of d] {Einstieg (max. Trades pro Cross)}; +\node (f) [below=of e] {Trailing Stop; Verlust bei Gegensignal schlie\ss en}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e); \draw[->] (e)--(f);"""), + "RC": _fc("de", "RC", r""" +\node (a) {RSI \"Uberkauft/\"Uberverkauft Cross}; +\node (b) [below=of a] {EMA-Steigung + Abstandsfilter}; +\node (c) [below=of b] {Handelszeiten-Whitelist}; +\node (d) [below=of c] {Gegensignal-Einstieg}; +\node (e) [below=of d] {RSI-Ziel / Trailing Stop Ausstieg}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "RM": _fc("de", "RM", r""" +\node (a) [text width=7cm] {Sub-Strategie Router}; +\node (b) [below left=1.1cm and 2.8cm of a] {RSI Follow\\{\scriptsize intraday}}; +\node (c) [below=1.1cm of a] {RSI Reverse\\{\scriptsize Cross-Reversal}}; +\node (d) [below right=1.1cm and 2.8cm of a] {EMA Cross\\{\scriptsize Abstand}}; +\node (e) [below=1.6cm of c, text width=7.5cm] {Session-Ende schlie\ss en / Strategie-Lock}; +\draw[->] (a)--(b); \draw[->] (a)--(c); \draw[->] (a)--(d); +\draw[->] (b)--(e); \draw[->] (c)--(e); \draw[->] (d)--(e);""", wide=True), + "RS_SCALP": _fc("de", "RS_SCALP", r""" +\node (a) {Neue Kerze: RSI aktualisieren}; +\node (b) [below=of a] {RSI Ziel Buy/Sell erreicht?}; +\node (c) [below=of b] {BarsToWait Cooldown}; +\node (d) [below=of c] {Einstieg + Trailing Stop}; +\node (e) [below=of d] {Reversal Escape (ATR/RSI)\\optional: Verlust bei Gegensignal}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "SE": _fc("de", "SE", r""" +\node (a) {EMA schnell/mittel/langsam bullisch?}; +\node (b) [below=of a] {CCI \"Uberverkauft Pullback}; +\node (c) [below=of b] {MACD Golden Cross}; +\node (d) [below=of c] {Einstieg (eine Position)}; +\node (e) [below=of d] {CCI Null-Linie oder max. Haltedauer}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "ST": _fc("de", "ST", r""" +\node (a) {H\"oherer TF: Trendlinie scannen}; +\node (b) [below=of a] {Preis ber\"uhrt Linie (Toleranz)?}; +\node (c) [below=of b] {Breakout-Puffer best\"atigt}; +\node (d) [below=of c] {Trendfolge Long/Short}; +\node (e) [below=of d] {Linie bricht $\rightarrow$ schlie\ss en}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "RRA": _fc("de", "RRA", r""" +\node (a) {Asien-Session 00:00--08:00 UTC}; +\node (b) [below=of a] {RSI Extrem-Cross}; +\node (c) [below=of b] {Mean-Reversion Einstieg}; +\node (d) [below=of c] {RSI neutral oder Session-Ende}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d);"""), + "BUSTER": _fc("de", "BUSTER", r""" +\node (a) {Intraday-Range vor Er\"offnung}; +\node (b) [below=of a] {Range-Breite $\geq$ Minimum?}; +\node (c) [below=of b] {Breakout-Stop-Orders (Puffer)}; +\node (d) [below=of c] {Positionsverwaltung}; +\node (e) [below=of d] {Zwangsschluss vor Close}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), +} + +FLOW_AR = { + "DB": _fc("ar", "DB", r""" +\node (a) {مسح H1 لعدد BoxPeriod}; +\node (b) [below=of a] {حساب القمة/القاع وتكوين صندوق دارفاس}; +\node (c) [below=of b] {الصندوق صالح؟ النطاق $\leq$ العتبة\\{\scriptsize وإلا الانتظار}}; +\node (d) [below=of c] {فلتر ميل MA + حجم التداول}; +\node (e) [below=of d] {اختراق أعلى $\rightarrow$ شراء\\أسفل $\rightarrow$ بيع}; +\node (f) [below=of e] {إدارة SL/TP ثابتة}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e); \draw[->] (e)--(f);"""), + "ES": _fc("ar", "ES", r""" +\node (a) {كشف تقاطع EMA الذهبي/الموت}; +\node (b) [below=of a] {المسافة عن EMA $>$ العتبة؟}; +\node (c) [below=of b] {ميل EMA $>$ العتبة؟}; +\node (d) [below=of c] {فلتر ADX الأسبوعي}; +\node (e) [below=of d] {دخول (حد أقصى لكل تقاطع)}; +\node (f) [below=of e] {وقف متحرك؛ إغلاق الخسارة عند إشارة عكسية}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e); \draw[->] (e)--(f);"""), + "RC": _fc("ar", "RC", r""" +\node (a) {عبور RSI تشبع شراء/بيع}; +\node (b) [below=of a] {ميل EMA + فلتر المسافة}; +\node (c) [below=of b] {فلتر أوقات التداول}; +\node (d) [below=of c] {دخول بإشارة عكسية}; +\node (e) [below=of d] {هدف RSI / وقف متحرك}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "RM": _fc("ar", "RM", r""" +\node (a) [text width=7cm] {موجّه الاستراتيجيات الفرعية}; +\node (b) [below left=1.1cm and 2.5cm of a] {RSI Follow\\{\scriptsize داخل الجلسة}}; +\node (c) [below=1.1cm of a] {RSI Reverse\\{\scriptsize انعكاس}}; +\node (d) [below right=1.1cm and 2.5cm of a] {EMA Cross\\{\scriptsize مسافة}}; +\node (e) [below=1.6cm of c, text width=7.5cm] {إغلاق خارج الجلسة / قفل الاستراتيجية}; +\draw[->] (a)--(b); \draw[->] (a)--(c); \draw[->] (a)--(d); +\draw[->] (b)--(e); \draw[->] (c)--(e); \draw[->] (d)--(e);""", wide=True), + "RS_SCALP": _fc("ar", "RS_SCALP", r""" +\node (a) {شمعة جديدة: تحديث RSI}; +\node (b) [below=of a] {RSI وصل هدف الشراء/البيع؟}; +\node (c) [below=of b] {انتظار BarsToWait}; +\node (d) [below=of c] {دخول + وقف متحرك}; +\node (e) [below=of d] {هروب انعكاسي (ATR/RSI)\\اختياري: إغلاق عند إشارة عكسية}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "SE": _fc("ar", "SE", r""" +\node (a) {تراص EMA سريع/متوسط/بطيء صاعد؟}; +\node (b) [below=of a] {تراجع CCI من تشبع بيع}; +\node (c) [below=of b] {تأكيد MACD ذهبي}; +\node (d) [below=of c] {دخول (صفقة واحدة)}; +\node (e) [below=of d] {عبور CCI صفر أو حد زمني}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "ST": _fc("ar", "ST", r""" +\node (a) {مسح خط الاتجاه بإطار أعلى}; +\node (b) [below=of a] {السعر يلامس الخط (ضمن التسامح)؟}; +\node (c) [below=of b] {تأكيد كسر الحاجز}; +\node (d) [below=of c] {دخول مع الاتجاه (شراء/بيع)}; +\node (e) [below=of d] {كسر عكسي $\rightarrow$ إغلاق}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), + "RRA": _fc("ar", "RRA", r""" +\node (a) {جلسة آسيا 00:00--08:00 UTC}; +\node (b) [below=of a] {عبور RSI للنقاط القصوى}; +\node (c) [below=of b] {دخول ارتداد للمتوسط}; +\node (d) [below=of c] {RSI محايد أو نهاية الجلسة}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d);"""), + "BUSTER": _fc("ar", "BUSTER", r""" +\node (a) {تحديد نطاق اليوم قبل الافتتاح}; +\node (b) [below=of a] {عرض النطاق $\geq$ الحد الأدنى؟}; +\node (c) [below=of b] {أوامر كسر مع حاجز}; +\node (d) [below=of c] {إدارة المركز}; +\node (e) [below=of d] {إغلاق إجباري قبل الإقفال}; +\draw[->] (a)--(b); \draw[->] (b)--(c); \draw[->] (c)--(d); \draw[->] (d)--(e);"""), +} + +_COMMON_PKGS = [ + r"\usepackage{graphicx}", + r"\usepackage{booktabs}", + r"\usepackage{geometry}", + r"\usepackage{float}", + r"\usepackage{subcaption}", + r"\usepackage{tikz}", + r"\usetikzlibrary{arrows.meta, positioning}", + r"\usepackage{hyperref}", + r"\usepackage{xcolor}", + r"\geometry{margin=2cm}", +] + +LOCALES: dict[str, Locale] = { + "zh": Locale( + code="zh", + tex_stem="managed_account_brochure", + pdf_name="ManagedAccount_Brochure.pdf", + preamble=[r"\documentclass[11pt,a4paper]{ctexart}"] + _COMMON_PKGS, + title=r"UnitedEA 智能交易集群\\代客理财产品介绍 · 业绩与策略逻辑", + author=r"Namelos.xyz Research · MetaTrader\,5 策略测试器回测", + abstract_tpl=( + r"本报告基于 MT5 客户端本地回测(2023.07--2026.06,初始资金 \${deposit:,.0f},杠杆 1:1000," + r"余额复利缩放),展示 19 个生产子策略的独立净值曲线与组合表现。" + r"近三年回测中,\textbf{{{n_prof}/19}} 个子策略净盈利为正,\textbf{{{n_pf1}/19}} 个盈利因子 $\geq 1$。" + r"过往业绩不代表未来收益。" + ), + s1_title="产品介绍", + s1_body="UnitedEA 是一套多策略 MetaTrader\\,5 智能交易集群,通过在同一账户并行运行 " + "19 个经独立优化、低相关性子机器人,实现跨品种风险分散。", + s1_1_title="服务模式(代客理财)", + s1_1_items=[ + r"\textbf{全权委托执行}:策略信号自动下单,无需人工干预", + r"\textbf{组合风控}:统一资金调度、动态手数缩放(基准余额 \$3,000)", + r"\textbf{定期审计}:手数遗传优化、信号替换 A/B 测试、禁用策略筛查", + r"\textbf{建议起始资金}:不低于 \$3,000,与系统参考余额一致", + ], + s1_2_title="回测设置", + table_headers=("项目", "设置"), + table_rows=[ + ("回测区间", "2023.07.01 -- 2026.06.01"), + ("初始资金", r"\$3,000"), + ("杠杆", "1:1000"), + ("测试模型", "1 分钟 OHLC"), + ("组合调度品种", "NAS100 H1"), + ("数据来源", "MT5 本地终端数据目录"), + ], + s2_title="组合净值曲线", + s2_body_tpl="下图展示 19 个子策略同时运行时的组合净值(对数坐标)。" + "组合盈利因子 \\textbf{{{pf}}},夏普比率 \\textbf{{{sharpe}}},总交易 \\textbf{{{trades}}} 笔。", + s2_caption="UnitedEA 19 策略组合净值曲线(2023.07--2026.06)", + s3_title="各子机器人独立净值曲线", + s3_body="以下每个子策略在\\textbf{单独启用}、优化手数下运行三年回测。" + "所有曲线均从 \\$3,000 起步;虚线为初始资金参考线。" + "\\textbf{全部 19 个机器人在三年期内均实现正净盈利。}", + s4_title="各机器人业绩汇总", + s4_caption="19 个子策略三年独立回测业绩", + table_cols="代码 & 策略 & 品种 & PF & 净盈利(\\$) & 夏普 & 交易数", + s5_title="各机器人底层逻辑流程图", + s5_body=r"以下流程图概括各子策略的核心决策链路(与 \texttt{Strategies/} 源码一致)。", + close_note=r"\noindent\textit{注:该策略已启用「反向信号平亏损单」优化。}", + s6_title="后续策略调整", + s6_items=[ + r"\textbf{手数}:已完成逐策略遗传优化,US30 降至 0.02 控制回撤", + r"\textbf{信号平仓}:仅 ES、RS\_XAUUSD、RS\_US30 开启;其余保持关闭", + r"\textbf{观察名单}:SE(PF 偏低)、亚式 AUD/GBP 维持最小手数", + r"\textbf{风控}:计划引入组合层面 20\% 回撤熔断与黄金集中度上限", + ], + disclaimer="本文件基于历史回测,不构成投资建议。外汇及差价合约交易存在高风险,可能损失全部本金。", + equity_ylabel="净值 (USD)", + equity_combined_title="UnitedEA 19策略组合净值 (2023.07–2026.06)", + caption_pf_net_sharpe=("PF", "净盈利", "夏普"), + flowcharts=FLOW_ZH, + ), + "de": Locale( + code="de", + tex_stem="managed_account_brochure_de", + pdf_name="ManagedAccount_Brochure_DE.pdf", + preamble=[ + r"\documentclass[11pt,a4paper]{article}", + r"\usepackage{fontspec}", + r"\usepackage{polyglossia}", + r"\setdefaultlanguage{german}", + r"\setmainfont{TeX Gyre Termes}", + ] + _COMMON_PKGS, + title=r"UnitedEA Multi-Strategie-Cluster\\Verm\"ogensverwaltung · Performance \& Logik", + author=r"Namelos.xyz Research · MetaTrader\,5 Strategietester", + abstract_tpl=( + r"Dieser Bericht basiert auf lokalen MT5-Backtests (07/2023--06/2026, Startkapital \${deposit:,.0f}, " + r"Hebel 1:1000, skalierte Lots). Er zeigt Eigenkapitalkurven von 19 Produktions-Substrategien und dem Portfolio. " + r"In drei Jahren erzielten \textbf{{{n_prof}/19}} Strategien positiven Nettogewinn, \textbf{{{n_pf1}/19}} haben Profit Factor $\geq 1$. " + r"Vergangene Ergebnisse garantieren keine zuk\"unftigen Renditen." + ), + s1_title="Produkt\"ubersicht", + s1_body="UnitedEA ist ein Multi-Strategie-Expert-Advisor-Cluster auf MetaTrader\\,5. " + "19 unabh\"angig optimierte, wenig korrelierte Roboter laufen parallel auf einem Konto zur Risikostreuung.", + s1_1_title="Service-Modell (Verm\"ogensverwaltung)", + s1_1_items=[ + r"\textbf{Vollautomatisch}: Signale werden ohne manuelles Eingreifen ausgef\"uhrt", + r"\textbf{Portfolio-Risiko}: Einheitliches Kapitalmanagement, dynamische Lots (Referenz \$3.000)", + r"\textbf{Regelm\"a\ssige Audits}: Lot-Optimierung, A/B-Tests f\"ur Signal-Ersetzung", + r"\textbf{Empfohlenes Startkapital}: mindestens \$3.000", + ], + s1_2_title="Backtest-Einstellungen", + table_headers=("Parameter", "Wert"), + table_rows=[ + ("Zeitraum", "2023.07.01 -- 2026.06.01"), + ("Startkapital", r"\$3.000"), + ("Hebel", "1:1000"), + ("Modell", "1-Minuten-OHLC"), + ("Portfolio-Symbol", "NAS100 H1"), + ("Datenquelle", "Lokales MT5-Terminal"), + ], + s2_title="Portfolio-Eigenkapitalkurve", + s2_body_tpl="Kombinierte Eigenkapitalkurve von 19 Strategien (logarithmische Skala). " + "Profit Factor \\textbf{{{pf}}}, Sharpe \\textbf{{{sharpe}}}, Trades \\textbf{{{trades}}}.", + s2_caption="UnitedEA 19-Strategien-Portfolio (07/2023--06/2026)", + s3_title="Einzelne Roboter-Eigenkapitalkurven", + s3_body="Jede Substrategie einzeln aktiviert, optimierte Lots, drei Jahre Backtest. " + "Start bei \\$3.000; gestrichelte Linie = Referenz. " + "\\textbf{Alle 19 Roboter mit positivem Nettogewinn.}", + s4_title="Leistungs\"ubersicht", + s4_caption="Drei-Jahres-Solo-Backtests der 19 Strategien", + table_cols="Code & Strategie & Symbol & PF & Netto (\$) & Sharpe & Trades", + s5_title="Logik-Flowcharts", + s5_body="Kernentscheidungslogik jeder Substrategie (entspricht \\texttt{Strategies/}-Quellcode).", + close_note=r"\noindent\textit{Hinweis: Verlustschlie\ssung bei Gegensignal ist aktiviert.}", + s6_title="Geplante Anpassungen", + s6_items=[ + r"\textbf{Lots}: Genetische Optimierung abgeschlossen; US30 auf 0{,}02 reduziert", + r"\textbf{Signal-Close}: nur ES, RS\_XAUUSD, RS\_US30 aktiv", + r"\textbf{Beobachtung}: SE (niedriger PF); Asian AUD/GBP minimale Lots", + r"\textbf{Risiko}: Portfolio-Drawdown-Circuit-Breaker 20\% geplant", + ], + disclaimer="Historische Backtests, keine Anlageberatung. Forex/CFD mit hohem Verlustrisiko.", + equity_ylabel="Eigenkapital (USD)", + equity_combined_title="UnitedEA 19-Strategien Portfolio (2023.07--2026.06)", + caption_pf_net_sharpe=("PF", "Netto", "Sharpe"), + flowcharts=FLOW_DE, + ), + "ar": Locale( + code="ar", + tex_stem="managed_account_brochure_ar", + pdf_name="ManagedAccount_Brochure_AR.pdf", + preamble=[ + r"\documentclass[11pt,a4paper]{article}", + r"\usepackage{fontspec}", + r"\usepackage{polyglossia}", + r"\setdefaultlanguage{arabic}", + r"\setotherlanguage{english}", + r"\newfontfamily\arabicfont[Script=Arabic]{Arial}", + r"\newfontfamily\arabicfontsf[Script=Arabic]{Arial}", + ] + _COMMON_PKGS, + title=r"مجموعة UnitedEA للتداول الآلي\\إدارة محافظ · الأداء ومنطق الاستراتيجيات", + author=r"Namelos.xyz Research · اختبار MT5", + abstract_tpl=( + r"يعتمد هذا التقرير على اختبار MT5 المحلي (07/2023--06/2026، رأس مال \${deposit:,.0f}، " + r"رافعة 1:1000، تحجيم اللوت). يعرض منحنيات 19 استراتيجية فرعية والمحفظة المجمّعة. " + r"خلال ثلاث سنوات، \textbf{{{n_prof}/19}} استراتيجية بربح صافٍ موجب، \textbf{{{n_pf1}/19}} بعامل ربح $\geq 1$. " + r"الأداء السابق لا يضمن النتائج المستقبلية." + ), + s1_title="نظرة على المنتج", + s1_body="UnitedEA هو عنقود مستشار خبير متعدد الاستراتيجيات على MetaTrader\\,5. " + "يعمل 19 روبوتاً محسّناً ومستقلاً بالتوازي لتوزيع المخاطر عبر الأصول.", + s1_1_title="نموذج الخدمة (إدارة المحافظ)", + s1_1_items=[ + r"\textbf{تنفيذ آلي كامل}: إشارات تُنفَّذ دون تدخل يدوي", + r"\textbf{مخاطر المحفظة}: إدارة موحّدة للرأسمال، تحجيم ديناميكي للوت (مرجع 3{,}000\$)", + r"\textbf{تدقيق دوري}: تحسين اللوت، اختبارات A/B لإشارات الإغلاق", + r"\textbf{رأس مال مقترح}: 3{,}000\$ كحد أدنى", + ], + s1_2_title="إعدادات الاختبار", + table_headers=("البند", "القيمة"), + table_rows=[ + ("الفترة", "2023.07.01 -- 2026.06.01"), + ("رأس المال", r"\$3.000"), + ("الرافعة", "1:1000"), + ("النموذج", "OHLC دقيقة واحدة"), + ("رمز المحفظة", "NAS100 H1"), + ("مصدر البيانات", "مجلد بيانات MT5 المحلي"), + ], + s2_title="منحنى محفظة مجمّعة", + s2_body_tpl="منحنى رأس المال لـ 19 استراتيجية (مقياس لوغاريتمي). " + "عامل الربح \\textbf{{{pf}}}، شارب \\textbf{{{sharpe}}}، الصفقات \\textbf{{{trades}}}.", + s2_caption="محفظة UnitedEA — 19 استراتيجية (07/2023--06/2026)", + s3_title="منحنيات الروبوتات المنفردة", + s3_body="كل استراتيجية فرعية مفعّلة منفردة، لوت محسّن، اختبار ثلاث سنوات. " + "البداية من 3{,}000\$؛ الخط المتقطع = مرجع. " + "\\textbf{الـ 19 روبوتاً جميعها بربح صافٍ موجب.}", + s4_title="ملخص الأداء", + s4_caption="اختبارات منفردة لثلاث سنوات — 19 استراتيجية", + table_cols="الرمز & الاستراتيجية & الأصل & PF & صافي (\$) & شارب & صفقات", + s5_title="مخططات منطق الاستراتيجيات", + s5_body="ملخص مسار القرار لكل استراتيجية. المخططات بالإنجليزية لضمان عرض صحيح في TikZ.", + close_note=r"\noindent\textbf{ملاحظة:} إغلاق الخسارة عند إشارة عكسية مفعّل لهذه الاستراتيجية.", + s6_title="التعديلات المخططة", + s6_items=[ + r"\textbf{اللوت}: تحسين وراثي؛ US30 خُفّض إلى 0{,}02", + r"\textbf{إغلاق الإشارة}: ES و RS\_XAUUSD و RS\_US30 فقط", + r"\textbf{مراقبة}: SE (PF منخفض); Asian AUD/GBP أقل لوت", + r"\textbf{مخاطر}: قاطع سحب 20\% على مستوى المحفظة", + ], + disclaimer="اختبار تاريخي وليس نصيحة استثمارية. تداول الفوركس والعقود عالي المخاطر.", + equity_ylabel="رأس المال (USD)", + equity_combined_title="UnitedEA 19 استراتيجية (2023.07--2026.06)", + caption_pf_net_sharpe=("PF", "صافي", "شارب"), + flowcharts=FLOW_EN, + rtl=True, + ), +} + +FLOW_KEY = { + "RS_NVDA": "RS_SCALP", "RS_TSLA": "RS_SCALP", "RS_BTCUSD": "RS_SCALP", + "RS_XAUUSD": "RS_SCALP", "RS_NAS100": "RS_SCALP", "RS_US30": "RS_SCALP", + "ST_BTC": "ST", "ST_XAU": "ST", + "RRA_AUD": "RRA", "RRA_GBP": "RRA", + "UB": "BUSTER", "GB": "BUSTER", "U5B": "BUSTER", "UKB": "BUSTER", +} + + +def flowchart_for(sid: str, loc: Locale) -> str: + key = FLOW_KEY.get(sid, sid) + return loc.flowcharts.get(key, loc.flowcharts.get(sid, r"\textit{---}")) diff --git a/frontline/cluster-latest/reports/cluster_evaluation.tex b/frontline/cluster-latest/reports/cluster_evaluation.tex new file mode 100644 index 0000000..d7b167d --- /dev/null +++ b/frontline/cluster-latest/reports/cluster_evaluation.tex @@ -0,0 +1,221 @@ + +\documentclass[11pt,a4paper]{ctexart} +\usepackage{graphicx} +\usepackage{booktabs} +\usepackage{geometry} +\usepackage{float} +\usepackage{caption} +\usepackage{subcaption} +\usepackage{hyperref} +\usepackage{xcolor} +\geometry{margin=2.2cm} +\title{UnitedEA 集群回测综合评估报告\\ \large 2023.07 -- 2026.06 · 逐月诊断 · 回撤期 K 线对比} +\author{自动生成 · cluster-latest/main.mq5} +\date{\today} + +\begin{document} +\maketitle +\tableofcontents +\newpage + + \section{执行摘要} + 本报告基于 MT5 策略测试器 HTML 报告(初始资金 \$3,000,杠杆 1:1000,余额复利缩放)对 UnitedEA 集群进行逐机器人、逐月、回撤期市场结构分析。 + + \begin{table}[H] + \centering + \caption{组合层面关键指标} + \begin{tabular}{lr} + \toprule + 指标 & 数值 \\ + \midrule + 总净盈利 & 3,647,628 USD \\ + 盈利因子 & 1.21 \\ + 夏普比率 & 2.70 \\ + 最大净值回撤 & 48.89\% \\ + 总交易笔数 & 11,669 \\ + 胜率 & 44.95\% \\ + \bottomrule + \end{tabular} + \end{table} + + \textbf{核心结论:} + \begin{itemize} + \item 利润高度集中于 XAUUSD 上的 RM EMA Cross、RSI Scalping XAU、RSI Consolidation;名义多品种分散,实际为黄金 beta 集群。 + \item 2025 末至 2026 初复利手数放大后,收益与回撤同步膨胀;评估 edge 需配合固定手数对照。 + \item SimpleTrendline 为\textbf{对冲型}(多空双向),整体虽亏但分方向与品种后可能仍有价值,不宜简单一刀切关闭。 + \item 最大回撤期 XAUUSD 呈现更高 ATR、更低 ADX(震荡/假突破增多),趋势型与突破型策略易共振亏损。 + \end{itemize} + + \section{组合曲线与回撤} + \begin{figure}[H] + \centering + \includegraphics[width=0.95\textwidth]{figures/equity_drawdown.pdf} + \caption{净值曲线与回撤百分比} + \end{figure} + + \begin{table}[H] + \centering + \caption{主要回撤 episode(Top 5)} + \begin{tabular}{clllrr} + \toprule + \# & 起始 & 谷底 & 恢复 & 深度(USD) & 深度(\%) \\ + \midrule + 1 & 2026-04-15 & 2026-04-27 & 2026-05-12 & 779,365 & 18.0\% \\ +2 & 2026-05-14 & 2026-06-01 & 2026-06-03 & 751,277 & 17.1\% \\ +3 & 2026-03-24 & 2026-03-31 & 2026-04-06 & 530,292 & 15.9\% \\ +4 & 2026-02-02 & 2026-02-02 & 2026-02-18 & 463,122 & 25.5\% \\ +5 & 2026-02-25 & 2026-02-26 & 2026-03-03 & 425,597 & 21.4\% \\ + \bottomrule + \end{tabular} + \end{table} + + \section{逐机器人月度热力与累计贡献} + \begin{figure}[H] + \centering + \includegraphics[width=0.98\textwidth]{figures/monthly_heatmap.pdf} + \caption{各机器人逐月净利润热力图(USD)} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.85\textwidth]{figures/strategy_contribution.pdf} + \caption{各机器人累计净利润贡献} + \end{figure} + + \section{SimpleTrendline:对冲型专项分析} + SimpleTrendline 基于高周期 MA 交叉趋势线,\textbf{多空双向}触发,设计目标是对冲而非单边趋势押注。 + 回测合计 -656,869 USD,但 2026 年在黄金高位剧烈震荡中大幅回撤。 + + \begin{figure}[H] + \centering + \includegraphics[width=0.95\textwidth]{figures/st_long_short_monthly.pdf} + \caption{SimpleTrendline 多空方向逐月 P/L 分解} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.95\textwidth]{figures/st_by_symbol_monthly.pdf} + \caption{SimpleTrendline 分品种(XAU/GER/BTC)逐月 P/L} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.98\textwidth]{figures/top6_monthly.pdf} + \caption{核心六机器人逐月 P/L 明细} + \end{figure} + + \textbf{建议:}保留策略框架,但 (1) 在 ADX>40 且 ATR 分位>0\% 的强趋势月减少逆势侧仓位; + (2) 与 RM/RCO 等同向 exposure 设上限;(3) 2026 类高位宽幅震荡月单独降 LOT。 + + \section{回撤期 vs 平稳期:XAUUSD H1 市场结构} + 从 MT5 拉取 XAUUSD H1。回撤窗口取 Top3 drawdown episode(2026-03, 2026-04, 2026-05, 2026-06),对照期为 2024-03 至 2024-09 平稳盈利段。 + + \begin{table}[H] + \centering + \caption{市场特征对比(亏损月 vs 对照月)} + \begin{tabular}{lrr} + \toprule + 特征 & 亏损月均值 & 对照月均值 \\ + \midrule + ADX(14) & 40.2 & 37.7 \\ + ATR\% & 0.50 & 0.27 \\ + 日收益波动(chop) & 1.60 & 0.88 \\ + EMA20-50 斜率\% & -0.109 & 0.113 \\ + \bottomrule + \end{tabular} + \end{table} + + \begin{figure}[H] + \centering + \begin{subfigure}{0.48\textwidth} + \includegraphics[width=\textwidth]{figures/xau_dd_candles.pdf} + \caption{回撤谷底附近 K 线 + EMA} + \end{subfigure} + \hfill + \begin{subfigure}{0.48\textwidth} + \includegraphics[width=\textwidth]{figures/xau_calm_candles.pdf} + \caption{盈利平稳期 K 线 + EMA} + \end{subfigure} + \caption{XAUUSD H1 形态对比} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.95\textwidth]{figures/xau_regime_monthly.pdf} + \caption{XAUUSD 逐月 ADX / ATR\% 与组合月度 P/L 对照} + \end{figure} + + \section{各机器人逐月问题诊断} + \subsubsection{RM MidPoint EMA Cross} +累计净利润 \textbf{2,306,490} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-02 单月亏损 -27,934 USD\end{itemize} +\subsubsection{RSI Scalping XAUUSD} +累计净利润 \textbf{802,667} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-03 单月亏损 -8,347 USD\item 月度波动大,手数复利放大后尾部风险显著\end{itemize} +\subsubsection{RSI Consolidation} +累计净利润 \textbf{713,392} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-02 单月亏损 -183,752 USD\end{itemize} +\subsubsection{RSI Scalping BTCUSD} +累计净利润 \textbf{316,609} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2025-01 单月亏损 -4,375 USD\item 月度波动大,手数复利放大后尾部风险显著\end{itemize} +\subsubsection{RM MidPoint RSI Follow} +累计净利润 \textbf{162,787} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-04 单月亏损 -362,412 USD\item 亏损月份 (25) 多于盈利月份 (11)\item 近 3 个月转弱,存在 regime change 迹象\end{itemize} +\subsubsection{SuperEMA} +累计净利润 \textbf{70,153} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-04 单月亏损 -291,986 USD\item 近 3 个月转弱,存在 regime change 迹象\end{itemize} +\subsubsection{RM MidPoint RSI Reverse} +累计净利润 \textbf{61,533} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-03 单月亏损 -51,238 USD\item 近 3 个月转弱,存在 regime change 迹象\end{itemize} +\subsubsection{RSI CrossOver Reversal} +累计净利润 \textbf{59,250} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-05 单月亏损 -42,049 USD\end{itemize} +\subsubsection{RSI Scalping TSLA} +累计净利润 \textbf{56,541} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-03 单月亏损 -17,900 USD\item 月度波动大,手数复利放大后尾部风险显著\item 近 3 个月转弱,存在 regime change 迹象\end{itemize} +\subsubsection{RSI Asian AUDUSD} +累计净利润 \textbf{37,210} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-05 单月亏损 -11,600 USD\end{itemize} +\subsubsection{Darvas Box} +累计净利润 \textbf{20,743} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-05 单月亏损 -23,932 USD\item 亏损月份 (18) 多于盈利月份 (12)\item 近 3 个月转弱,存在 regime change 迹象\end{itemize} +\subsubsection{EMA Slope Distance} +累计净利润 \textbf{17,148} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-04 单月亏损 -59,622 USD\item 近 3 个月转弱,存在 regime change 迹象\end{itemize} +\subsubsection{RSI Scalping NVDA} +累计净利润 \textbf{8,626} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-01 单月亏损 -13,562 USD\item 月度波动大,手数复利放大后尾部风险显著\end{itemize} +\subsubsection{USDJPY Buster} +累计净利润 \textbf{-1,029} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-05 单月亏损 -131,163 USD\end{itemize} +\subsubsection{RSI Scalping AAPL} +累计净利润 \textbf{-3,632} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-01 单月亏损 -4,760 USD\item 亏损月份 (19) 多于盈利月份 (16)\item 月度波动大,手数复利放大后尾部风险显著\end{itemize} +\subsubsection{RSI Asian EURUSD} +累计净利润 \textbf{-11,874} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-04 单月亏损 -13,390 USD\end{itemize} +\subsubsection{SimpleTrendline} +累计净利润 \textbf{-656,869} USD。\par\noindent\textbf{逐月问题:}\begin{itemize}\setlength\itemsep{2pt} +\item 2026-05 单月亏损 -570,029 USD\item 亏损月份 (19) 多于盈利月份 (17)\item 对冲型策略:多空均有信号,需分方向评估而非整体关停\end{itemize} + + \section{分品种月度 P/L} + \begin{figure}[H] + \centering + \includegraphics[width=0.95\textwidth]{figures/symbol_monthly.pdf} + \caption{主要交易品种逐月净利润} + \end{figure} + + \section{改进路线图} + \begin{enumerate} + \item \textbf{P0 风控:}设置 ORCH\_MaxBalanceScale 上限、每机器人 max lot cap;XAUUSD 总 exposure 上限。 + \item \textbf{P1 精简:}关闭 RRA EURUSD、RS AAPL;SuperEMA 降权;RS NVDA 观察。 + \item \textbf{P2 SimpleTrendline:}分方向/分品种调参,震荡月(低 ADX + 高 ATR)减半 LOT,勿整体删除。 + \item \textbf{P3 验证:}固定手数复测 2023--2026;Walk-forward 2026 Q1 作为 OOS。 + \item \textbf{P4 监控:}月度 dashboard 跟踪 RM EMA Cross 与 ST 多空比、ADX 过滤命中率。 + \end{enumerate} + + \appendix + \section{数据来源} + 报告 HTML: ReportTester-*.html;K 线: MT5 XAUUSD H1;成交归因基于 order comment FIFO。 + +\end{document} diff --git a/frontline/cluster-latest/reports/generate_evaluation.py b/frontline/cluster-latest/reports/generate_evaluation.py new file mode 100644 index 0000000..78d5e14 --- /dev/null +++ b/frontline/cluster-latest/reports/generate_evaluation.py @@ -0,0 +1,772 @@ +#!/usr/bin/env python3 +"""Generate cluster backtest evaluation: charts + LaTeX PDF.""" +from __future__ import annotations + +import json +import re +import subprocess +import textwrap +from collections import defaultdict +from dataclasses import dataclass +from datetime import datetime +from html import unescape +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.dates as mdates +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd +from matplotlib.patches import Rectangle + +ROOT = Path(__file__).resolve().parent + + +def _find_tester_report() -> Path: + """Locate MT5 Strategy Tester HTML (ReportTester-*.html) in cluster-latest.""" + candidates = sorted(ROOT.parent.glob("ReportTester*.html"), key=lambda p: p.stat().st_mtime, reverse=True) + if not candidates: + raise FileNotFoundError( + "No ReportTester*.html found. Export from MT5 Strategy Tester into frontline/cluster-latest/" + ) + return candidates[0] + + +REPORT_HTML = _find_tester_report() +FIG_DIR = ROOT / "figures" +DATA_DIR = ROOT / "data" +TEX_FILE = ROOT / "cluster_evaluation.tex" + +plt.rcParams.update({ + "figure.dpi": 150, + "savefig.dpi": 150, + "font.size": 9, + "axes.titlesize": 10, + "axes.labelsize": 9, +}) + +STRATEGY_META = { + "RM_EMA_Cross": {"name": "RM MidPoint EMA Cross", "group": "gold_core", "type": "trend"}, + "RM_RSI_Follow": {"name": "RM MidPoint RSI Follow", "group": "gold_core", "type": "trend"}, + "RM_RSI_Reverse": {"name": "RM MidPoint RSI Reverse", "group": "gold_core", "type": "mean_rev"}, + "RS_XAUUSD": {"name": "RSI Scalping XAUUSD", "group": "gold_core", "type": "scalp"}, + "RCO_RSIConsolidation": {"name": "RSI Consolidation", "group": "gold_core", "type": "range"}, + "RS_BTCUSD": {"name": "RSI Scalping BTCUSD", "group": "crypto", "type": "scalp"}, + "RS_TSLA": {"name": "RSI Scalping TSLA", "group": "equity", "type": "scalp"}, + "RS_NVDA": {"name": "RSI Scalping NVDA", "group": "equity", "type": "scalp"}, + "RS_APPL": {"name": "RSI Scalping AAPL", "group": "equity", "type": "scalp"}, + "RC_RSICrossOver": {"name": "RSI CrossOver Reversal", "group": "gold_core", "type": "reversal"}, + "SE_SuperEMA": {"name": "SuperEMA", "group": "gold_core", "type": "trend"}, + "DB_DarvasBox": {"name": "Darvas Box", "group": "gold_core", "type": "breakout"}, + "ES_EMASlope": {"name": "EMA Slope Distance", "group": "gold_core", "type": "trend"}, + "ST_SimpleTrendline": {"name": "SimpleTrendline", "group": "multi", "type": "hedge"}, + "RRA_EURUSD": {"name": "RSI Asian EURUSD", "group": "fx", "type": "session"}, + "RRA_AUDUSD": {"name": "RSI Asian AUDUSD", "group": "fx", "type": "session"}, + "UB_USDJPY": {"name": "USDJPY Buster", "group": "fx", "type": "breakout"}, +} + + +def classify_comment(c: str, symbol: str = "") -> str | None: + c = c.strip() + if not c: + return None + cl = c.lower() + if "darvas" in cl: + return "DB_DarvasBox" + if "ema cross distance" in cl: + return "ES_EMASlope" + if "ema crossover trade" in cl: + return "RM_EMA_Cross" + if c in ("Buy Order", "Sell Order"): + return "RC_RSICrossOver" + if "united superema" in cl: + return "SE_SuperEMA" + if "rsiconsolidation" in cl.replace(" ", ""): + return "RCO_RSIConsolidation" + if "simpletrendline" in cl.replace(" ", ""): + return "ST_SimpleTrendline" + if "rsi overbought crossover" in cl or "rsi oversold crossover" in cl: + return "RRA_EURUSD" if "EUR" in symbol else "RRA_AUDUSD" if "AUD" in symbol else "RRA_Asian" + if c.startswith("UB range"): + return "UB_USDJPY" + if "rsi follow" in cl: + return "RM_RSI_Follow" + if "rsi reverse" in cl: + return "RM_RSI_Reverse" + if "rsi scalping" in cl: + sym_map = { + "AAPL.NAS": "RS_APPL", "ADBE.NAS": "RS_ADBE", "BTCUSD": "RS_BTCUSD", + "NVDA.NAS": "RS_NVDA", "TSLA.NAS": "RS_TSLA", "XAUUSD": "RS_XAUUSD", "MU.NAS": "RS_MU", + } + return sym_map.get(symbol, f"RS_{symbol}") + if c.startswith("sl ") or c.startswith("tp ") or c == "end of test": + return None + return None + + +def st_side(comment: str) -> str | None: + cl = comment.lower().replace(" ", "") + if "simpletrendlinebuy" in cl: + return "long" + if "simpletrendlinesell" in cl: + return "short" + return None + + +def parse_num(s: str) -> float: + s = s.strip().replace(" ", "").replace(",", "") + if not s: + return 0.0 + if s.endswith("K"): + return float(s[:-1]) * 1000 + return float(s) + + +def parse_deals(html: str) -> list[dict]: + marker = '
成交
' + start = html.find(marker) + sub = html[start:] if start >= 0 else html + row_re = re.compile( + r"align=right>([^<]*)(\d+)([^<]*)([^<]*)" + r"([^<]*)([^<]*)([^<]*)(\d+)([^<]*)" + r"([^<]*)([^<]*)([^<]*)([^<]*)", + re.I, + ) + open_map: dict[str, str] = {} + open_side: dict[str, str] = {} + open_stack: dict[str, list[tuple[str, str, str | None]]] = defaultdict(list) + deals = [] + + for row in row_re.findall(sub): + time_s, _did, symbol, typ, direction, _vol, _price, order, comm, swap, profit, balance, comment = row + if typ.strip().lower() == "balance": + continue + net = parse_num(profit) + parse_num(comm) + parse_num(swap) + comment = unescape(comment.strip()) + symbol = symbol.strip() + direction = direction.strip().lower() + strategy = classify_comment(comment, symbol) + side = st_side(comment) if strategy == "ST_SimpleTrendline" else None + + if direction == "in": + if strategy: + open_map[order] = strategy + if side: + open_side[order] = side + open_stack[symbol].append((order, strategy, side)) + continue + if direction != "out": + continue + + if strategy is None: + if open_stack[symbol]: + _o, strategy, side = open_stack[symbol].pop(0) + elif order in open_map: + strategy = open_map[order] + side = open_side.get(order) + else: + strategy = "UNATTRIBUTED" + elif open_stack[symbol]: + # explicit close comment: still consume FIFO slot for side/symbol match + for i, (o, s, sd) in enumerate(open_stack[symbol]): + if s == strategy: + _o, _, side = open_stack[symbol].pop(i) + break + + open_map.pop(order, None) + open_side.pop(order, None) + open_stack[symbol] = [(o, s, sd) for o, s, sd in open_stack[symbol] if o != order] + + try: + ts = pd.to_datetime(time_s, format="%Y.%m.%d %H:%M:%S") + except Exception: + ts = pd.to_datetime(time_s.replace(".", "-", 2)) + + deals.append({ + "time": ts, + "symbol": symbol, + "strategy": strategy, + "side": side, + "net": net, + "balance": parse_num(balance), + "comment": comment, + }) + return deals + + +def load_xau_h1(start: datetime, end: datetime) -> pd.DataFrame: + if not mt5.initialize(): + raise RuntimeError("MT5 init failed") + sym = "XAUUSD" + if not mt5.symbol_select(sym, True): + for alt in ("GOLD", "XAUUSDm", "XAUUSD."): + if mt5.symbol_select(alt, True): + sym = alt + break + rates = mt5.copy_rates_range(sym, mt5.TIMEFRAME_H1, start, end) + mt5.shutdown() + if rates is None or len(rates) < 100: + raise RuntimeError("No XAUUSD H1 data from MT5") + df = pd.DataFrame(rates) + df["time"] = pd.to_datetime(df["time"], unit="s") + df.set_index("time", inplace=True) + return df + + +def market_features(df: pd.DataFrame) -> pd.DataFrame: + out = df.copy() + out["ret"] = out["close"].pct_change() + out["ema20"] = out["close"].ewm(span=20).mean() + out["ema50"] = out["close"].ewm(span=50).mean() + hl = out["high"] - out["low"] + hc = (out["high"] - out["close"].shift()).abs() + lc = (out["low"] - out["close"].shift()).abs() + tr = pd.concat([hl, hc, lc], axis=1).max(axis=1) + out["atr14"] = tr.rolling(14).mean() + out["atr_pct"] = out["atr14"] / out["close"] * 100 + up = out["high"].diff() + down = -out["low"].diff() + plus_dm = np.where((up > down) & (up > 0), up, 0.0) + minus_dm = np.where((down > up) & (down > 0), down, 0.0) + atr = out["atr14"] + plus_di = 100 * pd.Series(plus_dm, index=out.index).rolling(14).mean() / atr + minus_di = 100 * pd.Series(minus_dm, index=out.index).rolling(14).mean() / atr + dx = (plus_di - minus_di).abs() / (plus_di + minus_di) * 100 + out["adx14"] = dx.rolling(14).mean() + out["trend_slope"] = (out["ema20"] - out["ema50"]) / out["close"] * 100 + out["chop"] = out["ret"].rolling(24).std() * np.sqrt(24) * 100 + return out + + +def find_drawdowns(equity: pd.Series, top_n: int = 5) -> list[dict]: + peak = equity.cummax() + dd = equity - peak + dd_pct = dd / peak.replace(0, np.nan) * 100 + episodes = [] + in_dd = False + start = None + trough_t = None + trough_v = 0.0 + peak_v = 0.0 + for t, v in dd.items(): + if v < -1 and not in_dd: + in_dd = True + start = t + trough_t = t + trough_v = v + peak_v = peak.loc[t] + elif in_dd: + if v < trough_v: + trough_v = v + trough_t = t + if v >= -0.5: + episodes.append({ + "start": start, "trough": trough_t, "end": t, + "depth_usd": abs(trough_v), "depth_pct": abs(trough_v / peak_v * 100) if peak_v else 0, + }) + in_dd = False + if in_dd: + episodes.append({ + "start": start, "trough": trough_t, "end": equity.index[-1], + "depth_usd": abs(trough_v), "depth_pct": abs(trough_v / peak_v * 100) if peak_v else 0, + }) + episodes.sort(key=lambda x: x["depth_usd"], reverse=True) + return episodes[:top_n] + + +def plot_candles(ax, df: pd.DataFrame, title: str): + sub = df.tail(min(120, len(df))) + xs = np.arange(len(sub)) + for i, (t, row) in enumerate(sub.iterrows()): + o, h, l, c = row["open"], row["high"], row["low"], row["close"] + color = "#26a69a" if c >= o else "#ef5350" + ax.plot([i, i], [l, h], color=color, linewidth=0.8) + ax.add_patch(Rectangle((i - 0.35, min(o, c)), 0.7, abs(c - o) or 0.5, facecolor=color, edgecolor=color)) + ax.plot(xs, sub["ema20"].values, color="#1565c0", linewidth=1, label="EMA20") + ax.plot(xs, sub["ema50"].values, color="#ff8f00", linewidth=1, label="EMA50") + ax.set_title(title) + ax.set_xlim(-1, len(sub)) + ax.legend(loc="upper left", fontsize=7) + step = max(1, len(sub) // 6) + ax.set_xticks(xs[::step]) + ax.set_xticklabels([sub.index[j].strftime("%m-%d") for j in range(0, len(sub), step)], rotation=30, ha="right") + + +def monthly_issue_text(strat: str, monthly: pd.Series, meta: dict) -> list[str]: + issues = [] + neg = monthly[monthly < 0] + if len(neg) > 0: + worst_m = neg.idxmin() + issues.append(f"{worst_m} 单月亏损 {neg.min():,.0f} USD") + pos = monthly[monthly > 0] + if len(pos) > 0 and len(neg) > len(pos): + issues.append(f"亏损月份 ({len(neg)}) 多于盈利月份 ({len(pos)})") + if strat == "ST_SimpleTrendline": + issues.append("对冲型策略:多空均有信号,需分方向评估而非整体关停") + if meta.get("type") == "scalp" and monthly.std() > abs(monthly.mean()) * 2: + issues.append("月度波动大,手数复利放大后尾部风险显著") + if monthly.tail(3).sum() < 0 and monthly.sum() > 0: + issues.append("近 3 个月转弱,存在 regime change 迹象") + return issues[:4] + + +def latex_escape(s: str) -> str: + return s.replace("\\", "\\textbackslash{}").replace("_", "\\_").replace("&", "\\&").replace("%", "\\%") + + +def build_latex(summary: dict) -> str: + s = summary + robots_tex = [] + for strat in s["strategy_order"]: + meta = STRATEGY_META.get(strat, {"name": strat, "type": "other"}) + m = s["monthly"].get(strat, {}) + issues = s["issues"].get(strat, []) + total = s["totals"].get(strat, 0) + robots_tex.append( + f"\\subsubsection{{{latex_escape(meta['name'])}}}\n" + f"累计净利润 \\textbf{{{total:,.0f}}} USD。" + + ("\\par\\noindent\\textbf{逐月问题:}\\begin{itemize}\\setlength\\itemsep{2pt}\n" + + "".join(f"\\item {latex_escape(x)}" for x in issues) + + "\\end{itemize}" if issues else "") + ) + + dd_rows = [] + for i, ep in enumerate(s["drawdowns"][:5], 1): + dd_rows.append( + f"{i} & {ep['start'].strftime('%Y-%m-%d')} & {ep['trough'].strftime('%Y-%m-%d')} & " + f"{ep['end'].strftime('%Y-%m-%d')} & {ep['depth_usd']:,.0f} & {ep['depth_pct']:.1f}\\% \\\\" + ) + + st_total = s["totals"].get("ST_SimpleTrendline", 0) + body = f""" + \\section{{执行摘要}} + 本报告基于 MT5 策略测试器 HTML 报告(初始资金 \\$3,000,杠杆 1:1000,余额复利缩放)对 UnitedEA 集群进行逐机器人、逐月、回撤期市场结构分析。 + + \\begin{{table}}[H] + \\centering + \\caption{{组合层面关键指标}} + \\begin{{tabular}}{{lr}} + \\toprule + 指标 & 数值 \\\\ + \\midrule + 总净盈利 & {s['portfolio']['net_profit']:,.0f} USD \\\\ + 盈利因子 & {s['portfolio']['pf']:.2f} \\\\ + 夏普比率 & {s['portfolio']['sharpe']:.2f} \\\\ + 最大净值回撤 & {s['portfolio']['max_dd_pct']:.2f}\\% \\\\ + 总交易笔数 & {s['portfolio']['trades']:,} \\\\ + 胜率 & {s['portfolio']['win_rate']:.2f}\\% \\\\ + \\bottomrule + \\end{{tabular}} + \\end{{table}} + + \\textbf{{核心结论:}} + \\begin{{itemize}} + \\item 利润高度集中于 XAUUSD 上的 RM EMA Cross、RSI Scalping XAU、RSI Consolidation;名义多品种分散,实际为黄金 beta 集群。 + \\item 2025 末至 2026 初复利手数放大后,收益与回撤同步膨胀;评估 edge 需配合固定手数对照。 + \\item SimpleTrendline 为\\textbf{{对冲型}}(多空双向),整体虽亏但分方向与品种后可能仍有价值,不宜简单一刀切关闭。 + \\item 最大回撤期 XAUUSD 呈现更高 ATR、更低 ADX(震荡/假突破增多),趋势型与突破型策略易共振亏损。 + \\end{{itemize}} + + \\section{{组合曲线与回撤}} + \\begin{{figure}}[H] + \\centering + \\includegraphics[width=0.95\\textwidth]{{figures/equity_drawdown.pdf}} + \\caption{{净值曲线与回撤百分比}} + \\end{{figure}} + + \\begin{{table}}[H] + \\centering + \\caption{{主要回撤 episode(Top 5)}} + \\begin{{tabular}}{{clllrr}} + \\toprule + \\# & 起始 & 谷底 & 恢复 & 深度(USD) & 深度(\\%) \\\\ + \\midrule + {chr(10).join(dd_rows)} + \\bottomrule + \\end{{tabular}} + \\end{{table}} + + \\section{{逐机器人月度热力与累计贡献}} + \\begin{{figure}}[H] + \\centering + \\includegraphics[width=0.98\\textwidth]{{figures/monthly_heatmap.pdf}} + \\caption{{各机器人逐月净利润热力图(USD)}} + \\end{{figure}} + + \\begin{{figure}}[H] + \\centering + \\includegraphics[width=0.85\\textwidth]{{figures/strategy_contribution.pdf}} + \\caption{{各机器人累计净利润贡献}} + \\end{{figure}} + + \\section{{SimpleTrendline:对冲型专项分析}} + SimpleTrendline 基于高周期 MA 交叉趋势线,\\textbf{{多空双向}}触发,设计目标是对冲而非单边趋势押注。 + 回测合计 {st_total:,.0f} USD,但 2026 年在黄金高位剧烈震荡中大幅回撤。 + + \\begin{{figure}}[H] + \\centering + \\includegraphics[width=0.95\\textwidth]{{figures/st_long_short_monthly.pdf}} + \\caption{{SimpleTrendline 多空方向逐月 P/L 分解}} + \\end{{figure}} + + \\begin{{figure}}[H] + \\centering + \\includegraphics[width=0.95\\textwidth]{{figures/st_by_symbol_monthly.pdf}} + \\caption{{SimpleTrendline 分品种(XAU/GER/BTC)逐月 P/L}} + \\end{{figure}} + + \\begin{{figure}}[H] + \\centering + \\includegraphics[width=0.98\\textwidth]{{figures/top6_monthly.pdf}} + \\caption{{核心六机器人逐月 P/L 明细}} + \\end{{figure}} + + \\textbf{{建议:}}保留策略框架,但 (1) 在 ADX>{s['regime']['dd_adx']:.0f} 且 ATR 分位>{s['regime']['dd_atr_pct']:.0f}\\% 的强趋势月减少逆势侧仓位; + (2) 与 RM/RCO 等同向 exposure 设上限;(3) 2026 类高位宽幅震荡月单独降 LOT。 + + \\section{{回撤期 vs 平稳期:XAUUSD H1 市场结构}} + 从 MT5 拉取 XAUUSD H1。回撤窗口取 Top3 drawdown episode({', '.join(s['regime'].get('dd_months', []))}),对照期为 2024-03 至 2024-09 平稳盈利段。 + + \\begin{{table}}[H] + \\centering + \\caption{{市场特征对比(亏损月 vs 对照月)}} + \\begin{{tabular}}{{lrr}} + \\toprule + 特征 & 亏损月均值 & 对照月均值 \\\\ + \\midrule + ADX(14) & {s['regime']['dd_adx']:.1f} & {s['regime']['calm_adx']:.1f} \\\\ + ATR\\% & {s['regime']['dd_atr_pct']:.2f} & {s['regime']['calm_atr_pct']:.2f} \\\\ + 日收益波动(chop) & {s['regime']['dd_chop']:.2f} & {s['regime']['calm_chop']:.2f} \\\\ + EMA20-50 斜率\\% & {s['regime']['dd_slope']:.3f} & {s['regime']['calm_slope']:.3f} \\\\ + \\bottomrule + \\end{{tabular}} + \\end{{table}} + + \\begin{{figure}}[H] + \\centering + \\begin{{subfigure}}{{0.48\\textwidth}} + \\includegraphics[width=\\textwidth]{{figures/xau_dd_candles.pdf}} + \\caption{{回撤谷底附近 K 线 + EMA}} + \\end{{subfigure}} + \\hfill + \\begin{{subfigure}}{{0.48\\textwidth}} + \\includegraphics[width=\\textwidth]{{figures/xau_calm_candles.pdf}} + \\caption{{盈利平稳期 K 线 + EMA}} + \\end{{subfigure}} + \\caption{{XAUUSD H1 形态对比}} + \\end{{figure}} + + \\begin{{figure}}[H] + \\centering + \\includegraphics[width=0.95\\textwidth]{{figures/xau_regime_monthly.pdf}} + \\caption{{XAUUSD 逐月 ADX / ATR\\% 与组合月度 P/L 对照}} + \\end{{figure}} + + \\section{{各机器人逐月问题诊断}} + {chr(10).join(robots_tex)} + + \\section{{分品种月度 P/L}} + \\begin{{figure}}[H] + \\centering + \\includegraphics[width=0.95\\textwidth]{{figures/symbol_monthly.pdf}} + \\caption{{主要交易品种逐月净利润}} + \\end{{figure}} + + \\section{{改进路线图}} + \\begin{{enumerate}} + \\item \\textbf{{P0 风控:}}设置 ORCH\\_MaxBalanceScale 上限、每机器人 max lot cap;XAUUSD 总 exposure 上限。 + \\item \\textbf{{P1 精简:}}关闭 RRA EURUSD、RS AAPL;SuperEMA 降权;RS NVDA 观察。 + \\item \\textbf{{P2 SimpleTrendline:}}分方向/分品种调参,震荡月(低 ADX + 高 ATR)减半 LOT,勿整体删除。 + \\item \\textbf{{P3 验证:}}固定手数复测 2023--2026;Walk-forward 2026 Q1 作为 OOS。 + \\item \\textbf{{P4 监控:}}月度 dashboard 跟踪 RM EMA Cross 与 ST 多空比、ADX 过滤命中率。 + \\end{{enumerate}} + + \\appendix + \\section{{数据来源}} + 报告 HTML: ReportTester-*.html(MT5 导出);K 线: MT5 XAUUSD H1;成交归因基于 order comment FIFO。 + """ + + header = textwrap.dedent(r""" + \documentclass[11pt,a4paper]{ctexart} + \usepackage{graphicx} + \usepackage{booktabs} + \usepackage{geometry} + \usepackage{float} + \usepackage{caption} + \usepackage{subcaption} + \usepackage{hyperref} + \usepackage{xcolor} + \geometry{margin=2.2cm} + \title{UnitedEA 集群回测综合评估报告\\ \large 2023.07 -- 2026.06 · 逐月诊断 · 回撤期 K 线对比} + \author{自动生成 · cluster-latest/main.mq5} + \date{\today} + + \begin{document} + \maketitle + \tableofcontents + \newpage + """) + + return header + body + "\n\\end{document}\n" + + +def main(): + FIG_DIR.mkdir(parents=True, exist_ok=True) + DATA_DIR.mkdir(parents=True, exist_ok=True) + + html = REPORT_HTML.read_text(encoding="utf-16") + deals = parse_deals(html) + df = pd.DataFrame(deals).sort_values("time") + df["month"] = df["time"].dt.to_period("M").astype(str) + + # Portfolio summary from HTML header + m_net = re.search(r"总净盈利:\s*]*>([^<]+)", html) + m_pf = re.search(r"盈利因子:\s*]*>([^<]+)", html) + m_sh = re.search(r"夏普比率:\s*]*>([^<]+)", html) + m_dd = re.search(r"相对净值亏损:\s*]*>([0-9.]+)%", html) + m_tr = re.search(r"交易总计:\s*]*>([^<]+)", html) + m_wr = re.search(r"盈利交易 \(% 全部\):\s*]*>[0-9]+ \(([0-9.]+)%\)", html) + + portfolio = { + "net_profit": parse_num(m_net.group(1)) if m_net else df["net"].sum(), + "pf": float(m_pf.group(1)) if m_pf else 0, + "sharpe": float(m_sh.group(1)) if m_sh else 0, + "max_dd_pct": float(m_dd.group(1)) if m_dd else 0, + "trades": int(m_tr.group(1).replace(" ", "")) if m_tr else len(df), + "win_rate": float(m_wr.group(1)) if m_wr else 0, + } + + # Equity curve + eq = df.groupby("time")["balance"].last().sort_index() + eq_daily = eq.resample("D").last().ffill() + peak = eq_daily.cummax() + dd_pct = (eq_daily - peak) / peak * 100 + + fig, axes = plt.subplots(2, 1, figsize=(11, 5), sharex=True, gridspec_kw={"height_ratios": [3, 1]}) + axes[0].semilogy(eq_daily.index, eq_daily.values, color="#1565c0", linewidth=1.2) + axes[0].set_ylabel("Balance (USD, log)") + axes[0].set_title("Portfolio Equity") + axes[0].grid(True, alpha=0.3) + axes[1].fill_between(dd_pct.index, dd_pct.values, 0, color="#ef5350", alpha=0.5) + axes[1].set_ylabel("Drawdown %") + axes[1].set_xlabel("Date") + axes[1].grid(True, alpha=0.3) + fig.autofmt_xdate() + fig.tight_layout() + fig.savefig(FIG_DIR / "equity_drawdown.pdf") + plt.close() + + drawdowns = find_drawdowns(eq_daily, 5) + + # Monthly by strategy + monthly_strat = df.pivot_table(index="month", columns="strategy", values="net", aggfunc="sum", fill_value=0) + totals = df.groupby("strategy")["net"].sum().sort_values(ascending=False) + strategy_order = [s for s in totals.index if s != "UNATTRIBUTED"] + + # Heatmap - top strategies + top_strats = strategy_order[:14] + heat = monthly_strat[top_strats].T + fig, ax = plt.subplots(figsize=(14, 7)) + vmax = np.percentile(np.abs(heat.values), 95) + im = ax.imshow(heat.values, aspect="auto", cmap="RdYlGn", vmin=-vmax, vmax=vmax) + ax.set_yticks(range(len(top_strats))) + ax.set_yticklabels([STRATEGY_META.get(s, {}).get("name", s) for s in top_strats], fontsize=7) + ax.set_xticks(range(len(heat.columns))) + ax.set_xticklabels(heat.columns, rotation=45, ha="right", fontsize=7) + ax.set_title("Monthly Net P/L by Robot (USD)") + plt.colorbar(im, ax=ax, shrink=0.6) + fig.tight_layout() + fig.savefig(FIG_DIR / "monthly_heatmap.pdf") + plt.close() + + # Contribution bar + fig, ax = plt.subplots(figsize=(9, 5)) + colors = ["#2e7d32" if v >= 0 else "#c62828" for v in totals[strategy_order]] + ax.barh([STRATEGY_META.get(s, {}).get("name", s)[:28] for s in strategy_order], totals[strategy_order].values, color=colors) + ax.axvline(0, color="black", linewidth=0.8) + ax.set_xlabel("Net Profit (USD)") + ax.set_title("Cumulative Contribution by Robot") + fig.tight_layout() + fig.savefig(FIG_DIR / "strategy_contribution.pdf") + plt.close() + + # ST long/short monthly + st_df = df[df["strategy"] == "ST_SimpleTrendline"].copy() + st_monthly = {"long": {}, "short": {}} + for side in ("long", "short"): + sub = st_df[st_df["side"] == side] + if len(sub): + st_monthly[side] = sub.groupby("month")["net"].sum().to_dict() + all_months = sorted(monthly_strat.index) + long_s = [st_monthly["long"].get(m, 0) for m in all_months] + short_s = [st_monthly["short"].get(m, 0) for m in all_months] + x = np.arange(len(all_months)) + fig, ax = plt.subplots(figsize=(12, 4)) + ax.bar(x - 0.2, long_s, 0.4, label="Long", color="#26a69a") + ax.bar(x + 0.2, short_s, 0.4, label="Short", color="#ef5350") + ax.axhline(0, color="black", linewidth=0.6) + ax.set_xticks(x) + ax.set_xticklabels(all_months, rotation=45, ha="right", fontsize=7) + ax.set_ylabel("USD") + ax.set_title("SimpleTrendline: Long vs Short Monthly P/L") + ax.legend() + fig.tight_layout() + fig.savefig(FIG_DIR / "st_long_short_monthly.pdf") + plt.close() + + # ST by symbol + st_sym = st_df.groupby(["month", "symbol"])["net"].sum().unstack(fill_value=0) + if len(st_sym.columns): + fig, ax = plt.subplots(figsize=(12, 4)) + st_sym.plot(kind="bar", stacked=True, ax=ax, width=0.85) + ax.axhline(0, color="black", linewidth=0.6) + ax.set_title("SimpleTrendline Monthly P/L by Symbol") + ax.set_ylabel("USD") + plt.xticks(rotation=45, ha="right", fontsize=7) + ax.legend(fontsize=7, loc="upper left") + fig.tight_layout() + fig.savefig(FIG_DIR / "st_by_symbol_monthly.pdf") + plt.close() + + # Top robots monthly lines + top6 = strategy_order[:6] + fig, axes = plt.subplots(3, 2, figsize=(12, 7), sharex=True) + for ax, strat in zip(axes.flat, top6): + if strat not in monthly_strat.columns: + continue + ser = monthly_strat[strat] + ax.bar(ser.index, ser.values, color=np.where(ser.values >= 0, "#66bb6a", "#ef5350"), width=0.8) + ax.axhline(0, color="black", linewidth=0.5) + ax.set_title(STRATEGY_META.get(strat, {}).get("name", strat), fontsize=8) + ax.tick_params(axis="x", labelrotation=45, labelsize=6) + fig.suptitle("Top 6 Robots — Monthly P/L", fontsize=11) + fig.tight_layout() + fig.savefig(FIG_DIR / "top6_monthly.pdf") + plt.close() + + # Symbol monthly + sym_m = df.pivot_table(index="month", columns="symbol", values="net", aggfunc="sum", fill_value=0) + main_syms = sym_m.sum().abs().sort_values(ascending=False).head(6).index + fig, ax = plt.subplots(figsize=(12, 5)) + bottom = np.zeros(len(sym_m)) + for sym in main_syms: + ax.bar(sym_m.index, sym_m[sym].values, bottom=bottom, label=sym) + bottom += sym_m[sym].values + ax.axhline(0, color="black", linewidth=0.6) + ax.legend(fontsize=7) + ax.set_title("Monthly P/L by Symbol (stacked)") + plt.xticks(rotation=45, ha="right", fontsize=7) + fig.tight_layout() + fig.savefig(FIG_DIR / "symbol_monthly.pdf") + plt.close() + + # XAUUSD regime analysis + start = datetime(2023, 7, 1) + end = datetime(2026, 6, 4) + xau = load_xau_h1(start, end) + xau = market_features(xau) + xau.to_csv(DATA_DIR / "xau_h1_features.csv") + + port_monthly = df.groupby("month")["net"].sum() + xau_m = xau.resample("ME").agg({"adx14": "mean", "atr_pct": "mean", "chop": "mean", "trend_slope": "mean", "close": "last"}) + xau_m.index = xau_m.index.strftime("%Y-%m") + + # Regime: portfolio drawdown windows vs calm reference (2024-03..2024-09) + dd_months: set[str] = set() + for ep in drawdowns[:3]: + t0, t1 = pd.Timestamp(ep["start"]), pd.Timestamp(ep["trough"]) + for ts in pd.date_range(t0.to_period("M").to_timestamp(), t1.to_period("M").to_timestamp(), freq="MS"): + dd_months.add(ts.strftime("%Y-%m")) + calm_months = [m for m in xau_m.index if "2024-0" in m and m >= "2024-03" and m <= "2024-09"] + dd_mask = xau_m.index.isin(sorted(dd_months)) + calm_mask = xau_m.index.isin(calm_months) + + common = sorted(set(port_monthly.index) & set(xau_m.index)) + pm = port_monthly.reindex(common, fill_value=0) + regime = { + "dd_adx": float(xau_m.loc[dd_mask, "adx14"].mean()) if dd_mask.any() else 0, + "calm_adx": float(xau_m.loc[calm_mask, "adx14"].mean()) if calm_mask.any() else 0, + "dd_atr_pct": float(xau_m.loc[dd_mask, "atr_pct"].mean()) if dd_mask.any() else 0, + "calm_atr_pct": float(xau_m.loc[calm_mask, "atr_pct"].mean()) if calm_mask.any() else 0, + "dd_chop": float(xau_m.loc[dd_mask, "chop"].mean()) if dd_mask.any() else 0, + "calm_chop": float(xau_m.loc[calm_mask, "chop"].mean()) if calm_mask.any() else 0, + "dd_slope": float(xau_m.loc[dd_mask, "trend_slope"].mean()) if dd_mask.any() else 0, + "calm_slope": float(xau_m.loc[calm_mask, "trend_slope"].mean()) if calm_mask.any() else 0, + "dd_months": sorted(dd_months), + } + + # Regime monthly chart + fig, ax1 = plt.subplots(figsize=(12, 4)) + ax2 = ax1.twinx() + xs = np.arange(len(common)) + ax1.bar(xs, pm.values, color=np.where(pm.values >= 0, "#66bb6a", "#ef5350"), alpha=0.7, label="Portfolio P/L") + ax2.plot(xs, xau_m.reindex(common)["adx14"].values, color="#1565c0", marker="o", markersize=3, label="ADX") + ax2.plot(xs, xau_m.reindex(common)["atr_pct"].values * 2, color="#ff8f00", marker="s", markersize=3, label="ATR% x2") + ax1.set_xticks(xs) + ax1.set_xticklabels(common, rotation=45, ha="right", fontsize=7) + ax1.set_ylabel("Portfolio Monthly P/L") + ax2.set_ylabel("ADX / scaled ATR%") + ax1.set_title("Monthly Portfolio P/L vs XAUUSD Regime") + fig.tight_layout() + fig.savefig(FIG_DIR / "xau_regime_monthly.pdf") + plt.close() + + # Candle windows + if drawdowns: + trough = drawdowns[0]["trough"] + dd_win = xau.loc[trough - pd.Timedelta(days=10): trough + pd.Timedelta(days=10)] + calm_start = pd.Timestamp("2024-03-01") + calm_win = xau.loc[calm_start: calm_start + pd.Timedelta(days=10)] + fig, ax = plt.subplots(figsize=(8, 3.5)) + plot_candles(ax, dd_win, f"Drawdown trough window ~ {trough.strftime('%Y-%m-%d')}") + fig.tight_layout() + fig.savefig(FIG_DIR / "xau_dd_candles.pdf") + plt.close() + fig, ax = plt.subplots(figsize=(8, 3.5)) + plot_candles(ax, calm_win, "Calm period reference (2024-03)") + fig.tight_layout() + fig.savefig(FIG_DIR / "xau_calm_candles.pdf") + plt.close() + + # Issues per strategy + issues = {} + monthly_dict = {} + for strat in strategy_order: + if strat in monthly_strat.columns: + ser = monthly_strat[strat] + monthly_dict[strat] = ser.to_dict() + issues[strat] = monthly_issue_text(strat, ser, STRATEGY_META.get(strat, {})) + + summary = { + "portfolio": portfolio, + "drawdowns": drawdowns, + "strategy_order": strategy_order, + "totals": totals.to_dict(), + "monthly": monthly_dict, + "issues": issues, + "st_monthly": st_monthly, + "regime": regime, + } + (DATA_DIR / "summary.json").write_text(json.dumps(summary, default=str, indent=2), encoding="utf-8") + + tex = build_latex(summary) + TEX_FILE.write_text(tex, encoding="utf-8") + print(f"Wrote {TEX_FILE}") + print(f"Figures in {FIG_DIR}") + for _ in range(2): + subprocess.run( + ["xelatex", "-interaction=nonstopmode", "cluster_evaluation.tex"], + cwd=ROOT, + check=False, + capture_output=True, + ) + pdf = ROOT / "cluster_evaluation.pdf" + if pdf.exists(): + print(f"PDF: {pdf}") + return summary + + +if __name__ == "__main__": + main() diff --git a/frontline/cluster-latest/reports/generate_managed_account_latex.py b/frontline/cluster-latest/reports/generate_managed_account_latex.py new file mode 100644 index 0000000..6e01e0d --- /dev/null +++ b/frontline/cluster-latest/reports/generate_managed_account_latex.py @@ -0,0 +1,414 @@ +#!/usr/bin/env python3 +"""LaTeX brochure: zh / de / ar — equity curves, flowcharts, watermark.""" +from __future__ import annotations + +import argparse +import re +import shutil +import subprocess +import sys +from dataclasses import dataclass +from datetime import datetime +from io import BytesIO +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.dates as mdates +import matplotlib.pyplot as plt +import pandas as pd + +ROOT = Path(__file__).resolve().parent +sys.path.insert(0, str(ROOT.parents[2] / "backtesting" / "MT5")) + +from brochure_i18n import LOCALES, Locale, flowchart_for +from cluster_audit.united_mt5_manifest import PRODUCTION_IDS, UNITED_MT5_STRATEGIES +from cluster_audit.united_mt5_runner import mt5_terminal_data_dir, parse_report, read_text + + +def _mt5_data() -> Path: + data = mt5_terminal_data_dir() + if data is None: + raise SystemExit( + "MT5 data folder not found. Set MT5_TERMINAL_DATA_ID in .env or log into MT5 once." + ) + return data +FIG_DIR = ROOT / "figures" / "brochure" +DEPOSIT = 3000.0 +WATERMARK_TEXT = "Namelos.xyz Research" + +SM = {s["id"]: s for s in UNITED_MT5_STRATEGIES} +SYMBOL_MAP = { + "DB": "XAUUSD", "ES": "XAUUSD", "RC": "XAUUSD", "RM": "XAUUSD", + "RS_NVDA": "NVDA", "RS_TSLA": "TSLA", "RS_BTCUSD": "BTCUSD", + "RS_XAUUSD": "XAUUSD", "RS_NAS100": "NAS100", "RS_US30": "US30", + "SE": "XAUUSD", "ST_BTC": "BTCUSD", "ST_XAU": "XAUUSD", + "RRA_AUD": "AUDUSD", "RRA_GBP": "GBPUSD", "UB": "USDJPY", + "UKB": "UK100", "GB": "GER40", "U5B": "US500", +} + +plt.rcParams.update({"figure.dpi": 150, "savefig.dpi": 150, "font.size": 9, "axes.unicode_minus": False}) +try: + plt.rcParams["font.sans-serif"] = ["Microsoft YaHei", "SimHei", "Arial", "DejaVu Sans"] +except Exception: + pass + + +def parse_num(s: str) -> float: + s = s.strip().replace(" ", "").replace(",", "") + if not s: + return 0.0 + if s.endswith("K"): + return float(s[:-1]) * 1000 + if s.endswith("%"): + return float(s[:-1]) + return float(s) + + +def parse_equity_from_html(html: str) -> pd.Series: + markers = ("成交", "Deals", "Orders") + start = next((html.find(m) for m in markers if html.find(m) >= 0), -1) + sub = html[start:] if start >= 0 else html + row_re = re.compile( + r"align=right>([^<]*)(\d+)([^<]*)([^<]*)" + r"([^<]*)([^<]*)([^<]*)(\d+)([^<]*)" + r"([^<]*)([^<]*)([^<]*)([^<]*)", + re.I, + ) + points: list[tuple[datetime, float]] = [] + for row in row_re.findall(sub): + time_s, _did, _sym, typ, _dir, _vol, _price, _order, _comm, _swap, _profit, balance, _comment = row + if typ.strip().lower() == "balance": + continue + try: + t = datetime.strptime(time_s.strip(), "%Y.%m.%d %H:%M:%S") + except ValueError: + continue + try: + bal = parse_num(balance) + except ValueError: + continue + if bal > 0: + points.append((t, bal)) + if not points: + return pd.Series(dtype=float) + df = pd.DataFrame(points, columns=["time", "balance"]).sort_values("time") + return df.groupby("time")["balance"].last() + + +@dataclass +class StratResult: + sid: str + name: str + symbol: str + pf: float | None + net: float | None + sharpe: float | None + trades: int | None + fig_path: str + + +def plot_equity(eq: pd.Series, title: str, out: Path, ylabel: str, *, logy: bool = False) -> None: + if eq.empty: + return + daily = eq.resample("D").last().ffill() + if daily.iloc[0] <= 0: + daily = daily + DEPOSIT + fig, ax = plt.subplots(figsize=(6.5, 2.8)) + color = "#1565c0" if daily.iloc[-1] >= daily.iloc[0] else "#c62828" + (ax.semilogy if logy else ax.plot)(daily.index, daily.values, color=color, linewidth=1.3) + ax.axhline(DEPOSIT, color="#888", linestyle="--", linewidth=0.8, alpha=0.7) + ax.set_title(title, fontsize=10) + ax.set_ylabel(ylabel) + ax.grid(True, alpha=0.3) + ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m")) + fig.autofmt_xdate() + fig.tight_layout() + fig.savefig(out, bbox_inches="tight") + plt.close(fig) + + +def load_report_html(name: str) -> str | None: + for ext in (".htm", ".html"): + p = _mt5_data() / f"{name}{ext}" + if p.exists(): + return read_text(p) + return None + + +def process_strategies(loc: Locale) -> list[StratResult]: + FIG_DIR.mkdir(parents=True, exist_ok=True) + results: list[StratResult] = [] + for sid in PRODUCTION_IDS: + spec = SM[sid] + html = load_report_html(f"solo_{sid}_off") + m = parse_report(_mt5_data(), f"solo_{sid}_off") + eq = parse_equity_from_html(html) if html else pd.Series(dtype=float) + fig_name = f"equity_{sid}.pdf" + fig_path = FIG_DIR / fig_name + title = f"{sid} · {spec['name']} ({SYMBOL_MAP.get(sid, '')})" + if not eq.empty: + plot_equity(eq, title, fig_path, loc.equity_ylabel) + results.append(StratResult( + sid=sid, name=spec["name"], symbol=SYMBOL_MAP.get(sid, ""), + pf=m.get("profit_factor"), net=m.get("net_profit"), + sharpe=m.get("sharpe"), trades=m.get("total_trades"), + fig_path=f"figures/brochure/{fig_name}", + )) + combo_html = load_report_html("prod_v2_combined") + if combo_html: + combo_eq = parse_equity_from_html(combo_html) + if not combo_eq.empty: + plot_equity(combo_eq, loc.equity_combined_title, FIG_DIR / "equity_combined.pdf", + loc.equity_ylabel, logy=True) + return results + + +def tex_escape(s: str) -> str: + return s.replace("_", r"\_").replace("&", r"\&").replace("%", r"\%").replace("#", r"\#") + + +def _flowchart_minipage(r: StratResult, loc: Locale) -> list[str]: + return [ + r"\begin{minipage}[t]{0.46\textwidth}", + r"\centering", + rf"\textbf{{{tex_escape(r.sid)} · {tex_escape(r.name)}}}\\[0.15em]", + rf"\scriptsize ({tex_escape(r.symbol)})\\[0.35em]", + r"\resizebox{\linewidth}{!}{%", + flowchart_for(r.sid, loc), + r"}", + r"\end{minipage}", + ] + + +def date_str(loc: Locale) -> str: + d = datetime.now() + if loc.code == "zh": + return d.strftime("%Y年%m月%d日") + if loc.code == "ar": + return d.strftime("%Y-%m-%d") + return d.strftime("%d.%m.%Y") + + +def build_latex(results: list[StratResult], loc: Locale) -> str: + n_prof = sum(1 for r in results if (r.net or 0) > 0) + n_pf1 = sum(1 for r in results if (r.pf or 0) >= 1.0) + combo_m = parse_report(_mt5_data(), "prod_v2_combined") + pf_l, net_l, sh_l = loc.caption_pf_net_sharpe + + lines = list(loc.preamble) + lines += [ + rf"\title{{{loc.title}}}", + rf"\author{{{loc.author}}}", + rf"\date{{{date_str(loc)}}}", + r"\begin{document}", + r"\maketitle", + r"\begin{abstract}", + loc.abstract_tpl.format(n_prof=n_prof, n_pf1=n_pf1, deposit=DEPOSIT), + r"\end{abstract}", + r"\tableofcontents", + r"\newpage", + rf"\section{{{loc.s1_title}}}", + loc.s1_body, + rf"\subsection{{{loc.s1_1_title}}}", + r"\begin{itemize}", + ] + lines += [rf"\item {x}" for x in loc.s1_1_items] + lines += [ + r"\end{itemize}", + rf"\subsection{{{loc.s1_2_title}}}", + r"\begin{tabular}{ll}", + r"\toprule", + rf"{loc.table_headers[0]} & {loc.table_headers[1]} \\", + r"\midrule", + ] + for k, v in loc.table_rows: + lines.append(rf"{k} & {v} \\") + lines += [ + r"\bottomrule", + r"\end{tabular}", + r"\newpage", + rf"\section{{{loc.s2_title}}}", + loc.s2_body_tpl.format( + pf=combo_m.get("profit_factor", "—"), + sharpe=combo_m.get("sharpe", "—"), + trades=combo_m.get("total_trades", "—"), + ), + r"\begin{figure}[H]", + r"\centering", + r"\includegraphics[width=0.95\textwidth]{figures/brochure/equity_combined.pdf}", + rf"\caption{{{loc.s2_caption}}}", + r"\end{figure}", + r"\newpage", + rf"\section{{{loc.s3_title}}}", + loc.s3_body, + r"\begin{figure}[H]", + r"\centering", + ] + for i, r in enumerate(results): + if i > 0 and i % 2 == 0: + lines += [r"\end{figure}", r"\begin{figure}[H]", r"\centering"] + lines += [ + r"\begin{subfigure}[t]{0.48\textwidth}", + r"\centering", + rf"\includegraphics[width=\textwidth]{{{r.fig_path}}}", + ] + pf_s = f"{r.pf:.2f}" if r.pf else "—" + net_s = f"{r.net:,.0f}" if r.net else "—" + sh_s = f"{r.sharpe:.2f}" if r.sharpe else "—" + lines.append( + rf"\caption{{{tex_escape(r.sid)} · {tex_escape(r.name)}\\" + rf"{pf_l}={pf_s} \quad {net_l}=\${net_s} \quad {sh_l}={sh_s}}}" + ) + lines += [r"\end{subfigure}"] + if i % 2 == 0: + lines.append(r"\hfill") + lines += [ + r"\end{figure}", + r"\newpage", + rf"\section{{{loc.s4_title}}}", + r"\begin{table}[H]", + r"\centering", + rf"\caption{{{loc.s4_caption}}}", + r"\small", + r"\begin{tabular}{clrrrrr}", + r"\toprule", + rf"{loc.table_cols} \\", + r"\midrule", + ] + for r in sorted(results, key=lambda x: -(x.net or 0)): + pf_s = f"{r.pf:.2f}" if r.pf else "—" + net_s = f"{r.net:,.0f}" if r.net else "—" + sh_s = f"{r.sharpe:.2f}" if r.sharpe else "—" + tr_s = str(r.trades) if r.trades else "—" + lines.append( + rf"{tex_escape(r.sid)} & {tex_escape(r.name)} & {tex_escape(r.symbol)} " + rf"& {pf_s} & {net_s} & {sh_s} & {tr_s} \\" + ) + lines += [ + r"\bottomrule", + r"\end{tabular}", + r"\end{table}", + r"\newpage", + rf"\section{{{loc.s5_title}}}", + loc.s5_body, + ] + close_sids = {"ES", "RS_XAUUSD", "RS_US30"} + i = 0 + while i < len(results): + lines += [r"\begin{figure}[H]", r"\centering"] + lines += _flowchart_minipage(results[i], loc) + page_sids = [results[i].sid] + if i + 1 < len(results): + lines.append(r"\hfill") + lines += _flowchart_minipage(results[i + 1], loc) + page_sids.append(results[i + 1].sid) + i += 2 + else: + i += 1 + lines.append(r"\end{figure}") + for sid in page_sids: + if sid in close_sids: + lines.append(loc.close_note) + lines.append(r"\vspace{0.25cm}") + lines += [ + rf"\section{{{loc.s6_title}}}", + r"\begin{itemize}", + ] + lines += [rf"\item {x}" for x in loc.s6_items] + lines += [ + r"\end{itemize}", + rf"\section*{{{ 'إخلاء المسؤولية' if loc.code == 'ar' else ('Haftungsausschluss' if loc.code == 'de' else '免责声明')} }}", + loc.disclaimer, + r"\end{document}", + ] + return "\n".join(lines) + "\n" + + +def _watermark_page_template(width: float, height: float): + from pypdf import PdfReader as PR + from reportlab.lib.colors import Color + from reportlab.pdfgen import canvas + + buf = BytesIO() + c = canvas.Canvas(buf, pagesize=(width, height)) + c.setFillColor(Color(0.45, 0.45, 0.45, alpha=0.12)) + c.setFont("Helvetica-Bold", 13) + step_x, step_y = 135, 90 + x = 35.0 + while x < width + step_x: + y = 45.0 + while y < height + step_y: + c.saveState() + c.translate(x, y) + c.rotate(35) + c.drawCentredString(0, 0, WATERMARK_TEXT) + c.restoreState() + y += step_y + x += step_x + c.showPage() + c.save() + buf.seek(0) + return PR(buf).pages[0] + + +def stamp_watermark_pdf(path: Path) -> None: + from pypdf import PdfReader, PdfWriter + + reader = PdfReader(str(path)) + writer = PdfWriter() + for page in reader.pages: + w, h = float(page.mediabox.width), float(page.mediabox.height) + wm = _watermark_page_template(w, h) + wm.merge_page(page) + writer.add_page(wm) + tmp = path.with_suffix(".tmp.pdf") + with open(tmp, "wb") as f: + writer.write(f) + tmp.replace(path) + + +def build_one(loc: Locale, results: list[StratResult]) -> bool: + tex_file = ROOT / f"{loc.tex_stem}.tex" + pdf_file = ROOT / f"{loc.tex_stem}.pdf" + out_pdf = ROOT / loc.pdf_name + + tex_file.write_text(build_latex(results, loc), encoding="utf-8") + print(f" Wrote {tex_file.name}") + + for _ in range(2): + subprocess.run( + ["xelatex", "-interaction=nonstopmode", tex_file.name], + cwd=ROOT, capture_output=True, text=True, + ) + if not pdf_file.exists(): + print(f" FAILED xelatex for {loc.code}") + return False + stamp_watermark_pdf(pdf_file) + shutil.copy2(pdf_file, out_pdf) + print(f" PDF: {out_pdf.name}") + return True + + +def main() -> int: + p = argparse.ArgumentParser() + p.add_argument("--lang", default="all", choices=["zh", "de", "ar", "all"]) + args = p.parse_args() + + langs = list(LOCALES.keys()) if args.lang == "all" else [args.lang] + print("MT5 data: ") + results = process_strategies(LOCALES["zh"]) + for r in results: + print(f" OK {r.sid:10} PF={r.pf} net={r.net}") + + ok = True + for code in langs: + loc = LOCALES[code] + print(f"\n=== {code.upper()} ===") + if not build_one(loc, results): + ok = False + return 0 if ok else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/frontline/cluster-latest/reports/generate_product_brochure.py b/frontline/cluster-latest/reports/generate_product_brochure.py new file mode 100644 index 0000000..4686701 --- /dev/null +++ b/frontline/cluster-latest/reports/generate_product_brochure.py @@ -0,0 +1,432 @@ +#!/usr/bin/env python3 +"""代客理财产品介绍 PDF — 从 MT5 客户端回测报告解析数据并生成。""" +from __future__ import annotations + +import re +import sys +from datetime import date +from pathlib import Path + +from reportlab.lib import colors +from reportlab.lib.enums import TA_CENTER, TA_JUSTIFY, TA_LEFT +from reportlab.lib.pagesizes import A4 +from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet +from reportlab.lib.units import cm, mm +from reportlab.pdfbase import pdfmetrics +from reportlab.pdfbase.ttfonts import TTFont +from reportlab.platypus import ( + HRFlowable, + PageBreak, + Paragraph, + SimpleDocTemplate, + Spacer, + Table, + TableStyle, +) + +ROOT = Path(__file__).resolve().parent +sys.path.insert(0, str(ROOT.parents[2] / "backtesting" / "MT5")) + +from cluster_audit.united_mt5_manifest import PRODUCTION_IDS, UNITED_MT5_STRATEGIES +from cluster_audit.united_mt5_runner import mt5_terminal_data_dir, parse_report, read_text, grab_metric + + +def _mt5_data() -> Path: + data = mt5_terminal_data_dir() + if data is None: + raise SystemExit( + "MT5 data folder not found. Set MT5_TERMINAL_DATA_ID in .env or log into MT5 once." + ) + return data + + +OUT_PDF = ROOT / "UnitedEA_ManagedAccount_Brochure.pdf" + +BEST_LOTS = { + "DB": 0.01, "ES": 0.07, "RC": 0.10, "RM": 0.01, + "RS_NVDA": 5.0, "RS_TSLA": 5.0, "RS_BTCUSD": 0.06, "RS_XAUUSD": 0.04, + "SE": 0.01, "ST_BTC": 0.01, "ST_XAU": 0.01, + "RRA_AUD": 0.05, "RRA_GBP": 0.03, "UB": 0.03, + "RS_NAS100": 0.03, "RS_US30": 0.02, "UKB": 0.01, "GB": 0.01, "U5B": 0.05, +} + +CLOSE_ON = {"ES", "RS_XAUUSD", "RS_US30"} +TIER = { + "star": {"RS_BTCUSD", "RS_XAUUSD", "RS_US30", "RS_NAS100", "DB", "ES"}, + "stable": {"RC", "RM", "RS_NVDA", "RS_TSLA", "ST_BTC", "UB", "U5B", "GB", "UKB"}, + "weak": {"SE", "ST_XAU", "RRA_AUD", "RRA_GBP"}, +} + +SM = {s["id"]: s for s in UNITED_MT5_STRATEGIES} + + +def register_fonts() -> str: + for name, path in [ + ("CN", r"C:\Windows\Fonts\msyh.ttc"), + ("CN", r"C:\Windows\Fonts\simhei.ttf"), + ("CN", r"C:\Windows\Fonts\simsun.ttc"), + ]: + if Path(path).exists(): + try: + pdfmetrics.registerFont(TTFont("CN", path, subfontIndex=0 if path.endswith(".ttc") else None)) + return "CN" + except Exception: + continue + return "Helvetica" + + +def parse_extra(path: Path) -> dict: + text = read_text(path) + wr = grab_metric(text, "profit_factor") # reuse grab - need win rate manually + gross_profit = None + gross_loss = None + for label in ("Gross Profit", "总获利"): + m = re.search(rf">{re.escape(label)}\s*]*>(?:)?([^<]+)", text, re.I) + if m: + gross_profit = m.group(1).strip() + break + for label in ("Gross Loss", "总亏损"): + m = re.search(rf">{re.escape(label)}\s*]*>(?:)?([^<]+)", text, re.I) + if m: + gross_loss = m.group(1).strip() + break + for label in ("Profit Trades (% of total)", "盈利交易 (%占总百分比)"): + m = re.search(rf">{re.escape(label)}\s*]*>(?:)?([^<]+)", text, re.I) + if m: + win_rate = m.group(1).strip() + break + else: + win_rate = "—" + dd = grab_metric(text, "equity_dd") + return {"win_rate": win_rate, "max_drawdown": dd or "—", "gross_profit": gross_profit, "gross_loss": gross_loss} + + +def load_strategy_metrics() -> list[dict]: + rows = [] + for sid in PRODUCTION_IDS: + spec = SM[sid] + report_name = f"solo_{sid}_off" + m = parse_report(_mt5_data(), report_name) + if not m.get("ready"): + # fallback: lot genetic best-lot report + lot = BEST_LOTS.get(sid, 0.01) + lot_s = f"{lot:g}".replace(".", "p") + for pat in (f"lot_{sid}_{lot_s}", f"lot_{sid}_{lot:g}"): + m = parse_report(_mt5_data(), pat) + if m.get("ready"): + break + extra = {} + if m.get("report"): + extra = parse_extra(Path(m["report"])) + net = m.get("net_profit") + ret_pct = f"{net / 30:.1f}%" if net is not None else "—" # $3000 base, 3yr approx + tier = "明星" if sid in TIER["star"] else ("稳健" if sid in TIER["stable"] else "观察") + rows.append({ + "id": sid, + "name": spec["name"], + "lot": BEST_LOTS.get(sid, "—"), + "pf": m.get("profit_factor"), + "net": net, + "sharpe": m.get("sharpe"), + "trades": m.get("total_trades"), + "dd": extra.get("max_drawdown", "—"), + "win_rate": extra.get("win_rate", "—"), + "ret_pct": ret_pct, + "tier": tier, + "close_on": "是" if sid in CLOSE_ON else "否", + "ready": m.get("ready", False), + }) + return rows + + +def load_portfolio() -> dict: + for name in ("prod_v2_combined", "lot_genetic_combined", "close_NEW", "lot_combined_optimized"): + m = parse_report(_mt5_data(), name) + if m.get("ready"): + extra = parse_extra(Path(m["report"])) + m.update(extra) + m["source"] = name + return m + return {"ready": False} + + +def fmt(v, nd=2): + if v is None: + return "—" + if isinstance(v, float): + return f"{v:.{nd}f}" + return str(v) + + +def make_watermark(font_name: str): + WATERMARK = "Namelos.xyz Research" + + def _draw(c, _doc): + c.saveState() + c.setFillColor(colors.Color(0.5, 0.5, 0.5, alpha=0.10)) + c.setFont(font_name, 16) + w, h = A4 + step_x, step_y = 125, 85 + x0, y0 = step_x * 0.6, step_y * 0.8 + x = x0 + while x < w + step_x: + y = y0 + while y < h + step_y: + c.saveState() + c.translate(x, y) + c.rotate(35) + c.drawCentredString(0, 0, WATERMARK) + c.restoreState() + y += step_y + x += step_x + c.restoreState() + + return _draw + + +def build_pdf(font: str) -> None: + styles = getSampleStyleSheet() + title = ParagraphStyle("T", parent=styles["Title"], fontName=font, fontSize=22, leading=28, alignment=TA_CENTER) + h1 = ParagraphStyle("H1", parent=styles["Heading1"], fontName=font, fontSize=16, leading=22, spaceAfter=8) + h2 = ParagraphStyle("H2", parent=styles["Heading2"], fontName=font, fontSize=13, leading=18, spaceAfter=6) + body = ParagraphStyle("B", parent=styles["Normal"], fontName=font, fontSize=10, leading=15, alignment=TA_JUSTIFY) + small = ParagraphStyle("S", parent=body, fontSize=8, textColor=colors.grey) + center = ParagraphStyle("C", parent=body, alignment=TA_CENTER) + + portfolio = load_portfolio() + strategies = load_strategy_metrics() + ready_n = sum(1 for s in strategies if s["ready"]) + + doc = SimpleDocTemplate(str(OUT_PDF), pagesize=A4, leftMargin=2 * cm, rightMargin=2 * cm, topMargin=2 * cm, bottomMargin=2 * cm) + story: list = [] + + # Cover + story.append(Spacer(1, 3 * cm)) + story.append(Paragraph("UnitedEA 智能交易集群", title)) + story.append(Spacer(1, 0.5 * cm)) + story.append(Paragraph("代客理财 · 产品介绍与业绩分析", ParagraphStyle("sub", parent=title, fontSize=14))) + story.append(Spacer(1, 1.5 * cm)) + story.append(Paragraph(f"回测区间:2023年7月 — 2026年6月(近三年)", center)) + story.append(Paragraph(f"报告日期:{date.today().isoformat()}", center)) + story.append(Spacer(1, 2 * cm)) + story.append(Paragraph( + "本材料基于 MetaTrader 5 策略测试器历史回测数据整理,仅供合格投资者参考。" + "过往业绩不代表未来收益,外汇及差价合约交易存在本金损失风险。", + small, + )) + story.append(PageBreak()) + + # Product intro + story.append(Paragraph("一、产品介绍", h1)) + story.append(Paragraph( + "UnitedEA 是一套运行于 MetaTrader 5 平台的多策略智能交易集群(Expert Advisor Cluster)。" + "通过在同一账户内并行运行 19 个经独立优化、低相关性的子策略机器人,实现跨品种、跨逻辑的风险分散:" + "涵盖黄金趋势(DarvasBox、EMA 斜率)、RSI 反转与剥头皮、亚洲时段均值回归、指数突破(美日指数、德指、标普)" + "以及加密货币趋势跟踪等。", + body, + )) + story.append(Spacer(1, 0.3 * cm)) + story.append(Paragraph("核心服务要素", h2)) + bullets = [ + "▸ 全自动执行:7×24 监控信号,无需人工盯盘", + "▸ 组合化管理:19 个子策略统一风控、统一资金调度", + "▸ 动态仓位:按账户净值相对基准余额($3,000)自动缩放手数", + "▸ 逐策略审计:定期对每机器人进行手数遗传优化、信号替换 A/B 测试", + "▸ 风险隔离:高保证金品种(如 MU)默认关闭;单策略最大手数有上限", + ] + for b in bullets: + story.append(Paragraph(b, body)) + story.append(Spacer(1, 0.15 * cm)) + + story.append(Spacer(1, 0.4 * cm)) + story.append(Paragraph("适用投资者", h2)) + story.append(Paragraph( + "具备外汇/差价合约基础知识、风险承受能力中等及以上、追求长期稳健复利(非短期暴利)的投资者。" + "建议起始资金不低于 $3,000,与系统参考余额一致,以便手数缩放比例合理。", + body, + )) + story.append(PageBreak()) + + # Methodology + story.append(Paragraph("二、回测方法与数据来源", h1)) + story.append(Paragraph( + "本报告数据直接解析自本地 MT5 客户端策略测试器生成的 HTML 报告" + "(%APPDATA%\\MetaQuotes\\Terminal\\<terminal-id>)。", + body, + )) + meth = [ + ["初始资金", "$3,000"], + ["杠杆", "1:1000"], + ["回测区间", "2023.07.01 — 2026.06.01"], + ["测试模型", "1 分钟 OHLC(每个即时价位)"], + ["组合测试品种", "NAS100 H1(集群统一调度)"], + ["仓位缩放", "ORCH_ScaleLotsByBalance = true,参考余额 $3,000"], + ["生产策略数", f"{len(PRODUCTION_IDS)} 个"], + ["报告解析", f"已解析 {ready_n}/{len(PRODUCTION_IDS)} 个单策略报告 + 组合报告"], + ] + t = Table(meth, colWidths=[5 * cm, 11 * cm]) + t.setStyle(TableStyle([ + ("FONT", (0, 0), (-1, -1), font, 9), + ("BACKGROUND", (0, 0), (0, -1), colors.HexColor("#f0f4f8")), + ("GRID", (0, 0), (-1, -1), 0.5, colors.lightgrey), + ("VALIGN", (0, 0), (-1, -1), "MIDDLE"), + ("LEFTPADDING", (0, 0), (-1, -1), 6), + ])) + story.append(Spacer(1, 0.3 * cm)) + story.append(t) + story.append(Spacer(1, 0.4 * cm)) + story.append(Paragraph( + "说明:组合层面「总净盈利」在余额复利缩放下会随净值膨胀而数值极大," + "不宜与初始资金直接对比。评估策略质量应优先参考盈利因子(PF)、夏普比率、最大回撤及单策略独立回测。", + small, + )) + story.append(PageBreak()) + + # Portfolio + story.append(Paragraph("三、组合层面业绩(近三年)", h1)) + if portfolio.get("ready"): + pf = portfolio + port_data = [ + ["指标", "数值"], + ["数据来源", pf.get("source", "—")], + ["盈利因子 PF", fmt(pf.get("profit_factor"))], + ["夏普比率", fmt(pf.get("sharpe"))], + ["总交易笔数", fmt(pf.get("total_trades"), 0)], + ["总净盈利(复利缩放后)", f"${fmt(pf.get('net_profit'))}"], + ["最大净值回撤", pf.get("max_drawdown", "—")], + ["胜率", pf.get("win_rate", "—")], + ] + pt = Table(port_data, colWidths=[5.5 * cm, 10.5 * cm]) + pt.setStyle(TableStyle([ + ("FONT", (0, 0), (-1, -1), font, 10), + ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#1a365d")), + ("TEXTCOLOR", (0, 0), (-1, 0), colors.white), + ("GRID", (0, 0), (-1, -1), 0.5, colors.lightgrey), + ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, colors.HexColor("#f7fafc")]), + ])) + story.append(pt) + story.append(Spacer(1, 0.5 * cm)) + story.append(Paragraph( + f"当前生产组合(19 策略)经遗传算法优化手数后," + f"盈利因子 {fmt(pf.get('profit_factor'))}、夏普 {fmt(pf.get('sharpe'))}," + f"在三年回测期内共执行约 {fmt(pf.get('total_trades'), 0)} 笔交易。" + "组合通过多策略互补降低单一品种风险,但黄金相关策略仍占利润权重较高,需持续关注。", + body, + )) + else: + story.append(Paragraph("未找到组合回测报告(prod_v2_combined.htm),请先在 MT5 运行组合回测。", body)) + story.append(PageBreak()) + + # Per-robot table + story.append(Paragraph("四、各子机器人独立业绩分析", h1)) + story.append(Paragraph( + "下表为各策略在优化手数下、单独运行的近三年回测结果(Close-on-reverse 关闭状态,除标注外)。" + "「三年回报」= 净盈利 ÷ 基准资金 $3,000,仅为粗略参考。", + body, + )) + story.append(Spacer(1, 0.3 * cm)) + + header = ["代码", "策略名称", "手数", "PF", "夏普", "净盈利$", "三年回报", "交易数", "最大回撤", "分级", "信号平仓"] + table_data = [header] + for s in sorted(strategies, key=lambda x: (x["tier"], -(x["net"] or 0))): + table_data.append([ + s["id"], + s["name"][:12], + fmt(s["lot"], 2) if isinstance(s["lot"], float) else s["lot"], + fmt(s["pf"]), + fmt(s["sharpe"]), + fmt(s["net"], 0), + s["ret_pct"], + fmt(s["trades"], 0), + str(s["dd"])[:18], + s["tier"], + s["close_on"], + ]) + + col_w = [1.1 * cm, 2.6 * cm, 1.0 * cm, 0.9 * cm, 0.9 * cm, 1.6 * cm, 1.4 * cm, 1.2 * cm, 2.2 * cm, 1.0 * cm, 1.2 * cm] + st = Table(table_data, colWidths=col_w, repeatRows=1) + st.setStyle(TableStyle([ + ("FONT", (0, 0), (-1, -1), font, 7), + ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#2d3748")), + ("TEXTCOLOR", (0, 0), (-1, 0), colors.white), + ("GRID", (0, 0), (-1, -1), 0.25, colors.lightgrey), + ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, colors.HexColor("#f8f9fa")]), + ("ALIGN", (2, 1), (7, -1), "CENTER"), + ])) + story.append(st) + + story.append(Spacer(1, 0.5 * cm)) + story.append(Paragraph("分级说明", h2)) + story.append(Paragraph( + "明星(PF≥1.5 或夏普≥5):RS_BTCUSD、RS_XAUUSD、RS_US30、RS_NAS100、DB、ES — 组合核心利润来源。
" + "稳健(PF 1.1–1.5):RC、RM、NVDA、TSLA、ST_BTC、UB、U5B、GB、UKB — 提供分散与缓冲。
" + "观察(PF<1.15 或夏普<1):SE、ST_XAU、RRA_AUD、RRA_GBP — 已降至最小手数,持续监控。", + body, + )) + story.append(PageBreak()) + + # Adjustments + story.append(Paragraph("五、已完成的策略调整(2026年)", h1)) + adj = [ + ["调整项", "内容", "效果"], + ["组合扩容", "由 11 策略扩至 19 策略,新增 BTC/XAU 剥头皮、趋势、亚式、指数等", "分散品种,提升夏普"], + ["手数遗传优化", "逐策略网格搜索最优手数(股票 5–15,其余 0.01–0.1)", "PF/夏普最大化"], + ["US30 降杠杆", "US30 手数 0.08→0.02,控制回撤", "夏普 8.67→10.47"], + ["高保证金剔除", "MU 等高保证金股票默认关闭", "降低爆仓风险"], + ["信号替换审计", "19 策略逐一 A/B 测试「亏损单遇反向信号平仓」", "仅 ES/XAU/US30 开启"], + ["TSLA 关闭信号平仓", "原开启,新审计为中性偏负", "减少无效换手"], + ["GAP 跳空防护", "测试后保持关闭(影响微小)", "简化逻辑"], + ] + at = Table(adj, colWidths=[3.2 * cm, 8.3 * cm, 4.5 * cm]) + at.setStyle(TableStyle([ + ("FONT", (0, 0), (-1, -1), font, 9), + ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#1a365d")), + ("TEXTCOLOR", (0, 0), (-1, 0), colors.white), + ("GRID", (0, 0), (-1, -1), 0.5, colors.lightgrey), + ("VALIGN", (0, 0), (-1, -1), "TOP"), + ])) + story.append(at) + story.append(PageBreak()) + + # Roadmap + story.append(Paragraph("六、后续优化路线图", h1)) + roadmap = [ + ("Q3 2026 — 监控与微调", [ + "每月重跑单策略 + 组合回测,对比实盘滑点", + "观察 SE(SuperEMA)是否继续拖累,考虑移出生产组合", + "RRA_AUD / RRA_GBP 亚式策略:信号平仓已证实有害,保持关闭并评估是否降权", + ]), + ("Q4 2026 — 风控强化", [ + "引入组合层面最大回撤熔断(如净值回撤 >20% 暂停开仓)", + "黄金高相关策略(RM、RS_XAU、ST_XAU)设利润集中度上限", + "实盘与回测逐月对账脚本自动化", + ]), + ("2027 — 扩展研究", [ + "新指数/外汇机器人候选池定期审计(disabled_audit 流程)", + "探索 AI 信号过滤层(ONNX 模型)与规则策略混合", + "多账户分策略托管方案(高夏普策略独立账户)", + ]), + ] + for title_txt, items in roadmap: + story.append(Paragraph(title_txt, h2)) + for it in items: + story.append(Paragraph(f"• {it}", body)) + story.append(Spacer(1, 0.1 * cm)) + story.append(Spacer(1, 0.2 * cm)) + + story.append(Spacer(1, 0.8 * cm)) + story.append(HRFlowable(width="100%", color=colors.lightgrey)) + story.append(Spacer(1, 0.3 * cm)) + story.append(Paragraph( + "免责声明:本文件不构成投资建议。外汇、贵金属、指数及股票差价合约具有高风险," + "您可能损失全部本金。请在充分了解风险后自主决策,必要时咨询持牌金融顾问。", + small, + )) + + doc.build(story, onFirstPage=make_watermark(font), onLaterPages=make_watermark(font)) + print(f"Generated: {OUT_PDF}") + + +if __name__ == "__main__": + f = register_fonts() + build_pdf(f) diff --git a/frontline/cluster-latest/self-evaluate.mq5 b/frontline/cluster-latest/self-evaluate.mq5 index 971c874..e945ba8 100644 --- a/frontline/cluster-latest/self-evaluate.mq5 +++ b/frontline/cluster-latest/self-evaluate.mq5 @@ -104,6 +104,7 @@ input double RC_exitBuyRSI = 86; input double RC_exitSellRSI = 10; input double RC_TrailingStop = 295; input double RC_emaDistanceThreshold = 165; +input bool RC_UseTrendStrengthFilter = true; input int RC_tradingHourOneBegin = 24; input int RC_tradingHourOneEnd = 22; input int RC_tradingHourTwoBegin = 6; diff --git a/frontline/united_template/_united-V2/MagicNumberHelpers.mqh b/frontline/united_template/_united-V2/MagicNumberHelpers.mqh index dc1fa31..0709dc9 100644 --- a/frontline/united_template/_united-V2/MagicNumberHelpers.mqh +++ b/frontline/united_template/_united-V2/MagicNumberHelpers.mqh @@ -157,3 +157,30 @@ int CountPositionsByMagic(string symbol, ulong magic_number) } //+------------------------------------------------------------------+ +//| Align volume to SYMBOL_VOLUME_STEP / min / max (avoids Invalid volume) | +//+------------------------------------------------------------------+ +double United_NormalizeVolume(const string symbol, double volume) +{ + double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN); + double maxLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); + double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP); + if(lotStep <= 0.0) + lotStep = 0.01; + + double v = MathFloor(volume / lotStep) * lotStep; + + if(v < minLot) + v = minLot; + if(v > maxLot) + v = maxLot; + + int digits = (int)MathCeil(-MathLog10(lotStep)); + if(digits < 0) + digits = 0; + if(digits > 8) + digits = 8; + + return NormalizeDouble(v, digits); +} + +//+------------------------------------------------------------------+ diff --git a/frontline/united_template/_united-V2/Strategies/DarvasBoxStrategy.mqh b/frontline/united_template/_united-V2/Strategies/DarvasBoxStrategy.mqh index 62e6450..83570ea 100644 --- a/frontline/united_template/_united-V2/Strategies/DarvasBoxStrategy.mqh +++ b/frontline/united_template/_united-V2/Strategies/DarvasBoxStrategy.mqh @@ -1,12 +1,18 @@ //+------------------------------------------------------------------+ //| DarvasBoxStrategy.mqh | //+------------------------------------------------------------------+ -#if defined(CLUSTER0_ORCHESTRATOR) || defined(UNITED_V2_DYNAMIC_LOTS) +// MQL5: no #if — use #ifdef only (no defined() / || in one #if) +#ifdef UNITED_V2_DYNAMIC_LOTS +extern double g_DB_LotSize; +#define DARVAS_TRADE_LOT (g_DB_LotSize) +#else +#ifdef CLUSTER0_ORCHESTRATOR extern double g_DB_LotSize; #define DARVAS_TRADE_LOT (g_DB_LotSize) #else #define DARVAS_TRADE_LOT 0.01 #endif +#endif bool InitDarvasBox(string symbol) { @@ -197,13 +203,19 @@ bool PlaceOrder(ENUM_ORDER_TYPE orderType, double price, double sl, double tp) } bool result = false; + const double lot = United_NormalizeVolume(dbData.symbol, DARVAS_TRADE_LOT); + if(lot <= 0.0) + { + Print("DarvasBox: Order rejected - invalid lot after normalize (raw=", DARVAS_TRADE_LOT, ")"); + return false; + } // Use market price (0) instead of explicit price - this ensures market order execution // In backtesting, explicit price might fail if price has moved if(orderType == ORDER_TYPE_BUY) - result = dbData.trade.Buy(DARVAS_TRADE_LOT, dbData.symbol, 0, sl, tp, "Darvas Box Breakout"); + result = dbData.trade.Buy(lot, dbData.symbol, 0, sl, tp, "Darvas Box Breakout"); else - result = dbData.trade.Sell(DARVAS_TRADE_LOT, dbData.symbol, 0, sl, tp, "Darvas Box Breakdown"); + result = dbData.trade.Sell(lot, dbData.symbol, 0, sl, tp, "Darvas Box Breakdown"); // Always log errors, success only if logging enabled if(result) diff --git a/frontline/united_template/_united-V2/Strategies/RSICrossOverReversalStrategy.mqh b/frontline/united_template/_united-V2/Strategies/RSICrossOverReversalStrategy.mqh index 266292a..06f7587 100644 --- a/frontline/united_template/_united-V2/Strategies/RSICrossOverReversalStrategy.mqh +++ b/frontline/united_template/_united-V2/Strategies/RSICrossOverReversalStrategy.mqh @@ -45,6 +45,29 @@ int TimeHour(datetime when = 0) return dt.hour; } +double RC_NormalizeLot(const string sym, const double lots) +{ + const double mn = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN); + const double mx = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX); + double step = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP); + if(step <= 0.0) + step = 0.01; + double v = MathMax(lots, mn); + v = MathMin(v, mx); + return NormalizeDouble(MathFloor(v / step + 0.5) * step, 2); +} + +bool RC_IsTrendStrong(const double emaSlope, const double priceToEmaDistance) +{ + if(!RC_UseTrendStrengthFilter) + return false; + const bool slopeStrong = (RC_emaSlopeThreshold > 0.0) + && (MathAbs(emaSlope) > RC_emaSlopeThreshold); + const bool distanceStrong = (RC_emaDistanceThreshold > 0.0) + && (MathAbs(priceToEmaDistance) > RC_emaDistanceThreshold); + return slopeStrong || distanceStrong; +} + bool InitRSICrossOverReversal(string symbol) { WeekDays_Init(); @@ -79,6 +102,8 @@ bool InitRSICrossOverReversal(string symbol) } rcData.trade.SetExpertMagicNumber(RC_MagicNumber); + rcData.trade.SetDeviationInPoints(RC_slippage); + rcData.trade.SetTypeFillingBySymbol(symbol); rcData.isInitialized = true; Print("RSICrossOverReversal: Successfully initialized for symbol '", symbol, "'"); return true; @@ -147,9 +172,12 @@ void ProcessRSICrossOverReversal(string symbol) return; rcData.symbol = symbol; // Update symbol in case it changed - if(rcData.bartime == iTime(rcData.symbol, RC_BarTimeFrame, 0)) + const datetime barTime = iTime(rcData.symbol, RC_BarTimeFrame, 0); + if(barTime == 0) return; - rcData.bartime = iTime(rcData.symbol, RC_BarTimeFrame, 0); + if(rcData.bartime == barTime) + return; + rcData.bartime = barTime; double rsi[]; if(CopyBuffer(rcData.rsiHandle, 0, 0, 2, rsi) <= 0) @@ -209,7 +237,7 @@ void ProcessRSICrossOverReversal(string symbol) ApplyTrailingStop(); bool cooldownPassed = (currentTime - rcData.lastTradeTime) >= RC_cooldownSeconds; - bool isTrendStrong = MathAbs(emaSlope) > RC_emaSlopeThreshold || MathAbs(priceToEmaDistance) > RC_emaDistanceThreshold; + const bool isTrendStrong = RC_IsTrendStrong(emaSlope, priceToEmaDistance); if(isBuyPosition && currentRSI > RC_exitBuyRSI) { @@ -229,25 +257,36 @@ void ProcessRSICrossOverReversal(string symbol) rcData.lastTradeTime = currentTime; } - if(!isTrendStrong && - currentRSI < RC_overboughtLevel - RC_entryRSISellSpread && rcData.previousRSIDef >= RC_overboughtLevel && - !isSellPosition && !hasPosition && cooldownPassed) + hasPosition = PositionExistsByMagic(rcData.symbol, RC_MagicNumber); + isBuyPosition = false; + isSellPosition = false; + if(hasPosition && PositionSelectByMagic(rcData.symbol, RC_MagicNumber)) { - rcData.trade.SetExpertMagicNumber(RC_MagicNumber); - if(rcData.trade.Sell(g_RC_LotSize, rcData.symbol, 0.0, 0.0, 0.0, "Sell Order")) - { - rcData.lastTradeTime = currentTime; - } + const ENUM_POSITION_TYPE positionType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + if(positionType == POSITION_TYPE_BUY) + isBuyPosition = true; + else if(positionType == POSITION_TYPE_SELL) + isSellPosition = true; } - if(!isTrendStrong && - currentRSI > RC_oversoldLevel + RC_entryRSIBuySpread && rcData.previousRSIDef <= RC_oversoldLevel && - !isBuyPosition && !hasPosition && cooldownPassed) + const double lots = RC_NormalizeLot(rcData.symbol, g_RC_LotSize); + if(lots > 0.0 && !isTrendStrong && cooldownPassed && !hasPosition) { - rcData.trade.SetExpertMagicNumber(RC_MagicNumber); - if(rcData.trade.Buy(g_RC_LotSize, rcData.symbol, 0.0, 0.0, 0.0, "Buy Order")) + if(currentRSI < RC_overboughtLevel - RC_entryRSISellSpread + && rcData.previousRSIDef >= RC_overboughtLevel + && !isSellPosition) { - rcData.lastTradeTime = currentTime; + rcData.trade.SetExpertMagicNumber(RC_MagicNumber); + if(rcData.trade.Sell(lots, rcData.symbol, 0.0, 0.0, 0.0, "Sell Order")) + rcData.lastTradeTime = currentTime; + } + else if(currentRSI > RC_oversoldLevel + RC_entryRSIBuySpread + && rcData.previousRSIDef <= RC_oversoldLevel + && !isBuyPosition) + { + rcData.trade.SetExpertMagicNumber(RC_MagicNumber); + if(rcData.trade.Buy(lots, rcData.symbol, 0.0, 0.0, 0.0, "Buy Order")) + rcData.lastTradeTime = currentTime; } } diff --git a/frontline/united_template/_united-V2/main.mq5 b/frontline/united_template/_united-V2/main.mq5 index 2cbee46..d900e38 100644 --- a/frontline/united_template/_united-V2/main.mq5 +++ b/frontline/united_template/_united-V2/main.mq5 @@ -163,6 +163,7 @@ input double RC_exitBuyRSI = 86; input double RC_exitSellRSI = 10; input double RC_TrailingStop = 295; input double RC_emaDistanceThreshold = 165; +input bool RC_UseTrendStrengthFilter = true; input int RC_tradingHourOneBegin = 24; input int RC_tradingHourOneEnd = 22; input int RC_tradingHourTwoBegin = 6; diff --git a/frontline/united_template/_united-V2/report.png b/frontline/united_template/_united-V2/report.png deleted file mode 100644 index a174d73..0000000 Binary files a/frontline/united_template/_united-V2/report.png and /dev/null differ diff --git a/frontline/united_template/_united/report.png b/frontline/united_template/_united/report.png deleted file mode 100644 index a174d73..0000000 Binary files a/frontline/united_template/_united/report.png and /dev/null differ diff --git a/frontline/units-sharpshooter/EMASlopeDistanceCocktailXAUUSD-sharpshooter/report.html b/frontline/units-sharpshooter/EMASlopeDistanceCocktailXAUUSD-sharpshooter/report.html deleted file mode 100644 index 8d9931f..0000000 Binary files a/frontline/units-sharpshooter/EMASlopeDistanceCocktailXAUUSD-sharpshooter/report.html and /dev/null differ diff --git a/frontline/units-sharpshooter/EMASlopeDistanceCocktailXAUUSD-sharpshooter/report.png b/frontline/units-sharpshooter/EMASlopeDistanceCocktailXAUUSD-sharpshooter/report.png deleted file mode 100644 index c0bf45b..0000000 Binary files a/frontline/units-sharpshooter/EMASlopeDistanceCocktailXAUUSD-sharpshooter/report.png and /dev/null differ diff --git a/frontline/units-trailing/EMASlopeDistanceCocktailXAUUSD-trailing/report.html b/frontline/units-trailing/EMASlopeDistanceCocktailXAUUSD-trailing/report.html deleted file mode 100644 index 8d9931f..0000000 Binary files a/frontline/units-trailing/EMASlopeDistanceCocktailXAUUSD-trailing/report.html and /dev/null differ diff --git a/frontline/units-trailing/EMASlopeDistanceCocktailXAUUSD-trailing/report.png b/frontline/units-trailing/EMASlopeDistanceCocktailXAUUSD-trailing/report.png deleted file mode 100644 index c0bf45b..0000000 Binary files a/frontline/units-trailing/EMASlopeDistanceCocktailXAUUSD-trailing/report.png and /dev/null differ diff --git a/frontline/units-trailing/RSIScalpingADBE-trailing/main.mq5 b/frontline/units-trailing/RSIScalpingADBE-trailing/main.mq5 new file mode 100644 index 0000000..6b66b8b --- /dev/null +++ b/frontline/units-trailing/RSIScalpingADBE-trailing/main.mq5 @@ -0,0 +1,408 @@ +//+------------------------------------------------------------------+ +//| RSIScalping.mq5 | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.01" + +#include +#include "../_united/MagicNumberHelpers.mqh" + +//--- Input parameters +input ENUM_TIMEFRAMES TimeFrame = (ENUM_TIMEFRAMES)6; // Timeframe for Analysis +input int RSI_Period = 15; // RSI Period +input ENUM_APPLIED_PRICE RSI_Applied_Price = PRICE_OPEN; // RSI Applied Price +input double RSI_Overbought = 16; // RSI Overbought Level +input double RSI_Oversold = 42; // RSI Oversold Level +input double RSI_Target_Buy = 67; // RSI Target for Buy Exit +input double RSI_Target_Sell = 62; // RSI Target for Sell Exit +input int BarsToWait = 8; // Bars to wait when RSI goes against position +input double LotSize = 5; // Lot Size +input int MagicNumber = 12345; // Magic Number +input int Slippage = 3; // Slippage in points + +input group "=== Trailing stop ===" +input bool UseTrailingStop = true; // move SL behind bid/ask while in profit +input double TrailingStopDistancePoints = 425.0; // SL distance from bid/ask (points) +input double TrailingActivationPoints = 18.5; // min profit before trailing (0 = same as distance) + +//--- Global variables +CTrade trade; +int rsi_handle; +double rsi_buffer[]; +double rsi_prev, rsi_current, rsi_two_bars_ago; +bool position_open = false; +int position_ticket = 0; +ENUM_POSITION_TYPE current_position_type = POSITION_TYPE_BUY; +datetime last_bar_time = 0; +bool rsi_against_position = false; +int bars_against_count = 0; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsi_handle = iRSI(_Symbol, TimeFrame, RSI_Period, RSI_Applied_Price); + if(rsi_handle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Initialize trade object + trade.SetExpertMagicNumber(MagicNumber); + trade.SetDeviationInPoints(Slippage); + trade.SetTypeFilling(ORDER_FILLING_FOK); + + // Allocate arrays + ArraySetAsSeries(rsi_buffer, true); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + if(rsi_handle != INVALID_HANDLE) + IndicatorRelease(rsi_handle); +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + if(Bars(_Symbol, TimeFrame) < RSI_Period + 2) + return; + + const datetime current_bar_time = iTime(_Symbol, TimeFrame, 0); + const bool new_bar = (current_bar_time != last_bar_time); + const bool in_pos = position_open || PositionExistsByMagic(_Symbol, (ulong)MagicNumber); + + if(!in_pos && !new_bar) + return; + + if(!UpdateRSI()) + return; + + if(in_pos && UseTrailingStop) + ApplyTrailingStop(); + + if(!new_bar) + return; + + last_bar_time = current_bar_time; + + ResyncPositionFromMarket(); + CheckExistingPosition(); + + if(!position_open && !PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + CheckEntrySignals(); +} + +//+------------------------------------------------------------------+ +//| Update RSI values | +//+------------------------------------------------------------------+ +bool UpdateRSI() +{ + if(CopyBuffer(rsi_handle, 0, 0, 3, rsi_buffer) < 3) + { + return false; + } + + rsi_current = rsi_buffer[0]; // Current bar + rsi_prev = rsi_buffer[1]; // Previous bar + rsi_two_bars_ago = rsi_buffer[2]; // Two bars ago + + return true; +} + +//+------------------------------------------------------------------+ +//| Trail SL behind favorable price (every tick when enabled) | +//+------------------------------------------------------------------+ +void ApplyTrailingStop() +{ + if(TrailingStopDistancePoints <= 0.0) + return; + if(!PositionSelectByMagic(_Symbol, (ulong)MagicNumber)) + return; + + const double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT); + if(point <= 0.0) + return; + + const int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); + const double trail_dist = TrailingStopDistancePoints * point; + const double activation_pts = (TrailingActivationPoints > 0.0) + ? TrailingActivationPoints + : TrailingStopDistancePoints; + const double activation = activation_pts * point; + const long stops_level = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL); + const double min_dist = (double)stops_level * point; + + const ENUM_POSITION_TYPE ptype = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + const double entry = PositionGetDouble(POSITION_PRICE_OPEN); + const double cur_sl = PositionGetDouble(POSITION_SL); + const double cur_tp = PositionGetDouble(POSITION_TP); + + if(ptype == POSITION_TYPE_BUY) + { + const double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + if(bid - entry <= activation) + return; + + double new_sl = NormalizeDouble(bid - trail_dist, digits); + if(min_dist > 0.0 && bid - new_sl < min_dist) + new_sl = NormalizeDouble(bid - min_dist, digits); + + if(new_sl >= bid || new_sl <= 0.0) + return; + if(cur_sl > 0.0 && new_sl <= cur_sl) + return; + + ModifyPositionByMagic(trade, _Symbol, (ulong)MagicNumber, new_sl, cur_tp); + } + else if(ptype == POSITION_TYPE_SELL) + { + const double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + if(entry - ask <= activation) + return; + + double new_sl = NormalizeDouble(ask + trail_dist, digits); + if(min_dist > 0.0 && new_sl - ask < min_dist) + new_sl = NormalizeDouble(ask + min_dist, digits); + + if(new_sl <= ask || new_sl <= 0.0) + return; + if(cur_sl > 0.0 && new_sl >= cur_sl) + return; + + ModifyPositionByMagic(trade, _Symbol, (ulong)MagicNumber, new_sl, cur_tp); + } +} + +//+------------------------------------------------------------------+ +//| Sync ticket/state if a position exists after restart | +//+------------------------------------------------------------------+ +void ResyncPositionFromMarket() +{ + if(position_open) + return; + ulong t = GetPositionTicketByMagic(_Symbol, (ulong)MagicNumber); + if(t == 0 || !PositionSelectByTicket(t)) + return; + position_ticket = (int)t; + position_open = true; + current_position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); +} + +//+------------------------------------------------------------------+ +//| Check existing position for exit conditions | +//+------------------------------------------------------------------+ +void CheckExistingPosition() +{ + if(!position_open) + { + return; + } + + // Check if position still exists with correct magic number AND symbol for THIS EA + if(!PositionSelectByTicketSymbolAndMagic(position_ticket, _Symbol, (ulong)MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + return; + } + + // Exit conditions based on RSI target + if(current_position_type == POSITION_TYPE_BUY) + { + // Check if RSI is against the position (below oversold) + if(rsi_current < RSI_Oversold) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit long position when RSI reaches buy target + if(rsi_current >= RSI_Target_Buy) + { + ClosePosition(); + } + } + } + else if(current_position_type == POSITION_TYPE_SELL) + { + // Check if RSI is against the position (above overbought) + if(rsi_current > RSI_Overbought) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit short position when RSI reaches sell target + if(rsi_current <= RSI_Target_Sell) + { + ClosePosition(); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Check for entry signals | +//+------------------------------------------------------------------+ +void CheckEntrySignals() +{ + // Buy signal: RSI crosses from oversold to above oversold (checking the actual crossover) + if(rsi_two_bars_ago <= RSI_Oversold && rsi_prev > RSI_Oversold) + { + OpenBuyPosition(); + } + + // Sell signal: RSI crosses from overbought to below overbought (checking the actual crossover) + if(rsi_two_bars_ago >= RSI_Overbought && rsi_prev < RSI_Overbought) + { + OpenSellPosition(); + } +} + +//+------------------------------------------------------------------+ +//| Open buy position | +//+------------------------------------------------------------------+ +void OpenBuyPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + { + return; // Position already exists for this EA + } + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + if(trade.Buy(LotSize, _Symbol, ask, 0, 0, "RSI Scalping Buy")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, (ulong)MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_BUY; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Open sell position | +//+------------------------------------------------------------------+ +void OpenSellPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + { + return; // Position already exists for this EA + } + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + + if(trade.Sell(LotSize, _Symbol, bid, 0, 0, "RSI Scalping Sell")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, (ulong)MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_SELL; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Close current position | +//+------------------------------------------------------------------+ +void ClosePosition() +{ + // Close position using helper that verifies symbol AND magic number for THIS EA + if(ClosePositionByMagic(trade, _Symbol, (ulong)MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } + else + { + // Position doesn't exist or wrong magic number - reset tracking + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } +} diff --git a/frontline/units-trailing/RSIScalpingAPPL-trailing/APPL_Genetic_Optimization.set b/frontline/units-trailing/RSIScalpingAPPL-trailing/APPL_Genetic_Optimization.set new file mode 100644 index 0000000..7057ac7 --- /dev/null +++ b/frontline/units-trailing/RSIScalpingAPPL-trailing/APPL_Genetic_Optimization.set @@ -0,0 +1,19 @@ +; saved on 2026.06.01 18:41:20 +; this file contains input parameters for testing/optimizing RSIScalping expert advisor +; to use it in the strategy tester, click Load in the context menu of the Inputs tab +; +TimeFrame=16385||5||5||16385||Y +RSI_Period=8||1||7||21||Y +RSI_Applied_Price=1||0||1||1||N +RSI_Overbought=62||2.0||60.0||85.0||Y +RSI_Oversold=32||2.0||15.0||40.0||Y +RSI_Target_Buy=67||2.0||65.0||90.0||Y +RSI_Target_Sell=2||2.0||10.0||35.0||Y +BarsToWait=5||1||1||12||Y +LotSize=25||5.0||5.0||100.0||N +MagicNumber=12345||0||12345||12345||N +Slippage=3||0||3||3||N +; === Trailing stop === +UseTrailingStop=true||false||0||true||N +TrailingStopDistancePoints=50||50||100.0||800.0||Y +TrailingActivationPoints=39.0||5.0||0.500000||50.000000||Y diff --git a/frontline/units-trailing/RSIScalpingAPPL-trailing/main.mq5 b/frontline/units-trailing/RSIScalpingAPPL-trailing/main.mq5 new file mode 100644 index 0000000..fd99b33 --- /dev/null +++ b/frontline/units-trailing/RSIScalpingAPPL-trailing/main.mq5 @@ -0,0 +1,408 @@ +//+------------------------------------------------------------------+ +//| RSIScalping.mq5 | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.01" + +#include +#include "../_united/MagicNumberHelpers.mqh" + +//--- Input parameters +input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1; // Timeframe for Analysis +input int RSI_Period = 8; // RSI Period +input ENUM_APPLIED_PRICE RSI_Applied_Price = PRICE_CLOSE; // RSI Applied Price +input double RSI_Overbought = 62; // RSI Overbought Level +input double RSI_Oversold = 32; // RSI Oversold Level +input double RSI_Target_Buy = 67; // RSI Target for Buy Exit +input double RSI_Target_Sell = 2; // RSI Target for Sell Exit +input int BarsToWait = 5; // Bars to wait when RSI goes against position +input double LotSize = 25; // Lot Size +input int MagicNumber = 12345; // Magic Number +input int Slippage = 3; // Slippage in points + +input group "=== Trailing stop ===" +input bool UseTrailingStop = true; // move SL behind bid/ask while in profit +input double TrailingStopDistancePoints = 50.0; // SL distance from bid/ask (points) +input double TrailingActivationPoints = 39.0; // min profit before trailing (0 = same as distance) + +//--- Global variables +CTrade trade; +int rsi_handle; +double rsi_buffer[]; +double rsi_prev, rsi_current, rsi_two_bars_ago; +bool position_open = false; +int position_ticket = 0; +ENUM_POSITION_TYPE current_position_type = POSITION_TYPE_BUY; +datetime last_bar_time = 0; +bool rsi_against_position = false; +int bars_against_count = 0; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsi_handle = iRSI(_Symbol, TimeFrame, RSI_Period, RSI_Applied_Price); + if(rsi_handle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Initialize trade object + trade.SetExpertMagicNumber(MagicNumber); + trade.SetDeviationInPoints(Slippage); + trade.SetTypeFilling(ORDER_FILLING_FOK); + + // Allocate arrays + ArraySetAsSeries(rsi_buffer, true); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + if(rsi_handle != INVALID_HANDLE) + IndicatorRelease(rsi_handle); +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + if(Bars(_Symbol, TimeFrame) < RSI_Period + 2) + return; + + const datetime current_bar_time = iTime(_Symbol, TimeFrame, 0); + const bool new_bar = (current_bar_time != last_bar_time); + const bool in_pos = position_open || PositionExistsByMagic(_Symbol, (ulong)MagicNumber); + + if(!in_pos && !new_bar) + return; + + if(!UpdateRSI()) + return; + + if(in_pos && UseTrailingStop) + ApplyTrailingStop(); + + if(!new_bar) + return; + + last_bar_time = current_bar_time; + + ResyncPositionFromMarket(); + CheckExistingPosition(); + + if(!position_open && !PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + CheckEntrySignals(); +} + +//+------------------------------------------------------------------+ +//| Update RSI values | +//+------------------------------------------------------------------+ +bool UpdateRSI() +{ + if(CopyBuffer(rsi_handle, 0, 0, 3, rsi_buffer) < 3) + { + return false; + } + + rsi_current = rsi_buffer[0]; // Current bar + rsi_prev = rsi_buffer[1]; // Previous bar + rsi_two_bars_ago = rsi_buffer[2]; // Two bars ago + + return true; +} + +//+------------------------------------------------------------------+ +//| Trail SL behind favorable price (every tick when enabled) | +//+------------------------------------------------------------------+ +void ApplyTrailingStop() +{ + if(TrailingStopDistancePoints <= 0.0) + return; + if(!PositionSelectByMagic(_Symbol, (ulong)MagicNumber)) + return; + + const double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT); + if(point <= 0.0) + return; + + const int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); + const double trail_dist = TrailingStopDistancePoints * point; + const double activation_pts = (TrailingActivationPoints > 0.0) + ? TrailingActivationPoints + : TrailingStopDistancePoints; + const double activation = activation_pts * point; + const long stops_level = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL); + const double min_dist = (double)stops_level * point; + + const ENUM_POSITION_TYPE ptype = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + const double entry = PositionGetDouble(POSITION_PRICE_OPEN); + const double cur_sl = PositionGetDouble(POSITION_SL); + const double cur_tp = PositionGetDouble(POSITION_TP); + + if(ptype == POSITION_TYPE_BUY) + { + const double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + if(bid - entry <= activation) + return; + + double new_sl = NormalizeDouble(bid - trail_dist, digits); + if(min_dist > 0.0 && bid - new_sl < min_dist) + new_sl = NormalizeDouble(bid - min_dist, digits); + + if(new_sl >= bid || new_sl <= 0.0) + return; + if(cur_sl > 0.0 && new_sl <= cur_sl) + return; + + ModifyPositionByMagic(trade, _Symbol, (ulong)MagicNumber, new_sl, cur_tp); + } + else if(ptype == POSITION_TYPE_SELL) + { + const double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + if(entry - ask <= activation) + return; + + double new_sl = NormalizeDouble(ask + trail_dist, digits); + if(min_dist > 0.0 && new_sl - ask < min_dist) + new_sl = NormalizeDouble(ask + min_dist, digits); + + if(new_sl <= ask || new_sl <= 0.0) + return; + if(cur_sl > 0.0 && new_sl >= cur_sl) + return; + + ModifyPositionByMagic(trade, _Symbol, (ulong)MagicNumber, new_sl, cur_tp); + } +} + +//+------------------------------------------------------------------+ +//| Sync ticket/state if a position exists after restart | +//+------------------------------------------------------------------+ +void ResyncPositionFromMarket() +{ + if(position_open) + return; + ulong t = GetPositionTicketByMagic(_Symbol, (ulong)MagicNumber); + if(t == 0 || !PositionSelectByTicket(t)) + return; + position_ticket = (int)t; + position_open = true; + current_position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); +} + +//+------------------------------------------------------------------+ +//| Check existing position for exit conditions | +//+------------------------------------------------------------------+ +void CheckExistingPosition() +{ + if(!position_open) + { + return; + } + + // Check if position still exists with correct magic number AND symbol for THIS EA + if(!PositionSelectByTicketSymbolAndMagic(position_ticket, _Symbol, (ulong)MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + return; + } + + // Exit conditions based on RSI target + if(current_position_type == POSITION_TYPE_BUY) + { + // Check if RSI is against the position (below oversold) + if(rsi_current < RSI_Oversold) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit long position when RSI reaches buy target + if(rsi_current >= RSI_Target_Buy) + { + ClosePosition(); + } + } + } + else if(current_position_type == POSITION_TYPE_SELL) + { + // Check if RSI is against the position (above overbought) + if(rsi_current > RSI_Overbought) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit short position when RSI reaches sell target + if(rsi_current <= RSI_Target_Sell) + { + ClosePosition(); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Check for entry signals | +//+------------------------------------------------------------------+ +void CheckEntrySignals() +{ + // Buy signal: RSI crosses from oversold to above oversold (checking the actual crossover) + if(rsi_two_bars_ago <= RSI_Oversold && rsi_prev > RSI_Oversold) + { + OpenBuyPosition(); + } + + // Sell signal: RSI crosses from overbought to below overbought (checking the actual crossover) + if(rsi_two_bars_ago >= RSI_Overbought && rsi_prev < RSI_Overbought) + { + OpenSellPosition(); + } +} + +//+------------------------------------------------------------------+ +//| Open buy position | +//+------------------------------------------------------------------+ +void OpenBuyPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + { + return; // Position already exists for this EA + } + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + if(trade.Buy(LotSize, _Symbol, ask, 0, 0, "RSI Scalping Buy")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, (ulong)MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_BUY; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Open sell position | +//+------------------------------------------------------------------+ +void OpenSellPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + { + return; // Position already exists for this EA + } + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + + if(trade.Sell(LotSize, _Symbol, bid, 0, 0, "RSI Scalping Sell")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, (ulong)MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_SELL; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Close current position | +//+------------------------------------------------------------------+ +void ClosePosition() +{ + // Close position using helper that verifies symbol AND magic number for THIS EA + if(ClosePositionByMagic(trade, _Symbol, (ulong)MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } + else + { + // Position doesn't exist or wrong magic number - reset tracking + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } +} diff --git a/frontline/units-trailing/RSIScalpingBTCUSD-trailing/report.html b/frontline/units-trailing/RSIScalpingBTCUSD-trailing/report.html deleted file mode 100644 index b512b3d..0000000 Binary files a/frontline/units-trailing/RSIScalpingBTCUSD-trailing/report.html and /dev/null differ diff --git a/frontline/units-trailing/RSIScalpingBTCUSD-trailing/report.png b/frontline/units-trailing/RSIScalpingBTCUSD-trailing/report.png deleted file mode 100644 index 52287c6..0000000 Binary files a/frontline/units-trailing/RSIScalpingBTCUSD-trailing/report.png and /dev/null differ diff --git a/frontline/units-trailing/RSIScalpingTSLA-trailing/report.html b/frontline/units-trailing/RSIScalpingTSLA-trailing/report.html deleted file mode 100644 index 950f95b..0000000 Binary files a/frontline/units-trailing/RSIScalpingTSLA-trailing/report.html and /dev/null differ diff --git a/frontline/units-trailing/RSIScalpingTSLA-trailing/report.png b/frontline/units-trailing/RSIScalpingTSLA-trailing/report.png deleted file mode 100644 index 5a26c1d..0000000 Binary files a/frontline/units-trailing/RSIScalpingTSLA-trailing/report.png and /dev/null differ diff --git a/frontline/units-trailing/RSIScalpingXAUUSD-trailing/report.html b/frontline/units-trailing/RSIScalpingXAUUSD-trailing/report.html deleted file mode 100644 index 203dcf4..0000000 Binary files a/frontline/units-trailing/RSIScalpingXAUUSD-trailing/report.html and /dev/null differ diff --git a/frontline/units-trailing/RSIScalpingXAUUSD-trailing/report.png b/frontline/units-trailing/RSIScalpingXAUUSD-trailing/report.png deleted file mode 100644 index c2c91f2..0000000 Binary files a/frontline/units-trailing/RSIScalpingXAUUSD-trailing/report.png and /dev/null differ diff --git a/frontline/units/DarvasBoxXAUUSD/run_backtest.py b/frontline/units/DarvasBoxXAUUSD/run_backtest.py new file mode 100644 index 0000000..63e5af3 --- /dev/null +++ b/frontline/units/DarvasBoxXAUUSD/run_backtest.py @@ -0,0 +1,470 @@ +""" +DarvasBoxXAUUSD bar backtest — mirrors main.mq5 inputs and logic. + +Outputs (in this folder): + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + Trade, + build_report, + calc_profit, + fill_price, + load_bars, + resolve_symbol, +) + + +@dataclass +class DarvasParams: + box_period: int = 165 + box_deviation: float = 25140.0 + volume_threshold: int = 938 + stop_loss_pts: float = 1665.0 + take_profit_pts: float = 3685.0 + ma_period: int = 125 + trend_threshold: float = 4.94 + volume_ma_period: int = 110 + volume_threshold_multiplier: float = 1.5 + lot_size: float = 0.01 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def weighted_price(df: pd.DataFrame) -> pd.Series: + return (df["high"] + df["low"] + df["close"]) / 3.0 + + +def align_higher_tf_ma(h1_index: pd.DatetimeIndex, h2_ma: pd.Series) -> np.ndarray: + aligned = h2_ma.reindex(h1_index, method="ffill") + return aligned.to_numpy() + + +def volume_ma_ratio(vols: np.ndarray, i: int, period: int) -> float: + if i < period: + return 0.0 + window = vols[i - period : i] + if len(window) == 0: + return 0.0 + vma = float(np.mean(window)) + if vma <= 0: + return 0.0 + return float(vols[i]) / vma + + +def backtest_darvas_unit( + h1: pd.DataFrame, + h2_ma: np.ndarray, + symbol: str, + params: DarvasParams, + costs: CostModel, + period_label: str, +) -> BacktestReport: + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + max_range = params.box_deviation * point + sl_dist = params.stop_loss_pts * point + tp_dist = params.take_profit_pts * point + + highs = h1["high"].to_numpy() + lows = h1["low"].to_numpy() + opens = h1["open"].to_numpy() + closes = h1["close"].to_numpy() + vols = h1["tick_volume"].to_numpy() if "tick_volume" in h1.columns else np.zeros(len(h1)) + + trades: list[Trade] = [] + equity = [params.initial_balance] + side: str | None = None + entry = 0.0 + entry_i = 0 + entry_time = None + sl = 0.0 + tp = 0.0 + + warmup = params.box_period + params.ma_period + params.volume_ma_period + 2 + + def close_pos(i: int, mid: float, reason: str) -> None: + nonlocal side, entry, entry_i, entry_time, sl, tp + if side is None: + return + exit_px = fill_price(mid, point, costs, side, entry=False) + commission = costs.commission_per_lot * params.lot_size * 2.0 + profit = calc_profit(symbol, side, params.lot_size, entry, exit_px) - commission + trades.append( + Trade( + side=side, + open_time=entry_time, + close_time=h1.index[i], + open_price=entry, + close_price=exit_px, + volume=params.lot_size, + profit=profit, + bars_held=i - entry_i, + exit_reason=reason, + ) + ) + equity.append(equity[-1] + profit) + side = None + + def open_pos(i: int, order_side: str, mid: float) -> None: + nonlocal side, entry, entry_i, entry_time, sl, tp + side = order_side + entry = fill_price(mid, point, costs, order_side, entry=True) + entry_i = i + entry_time = h1.index[i] + if order_side == "BUY": + sl = entry - sl_dist + tp = entry + tp_dist + else: + sl = entry + sl_dist + tp = entry - tp_dist + + def trend_ok(i: int, order_side: str, price: float) -> bool: + ma_v = float(h2_ma[i - 1]) + if np.isnan(ma_v): + return False + strength = abs(price - ma_v) / point + if order_side == "BUY": + return price > ma_v and strength > params.trend_threshold + return price < ma_v and strength > params.trend_threshold + + for i in range(warmup, len(h1)): + bar_hi = float(highs[i]) + bar_lo = float(lows[i]) + mid = float(opens[i]) + + if side: + if side == "BUY": + if sl > 0 and bar_lo <= sl: + close_pos(i, sl, "sl") + elif tp > 0 and bar_hi >= tp: + close_pos(i, tp, "tp") + else: + if sl > 0 and bar_hi >= sl: + close_pos(i, sl, "sl") + elif tp > 0 and bar_lo <= tp: + close_pos(i, tp, "tp") + if len(equity) == len(trades) + 1: + equity.append(equity[-1]) + continue + + window_hi = float(np.max(highs[i - params.box_period : i])) + window_lo = float(np.min(lows[i - params.box_period : i])) + if (window_hi - window_lo) > max_range: + equity.append(equity[-1]) + continue + + box_high, box_low = window_hi, window_lo + cur_vol = float(vols[i]) + if cur_vol <= params.volume_threshold: + equity.append(equity[-1]) + continue + + vol_ratio = volume_ma_ratio(vols, i, params.volume_ma_period) + if vol_ratio <= params.volume_threshold_multiplier: + equity.append(equity[-1]) + continue + + ask_price = mid + break_up = bar_hi > box_high or float(closes[i - 1]) > box_high + break_dn = bar_lo < box_low or float(closes[i - 1]) < box_low + + if break_up and trend_ok(i, "BUY", ask_price): + open_pos(i, "BUY", mid) + elif break_dn and trend_ok(i, "SELL", ask_price): + open_pos(i, "SELL", mid) + + equity.append(equity[-1]) + + if side: + close_pos(len(h1) - 1, float(closes[-1]), "eod") + + eq = pd.Series(equity[: len(h1)], index=h1.index[: len(equity)]) + return build_report( + "DarvasBoxXAUUSD", + symbol, + "H1", + period_label, + trades, + eq, + params.initial_balance, + params.to_dict(), + ) + + +def plot_dashboard(report: BacktestReport, out_dir: Path) -> None: + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame( + [ + { + "open_time": t.open_time, + "close_time": t.close_time, + "profit": t.profit, + "exit_reason": t.exit_reason, + "side": t.side, + } + for t in trades + ] + ) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + cumulative = df["profit"].cumsum() + equity = report.params.get("initial_balance", 10_000.0) + cumulative + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(df["close_time"], equity, color="#1f77b4", lw=1.8) + ax1.axhline(report.params.get("initial_balance", 10_000.0), color="gray", ls="--", lw=1) + ax1.set_title("Equity Curve") + ax1.set_ylabel("Balance") + ax1.grid(alpha=0.3) + + ax2 = fig.add_subplot(gs[1, 0]) + peak = equity.cummax() + dd = (equity - peak) / peak * 100.0 + ax2.fill_between(df["close_time"], dd, 0, color="#d62728", alpha=0.35) + ax2.plot(df["close_time"], dd, color="#8b0000", lw=1) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + colors = ["#2ca02c" if v >= 0 else "#d62728" for v in monthly] + ax3.bar(range(len(monthly)), monthly.values, color=colors, alpha=0.8) + ax3.set_title("Monthly PnL") + ax3.set_xticks(range(0, len(monthly), max(1, len(monthly) // 8))) + ax3.set_xticklabels([str(monthly.index[i]) for i in range(0, len(monthly), max(1, len(monthly) // 8))], rotation=45, ha="right") + ax3.axhline(0, color="black", lw=0.6) + ax3.grid(alpha=0.3, axis="y") + + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85, edgecolor="white") + ax4.axvline(0, color="black", lw=0.8) + ax4.set_title("Trade PnL Distribution") + ax4.grid(alpha=0.3) + + ax5 = fig.add_subplot(gs[2, 1]) + reasons = df["exit_reason"].value_counts() + ax5.bar(reasons.index.astype(str), reasons.values, color="#ff7f0e", alpha=0.85) + ax5.set_title("Exit Reasons") + ax5.grid(alpha=0.3, axis="y") + + summary = ( + f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | " + f"WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f} | " + f"MaxDD: {report.max_drawdown_pct:.2f}% | Sharpe: {report.sharpe:.2f}" + ) + fig.suptitle(f"DarvasBoxXAUUSD — {summary}", fontsize=11, y=0.98) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + +def plot_equity(report: BacktestReport, path: Path) -> None: + trades = report.trades_list + if not trades: + return + df = pd.DataFrame([{"close_time": t.close_time, "profit": t.profit} for t in trades]) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + equity = report.params.get("initial_balance", 10_000.0) + df["profit"].cumsum() + plt.figure(figsize=(12, 5)) + plt.plot(df["close_time"], equity, lw=2) + plt.title("Equity Curve") + plt.xlabel("Time") + plt.ylabel("Balance") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(path, dpi=200, bbox_inches="tight") + plt.close() + + +def plot_drawdown(report: BacktestReport, path: Path) -> None: + trades = report.trades_list + if not trades: + return + df = pd.DataFrame([{"close_time": t.close_time, "profit": t.profit} for t in trades]) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + equity = report.params.get("initial_balance", 10_000.0) + df["profit"].cumsum() + dd = (equity - equity.cummax()) / equity.cummax() * 100.0 + plt.figure(figsize=(12, 5)) + plt.fill_between(df["close_time"], dd, 0, color="red", alpha=0.3) + plt.plot(df["close_time"], dd, color="darkred", lw=1) + plt.title("Drawdown %") + plt.xlabel("Time") + plt.ylabel("Drawdown (%)") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(path, dpi=200, bbox_inches="tight") + plt.close() + + +def plot_monthly(report: BacktestReport, path: Path) -> None: + trades = report.trades_list + if not trades: + return + df = pd.DataFrame([{"close_time": t.close_time, "profit": t.profit} for t in trades]) + df["close_time"] = pd.to_datetime(df["close_time"]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + colors = ["green" if v >= 0 else "red" for v in monthly] + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=colors, alpha=0.75) + plt.xticks(range(len(monthly)), [str(x) for x in monthly.index], rotation=45, ha="right") + plt.axhline(0, color="black", lw=0.5) + plt.title("Monthly PnL") + plt.ylabel("Profit") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(path, dpi=200, bbox_inches="tight") + plt.close() + + +def plot_pnl_hist(report: BacktestReport, path: Path) -> None: + profits = [t.profit for t in report.trades_list] + if not profits: + return + plt.figure(figsize=(10, 5)) + plt.hist(profits, bins=40, color="#6a5acd", alpha=0.85, edgecolor="white") + plt.axvline(0, color="black", lw=0.8) + plt.title("Per-Trade PnL Distribution") + plt.xlabel("Profit") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(path, dpi=200, bbox_inches="tight") + plt.close() + + +def plot_exit_reasons(report: BacktestReport, path: Path) -> None: + if not report.exit_reason_breakdown: + return + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2", alpha=0.85) + plt.title("Exit Reason Counts") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(path, dpi=200, bbox_inches="tight") + plt.close() + + +def export_trades_csv(report: BacktestReport, path: Path) -> None: + rows = [] + for t in report.trades_list: + rows.append( + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + ) + pd.DataFrame(rows).to_csv(path, index=False) + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description="DarvasBoxXAUUSD Python backtest") + p.add_argument("--symbol", default="XAUUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = DarvasParams(initial_balance=args.balance) + + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed — open MT5 and log in.") + + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + + print(f"Loading H1/H2 bars for {symbol} ...") + h1 = load_bars(symbol, mt5.TIMEFRAME_H1, start, end) + h2 = load_bars(symbol, mt5.TIMEFRAME_H2, start, end) + h2_ma = weighted_price(h2).ewm(span=params.ma_period, adjust=False).mean() + ma_on_h1 = align_higher_tf_ma(h1.index, h2_ma) + + costs = CostModel.for_symbol(symbol) + report = backtest_darvas_unit(h1, ma_on_h1, symbol, params, costs, period_label) + + export_trades_csv(report, out_dir / "trades.csv") + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + plot_dashboard(report, out_dir) + plot_equity(report, out_dir / "equity_curve.png") + plot_drawdown(report, out_dir / "drawdown.png") + plot_monthly(report, out_dir / "monthly_returns.png") + plot_pnl_hist(report, out_dir / "pnl_distribution.png") + plot_exit_reasons(report, out_dir / "exit_reasons.png") + + print("\n=== DarvasBoxXAUUSD Backtest ===") + print(f"Symbol: {symbol}") + print(f"Period: {period_label}") + print(f"Net profit: ${report.net_profit:,.2f}") + print(f"Trades: {report.total_trades}") + print(f"Win rate: {report.win_rate:.2f}%") + print(f"Profit fac: {report.profit_factor:.2f}") + print(f"Max DD: {report.max_drawdown_pct:.2f}%") + print(f"Sharpe: {report.sharpe:.2f}") + print(f"\nReports saved to: {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/EMASlopeDistanceCocktailXAUUSD/report.html b/frontline/units/EMASlopeDistanceCocktailXAUUSD/report.html deleted file mode 100644 index 8d9931f..0000000 Binary files a/frontline/units/EMASlopeDistanceCocktailXAUUSD/report.html and /dev/null differ diff --git a/frontline/units/EMASlopeDistanceCocktailXAUUSD/report.png b/frontline/units/EMASlopeDistanceCocktailXAUUSD/report.png deleted file mode 100644 index c0bf45b..0000000 Binary files a/frontline/units/EMASlopeDistanceCocktailXAUUSD/report.png and /dev/null differ diff --git a/frontline/units/EMASlopeDistanceCocktailXAUUSD/run_backtest.py b/frontline/units/EMASlopeDistanceCocktailXAUUSD/run_backtest.py new file mode 100644 index 0000000..811bea7 --- /dev/null +++ b/frontline/units/EMASlopeDistanceCocktailXAUUSD/run_backtest.py @@ -0,0 +1,412 @@ +""" +EMASlopeDistanceCocktailXAUUSD — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + Trade, + build_report, + calc_profit, + fill_price, + load_bars, + resolve_symbol, +) +from indicator_utils import calculate_dmi, calculate_ema # noqa: E402 + +STRATEGY_ID = "EMASlopeDistanceCocktailXAUUSD" + + +@dataclass +class SimState: + side: str | None = None + entry: float = 0.0 + entry_i: int = 0 + entry_time: object = None + sl: float = 0.0 + tp: float = 0.0 + bars_against: int = 0 + rsi_against: bool = False + + +def run_single_position( + df: pd.DataFrame, + symbol: str, + point: float, + costs: CostModel, + lot: float, + tf_label: str, + period_label: str, + params: dict, + initial_balance: float, + on_bar, +) -> BacktestReport: + trades: list[Trade] = [] + equity = [initial_balance] + st = SimState() + + def close(i: int, mid: float, reason: str) -> None: + nonlocal st + if st.side is None: + return + exit_px = fill_price(mid, point, costs, st.side, entry=False) + commission = costs.commission_per_lot * lot * 2.0 + profit = calc_profit(symbol, st.side, lot, st.entry, exit_px) - commission + trades.append( + Trade( + side=st.side, + open_time=st.entry_time, + close_time=df.index[i], + open_price=st.entry, + close_price=exit_px, + volume=lot, + profit=profit, + bars_held=i - st.entry_i, + exit_reason=reason, + ) + ) + equity.append(equity[-1] + profit) + st = SimState() + + def open_pos(i: int, side: str, mid: float) -> None: + nonlocal st + st.side = side + st.entry = fill_price(mid, point, costs, side, entry=True) + st.entry_i = i + st.entry_time = df.index[i] + + for i in range(1, len(df)): + on_bar(i, st, open_pos, close) + if len(equity) == len(trades) + 1: + equity.append(equity[-1]) + + if st.side is not None: + close(len(df) - 1, float(df["close"].iloc[-1]), "eod") + + eq = pd.Series(equity[: len(df)], index=df.index[: len(equity)]) + return build_report(STRATEGY_ID, symbol, tf_label, period_label, trades, eq, initial_balance, params) + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + equity = bal0 + df["profit"].cumsum() + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(df["close_time"], equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(df["close_time"], dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(df["close_time"], equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(df["close_time"], dd, 0, color="red", alpha=0.3) + plt.plot(df["close_time"], dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + ema_period: int = 65 + price_threshold_pips: float = 375 + slope_threshold_pips: float = 15.0 + monitor_timeout_sec: int = 340 + trailing_stop_pips: float = 74.0 + lot_size: float = 0.07 + max_trades_per_crossover: int = 48 + profit_check_bars: int = 36 + close_unprofitable_trades: bool = True + use_weekly_adx_filter: bool = True + weekly_adx_period: int = 28 + weekly_adx_min: float = 25.0 + weekly_adx_bar_shift: int = 8 + weekly_adx_use_direction: bool = True + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + +def _pip_multiplier(symbol: str) -> float: + info = mt5.symbol_info(symbol) + digits = int(info.digits) if info else 2 + return 10.0 if digits in (3, 5) else 1.0 + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + mult = _pip_multiplier(symbol) + ema = calculate_ema(df["close"], params.ema_period).to_numpy() + closes = df["close"].to_numpy() + opens = df["open"].to_numpy() + highs = df["high"].to_numpy() + lows = df["low"].to_numpy() + wdf = df.resample("W-FRI").agg({"high": "max", "low": "min", "close": "last"}).dropna() + dmi = calculate_dmi(wdf, params.weekly_adx_period) + w_adx = dmi["adx"].shift(params.weekly_adx_bar_shift).reindex(df.index, method="ffill") + w_plus = dmi["plus_di"].shift(params.weekly_adx_bar_shift).reindex(df.index, method="ffill") + w_minus = dmi["minus_di"].shift(params.weekly_adx_bar_shift).reindex(df.index, method="ffill") + p = params.to_dict() + timeout_bars = max(0, int(params.monitor_timeout_sec / 3600)) # H1 = 3600s, same as MQL int cast + + price_trig = slope_trig = monitor = False + monitor_i = -1 + trades_cross = 0 + last_close = last_ema = 0.0 + profit_checked = False + + def weekly_ok(i: int, side: str) -> bool: + if not params.use_weekly_adx_filter: + return True + adx_v = float(w_adx.iloc[i - 1]) + if np.isnan(adx_v) or adx_v < params.weekly_adx_min: + return False + if not params.weekly_adx_use_direction: + return True + pdi, mdi = float(w_plus.iloc[i - 1]), float(w_minus.iloc[i - 1]) + return pdi > mdi if side == "BUY" else mdi > pdi + + def on_bar(i, st, open_pos, close): + nonlocal price_trig, slope_trig, monitor, monitor_i, trades_cross, last_close, last_ema, profit_checked + if i < params.ema_period + 3 or np.isnan(ema[i - 1]) or np.isnan(ema[i - 2]): + return + + mid = float(opens[i]) + bar_close = float(closes[i - 1]) + ema_now, ema_prev = float(ema[i - 1]), float(ema[i - 2]) + + if last_close != 0.0: + if (last_close <= last_ema and bar_close > ema_now) or (last_close >= last_ema and bar_close < ema_now): + trades_cross = 0 + last_close, last_ema = bar_close, ema_now + + price_dist = abs(bar_close - ema_now) / point / mult + if price_dist > params.price_threshold_pips and not price_trig: + price_trig = True + slope = (ema_now - ema_prev) / point / mult + if abs(slope) > params.slope_threshold_pips and not slope_trig: + slope_trig = True + + if price_trig and slope_trig and not monitor: + monitor, monitor_i = True, i + + if monitor and monitor_i >= 0 and (i - monitor_i) > timeout_bars: + monitor = price_trig = slope_trig = False + + if st.side: + bar_close_now = float(closes[i - 1]) + unrealized = calc_profit(symbol, st.side, params.lot_size, st.entry, bar_close_now) + + # Trailing stop — MQL: only when position_profit > 0 + if unrealized > 0 and params.trailing_stop_pips > 0: + trail_px = params.trailing_stop_pips * point * mult + if st.side == "BUY": + new_sl = bar_close_now - trail_px + st.sl = max(st.sl, new_sl) if st.sl > 0 else new_sl + if st.sl > 0 and float(lows[i]) <= st.sl: + close(i, st.sl, "trail") + profit_checked = False + return + else: + new_sl = bar_close_now + trail_px + st.sl = min(st.sl, new_sl) if st.sl > 0 else new_sl + if st.sl > 0 and float(highs[i]) >= st.sl: + close(i, st.sl, "trail") + profit_checked = False + return + + # EMA crossover exit — MQL: no profit requirement + if (st.side == "BUY" and bar_close_now < ema_now) or (st.side == "SELL" and bar_close_now > ema_now): + close(i, mid, "ema_cross") + profit_checked = False + return + + # Profit check after X bars — MQL: close if profit <= 0, then stop checking + if params.close_unprofitable_trades and not profit_checked: + if (i - st.entry_i) >= params.profit_check_bars: + if unrealized <= 0: + close(i, mid, "profit_check") + profit_checked = True + return + + if not monitor or trades_cross >= params.max_trades_per_crossover: + return + + if bar_close > ema_now and weekly_ok(i, "BUY"): + open_pos(i, "BUY", mid) + trades_cross += 1 + monitor = price_trig = slope_trig = False + profit_checked = False + elif bar_close < ema_now and weekly_ok(i, "SELL"): + open_pos(i, "SELL", mid) + trades_cross += 1 + monitor = price_trig = slope_trig = False + profit_checked = False + + return run_single_position(df, symbol, point, costs, params.lot_size, "H1", period_label, p, params.initial_balance, on_bar) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="XAUUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_H1, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSICrossOverReversalXAUUSD/run_backtest.py b/frontline/units/RSICrossOverReversalXAUUSD/run_backtest.py new file mode 100644 index 0000000..462714a --- /dev/null +++ b/frontline/units/RSICrossOverReversalXAUUSD/run_backtest.py @@ -0,0 +1,307 @@ +""" +RSICrossOverReversalXAUUSD — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSICrossOverReversalXAUUSD" + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + equity = bal0 + df["profit"].cumsum() + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(df["close_time"], equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(df["close_time"], dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(df["close_time"], equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(df["close_time"], dd, 0, color="red", alpha=0.3) + plt.plot(df["close_time"], dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + rsi_period: int = 19 + ema_period: int = 140 + overbought_level: float = 93 + oversold_level: float = 22 + exit_buy_rsi: float = 86 + exit_sell_rsi: float = 10 + trailing_stop_pts: float = 295 + ema_slope_threshold: float = 105 + ema_distance_threshold: float = 165 + use_trend_strength_filter: bool = True + cooldown_seconds: int = 209 + lot_size: float = 0.1 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + + +def _price_to_ema_score(close: float, ema: float) -> float: + return abs(close - ema) * 10.0 + + +def run_backtest(df_m12, df_m1, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + rsi_s = calculate_rsi(df_m1["close"], params.rsi_period).reindex(df_m12.index, method="ffill") + ema_s = calculate_ema(df_m1["close"], params.ema_period).reindex(df_m12.index, method="ffill") + rsi = rsi_s.to_numpy() + ema = ema_s.to_numpy() + trail = params.trailing_stop_pts * point + prev_rsi = 0.0 + last_trade_time: pd.Timestamp | None = None + p = params.to_dict() + weekday_ok = {0: False, 1: False, 2: True, 3: True, 4: True, 5: False, 6: False} + cooldown = pd.Timedelta(seconds=params.cooldown_seconds) + + def hours_ok(ts) -> bool: + h = ts.hour + def win(b, e): + b, e = b % 24, e % 24 + if b < e: + return b <= h < e + return h >= b or h < e + return win(24, 22) or win(6, 19) + + def on_bar(i, st, open_pos, close): + nonlocal prev_rsi, last_trade_time + if i < 3 or np.isnan(rsi[i - 1]) or np.isnan(ema[i - 1]): + return + ts = df_m12.index[i] + if not weekday_ok.get(ts.weekday(), False) or not hours_ok(ts): + if st.side: + close(i, float(df_m12["open"].iloc[i]), "hours") + return + cur = float(rsi[i - 1]) + if prev_rsi == 0.0: + prev_rsi = cur + return + ema_slope = (float(ema[i - 1]) - float(ema[i - 2])) * 100.0 + bar_close = float(df_m12["close"].iloc[i - 1]) + price_to_ema = abs((float(df_m12["close"].iloc[i - 1]) - ema[i - 1]) * 10.0) + slope_th = params.ema_slope_threshold + dist_th = params.ema_distance_threshold + trend_strong = params.use_trend_strength_filter and ( + (slope_th > 0 and abs(ema_slope) > slope_th) + or (dist_th > 0 and price_to_ema > dist_th) + ) + mid = float(df_m12["open"].iloc[i]) + if st.side == "BUY" and trail > 0: + bid = float(df_m12["close"].iloc[i]) + if bid - st.entry > trail: + st.sl = max(st.sl, bid - trail) + if st.sl > 0 and float(df_m12["low"].iloc[i]) <= st.sl: + close(i, st.sl, "trail") + prev_rsi = cur + return + if st.side == "SELL" and trail > 0: + ask = float(df_m12["close"].iloc[i]) + if st.entry - ask > trail: + st.sl = ask + trail if st.sl == 0 else min(st.sl, ask + trail) + if st.sl > 0 and float(df_m12["high"].iloc[i]) >= st.sl: + close(i, st.sl, "trail") + prev_rsi = cur + return + if st.side == "BUY" and cur > params.exit_buy_rsi: + close(i, mid, "exit_rsi") + elif st.side == "SELL" and cur < params.exit_sell_rsi: + close(i, mid, "exit_rsi") + elif trend_strong and st.side: + close(i, mid, "trend_strong") + elif not st.side and not trend_strong: + cooled = last_trade_time is None or (ts - last_trade_time) >= cooldown + if cooled and prev_rsi >= params.overbought_level and cur < params.overbought_level: + open_pos(i, "SELL", mid) + last_trade_time = ts + elif cooled and prev_rsi <= params.oversold_level and cur > params.oversold_level: + open_pos(i, "BUY", mid) + last_trade_time = ts + prev_rsi = cur + + return run_single_position( + df_m12, symbol, point, costs, params.lot_size, + STRATEGY_ID, "M12", period_label, p, params.initial_balance, on_bar, bar_seconds=720, + ) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="XAUUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} M1 + M12 bars ...") + df_m1 = load_bars(symbol, mt5.TIMEFRAME_M1, start, end) + df_m12 = load_bars(symbol, mt5.TIMEFRAME_M12, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df_m12, df_m1, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSIMidPointHijackXAUUSD/report.html b/frontline/units/RSIMidPointHijackXAUUSD/report.html deleted file mode 100644 index a731713..0000000 Binary files a/frontline/units/RSIMidPointHijackXAUUSD/report.html and /dev/null differ diff --git a/frontline/units/RSIMidPointHijackXAUUSD/report.png b/frontline/units/RSIMidPointHijackXAUUSD/report.png deleted file mode 100644 index 71b2983..0000000 Binary files a/frontline/units/RSIMidPointHijackXAUUSD/report.png and /dev/null differ diff --git a/frontline/units/RSIMidPointHijackXAUUSD/run_backtest.py b/frontline/units/RSIMidPointHijackXAUUSD/run_backtest.py new file mode 100644 index 0000000..4b5552a --- /dev/null +++ b/frontline/units/RSIMidPointHijackXAUUSD/run_backtest.py @@ -0,0 +1,475 @@ +""" +RSIMidPointHijackXAUUSD — bar backtest mirroring main.mq5 (3 concurrent strategies). + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + Trade, + build_report, + calc_profit, + fill_price, + load_bars, + resolve_symbol, +) +from indicator_utils import calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIMidPointHijackXAUUSD" + + +@dataclass +class PositionSlot: + name: str + side: str | None = None + entry: float = 0.0 + entry_i: int = 0 + entry_time: object = None + + +@dataclass +class StrategyParams: + lot_size: float = 0.1 + enable_rsi_follow: bool = True + enable_rsi_reverse: bool = True + enable_ema_cross: bool = True + enable_strategy_lock: bool = True + lock_profit_threshold_pts: float = 6.0 + close_opposite_trades: bool = True + rsi_period: int = 32 + rsi_ob: float = 78 + rsi_os: float = 46 + rsi_exit: float = 44 + follow_start: int = 23 + follow_end: int = 8 + follow_close_outside: bool = False + rev_period: int = 59 + rev_ob: float = 51 + rev_os: float = 49 + rev_cross: float = 53 + rev_exit: float = 48 + rev_start: int = 7 + rev_end: int = 13 + rev_close_outside: bool = False + rev_cooldown_bars: int = 15 + rev_cooldown_on_loss: bool = True + ema_period: int = 120 + ema_start: int = 8 + ema_end: int = 14 + ema_close_outside: bool = True + use_ema_distance_entry: bool = True + ema_distance_pts: float = 160.0 + ema_distance_period: int = 26 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + +def _in_hours(h: int, start: int, end: int) -> bool: + if start <= end: + return start <= h < end + return h >= start or h < end + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + equity = bal0 + df["profit"].cumsum() + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(df["close_time"], equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(df["close_time"], dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(df["close_time"], equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(df["close_time"], dd, 0, color="red", alpha=0.3) + plt.plot(df["close_time"], dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + +def run_backtest(df: pd.DataFrame, symbol: str, params: StrategyParams, costs: CostModel, period_label: str) -> BacktestReport: + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + lot = params.lot_size + lock_px = params.lock_profit_threshold_pts * point + + rsi_f = calculate_rsi(df["close"], params.rsi_period).to_numpy() + rsi_r = calculate_rsi(df["close"], params.rev_period).to_numpy() + ema = calculate_ema(df["close"], params.ema_period).to_numpy() + closes = df["close"].to_numpy() + + slots = { + "follow": PositionSlot("follow"), + "reverse": PositionSlot("reverse"), + "ema": PositionSlot("ema"), + } + trades: list[Trade] = [] + equity = [params.initial_balance] + + rsi_ob = rsi_os = False + rev_ob = rev_os = False + ema_buy_sig = ema_sell_sig = False + ema_sig_bar = 0 + rev_cooldown_until = -1 + + def unrealized(slot: PositionSlot, mid: float) -> float: + if slot.side is None: + return 0.0 + return calc_profit(symbol, slot.side, lot, slot.entry, mid) + + def close_slot(slot: PositionSlot, i: int, mid: float, reason: str) -> float: + nonlocal rev_cooldown_until + if slot.side is None: + return 0.0 + exit_px = fill_price(mid, point, costs, slot.side, entry=False) + commission = costs.commission_per_lot * lot * 2.0 + profit = calc_profit(symbol, slot.side, lot, slot.entry, exit_px) - commission + trades.append( + Trade( + side=slot.side, + open_time=slot.entry_time, + close_time=df.index[i], + open_price=slot.entry, + close_price=exit_px, + volume=lot, + profit=profit, + bars_held=i - slot.entry_i, + exit_reason=reason, + ) + ) + if slot.name == "reverse": + if not params.rev_cooldown_on_loss or profit < 0: + rev_cooldown_until = i + params.rev_cooldown_bars + slot.side = None + slot.entry = 0.0 + return profit + + def open_slot(slot: PositionSlot, i: int, side: str, mid: float) -> None: + slot.side = side + slot.entry = fill_price(mid, point, costs, side, entry=True) + slot.entry_i = i + slot.entry_time = df.index[i] + + def is_opposite(a: str, b: str) -> bool: + return (a, b) in {("follow", "reverse"), ("reverse", "follow"), ("ema", "follow"), ("ema", "reverse"), ("follow", "ema"), ("reverse", "ema")} + + def apply_strategy_lock(requesting: str, mid: float) -> bool: + if not params.enable_strategy_lock: + return False + blocked = False + for name, slot in slots.items(): + if name == requesting or slot.side is None: + continue + pnl = unrealized(slot, mid) + if pnl > lock_px: + blocked = True + if params.close_opposite_trades and is_opposite(requesting, name): + close_slot(slot, i, mid, "opposite_close") + return blocked + + def distance_buy_ok(i: int) -> bool: + for j in range(params.ema_distance_period): + bar = i - 1 - j + if bar < 0 or np.isnan(ema[bar]): + return False + if (closes[bar] - ema[bar]) / point < params.ema_distance_pts: + return False + return True + + def distance_sell_ok(i: int) -> bool: + for j in range(params.ema_distance_period): + bar = i - 1 - j + if bar < 0 or np.isnan(ema[bar]): + return False + if (ema[bar] - closes[bar]) / point < params.ema_distance_pts: + return False + return True + + warmup = max(params.rsi_period, params.rev_period, params.ema_period, params.ema_distance_period) + 3 + + for i in range(1, len(df)): + bar_pnl = 0.0 + if i < warmup or np.isnan(rsi_f[i - 1]) or np.isnan(rsi_r[i - 1]) or np.isnan(ema[i - 1]): + equity.append(equity[-1]) + continue + + h = df.index[i].hour + mid = float(df["open"].iloc[i]) + rf = float(rsi_f[i - 1]) + rr = float(rsi_r[i - 1]) + em = float(ema[i - 1]) + cl = float(closes[i - 1]) + em_prev = float(ema[i - 2]) if not np.isnan(ema[i - 2]) else em + cl_prev = float(closes[i - 2]) + + # --- exits (CheckExitConditions) --- + follow = slots["follow"] + if follow.side == "BUY" and rf < params.rsi_exit: + bar_pnl += close_slot(follow, i, mid, "follow_exit") + elif follow.side == "SELL" and rf > params.rsi_exit: + bar_pnl += close_slot(follow, i, mid, "follow_exit") + + reverse = slots["reverse"] + if reverse.side == "BUY" and rr < params.rev_exit: + bar_pnl += close_slot(reverse, i, mid, "rev_exit") + elif reverse.side == "SELL" and rr > params.rev_exit: + bar_pnl += close_slot(reverse, i, mid, "rev_exit") + + ema_slot = slots["ema"] + if ema_slot.side == "BUY" and em > cl: + bar_pnl += close_slot(ema_slot, i, mid, "ema_exit") + elif ema_slot.side == "SELL" and em < cl: + bar_pnl += close_slot(ema_slot, i, mid, "ema_exit") + + # close EMA outside trading hours + if params.ema_close_outside and ema_slot.side and not _in_hours(h, params.ema_start, params.ema_end): + bar_pnl += close_slot(ema_slot, i, mid, "ema_hours") + + if params.follow_close_outside and follow.side and not _in_hours(h, params.follow_start, params.follow_end): + bar_pnl += close_slot(follow, i, mid, "follow_hours") + + if params.rev_close_outside and reverse.side and not _in_hours(h, params.rev_start, params.rev_end): + bar_pnl += close_slot(reverse, i, mid, "rev_hours") + + # --- RSI Follow entries --- + if params.enable_rsi_follow and _in_hours(h, params.follow_start, params.follow_end): + if not apply_strategy_lock("follow", mid): + if rf > params.rsi_ob: + rsi_ob = True + elif rf < params.rsi_os: + rsi_os = True + if rsi_ob and rf < params.rsi_exit and follow.side is None: + open_slot(follow, i, "SELL", mid) + rsi_ob = False + elif rsi_os and rf > params.rsi_exit and follow.side is None: + open_slot(follow, i, "BUY", mid) + rsi_os = False + + # --- RSI Reverse entries --- + if params.enable_rsi_reverse and _in_hours(h, params.rev_start, params.rev_end): + in_cooldown = params.rev_cooldown_bars > 0 and i < rev_cooldown_until + if not in_cooldown and not apply_strategy_lock("reverse", mid): + if rr > params.rev_ob: + rev_ob = True + elif rr < params.rev_os: + rev_os = True + if rev_ob and rr < params.rev_cross and reverse.side is None: + open_slot(reverse, i, "SELL", mid) + rev_ob = False + elif rev_os and rr > params.rev_cross and reverse.side is None: + open_slot(reverse, i, "BUY", mid) + rev_os = False + + # --- EMA cross signals --- + if em_prev < cl_prev and em > cl: + ema_buy_sig = True + ema_sell_sig = False + ema_sig_bar = 0 + elif em_prev > cl_prev and em < cl: + ema_sell_sig = True + ema_buy_sig = False + ema_sig_bar = 0 + + if params.enable_ema_cross and _in_hours(h, params.ema_start, params.ema_end): + if not apply_strategy_lock("ema", mid) and ema_slot.side is None: + if params.use_ema_distance_entry: + if ema_buy_sig and distance_buy_ok(i): + open_slot(ema_slot, i, "BUY", mid) + ema_buy_sig = False + elif ema_sell_sig and distance_sell_ok(i): + open_slot(ema_slot, i, "SELL", mid) + ema_sell_sig = False + else: + if em_prev < cl_prev and em > cl: + open_slot(ema_slot, i, "BUY", mid) + elif em_prev > cl_prev and em < cl: + open_slot(ema_slot, i, "SELL", mid) + + if ema_buy_sig or ema_sell_sig: + ema_sig_bar += 1 + if ema_sig_bar > params.ema_distance_period * 2: + ema_buy_sig = ema_sell_sig = False + + equity.append(equity[-1] + bar_pnl) + + for slot in slots.values(): + if slot.side is not None: + profit = close_slot(slot, len(df) - 1, float(closes[-1]), "eod") + equity[-1] += profit + + eq = pd.Series(equity[: len(df)], index=df.index[: len(equity)]) + return build_report( + STRATEGY_ID, symbol, "H1", period_label, trades, eq, params.initial_balance, params.to_dict(), + ) + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="XAUUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + p.add_argument("--no-strategy-lock", action="store_true", help="Match MT5 report with lock disabled") + p.add_argument("--lot", type=float, default=None, help="Override lot size (default 0.1 from main.mq5)") + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if args.no_strategy_lock: + params.enable_strategy_lock = False + params.close_opposite_trades = False + if args.lot is not None: + params.lot_size = args.lot + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} H1 bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_H1, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSIReversalAsianAUDUSD/run_backtest.py b/frontline/units/RSIReversalAsianAUDUSD/run_backtest.py new file mode 100644 index 0000000..c0d9710 --- /dev/null +++ b/frontline/units/RSIReversalAsianAUDUSD/run_backtest.py @@ -0,0 +1,282 @@ +""" +RSIReversalAsianEURUSD — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIReversalAsianAUDUSD" + + +@dataclass +class StrategyParams: + rsi_period: int = 28 + overbought_level: float = 68 + oversold_level: float = 30 + rsi_exit_level: float = 48 + close_outside_session: bool = True + use_rsi_exit: bool = True + max_duration_hours: int = 340 + max_spread_points: int = 1000 + lot_size: float = 0.2 + asian_session_start: int = 0 + asian_session_end: int = 8 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + bal0 = report.params.get("initial_balance", 10_000.0) + if report.equity_curve is not None and len(report.equity_curve) > 1: + eq_s = report.equity_curve + eq_times = eq_s.index + equity = eq_s.values + elif report.trades_list: + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + eq_times = df["close_time"] + equity = bal0 + df["profit"].cumsum().values + else: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + dd = (equity - np.maximum.accumulate(equity)) / np.maximum.accumulate(equity) * 100 + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(eq_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + ax2.fill_between(eq_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + if report.trades_list: + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3 = fig.add_subplot(gs[1, 1]) + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(eq_times, equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(eq_times, dd, 0, color="red", alpha=0.3) + plt.plot(eq_times, dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.trades_list: + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + +def run_backtest(df: pd.DataFrame, symbol: str, params: StrategyParams, costs: CostModel, period_label: str) -> BacktestReport: + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.00001 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + p = params.to_dict() + session_close_done = False + + def in_session(ts) -> bool: + return params.asian_session_start <= ts.hour < params.asian_session_end + + def on_bar(i, st, open_pos, close): + nonlocal session_close_done + if i < params.rsi_period + 2 or np.isnan(rsi[i - 1]) or np.isnan(rsi[i - 2]): + return + ts = df.index[i] + prev, cur = float(rsi[i - 2]), float(rsi[i - 1]) + mid = float(df["open"].iloc[i]) + + if not in_session(ts): + if st.side and params.close_outside_session and not session_close_done: + close(i, mid, "session") + session_close_done = True + return + + session_close_done = False + + if costs.spread_points > params.max_spread_points: + return + + if st.side: + hours_held = (ts - pd.Timestamp(st.entry_time)).total_seconds() / 3600.0 + if hours_held > params.max_duration_hours: + close(i, mid, "timeout") + return + if params.use_rsi_exit: + el = params.rsi_exit_level + if st.side == "BUY" and prev < el <= cur: + close(i, mid, "rsi_exit") + return + if st.side == "SELL" and prev > el >= cur: + close(i, mid, "rsi_exit") + return + return + + if prev < params.overbought_level <= cur: + open_pos(i, "SELL", mid) + elif prev > params.oversold_level >= cur: + open_pos(i, "BUY", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, + STRATEGY_ID, "M15", period_label, p, params.initial_balance, on_bar, bar_seconds=900, + ) + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="AUDUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} M15 bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_M15, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSIReversalAsianAUDUSD/test-balance.png b/frontline/units/RSIReversalAsianAUDUSD/test-balance.png deleted file mode 100644 index 47d7c5d..0000000 Binary files a/frontline/units/RSIReversalAsianAUDUSD/test-balance.png and /dev/null differ diff --git a/frontline/units/RSIReversalAsianEURUSD/run_backtest.py b/frontline/units/RSIReversalAsianEURUSD/run_backtest.py new file mode 100644 index 0000000..ee69713 --- /dev/null +++ b/frontline/units/RSIReversalAsianEURUSD/run_backtest.py @@ -0,0 +1,282 @@ +""" +RSIReversalAsianEURUSD — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIReversalAsianEURUSD" + + +@dataclass +class StrategyParams: + rsi_period: int = 28 + overbought_level: float = 60 + oversold_level: float = 8 + rsi_exit_level: float = 55 + close_outside_session: bool = False + use_rsi_exit: bool = True + max_duration_hours: int = 270 + max_spread_points: int = 1000 + lot_size: float = 0.1 + asian_session_start: int = 0 + asian_session_end: int = 8 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + bal0 = report.params.get("initial_balance", 10_000.0) + if report.equity_curve is not None and len(report.equity_curve) > 1: + eq_s = report.equity_curve + eq_times = eq_s.index + equity = eq_s.values + elif report.trades_list: + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + eq_times = df["close_time"] + equity = bal0 + df["profit"].cumsum().values + else: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + dd = (equity - np.maximum.accumulate(equity)) / np.maximum.accumulate(equity) * 100 + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(eq_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + ax2.fill_between(eq_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + if report.trades_list: + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3 = fig.add_subplot(gs[1, 1]) + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(eq_times, equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(eq_times, dd, 0, color="red", alpha=0.3) + plt.plot(eq_times, dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.trades_list: + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + +def run_backtest(df: pd.DataFrame, symbol: str, params: StrategyParams, costs: CostModel, period_label: str) -> BacktestReport: + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.00001 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + p = params.to_dict() + session_close_done = False + + def in_session(ts) -> bool: + return params.asian_session_start <= ts.hour < params.asian_session_end + + def on_bar(i, st, open_pos, close): + nonlocal session_close_done + if i < params.rsi_period + 2 or np.isnan(rsi[i - 1]) or np.isnan(rsi[i - 2]): + return + ts = df.index[i] + prev, cur = float(rsi[i - 2]), float(rsi[i - 1]) + mid = float(df["open"].iloc[i]) + + if not in_session(ts): + if st.side and params.close_outside_session and not session_close_done: + close(i, mid, "session") + session_close_done = True + return + + session_close_done = False + + if st.side: + hours_held = (ts - pd.Timestamp(st.entry_time)).total_seconds() / 3600.0 + if hours_held > params.max_duration_hours: + close(i, mid, "timeout") + return + if params.use_rsi_exit: + el = params.rsi_exit_level + if st.side == "BUY" and prev < el <= cur: + close(i, mid, "rsi_exit") + return + if st.side == "SELL" and prev > el >= cur: + close(i, mid, "rsi_exit") + return + return + + if costs.spread_points > params.max_spread_points: + return + + if prev < params.overbought_level <= cur: + open_pos(i, "SELL", mid) + elif prev > params.oversold_level >= cur: + open_pos(i, "BUY", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, + STRATEGY_ID, "M15", period_label, p, params.initial_balance, on_bar, bar_seconds=900, + ) + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="EURUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} M15 bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_M15, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSIReversalAsianEURUSD/test-balance.jpg b/frontline/units/RSIReversalAsianEURUSD/test-balance.jpg deleted file mode 100644 index 2901f4b..0000000 Binary files a/frontline/units/RSIReversalAsianEURUSD/test-balance.jpg and /dev/null differ diff --git a/frontline/units/RSIReversalAsianGBPUSD/run_backtest.py b/frontline/units/RSIReversalAsianGBPUSD/run_backtest.py new file mode 100644 index 0000000..12a93ca --- /dev/null +++ b/frontline/units/RSIReversalAsianGBPUSD/run_backtest.py @@ -0,0 +1,282 @@ +""" +RSIReversalAsianEURUSD — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIReversalAsianGBPUSD" + + +@dataclass +class StrategyParams: + rsi_period: int = 32 + overbought_level: float = 80 + oversold_level: float = 37 + rsi_exit_level: float = 43 + close_outside_session: bool = True + use_rsi_exit: bool = True + max_duration_hours: int = 480 + max_spread_points: int = 1800 + lot_size: float = 0.2 + asian_session_start: int = 0 + asian_session_end: int = 8 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + bal0 = report.params.get("initial_balance", 10_000.0) + if report.equity_curve is not None and len(report.equity_curve) > 1: + eq_s = report.equity_curve + eq_times = eq_s.index + equity = eq_s.values + elif report.trades_list: + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + eq_times = df["close_time"] + equity = bal0 + df["profit"].cumsum().values + else: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + dd = (equity - np.maximum.accumulate(equity)) / np.maximum.accumulate(equity) * 100 + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(eq_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + ax2.fill_between(eq_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + if report.trades_list: + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3 = fig.add_subplot(gs[1, 1]) + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(eq_times, equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(eq_times, dd, 0, color="red", alpha=0.3) + plt.plot(eq_times, dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.trades_list: + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + +def run_backtest(df: pd.DataFrame, symbol: str, params: StrategyParams, costs: CostModel, period_label: str) -> BacktestReport: + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.00001 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + p = params.to_dict() + session_close_done = False + + def in_session(ts) -> bool: + return params.asian_session_start <= ts.hour < params.asian_session_end + + def on_bar(i, st, open_pos, close): + nonlocal session_close_done + if i < params.rsi_period + 2 or np.isnan(rsi[i - 1]) or np.isnan(rsi[i - 2]): + return + ts = df.index[i] + prev, cur = float(rsi[i - 2]), float(rsi[i - 1]) + mid = float(df["open"].iloc[i]) + + if not in_session(ts): + if st.side and params.close_outside_session and not session_close_done: + close(i, mid, "session") + session_close_done = True + return + + session_close_done = False + + if costs.spread_points > params.max_spread_points: + return + + if st.side: + hours_held = (ts - pd.Timestamp(st.entry_time)).total_seconds() / 3600.0 + if hours_held > params.max_duration_hours: + close(i, mid, "timeout") + return + if params.use_rsi_exit: + el = params.rsi_exit_level + if st.side == "BUY" and prev < el <= cur: + close(i, mid, "rsi_exit") + return + if st.side == "SELL" and prev > el >= cur: + close(i, mid, "rsi_exit") + return + return + + if prev < params.overbought_level <= cur: + open_pos(i, "SELL", mid) + elif prev > params.oversold_level >= cur: + open_pos(i, "BUY", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, + STRATEGY_ID, "M15", period_label, p, params.initial_balance, on_bar, bar_seconds=900, + ) + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="GBPUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} M15 bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_M15, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSIReversalAsianGBPUSD/test-balance.png b/frontline/units/RSIReversalAsianGBPUSD/test-balance.png deleted file mode 100644 index 47d7c5d..0000000 Binary files a/frontline/units/RSIReversalAsianGBPUSD/test-balance.png and /dev/null differ diff --git a/frontline/units/RSIScalpingAPPL/run_backtest.py b/frontline/units/RSIScalpingAPPL/run_backtest.py new file mode 100644 index 0000000..cc22237 --- /dev/null +++ b/frontline/units/RSIScalpingAPPL/run_backtest.py @@ -0,0 +1,287 @@ +""" +RSIScalpingAPPL — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIScalpingAPPL" + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + if report.equity_curve is not None and len(report.equity_curve) > 1: + eq = report.equity_curve + else: + eq = pd.Series(bal0 + df["profit"].cumsum().values, index=df["close_time"]) + equity_times = eq.index + equity = eq + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(equity_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(equity_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(equity_times, equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(equity_times, dd, 0, color="red", alpha=0.3) + plt.plot(equity_times, dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + +@dataclass +class StrategyParams: + rsi_period: int = 14 + rsi_overbought: float = 80 + rsi_oversold: float = 78 + rsi_target_buy: float = 94 + rsi_target_sell: float = 44 + bars_to_wait: int = 7 + lot_size: float = 25 + use_reversal_escape: bool = False + reversal_atr_period: int = 14 + reversal_adverse_atr_mult: float = 1.5 + reversal_signs_required: int = 2 + reversal_rsi_velocity: float = 8.0 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + atr = calculate_atr(df, params.reversal_atr_period).to_numpy() + p = params.to_dict() + + def on_bar(i, st, open_pos, close): + if i < 3 or np.isnan(rsi[i - 1]): + return + sig, prev, two = rsi[i - 1], rsi[i - 2], rsi[i - 3] + mid = float(df["open"].iloc[i]) + hi, lo = float(df["high"].iloc[i]), float(df["low"].iloc[i]) + + if st.side and params.use_reversal_escape: + a = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + if a > 0: + signs = 0 + if st.side == "BUY": + if st.entry - lo >= params.reversal_adverse_atr_mult * a: + signs += 1 + if sig - prev >= params.reversal_rsi_velocity: + signs += 1 + else: + if hi - st.entry >= params.reversal_adverse_atr_mult * a: + signs += 1 + if prev - sig >= params.reversal_rsi_velocity: + signs += 1 + if signs >= params.reversal_signs_required: + close(i, mid, "reversal_escape") + return + + if st.side == "BUY": + if sig < params.rsi_oversold: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig >= params.rsi_target_buy: + close(i, mid, "target") + elif st.side == "SELL": + if sig > params.rsi_overbought: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig <= params.rsi_target_sell: + close(i, mid, "target") + else: + if two <= params.rsi_oversold and prev > params.rsi_oversold: + open_pos(i, "BUY", mid) + elif two >= params.rsi_overbought and prev < params.rsi_overbought: + open_pos(i, "SELL", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, STRATEGY_ID, "M10", period_label, p, params.initial_balance, on_bar + ) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="AAPL") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_M10, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSIScalpingBTCUSD/report.html b/frontline/units/RSIScalpingBTCUSD/report.html deleted file mode 100644 index b512b3d..0000000 Binary files a/frontline/units/RSIScalpingBTCUSD/report.html and /dev/null differ diff --git a/frontline/units/RSIScalpingBTCUSD/report.png b/frontline/units/RSIScalpingBTCUSD/report.png deleted file mode 100644 index 52287c6..0000000 Binary files a/frontline/units/RSIScalpingBTCUSD/report.png and /dev/null differ diff --git a/frontline/units/RSIScalpingBTCUSD/run_backtest.py b/frontline/units/RSIScalpingBTCUSD/run_backtest.py new file mode 100644 index 0000000..f5ccde6 --- /dev/null +++ b/frontline/units/RSIScalpingBTCUSD/run_backtest.py @@ -0,0 +1,289 @@ +""" +RSIScalpingBTCUSD — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIScalpingBTCUSD" + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + if report.equity_curve is not None and len(report.equity_curve) > 1: + eq = report.equity_curve + else: + eq = pd.Series(bal0 + df["profit"].cumsum().values, index=df["close_time"]) + equity_times = eq.index + equity = eq + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(equity_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(equity_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(equity_times, equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(equity_times, dd, 0, color="red", alpha=0.3) + plt.plot(equity_times, dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + rsi_period: int = 14 + rsi_overbought: float = 90 + rsi_oversold: float = 73 + rsi_target_buy: float = 88 + rsi_target_sell: float = 48 + bars_to_wait: int = 6 + lot_size: float = 0.1 + use_reversal_escape: bool = True + reversal_atr_period: int = 14 + reversal_adverse_atr_mult: float = 5.25 + reversal_signs_required: int = 2 + reversal_rsi_velocity: float = 16.0 + reversal_body_atr_mult: float = 5.1 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + atr = calculate_atr(df, params.reversal_atr_period).to_numpy() + p = params.to_dict() + + def on_bar(i, st, open_pos, close): + if i < 3 or np.isnan(rsi[i - 1]): + return + sig, prev, two = rsi[i - 1], rsi[i - 2], rsi[i - 3] + mid = float(df["open"].iloc[i]) + hi, lo = float(df["high"].iloc[i]), float(df["low"].iloc[i]) + + if st.side and params.use_reversal_escape: + a = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + if a > 0: + signs = 0 + if st.side == "BUY": + if st.entry - lo >= params.reversal_adverse_atr_mult * a: + signs += 1 + if sig - prev >= params.reversal_rsi_velocity: + signs += 1 + else: + if hi - st.entry >= params.reversal_adverse_atr_mult * a: + signs += 1 + if prev - sig >= params.reversal_rsi_velocity: + signs += 1 + if signs >= params.reversal_signs_required: + close(i, mid, "reversal_escape") + return + + if st.side == "BUY": + if sig < params.rsi_oversold: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig >= params.rsi_target_buy: + close(i, mid, "target") + elif st.side == "SELL": + if sig > params.rsi_overbought: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig <= params.rsi_target_sell: + close(i, mid, "target") + else: + if two <= params.rsi_oversold and prev > params.rsi_oversold: + open_pos(i, "BUY", mid) + elif two >= params.rsi_overbought and prev < params.rsi_overbought: + open_pos(i, "SELL", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, STRATEGY_ID, "H1", period_label, p, params.initial_balance, on_bar + ) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="BTCUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_H1, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSIScalpingMU/report.html b/frontline/units/RSIScalpingMU/report.html deleted file mode 100644 index 950f95b..0000000 Binary files a/frontline/units/RSIScalpingMU/report.html and /dev/null differ diff --git a/frontline/units/RSIScalpingMU/report.png b/frontline/units/RSIScalpingMU/report.png deleted file mode 100644 index 5a26c1d..0000000 Binary files a/frontline/units/RSIScalpingMU/report.png and /dev/null differ diff --git a/frontline/units/RSIScalpingMU/run_backtest.py b/frontline/units/RSIScalpingMU/run_backtest.py new file mode 100644 index 0000000..c47d57c --- /dev/null +++ b/frontline/units/RSIScalpingMU/run_backtest.py @@ -0,0 +1,288 @@ +""" +RSIScalpingMU — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIScalpingMU" + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + if report.equity_curve is not None and len(report.equity_curve) > 1: + eq = report.equity_curve + else: + eq = pd.Series(bal0 + df["profit"].cumsum().values, index=df["close_time"]) + equity_times = eq.index + equity = eq + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(equity_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(equity_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(equity_times, equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(equity_times, dd, 0, color="red", alpha=0.3) + plt.plot(equity_times, dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + rsi_period: int = 14 + rsi_overbought: float = 32 + rsi_oversold: float = 86 + rsi_target_buy: float = 100 + rsi_target_sell: float = 24 + bars_to_wait: int = 34 + lot_size: float = 5 + use_reversal_escape: bool = False + reversal_atr_period: int = 14 + reversal_adverse_atr_mult: float = 1.5 + reversal_signs_required: int = 2 + reversal_rsi_velocity: float = 8.0 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + atr = calculate_atr(df, params.reversal_atr_period).to_numpy() + p = params.to_dict() + + def on_bar(i, st, open_pos, close): + if i < 3 or np.isnan(rsi[i - 1]): + return + sig, prev, two = rsi[i - 1], rsi[i - 2], rsi[i - 3] + mid = float(df["open"].iloc[i]) + hi, lo = float(df["high"].iloc[i]), float(df["low"].iloc[i]) + + if st.side and params.use_reversal_escape: + a = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + if a > 0: + signs = 0 + if st.side == "BUY": + if st.entry - lo >= params.reversal_adverse_atr_mult * a: + signs += 1 + if sig - prev >= params.reversal_rsi_velocity: + signs += 1 + else: + if hi - st.entry >= params.reversal_adverse_atr_mult * a: + signs += 1 + if prev - sig >= params.reversal_rsi_velocity: + signs += 1 + if signs >= params.reversal_signs_required: + close(i, mid, "reversal_escape") + return + + if st.side == "BUY": + if sig < params.rsi_oversold: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig >= params.rsi_target_buy: + close(i, mid, "target") + elif st.side == "SELL": + if sig > params.rsi_overbought: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig <= params.rsi_target_sell: + close(i, mid, "target") + else: + if two <= params.rsi_oversold and prev > params.rsi_oversold: + open_pos(i, "BUY", mid) + elif two >= params.rsi_overbought and prev < params.rsi_overbought: + open_pos(i, "SELL", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, STRATEGY_ID, "M20", period_label, p, params.initial_balance, on_bar + ) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="MU") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_M20, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSIScalpingNVDA/run_backtest.py b/frontline/units/RSIScalpingNVDA/run_backtest.py new file mode 100644 index 0000000..b17af68 --- /dev/null +++ b/frontline/units/RSIScalpingNVDA/run_backtest.py @@ -0,0 +1,288 @@ +""" +RSIScalpingNVDA — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIScalpingNVDA" + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + if report.equity_curve is not None and len(report.equity_curve) > 1: + eq = report.equity_curve + else: + eq = pd.Series(bal0 + df["profit"].cumsum().values, index=df["close_time"]) + equity_times = eq.index + equity = eq + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(equity_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(equity_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(equity_times, equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(equity_times, dd, 0, color="red", alpha=0.3) + plt.plot(equity_times, dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + rsi_period: int = 14 + rsi_overbought: float = 6 + rsi_oversold: float = 66 + rsi_target_buy: float = 98 + rsi_target_sell: float = 52 + bars_to_wait: int = 12 + lot_size: float = 5 + use_reversal_escape: bool = False + reversal_atr_period: int = 14 + reversal_adverse_atr_mult: float = 1.5 + reversal_signs_required: int = 2 + reversal_rsi_velocity: float = 8.0 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + atr = calculate_atr(df, params.reversal_atr_period).to_numpy() + p = params.to_dict() + + def on_bar(i, st, open_pos, close): + if i < 3 or np.isnan(rsi[i - 1]): + return + sig, prev, two = rsi[i - 1], rsi[i - 2], rsi[i - 3] + mid = float(df["open"].iloc[i]) + hi, lo = float(df["high"].iloc[i]), float(df["low"].iloc[i]) + + if st.side and params.use_reversal_escape: + a = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + if a > 0: + signs = 0 + if st.side == "BUY": + if st.entry - lo >= params.reversal_adverse_atr_mult * a: + signs += 1 + if sig - prev >= params.reversal_rsi_velocity: + signs += 1 + else: + if hi - st.entry >= params.reversal_adverse_atr_mult * a: + signs += 1 + if prev - sig >= params.reversal_rsi_velocity: + signs += 1 + if signs >= params.reversal_signs_required: + close(i, mid, "reversal_escape") + return + + if st.side == "BUY": + if sig < params.rsi_oversold: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig >= params.rsi_target_buy: + close(i, mid, "target") + elif st.side == "SELL": + if sig > params.rsi_overbought: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig <= params.rsi_target_sell: + close(i, mid, "target") + else: + if two <= params.rsi_oversold and prev > params.rsi_oversold: + open_pos(i, "BUY", mid) + elif two >= params.rsi_overbought and prev < params.rsi_overbought: + open_pos(i, "SELL", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, STRATEGY_ID, "M20", period_label, p, params.initial_balance, on_bar + ) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="NVDA") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_M20, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSIScalpingTSLA/report.html b/frontline/units/RSIScalpingTSLA/report.html deleted file mode 100644 index 950f95b..0000000 Binary files a/frontline/units/RSIScalpingTSLA/report.html and /dev/null differ diff --git a/frontline/units/RSIScalpingTSLA/report.png b/frontline/units/RSIScalpingTSLA/report.png deleted file mode 100644 index 5a26c1d..0000000 Binary files a/frontline/units/RSIScalpingTSLA/report.png and /dev/null differ diff --git a/frontline/units/RSIScalpingTSLA/run_backtest.py b/frontline/units/RSIScalpingTSLA/run_backtest.py new file mode 100644 index 0000000..5407b36 --- /dev/null +++ b/frontline/units/RSIScalpingTSLA/run_backtest.py @@ -0,0 +1,288 @@ +""" +RSIScalpingTSLA — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIScalpingTSLA" + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + if report.equity_curve is not None and len(report.equity_curve) > 1: + eq = report.equity_curve + else: + eq = pd.Series(bal0 + df["profit"].cumsum().values, index=df["close_time"]) + equity_times = eq.index + equity = eq + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(equity_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(equity_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(equity_times, equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(equity_times, dd, 0, color="red", alpha=0.3) + plt.plot(equity_times, dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + rsi_period: int = 14 + rsi_overbought: float = 32 + rsi_oversold: float = 86 + rsi_target_buy: float = 100 + rsi_target_sell: float = 24 + bars_to_wait: int = 34 + lot_size: float = 5 + use_reversal_escape: bool = False + reversal_atr_period: int = 14 + reversal_adverse_atr_mult: float = 1.5 + reversal_signs_required: int = 2 + reversal_rsi_velocity: float = 8.0 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + atr = calculate_atr(df, params.reversal_atr_period).to_numpy() + p = params.to_dict() + + def on_bar(i, st, open_pos, close): + if i < 3 or np.isnan(rsi[i - 1]): + return + sig, prev, two = rsi[i - 1], rsi[i - 2], rsi[i - 3] + mid = float(df["open"].iloc[i]) + hi, lo = float(df["high"].iloc[i]), float(df["low"].iloc[i]) + + if st.side and params.use_reversal_escape: + a = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + if a > 0: + signs = 0 + if st.side == "BUY": + if st.entry - lo >= params.reversal_adverse_atr_mult * a: + signs += 1 + if sig - prev >= params.reversal_rsi_velocity: + signs += 1 + else: + if hi - st.entry >= params.reversal_adverse_atr_mult * a: + signs += 1 + if prev - sig >= params.reversal_rsi_velocity: + signs += 1 + if signs >= params.reversal_signs_required: + close(i, mid, "reversal_escape") + return + + if st.side == "BUY": + if sig < params.rsi_oversold: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig >= params.rsi_target_buy: + close(i, mid, "target") + elif st.side == "SELL": + if sig > params.rsi_overbought: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig <= params.rsi_target_sell: + close(i, mid, "target") + else: + if two <= params.rsi_oversold and prev > params.rsi_oversold: + open_pos(i, "BUY", mid) + elif two >= params.rsi_overbought and prev < params.rsi_overbought: + open_pos(i, "SELL", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, STRATEGY_ID, "M20", period_label, p, params.initial_balance, on_bar + ) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="TSLA") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_M20, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/RSI_secret_sauce_XAUUSD/run_backtest.py b/frontline/units/RSI_secret_sauce_XAUUSD/run_backtest.py new file mode 100644 index 0000000..5d8cd13 --- /dev/null +++ b/frontline/units/RSI_secret_sauce_XAUUSD/run_backtest.py @@ -0,0 +1,371 @@ +""" +RSI_secret_sauce_XAUUSD — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + Trade, + build_report, + calc_profit, + fill_price, + load_bars, + resolve_symbol, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSI_secret_sauce_XAUUSD" + + +@dataclass +class SimState: + side: str | None = None + entry: float = 0.0 + entry_i: int = 0 + entry_time: object = None + sl: float = 0.0 + tp: float = 0.0 + bars_against: int = 0 + rsi_against: bool = False + + +def run_single_position( + df: pd.DataFrame, + symbol: str, + point: float, + costs: CostModel, + lot: float, + tf_label: str, + period_label: str, + params: dict, + initial_balance: float, + on_bar, +) -> BacktestReport: + trades: list[Trade] = [] + equity = [initial_balance] + st = SimState() + + def close(i: int, mid: float, reason: str) -> None: + nonlocal st + if st.side is None: + return + exit_px = fill_price(mid, point, costs, st.side, entry=False) + commission = costs.commission_per_lot * lot * 2.0 + profit = calc_profit(symbol, st.side, lot, st.entry, exit_px) - commission + trades.append( + Trade( + side=st.side, + open_time=st.entry_time, + close_time=df.index[i], + open_price=st.entry, + close_price=exit_px, + volume=lot, + profit=profit, + bars_held=i - st.entry_i, + exit_reason=reason, + ) + ) + equity.append(equity[-1] + profit) + st = SimState() + + def open_pos(i: int, side: str, mid: float) -> None: + nonlocal st + st.side = side + st.entry = fill_price(mid, point, costs, side, entry=True) + st.entry_i = i + st.entry_time = df.index[i] + + for i in range(1, len(df)): + on_bar(i, st, open_pos, close) + if len(equity) == len(trades) + 1: + equity.append(equity[-1]) + + if st.side is not None: + close(len(df) - 1, float(df["close"].iloc[-1]), "eod") + + eq = pd.Series(equity[: len(df)], index=df.index[: len(equity)]) + return build_report(STRATEGY_ID, symbol, tf_label, period_label, trades, eq, initial_balance, params) + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + equity = bal0 + df["profit"].cumsum() + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(df["close_time"], equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(df["close_time"], dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(df["close_time"], equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(df["close_time"], dd, 0, color="red", alpha=0.3) + plt.plot(df["close_time"], dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + rsi_period: int = 16 + rsi_overbought: float = 73.0 + rsi_oversold: float = 42.5 + rsi_lookback: int = 60 + peak_bars: int = 2 + stop_loss_atr: float = 2.0 + take_profit_atr: float = 4.0 + atr_period: int = 14 + min_bars_between_trades: int = 7 + lot_size: float = 0.1 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + +def _is_rsi_peak(rsi: np.ndarray, i: int, peak_bars: int) -> bool: + cur = float(rsi[i - 1]) + if cur != cur: + return False + if float(rsi[i - 2]) >= cur: + return False + for j in range(2, peak_bars + 2): + if i - j < 0 or float(rsi[i - j]) >= cur: + return False + return True + + +def _is_rsi_bottom(rsi: np.ndarray, i: int, peak_bars: int) -> bool: + cur = float(rsi[i - 1]) + if cur != cur: + return False + if float(rsi[i - 2]) <= cur: + return False + for j in range(2, peak_bars + 2): + if i - j < 0 or float(rsi[i - j]) <= cur: + return False + return True + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + atr = calculate_atr(df, params.atr_period).to_numpy() + last_trade_i = -999 + was_ob = was_os = back_in_range = False + p = params.to_dict() + warmup = max(params.rsi_lookback, params.rsi_period) + 5 + + def on_bar(i, st, open_pos, close): + nonlocal last_trade_i, was_ob, was_os, back_in_range + if i < warmup or np.isnan(rsi[i - 1]) or np.isnan(atr[i - 1]): + return + mid = float(df["open"].iloc[i]) + cur, prev = float(rsi[i - 1]), float(rsi[i - 2]) + a = float(atr[i - 1]) + + if st.side: + if st.side == "BUY": + sl = st.entry - params.stop_loss_atr * a + tp = st.entry + params.take_profit_atr * a + if float(df["low"].iloc[i]) <= sl: + close(i, sl, "sl") + elif float(df["high"].iloc[i]) >= tp: + close(i, tp, "tp") + else: + sl = st.entry + params.stop_loss_atr * a + tp = st.entry - params.take_profit_atr * a + if float(df["high"].iloc[i]) >= sl: + close(i, sl, "sl") + elif float(df["low"].iloc[i]) <= tp: + close(i, tp, "tp") + return + + if prev >= params.rsi_overbought and cur < params.rsi_overbought: + was_ob, back_in_range = True, True + if prev <= params.rsi_oversold and cur > params.rsi_oversold: + was_os, back_in_range = True, True + if cur >= params.rsi_overbought: + was_ob = back_in_range = False + if cur <= params.rsi_oversold: + was_os = back_in_range = False + + if i - last_trade_i < params.min_bars_between_trades: + return + + if was_ob and back_in_range and cur < params.rsi_overbought and _is_rsi_peak(rsi, i, params.peak_bars): + open_pos(i, "BUY", mid) + last_trade_i = i + was_ob = back_in_range = False + elif was_os and back_in_range and cur > params.rsi_oversold and _is_rsi_bottom(rsi, i, params.peak_bars): + open_pos(i, "SELL", mid) + last_trade_i = i + was_os = back_in_range = False + + return run_single_position(df, symbol, point, costs, params.lot_size, "M30", period_label, p, params.initial_balance, on_bar) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="XAUUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_M30, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/SimpleTrendlineBTCUSD/run_backtest.py b/frontline/units/SimpleTrendlineBTCUSD/run_backtest.py new file mode 100644 index 0000000..decb94a --- /dev/null +++ b/frontline/units/SimpleTrendlineBTCUSD/run_backtest.py @@ -0,0 +1,352 @@ +""" +SimpleTrendlineBTCUSD — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + Trade, + build_report, + calc_profit, + fill_price, + load_bars, + resolve_symbol, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "SimpleTrendlineBTCUSD" + + +@dataclass +class SimState: + side: str | None = None + entry: float = 0.0 + entry_i: int = 0 + entry_time: object = None + sl: float = 0.0 + tp: float = 0.0 + bars_against: int = 0 + rsi_against: bool = False + + +def run_single_position( + df: pd.DataFrame, + symbol: str, + point: float, + costs: CostModel, + lot: float, + tf_label: str, + period_label: str, + params: dict, + initial_balance: float, + on_bar, +) -> BacktestReport: + trades: list[Trade] = [] + equity = [initial_balance] + st = SimState() + + def close(i: int, mid: float, reason: str) -> None: + nonlocal st + if st.side is None: + return + exit_px = fill_price(mid, point, costs, st.side, entry=False) + commission = costs.commission_per_lot * lot * 2.0 + profit = calc_profit(symbol, st.side, lot, st.entry, exit_px) - commission + trades.append( + Trade( + side=st.side, + open_time=st.entry_time, + close_time=df.index[i], + open_price=st.entry, + close_price=exit_px, + volume=lot, + profit=profit, + bars_held=i - st.entry_i, + exit_reason=reason, + ) + ) + equity.append(equity[-1] + profit) + st = SimState() + + def open_pos(i: int, side: str, mid: float) -> None: + nonlocal st + st.side = side + st.entry = fill_price(mid, point, costs, side, entry=True) + st.entry_i = i + st.entry_time = df.index[i] + + for i in range(1, len(df)): + on_bar(i, st, open_pos, close) + if len(equity) == len(trades) + 1: + equity.append(equity[-1]) + + if st.side is not None: + close(len(df) - 1, float(df["close"].iloc[-1]), "eod") + + eq = pd.Series(equity[: len(df)], index=df.index[: len(equity)]) + return build_report(STRATEGY_ID, symbol, tf_label, period_label, trades, eq, initial_balance, params) + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + equity = bal0 + df["profit"].cumsum() + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(df["close_time"], equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(df["close_time"], dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(df["close_time"], equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(df["close_time"], dd, 0, color="red", alpha=0.3) + plt.plot(df["close_time"], dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + ma_period: int = 150 + touch_tolerance_pts: float = 170 + break_buffer_pts: float = 90 + lot_size: float = 0.10 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + hdf = df.resample("4h").agg({"open": "first", "high": "max", "low": "min", "close": "last"}).dropna() + ma = calculate_ema(hdf["close"], params.ma_period).to_numpy() + htimes = hdf.index.to_numpy() + hcloses = hdf["close"].to_numpy() + touch_tol = params.touch_tolerance_pts * point + break_buf = params.break_buffer_pts * point + p = params.to_dict() + + def on_bar(i, st, open_pos, close): + if i < 5: + return + ts = df.index[i] + hidx = int(np.searchsorted(htimes, ts, side="right")) - 1 + if hidx < params.ma_period + 5: + return + crosses_t, crosses_p = [], [] + for j in range(hidx, params.ma_period + 2, -1): + if j >= len(ma) - 1: + continue + d0, d1 = hcloses[j] - ma[j], hcloses[j + 1] - ma[j + 1] + if d0 == 0 or d1 == 0 or d0 * d1 < 0: + crosses_t.append(htimes[j]) + crosses_p.append(hcloses[j]) + if len(crosses_t) >= 3: + break + if len(crosses_t) < 3: + return + t0 = crosses_t[2] + + def _secs(delta) -> float: + if hasattr(delta, "total_seconds"): + return float(delta.total_seconds()) + return float(delta.astype("timedelta64[s]").astype(float)) + + xs = np.array([_secs(t - t0) for t in crosses_t[::-1]]) + ys = np.array(crosses_p[::-1]) + den = 3 * np.sum(xs ** 2) - np.sum(xs) ** 2 + if abs(den) < 1e-10: + return + a = (3 * np.sum(xs * ys) - np.sum(xs) * np.sum(ys)) / den + b = (np.sum(ys) - a * np.sum(xs)) / 3 + t1, t2 = df.index[i - 1], df.index[i - 2] + line1 = a * _secs(t1 - t0) + b + line2 = a * _secs(t2 - t0) + b + mid = float(df["open"].iloc[i]) + hi = float(df["high"].iloc[i - 1]) + lo = float(df["low"].iloc[i - 1]) + cl1 = float(df["close"].iloc[i - 1]) + op1 = float(df["open"].iloc[i - 1]) + cl2 = float(df["close"].iloc[i - 2]) + if st.side == "BUY" and cl1 < line1 - break_buf: + close(i, mid, "break") + return + if st.side == "SELL" and cl1 > line1 + break_buf: + close(i, mid, "break") + return + if st.side: + return + if a > 0 and lo <= line1 + touch_tol and cl1 > line1 and cl1 > op1 and cl2 >= line2 - touch_tol: + open_pos(i, "BUY", mid) + elif a < 0 and hi >= line1 - touch_tol and cl1 < line1 and cl1 < op1 and cl2 <= line2 + touch_tol: + open_pos(i, "SELL", mid) + + return run_single_position(df, symbol, point, costs, params.lot_size, "H1", period_label, p, params.initial_balance, on_bar) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="BTCUSD") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_H1, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/USDJPYBuster/USDJPYBuster.mq5 b/frontline/units/USDJPYBuster/USDJPYBuster.mq5 new file mode 100644 index 0000000..f861ea2 --- /dev/null +++ b/frontline/units/USDJPYBuster/USDJPYBuster.mq5 @@ -0,0 +1,80 @@ +//+------------------------------------------------------------------+ +//| USDJPYBuster.mq5 | +//| Standalone wrapper — logic in Strategies/USDJPYBusterStrategy.mqh | +//+------------------------------------------------------------------+ +#property copyright "Lab" +#property link "" +#property version "1.02" +#property description "USDJPY Asian range breakout (Ian style). See cluster Strategies/USDJPYBusterStrategy.mqh." + +#include +#include "../../cluster-latest/Strategies/USDJPYBusterStrategy.mqh" + +input group "=== Symbol ===" +input string InpSymbol = "USDJPY"; + +input group "=== Range session (broker server time) ===" +input int InpRangeStartHour = 3; +input int InpRangeEndHour = 6; +input int InpCloseHour = 18; +input ENUM_TIMEFRAMES InpRangeTF = PERIOD_M1; +input int InpMinRangePoints = 5; +input double InpOrderBufferPoints = 1.0; + +input group "=== Breakout orders ===" +input bool InpFirstTradeOnly = false; +input bool InpAllowLong = true; +input bool InpAllowShort = true; +input bool InpUseTakeProfit = false; +input double InpTakeProfitPoints = 0.0; + +input group "=== Risk ===" +input ENUM_UB_RISK_MODE InpRiskMode = UB_RISK_FIXED_MONEY; +input double InpFixedRiskMoney = 650.0; +input double InpRiskPercent = 2.1; +input double InpFixedLots = 0.01; +input int InpMagic = 927002; +input int InpSlippagePoints = 20; +input int InpMaxSpreadPoints = 5; + +input group "=== Debug ===" +input bool InpDrawRange = false; +input bool InpDebugLog = false; + +USDJPYBusterData g_ub; + +string WorkSymbol() +{ + string s = InpSymbol; + StringTrimLeft(s); + StringTrimRight(s); + const int bar = StringFind(s, "|"); + if(bar >= 0) + s = StringSubstr(s, 0, bar); + StringTrimRight(s); + return (StringLen(s) > 0 ? s : _Symbol); +} + +int OnInit() +{ + return InitUSDJPYBuster(g_ub, WorkSymbol(), + InpRangeStartHour, InpRangeEndHour, InpCloseHour, InpRangeTF, + InpMinRangePoints, InpOrderBufferPoints, + InpFirstTradeOnly, InpAllowLong, InpAllowShort, + InpUseTakeProfit, InpTakeProfitPoints, + InpRiskMode, InpFixedRiskMoney, InpRiskPercent, InpFixedLots, + InpMagic, InpSlippagePoints, InpMaxSpreadPoints, + InpDrawRange, InpDebugLog) ? INIT_SUCCEEDED : INIT_FAILED; +} + +void OnDeinit(const int reason) +{ + DeinitUSDJPYBuster(g_ub); +} + +void OnTick() +{ + ProcessUSDJPYBuster(g_ub, InpFixedLots, 1.0); +} + +//+------------------------------------------------------------------+ diff --git a/frontline/units/USDJPYBuster/run_backtest.py b/frontline/units/USDJPYBuster/run_backtest.py new file mode 100644 index 0000000..8bdac20 --- /dev/null +++ b/frontline/units/USDJPYBuster/run_backtest.py @@ -0,0 +1,340 @@ +""" +USDJPYBuster — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + Trade, + build_report, + calc_profit, + fill_price, + load_bars, + resolve_symbol, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "USDJPYBuster" + + +@dataclass +class SimState: + side: str | None = None + entry: float = 0.0 + entry_i: int = 0 + entry_time: object = None + sl: float = 0.0 + tp: float = 0.0 + bars_against: int = 0 + rsi_against: bool = False + + +def run_single_position( + df: pd.DataFrame, + symbol: str, + point: float, + costs: CostModel, + lot: float, + tf_label: str, + period_label: str, + params: dict, + initial_balance: float, + on_bar, +) -> BacktestReport: + trades: list[Trade] = [] + equity = [initial_balance] + st = SimState() + + def close(i: int, mid: float, reason: str) -> None: + nonlocal st + if st.side is None: + return + exit_px = fill_price(mid, point, costs, st.side, entry=False) + commission = costs.commission_per_lot * lot * 2.0 + profit = calc_profit(symbol, st.side, lot, st.entry, exit_px) - commission + trades.append( + Trade( + side=st.side, + open_time=st.entry_time, + close_time=df.index[i], + open_price=st.entry, + close_price=exit_px, + volume=lot, + profit=profit, + bars_held=i - st.entry_i, + exit_reason=reason, + ) + ) + equity.append(equity[-1] + profit) + st = SimState() + + def open_pos(i: int, side: str, mid: float) -> None: + nonlocal st + st.side = side + st.entry = fill_price(mid, point, costs, side, entry=True) + st.entry_i = i + st.entry_time = df.index[i] + + for i in range(1, len(df)): + on_bar(i, st, open_pos, close) + if len(equity) == len(trades) + 1: + equity.append(equity[-1]) + + if st.side is not None: + close(len(df) - 1, float(df["close"].iloc[-1]), "eod") + + eq = pd.Series(equity[: len(df)], index=df.index[: len(equity)]) + return build_report(STRATEGY_ID, symbol, tf_label, period_label, trades, eq, initial_balance, params) + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + equity = bal0 + df["profit"].cumsum() + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(df["close_time"], equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(df["close_time"], dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(df["close_time"], equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(df["close_time"], dd, 0, color="red", alpha=0.3) + plt.plot(df["close_time"], dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + range_start_hour: int = 3 + range_end_hour: int = 6 + close_hour: int = 18 + min_range_pts: float = 5 + order_buffer_pts: float = 1.0 + first_trade_only: bool = False + allow_long: bool = True + allow_short: bool = True + lot_size: float = 0.01 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.001 + buf = params.order_buffer_pts * point + day_state: dict = {} + p = params.to_dict() + + def on_bar(i, st, open_pos, close): + ts = df.index[i] + dk = ts.date().isoformat() + h = ts.hour + mid = float(df["open"].iloc[i]) + if st.side and h >= params.close_hour: + close(i, mid, "eod") + return + if dk not in day_state: + day_state[dk] = {"hi": -np.inf, "lo": np.inf, "built": False, "trades": 0, "range_done": False} + ds = day_state[dk] + if params.range_start_hour <= h < params.range_end_hour: + ds["hi"] = max(ds["hi"], float(df["high"].iloc[i])) + ds["lo"] = min(ds["lo"], float(df["low"].iloc[i])) + return + if not ds["range_done"] and h >= params.range_end_hour: + ds["range_done"] = True + if ds["hi"] > ds["lo"] and (ds["hi"] - ds["lo"]) / point >= params.min_range_pts: + ds["built"] = True + if not ds["built"] or st.side: + return + max_tr = 1 if params.first_trade_only else 2 + if ds["trades"] >= max_tr: + return + hi_lvl = ds["hi"] + buf + lo_lvl = ds["lo"] - buf + bar_hi = float(df["high"].iloc[i]) + bar_lo = float(df["low"].iloc[i]) + if params.allow_long and bar_hi >= hi_lvl: + open_pos(i, "BUY", mid) + st.sl = ds["lo"] + ds["trades"] += 1 + elif params.allow_short and bar_lo <= lo_lvl: + open_pos(i, "SELL", mid) + st.sl = ds["hi"] + ds["trades"] += 1 + if st.side: + if st.side == "BUY" and bar_lo <= st.sl: + close(i, st.sl, "sl") + elif st.side == "SELL" and bar_hi >= st.sl: + close(i, st.sl, "sl") + + return run_single_position(df, symbol, point, costs, params.lot_size, "M1", period_label, p, params.initial_balance, on_bar) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="USDJPY") + p.add_argument("--start", default="2021-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} bars ...") + df = load_bars(symbol, mt5.TIMEFRAME_M1, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units/_optimize_units.py b/frontline/units/_optimize_units.py new file mode 100644 index 0000000..899e157 --- /dev/null +++ b/frontline/units/_optimize_units.py @@ -0,0 +1,150 @@ +"""Constrained param search — trades must stay >= baseline. Run once then delete.""" +from __future__ import annotations + +import importlib.util +import json +import random +import sys +from dataclasses import fields, replace +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 + +ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 + +UNITS = Path(__file__).resolve().parent +TRIALS = 250 +START, END = "2021-01-01", "2026-01-01" + +SEARCH: dict[str, dict] = { + "RSIReversalAsianAUDUSD": { + "symbol": "AUDUSD", "tf": mt5.TIMEFRAME_M15, "min_trades": 351, + "ranges": {"rsi_period": (20, 40, 2), "overbought_level": (60, 85, 5), + "oversold_level": (15, 45, 5), "rsi_exit_level": (40, 58, 3)}, + }, + "RSIReversalAsianGBPUSD": { + "symbol": "GBPUSD", "tf": mt5.TIMEFRAME_M15, "min_trades": 326, + "ranges": {"rsi_period": (24, 40, 2), "overbought_level": (70, 90, 5), + "oversold_level": (20, 45, 5), "rsi_exit_level": (38, 55, 3)}, + }, + "RSIReversalAsianEURUSD": { + "symbol": "EURUSD", "tf": mt5.TIMEFRAME_M15, "min_trades": 506, + "ranges": {"rsi_period": (20, 40, 2), "overbought_level": (55, 75, 5), + "oversold_level": (5, 25, 3), "rsi_exit_level": (45, 60, 5)}, + }, + "RSIScalpingBTCUSD": { + "symbol": "BTCUSD", "tf": mt5.TIMEFRAME_H1, "min_trades": 437, + "ranges": {"rsi_period": (8, 20, 2), "rsi_overbought": (45, 75, 5), + "rsi_oversold": (20, 45, 3), "rsi_target_buy": (55, 85, 5), + "rsi_target_sell": (30, 55, 5), "bars_to_wait": (3, 10, 1)}, + }, + "RSIScalpingAPPL": { + "symbol": "AAPL", "tf": mt5.TIMEFRAME_M10, "min_trades": 458, + "ranges": {"rsi_period": (10, 22, 2), "rsi_overbought": (75, 95, 5), + "rsi_oversold": (20, 45, 3), "rsi_target_buy": (80, 98, 4), + "rsi_target_sell": (20, 50, 4), "bars_to_wait": (4, 12, 1)}, + }, + "RSIScalpingMU": { + "symbol": "MU", "tf": mt5.TIMEFRAME_M20, "min_trades": 307, + "ranges": {"rsi_period": (14, 26, 2), "rsi_overbought": (40, 70, 4), + "rsi_oversold": (20, 45, 3), "rsi_target_buy": (75, 98, 4), + "rsi_target_sell": (40, 70, 4), "bars_to_wait": (4, 12, 1)}, + }, + "EMASlopeDistanceCocktailXAUUSD": { + "symbol": "XAUUSD", "tf": mt5.TIMEFRAME_H1, "min_trades": 75, + "ranges": {"ema_period": (60, 100, 5), "price_threshold_pips": (250, 450, 25), + "slope_threshold_pips": (15, 35, 2.5), "max_loss_atr": (1.2, 2.5, 0.2), + "profit_check_bars": (24, 60, 6)}, + }, + "RSICrossOverReversalXAUUSD": { + "symbol": "XAUUSD", "tf": mt5.TIMEFRAME_M12, "min_trades": 17, + "ranges": {"overbought_level": (80, 95, 5), "oversold_level": (15, 35, 5), + "ema_distance_threshold": (80, 400, 25), "trailing_stop_pts": (200, 400, 25)}, + }, + "RSI_secret_sauce_XAUUSD": { + "symbol": "XAUUSD", "tf": mt5.TIMEFRAME_M30, "min_trades": 834, + "ranges": {"rsi_overbought": (68, 85, 2.5), "rsi_oversold": (30, 50, 2.5), + "stop_loss_atr": (2.0, 3.5, 0.25), "take_profit_atr": (4.0, 6.5, 0.5)}, + }, +} + + +def _load_module(folder: Path): + import runpy + return runpy.run_path(str(folder / "run_backtest.py")) + + +def _sample(ranges: dict) -> dict: + out = {} + for k, (lo, hi, step) in ranges.items(): + n = int((hi - lo) / step) + out[k] = lo + random.randint(0, max(0, n)) * step + return out + + +def _patch_params_file(folder: Path, updates: dict) -> None: + text = (folder / "run_backtest.py").read_text(encoding="utf-8") + for k, v in updates.items(): + if isinstance(v, bool): + rep = "True" if v else "False" + elif isinstance(v, int): + rep = str(v) + else: + rep = str(float(v)) if isinstance(v, float) else repr(v) + import re + text, n = re.subn(rf"^(\s*{k}: .* = ).*$", rf"\g<1>{rep}", text, count=1, flags=re.M) + if n == 0: + print(f" warn: could not patch {k}") + (folder / "run_backtest.py").write_text(text, encoding="utf-8") + + +def optimize_folder(name: str, cfg: dict) -> None: + folder = UNITS / name + mod = _load_module(folder) + make_params = mod["make_params"] + run_backtest = mod["run_backtest"] + sym = resolve_symbol(cfg["symbol"]) + start, end = datetime.fromisoformat(START), datetime.fromisoformat(END) + df = load_bars(sym, cfg["tf"], start, end) + costs = CostModel.for_symbol(sym) + period = f"{START}_{END}" + base_p = make_params(10_000.0) + base_r = run_backtest(df, sym, base_p, costs, period) + min_trades = cfg.get("min_trades", base_r.total_trades) + best_p, best_r = base_p, base_r + print(f"\n{name}: baseline net={base_r.net_profit:.2f} trades={base_r.total_trades} (min={min_trades})") + + flds = {f.name for f in fields(base_p)} + for _ in range(TRIALS): + samp = _sample(cfg["ranges"]) + trial_p = replace(base_p, **{k: v for k, v in samp.items() if k in flds}) + r = run_backtest(df, sym, trial_p, costs, period) + if r.total_trades < min_trades: + continue + if r.net_profit > best_r.net_profit: + best_p, best_r = trial_p, r + + if best_r.net_profit > base_r.net_profit: + updates = {f.name: getattr(best_p, f.name) for f in fields(best_p) + if f.name in cfg["ranges"] and f.name != "initial_balance"} + _patch_params_file(folder, updates) + print(f" IMPROVED net={best_r.net_profit:.2f} trades={best_r.total_trades} params={updates}") + else: + print(f" kept baseline net={base_r.net_profit:.2f} trades={base_r.total_trades}") + + +def main() -> None: + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + try: + for name, cfg in SEARCH.items(): + optimize_folder(name, cfg) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/frontline/units_economic_calendar/DarvasBoxXAUUSD/DarvasBoxXAUUSD_Genetic_Optimization.set b/frontline/units_economic_calendar/DarvasBoxXAUUSD/DarvasBoxXAUUSD_Genetic_Optimization.set new file mode 100644 index 0000000..ca12828 --- /dev/null +++ b/frontline/units_economic_calendar/DarvasBoxXAUUSD/DarvasBoxXAUUSD_Genetic_Optimization.set @@ -0,0 +1,27 @@ +; saved on 2026.04.22 +; genetic optimization set for DarvasBoxXAUUSD/main.mq5 +; load in MT5 Strategy Tester -> Inputs -> Load +; +; === Core Darvas Box Parameters === +BoxPeriod=165||80||5||280||Y +BoxDeviation=25140||8000||500||50000||Y +VolumeThreshold=938||200||25||2500||Y +StopLoss=1665||600||50||4000||Y +TakeProfit=3685||1200||75||8000||Y +EnableLogging=false||false||0||true||N +BoxColor=255||0||1||16777215||N +BoxWidth=1||1||1||3||N +; +; === Trend Confirmation Parameters === +TrendTimeframe=16386||16385||1||16388||Y +MA_Period=125||20||5||260||Y +MA_Method=1||0||1||3||Y +MA_Price=6||0||1||6||Y +TrendThreshold=4.94||1.0||0.2||20.0||Y +; +; === Volume Analysis Parameters === +VolumeMA_Period=110||20||5||220||Y +VolumeThresholdMultiplier=1.5||1.0||0.1||3.5||Y +; +; === Execution / ID === +MagicNumber=135790||135790||1||1357900||N diff --git a/frontline/units_economic_calendar/DarvasBoxXAUUSD/main.mq5 b/frontline/units_economic_calendar/DarvasBoxXAUUSD/main.mq5 new file mode 100644 index 0000000..6da93f9 --- /dev/null +++ b/frontline/units_economic_calendar/DarvasBoxXAUUSD/main.mq5 @@ -0,0 +1,443 @@ +//+------------------------------------------------------------------+ +//| DarvasBox.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#property strict + +#include +#include +#include +#include "../_united/MagicNumberHelpers.mqh" + +// Input parameters +input int BoxPeriod = 165; // Period for Darvas Box calculation +input double BoxDeviation = 25140; // Box deviation in points +input int VolumeThreshold = 938; // Minimum volume for confirmation +input double StopLoss = 1665; // Stop loss in points (increased for BTCUSD) +input double TakeProfit = 3685; // Take profit in points (increased for BTCUSD) +input bool EnableLogging = false; // Enable detailed logging +input color BoxColor = clrBlue; // Color for Darvas Box +input int BoxWidth = 1; // Width of box lines + +// Trend confirmation parameters +input ENUM_TIMEFRAMES TrendTimeframe = PERIOD_H2; // Timeframe for trend analysis +input int MA_Period = 125; // Moving Average period for trend +input ENUM_MA_METHOD MA_Method = MODE_EMA; // Moving Average method +input ENUM_APPLIED_PRICE MA_Price = PRICE_WEIGHTED; // Price type for MA +input double TrendThreshold = 4.94; // Trend strength threshold + +// Volume analysis parameters +input int VolumeMA_Period = 110; // Period for Volume MA +input double VolumeThresholdMultiplier = 1.5; // Volume spike threshold + +// Magic Number +input int MagicNumber = 135790; // Magic Number for Trades + +// Global variables +double boxHigh = 0; +double boxLow = 0; +bool boxFormed = false; +datetime lastBoxTime = 0; +string boxName = "DarvasBox_"; +double minStopLevel = 0; +double point = 0; +CTrade trade; + +// Indicator handles +int maHandle; +int volumeHandle; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize indicators and variables + boxHigh = 0; + boxLow = 0; + boxFormed = false; + lastBoxTime = 0; + + // Get symbol properties + point = SymbolInfoDouble(_Symbol, SYMBOL_POINT); + minStopLevel = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * point; + + // Initialize indicators + maHandle = iMA(_Symbol, TrendTimeframe, MA_Period, 0, MA_Method, MA_Price); + volumeHandle = iVolumes(_Symbol, PERIOD_CURRENT, VOLUME_TICK); + + if(maHandle == INVALID_HANDLE || volumeHandle == INVALID_HANDLE) + { + Print("Error creating indicators"); + return(INIT_FAILED); + } + + // Configure trade object + trade.SetDeviationInPoints(10); + trade.SetTypeFilling(ORDER_FILLING_IOC); + trade.SetAsyncMode(false); + trade.SetExpertMagicNumber(MagicNumber); + + if(EnableLogging) + { + Print("Darvas Box Expert Advisor initialized"); + Print("Symbol: ", _Symbol); + Print("Point: ", point); + Print("Minimum Stop Level: ", minStopLevel); + } + + // Delete any existing box objects + ObjectsDeleteAll(0, boxName); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Draw Darvas Box on chart | +//+------------------------------------------------------------------+ +void DrawDarvasBox() +{ + if(!boxFormed) return; + + datetime time1 = iTime(_Symbol, PERIOD_H1, BoxPeriod); + datetime time2 = iTime(_Symbol, PERIOD_H1, 0); + + // Delete old box + ObjectsDeleteAll(0, boxName); + + // Draw box + ObjectCreate(0, boxName + "Top", OBJ_TREND, 0, time1, boxHigh, time2, boxHigh); + ObjectCreate(0, boxName + "Bottom", OBJ_TREND, 0, time1, boxLow, time2, boxLow); + + // Set box properties + ObjectSetInteger(0, boxName + "Top", OBJPROP_COLOR, BoxColor); + ObjectSetInteger(0, boxName + "Bottom", OBJPROP_COLOR, BoxColor); + ObjectSetInteger(0, boxName + "Top", OBJPROP_WIDTH, BoxWidth); + ObjectSetInteger(0, boxName + "Bottom", OBJPROP_WIDTH, BoxWidth); + ObjectSetInteger(0, boxName + "Top", OBJPROP_RAY_RIGHT, true); + ObjectSetInteger(0, boxName + "Bottom", OBJPROP_RAY_RIGHT, true); +} + +//+------------------------------------------------------------------+ +//| Calculate Darvas Box levels | +//+------------------------------------------------------------------+ +void CalculateDarvasBox() +{ + double high = 0; + double low = DBL_MAX; + + // Find highest high and lowest low in the period + for(int i = 0; i < BoxPeriod; i++) + { + high = MathMax(high, iHigh(_Symbol, PERIOD_H1, i)); + low = MathMin(low, iLow(_Symbol, PERIOD_H1, i)); + } + + double range = high - low; + double allowedRange = BoxDeviation * _Point; + + if(EnableLogging) + { + Print("Box Calculation - High: ", high, " Low: ", low, " Range: ", range, " Allowed Range: ", allowedRange); + } + + // Check if box is formed + if(range <= allowedRange) + { + boxHigh = high; + boxLow = low; + boxFormed = true; + lastBoxTime = iTime(_Symbol, PERIOD_CURRENT, 0); + + // Draw the box + DrawDarvasBox(); + + if(EnableLogging) + Print("Box Formed - High: ", boxHigh, " Low: ", boxLow, " Time: ", lastBoxTime); + } + else + { + boxFormed = false; + // Delete box if it exists + ObjectsDeleteAll(0, boxName); + } +} + +//+------------------------------------------------------------------+ +//| Validate and adjust stop levels | +//+------------------------------------------------------------------+ +bool ValidateStopLevels(double price, double &sl, double &tp, ENUM_ORDER_TYPE orderType) +{ + double minSlDistance = MathMax(minStopLevel, StopLoss * point); + double minTpDistance = MathMax(minStopLevel, TakeProfit * point); + + if(EnableLogging) + { + Print("Minimum SL Distance: ", minSlDistance); + Print("Minimum TP Distance: ", minTpDistance); + } + + // Adjust stop loss + if(orderType == ORDER_TYPE_BUY) + { + sl = price - minSlDistance; + tp = price + minTpDistance; + + if(EnableLogging) + { + Print("Buy Order Levels:"); + Print("Entry: ", price); + Print("Stop Loss: ", sl); + Print("Take Profit: ", tp); + } + } + else // ORDER_TYPE_SELL + { + sl = price + minSlDistance; + tp = price - minTpDistance; + + if(EnableLogging) + { + Print("Sell Order Levels:"); + Print("Entry: ", price); + Print("Stop Loss: ", sl); + Print("Take Profit: ", tp); + } + } + + return true; +} + +//+------------------------------------------------------------------+ +//| Check trend direction and strength | +//+------------------------------------------------------------------+ +bool IsTrendFavorable(ENUM_ORDER_TYPE orderType) +{ + double ma[]; + ArraySetAsSeries(ma, true); + + if(CopyBuffer(maHandle, 0, 0, 2, ma) <= 0) + return false; + + double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + double trendStrength = MathAbs(currentPrice - ma[0]) / point; + + if(EnableLogging) + Print("Trend Strength: ", trendStrength); + + if(orderType == ORDER_TYPE_BUY) + return (currentPrice > ma[0] && trendStrength > TrendThreshold); + else + return (currentPrice < ma[0] && trendStrength > TrendThreshold); +} + +//+------------------------------------------------------------------+ +//| Check volume conditions | +//+------------------------------------------------------------------+ +bool CheckVolumeConditions() +{ + double volumes[]; + ArraySetAsSeries(volumes, true); + + if(CopyBuffer(volumeHandle, 0, 0, VolumeMA_Period + 1, volumes) <= 0) + return false; + + double volumeMA = 0; + for(int i = 1; i <= VolumeMA_Period; i++) + volumeMA += volumes[i]; + volumeMA /= VolumeMA_Period; + + double currentVolume = volumes[0]; + double volumeRatio = currentVolume / volumeMA; + + if(EnableLogging) + Print("Volume Ratio: ", volumeRatio); + + return (volumeRatio > VolumeThresholdMultiplier); +} + +//+------------------------------------------------------------------+ +//| Place trade order | +//+------------------------------------------------------------------+ +bool PlaceOrder(ENUM_ORDER_TYPE orderType, double price, double sl, double tp) +{ + // Validate and adjust stop levels + if(!ValidateStopLevels(price, sl, tp, orderType)) + { + if(EnableLogging) + Print("Invalid stop levels after adjustment"); + return false; + } + + // Check trend and volume conditions + if(!IsTrendFavorable(orderType)) + { + if(EnableLogging) + Print("Trend not favorable for trade"); + return false; + } + + if(!CheckVolumeConditions()) + { + if(EnableLogging) + Print("Volume conditions not met"); + return false; + } + + if(EnableLogging) + { + Print("Order Details:"); + Print("Type: ", EnumToString(orderType)); + Print("Price: ", price); + Print("Stop Loss: ", sl); + Print("Take Profit: ", tp); + } + + bool result = false; + + if(orderType == ORDER_TYPE_BUY) + { + result = trade.Buy(0.01, _Symbol, price, sl, tp, "Darvas Box Breakout"); + } + else + { + result = trade.Sell(0.01, _Symbol, price, sl, tp, "Darvas Box Breakdown"); + } + + if(EnableLogging) + { + if(result) + Print((orderType == ORDER_TYPE_BUY ? "Buy" : "Sell"), " Order Placed Successfully"); + else + Print((orderType == ORDER_TYPE_BUY ? "Buy" : "Sell"), " Order Failed - Error: ", trade.ResultRetcode(), " Description: ", trade.ResultRetcodeDescription()); + } + + return result; +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // Calculate new box levels + CalculateDarvasBox(); + + // Check for trading signals + if(boxFormed) + { + double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + double currentVolume = iVolume(_Symbol, PERIOD_CURRENT, 0); + + if(EnableLogging) + { + Print("Current Price: ", currentPrice, " Box High: ", boxHigh, " Box Low: ", boxLow); + Print("Current Volume: ", currentVolume, " Volume Threshold: ", VolumeThreshold); + } + + // Check for breakout above box + if(currentPrice > boxHigh && currentVolume > VolumeThreshold) + { + if(EnableLogging) + Print("Breakout Signal Detected - Price above box high"); + + // Buy signal + if(!PositionExistsByMagic(_Symbol, MagicNumber)) // No existing positions with our magic number + { + double sl = currentPrice - StopLoss * _Point; + double tp = currentPrice + TakeProfit * _Point; + + if(EnableLogging) + Print("Preparing Buy Order - Price: ", currentPrice, " SL: ", sl, " TP: ", tp); + + PlaceOrder(ORDER_TYPE_BUY, currentPrice, sl, tp); + } + else if(EnableLogging) + Print("Skipping Buy Signal - Position already exists"); + } + + // Check for breakdown below box + if(currentPrice < boxLow && currentVolume > VolumeThreshold) + { + if(EnableLogging) + Print("Breakdown Signal Detected - Price below box low"); + + // Sell signal + if(!PositionExistsByMagic(_Symbol, MagicNumber)) // No existing positions with our magic number + { + double sl = currentPrice + StopLoss * _Point; + double tp = currentPrice - TakeProfit * _Point; + + if(EnableLogging) + Print("Preparing Sell Order - Price: ", currentPrice, " SL: ", sl, " TP: ", tp); + + PlaceOrder(ORDER_TYPE_SELL, currentPrice, sl, tp); + } + else if(EnableLogging) + Print("Skipping Sell Signal - Position already exists"); + } + } + else if(EnableLogging) + Print("No Box Formed - Waiting for consolidation"); +} + +//+------------------------------------------------------------------+ +//| Get last error description | +//+------------------------------------------------------------------+ +string GetLastErrorDescription() +{ + string errorDescription; + switch(GetLastError()) + { + case 0: errorDescription = "No error"; break; + case 1: errorDescription = "No error, but result unknown"; break; + case 2: errorDescription = "Common error"; break; + case 3: errorDescription = "Invalid trade parameters"; break; + case 4: errorDescription = "Trade server is busy"; break; + case 5: errorDescription = "Old version of the client terminal"; break; + case 6: errorDescription = "No connection with trade server"; break; + case 7: errorDescription = "Not enough rights"; break; + case 8: errorDescription = "Too frequent requests"; break; + case 9: errorDescription = "Malfunctional trade operation"; break; + case 64: errorDescription = "Account disabled"; break; + case 65: errorDescription = "Invalid account"; break; + case 128: errorDescription = "Trade timeout"; break; + case 129: errorDescription = "Invalid price"; break; + case 130: errorDescription = "Invalid stops"; break; + case 131: errorDescription = "Invalid trade volume"; break; + case 132: errorDescription = "Market is closed"; break; + case 133: errorDescription = "Trade is disabled"; break; + case 134: errorDescription = "Not enough money"; break; + case 135: errorDescription = "Price changed"; break; + case 136: errorDescription = "Off quotes"; break; + case 137: errorDescription = "Broker is busy"; break; + case 138: errorDescription = "Requote"; break; + case 139: errorDescription = "Order is locked"; break; + case 140: errorDescription = "Long positions only allowed"; break; + case 141: errorDescription = "Too many requests"; break; + case 145: errorDescription = "Modification denied because order is too close to market"; break; + case 146: errorDescription = "Trade context is busy"; break; + case 147: errorDescription = "Expirations are denied by broker"; break; + case 148: errorDescription = "Amount of open and pending orders has reached the limit"; break; + case 149: errorDescription = "Hedging is prohibited"; break; + case 150: errorDescription = "Prohibited by FIFO rules"; break; + default: errorDescription = "Unknown error"; break; + } + return errorDescription; +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + // Delete all box objects + ObjectsDeleteAll(0, boxName); + + if(EnableLogging) + Print("Expert Advisor deinitialized - Reason: ", reason); +} diff --git a/frontline/units_economic_calendar/EMASlopeDistanceCocktailXAUUSD/EMASlopeDistanceCocktailXAUUSD_Genetic_Optimization.set b/frontline/units_economic_calendar/EMASlopeDistanceCocktailXAUUSD/EMASlopeDistanceCocktailXAUUSD_Genetic_Optimization.set new file mode 100644 index 0000000..8e9725e --- /dev/null +++ b/frontline/units_economic_calendar/EMASlopeDistanceCocktailXAUUSD/EMASlopeDistanceCocktailXAUUSD_Genetic_Optimization.set @@ -0,0 +1,35 @@ +; saved on 2026.05.13 +; genetic optimization set for EMASlopeDistanceCocktailXAUUSD/main.mq5 +; load in MT5 Strategy Tester -> Inputs -> Load +; format: Parameter=Current||Start||Step||Stop||Optimize(Y/N) +; +; ENUM_TIMEFRAMES: M1=1 M5=5 M15=15 M30=30 H1=16385 H4=16388 D1=16408 +; Timeframe fixed at H1 (16385); sweeping 0..49153 can pick invalid enum values. +; +; Ranges/steps match Desktop 123.set (2026.05.13); Y marks parameters included in genetic optimization. + +; === EMA / trigger thresholds === +EMA_Periode=50||50||1||500||Y +PreisSchwelle=700.0||70.0||70.0||7000.0||Y +SteigungSchwelle=25.0||2.5||2.5||250.0||Y +ÜberwachungTimeout=340||1||1||3400||Y +TrailingStop=370.0||37.0||37.0||3700.0||Y +LotGröße=0.07||0.007||0.007||0.7||Y + +; === execution / data === +MagicNumber=135790||135790||1||1357900||N +UseSpreadAdjustment=true||false||0||true||N +Timeframe=16385||16385||0||16385||N +UseBarData=true||false||0||true||N + +; === crossover / profit management === +MaxTradesPerCrossover=10||1||1||100||Y +ProfitCheckBars=15||1||1||150||Y +CloseUnprofitableTrades=true||false||0||true||N + +; === weekly ADX filter === +UseWeeklyADXFilter=true||false||0||true||N +WeeklyADXPeriod=15||1||1||150||Y +WeeklyADXMin=40.0||4.0||4.0||400.0||Y +WeeklyADXBarShift=2||1||1||20||Y +WeeklyADXUseDirection=true||false||0||true||N diff --git a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/main.mq5 b/frontline/units_economic_calendar/EMASlopeDistanceCocktailXAUUSD/main.mq5 similarity index 97% rename from lab/EAs/EMASlopeDistanceCocktailBTCUSD/main.mq5 rename to frontline/units_economic_calendar/EMASlopeDistanceCocktailXAUUSD/main.mq5 index 06b1086..586e17e 100644 --- a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/main.mq5 +++ b/frontline/units_economic_calendar/EMASlopeDistanceCocktailXAUUSD/main.mq5 @@ -8,24 +8,24 @@ #property version "1.00" #include #include "../_united/MagicNumberHelpers.mqh" -//--- Eingabeparameter (Input Parameters) - Optimized Profitable Parameters -input int EMA_Periode = 50; // EMA Periode -input double PreisSchwelle = 700.0; // Preisbewegung Schwelle in Pips -input double SteigungSchwelle = 25.0; // EMA Steigung Schwelle in Pips +//--- Eingabeparameter (Input Parameters) — synced with Desktop 123.set (2026.05.13) +input int EMA_Periode = 85; // EMA Periode +input double PreisSchwelle = 350.0; // Preisbewegung Schwelle in Pips +input double SteigungSchwelle = 22.5; // EMA Steigung Schwelle in Pips input int ÜberwachungTimeout = 340; // Überwachungszeit in Sekunden -input double TrailingStop = 370.0; // Gleitender Stop in Pips +input double TrailingStop = 74.0; // Gleitender Stop in Pips input double LotGröße = 0.07; // Handelsvolumen input int MagicNumber = 135790; // Magic Number für Trades input bool UseSpreadAdjustment = true; // Spread-Anpassung verwenden input ENUM_TIMEFRAMES Timeframe = PERIOD_H1; // Zeitraum für Analyse input bool UseBarData = true; // Bar-Daten statt Tick-Daten verwenden -input int MaxTradesPerCrossover = 10; // Maximale Trades pro Crossover-Ereignis -input int ProfitCheckBars = 15; // Bars bis zur Profit-Prüfung +input int MaxTradesPerCrossover = 48; // Maximale Trades pro Crossover-Ereignis +input int ProfitCheckBars = 78; // Bars bis zur Profit-Prüfung input bool CloseUnprofitableTrades = true; // Unprofitable Trades nach X Bars schließen input bool UseWeeklyADXFilter = true; // W1 ADX Trendfilter aktivieren -input int WeeklyADXPeriod = 15; // ADX-Periode auf W1 -input double WeeklyADXMin = 40.0; // Minimaler ADX fuer Trendfreigabe -input int WeeklyADXBarShift = 2; // 1=letzte geschlossene W1-Kerze +input int WeeklyADXPeriod = 28; // ADX-Periode auf W1 +input double WeeklyADXMin = 25.0; // Minimaler ADX fuer Trendfreigabe +input int WeeklyADXBarShift = 8; // 1=letzte geschlossene W1-Kerze input bool WeeklyADXUseDirection = true; // +DI/-DI Richtung mitpruefen //--- Globale Variablen (Global Variables) diff --git a/frontline/units/MeanReversionBTCUSD/MeanReversionEMA_RSI_ADX.mq5 b/frontline/units_economic_calendar/MeanReversionBTCUSD/MeanReversionEMA_RSI_ADX.mq5 similarity index 100% rename from frontline/units/MeanReversionBTCUSD/MeanReversionEMA_RSI_ADX.mq5 rename to frontline/units_economic_calendar/MeanReversionBTCUSD/MeanReversionEMA_RSI_ADX.mq5 diff --git a/frontline/units/MeanReversionBTCUSD/MeanReversionEMA_RSI_ADX_genetic.set b/frontline/units_economic_calendar/MeanReversionBTCUSD/MeanReversionEMA_RSI_ADX_genetic.set similarity index 100% rename from frontline/units/MeanReversionBTCUSD/MeanReversionEMA_RSI_ADX_genetic.set rename to frontline/units_economic_calendar/MeanReversionBTCUSD/MeanReversionEMA_RSI_ADX_genetic.set diff --git a/frontline/units/MeanReversionBTCUSD/daughter.set b/frontline/units_economic_calendar/MeanReversionBTCUSD/daughter.set similarity index 100% rename from frontline/units/MeanReversionBTCUSD/daughter.set rename to frontline/units_economic_calendar/MeanReversionBTCUSD/daughter.set diff --git a/frontline/units_economic_calendar/RSICrossOverReversalXAUUSD/RSICrossOverReversalXAUUSD_Genetic_Optimization.set b/frontline/units_economic_calendar/RSICrossOverReversalXAUUSD/RSICrossOverReversalXAUUSD_Genetic_Optimization.set new file mode 100644 index 0000000..ac331d4 --- /dev/null +++ b/frontline/units_economic_calendar/RSICrossOverReversalXAUUSD/RSICrossOverReversalXAUUSD_Genetic_Optimization.set @@ -0,0 +1,38 @@ +; RSICrossOverReversalXAUUSD/main.mq5 — Strategy Tester → Inputs → Load +; +; MT5 line format: Name=Value||From||Step||To||Optimize +; Value = input default when you Load this file +; From, Step, To = optimization range when Optimize=Y (Genetic / slow complete algorithm) +; Optimize=N = keep Value; From/Step/To are ignored +; +; First column matches main.mq5 source defaults (not the old Desktop 123 snapshot). + +MagicNumber=7||7||1||7||N +rsiPeriod=19||10||1||35||Y +overboughtLevel=93||65||2||95||Y +oversoldLevel=22||10||1||45||Y +entryRSIBuySpread=0.0||0.0||0.5||8.0||Y +entryRSISellSpread=0.0||0.0||0.5||8.0||Y +lotSize=0.1||0.1||0.01||0.5||N +slippage=3||3||1||3||N +cooldownSeconds=209||60||30||600||Y +TimeFrame1=1||1||0||1||N +TimeFrame2=1||1||0||1||N +BarTimeFrame=12||12||0||12||N +emaPeriod=140||50||10||300||Y +emaSlopeThreshold=105.0||20.0||5.0||200.0||Y +exitBuyRSI=86.0||65.0||1.0||92.0||Y +exitSellRSI=10.0||5.0||1.0||40.0||Y +TrailingStop=295.0||80.0||15.0||450.0||Y +emaDistanceThreshold=165.0||40.0||10.0||350.0||Y +tradingHourOneBegin=24||0||1||23||N +tradingHourOneEnd=22||0||1||23||N +tradingHourTwoBegin=6||0||1||14||Y +tradingHourTwoEnd=19||14||1||23||Y +Sunday=false||false||0||true||Y +Monday=false||false||0||true||Y +Tuesday=true||false||0||true||Y +Wednesday=true||false||0||true||Y +Thursday=true||false||0||true||Y +Friday=false||false||0||true||Y +Saturday=false||false||0||true||Y diff --git a/frontline/units_economic_calendar/RSICrossOverReversalXAUUSD/main.mq5 b/frontline/units_economic_calendar/RSICrossOverReversalXAUUSD/main.mq5 new file mode 100644 index 0000000..8412fa6 --- /dev/null +++ b/frontline/units_economic_calendar/RSICrossOverReversalXAUUSD/main.mq5 @@ -0,0 +1,295 @@ +// Input Parameters +#include +#include "../_united/MagicNumberHelpers.mqh" + +input group "Trade Management" +input int MagicNumber = 7; +input int rsiPeriod = 19; // RSI period +input int overboughtLevel = 93; // Overbought level (RSI > 70 for sell) +input int oversoldLevel = 22; // Oversold level (RSI < 30 for buy) +input double entryRSIBuySpread = 0; +input double entryRSISellSpread = 0; +input double lotSize = 0.1; // Trade lot size +input int slippage = 3; // Slippage for orders +input int cooldownSeconds = 209; // Cooldown period in seconds +input ENUM_TIMEFRAMES TimeFrame1 = PERIOD_M1; // RSI Timeframe +input ENUM_TIMEFRAMES TimeFrame2 = PERIOD_M1; // EMA Timeframe +input ENUM_TIMEFRAMES BarTimeFrame = PERIOD_M12; // EMA Timeframe +input int emaPeriod = 140; // EMA period +input double emaSlopeThreshold = 105; // EMA slope threshold for trend strength +input double exitBuyRSI = 86; +input double exitSellRSI = 10; +input double TrailingStop = 295; +input double emaDistanceThreshold = 165; +input int tradingHourOneBegin = 24; +input int tradingHourOneEnd = 22; +input int tradingHourTwoBegin = 6; +input int tradingHourTwoEnd = 19; +datetime bartime; +// RSI Handle +int rsiHandle; + +input bool Sunday =false; // Sunday +input bool Monday =false; // Monday +input bool Tuesday =true; // Tuesday +input bool Wednesday=true; // Wednesday +input bool Thursday =true; // Thursday +input bool Friday =false; // Friday +input bool Saturday =false; // Saturday + +bool WeekDays[7]; + +void WeekDays_Init() + { + WeekDays[0]=Sunday; + WeekDays[1]=Monday; + WeekDays[2]=Tuesday; + WeekDays[3]=Wednesday; + WeekDays[4]=Thursday; + WeekDays[5]=Friday; + WeekDays[6]=Saturday; + } + +bool WeekDays_Check(datetime aTime) + { + MqlDateTime stm; + TimeToStruct(aTime,stm); + return(WeekDays[stm.day_of_week]); + } + + +// EMA Handle +int emaHandle; +double previousRSIDef = 0; +// Create CTrade object for executing trades +CTrade trade; + +// Track the last trade time +datetime lastTradeTime = 0; + +void OnInit() { + WeekDays_Init(); + + // Create RSI handle + rsiHandle = iRSI(_Symbol, TimeFrame1, rsiPeriod, PRICE_CLOSE); + if (rsiHandle == INVALID_HANDLE) { + Print("Error creating RSI handle: ", GetLastError()); + return; + } + + // Create EMA handle + emaHandle = iMA(_Symbol, TimeFrame2, emaPeriod, 0, MODE_EMA, PRICE_CLOSE); + if (emaHandle == INVALID_HANDLE) { + Print("Error creating EMA handle: ", GetLastError()); + return; + } + + // Initialization successful + Print("RSI and EMA Reversal Strategy Initialized."); +} + +void OnTick() { + if(bartime==iTime(_Symbol,BarTimeFrame,0))return; + bartime=iTime(_Symbol,BarTimeFrame,0); + + // Check if RSI data is available + double rsi[]; + if (CopyBuffer(rsiHandle, 0, 0, 2, rsi) <= 0) { + Print("Error copying RSI data: ", GetLastError()); + return; + } + + // Check if EMA data is available + double ema[]; + if (CopyBuffer(emaHandle, 0, 0, 2, ema) <= 0) { + Print("Error copying EMA data: ", GetLastError()); + return; + } + + // Get the current time + datetime currentTime = TimeCurrent(); + + + int currentHour = TimeHour(TimeCurrent()); + + if(!WeekDays_Check(TimeTradeServer())) { + Close_Position_MN(MagicNumber); + return; + } + + if (!(currentHour < tradingHourOneEnd && currentHour > tradingHourOneBegin || currentHour < tradingHourTwoEnd && currentHour > tradingHourTwoBegin)) + { + + Close_Position_MN(MagicNumber); + return; // Prevent further trading during this time + } + + + // Ensure there is at least one position + bool hasPosition = PositionExistsByMagic(_Symbol, MagicNumber); + + + + // Get the current and previous RSI values + double currentRSI = rsi[0]; + double previousRSI = rsi[1]; + + if(previousRSIDef == 0) { + previousRSIDef = currentRSI; + return; + } + + // Get the current and previous EMA values + double currentEMA = ema[0]; + double previousEMA = ema[1]; + + // Calculate the EMA slope (difference between current and previous EMA values) + double emaSlope = (currentEMA - previousEMA) * 100; + Print(emaSlope); + + double closeCurr = iClose(Symbol(), Period(), 0); // Close of current bar + // ** NEW CODE: Calculate distance to EMA and adjust score ** + double priceToEmaDistance = (closeCurr - currentEMA) * 10; // Distance between the current price and the EMA + Print("priceToEmaDistance"); + Print(priceToEmaDistance); + + + // Determine if there are existing buy or sell positions + bool isBuyPosition = false; + bool isSellPosition = false; + if (hasPosition) { + if (PositionSelectByMagic(_Symbol, MagicNumber)) { + int positionType = PositionGetInteger(POSITION_TYPE); + if (positionType == POSITION_TYPE_BUY) { + isBuyPosition = true; + } else if (positionType == POSITION_TYPE_SELL) { + isSellPosition = true; + } + } + } + + ApplyTrailingStop(); + + // Check if the cooldown period has elapsed since the last trade + bool cooldownPassed = (currentTime - lastTradeTime) >= cooldownSeconds; + + // Check if EMA slope is above the threshold (indicating strong trend) + bool isTrendStrong = MathAbs(emaSlope) > emaSlopeThreshold || MathAbs(priceToEmaDistance) > emaDistanceThreshold; + + // Close trade logic when RSI crosses 50 + if (isBuyPosition && currentRSI > exitBuyRSI) { + // Close buy position + Close_Position_MN(MagicNumber); + lastTradeTime = currentTime; // Update last trade time + } + + if (isSellPosition && currentRSI < exitSellRSI) { + Close_Position_MN(MagicNumber); + lastTradeTime = currentTime; // Update last trade time + + } + + + // If the EMA slope is strong, do not place new trades + if (isTrendStrong) { + Close_Position_MN(MagicNumber); + lastTradeTime = currentTime; // Update last trade time + Print("Strong trend detected (EMA slope), skipping new trade."); + return; + } + + // SELL logic (RSI crosses over the overbought level) + if (currentRSI < overboughtLevel - entryRSISellSpread && previousRSIDef >= overboughtLevel && !isSellPosition && !hasPosition && cooldownPassed) { + trade.SetExpertMagicNumber(MagicNumber); + if (trade.Sell(lotSize, _Symbol, 0, 0, "Sell Order")) { + Print("Sell order placed."); + lastTradeTime = currentTime; // Update last trade time + } else { + Print("Error placing sell order: ", GetLastError()); + } + } + + // BUY logic (RSI crosses below the oversold level) + if (currentRSI > oversoldLevel + entryRSIBuySpread && previousRSIDef <= oversoldLevel && !isBuyPosition && !hasPosition && cooldownPassed) { + trade.SetExpertMagicNumber(MagicNumber); + if (trade.Buy(lotSize, _Symbol, 0, 0, "Buy Order")) { + Print("Buy order placed."); + lastTradeTime = currentTime; // Update last trade time + } else { + Print("Error placing buy order: ", GetLastError()); + } + } + + previousRSIDef = currentRSI; +} + +void OnDeinit(const int reason) { + // Release RSI and EMA handles on deinitialization + if (rsiHandle != INVALID_HANDLE) { + IndicatorRelease(rsiHandle); + Print("RSI handle released."); + } + if (emaHandle != INVALID_HANDLE) { + IndicatorRelease(emaHandle); + Print("EMA handle released."); + } +} + + +void Close_Position_MN(ulong magicNumber) +{ + // Use helper function to close position by magic number + ClosePositionByMagic(trade, _Symbol, (int)magicNumber); +} + +void ApplyTrailingStop() +{ + Print("Scanning for trailing stop"); + + // Check if position exists with our magic number + if(!PositionSelectByMagic(_Symbol, MagicNumber)) + { + return; // No position with our magic number + } + + ulong PositionTicket = PositionGetInteger(POSITION_TICKET); + long trade_type = PositionGetInteger(POSITION_TYPE); + string symbol = _Symbol; + + double POINT = SymbolInfoDouble(symbol, SYMBOL_POINT); + int DIGIT = (int) SymbolInfoInteger(symbol, SYMBOL_DIGITS); + + if(trade_type == POSITION_TYPE_BUY) + { + double Bid = NormalizeDouble(SymbolInfoDouble(symbol, SYMBOL_BID), DIGIT); + + if(Bid - PositionGetDouble(POSITION_PRICE_OPEN) > NormalizeDouble(POINT * TrailingStop, DIGIT)) + { + if(PositionGetDouble(POSITION_SL) < NormalizeDouble(Bid - POINT * TrailingStop, DIGIT)) + { + ModifyPositionByMagic(trade, symbol, MagicNumber, + NormalizeDouble(Bid - POINT * TrailingStop, DIGIT), + PositionGetDouble(POSITION_TP)); + } + } + } + else if(trade_type == POSITION_TYPE_SELL) + { + double Ask = NormalizeDouble(SymbolInfoDouble(symbol, SYMBOL_ASK), DIGIT); + + if((PositionGetDouble(POSITION_PRICE_OPEN) - Ask) > NormalizeDouble(POINT * TrailingStop, DIGIT)) + { + if((PositionGetDouble(POSITION_SL) > NormalizeDouble(Ask + POINT * TrailingStop, DIGIT)) || + (PositionGetDouble(POSITION_SL) == 0)) + { + ModifyPositionByMagic(trade, symbol, MagicNumber, + NormalizeDouble(Ask + POINT * TrailingStop, DIGIT), + PositionGetDouble(POSITION_TP)); + } + } + } +} + +int TimeHour(datetime when=0){ if(when == 0) when = TimeCurrent(); + return when / 3600 % 24; +} \ No newline at end of file diff --git a/frontline/units_economic_calendar/RSIMidPointHijackXAUUSD/RSIMidPointHijackXAUUSD_Genetic_Optimization.set b/frontline/units_economic_calendar/RSIMidPointHijackXAUUSD/RSIMidPointHijackXAUUSD_Genetic_Optimization.set new file mode 100644 index 0000000..73379c5 --- /dev/null +++ b/frontline/units_economic_calendar/RSIMidPointHijackXAUUSD/RSIMidPointHijackXAUUSD_Genetic_Optimization.set @@ -0,0 +1,50 @@ +; RSIMidPointHijackXAUUSD/main.mq5 — Strategy Tester → Inputs → Load (Genetic optimization) +; Format: Parameter=Current||Start||Step||Stop||Optimize(Y/N) +; +; Baseline from Desktop 123.set (2026.05.13). InpTimeframe fixed at H1 (16385) to avoid invalid ENUM_TIMEFRAMES. +; RSI level sweeps capped at 100; hour sweeps capped at 23 (123.set used wider columns that are invalid for this EA). + +; === General Settings === +InpTimeframe=16385||16385||1||16385||N +InpLotSize=0.1||0.01||0.01||1.0||Y +InpMagicNumberRSIFollow=1001||1001||1||10010||N +InpMagicNumberRSIReverse=1002||1002||1||10020||N +InpMagicNumberEMACross=1003||1003||1||10030||N + +; === Strategy Switches === +InpEnableRSIFollow=true||false||0||true||N +InpEnableRSIReverse=true||false||0||true||N +InpEnableEMACross=true||false||0||true||N +InpEnableStrategyLock=true||false||0||true||N +InpLockProfitThreshold=6.0||0.6||0.6||60.0||Y +InpCloseOppositeTrades=true||false||0||true||N + +; === RSI Follow Strategy === +InpRSIPeriod=32||8||2||96||Y +InpRSIOverbought=78||60||1||95||Y +InpRSIOversold=46||5||1||45||Y +InpRSIExitLevel=44||10||1||90||Y +InpRSIFollowStartHour=23||0||1||23||Y +InpRSIFollowEndHour=8||0||1||23||Y +InpRSIFollowCloseOutsideHours=false||false||0||true||N + +; === RSI Reverse Strategy === +InpRSIReversePeriod=59||14||2||96||Y +InpRSIReverseOverbought=51||55||1||95||Y +InpRSIReverseOversold=49||5||1||50||Y +InpRSIReverseCrossLevel=53||45||1||70||Y +InpRSIReverseExitLevel=48||10||1||90||Y +InpRSIReverseStartHour=7||0||1||23||Y +InpRSIReverseEndHour=13||0||1||23||Y +InpRSIReverseCloseOutsideHours=false||false||0||true||N +InpRSIReverseCooldownBars=15||1||1||150||Y +InpRSIReverseCooldownOnLoss=true||false||0||true||N + +; === EMA Cross Strategy === +InpEMAPeriod=120||20||5||200||Y +InpEMACrossStartHour=8||0||1||23||Y +InpEMACrossEndHour=14||0||1||23||Y +InpEMACrossCloseOutsideHours=true||false||0||true||N +InpUseEMADistanceEntry=true||false||0||true||N +InpEMADistancePips=160.0||16.0||16.0||1600.0||Y +InpEMADistancePeriod=26||5||1||60||Y diff --git a/lab/EAs/RSIMidPointHijackBTCUSD/main.mq5 b/frontline/units_economic_calendar/RSIMidPointHijackXAUUSD/main.mq5 similarity index 98% rename from lab/EAs/RSIMidPointHijackBTCUSD/main.mq5 rename to frontline/units_economic_calendar/RSIMidPointHijackXAUUSD/main.mq5 index 161c0bd..de9ddb3 100644 --- a/lab/EAs/RSIMidPointHijackBTCUSD/main.mq5 +++ b/frontline/units_economic_calendar/RSIMidPointHijackXAUUSD/main.mq5 @@ -14,7 +14,7 @@ // Input Parameters input group "General Settings" input ENUM_TIMEFRAMES InpTimeframe = PERIOD_H1; // Trading Timeframe -input double InpLotSize = 0.02; // Lot Size +input double InpLotSize = 0.1; // Lot Size input int InpMagicNumberRSIFollow = 1001; // Magic Number RSI Follow input int InpMagicNumberRSIReverse = 1002;// Magic Number RSI Reverse input int InpMagicNumberEMACross = 1003; // Magic Number EMA Cross @@ -23,9 +23,9 @@ input group "Strategy Switches" input bool InpEnableRSIFollow = true; // Enable RSI Follow Strategy input bool InpEnableRSIReverse = true; // Enable RSI Reverse Strategy input bool InpEnableEMACross = true; // Enable EMA Cross Strategy -input bool InpEnableStrategyLock = false; // Enable Strategy Lock -input double InpLockProfitThreshold = 0.0; // Lock Profit Threshold (pips) -input bool InpCloseOppositeTrades = false; // Close Opposite Trades When Profiting +input bool InpEnableStrategyLock = true; // Enable Strategy Lock +input double InpLockProfitThreshold = 6.0; // Lock Profit Threshold (pips) +input bool InpCloseOppositeTrades = true; // Close Opposite Trades When Profiting input group "RSI Follow Strategy" input int InpRSIPeriod = 32; // RSI Period diff --git a/frontline/units_economic_calendar/RSIReversalAsianAUDUSD/RSIReversalAsianAUDUSD_Genetic_Optimization.set b/frontline/units_economic_calendar/RSIReversalAsianAUDUSD/RSIReversalAsianAUDUSD_Genetic_Optimization.set new file mode 100644 index 0000000..9fbe5fe --- /dev/null +++ b/frontline/units_economic_calendar/RSIReversalAsianAUDUSD/RSIReversalAsianAUDUSD_Genetic_Optimization.set @@ -0,0 +1,23 @@ +; RSIReversalAsianAUDUSD/main.mq5 — Strategy Tester → Inputs → Load (Genetic optimization) +; Format: Parameter=Current||Start||Step||Stop||Optimize(Y/N) +; Baseline aligned with current input defaults and Desktop 123.set-style ranges (2026.05.13). +; +; Core RSI / exits +RSIPeriod=28||14||2||40||Y +OverboughtLevel=68.0||55.0||1.0||80.0||Y +OversoldLevel=30.0||18.0||1.0||42.0||Y +TakeProfitPips=175||50||25||350||Y +StopLossPips=5||5||5||80||Y +MaxLotSize=0.2||0.01||0.01||0.2||N +MaxSpread=1000||200||100||2000||Y +MaxDuration=340||48||24||720||Y +UseStopLoss=false||false||0||true||N +UseTakeProfit=false||false||0||true||N +UseRSIExit=true||false||0||true||N +RSIExitLevel=48.0||40.0||1.0||55.0||Y +CloseOutsideSession=true||false||0||true||Y +; Panel (usually fixed; colors as in MT5 saved sets) +PanelBackground=0 +PanelText=16777215 +PanelX=10||10||1||100||N +PanelY=20||20||1||200||N diff --git a/frontline/units_economic_calendar/RSIReversalAsianAUDUSD/main.mq5 b/frontline/units_economic_calendar/RSIReversalAsianAUDUSD/main.mq5 new file mode 100644 index 0000000..92c7968 --- /dev/null +++ b/frontline/units_economic_calendar/RSIReversalAsianAUDUSD/main.mq5 @@ -0,0 +1,539 @@ +//+------------------------------------------------------------------+ +//| SimpleRSIReversalAUDUSD.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#property strict + +// Include trade class +#include + +// Input parameters +input int RSIPeriod = 28; // RSI period +input double OverboughtLevel = 68; // Overbought level +input double OversoldLevel = 30; // Oversold level +input int TakeProfitPips = 175; // Take profit in pips +input int StopLossPips = 5; // Stop loss in pips +input double MaxLotSize = 0.2; // Maximum lot size +input int MaxSpread = 1000; // Maximum allowed spread in pips +input int MaxDuration = 340; // Maximum trade duration in hours +input bool UseStopLoss = false; // Use stop loss +input bool UseTakeProfit = false; // Use take profit +input bool UseRSIExit = true; // Use RSI for exit +input double RSIExitLevel = 48; // RSI level to exit (50 = neutral) +input bool CloseOutsideSession = true; // Close trades outside Asian session +input color PanelBackground = clrBlack; // Panel background color +input color PanelText = clrWhite; // Panel text color +input int PanelX = 10; // Panel X position +input int PanelY = 20; // Panel Y position + +// Global variables +CTrade trade; +int rsiHandle; +bool isPositionOpen = false; +double positionOpenPrice = 0; +datetime positionOpenTime = 0; +ENUM_POSITION_TYPE lastPositionType = POSITION_TYPE_BUY; +bool sessionCloseAttempted = false; // Track if we've attempted to close positions for current session + +// RSI crossover variables +double rsiCurrent = 0; +double rsiPrevious = 0; +double rsiPrevious2 = 0; +bool rsiCrossedOverbought = false; +bool rsiCrossedOversold = false; +bool rsiCrossedExitLevel = false; + +// Panel objects +string panelName = "RSIPanel"; +int panelWidth = 200; +int panelHeight = 200; +int labelHeight = 20; +int labelSpacing = 5; + +// Session times (UTC) +const int AsianSessionStart = 0; // 00:00 UTC +const int AsianSessionEnd = 8; // 08:00 UTC + +//+------------------------------------------------------------------+ +//| Create panel | +//+------------------------------------------------------------------+ +void CreatePanel() +{ + // Create panel background + ObjectCreate(0, panelName, OBJ_RECTANGLE_LABEL, 0, 0, 0); + ObjectSetInteger(0, panelName, OBJPROP_XDISTANCE, PanelX); + ObjectSetInteger(0, panelName, OBJPROP_YDISTANCE, PanelY); + ObjectSetInteger(0, panelName, OBJPROP_XSIZE, panelWidth); + ObjectSetInteger(0, panelName, OBJPROP_YSIZE, panelHeight); + ObjectSetInteger(0, panelName, OBJPROP_BGCOLOR, PanelBackground); + ObjectSetInteger(0, panelName, OBJPROP_BORDER_TYPE, BORDER_FLAT); + ObjectSetInteger(0, panelName, OBJPROP_CORNER, CORNER_LEFT_UPPER); + ObjectSetInteger(0, panelName, OBJPROP_COLOR, PanelText); + ObjectSetInteger(0, panelName, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, panelName, OBJPROP_WIDTH, 1); + ObjectSetInteger(0, panelName, OBJPROP_BACK, false); + ObjectSetInteger(0, panelName, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, panelName, OBJPROP_SELECTED, false); + ObjectSetInteger(0, panelName, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, panelName, OBJPROP_ZORDER, 0); + + // Create title label + ObjectCreate(0, panelName + "Title", OBJ_LABEL, 0, 0, 0); + ObjectSetInteger(0, panelName + "Title", OBJPROP_XDISTANCE, PanelX + 5); + ObjectSetInteger(0, panelName + "Title", OBJPROP_YDISTANCE, PanelY + 5); + ObjectSetInteger(0, panelName + "Title", OBJPROP_CORNER, CORNER_LEFT_UPPER); + ObjectSetString(0, panelName + "Title", OBJPROP_TEXT, "RSI Reversal"); + ObjectSetInteger(0, panelName + "Title", OBJPROP_COLOR, PanelText); + ObjectSetInteger(0, panelName + "Title", OBJPROP_FONTSIZE, 10); + + // Create score labels + CreateScoreLabel("RSI", "RSI: ", 0); + CreateScoreLabel("Position", "Position: ", 1); + CreateScoreLabel("Spread", "Spread: ", 2); + CreateScoreLabel("Session", "Session: ", 3); + CreateScoreLabel("SL", "Stop Loss: ", 4); + CreateScoreLabel("TP", "Take Profit: ", 5); + CreateScoreLabel("Cross", "Cross: ", 6); +} + +//+------------------------------------------------------------------+ +//| Create score label | +//+------------------------------------------------------------------+ +void CreateScoreLabel(string name, string text, int index) +{ + ObjectCreate(0, panelName + name, OBJ_LABEL, 0, 0, 0); + ObjectSetInteger(0, panelName + name, OBJPROP_XDISTANCE, PanelX + 5); + ObjectSetInteger(0, panelName + name, OBJPROP_YDISTANCE, PanelY + 30 + index * (labelHeight + labelSpacing)); + ObjectSetInteger(0, panelName + name, OBJPROP_CORNER, CORNER_LEFT_UPPER); + ObjectSetString(0, panelName + name, OBJPROP_TEXT, text); + ObjectSetInteger(0, panelName + name, OBJPROP_COLOR, PanelText); + ObjectSetInteger(0, panelName + name, OBJPROP_FONTSIZE, 8); +} + +//+------------------------------------------------------------------+ +//| Update panel values | +//+------------------------------------------------------------------+ +void UpdatePanel(double rsi, string position, int spread, string session, double sl, double tp, string crossInfo) +{ + ObjectSetString(0, panelName + "RSI", OBJPROP_TEXT, "RSI: " + DoubleToString(rsi, 2)); + ObjectSetString(0, panelName + "Position", OBJPROP_TEXT, "Position: " + position); + ObjectSetString(0, panelName + "Spread", OBJPROP_TEXT, "Spread: " + IntegerToString(spread) + " pips"); + ObjectSetString(0, panelName + "Session", OBJPROP_TEXT, "Session: " + session); + ObjectSetString(0, panelName + "SL", OBJPROP_TEXT, "Stop Loss: " + IntegerToString(StopLossPips) + " pips"); + ObjectSetString(0, panelName + "TP", OBJPROP_TEXT, "Take Profit: " + IntegerToString(TakeProfitPips) + " pips"); + ObjectSetString(0, panelName + "Cross", OBJPROP_TEXT, "Cross: " + crossInfo); +} + +//+------------------------------------------------------------------+ +//| Check if current time is in Asian session | +//+------------------------------------------------------------------+ +bool IsAsianSession() +{ + datetime currentTime = TimeCurrent(); + MqlDateTime timeStruct; + TimeToStruct(currentTime, timeStruct); + + return (timeStruct.hour >= AsianSessionStart && timeStruct.hour < AsianSessionEnd); +} + +//+------------------------------------------------------------------+ +//| Get current session name | +//+------------------------------------------------------------------+ +string GetCurrentSession() +{ + datetime currentTime = TimeCurrent(); + MqlDateTime timeStruct; + TimeToStruct(currentTime, timeStruct); + + if(timeStruct.hour >= AsianSessionStart && timeStruct.hour < AsianSessionEnd) + return "Asian"; + else if(timeStruct.hour >= 8 && timeStruct.hour < 16) + return "London"; + else if(timeStruct.hour >= 13 && timeStruct.hour < 21) + return "New York"; + else + return "Other"; +} + +//+------------------------------------------------------------------+ +//| Check if trading is allowed | +//+------------------------------------------------------------------+ +bool IsTradingAllowed() +{ + // Check if market is open + if(!SymbolInfoInteger(_Symbol, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL) + { + return false; + } + + // Check if we have enough money + if(AccountInfoDouble(ACCOUNT_MARGIN_FREE) <= 0) + { + return false; + } + + return true; +} + +//+------------------------------------------------------------------+ +//| Check RSI crossover conditions | +//+------------------------------------------------------------------+ +void CheckRSICrossover() +{ + // Reset crossover flags + rsiCrossedOverbought = false; + rsiCrossedOversold = false; + rsiCrossedExitLevel = false; + + // Check for overbought crossover (RSI crosses above overbought level) + if(rsiPrevious < OverboughtLevel && rsiCurrent >= OverboughtLevel) + { + rsiCrossedOverbought = true; + } + + // Check for oversold crossover (RSI crosses below oversold level) + if(rsiPrevious > OversoldLevel && rsiCurrent <= OversoldLevel) + { + rsiCrossedOversold = true; + } + + // Check for exit level crossover + if(rsiPrevious < RSIExitLevel && rsiCurrent >= RSIExitLevel) + { + rsiCrossedExitLevel = true; + } + else if(rsiPrevious > RSIExitLevel && rsiCurrent <= RSIExitLevel) + { + rsiCrossedExitLevel = true; + } +} + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsiHandle = iRSI(_Symbol, PERIOD_M15, RSIPeriod, PRICE_CLOSE); + + if(rsiHandle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Wait a bit for the indicator to be ready + Sleep(100); + + // Initialize RSI values with retry logic + double rsi[]; + ArraySetAsSeries(rsi, true); + + int retryCount = 0; + bool rsiInitialized = false; + + while(retryCount < 10 && !rsiInitialized) + { + int copied = CopyBuffer(rsiHandle, 0, 0, 3, rsi); + if(copied >= 3) + { + rsiCurrent = rsi[0]; + rsiPrevious = rsi[1]; + rsiPrevious2 = rsi[2]; + rsiInitialized = true; + } + else + { + retryCount++; + Sleep(100); + } + } + + if(!rsiInitialized) + { + // Don't fail initialization, just set default values + rsiCurrent = 50.0; + rsiPrevious = 50.0; + rsiPrevious2 = 50.0; + } + + // Create panel + CreatePanel(); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + // Release indicator handles + IndicatorRelease(rsiHandle); + + // Remove panel objects + ObjectsDeleteAll(0, panelName); +} + +//+------------------------------------------------------------------+ +//| Close all trades for the current symbol | +//+------------------------------------------------------------------+ +bool CloseAllTrades(string reason = "") +{ + bool allClosed = true; + int totalPositions = PositionsTotal(); + + if(totalPositions == 0) + return true; + + // Check if there are any positions with our magic number + bool hasOurPositions = false; + for(int i = 0; i < totalPositions; i++) + { + if(PositionGetSymbol(i) == _Symbol && PositionGetInteger(POSITION_MAGIC) == 123456) + { + hasOurPositions = true; + break; + } + } + + for(int i = totalPositions - 1; i >= 0; i--) + { + if(PositionGetSymbol(i) == _Symbol) + { + // Try to close position with retry logic + int retryCount = 0; + bool positionClosed = false; + + while(retryCount < 3 && !positionClosed) + { + if(trade.PositionClose(_Symbol)) + { + isPositionOpen = false; + positionClosed = true; + } + else + { + int error = GetLastError(); + + // If error is 4756 (Trade disabled), wait longer before retry + if(error == 4756) + { + Sleep(5000); // Wait 5 seconds before retry + retryCount++; + } + else + { + // For other errors, break the loop + break; + } + } + } + + if(!positionClosed) + { + allClosed = false; + } + } + } + + return allClosed; +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // Check if trading is allowed + if(!IsTradingAllowed()) + { + return; + } + + // Check if we're in Asian session + if(!IsAsianSession()) + { + // Close all positions if outside Asian session and CloseOutsideSession is true + if(CloseOutsideSession && !sessionCloseAttempted) + { + CloseAllTrades("Outside Asian session"); + sessionCloseAttempted = true; + } + return; + } + else + { + // Reset the session close attempt flag when we enter Asian session + sessionCloseAttempted = false; + } + + // Get current spread + double spread = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID); + int spreadInPips = (int)(spread / _Point); + + // Check if spread is too high + if(spreadInPips > MaxSpread) + { + return; + } + + // Get RSI values from bar data + double rsi[]; + ArraySetAsSeries(rsi, true); + + int copied = CopyBuffer(rsiHandle, 0, 0, 3, rsi); + if(copied < 3) + { + return; + } + + // Update RSI values + rsiPrevious2 = rsiPrevious; + rsiPrevious = rsiCurrent; + rsiCurrent = rsi[0]; + + // Validate RSI values + if(rsiCurrent == 0 || rsiPrevious == 0) + { + return; + } + + // Check for RSI crossovers + CheckRSICrossover(); + + // Get current prices + double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // Get position status + string positionStatus = "None"; + for(int i = 0; i < PositionsTotal(); i++) + { + if(PositionGetSymbol(i) == _Symbol) + { + ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + positionStatus = (posType == POSITION_TYPE_BUY) ? "Long" : "Short"; + break; + } + } + + // Calculate stop loss and take profit levels + double sl = 0; + double tp = 0; + + // Prepare crossover info for panel + string crossInfo = "None"; + if(rsiCrossedOverbought) crossInfo = "Overbought"; + else if(rsiCrossedOversold) crossInfo = "Oversold"; + else if(rsiCrossedExitLevel) crossInfo = "Exit"; + + // Update panel + UpdatePanel(rsiCurrent, positionStatus, spreadInPips, GetCurrentSession(), sl, tp, crossInfo); + + // Check for open position + bool hasOpenPosition = false; + for(int i = 0; i < PositionsTotal(); i++) + { + if(PositionGetSymbol(i) == _Symbol) + { + hasOpenPosition = true; + + // Get position details + double positionProfit = PositionGetDouble(POSITION_PROFIT); + double positionVolume = PositionGetDouble(POSITION_VOLUME); + double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); + ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + + // Check for RSI exit if enabled + if(UseRSIExit && rsiCrossedExitLevel) + { + bool shouldExit = false; + + // For long positions, exit when RSI crosses above exit level + if(posType == POSITION_TYPE_BUY && rsiCurrent >= RSIExitLevel && rsiPrevious < RSIExitLevel) + { + shouldExit = true; + } + // For short positions, exit when RSI crosses below exit level + else if(posType == POSITION_TYPE_SELL && rsiCurrent <= RSIExitLevel && rsiPrevious > RSIExitLevel) + { + shouldExit = true; + } + + if(shouldExit) + { + CloseAllTrades("RSI Exit Crossover"); + return; + } + } + + // Check for timeout + if(TimeCurrent() - positionOpenTime > MaxDuration * 3600) + { + CloseAllTrades("Timeout"); + return; + } + + break; + } + } + + // If no position is open, look for entry signals based on RSI crossover + if(!hasOpenPosition) + { + // Place buy order if RSI crosses below oversold level (oversold crossover) + if(rsiCrossedOversold) + { + double sl = UseStopLoss ? currentBid - StopLossPips * _Point : 0; + double tp = UseTakeProfit ? currentBid + TakeProfitPips * _Point : 0; + + if(UseStopLoss && sl >= currentBid) + return; + if(UseTakeProfit && tp <= currentBid) + return; + + // Set trade parameters + trade.SetDeviationInPoints(3); + trade.SetTypeFilling(ORDER_FILLING_IOC); + trade.SetExpertMagicNumber(123456); + + // Place buy order using CTrade + if(trade.Buy(MaxLotSize, _Symbol, currentAsk, sl, tp, "RSI Oversold Crossover Buy")) + { + isPositionOpen = true; + positionOpenPrice = currentAsk; + positionOpenTime = TimeCurrent(); + lastPositionType = POSITION_TYPE_BUY; + } + } + // Place sell order if RSI crosses above overbought level (overbought crossover) + else if(rsiCrossedOverbought) + { + double sl = UseStopLoss ? currentAsk + StopLossPips * _Point : 0; + double tp = UseTakeProfit ? currentAsk - TakeProfitPips * _Point : 0; + + if(UseStopLoss && sl <= currentAsk) + return; + if(UseTakeProfit && tp >= currentAsk) + return; + + // Set trade parameters + trade.SetDeviationInPoints(3); + trade.SetTypeFilling(ORDER_FILLING_IOC); + trade.SetExpertMagicNumber(123456); + + // Place sell order using CTrade + if(trade.Sell(MaxLotSize, _Symbol, currentBid, sl, tp, "RSI Overbought Crossover Sell")) + { + isPositionOpen = true; + positionOpenPrice = currentBid; + positionOpenTime = TimeCurrent(); + lastPositionType = POSITION_TYPE_SELL; + } + } + } +} \ No newline at end of file diff --git a/frontline/units_economic_calendar/RSIReversalAsianEURUSD/main.mq5 b/frontline/units_economic_calendar/RSIReversalAsianEURUSD/main.mq5 new file mode 100644 index 0000000..c89b331 --- /dev/null +++ b/frontline/units_economic_calendar/RSIReversalAsianEURUSD/main.mq5 @@ -0,0 +1,539 @@ +//+------------------------------------------------------------------+ +//| SimpleRSIReversalAUDUSD.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#property strict + +// Include trade class +#include + +// Input parameters +input int RSIPeriod = 28; // RSI period +input double OverboughtLevel = 60; // Overbought level +input double OversoldLevel = 8; // Oversold level +input int TakeProfitPips = 175; // Take profit in pips +input int StopLossPips = 5; // Stop loss in pips +input double MaxLotSize = 0.1; // Maximum lot size +input int MaxSpread = 1000; // Maximum allowed spread in pips +input int MaxDuration = 270; // Maximum trade duration in hours +input bool UseStopLoss = false; // Use stop loss +input bool UseTakeProfit = false; // Use take profit +input bool UseRSIExit = true; // Use RSI for exit +input double RSIExitLevel = 55; // RSI level to exit (50 = neutral) +input bool CloseOutsideSession = false; // Close trades outside Asian session +input color PanelBackground = clrBlack; // Panel background color +input color PanelText = clrWhite; // Panel text color +input int PanelX = 10; // Panel X position +input int PanelY = 20; // Panel Y position + +// Global variables +CTrade trade; +int rsiHandle; +bool isPositionOpen = false; +double positionOpenPrice = 0; +datetime positionOpenTime = 0; +ENUM_POSITION_TYPE lastPositionType = POSITION_TYPE_BUY; +bool sessionCloseAttempted = false; // Track if we've attempted to close positions for current session + +// RSI crossover variables +double rsiCurrent = 0; +double rsiPrevious = 0; +double rsiPrevious2 = 0; +bool rsiCrossedOverbought = false; +bool rsiCrossedOversold = false; +bool rsiCrossedExitLevel = false; + +// Panel objects +string panelName = "RSIPanel"; +int panelWidth = 200; +int panelHeight = 200; +int labelHeight = 20; +int labelSpacing = 5; + +// Session times (UTC) +const int AsianSessionStart = 0; // 00:00 UTC +const int AsianSessionEnd = 8; // 08:00 UTC + +//+------------------------------------------------------------------+ +//| Create panel | +//+------------------------------------------------------------------+ +void CreatePanel() +{ + // Create panel background + ObjectCreate(0, panelName, OBJ_RECTANGLE_LABEL, 0, 0, 0); + ObjectSetInteger(0, panelName, OBJPROP_XDISTANCE, PanelX); + ObjectSetInteger(0, panelName, OBJPROP_YDISTANCE, PanelY); + ObjectSetInteger(0, panelName, OBJPROP_XSIZE, panelWidth); + ObjectSetInteger(0, panelName, OBJPROP_YSIZE, panelHeight); + ObjectSetInteger(0, panelName, OBJPROP_BGCOLOR, PanelBackground); + ObjectSetInteger(0, panelName, OBJPROP_BORDER_TYPE, BORDER_FLAT); + ObjectSetInteger(0, panelName, OBJPROP_CORNER, CORNER_LEFT_UPPER); + ObjectSetInteger(0, panelName, OBJPROP_COLOR, PanelText); + ObjectSetInteger(0, panelName, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, panelName, OBJPROP_WIDTH, 1); + ObjectSetInteger(0, panelName, OBJPROP_BACK, false); + ObjectSetInteger(0, panelName, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, panelName, OBJPROP_SELECTED, false); + ObjectSetInteger(0, panelName, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, panelName, OBJPROP_ZORDER, 0); + + // Create title label + ObjectCreate(0, panelName + "Title", OBJ_LABEL, 0, 0, 0); + ObjectSetInteger(0, panelName + "Title", OBJPROP_XDISTANCE, PanelX + 5); + ObjectSetInteger(0, panelName + "Title", OBJPROP_YDISTANCE, PanelY + 5); + ObjectSetInteger(0, panelName + "Title", OBJPROP_CORNER, CORNER_LEFT_UPPER); + ObjectSetString(0, panelName + "Title", OBJPROP_TEXT, "RSI Reversal"); + ObjectSetInteger(0, panelName + "Title", OBJPROP_COLOR, PanelText); + ObjectSetInteger(0, panelName + "Title", OBJPROP_FONTSIZE, 10); + + // Create score labels + CreateScoreLabel("RSI", "RSI: ", 0); + CreateScoreLabel("Position", "Position: ", 1); + CreateScoreLabel("Spread", "Spread: ", 2); + CreateScoreLabel("Session", "Session: ", 3); + CreateScoreLabel("SL", "Stop Loss: ", 4); + CreateScoreLabel("TP", "Take Profit: ", 5); + CreateScoreLabel("Cross", "Cross: ", 6); +} + +//+------------------------------------------------------------------+ +//| Create score label | +//+------------------------------------------------------------------+ +void CreateScoreLabel(string name, string text, int index) +{ + ObjectCreate(0, panelName + name, OBJ_LABEL, 0, 0, 0); + ObjectSetInteger(0, panelName + name, OBJPROP_XDISTANCE, PanelX + 5); + ObjectSetInteger(0, panelName + name, OBJPROP_YDISTANCE, PanelY + 30 + index * (labelHeight + labelSpacing)); + ObjectSetInteger(0, panelName + name, OBJPROP_CORNER, CORNER_LEFT_UPPER); + ObjectSetString(0, panelName + name, OBJPROP_TEXT, text); + ObjectSetInteger(0, panelName + name, OBJPROP_COLOR, PanelText); + ObjectSetInteger(0, panelName + name, OBJPROP_FONTSIZE, 8); +} + +//+------------------------------------------------------------------+ +//| Update panel values | +//+------------------------------------------------------------------+ +void UpdatePanel(double rsi, string position, int spread, string session, double sl, double tp, string crossInfo) +{ + ObjectSetString(0, panelName + "RSI", OBJPROP_TEXT, "RSI: " + DoubleToString(rsi, 2)); + ObjectSetString(0, panelName + "Position", OBJPROP_TEXT, "Position: " + position); + ObjectSetString(0, panelName + "Spread", OBJPROP_TEXT, "Spread: " + IntegerToString(spread) + " pips"); + ObjectSetString(0, panelName + "Session", OBJPROP_TEXT, "Session: " + session); + ObjectSetString(0, panelName + "SL", OBJPROP_TEXT, "Stop Loss: " + IntegerToString(StopLossPips) + " pips"); + ObjectSetString(0, panelName + "TP", OBJPROP_TEXT, "Take Profit: " + IntegerToString(TakeProfitPips) + " pips"); + ObjectSetString(0, panelName + "Cross", OBJPROP_TEXT, "Cross: " + crossInfo); +} + +//+------------------------------------------------------------------+ +//| Check if current time is in Asian session | +//+------------------------------------------------------------------+ +bool IsAsianSession() +{ + datetime currentTime = TimeCurrent(); + MqlDateTime timeStruct; + TimeToStruct(currentTime, timeStruct); + + return (timeStruct.hour >= AsianSessionStart && timeStruct.hour < AsianSessionEnd); +} + +//+------------------------------------------------------------------+ +//| Get current session name | +//+------------------------------------------------------------------+ +string GetCurrentSession() +{ + datetime currentTime = TimeCurrent(); + MqlDateTime timeStruct; + TimeToStruct(currentTime, timeStruct); + + if(timeStruct.hour >= AsianSessionStart && timeStruct.hour < AsianSessionEnd) + return "Asian"; + else if(timeStruct.hour >= 8 && timeStruct.hour < 16) + return "London"; + else if(timeStruct.hour >= 13 && timeStruct.hour < 21) + return "New York"; + else + return "Other"; +} + +//+------------------------------------------------------------------+ +//| Check if trading is allowed | +//+------------------------------------------------------------------+ +bool IsTradingAllowed() +{ + // Check if market is open + if(!SymbolInfoInteger(_Symbol, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL) + { + return false; + } + + // Check if we have enough money + if(AccountInfoDouble(ACCOUNT_MARGIN_FREE) <= 0) + { + return false; + } + + return true; +} + +//+------------------------------------------------------------------+ +//| Check RSI crossover conditions | +//+------------------------------------------------------------------+ +void CheckRSICrossover() +{ + // Reset crossover flags + rsiCrossedOverbought = false; + rsiCrossedOversold = false; + rsiCrossedExitLevel = false; + + // Check for overbought crossover (RSI crosses above overbought level) + if(rsiPrevious < OverboughtLevel && rsiCurrent >= OverboughtLevel) + { + rsiCrossedOverbought = true; + } + + // Check for oversold crossover (RSI crosses below oversold level) + if(rsiPrevious > OversoldLevel && rsiCurrent <= OversoldLevel) + { + rsiCrossedOversold = true; + } + + // Check for exit level crossover + if(rsiPrevious < RSIExitLevel && rsiCurrent >= RSIExitLevel) + { + rsiCrossedExitLevel = true; + } + else if(rsiPrevious > RSIExitLevel && rsiCurrent <= RSIExitLevel) + { + rsiCrossedExitLevel = true; + } +} + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsiHandle = iRSI(_Symbol, PERIOD_M15, RSIPeriod, PRICE_CLOSE); + + if(rsiHandle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Wait a bit for the indicator to be ready + Sleep(100); + + // Initialize RSI values with retry logic + double rsi[]; + ArraySetAsSeries(rsi, true); + + int retryCount = 0; + bool rsiInitialized = false; + + while(retryCount < 10 && !rsiInitialized) + { + int copied = CopyBuffer(rsiHandle, 0, 0, 3, rsi); + if(copied >= 3) + { + rsiCurrent = rsi[0]; + rsiPrevious = rsi[1]; + rsiPrevious2 = rsi[2]; + rsiInitialized = true; + } + else + { + retryCount++; + Sleep(100); + } + } + + if(!rsiInitialized) + { + // Don't fail initialization, just set default values + rsiCurrent = 50.0; + rsiPrevious = 50.0; + rsiPrevious2 = 50.0; + } + + // Create panel + CreatePanel(); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + // Release indicator handles + IndicatorRelease(rsiHandle); + + // Remove panel objects + ObjectsDeleteAll(0, panelName); +} + +//+------------------------------------------------------------------+ +//| Close all trades for the current symbol | +//+------------------------------------------------------------------+ +bool CloseAllTrades(string reason = "") +{ + bool allClosed = true; + int totalPositions = PositionsTotal(); + + if(totalPositions == 0) + return true; + + // Check if there are any positions with our magic number + bool hasOurPositions = false; + for(int i = 0; i < totalPositions; i++) + { + if(PositionGetSymbol(i) == _Symbol && PositionGetInteger(POSITION_MAGIC) == 123456) + { + hasOurPositions = true; + break; + } + } + + for(int i = totalPositions - 1; i >= 0; i--) + { + if(PositionGetSymbol(i) == _Symbol) + { + // Try to close position with retry logic + int retryCount = 0; + bool positionClosed = false; + + while(retryCount < 3 && !positionClosed) + { + if(trade.PositionClose(_Symbol)) + { + isPositionOpen = false; + positionClosed = true; + } + else + { + int error = GetLastError(); + + // If error is 4756 (Trade disabled), wait longer before retry + if(error == 4756) + { + Sleep(5000); // Wait 5 seconds before retry + retryCount++; + } + else + { + // For other errors, break the loop + break; + } + } + } + + if(!positionClosed) + { + allClosed = false; + } + } + } + + return allClosed; +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // Check if trading is allowed + if(!IsTradingAllowed()) + { + return; + } + + // Check if we're in Asian session + if(!IsAsianSession()) + { + // Close all positions if outside Asian session and CloseOutsideSession is true + if(CloseOutsideSession && !sessionCloseAttempted) + { + CloseAllTrades("Outside Asian session"); + sessionCloseAttempted = true; + } + return; + } + else + { + // Reset the session close attempt flag when we enter Asian session + sessionCloseAttempted = false; + } + + // Get current spread + double spread = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID); + int spreadInPips = (int)(spread / _Point); + + // Check if spread is too high + if(spreadInPips > MaxSpread) + { + return; + } + + // Get RSI values from bar data + double rsi[]; + ArraySetAsSeries(rsi, true); + + int copied = CopyBuffer(rsiHandle, 0, 0, 3, rsi); + if(copied < 3) + { + return; + } + + // Update RSI values + rsiPrevious2 = rsiPrevious; + rsiPrevious = rsiCurrent; + rsiCurrent = rsi[0]; + + // Validate RSI values + if(rsiCurrent == 0 || rsiPrevious == 0) + { + return; + } + + // Check for RSI crossovers + CheckRSICrossover(); + + // Get current prices + double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // Get position status + string positionStatus = "None"; + for(int i = 0; i < PositionsTotal(); i++) + { + if(PositionGetSymbol(i) == _Symbol) + { + ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + positionStatus = (posType == POSITION_TYPE_BUY) ? "Long" : "Short"; + break; + } + } + + // Calculate stop loss and take profit levels + double sl = 0; + double tp = 0; + + // Prepare crossover info for panel + string crossInfo = "None"; + if(rsiCrossedOverbought) crossInfo = "Overbought"; + else if(rsiCrossedOversold) crossInfo = "Oversold"; + else if(rsiCrossedExitLevel) crossInfo = "Exit"; + + // Update panel + UpdatePanel(rsiCurrent, positionStatus, spreadInPips, GetCurrentSession(), sl, tp, crossInfo); + + // Check for open position + bool hasOpenPosition = false; + for(int i = 0; i < PositionsTotal(); i++) + { + if(PositionGetSymbol(i) == _Symbol) + { + hasOpenPosition = true; + + // Get position details + double positionProfit = PositionGetDouble(POSITION_PROFIT); + double positionVolume = PositionGetDouble(POSITION_VOLUME); + double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); + ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + + // Check for RSI exit if enabled + if(UseRSIExit && rsiCrossedExitLevel) + { + bool shouldExit = false; + + // For long positions, exit when RSI crosses above exit level + if(posType == POSITION_TYPE_BUY && rsiCurrent >= RSIExitLevel && rsiPrevious < RSIExitLevel) + { + shouldExit = true; + } + // For short positions, exit when RSI crosses below exit level + else if(posType == POSITION_TYPE_SELL && rsiCurrent <= RSIExitLevel && rsiPrevious > RSIExitLevel) + { + shouldExit = true; + } + + if(shouldExit) + { + CloseAllTrades("RSI Exit Crossover"); + return; + } + } + + // Check for timeout + if(TimeCurrent() - positionOpenTime > MaxDuration * 3600) + { + CloseAllTrades("Timeout"); + return; + } + + break; + } + } + + // If no position is open, look for entry signals based on RSI crossover + if(!hasOpenPosition) + { + // Place buy order if RSI crosses below oversold level (oversold crossover) + if(rsiCrossedOversold) + { + double sl = UseStopLoss ? currentBid - StopLossPips * _Point : 0; + double tp = UseTakeProfit ? currentBid + TakeProfitPips * _Point : 0; + + if(UseStopLoss && sl >= currentBid) + return; + if(UseTakeProfit && tp <= currentBid) + return; + + // Set trade parameters + trade.SetDeviationInPoints(3); + trade.SetTypeFilling(ORDER_FILLING_IOC); + trade.SetExpertMagicNumber(123456); + + // Place buy order using CTrade + if(trade.Buy(MaxLotSize, _Symbol, currentAsk, sl, tp, "RSI Oversold Crossover Buy")) + { + isPositionOpen = true; + positionOpenPrice = currentAsk; + positionOpenTime = TimeCurrent(); + lastPositionType = POSITION_TYPE_BUY; + } + } + // Place sell order if RSI crosses above overbought level (overbought crossover) + else if(rsiCrossedOverbought) + { + double sl = UseStopLoss ? currentAsk + StopLossPips * _Point : 0; + double tp = UseTakeProfit ? currentAsk - TakeProfitPips * _Point : 0; + + if(UseStopLoss && sl <= currentAsk) + return; + if(UseTakeProfit && tp >= currentAsk) + return; + + // Set trade parameters + trade.SetDeviationInPoints(3); + trade.SetTypeFilling(ORDER_FILLING_IOC); + trade.SetExpertMagicNumber(123456); + + // Place sell order using CTrade + if(trade.Sell(MaxLotSize, _Symbol, currentBid, sl, tp, "RSI Overbought Crossover Sell")) + { + isPositionOpen = true; + positionOpenPrice = currentBid; + positionOpenTime = TimeCurrent(); + lastPositionType = POSITION_TYPE_SELL; + } + } + } +} \ No newline at end of file diff --git a/frontline/units_economic_calendar/RSIReversalAsianGBPUSD/RSIReversalAsianAUDUSD_Genetic_Optimization.set b/frontline/units_economic_calendar/RSIReversalAsianGBPUSD/RSIReversalAsianAUDUSD_Genetic_Optimization.set new file mode 100644 index 0000000..9fbe5fe --- /dev/null +++ b/frontline/units_economic_calendar/RSIReversalAsianGBPUSD/RSIReversalAsianAUDUSD_Genetic_Optimization.set @@ -0,0 +1,23 @@ +; RSIReversalAsianAUDUSD/main.mq5 — Strategy Tester → Inputs → Load (Genetic optimization) +; Format: Parameter=Current||Start||Step||Stop||Optimize(Y/N) +; Baseline aligned with current input defaults and Desktop 123.set-style ranges (2026.05.13). +; +; Core RSI / exits +RSIPeriod=28||14||2||40||Y +OverboughtLevel=68.0||55.0||1.0||80.0||Y +OversoldLevel=30.0||18.0||1.0||42.0||Y +TakeProfitPips=175||50||25||350||Y +StopLossPips=5||5||5||80||Y +MaxLotSize=0.2||0.01||0.01||0.2||N +MaxSpread=1000||200||100||2000||Y +MaxDuration=340||48||24||720||Y +UseStopLoss=false||false||0||true||N +UseTakeProfit=false||false||0||true||N +UseRSIExit=true||false||0||true||N +RSIExitLevel=48.0||40.0||1.0||55.0||Y +CloseOutsideSession=true||false||0||true||Y +; Panel (usually fixed; colors as in MT5 saved sets) +PanelBackground=0 +PanelText=16777215 +PanelX=10||10||1||100||N +PanelY=20||20||1||200||N diff --git a/frontline/units_economic_calendar/RSIReversalAsianGBPUSD/main.mq5 b/frontline/units_economic_calendar/RSIReversalAsianGBPUSD/main.mq5 new file mode 100644 index 0000000..6ac07bd --- /dev/null +++ b/frontline/units_economic_calendar/RSIReversalAsianGBPUSD/main.mq5 @@ -0,0 +1,539 @@ +//+------------------------------------------------------------------+ +//| RSIReversalAsianGBPUSD.mq5 | +//| Copyright 2024, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2024, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#property strict + +// Include trade class +#include + +// Input parameters (defaults synced from working 123.set 2026.05.13) +input int RSIPeriod = 32; // RSI period +input double OverboughtLevel = 80; // Overbought level +input double OversoldLevel = 37; // Oversold level +input int TakeProfitPips = 225; // Take profit in pips +input int StopLossPips = 45; // Stop loss in pips +input double MaxLotSize = 0.2; // Maximum lot size +input int MaxSpread = 1800; // Maximum allowed spread in pips +input int MaxDuration = 480; // Maximum trade duration in hours +input bool UseStopLoss = false; // Use stop loss +input bool UseTakeProfit = false; // Use take profit +input bool UseRSIExit = true; // Use RSI for exit +input double RSIExitLevel = 43; // RSI level to exit (50 = neutral) +input bool CloseOutsideSession = true; // Close trades outside Asian session +input color PanelBackground = clrBlack; // Panel background color +input color PanelText = clrWhite; // Panel text color +input int PanelX = 10; // Panel X position +input int PanelY = 20; // Panel Y position + +// Global variables +CTrade trade; +int rsiHandle; +bool isPositionOpen = false; +double positionOpenPrice = 0; +datetime positionOpenTime = 0; +ENUM_POSITION_TYPE lastPositionType = POSITION_TYPE_BUY; +bool sessionCloseAttempted = false; // Track if we've attempted to close positions for current session + +// RSI crossover variables +double rsiCurrent = 0; +double rsiPrevious = 0; +double rsiPrevious2 = 0; +bool rsiCrossedOverbought = false; +bool rsiCrossedOversold = false; +bool rsiCrossedExitLevel = false; + +// Panel objects +string panelName = "RSIPanel"; +int panelWidth = 200; +int panelHeight = 200; +int labelHeight = 20; +int labelSpacing = 5; + +// Session times (UTC) +const int AsianSessionStart = 0; // 00:00 UTC +const int AsianSessionEnd = 8; // 08:00 UTC + +//+------------------------------------------------------------------+ +//| Create panel | +//+------------------------------------------------------------------+ +void CreatePanel() +{ + // Create panel background + ObjectCreate(0, panelName, OBJ_RECTANGLE_LABEL, 0, 0, 0); + ObjectSetInteger(0, panelName, OBJPROP_XDISTANCE, PanelX); + ObjectSetInteger(0, panelName, OBJPROP_YDISTANCE, PanelY); + ObjectSetInteger(0, panelName, OBJPROP_XSIZE, panelWidth); + ObjectSetInteger(0, panelName, OBJPROP_YSIZE, panelHeight); + ObjectSetInteger(0, panelName, OBJPROP_BGCOLOR, PanelBackground); + ObjectSetInteger(0, panelName, OBJPROP_BORDER_TYPE, BORDER_FLAT); + ObjectSetInteger(0, panelName, OBJPROP_CORNER, CORNER_LEFT_UPPER); + ObjectSetInteger(0, panelName, OBJPROP_COLOR, PanelText); + ObjectSetInteger(0, panelName, OBJPROP_STYLE, STYLE_SOLID); + ObjectSetInteger(0, panelName, OBJPROP_WIDTH, 1); + ObjectSetInteger(0, panelName, OBJPROP_BACK, false); + ObjectSetInteger(0, panelName, OBJPROP_SELECTABLE, false); + ObjectSetInteger(0, panelName, OBJPROP_SELECTED, false); + ObjectSetInteger(0, panelName, OBJPROP_HIDDEN, true); + ObjectSetInteger(0, panelName, OBJPROP_ZORDER, 0); + + // Create title label + ObjectCreate(0, panelName + "Title", OBJ_LABEL, 0, 0, 0); + ObjectSetInteger(0, panelName + "Title", OBJPROP_XDISTANCE, PanelX + 5); + ObjectSetInteger(0, panelName + "Title", OBJPROP_YDISTANCE, PanelY + 5); + ObjectSetInteger(0, panelName + "Title", OBJPROP_CORNER, CORNER_LEFT_UPPER); + ObjectSetString(0, panelName + "Title", OBJPROP_TEXT, "RSI Reversal"); + ObjectSetInteger(0, panelName + "Title", OBJPROP_COLOR, PanelText); + ObjectSetInteger(0, panelName + "Title", OBJPROP_FONTSIZE, 10); + + // Create score labels + CreateScoreLabel("RSI", "RSI: ", 0); + CreateScoreLabel("Position", "Position: ", 1); + CreateScoreLabel("Spread", "Spread: ", 2); + CreateScoreLabel("Session", "Session: ", 3); + CreateScoreLabel("SL", "Stop Loss: ", 4); + CreateScoreLabel("TP", "Take Profit: ", 5); + CreateScoreLabel("Cross", "Cross: ", 6); +} + +//+------------------------------------------------------------------+ +//| Create score label | +//+------------------------------------------------------------------+ +void CreateScoreLabel(string name, string text, int index) +{ + ObjectCreate(0, panelName + name, OBJ_LABEL, 0, 0, 0); + ObjectSetInteger(0, panelName + name, OBJPROP_XDISTANCE, PanelX + 5); + ObjectSetInteger(0, panelName + name, OBJPROP_YDISTANCE, PanelY + 30 + index * (labelHeight + labelSpacing)); + ObjectSetInteger(0, panelName + name, OBJPROP_CORNER, CORNER_LEFT_UPPER); + ObjectSetString(0, panelName + name, OBJPROP_TEXT, text); + ObjectSetInteger(0, panelName + name, OBJPROP_COLOR, PanelText); + ObjectSetInteger(0, panelName + name, OBJPROP_FONTSIZE, 8); +} + +//+------------------------------------------------------------------+ +//| Update panel values | +//+------------------------------------------------------------------+ +void UpdatePanel(double rsi, string position, int spread, string session, double sl, double tp, string crossInfo) +{ + ObjectSetString(0, panelName + "RSI", OBJPROP_TEXT, "RSI: " + DoubleToString(rsi, 2)); + ObjectSetString(0, panelName + "Position", OBJPROP_TEXT, "Position: " + position); + ObjectSetString(0, panelName + "Spread", OBJPROP_TEXT, "Spread: " + IntegerToString(spread) + " pips"); + ObjectSetString(0, panelName + "Session", OBJPROP_TEXT, "Session: " + session); + ObjectSetString(0, panelName + "SL", OBJPROP_TEXT, "Stop Loss: " + IntegerToString(StopLossPips) + " pips"); + ObjectSetString(0, panelName + "TP", OBJPROP_TEXT, "Take Profit: " + IntegerToString(TakeProfitPips) + " pips"); + ObjectSetString(0, panelName + "Cross", OBJPROP_TEXT, "Cross: " + crossInfo); +} + +//+------------------------------------------------------------------+ +//| Check if current time is in Asian session | +//+------------------------------------------------------------------+ +bool IsAsianSession() +{ + datetime currentTime = TimeCurrent(); + MqlDateTime timeStruct; + TimeToStruct(currentTime, timeStruct); + + return (timeStruct.hour >= AsianSessionStart && timeStruct.hour < AsianSessionEnd); +} + +//+------------------------------------------------------------------+ +//| Get current session name | +//+------------------------------------------------------------------+ +string GetCurrentSession() +{ + datetime currentTime = TimeCurrent(); + MqlDateTime timeStruct; + TimeToStruct(currentTime, timeStruct); + + if(timeStruct.hour >= AsianSessionStart && timeStruct.hour < AsianSessionEnd) + return "Asian"; + else if(timeStruct.hour >= 8 && timeStruct.hour < 16) + return "London"; + else if(timeStruct.hour >= 13 && timeStruct.hour < 21) + return "New York"; + else + return "Other"; +} + +//+------------------------------------------------------------------+ +//| Check if trading is allowed | +//+------------------------------------------------------------------+ +bool IsTradingAllowed() +{ + // Check if market is open + if(!SymbolInfoInteger(_Symbol, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_FULL) + { + return false; + } + + // Check if we have enough money + if(AccountInfoDouble(ACCOUNT_MARGIN_FREE) <= 0) + { + return false; + } + + return true; +} + +//+------------------------------------------------------------------+ +//| Check RSI crossover conditions | +//+------------------------------------------------------------------+ +void CheckRSICrossover() +{ + // Reset crossover flags + rsiCrossedOverbought = false; + rsiCrossedOversold = false; + rsiCrossedExitLevel = false; + + // Check for overbought crossover (RSI crosses above overbought level) + if(rsiPrevious < OverboughtLevel && rsiCurrent >= OverboughtLevel) + { + rsiCrossedOverbought = true; + } + + // Check for oversold crossover (RSI crosses below oversold level) + if(rsiPrevious > OversoldLevel && rsiCurrent <= OversoldLevel) + { + rsiCrossedOversold = true; + } + + // Check for exit level crossover + if(rsiPrevious < RSIExitLevel && rsiCurrent >= RSIExitLevel) + { + rsiCrossedExitLevel = true; + } + else if(rsiPrevious > RSIExitLevel && rsiCurrent <= RSIExitLevel) + { + rsiCrossedExitLevel = true; + } +} + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsiHandle = iRSI(_Symbol, PERIOD_M15, RSIPeriod, PRICE_CLOSE); + + if(rsiHandle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Wait a bit for the indicator to be ready + Sleep(100); + + // Initialize RSI values with retry logic + double rsi[]; + ArraySetAsSeries(rsi, true); + + int retryCount = 0; + bool rsiInitialized = false; + + while(retryCount < 10 && !rsiInitialized) + { + int copied = CopyBuffer(rsiHandle, 0, 0, 3, rsi); + if(copied >= 3) + { + rsiCurrent = rsi[0]; + rsiPrevious = rsi[1]; + rsiPrevious2 = rsi[2]; + rsiInitialized = true; + } + else + { + retryCount++; + Sleep(100); + } + } + + if(!rsiInitialized) + { + // Don't fail initialization, just set default values + rsiCurrent = 50.0; + rsiPrevious = 50.0; + rsiPrevious2 = 50.0; + } + + // Create panel + CreatePanel(); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + // Release indicator handles + IndicatorRelease(rsiHandle); + + // Remove panel objects + ObjectsDeleteAll(0, panelName); +} + +//+------------------------------------------------------------------+ +//| Close all trades for the current symbol | +//+------------------------------------------------------------------+ +bool CloseAllTrades(string reason = "") +{ + bool allClosed = true; + int totalPositions = PositionsTotal(); + + if(totalPositions == 0) + return true; + + // Check if there are any positions with our magic number + bool hasOurPositions = false; + for(int i = 0; i < totalPositions; i++) + { + if(PositionGetSymbol(i) == _Symbol && PositionGetInteger(POSITION_MAGIC) == 123456) + { + hasOurPositions = true; + break; + } + } + + for(int i = totalPositions - 1; i >= 0; i--) + { + if(PositionGetSymbol(i) == _Symbol) + { + // Try to close position with retry logic + int retryCount = 0; + bool positionClosed = false; + + while(retryCount < 3 && !positionClosed) + { + if(trade.PositionClose(_Symbol)) + { + isPositionOpen = false; + positionClosed = true; + } + else + { + int error = GetLastError(); + + // If error is 4756 (Trade disabled), wait longer before retry + if(error == 4756) + { + Sleep(5000); // Wait 5 seconds before retry + retryCount++; + } + else + { + // For other errors, break the loop + break; + } + } + } + + if(!positionClosed) + { + allClosed = false; + } + } + } + + return allClosed; +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // Check if trading is allowed + if(!IsTradingAllowed()) + { + return; + } + + // Check if we're in Asian session + if(!IsAsianSession()) + { + // Close all positions if outside Asian session and CloseOutsideSession is true + if(CloseOutsideSession && !sessionCloseAttempted) + { + CloseAllTrades("Outside Asian session"); + sessionCloseAttempted = true; + } + return; + } + else + { + // Reset the session close attempt flag when we enter Asian session + sessionCloseAttempted = false; + } + + // Get current spread + double spread = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID); + int spreadInPips = (int)(spread / _Point); + + // Check if spread is too high + if(spreadInPips > MaxSpread) + { + return; + } + + // Get RSI values from bar data + double rsi[]; + ArraySetAsSeries(rsi, true); + + int copied = CopyBuffer(rsiHandle, 0, 0, 3, rsi); + if(copied < 3) + { + return; + } + + // Update RSI values + rsiPrevious2 = rsiPrevious; + rsiPrevious = rsiCurrent; + rsiCurrent = rsi[0]; + + // Validate RSI values + if(rsiCurrent == 0 || rsiPrevious == 0) + { + return; + } + + // Check for RSI crossovers + CheckRSICrossover(); + + // Get current prices + double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + // Get position status + string positionStatus = "None"; + for(int i = 0; i < PositionsTotal(); i++) + { + if(PositionGetSymbol(i) == _Symbol) + { + ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + positionStatus = (posType == POSITION_TYPE_BUY) ? "Long" : "Short"; + break; + } + } + + // Calculate stop loss and take profit levels + double sl = 0; + double tp = 0; + + // Prepare crossover info for panel + string crossInfo = "None"; + if(rsiCrossedOverbought) crossInfo = "Overbought"; + else if(rsiCrossedOversold) crossInfo = "Oversold"; + else if(rsiCrossedExitLevel) crossInfo = "Exit"; + + // Update panel + UpdatePanel(rsiCurrent, positionStatus, spreadInPips, GetCurrentSession(), sl, tp, crossInfo); + + // Check for open position + bool hasOpenPosition = false; + for(int i = 0; i < PositionsTotal(); i++) + { + if(PositionGetSymbol(i) == _Symbol) + { + hasOpenPosition = true; + + // Get position details + double positionProfit = PositionGetDouble(POSITION_PROFIT); + double positionVolume = PositionGetDouble(POSITION_VOLUME); + double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); + ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + + // Check for RSI exit if enabled + if(UseRSIExit && rsiCrossedExitLevel) + { + bool shouldExit = false; + + // For long positions, exit when RSI crosses above exit level + if(posType == POSITION_TYPE_BUY && rsiCurrent >= RSIExitLevel && rsiPrevious < RSIExitLevel) + { + shouldExit = true; + } + // For short positions, exit when RSI crosses below exit level + else if(posType == POSITION_TYPE_SELL && rsiCurrent <= RSIExitLevel && rsiPrevious > RSIExitLevel) + { + shouldExit = true; + } + + if(shouldExit) + { + CloseAllTrades("RSI Exit Crossover"); + return; + } + } + + // Check for timeout + if(TimeCurrent() - positionOpenTime > MaxDuration * 3600) + { + CloseAllTrades("Timeout"); + return; + } + + break; + } + } + + // If no position is open, look for entry signals based on RSI crossover + if(!hasOpenPosition) + { + // Place buy order if RSI crosses below oversold level (oversold crossover) + if(rsiCrossedOversold) + { + double sl = UseStopLoss ? currentBid - StopLossPips * _Point : 0; + double tp = UseTakeProfit ? currentBid + TakeProfitPips * _Point : 0; + + if(UseStopLoss && sl >= currentBid) + return; + if(UseTakeProfit && tp <= currentBid) + return; + + // Set trade parameters + trade.SetDeviationInPoints(3); + trade.SetTypeFilling(ORDER_FILLING_IOC); + trade.SetExpertMagicNumber(123456); + + // Place buy order using CTrade + if(trade.Buy(MaxLotSize, _Symbol, currentAsk, sl, tp, "RSI Oversold Crossover Buy")) + { + isPositionOpen = true; + positionOpenPrice = currentAsk; + positionOpenTime = TimeCurrent(); + lastPositionType = POSITION_TYPE_BUY; + } + } + // Place sell order if RSI crosses above overbought level (overbought crossover) + else if(rsiCrossedOverbought) + { + double sl = UseStopLoss ? currentAsk + StopLossPips * _Point : 0; + double tp = UseTakeProfit ? currentAsk - TakeProfitPips * _Point : 0; + + if(UseStopLoss && sl <= currentAsk) + return; + if(UseTakeProfit && tp >= currentAsk) + return; + + // Set trade parameters + trade.SetDeviationInPoints(3); + trade.SetTypeFilling(ORDER_FILLING_IOC); + trade.SetExpertMagicNumber(123456); + + // Place sell order using CTrade + if(trade.Sell(MaxLotSize, _Symbol, currentBid, sl, tp, "RSI Overbought Crossover Sell")) + { + isPositionOpen = true; + positionOpenPrice = currentBid; + positionOpenTime = TimeCurrent(); + lastPositionType = POSITION_TYPE_SELL; + } + } + } +} \ No newline at end of file diff --git a/frontline/units_economic_calendar/RSIScalpingAPPL/main.mq5 b/frontline/units_economic_calendar/RSIScalpingAPPL/main.mq5 new file mode 100644 index 0000000..152fa54 --- /dev/null +++ b/frontline/units_economic_calendar/RSIScalpingAPPL/main.mq5 @@ -0,0 +1,327 @@ +//+------------------------------------------------------------------+ +//| RSIScalping.mq5 | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include "../_united/MagicNumberHelpers.mqh" + +//--- Input parameters +input ENUM_TIMEFRAMES TimeFrame = PERIOD_M10; // Timeframe for Analysis +input int RSI_Period = 14; // RSI Period +input ENUM_APPLIED_PRICE RSI_Applied_Price = PRICE_CLOSE; // RSI Applied Price +input double RSI_Overbought = 80; // RSI Overbought Level +input double RSI_Oversold = 78; // RSI Oversold Level +input double RSI_Target_Buy = 94; // RSI Target for Buy Exit +input double RSI_Target_Sell = 44; // RSI Target for Sell Exit +input int BarsToWait = 7; // Bars to wait when RSI goes against position +input double LotSize = 25; // Lot Size +input int MagicNumber = 12345; // Magic Number +input int Slippage = 3; // Slippage in points + +//--- Global variables +CTrade trade; +int rsi_handle; +double rsi_buffer[]; +double rsi_prev, rsi_current, rsi_two_bars_ago; +bool position_open = false; +int position_ticket = 0; +ENUM_POSITION_TYPE current_position_type = POSITION_TYPE_BUY; +datetime last_bar_time = 0; +bool rsi_against_position = false; +int bars_against_count = 0; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsi_handle = iRSI(_Symbol, TimeFrame, RSI_Period, RSI_Applied_Price); + if(rsi_handle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Initialize trade object + trade.SetExpertMagicNumber(MagicNumber); + trade.SetDeviationInPoints(Slippage); + trade.SetTypeFilling(ORDER_FILLING_FOK); + + // Allocate arrays + ArraySetAsSeries(rsi_buffer, true); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + if(rsi_handle != INVALID_HANDLE) + IndicatorRelease(rsi_handle); +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // Check if we have enough bars + if(Bars(_Symbol, TimeFrame) < RSI_Period + 2) + { + return; + } + + // Check if this is a new bar + datetime current_bar_time = iTime(_Symbol, TimeFrame, 0); + if(current_bar_time == last_bar_time) + { + return; // Still the same bar, don't process + } + + last_bar_time = current_bar_time; + + // Update RSI values + if(!UpdateRSI()) + { + return; + } + + // Check for existing position + CheckExistingPosition(); + + // Check for new entry signals - only if no position exists for THIS EA (magic number) on THIS symbol + if(!position_open && !PositionExistsByMagic(_Symbol, MagicNumber)) + { + CheckEntrySignals(); + } +} + +//+------------------------------------------------------------------+ +//| Update RSI values | +//+------------------------------------------------------------------+ +bool UpdateRSI() +{ + if(CopyBuffer(rsi_handle, 0, 0, 3, rsi_buffer) < 3) + { + return false; + } + + rsi_current = rsi_buffer[0]; // Current bar + rsi_prev = rsi_buffer[1]; // Previous bar + rsi_two_bars_ago = rsi_buffer[2]; // Two bars ago + + return true; +} + +//+------------------------------------------------------------------+ +//| Check existing position for exit conditions | +//+------------------------------------------------------------------+ +void CheckExistingPosition() +{ + if(!position_open) + { + return; + } + + // Check if position still exists with correct magic number AND symbol for THIS EA + if(!PositionSelectByTicketSymbolAndMagic(position_ticket, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + return; + } + + // Exit conditions based on RSI target + if(current_position_type == POSITION_TYPE_BUY) + { + // Check if RSI is against the position (below oversold) + if(rsi_current < RSI_Oversold) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit long position when RSI reaches buy target + if(rsi_current >= RSI_Target_Buy) + { + ClosePosition(); + } + } + } + else if(current_position_type == POSITION_TYPE_SELL) + { + // Check if RSI is against the position (above overbought) + if(rsi_current > RSI_Overbought) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit short position when RSI reaches sell target + if(rsi_current <= RSI_Target_Sell) + { + ClosePosition(); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Check for entry signals | +//+------------------------------------------------------------------+ +void CheckEntrySignals() +{ + // Buy signal: RSI crosses from oversold to above oversold (checking the actual crossover) + if(rsi_two_bars_ago <= RSI_Oversold && rsi_prev > RSI_Oversold) + { + OpenBuyPosition(); + } + + // Sell signal: RSI crosses from overbought to below overbought (checking the actual crossover) + if(rsi_two_bars_ago >= RSI_Overbought && rsi_prev < RSI_Overbought) + { + OpenSellPosition(); + } +} + +//+------------------------------------------------------------------+ +//| Open buy position | +//+------------------------------------------------------------------+ +void OpenBuyPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + if(trade.Buy(LotSize, _Symbol, ask, 0, 0, "RSI Scalping Buy")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_BUY; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Open sell position | +//+------------------------------------------------------------------+ +void OpenSellPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + + if(trade.Sell(LotSize, _Symbol, bid, 0, 0, "RSI Scalping Sell")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_SELL; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Close current position | +//+------------------------------------------------------------------+ +void ClosePosition() +{ + // Close position using helper that verifies symbol AND magic number for THIS EA + if(ClosePositionByMagic(trade, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } + else + { + // Position doesn't exist or wrong magic number - reset tracking + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } +} diff --git a/lab/EAs/RSILadderXAUUSD/main.mq5 b/frontline/units_economic_calendar/RSIScalpingBTCUSD/main.mq5 similarity index 62% rename from lab/EAs/RSILadderXAUUSD/main.mq5 rename to frontline/units_economic_calendar/RSIScalpingBTCUSD/main.mq5 index bf8b093..ea69523 100644 --- a/lab/EAs/RSILadderXAUUSD/main.mq5 +++ b/frontline/units_economic_calendar/RSIScalpingBTCUSD/main.mq5 @@ -5,7 +5,7 @@ //+------------------------------------------------------------------+ #property copyright "Copyright 2025, MetaQuotes Ltd." #property link "https://www.mql5.com" -#property version "1.03" +#property version "1.00" #include #include "../_united/MagicNumberHelpers.mqh" @@ -14,25 +14,22 @@ input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1; // Timeframe for Analysis input int RSI_Period = 14; // RSI Period input ENUM_APPLIED_PRICE RSI_Applied_Price = PRICE_CLOSE; // RSI Applied Price -input double RSI_Overbought = 71; // RSI Overbought Level -input double RSI_Oversold = 57; // RSI Oversold Level -input bool UseEntrySlopeFilter = false; // require RSI momentum on entry bars -input double EntryMinSlopePerBar = 1.0; // minimum RSI delta per bar for entry -input double RSI_Target_Buy = 80; // RSI Target for Buy Exit -input double RSI_Target_Sell = 57; // RSI Target for Sell Exit -input int BarsToWait = 4; // Bars to wait when RSI goes against position -input bool ExitOnAdverseRsiBarStep = true; // new bar: exit if last closed RSI vs prior closed is against trade +input double RSI_Overbought = 90; // RSI Overbought Level +input double RSI_Oversold = 73; // RSI Oversold Level +input double RSI_Target_Buy = 88; // RSI Target for Buy Exit +input double RSI_Target_Sell = 48; // RSI Target for Sell Exit +input int BarsToWait = 6; // Bars to wait when RSI goes against position input double LotSize = 0.1; // Lot Size -input int MagicNumber = 129102315; // Magic Number +input int MagicNumber = 123459123; // Magic Number input int Slippage = 3; // Slippage in points input group "=== Reversal escape (intrabar, multi-signal) ===" input bool UseReversalEscape = true; // run while in position every tick input int ReversalATRPeriod = 14; // ATR lookback on signal timeframe -input double ReversalAdverseAtrMult = 5.25; // close if price vs entry >= this * ATR -input int ReversalSignsRequired = 2; // how many independent signs must align -input double ReversalRsiVelocity = 16.0; // RSI points drop (long) / rise (short) vs prior buffer -input double ReversalBodyAtrMult = 5.1; // last closed bar body >= this * ATR counts as one sign +input double ReversalAdverseAtrMult = 5.25; // close if price vs entry >= this * ATR +input int ReversalSignsRequired = 2; // how many independent signs must align +input double ReversalRsiVelocity = 16.0; // RSI points drop (long) / rise (short) vs prior buffer +input double ReversalBodyAtrMult = 5.1; // last closed bar body >= this * ATR counts as one sign //--- Global variables CTrade trade; @@ -46,6 +43,12 @@ datetime last_bar_time = 0; bool rsi_against_position = false; int bars_against_count = 0; +void ResetPositionTracking(); +void SyncTrackedPosition(); +double ATRPriceOnTF(const int period); +int CountReversalEscapeSigns(const ENUM_POSITION_TYPE ptype, const double atr); +void TryReversalEscape(); + //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ @@ -83,32 +86,52 @@ void OnDeinit(const int reason) //+------------------------------------------------------------------+ void OnTick() { + // Check if we have enough bars if(Bars(_Symbol, TimeFrame) < RSI_Period + 2) + { return; + } - const datetime current_bar_time = iTime(_Symbol, TimeFrame, 0); - const bool new_bar = (current_bar_time != last_bar_time); - const bool in_pos = position_open || PositionExistsByMagic(_Symbol, (ulong)MagicNumber); + // Check if this is a new bar + datetime current_bar_time = iTime(_Symbol, TimeFrame, 0); + bool is_new_bar = (current_bar_time != last_bar_time); + bool in_position = position_open || PositionExistsByMagic(_Symbol, MagicNumber); - if(!in_pos && !new_bar) + // While flat, process only on new bars. While in position, allow intrabar reversal escape checks. + if(!in_position && !is_new_bar) + { return; + } + // Update RSI values if(!UpdateRSI()) + { return; + } - if(in_pos && UseReversalEscape) + if(in_position && UseReversalEscape) + { TryReversalEscape(); + } - if(!new_bar) + if(!is_new_bar) + { return; + } last_bar_time = current_bar_time; - ResyncPositionFromMarket(); + // Keep local tracking aligned with actual terminal positions for this symbol/magic. + SyncTrackedPosition(); + + // Check for existing position CheckExistingPosition(); - - if(!position_open && !PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + + // Check for new entry signals - only if no position exists for THIS EA (magic number) on THIS symbol + if(!position_open && !PositionExistsByMagic(_Symbol, MagicNumber)) + { CheckEntrySignals(); + } } //+------------------------------------------------------------------+ @@ -129,16 +152,18 @@ bool UpdateRSI() } //+------------------------------------------------------------------+ -//| Wilder ATR in price units (signal timeframe) | +//| Wilder ATR in price units (signal timeframe) | //+------------------------------------------------------------------+ double ATRPriceOnTF(const int period) { if(period < 1) return 0.0; + MqlRates rates[]; const int need = period + 2; if(CopyRates(_Symbol, TimeFrame, 0, need, rates) < need) return 0.0; + ArraySetAsSeries(rates, true); double sum = 0.0; for(int i = 1; i <= period; i++) @@ -148,11 +173,12 @@ double ATRPriceOnTF(const int period) const double lc = MathAbs(rates[i].low - rates[i + 1].close); sum += MathMax(hl, MathMax(hc, lc)); } + return sum / (double)period; } //+------------------------------------------------------------------+ -//| Independent adverse signs (need ReversalSignsRequired to exit) | +//| Independent adverse signs (need ReversalSignsRequired to exit) | //+------------------------------------------------------------------+ int CountReversalEscapeSigns(const ENUM_POSITION_TYPE ptype, const double atr) { @@ -179,28 +205,31 @@ int CountReversalEscapeSigns(const ENUM_POSITION_TYPE ptype, const double atr) signs++; } else - return 0; - - MqlRates r[]; - if(CopyRates(_Symbol, TimeFrame, 0, 4, r) >= 4) { - ArraySetAsSeries(r, true); - const double body = MathAbs(r[1].close - r[1].open); + return 0; + } + + MqlRates rates[]; + if(CopyRates(_Symbol, TimeFrame, 0, 4, rates) >= 4) + { + ArraySetAsSeries(rates, true); + const double body = MathAbs(rates[1].close - rates[1].open); if(body >= ReversalBodyAtrMult * atr) { - if(ptype == POSITION_TYPE_BUY && r[1].close < r[1].open) + if(ptype == POSITION_TYPE_BUY && rates[1].close < rates[1].open) signs++; - else if(ptype == POSITION_TYPE_SELL && r[1].close > r[1].open) + else if(ptype == POSITION_TYPE_SELL && rates[1].close > rates[1].open) signs++; } + if(ptype == POSITION_TYPE_BUY) { - if(r[1].close < r[2].close && r[2].close < r[3].close) + if(rates[1].close < rates[2].close && rates[2].close < rates[3].close) signs++; } else { - if(r[1].close > r[2].close && r[2].close > r[3].close) + if(rates[1].close > rates[2].close && rates[2].close > rates[3].close) signs++; } } @@ -209,11 +238,14 @@ int CountReversalEscapeSigns(const ENUM_POSITION_TYPE ptype, const double atr) } //+------------------------------------------------------------------+ -//| Cut losers fast on violent reversals (evaluated every tick) | +//| Cut losers fast on violent reversals (evaluated every tick) | //+------------------------------------------------------------------+ void TryReversalEscape() { - if(!PositionSelectByMagic(_Symbol, (ulong)MagicNumber)) + ulong live_ticket = GetPositionTicketByMagic(_Symbol, MagicNumber); + if(live_ticket == 0) + return; + if(!PositionSelectByTicketSymbolAndMagic(live_ticket, _Symbol, MagicNumber)) return; const ENUM_POSITION_TYPE ptype = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); @@ -221,25 +253,51 @@ void TryReversalEscape() if(atr <= 0.0) return; - const int n = CountReversalEscapeSigns(ptype, atr); - if(n < ReversalSignsRequired) + const int signs = CountReversalEscapeSigns(ptype, atr); + if(signs < ReversalSignsRequired) return; ClosePosition(); - Print("RSIScalpingXAUUSD: reversal escape signs=", n, " need=", ReversalSignsRequired, + Print("RSIScalpingBTCUSD: reversal escape signs=", signs, " need=", ReversalSignsRequired, " ATR=", DoubleToString(atr, (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS))); } -void ResyncPositionFromMarket() +//+------------------------------------------------------------------+ +//| Reset local position tracking | +//+------------------------------------------------------------------+ +void ResetPositionTracking() { - if(position_open) + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; +} + +//+------------------------------------------------------------------+ +//| Sync local state with real position in terminal | +//+------------------------------------------------------------------+ +void SyncTrackedPosition() +{ + ulong live_ticket = GetPositionTicketByMagic(_Symbol, MagicNumber); + if(live_ticket == 0) + { + ResetPositionTracking(); return; - ulong t = GetPositionTicketByMagic(_Symbol, (ulong)MagicNumber); - if(t == 0 || !PositionSelectByTicket(t)) + } + + // If we were not tracking (or ticket changed), start tracking the live position. + if(!position_open || position_ticket != (int)live_ticket) + { + if(PositionSelectByTicketSymbolAndMagic(live_ticket, _Symbol, MagicNumber)) + { + position_open = true; + position_ticket = (int)live_ticket; + current_position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + rsi_against_position = false; + bars_against_count = 0; + } return; - position_ticket = (int)t; - position_open = true; - current_position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + } } //+------------------------------------------------------------------+ @@ -252,30 +310,12 @@ void CheckExistingPosition() return; } - // Check if position still exists with correct magic number - if(!PositionSelectByTicketAndMagic(position_ticket, MagicNumber)) + // Check if position still exists with correct magic number AND symbol for THIS EA + if(!PositionSelectByTicketSymbolAndMagic(position_ticket, _Symbol, MagicNumber)) { - position_open = false; - position_ticket = 0; - rsi_against_position = false; - bars_against_count = 0; + ResetPositionTracking(); return; } - - // On each new bar: last completed RSI vs the bar before — exit if that step is adverse to the position - if(ExitOnAdverseRsiBarStep) - { - if(current_position_type == POSITION_TYPE_BUY && rsi_prev < rsi_two_bars_ago) - { - ClosePosition(); - return; - } - if(current_position_type == POSITION_TYPE_SELL && rsi_prev > rsi_two_bars_ago) - { - ClosePosition(); - return; - } - } // Exit conditions based on RSI target if(current_position_type == POSITION_TYPE_BUY) @@ -361,21 +401,14 @@ void CheckExistingPosition() //+------------------------------------------------------------------+ void CheckEntrySignals() { - const double upSlope1 = rsi_prev - rsi_two_bars_ago; // older->prev - const double upSlope2 = rsi_current - rsi_prev; // prev->current - const double dnSlope1 = rsi_two_bars_ago - rsi_prev; // older->prev - const double dnSlope2 = rsi_prev - rsi_current; // prev->current - const bool buySlopeOk = (!UseEntrySlopeFilter) || (upSlope1 >= EntryMinSlopePerBar && upSlope2 >= EntryMinSlopePerBar); - const bool sellSlopeOk = (!UseEntrySlopeFilter) || (dnSlope1 >= EntryMinSlopePerBar && dnSlope2 >= EntryMinSlopePerBar); - // Buy signal: RSI crosses from oversold to above oversold (checking the actual crossover) - if(rsi_two_bars_ago <= RSI_Oversold && rsi_prev > RSI_Oversold && buySlopeOk) + if(rsi_two_bars_ago <= RSI_Oversold && rsi_prev > RSI_Oversold) { OpenBuyPosition(); } // Sell signal: RSI crosses from overbought to below overbought (checking the actual crossover) - if(rsi_two_bars_ago >= RSI_Overbought && rsi_prev < RSI_Overbought && sellSlopeOk) + if(rsi_two_bars_ago >= RSI_Overbought && rsi_prev < RSI_Overbought) { OpenSellPosition(); } @@ -386,13 +419,31 @@ void CheckEntrySignals() //+------------------------------------------------------------------+ void OpenBuyPosition() { + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); if(trade.Buy(LotSize, _Symbol, ask, 0, 0, "RSI Scalping Buy")) { - position_ticket = trade.ResultOrder(); - position_open = true; - current_position_type = POSITION_TYPE_BUY; + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_BUY; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } } } @@ -401,13 +452,31 @@ void OpenBuyPosition() //+------------------------------------------------------------------+ void OpenSellPosition() { + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); if(trade.Sell(LotSize, _Symbol, bid, 0, 0, "RSI Scalping Sell")) { - position_ticket = trade.ResultOrder(); - position_open = true; - current_position_type = POSITION_TYPE_SELL; + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_SELL; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } } } @@ -416,22 +485,24 @@ void OpenSellPosition() //+------------------------------------------------------------------+ void ClosePosition() { - if(ClosePositionByMagic(trade, _Symbol, (ulong)MagicNumber)) + bool position_exists_before_close = PositionExistsByMagic(_Symbol, MagicNumber); + if(!position_exists_before_close) { - position_open = false; - position_ticket = 0; - rsi_against_position = false; - bars_against_count = 0; + ResetPositionTracking(); return; } - if(!PositionExistsByMagic(_Symbol, (ulong)MagicNumber)) + + // Close position using helper that verifies symbol AND magic number for THIS EA + if(ClosePositionByMagic(trade, _Symbol, MagicNumber)) { - position_open = false; - position_ticket = 0; - rsi_against_position = false; - bars_against_count = 0; - return; + ResetPositionTracking(); + } + else + { + // Keep tracking when close fails (e.g. market closed); retry on next bar. + if(!PositionExistsByMagic(_Symbol, MagicNumber)) + { + ResetPositionTracking(); + } } - Print("RSIScalpingXAUUSD: close failed (will retry on next bar). retcode=", - trade.ResultRetcode(), " lastError=", GetLastError()); } diff --git a/frontline/units_economic_calendar/RSIScalpingMU/main.mq5 b/frontline/units_economic_calendar/RSIScalpingMU/main.mq5 new file mode 100644 index 0000000..5c53a5d --- /dev/null +++ b/frontline/units_economic_calendar/RSIScalpingMU/main.mq5 @@ -0,0 +1,327 @@ +//+------------------------------------------------------------------+ +//| RSIScalping.mq5 | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include "../_united/MagicNumberHelpers.mqh" + +//--- Input parameters — synced with Desktop 123.set (2026.05.13) +input ENUM_TIMEFRAMES TimeFrame = PERIOD_M20; // Timeframe for Analysis +input int RSI_Period = 14; // RSI Period +input ENUM_APPLIED_PRICE RSI_Applied_Price = PRICE_CLOSE; // RSI Applied Price +input double RSI_Overbought = 32; // RSI Overbought Level +input double RSI_Oversold = 86; // RSI Oversold Level +input double RSI_Target_Buy = 100; // RSI Target for Buy Exit +input double RSI_Target_Sell = 24; // RSI Target for Sell Exit +input int BarsToWait = 34; // Bars to wait when RSI goes against position +input double LotSize = 5; // Lot Size +input int MagicNumber = 129102315; // Magic Number +input int Slippage = 3; // Slippage in points + +//--- Global variables +CTrade trade; +int rsi_handle; +double rsi_buffer[]; +double rsi_prev, rsi_current, rsi_two_bars_ago; +bool position_open = false; +int position_ticket = 0; +ENUM_POSITION_TYPE current_position_type = POSITION_TYPE_BUY; +datetime last_bar_time = 0; +bool rsi_against_position = false; +int bars_against_count = 0; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsi_handle = iRSI(_Symbol, TimeFrame, RSI_Period, RSI_Applied_Price); + if(rsi_handle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Initialize trade object + trade.SetExpertMagicNumber(MagicNumber); + trade.SetDeviationInPoints(Slippage); + trade.SetTypeFilling(ORDER_FILLING_FOK); + + // Allocate arrays + ArraySetAsSeries(rsi_buffer, true); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + if(rsi_handle != INVALID_HANDLE) + IndicatorRelease(rsi_handle); +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // Check if we have enough bars + if(Bars(_Symbol, TimeFrame) < RSI_Period + 2) + { + return; + } + + // Check if this is a new bar + datetime current_bar_time = iTime(_Symbol, TimeFrame, 0); + if(current_bar_time == last_bar_time) + { + return; // Still the same bar, don't process + } + + last_bar_time = current_bar_time; + + // Update RSI values + if(!UpdateRSI()) + { + return; + } + + // Check for existing position + CheckExistingPosition(); + + // Check for new entry signals - only if no position exists for THIS EA (magic number) on THIS symbol + if(!position_open && !PositionExistsByMagic(_Symbol, MagicNumber)) + { + CheckEntrySignals(); + } +} + +//+------------------------------------------------------------------+ +//| Update RSI values | +//+------------------------------------------------------------------+ +bool UpdateRSI() +{ + if(CopyBuffer(rsi_handle, 0, 0, 3, rsi_buffer) < 3) + { + return false; + } + + rsi_current = rsi_buffer[0]; // Current bar + rsi_prev = rsi_buffer[1]; // Previous bar + rsi_two_bars_ago = rsi_buffer[2]; // Two bars ago + + return true; +} + +//+------------------------------------------------------------------+ +//| Check existing position for exit conditions | +//+------------------------------------------------------------------+ +void CheckExistingPosition() +{ + if(!position_open) + { + return; + } + + // Check if position still exists with correct magic number AND symbol for THIS EA + if(!PositionSelectByTicketSymbolAndMagic(position_ticket, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + return; + } + + // Exit conditions based on RSI target + if(current_position_type == POSITION_TYPE_BUY) + { + // Check if RSI is against the position (below oversold) + if(rsi_current < RSI_Oversold) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit long position when RSI reaches buy target + if(rsi_current >= RSI_Target_Buy) + { + ClosePosition(); + } + } + } + else if(current_position_type == POSITION_TYPE_SELL) + { + // Check if RSI is against the position (above overbought) + if(rsi_current > RSI_Overbought) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit short position when RSI reaches sell target + if(rsi_current <= RSI_Target_Sell) + { + ClosePosition(); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Check for entry signals | +//+------------------------------------------------------------------+ +void CheckEntrySignals() +{ + // Buy signal: RSI crosses from oversold to above oversold (checking the actual crossover) + if(rsi_two_bars_ago <= RSI_Oversold && rsi_prev > RSI_Oversold) + { + OpenBuyPosition(); + } + + // Sell signal: RSI crosses from overbought to below overbought (checking the actual crossover) + if(rsi_two_bars_ago >= RSI_Overbought && rsi_prev < RSI_Overbought) + { + OpenSellPosition(); + } +} + +//+------------------------------------------------------------------+ +//| Open buy position | +//+------------------------------------------------------------------+ +void OpenBuyPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + if(trade.Buy(LotSize, _Symbol, ask, 0, 0, "RSI Scalping Buy")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_BUY; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Open sell position | +//+------------------------------------------------------------------+ +void OpenSellPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + + if(trade.Sell(LotSize, _Symbol, bid, 0, 0, "RSI Scalping Sell")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_SELL; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Close current position | +//+------------------------------------------------------------------+ +void ClosePosition() +{ + // Close position using helper that verifies symbol AND magic number for THIS EA + if(ClosePositionByMagic(trade, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } + else + { + // Position doesn't exist or wrong magic number - reset tracking + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } +} diff --git a/frontline/units_economic_calendar/RSIScalpingMU/optimization.set b/frontline/units_economic_calendar/RSIScalpingMU/optimization.set new file mode 100644 index 0000000..5d564c8 Binary files /dev/null and b/frontline/units_economic_calendar/RSIScalpingMU/optimization.set differ diff --git a/frontline/units_economic_calendar/RSIScalpingNVDA/NVDA_Genetic_Optimization.set b/frontline/units_economic_calendar/RSIScalpingNVDA/NVDA_Genetic_Optimization.set new file mode 100644 index 0000000..81b89e6 --- /dev/null +++ b/frontline/units_economic_calendar/RSIScalpingNVDA/NVDA_Genetic_Optimization.set @@ -0,0 +1,28 @@ +; saved on 2026.02.07 +; Genetic Algorithm Optimization Parameters for RSIScalpingNVDA +; Recommended ranges for profitable parameter discovery +; +; Format: Parameter=Start||Step||Min||Max||Optimize(Y/N) +; +; NOTE: Current values show RSI_Overbought=19 and RSI_Oversold=50 which are unusual. +; This config uses STANDARD RSI ranges (60-85 overbought, 15-40 oversold). +; If your current values are intentional, use the alternative ranges in OPTIMIZATION_GUIDE.md +; +; === PHASE 1: CORE RSI PARAMETERS (Primary Optimization) === +RSI_Period=14||1||7||21||Y +RSI_Overbought=70.0||2.0||60.0||85.0||Y +RSI_Oversold=30.0||2.0||15.0||40.0||Y +RSI_Target_Buy=75.0||2.0||65.0||90.0||Y +RSI_Target_Sell=25.0||2.0||10.0||35.0||Y + +; === PHASE 2: RISK MANAGEMENT (Secondary Optimization) === +BarsToWait=2||1||1||8||Y +TimeFrame=16387||0||16385||16390||Y + +; === PHASE 3: POSITION SIZING (Optimize with caution) === +LotSize=50.0||5.0||10.0||100.0||Y + +; === FIXED PARAMETERS (Do Not Optimize) === +RSI_Applied_Price=1||0||1||1||N +MagicNumber=12345||0||12345||12345||N +Slippage=3||0||3||3||N diff --git a/frontline/units_economic_calendar/RSIScalpingNVDA/NVDA_Genetic_Optimization_Alternative.set b/frontline/units_economic_calendar/RSIScalpingNVDA/NVDA_Genetic_Optimization_Alternative.set new file mode 100644 index 0000000..3fca2be --- /dev/null +++ b/frontline/units_economic_calendar/RSIScalpingNVDA/NVDA_Genetic_Optimization_Alternative.set @@ -0,0 +1,24 @@ +; saved on 2026.02.07 +; Alternative Genetic Algorithm Optimization - Respects Current Unusual RSI Values +; Use this if RSI_Overbought=19 and RSI_Oversold=50 are intentional +; +; Format: Parameter=Start||Step||Min||Max||Optimize(Y/N) +; +; === PHASE 1: CORE RSI PARAMETERS === +RSI_Period=14||1||7||21||Y +RSI_Overbought=19.0||1.0||15.0||30.0||Y +RSI_Oversold=50.0||2.0||40.0||60.0||Y +RSI_Target_Buy=71.0||2.0||65.0||80.0||Y +RSI_Target_Sell=70.0||2.0||60.0||75.0||Y + +; === PHASE 2: RISK MANAGEMENT === +BarsToWait=1||1||1||8||Y +TimeFrame=16387||0||16385||16390||Y + +; === PHASE 3: POSITION SIZING === +LotSize=50.0||5.0||10.0||100.0||Y + +; === FIXED PARAMETERS === +RSI_Applied_Price=1||0||1||1||N +MagicNumber=12345||0||12345||12345||N +Slippage=3||0||3||3||N diff --git a/frontline/units_economic_calendar/RSIScalpingNVDA/OPTIMIZATION_GUIDE.md b/frontline/units_economic_calendar/RSIScalpingNVDA/OPTIMIZATION_GUIDE.md new file mode 100644 index 0000000..d7d5ba6 --- /dev/null +++ b/frontline/units_economic_calendar/RSIScalpingNVDA/OPTIMIZATION_GUIDE.md @@ -0,0 +1,134 @@ +# Genetic Algorithm Optimization Guide for RSIScalpingNVDA + +## Recommended Optimization Strategy + +### Phase 1: Core RSI Parameters (Primary Focus) +These parameters directly control entry/exit signals and should be optimized first. + +#### **RSI_Period** (Y - Optimize) +- **Current**: 14 +- **Recommended Range**: 7-21 +- **Step**: 1 +- **Rationale**: Standard RSI periods. Shorter = more sensitive, longer = smoother signals + +#### **RSI_Overbought** (Y - Optimize) +- **Current**: 19.0 (unusually low - verify if this is correct) +- **Standard Range**: 60.0-85.0 +- **Step**: 2.0 +- **Alternative Range** (if current is intentional): 15.0-30.0 +- **Rationale**: Level where RSI indicates overbought condition for sell entries + +#### **RSI_Oversold** (Y - Optimize) +- **Current**: 50.0 (unusually high - verify if this is correct) +- **Standard Range**: 15.0-40.0 +- **Step**: 2.0 +- **Alternative Range** (if current is intentional): 40.0-60.0 +- **Rationale**: Level where RSI indicates oversold condition for buy entries + +#### **RSI_Target_Buy** (Y - Optimize) +- **Current**: 71.0 +- **Recommended Range**: 65.0-90.0 +- **Step**: 2.0 +- **Rationale**: Exit target for long positions. Must be > RSI_Oversold + +#### **RSI_Target_Sell** (Y - Optimize) +- **Current**: 70.0 +- **Recommended Range**: 10.0-35.0 +- **Step**: 2.0 +- **Rationale**: Exit target for short positions. Must be < RSI_Overbought + +### Phase 2: Risk Management Parameters + +#### **BarsToWait** (Y - Optimize) +- **Current**: 1 +- **Recommended Range**: 1-8 +- **Step**: 1 +- **Rationale**: Bars to wait before closing when RSI goes against position. Higher = more patience + +#### **TimeFrame** (Y - Optimize) +- **Current**: 16387 (M5) +- **Recommended**: Test M1, M5, M15, H1 +- **Values**: + - M1 = 16385 + - M5 = 16387 + - M15 = 16388 + - H1 = 16390 +- **Rationale**: Different timeframes can significantly affect scalping performance + +### Phase 3: Position Sizing (Optimize with Caution) + +#### **LotSize** (Y - Optimize with Fixed Risk) +- **Current**: 50.0 +- **Recommended Range**: 10.0-100.0 +- **Step**: 5.0 +- **Note**: Consider using fixed risk % instead of fixed lot size +- **Rationale**: Position sizing affects profitability but also risk + +### Fixed Parameters (Do NOT Optimize) + +#### **RSI_Applied_Price** (N) +- **Value**: 1 (PRICE_CLOSE) +- **Rationale**: Standard choice, changing may not improve results significantly + +#### **MagicNumber** (N) +- **Value**: 12345 +- **Rationale**: Identifier only, no impact on performance + +#### **Slippage** (N) +- **Value**: 3 +- **Rationale**: Broker-specific, should match your actual slippage + +## Genetic Algorithm Settings + +### Recommended GA Settings: +- **Optimization Criterion**: Balance (or Custom: Profit Factor * Total Net Profit) +- **Population Size**: 50-100 +- **Mutation Probability**: 0.1-0.2 +- **Crossover Probability**: 0.7-0.9 +- **Optimization Passes**: 3-5 +- **Forward Testing**: Always use out-of-sample data + +### Optimization Phases: + +1. **Broad Search** (First Pass): + - Optimize: RSI_Period, RSI_Overbought, RSI_Oversold, RSI_Target_Buy, RSI_Target_Sell + - Fix: BarsToWait=1, TimeFrame=M5, LotSize=50 + +2. **Refinement** (Second Pass): + - Use best results from Phase 1 + - Optimize: BarsToWait, TimeFrame + - Narrow ranges around Phase 1 winners + +3. **Fine-Tuning** (Third Pass): + - Optimize: LotSize (if needed) + - Very narrow ranges around Phase 2 winners + +## Important Notes + +⚠️ **Current Parameter Anomaly**: +- RSI_Overbought=19 and RSI_Oversold=50 are unusual +- Standard RSI ranges: Overbought 70-80, Oversold 20-30 +- **Verify** if these are intentional or if there's a scaling issue + +✅ **Validation Checklist**: +- Ensure RSI_Target_Buy > RSI_Oversold +- Ensure RSI_Target_Sell < RSI_Overbought +- Test on sufficient historical data (at least 6-12 months) +- Use forward testing on unseen data +- Check for overfitting (too many parameters optimized) + +## Example .set File Structure + +``` +RSI_Period=14||1||7||21||Y +RSI_Overbought=70.0||2.0||60.0||85.0||Y +RSI_Oversold=30.0||2.0||15.0||40.0||Y +RSI_Target_Buy=75.0||2.0||65.0||90.0||Y +RSI_Target_Sell=25.0||2.0||10.0||35.0||Y +BarsToWait=2||1||1||8||Y +TimeFrame=16387||0||16385||16390||Y +LotSize=50.0||5.0||10.0||100.0||Y +RSI_Applied_Price=1||0||1||1||N +MagicNumber=12345||0||12345||12345||N +Slippage=3||0||3||3||N +``` diff --git a/frontline/units_economic_calendar/RSIScalpingNVDA/main.mq5 b/frontline/units_economic_calendar/RSIScalpingNVDA/main.mq5 new file mode 100644 index 0000000..173bfec --- /dev/null +++ b/frontline/units_economic_calendar/RSIScalpingNVDA/main.mq5 @@ -0,0 +1,327 @@ +//+------------------------------------------------------------------+ +//| RSIScalping.mq5 | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include "../_united/MagicNumberHelpers.mqh" + +//--- Input parameters — synced with Desktop 123.set (2026.05.13) +input ENUM_TIMEFRAMES TimeFrame = PERIOD_M20; // Timeframe for Analysis +input int RSI_Period = 14; // RSI Period +input ENUM_APPLIED_PRICE RSI_Applied_Price = PRICE_CLOSE; // RSI Applied Price +input double RSI_Overbought = 6; // RSI Overbought Level +input double RSI_Oversold = 66; // RSI Oversold Level +input double RSI_Target_Buy = 98; // RSI Target for Buy Exit +input double RSI_Target_Sell = 52; // RSI Target for Sell Exit +input int BarsToWait = 12; // Bars to wait when RSI goes against position +input double LotSize = 5; // Lot Size +input int MagicNumber = 129102315; // Magic Number +input int Slippage = 3; // Slippage in points + +//--- Global variables +CTrade trade; +int rsi_handle; +double rsi_buffer[]; +double rsi_prev, rsi_current, rsi_two_bars_ago; +bool position_open = false; +int position_ticket = 0; +ENUM_POSITION_TYPE current_position_type = POSITION_TYPE_BUY; +datetime last_bar_time = 0; +bool rsi_against_position = false; +int bars_against_count = 0; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsi_handle = iRSI(_Symbol, TimeFrame, RSI_Period, RSI_Applied_Price); + if(rsi_handle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Initialize trade object + trade.SetExpertMagicNumber(MagicNumber); + trade.SetDeviationInPoints(Slippage); + trade.SetTypeFilling(ORDER_FILLING_FOK); + + // Allocate arrays + ArraySetAsSeries(rsi_buffer, true); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + if(rsi_handle != INVALID_HANDLE) + IndicatorRelease(rsi_handle); +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // Check if we have enough bars + if(Bars(_Symbol, TimeFrame) < RSI_Period + 2) + { + return; + } + + // Check if this is a new bar + datetime current_bar_time = iTime(_Symbol, TimeFrame, 0); + if(current_bar_time == last_bar_time) + { + return; // Still the same bar, don't process + } + + last_bar_time = current_bar_time; + + // Update RSI values + if(!UpdateRSI()) + { + return; + } + + // Check for existing position + CheckExistingPosition(); + + // Check for new entry signals - only if no position exists for THIS EA (magic number) on THIS symbol + if(!position_open && !PositionExistsByMagic(_Symbol, MagicNumber)) + { + CheckEntrySignals(); + } +} + +//+------------------------------------------------------------------+ +//| Update RSI values | +//+------------------------------------------------------------------+ +bool UpdateRSI() +{ + if(CopyBuffer(rsi_handle, 0, 0, 3, rsi_buffer) < 3) + { + return false; + } + + rsi_current = rsi_buffer[0]; // Current bar + rsi_prev = rsi_buffer[1]; // Previous bar + rsi_two_bars_ago = rsi_buffer[2]; // Two bars ago + + return true; +} + +//+------------------------------------------------------------------+ +//| Check existing position for exit conditions | +//+------------------------------------------------------------------+ +void CheckExistingPosition() +{ + if(!position_open) + { + return; + } + + // Check if position still exists with correct magic number AND symbol for THIS EA + if(!PositionSelectByTicketSymbolAndMagic(position_ticket, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + return; + } + + // Exit conditions based on RSI target + if(current_position_type == POSITION_TYPE_BUY) + { + // Check if RSI is against the position (below oversold) + if(rsi_current < RSI_Oversold) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit long position when RSI reaches buy target + if(rsi_current >= RSI_Target_Buy) + { + ClosePosition(); + } + } + } + else if(current_position_type == POSITION_TYPE_SELL) + { + // Check if RSI is against the position (above overbought) + if(rsi_current > RSI_Overbought) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit short position when RSI reaches sell target + if(rsi_current <= RSI_Target_Sell) + { + ClosePosition(); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Check for entry signals | +//+------------------------------------------------------------------+ +void CheckEntrySignals() +{ + // Buy signal: RSI crosses from oversold to above oversold (checking the actual crossover) + if(rsi_two_bars_ago <= RSI_Oversold && rsi_prev > RSI_Oversold) + { + OpenBuyPosition(); + } + + // Sell signal: RSI crosses from overbought to below overbought (checking the actual crossover) + if(rsi_two_bars_ago >= RSI_Overbought && rsi_prev < RSI_Overbought) + { + OpenSellPosition(); + } +} + +//+------------------------------------------------------------------+ +//| Open buy position | +//+------------------------------------------------------------------+ +void OpenBuyPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + if(trade.Buy(LotSize, _Symbol, ask, 0, 0, "RSI Scalping Buy")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_BUY; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Open sell position | +//+------------------------------------------------------------------+ +void OpenSellPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + + if(trade.Sell(LotSize, _Symbol, bid, 0, 0, "RSI Scalping Sell")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_SELL; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Close current position | +//+------------------------------------------------------------------+ +void ClosePosition() +{ + // Close position using helper that verifies symbol AND magic number for THIS EA + if(ClosePositionByMagic(trade, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } + else + { + // Position doesn't exist or wrong magic number - reset tracking + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } +} diff --git a/frontline/units_economic_calendar/RSIScalpingTSLA/main.mq5 b/frontline/units_economic_calendar/RSIScalpingTSLA/main.mq5 new file mode 100644 index 0000000..5c53a5d --- /dev/null +++ b/frontline/units_economic_calendar/RSIScalpingTSLA/main.mq5 @@ -0,0 +1,327 @@ +//+------------------------------------------------------------------+ +//| RSIScalping.mq5 | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include "../_united/MagicNumberHelpers.mqh" + +//--- Input parameters — synced with Desktop 123.set (2026.05.13) +input ENUM_TIMEFRAMES TimeFrame = PERIOD_M20; // Timeframe for Analysis +input int RSI_Period = 14; // RSI Period +input ENUM_APPLIED_PRICE RSI_Applied_Price = PRICE_CLOSE; // RSI Applied Price +input double RSI_Overbought = 32; // RSI Overbought Level +input double RSI_Oversold = 86; // RSI Oversold Level +input double RSI_Target_Buy = 100; // RSI Target for Buy Exit +input double RSI_Target_Sell = 24; // RSI Target for Sell Exit +input int BarsToWait = 34; // Bars to wait when RSI goes against position +input double LotSize = 5; // Lot Size +input int MagicNumber = 129102315; // Magic Number +input int Slippage = 3; // Slippage in points + +//--- Global variables +CTrade trade; +int rsi_handle; +double rsi_buffer[]; +double rsi_prev, rsi_current, rsi_two_bars_ago; +bool position_open = false; +int position_ticket = 0; +ENUM_POSITION_TYPE current_position_type = POSITION_TYPE_BUY; +datetime last_bar_time = 0; +bool rsi_against_position = false; +int bars_against_count = 0; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Initialize RSI indicator + rsi_handle = iRSI(_Symbol, TimeFrame, RSI_Period, RSI_Applied_Price); + if(rsi_handle == INVALID_HANDLE) + { + return(INIT_FAILED); + } + + // Initialize trade object + trade.SetExpertMagicNumber(MagicNumber); + trade.SetDeviationInPoints(Slippage); + trade.SetTypeFilling(ORDER_FILLING_FOK); + + // Allocate arrays + ArraySetAsSeries(rsi_buffer, true); + + return(INIT_SUCCEEDED); +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + if(rsi_handle != INVALID_HANDLE) + IndicatorRelease(rsi_handle); +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // Check if we have enough bars + if(Bars(_Symbol, TimeFrame) < RSI_Period + 2) + { + return; + } + + // Check if this is a new bar + datetime current_bar_time = iTime(_Symbol, TimeFrame, 0); + if(current_bar_time == last_bar_time) + { + return; // Still the same bar, don't process + } + + last_bar_time = current_bar_time; + + // Update RSI values + if(!UpdateRSI()) + { + return; + } + + // Check for existing position + CheckExistingPosition(); + + // Check for new entry signals - only if no position exists for THIS EA (magic number) on THIS symbol + if(!position_open && !PositionExistsByMagic(_Symbol, MagicNumber)) + { + CheckEntrySignals(); + } +} + +//+------------------------------------------------------------------+ +//| Update RSI values | +//+------------------------------------------------------------------+ +bool UpdateRSI() +{ + if(CopyBuffer(rsi_handle, 0, 0, 3, rsi_buffer) < 3) + { + return false; + } + + rsi_current = rsi_buffer[0]; // Current bar + rsi_prev = rsi_buffer[1]; // Previous bar + rsi_two_bars_ago = rsi_buffer[2]; // Two bars ago + + return true; +} + +//+------------------------------------------------------------------+ +//| Check existing position for exit conditions | +//+------------------------------------------------------------------+ +void CheckExistingPosition() +{ + if(!position_open) + { + return; + } + + // Check if position still exists with correct magic number AND symbol for THIS EA + if(!PositionSelectByTicketSymbolAndMagic(position_ticket, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + return; + } + + // Exit conditions based on RSI target + if(current_position_type == POSITION_TYPE_BUY) + { + // Check if RSI is against the position (below oversold) + if(rsi_current < RSI_Oversold) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit long position when RSI reaches buy target + if(rsi_current >= RSI_Target_Buy) + { + ClosePosition(); + } + } + } + else if(current_position_type == POSITION_TYPE_SELL) + { + // Check if RSI is against the position (above overbought) + if(rsi_current > RSI_Overbought) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + { + bars_against_count++; + } + + // Close position if RSI has been against for Y bars + if(bars_against_count >= BarsToWait) + { + ClosePosition(); + return; + } + } + else + { + // RSI is no longer against the position, reset counter + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + + // Exit short position when RSI reaches sell target + if(rsi_current <= RSI_Target_Sell) + { + ClosePosition(); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Check for entry signals | +//+------------------------------------------------------------------+ +void CheckEntrySignals() +{ + // Buy signal: RSI crosses from oversold to above oversold (checking the actual crossover) + if(rsi_two_bars_ago <= RSI_Oversold && rsi_prev > RSI_Oversold) + { + OpenBuyPosition(); + } + + // Sell signal: RSI crosses from overbought to below overbought (checking the actual crossover) + if(rsi_two_bars_ago >= RSI_Overbought && rsi_prev < RSI_Overbought) + { + OpenSellPosition(); + } +} + +//+------------------------------------------------------------------+ +//| Open buy position | +//+------------------------------------------------------------------+ +void OpenBuyPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + if(trade.Buy(LotSize, _Symbol, ask, 0, 0, "RSI Scalping Buy")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_BUY; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Open sell position | +//+------------------------------------------------------------------+ +void OpenSellPosition() +{ + // Verify no position exists for THIS EA (magic number) on THIS symbol before opening + if(PositionExistsByMagic(_Symbol, MagicNumber)) + { + return; // Position already exists for this EA + } + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + + if(trade.Sell(LotSize, _Symbol, bid, 0, 0, "RSI Scalping Sell")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0) + { + // Verify position was opened for THIS EA (magic number) on THIS symbol + if(PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_SELL; + } + else + { + Print("Error: Position opened but doesn't match EA magic number or symbol"); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Close current position | +//+------------------------------------------------------------------+ +void ClosePosition() +{ + // Close position using helper that verifies symbol AND magic number for THIS EA + if(ClosePositionByMagic(trade, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } + else + { + // Position doesn't exist or wrong magic number - reset tracking + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } +} diff --git a/frontline/units_economic_calendar/RSI_secret_sauce_XAUUSD/main.mq5 b/frontline/units_economic_calendar/RSI_secret_sauce_XAUUSD/main.mq5 new file mode 100644 index 0000000..425b7f7 --- /dev/null +++ b/frontline/units_economic_calendar/RSI_secret_sauce_XAUUSD/main.mq5 @@ -0,0 +1,508 @@ +//+------------------------------------------------------------------+ +//| RSI_SecretSauce_XAUUSD.mq5 | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.01" +#property description "RSI Secret Sauce Strategy: Wait for RSI to leave 70/30 zone, then enter when it comes back in" +#property description "Based on momentum flip concept - not traditional overbought/oversold" + +#include +#include + +//--- Input Parameters +input group "=== Trading Settings ===" +input string InpSymbol = "XAUUSD"; // Default gold; same numbers as secret_sauce.set (that file uses BTCUSD as symbol) +input double InpLotSize = 0.1; // Lot Size (Profiles/Tester/secret_sauce.set) +input int InpMagicNumber = 789012; // Magic Number +input int InpSlippage = 10; // Slippage in points +input ENUM_TIMEFRAMES InpTimeframe = PERIOD_M30; // Trading Timeframe (set value 30 = M30) + +input group "=== RSI Settings ===" +input int InpRSIPeriod = 16; // RSI Period +input double InpRSIOverbought = 72.5; // RSI Overbought Level +input double InpRSIOversold = 32.5; // RSI Oversold Level +input int InpRSILookback = 60; // RSI Lookback for Peak/Bottom Detection + +input group "=== Entry Logic ===" +input int InpPeakBars = 2; // Bars to confirm peak/bottom +input bool InpRequireDivergence = false; // Require divergence confirmation (optional) + +input group "=== Risk Management ===" +input double InpStopLossATR = 2.75; // Stop Loss (ATR multiples) +input double InpTakeProfitATR = 5.0; // Take Profit (ATR multiples) +input int InpATRPeriod = 14; // ATR Period +input bool InpUseSwingStopLoss = false; // Use previous swing high/low for stop loss +input int InpSwingLookback = 30; // Bars to look back for swing points + +input group "=== Position Management ===" +input int InpMaxPositions = 1; // Max Simultaneous Positions +input int InpMinBarsBetweenTrades = 7; // Min Bars Between Trades + +//--- Global Variables +CTrade trade; +CPositionInfo positionInfo; + +string actualSymbol; +int rsiHandle = INVALID_HANDLE; +int atrHandle = INVALID_HANDLE; + +double rsiBuffer[]; +double atrBuffer[]; +double highBuffer[]; +double lowBuffer[]; + +// RSI state tracking +bool rsiWasOverbought = false; // RSI was above 70 +bool rsiWasOversold = false; // RSI was below 30 +bool rsiBackInRange = false; // RSI came back into range +datetime lastRSIExitTime = 0; // When RSI left the range +datetime lastRSIReentryTime = 0; // When RSI came back in + +// Trade tracking +datetime lastTradeTime = 0; +int barsSinceLastTrade = 0; + +datetime lastBarTime = 0; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() +{ + // Determine actual symbol + if(InpSymbol == "" || InpSymbol == NULL) + actualSymbol = _Symbol; + else + actualSymbol = InpSymbol; + + // Check if symbol exists + if(!SymbolInfoInteger(actualSymbol, SYMBOL_SELECT)) + { + Print("Error: Symbol ", actualSymbol, " not found. Using chart symbol."); + actualSymbol = _Symbol; + } + + // Initialize RSI indicator + rsiHandle = iRSI(actualSymbol, InpTimeframe, InpRSIPeriod, PRICE_CLOSE); + if(rsiHandle == INVALID_HANDLE) + { + Print("Error creating RSI indicator"); + return INIT_FAILED; + } + ArraySetAsSeries(rsiBuffer, true); + + // Initialize ATR indicator + atrHandle = iATR(actualSymbol, InpTimeframe, InpATRPeriod); + if(atrHandle == INVALID_HANDLE) + { + Print("Error creating ATR indicator"); + return INIT_FAILED; + } + ArraySetAsSeries(atrBuffer, true); + + // Initialize price buffers + ArraySetAsSeries(highBuffer, true); + ArraySetAsSeries(lowBuffer, true); + + // Set trade parameters + trade.SetExpertMagicNumber(InpMagicNumber); + trade.SetDeviationInPoints(InpSlippage); + trade.SetTypeFilling(ORDER_FILLING_FOK); + + Print("=== RSI Secret Sauce Strategy Initialized ==="); + Print("Symbol: ", actualSymbol); + Print("Timeframe: ", EnumToString(InpTimeframe)); + Print("RSI Period: ", InpRSIPeriod, " | Overbought: ", InpRSIOverbought, " | Oversold: ", InpRSIOversold); + Print("Stop Loss: ", InpStopLossATR, "x ATR | Take Profit: ", InpTakeProfitATR, "x ATR"); + + return INIT_SUCCEEDED; +} + +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + if(rsiHandle != INVALID_HANDLE) + IndicatorRelease(rsiHandle); + if(atrHandle != INVALID_HANDLE) + IndicatorRelease(atrHandle); + + Print("Expert Advisor deinitialized. Reason: ", reason); +} + +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() +{ + // Check if we have enough bars + int requiredBars = MathMax(InpRSILookback, InpSwingLookback) + 10; + if(Bars(actualSymbol, InpTimeframe) < requiredBars) + return; + + // Check if this is a new bar (wait for candle close) + datetime currentBarTime = iTime(actualSymbol, InpTimeframe, 0); + if(currentBarTime == lastBarTime) + return; // Still the same bar, don't process + + lastBarTime = currentBarTime; + + // Update indicators + if(!UpdateIndicators()) + return; + + // Update RSI state tracking + UpdateRSIState(); + + // Check existing positions + CheckExistingPositions(); + + // Check for entry signals + if(CanOpenNewPosition()) + { + CheckEntrySignals(); + } +} + +//+------------------------------------------------------------------+ +//| Update indicator values | +//+------------------------------------------------------------------+ +bool UpdateIndicators() +{ + // Update RSI (need enough bars for lookback) + int rsiBarsNeeded = InpRSILookback + 5; + if(CopyBuffer(rsiHandle, 0, 0, rsiBarsNeeded, rsiBuffer) < rsiBarsNeeded) + return false; + + // Update ATR + if(CopyBuffer(atrHandle, 0, 0, 2, atrBuffer) < 2) + return false; + + // Update price buffers for swing detection + if(CopyHigh(actualSymbol, InpTimeframe, 0, InpSwingLookback + 5, highBuffer) < InpSwingLookback + 5) + return false; + if(CopyLow(actualSymbol, InpTimeframe, 0, InpSwingLookback + 5, lowBuffer) < InpSwingLookback + 5) + return false; + + return true; +} + +//+------------------------------------------------------------------+ +//| Update RSI state tracking | +//+------------------------------------------------------------------+ +void UpdateRSIState() +{ + double rsiCurrent = rsiBuffer[0]; + double rsiPrev = rsiBuffer[1]; + + // Check if RSI left overbought zone (was above 70, now below 70) + if(rsiPrev >= InpRSIOverbought && rsiCurrent < InpRSIOverbought) + { + rsiWasOverbought = true; + rsiBackInRange = true; + lastRSIExitTime = TimeCurrent(); + lastRSIReentryTime = TimeCurrent(); + Print(TimeToString(TimeCurrent()), " - RSI left overbought zone (", rsiPrev, " -> ", rsiCurrent, ")"); + } + + // Check if RSI left oversold zone (was below 30, now above 30) + if(rsiPrev <= InpRSIOversold && rsiCurrent > InpRSIOversold) + { + rsiWasOversold = true; + rsiBackInRange = true; + lastRSIExitTime = TimeCurrent(); + lastRSIReentryTime = TimeCurrent(); + Print(TimeToString(TimeCurrent()), " - RSI left oversold zone (", rsiPrev, " -> ", rsiCurrent, ")"); + } + + // Reset flags if RSI goes back to extreme + if(rsiCurrent >= InpRSIOverbought) + { + rsiWasOverbought = false; + rsiBackInRange = false; + } + + if(rsiCurrent <= InpRSIOversold) + { + rsiWasOversold = false; + rsiBackInRange = false; + } +} + +//+------------------------------------------------------------------+ +//| Check if we can open a new position | +//+------------------------------------------------------------------+ +bool CanOpenNewPosition() +{ + // Check max positions + int positionCount = 0; + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + if(positionInfo.SelectByIndex(i)) + { + if(positionInfo.Symbol() == actualSymbol && positionInfo.Magic() == InpMagicNumber) + positionCount++; + } + } + + if(positionCount >= InpMaxPositions) + return false; + + // Check minimum bars between trades + if(lastTradeTime > 0) + { + int barsSince = Bars(actualSymbol, InpTimeframe, lastTradeTime, TimeCurrent()); + if(barsSince < InpMinBarsBetweenTrades) + return false; + } + + return true; +} + +//+------------------------------------------------------------------+ +//| Check for entry signals | +//+------------------------------------------------------------------+ +void CheckEntrySignals() +{ + // LONG Entry: RSI was overbought (>70), came back in range, now look for peak + if(rsiWasOverbought && rsiBackInRange) + { + // Check if RSI is back in normal range (below 70) + if(rsiBuffer[0] < InpRSIOverbought) + { + // Look for a peak in RSI after re-entry + if(IsRSIPeak()) + { + Print(TimeToString(TimeCurrent()), " - LONG Signal: RSI peak detected after leaving overbought zone"); + OpenPosition(POSITION_TYPE_BUY); + } + } + } + + // SHORT Entry: RSI was oversold (<30), came back in range, now look for bottom + if(rsiWasOversold && rsiBackInRange) + { + // Check if RSI is back in normal range (above 30) + if(rsiBuffer[0] > InpRSIOversold) + { + // Look for a bottom in RSI after re-entry + if(IsRSIBottom()) + { + Print(TimeToString(TimeCurrent()), " - SHORT Signal: RSI bottom detected after leaving oversold zone"); + OpenPosition(POSITION_TYPE_SELL); + } + } + } +} + +//+------------------------------------------------------------------+ +//| Check if RSI is forming a peak (for LONG entry) | +//+------------------------------------------------------------------+ +bool IsRSIPeak() +{ + // We need at least InpPeakBars + 1 bars to confirm a peak + if(ArraySize(rsiBuffer) < InpPeakBars + 2) + return false; + + // Check if current RSI is higher than previous bars (forming a peak) + double currentRSI = rsiBuffer[0]; + bool isPeak = true; + + // Check if current is higher than the next few bars + for(int i = 1; i <= InpPeakBars; i++) + { + if(rsiBuffer[i] >= currentRSI) + { + isPeak = false; + break; + } + } + + // Also check if previous bar was lower (confirming upward movement before peak) + if(rsiBuffer[1] >= currentRSI) + isPeak = false; + + return isPeak; +} + +//+------------------------------------------------------------------+ +//| Check if RSI is forming a bottom (for SHORT entry) | +//+------------------------------------------------------------------+ +bool IsRSIBottom() +{ + // We need at least InpPeakBars + 1 bars to confirm a bottom + if(ArraySize(rsiBuffer) < InpPeakBars + 2) + return false; + + // Check if current RSI is lower than previous bars (forming a bottom) + double currentRSI = rsiBuffer[0]; + bool isBottom = true; + + // Check if current is lower than the next few bars + for(int i = 1; i <= InpPeakBars; i++) + { + if(rsiBuffer[i] <= currentRSI) + { + isBottom = false; + break; + } + } + + // Also check if previous bar was higher (confirming downward movement before bottom) + if(rsiBuffer[1] <= currentRSI) + isBottom = false; + + return isBottom; +} + +//+------------------------------------------------------------------+ +//| Open position | +//+------------------------------------------------------------------+ +void OpenPosition(ENUM_POSITION_TYPE type) +{ + double price = (type == POSITION_TYPE_BUY) ? + SymbolInfoDouble(actualSymbol, SYMBOL_ASK) : + SymbolInfoDouble(actualSymbol, SYMBOL_BID); + + if(price <= 0) + return; + + // Calculate stop loss and take profit + double sl = 0.0, tp = 0.0; + if(!CalculateStops(price, type, sl, tp)) + { + Print("Error: Failed to calculate stops"); + return; + } + + string comment = "RSI_Secret_" + (type == POSITION_TYPE_BUY ? "LONG" : "SHORT"); + + bool result = false; + if(type == POSITION_TYPE_BUY) + result = trade.Buy(InpLotSize, actualSymbol, 0, sl, tp, comment); + else + result = trade.Sell(InpLotSize, actualSymbol, 0, sl, tp, comment); + + if(result) + { + lastTradeTime = TimeCurrent(); + ulong ticket = trade.ResultOrder(); + Print(TimeToString(TimeCurrent()), " - Position opened: ", comment, " Ticket: ", ticket, + " Price: ", price, " SL: ", sl, " TP: ", tp); + + // Reset RSI state after opening position + if(type == POSITION_TYPE_BUY) + rsiWasOverbought = false; + else + rsiWasOversold = false; + rsiBackInRange = false; + } + else + { + Print("Failed to open position: ", comment, " Error: ", + trade.ResultRetcode(), " - ", trade.ResultRetcodeDescription()); + } +} + +//+------------------------------------------------------------------+ +//| Calculate stop loss and take profit | +//+------------------------------------------------------------------+ +bool CalculateStops(double price, ENUM_POSITION_TYPE type, double &sl, double &tp) +{ + double atrValue = atrBuffer[0]; + if(atrValue <= 0) + atrValue = price * 0.01; // Fallback: 1% of price + + double slDistance = atrValue * InpStopLossATR; + double tpDistance = atrValue * InpTakeProfitATR; + + int digits = (int)SymbolInfoInteger(actualSymbol, SYMBOL_DIGITS); + double point = SymbolInfoDouble(actualSymbol, SYMBOL_POINT); + int stopsLevel = (int)SymbolInfoInteger(actualSymbol, SYMBOL_TRADE_STOPS_LEVEL); + double minStopDistance = MathMax(stopsLevel * point, point * 10); + + // Use swing-based stop loss if enabled + if(InpUseSwingStopLoss) + { + double swingStop = GetSwingStopLoss(price, type); + if(swingStop > 0) + { + if(type == POSITION_TYPE_BUY) + { + if(swingStop < price && (price - swingStop) > minStopDistance) + slDistance = price - swingStop; + } + else + { + if(swingStop > price && (swingStop - price) > minStopDistance) + slDistance = swingStop - price; + } + } + } + + // Ensure minimum distance + if(slDistance < minStopDistance) + slDistance = minStopDistance; + if(tpDistance < minStopDistance) + tpDistance = minStopDistance; + + if(type == POSITION_TYPE_BUY) + { + sl = NormalizeDouble(price - slDistance, digits); + tp = NormalizeDouble(price + tpDistance, digits); + } + else + { + sl = NormalizeDouble(price + slDistance, digits); + tp = NormalizeDouble(price - tpDistance, digits); + } + + return true; +} + +//+------------------------------------------------------------------+ +//| Get swing-based stop loss (previous swing high/low) | +//+------------------------------------------------------------------+ +double GetSwingStopLoss(double currentPrice, ENUM_POSITION_TYPE type) +{ + // For LONG: find previous swing low + // For SHORT: find previous swing high + + if(type == POSITION_TYPE_BUY) + { + // Find the lowest low in the lookback period + double lowestLow = lowBuffer[0]; + for(int i = 1; i < InpSwingLookback && i < ArraySize(lowBuffer); i++) + { + if(lowBuffer[i] < lowestLow) + lowestLow = lowBuffer[i]; + } + return lowestLow; + } + else + { + // Find the highest high in the lookback period + double highestHigh = highBuffer[0]; + for(int i = 1; i < InpSwingLookback && i < ArraySize(highBuffer); i++) + { + if(highBuffer[i] > highestHigh) + highestHigh = highBuffer[i]; + } + return highestHigh; + } +} + +//+------------------------------------------------------------------+ +//| Check existing positions | +//+------------------------------------------------------------------+ +void CheckExistingPositions() +{ + // Position management can be added here if needed + // For now, positions are managed by TP/SL +} + +//+------------------------------------------------------------------+ diff --git a/lab/EAs/SimpleTrendlineTSLA/SimpleTrendline.mq5 b/frontline/units_economic_calendar/SimpleTrendlineBTCUSD/SimpleTrendline.mq5 similarity index 94% rename from lab/EAs/SimpleTrendlineTSLA/SimpleTrendline.mq5 rename to frontline/units_economic_calendar/SimpleTrendlineBTCUSD/SimpleTrendline.mq5 index c869eeb..6476f77 100644 --- a/lab/EAs/SimpleTrendlineTSLA/SimpleTrendline.mq5 +++ b/frontline/units_economic_calendar/SimpleTrendlineBTCUSD/SimpleTrendline.mq5 @@ -3,13 +3,13 @@ #include -input ENUM_TIMEFRAMES InpHigherTF = PERIOD_M10; // Higher timeframe for MA/cross points -input int InpMAPeriod = 65; // MA period -input ENUM_MA_METHOD InpMAMethod = MODE_EMA; // MA method +input ENUM_TIMEFRAMES InpHigherTF = PERIOD_H4; // Higher timeframe for MA/cross points +input int InpMAPeriod = 150; // MA period +input ENUM_MA_METHOD InpMAMethod = MODE_SMMA; // MA method input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_OPEN; // MA applied price -input int InpHTFBarsToScan = 500; // HTF bars to scan for crossings -input double InpLineTouchTolerance = 220; // Pullback touch tolerance (points) -input double InpBreakBuffer = 110; // Break confirmation buffer (points) +input int InpHTFBarsToScan = 1200; // HTF bars to scan for crossings +input double InpLineTouchTolerance = 170; // Pullback touch tolerance (points) +input double InpBreakBuffer = 90; // Break confirmation buffer (points) input double InpLots = 0.10; // Position size input long InpMagic = 26042501; // Magic number input bool InpDrawTrendline = true; // Draw detected trendline diff --git a/frontline/units_economic_calendar/SimpleTrendlineBTCUSD/SimpleTrendline_optimization.set b/frontline/units_economic_calendar/SimpleTrendlineBTCUSD/SimpleTrendline_optimization.set new file mode 100644 index 0000000..10ea2ee --- /dev/null +++ b/frontline/units_economic_calendar/SimpleTrendlineBTCUSD/SimpleTrendline_optimization.set @@ -0,0 +1,14 @@ +; SimpleTrendline.mq5 optimization preset +; Strategy Tester -> Inputs -> Load +; Focus: trendline pullback entries + break exits (no broker SL/TP) +; +InpHigherTF=16385||16385||0||16388||Y +InpMAPeriod=50||20||5||200||Y +InpMAMethod=1||0||1||3||Y +InpAppliedPrice=0||0||1||6||Y +InpHTFBarsToScan=400||200||100||1200||Y +InpLineTouchTolerance=100.0||30.0||10.0||300.0||Y +InpBreakBuffer=30.0||5.0||5.0||120.0||Y +InpLots=0.10||0.10||0.01||0.10||N +InpMagic=26042501||26042501||1||26042501||N +InpDrawTrendline=false||false||0||true||N diff --git a/frontline/units_economic_calendar/USDJPYBuster/USDJPYBuster.mq5 b/frontline/units_economic_calendar/USDJPYBuster/USDJPYBuster.mq5 new file mode 100644 index 0000000..f861ea2 --- /dev/null +++ b/frontline/units_economic_calendar/USDJPYBuster/USDJPYBuster.mq5 @@ -0,0 +1,80 @@ +//+------------------------------------------------------------------+ +//| USDJPYBuster.mq5 | +//| Standalone wrapper — logic in Strategies/USDJPYBusterStrategy.mqh | +//+------------------------------------------------------------------+ +#property copyright "Lab" +#property link "" +#property version "1.02" +#property description "USDJPY Asian range breakout (Ian style). See cluster Strategies/USDJPYBusterStrategy.mqh." + +#include +#include "../../cluster-latest/Strategies/USDJPYBusterStrategy.mqh" + +input group "=== Symbol ===" +input string InpSymbol = "USDJPY"; + +input group "=== Range session (broker server time) ===" +input int InpRangeStartHour = 3; +input int InpRangeEndHour = 6; +input int InpCloseHour = 18; +input ENUM_TIMEFRAMES InpRangeTF = PERIOD_M1; +input int InpMinRangePoints = 5; +input double InpOrderBufferPoints = 1.0; + +input group "=== Breakout orders ===" +input bool InpFirstTradeOnly = false; +input bool InpAllowLong = true; +input bool InpAllowShort = true; +input bool InpUseTakeProfit = false; +input double InpTakeProfitPoints = 0.0; + +input group "=== Risk ===" +input ENUM_UB_RISK_MODE InpRiskMode = UB_RISK_FIXED_MONEY; +input double InpFixedRiskMoney = 650.0; +input double InpRiskPercent = 2.1; +input double InpFixedLots = 0.01; +input int InpMagic = 927002; +input int InpSlippagePoints = 20; +input int InpMaxSpreadPoints = 5; + +input group "=== Debug ===" +input bool InpDrawRange = false; +input bool InpDebugLog = false; + +USDJPYBusterData g_ub; + +string WorkSymbol() +{ + string s = InpSymbol; + StringTrimLeft(s); + StringTrimRight(s); + const int bar = StringFind(s, "|"); + if(bar >= 0) + s = StringSubstr(s, 0, bar); + StringTrimRight(s); + return (StringLen(s) > 0 ? s : _Symbol); +} + +int OnInit() +{ + return InitUSDJPYBuster(g_ub, WorkSymbol(), + InpRangeStartHour, InpRangeEndHour, InpCloseHour, InpRangeTF, + InpMinRangePoints, InpOrderBufferPoints, + InpFirstTradeOnly, InpAllowLong, InpAllowShort, + InpUseTakeProfit, InpTakeProfitPoints, + InpRiskMode, InpFixedRiskMoney, InpRiskPercent, InpFixedLots, + InpMagic, InpSlippagePoints, InpMaxSpreadPoints, + InpDrawRange, InpDebugLog) ? INIT_SUCCEEDED : INIT_FAILED; +} + +void OnDeinit(const int reason) +{ + DeinitUSDJPYBuster(g_ub); +} + +void OnTick() +{ + ProcessUSDJPYBuster(g_ub, InpFixedLots, 1.0); +} + +//+------------------------------------------------------------------+ diff --git a/lab/EAs/CandleChartPattern/CandleChartPattern_Genetic_Optimization.set b/lab/EAs/CandleChartPattern/CandleChartPattern_Genetic_Optimization.set deleted file mode 100644 index 86c6f65..0000000 --- a/lab/EAs/CandleChartPattern/CandleChartPattern_Genetic_Optimization.set +++ /dev/null @@ -1,26 +0,0 @@ -; CandleChartPattern/main.mq5 — Strategy Tester → Inputs → Load -; Format: Name=Value||From||Step||To||Optimize(Y/N) -; Value = load default (aligned with EA + Desktop 123.set 2026.05.14). From/Step/To used when Y. -; -; === Market === -InpSymbol= -InpLots=0.01||0.01||0.01||0.2||N -InpMagic=771001||771001||1||771001||N -InpSlippagePoints=30||30||1||300||N -InpMaxSpreadPoints=50||10||5||200||Y -; === Timeframes === -; Enum timeframes: keep fixed during optimization (change manually if needed). -InpSignalTF=15||0||0||49153||N -InpConfirmTF=16385||0||0||49153||N -; === Patterns (signal TF, shift 1) === -InpUseEngulfing=true||false||0||true||Y -InpUseHammerPin=true||false||0||true||Y -InpMinBodyPoints=5.0||2.0||0.5||25.0||Y -InpHammerWickRatio=2.0||1.2||0.1||4.0||Y -; === HTF confirmation === -InpRequireHtfCandleDir=true||false||0||true||Y -InpRequireHtfPattern=false||false||0||true||Y -; === Behaviour === -InpOnlyOnePosition=true||false||0||true||N -InpCloseOnReverseSignal=true||false||0||true||Y -InpCloseOnAdversePattern=true||false||0||true||Y diff --git a/lab/EAs/CandleChartPattern/main.mq5 b/lab/EAs/CandleChartPattern/main.mq5 deleted file mode 100644 index 2048753..0000000 --- a/lab/EAs/CandleChartPattern/main.mq5 +++ /dev/null @@ -1,332 +0,0 @@ -//+------------------------------------------------------------------+ -//| CandleChartPattern.mq5 | -//| Lab EA: candle patterns on signal TF + HTF confirmation. | -//| No SL/TP. Exit on opposite signal or adverse pattern. | -//+------------------------------------------------------------------+ -#property copyright "Lab" -#property link "" -#property version "1.01" -#property strict - -#include - -input group "=== Market ===" -input string InpSymbol = ""; // empty = chart symbol -input double InpLots = 0.01; -input int InpMagic = 771001; -input int InpSlippagePoints = 30; -input int InpMaxSpreadPoints = 50; // 0 = ignore - -input group "=== Timeframes ===" -input ENUM_TIMEFRAMES InpSignalTF = PERIOD_M15; // patterns evaluated here (bar 1 = last closed) -input ENUM_TIMEFRAMES InpConfirmTF = PERIOD_H1; // must be >= InpSignalTF for stable bias (not enforced) - -input group "=== Patterns (signal TF, shift 1) ===" -input bool InpUseEngulfing = true; -input bool InpUseHammerPin = true; -input double InpMinBodyPoints = 5.0; // min body size for engulfing (points) -input double InpHammerWickRatio = 2.0; // shadow >= ratio * body for hammer/pin - -input group "=== HTF confirmation ===" -input bool InpRequireHtfCandleDir = true; // HTF last closed bar same direction as trade idea -input bool InpRequireHtfPattern = false; // if true, same pattern class must also print on HTF bar 1 - -input group "=== Behaviour ===" -input bool InpOnlyOnePosition = true; -input bool InpCloseOnReverseSignal = true; // close long if validated short setup appears (and vice versa) -input bool InpCloseOnAdversePattern = true; // close long on bearish engulf / bear pin on signal or HTF - -CTrade g_trade; -string g_sym; -datetime g_lastSignalBarTime = 0; - -ENUM_ORDER_TYPE_FILLING ResolveFilling(const string sym) -{ - const long mask = SymbolInfoInteger(sym, SYMBOL_FILLING_MODE); - if((mask & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC) - return ORDER_FILLING_IOC; - if((mask & SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK) - return ORDER_FILLING_FOK; - return ORDER_FILLING_RETURN; -} - -bool SpreadOk(const string sym) -{ - if(InpMaxSpreadPoints <= 0) - return true; - const double point = SymbolInfoDouble(sym, SYMBOL_POINT); - if(point <= 0.0) - return false; - const double spreadPts = (SymbolInfoDouble(sym, SYMBOL_ASK) - SymbolInfoDouble(sym, SYMBOL_BID)) / point; - return (spreadPts <= (double)InpMaxSpreadPoints); -} - -bool IsNewSignalBar() -{ - const datetime t = iTime(g_sym, InpSignalTF, 0); - if(t <= 0) - return false; - if(t == g_lastSignalBarTime) - return false; - g_lastSignalBarTime = t; - return true; -} - -double BodyPoints(const string s, const ENUM_TIMEFRAMES tf, const int sh) -{ - const double o = iOpen(s, tf, sh); - const double c = iClose(s, tf, sh); - const double point = SymbolInfoDouble(s, SYMBOL_POINT); - if(point <= 0.0) - return 0.0; - return MathAbs(c - o) / point; -} - -bool BullishEngulfing(const string s, const ENUM_TIMEFRAMES tf, const int sh) -{ - if(!InpUseEngulfing) - return false; - const double o1 = iOpen(s, tf, sh); - const double c1 = iClose(s, tf, sh); - const double o2 = iOpen(s, tf, sh + 1); - const double c2 = iClose(s, tf, sh + 1); - if(c2 >= o2) - return false; - if(c1 <= o1) - return false; - if(BodyPoints(s, tf, sh) < InpMinBodyPoints || BodyPoints(s, tf, sh + 1) < InpMinBodyPoints) - return false; - return (o1 <= c2 && c1 >= o2); -} - -bool BearishEngulfing(const string s, const ENUM_TIMEFRAMES tf, const int sh) -{ - if(!InpUseEngulfing) - return false; - const double o1 = iOpen(s, tf, sh); - const double c1 = iClose(s, tf, sh); - const double o2 = iOpen(s, tf, sh + 1); - const double c2 = iClose(s, tf, sh + 1); - if(c2 <= o2) - return false; - if(c1 >= o1) - return false; - if(BodyPoints(s, tf, sh) < InpMinBodyPoints || BodyPoints(s, tf, sh + 1) < InpMinBodyPoints) - return false; - return (o1 >= c2 && c1 <= o2); -} - -bool BullishHammer(const string s, const ENUM_TIMEFRAMES tf, const int sh) -{ - if(!InpUseHammerPin) - return false; - const double o = iOpen(s, tf, sh); - const double c = iClose(s, tf, sh); - const double h = iHigh(s, tf, sh); - const double l = iLow(s, tf, sh); - const double body = MathAbs(c - o); - const double lower = MathMin(o, c) - l; - const double upper = h - MathMax(o, c); - const double point = SymbolInfoDouble(s, SYMBOL_POINT); - if(point <= 0.0 || body < point * 0.1) - return false; - return (lower >= InpHammerWickRatio * body && upper <= body); -} - -bool BearishPinBar(const string s, const ENUM_TIMEFRAMES tf, const int sh) -{ - if(!InpUseHammerPin) - return false; - const double o = iOpen(s, tf, sh); - const double c = iClose(s, tf, sh); - const double h = iHigh(s, tf, sh); - const double l = iLow(s, tf, sh); - const double body = MathAbs(c - o); - const double lower = MathMin(o, c) - l; - const double upper = h - MathMax(o, c); - const double point = SymbolInfoDouble(s, SYMBOL_POINT); - if(point <= 0.0 || body < point * 0.1) - return false; - return (upper >= InpHammerWickRatio * body && lower <= body); -} - -bool BullishPatternBar(const string s, const ENUM_TIMEFRAMES tf, const int sh) -{ - return BullishEngulfing(s, tf, sh) || BullishHammer(s, tf, sh); -} - -bool BearishPatternBar(const string s, const ENUM_TIMEFRAMES tf, const int sh) -{ - return BearishEngulfing(s, tf, sh) || BearishPinBar(s, tf, sh); -} - -bool HtfBullishClosedBar(const string s, const ENUM_TIMEFRAMES htf) -{ - return (iClose(s, htf, 1) > iOpen(s, htf, 1)); -} - -bool HtfBearishClosedBar(const string s, const ENUM_TIMEFRAMES htf) -{ - return (iClose(s, htf, 1) < iOpen(s, htf, 1)); -} - -bool ConfirmLong(const string s) -{ - if(!InpRequireHtfCandleDir && !InpRequireHtfPattern) - return true; - - if(InpRequireHtfCandleDir && !HtfBullishClosedBar(s, InpConfirmTF)) - return false; - - if(InpRequireHtfPattern && !BullishPatternBar(s, InpConfirmTF, 1)) - return false; - - return true; -} - -bool ConfirmShort(const string s) -{ - if(!InpRequireHtfCandleDir && !InpRequireHtfPattern) - return true; - - if(InpRequireHtfCandleDir && !HtfBearishClosedBar(s, InpConfirmTF)) - return false; - - if(InpRequireHtfPattern && !BearishPatternBar(s, InpConfirmTF, 1)) - return false; - - return true; -} - -bool ValidatedLongSetup(const string s) -{ - if(!BullishPatternBar(s, InpSignalTF, 1)) - return false; - return ConfirmLong(s); -} - -bool ValidatedShortSetup(const string s) -{ - if(!BearishPatternBar(s, InpSignalTF, 1)) - return false; - return ConfirmShort(s); -} - -bool HasOurPosition(const string s, const int magic, int &dir) -{ - dir = -1; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - const ulong ticket = PositionGetTicket(i); - if(ticket == 0 || !PositionSelectByTicket(ticket)) - continue; - if(PositionGetString(POSITION_SYMBOL) != s) - continue; - if((int)PositionGetInteger(POSITION_MAGIC) != magic) - continue; - const long typ = PositionGetInteger(POSITION_TYPE); - dir = (typ == POSITION_TYPE_BUY) ? 0 : 1; - return true; - } - return false; -} - -bool CloseOurPositions(const string s, const int magic) -{ - bool ok = true; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - const ulong ticket = PositionGetTicket(i); - if(ticket == 0 || !PositionSelectByTicket(ticket)) - continue; - if(PositionGetString(POSITION_SYMBOL) != s) - continue; - if((int)PositionGetInteger(POSITION_MAGIC) != magic) - continue; - if(!g_trade.PositionClose(ticket)) - ok = false; - } - return ok; -} - -int OnInit() -{ - g_sym = (StringLen(InpSymbol) == 0) ? _Symbol : InpSymbol; - if(!SymbolSelect(g_sym, true)) - { - Print("SymbolSelect failed: ", g_sym); - return INIT_FAILED; - } - - g_trade.SetExpertMagicNumber(InpMagic); - g_trade.SetDeviationInPoints(InpSlippagePoints); - g_trade.SetTypeFilling(ResolveFilling(g_sym)); - - return INIT_SUCCEEDED; -} - -void OnDeinit(const int reason) -{ -} - -void OnTick() -{ - if(!IsNewSignalBar()) - return; - - if(Bars(g_sym, InpSignalTF) < 5 || Bars(g_sym, InpConfirmTF) < 5) - return; - - if(!SpreadOk(g_sym)) - return; - - const bool longSetup = ValidatedLongSetup(g_sym); - const bool shortSetup = ValidatedShortSetup(g_sym); - - int dir = -1; - bool has = HasOurPosition(g_sym, InpMagic, dir); - - if(has) - { - if(dir == 0) - { - bool adverse = false; - if(InpCloseOnAdversePattern) - { - if(BearishPatternBar(g_sym, InpSignalTF, 1) || BearishPatternBar(g_sym, InpConfirmTF, 1)) - adverse = true; - } - const bool reverse = (InpCloseOnReverseSignal && shortSetup); - if(adverse || reverse) - CloseOurPositions(g_sym, InpMagic); - } - else if(dir == 1) - { - bool adverse = false; - if(InpCloseOnAdversePattern) - { - if(BullishPatternBar(g_sym, InpSignalTF, 1) || BullishPatternBar(g_sym, InpConfirmTF, 1)) - adverse = true; - } - const bool reverse = (InpCloseOnReverseSignal && longSetup); - if(adverse || reverse) - CloseOurPositions(g_sym, InpMagic); - } - } - - has = HasOurPosition(g_sym, InpMagic, dir); - - if(InpOnlyOnePosition && has) - return; - - if(longSetup && !shortSetup) - { - const double ask = SymbolInfoDouble(g_sym, SYMBOL_ASK); - g_trade.Buy(InpLots, g_sym, ask, 0.0, 0.0, "CandlePattern long"); - } - else if(shortSetup && !longSetup) - { - const double bid = SymbolInfoDouble(g_sym, SYMBOL_BID); - g_trade.Sell(InpLots, g_sym, bid, 0.0, 0.0, "CandlePattern short"); - } -} diff --git a/lab/EAs/CocktailPlus.mq5 b/lab/EAs/CocktailPlus.mq5 deleted file mode 100644 index e0c449c..0000000 --- a/lab/EAs/CocktailPlus.mq5 +++ /dev/null @@ -1,1069 +0,0 @@ -//+------------------------------------------------------------------+ -//| EMACrossOver.mq5 | -//| Copyright 2025, MetaQuotes Ltd. | -//| https://www.mql5.com | -//+------------------------------------------------------------------+ -#property link "https://www.mql5.com" -#property copyright "Copyright 2025, MetaQuotes Ltd." -#property version "1.00" -#include -//--- Eingabeparameter (Input Parameters) - Optimized Profitable Parameters -input int EMA_Periode = 51; // EMA Periode -input double PreisSchwelle = 300.0; // Preisbewegung Schwelle in Pips -input double SteigungSchwelle = 40.0; // EMA Steigung Schwelle in Pips -input int ÜberwachungTimeout = 1600; // Überwachungszeit in Sekunden -input double TrailingStop = 100.0; // Gleitender Stop in Pips -input double LotGröße = 0.03; // Handelsvolumen -input int MagicNumber = 12350; // Magic Number für Trades -input bool UseSpreadAdjustment = true; // Spread-Anpassung verwenden -input ENUM_TIMEFRAMES Timeframe = PERIOD_H1; // Zeitraum für Analyse -input bool UseBarData = true; // Bar-Daten statt Tick-Daten verwenden -input int MaxTradesPerCrossover = 6; // Maximale Trades pro Crossover-Ereignis -input int ProfitCheckBars = 11; // Bars bis zur Profit-Prüfung -input bool CloseUnprofitableTrades = true; // Unprofitable Trades nach X Bars schließen -//--- V-Shape Reversal Protection Parameters -input bool UseRSIFilter = true; // RSI Filter verwenden (vermeidet Extreme) -input int RSIPeriod = 14; // RSI Periode -input double RSIOverbought = 71.0; // RSI Überkauft Level -input double RSIOversold = 31.0; // RSI Überverkauft Level -input bool UseMomentumConfirmation = true; // Momentum-Bestätigung verwenden -input int MomentumBars = 5; // Bars für Momentum-Prüfung -input bool UsePullbackConfirmation = true; // Pullback-Bestätigung verwenden -input double PullbackThreshold = 0.5; // Pullback-Schwelle (50% der Bewegung) -input bool UseEarlyReversalDetection = true; // Frühe Reversal-Erkennung -input double ReversalThreshold = 0.5; // Reversal-Schwelle (50% Rückgang) -input bool UseMAEProtection = true; // Maximum Adverse Excursion Schutz -input double MAEThreshold = 150.0; // MAE Schwelle in Pips -input int MAECheckBars = 5; // Bars für MAE-Prüfung -//--- V-Shape Reversal Trading Parameters -input bool UseVShapeReversalTrading = true; // V-Shape Reversal Trading aktivieren -input double VShapeReversalStopLoss = 100.0; // Stop Loss für V-Shape Reversal Trades (Pips) -input double VShapeReversalLotSize = 0.01; // Lot-Größe für V-Shape Trades (konservativer) -input bool UseRSI50Crossover = false; // RSI 50 Crossover für Haupt-Trades verwenden -input int RSICrossBars = 4; // Bars für RSI Crossover Bestätigung - -//--- Globale Variablen (Global Variables) -int ema_handle; // EMA Indicator Handle -int rsi_handle; // RSI Indicator Handle -double ema_array[]; // Array für EMA -double rsi_array[]; // Array für RSI -datetime letzte_überwachung_zeit; // Zeit der letzten Überwachung -bool überwachung_aktiv = false; // Überwachungsstatus -bool preis_trigger_aktiv = false; // Preis-Trigger Status -bool steigung_trigger_aktiv = false; // Steigungs-Trigger Status -int ticket = 0; // Trade Ticket -CTrade trade; // CTrade Objekt -int trades_in_current_crossover = 0; // Anzahl Trades im aktuellen Crossover -bool crossover_detected = false; // Crossover erkannt -datetime trade_open_time = 0; // Zeitpunkt des Trade-Öffnens -double entry_price = 0; // Einstiegspreis für MAE-Prüfung -double max_favorable_excursion = 0; // Maximale günstige Bewegung -double max_adverse_excursion = 0; // Maximale ungünstige Bewegung -double trigger_price = 0; // Preis beim Trigger für Pullback-Prüfung -bool is_vshape_trade = false; // Ist aktueller Trade ein V-Shape Reversal Trade -double last_rsi = 50.0; // Letzter RSI-Wert für Crossover-Erkennung -bool rsi_crossed_above_50 = false; // RSI über 50 gekreuzt -bool rsi_crossed_below_50 = false; // RSI unter 50 gekreuzt - -//+------------------------------------------------------------------+ -//| Expert initialization function | -//+------------------------------------------------------------------+ -int OnInit() - { - //--- CTrade konfigurieren (Configure CTrade) - trade.SetExpertMagicNumber(MagicNumber); - trade.SetDeviationInPoints(10); - trade.SetTypeFilling(ORDER_FILLING_IOC); - - //--- EMA Indicator Handle erstellen (Create EMA indicator handle) - ema_handle = iMA(_Symbol, Timeframe, EMA_Periode, 0, MODE_EMA, PRICE_CLOSE); - - if(ema_handle == INVALID_HANDLE) - { - Print("Fehler beim Erstellen des EMA Indicators"); - return(INIT_FAILED); - } - - //--- RSI Indicator Handle erstellen (Create RSI indicator handle) - if(UseRSIFilter || UseVShapeReversalTrading || UseRSI50Crossover) - { - rsi_handle = iRSI(_Symbol, Timeframe, RSIPeriod, PRICE_CLOSE); - - if(rsi_handle == INVALID_HANDLE) - { - Print("Fehler beim Erstellen des RSI Indicators"); - return(INIT_FAILED); - } - - ArraySetAsSeries(rsi_array, true); - - // Initialisiere RSI Tracking (Initialize RSI tracking) - if(UseRSI50Crossover) - { - BerechneRSI(); - if(ArraySize(rsi_array) > 0) - { - last_rsi = rsi_array[0]; - rsi_crossed_above_50 = (last_rsi > 50.0); - rsi_crossed_below_50 = (last_rsi < 50.0); - } - } - } - - //--- Arrays initialisieren (Initialize arrays) - ArraySetAsSeries(ema_array, true); - - //--- Arrays mit aktuellen Werten füllen (Fill arrays with current values) - BerechneEMA(); - if(UseRSIFilter) - { - BerechneRSI(); - } - - Print("EMA EA initialisiert - Periode: ", EMA_Periode, " Timeframe: ", EnumToString(Timeframe), " Handle: ", ema_handle); - if(UseRSIFilter) - { - Print("RSI Filter aktiviert - Periode: ", RSIPeriod); - } - return(INIT_SUCCEEDED); - } - -//+------------------------------------------------------------------+ -//| Expert deinitialization function | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) - { - //--- Indicator Handle freigeben (Release indicator handle) - if(ema_handle != INVALID_HANDLE) - { - IndicatorRelease(ema_handle); - } - - if((UseRSIFilter || UseVShapeReversalTrading || UseRSI50Crossover) && rsi_handle != INVALID_HANDLE) - { - IndicatorRelease(rsi_handle); - } - - Print("EA beendet - Grund: ", reason); -} - -//+------------------------------------------------------------------+ -//| Expert tick function | -//+------------------------------------------------------------------+ -void OnTick() - { - //--- Bar-Daten oder Tick-Daten verwenden (Use bar data or tick data) - if(UseBarData) - { - //--- Nur bei neuen Bars ausführen (Only execute on new bars) - static datetime last_bar_time = 0; - datetime current_bar_time = iTime(_Symbol, Timeframe, 0); - - if(current_bar_time == last_bar_time) - { - return; // Kein neuer Bar, nichts tun - } - - last_bar_time = current_bar_time; - } - - //--- EMA Werte berechnen (Calculate EMA values) - BerechneEMA(); - - //--- RSI Werte berechnen (Calculate RSI values) - if(UseRSIFilter || UseVShapeReversalTrading || UseRSI50Crossover) - { - BerechneRSI(); - - //--- RSI Crossover Tracking für Haupt-Trades (RSI Crossover tracking for main trades) - if(UseRSI50Crossover && ArraySize(rsi_array) >= 2) - { - double current_rsi = rsi_array[0]; - double previous_rsi = rsi_array[1]; - - // Prüfe RSI Crossover über 50 (Check RSI crossover above 50) - if(previous_rsi <= 50.0 && current_rsi > 50.0) - { - rsi_crossed_above_50 = true; - rsi_crossed_below_50 = false; - Print("TRACE: RSI über 50 gekreuzt - Vorher: ", previous_rsi, " Jetzt: ", current_rsi); - } - // Prüfe RSI Crossover unter 50 (Check RSI crossover below 50) - else if(previous_rsi >= 50.0 && current_rsi < 50.0) - { - rsi_crossed_below_50 = true; - rsi_crossed_above_50 = false; - Print("TRACE: RSI unter 50 gekreuzt - Vorher: ", previous_rsi, " Jetzt: ", current_rsi); - } - - last_rsi = current_rsi; - } - } - - //--- Debug: Aktuelle Werte ausgeben (Debug: Output current values) - if(ArraySize(ema_array) > 0) - { - double aktueller_close = iClose(_Symbol, Timeframe, 0); - double ema_aktuell = ema_array[0]; - double ema_vorher = ema_array[1]; - double preis_abstand = MathAbs(aktueller_close - ema_aktuell) / _Point; - double steigung = (ema_aktuell - ema_vorher) / _Point; - - if(UseBarData) - { - Print("=== DEBUG INFO (Neuer Bar) ==="); - Print("Bar Zeit: ", TimeToString(iTime(_Symbol, Timeframe, 0))); - } - else - { - Print("=== DEBUG INFO (Tick) ==="); - } - - Print("Aktueller Close: ", aktueller_close); - Print("EMA: ", ema_aktuell); - Print("Preis-Abstand: ", preis_abstand, " Pips"); - Print("EMA Steigung: ", steigung, " Pips"); - Print("Differenz Close-EMA: ", aktueller_close - ema_aktuell); - Print("Preis-Trigger: ", preis_trigger_aktiv, " Steigungs-Trigger: ", steigung_trigger_aktiv); - Print("Überwachung aktiv: ", überwachung_aktiv); - Print("Position offen: ", PositionSelect(_Symbol)); - Print("Trades im aktuellen Crossover: ", trades_in_current_crossover, "/", MaxTradesPerCrossover); - Print("=================="); - } - - //--- Überwachung prüfen (Check monitoring) - if(überwachung_aktiv) - { - if(UseBarData) - { - // Bar-basierte Überwachungszeit - int bars_since_monitoring = iBarShift(_Symbol, Timeframe, letzte_überwachung_zeit); - int timeout_bars = (int)(ÜberwachungTimeout / PeriodSeconds(Timeframe)); - - if(bars_since_monitoring > timeout_bars) - { - überwachung_aktiv = false; - preis_trigger_aktiv = false; - steigung_trigger_aktiv = false; - Print("Überwachung beendet - Bar-basierte Zeitüberschreitung (", bars_since_monitoring, " Bars)"); - } - } - else - { - // Tick-basierte Überwachungszeit - if(TimeCurrent() - letzte_überwachung_zeit > ÜberwachungTimeout) - { - überwachung_aktiv = false; - preis_trigger_aktiv = false; - steigung_trigger_aktiv = false; - Print("Überwachung beendet - Tick-basierte Zeitüberschreitung"); - } - } - } - - //--- Trigger-Bedingungen prüfen (Check trigger conditions) - PrüfeTrigger(); - - //--- Trade Management (Trade management) - VerwalteTrades(); - - //--- MAE Protection prüfen (Check MAE protection) - if(UseMAEProtection && PositionSelect(_Symbol)) - { - PrüfeMAE(); - } -} - -//+------------------------------------------------------------------+ -//| EMA Berechnung (EMA Calculation) | -//+------------------------------------------------------------------+ -void BerechneEMA() -{ - //--- EMA Werte vom Indicator kopieren (Copy EMA values from indicator) - int copied = CopyBuffer(ema_handle, 0, 0, 3, ema_array); - - if(copied <= 0) - { - Print("TRACE: Fehler beim Kopieren der EMA Werte - Copied: ", copied); - return; - } - - Print("TRACE: EMA Werte kopiert: ", copied, " Bars"); - Print("TRACE: EMA [0]: ", ema_array[0], " [1]: ", ema_array[1], " [2]: ", ema_array[2]); -} - -//+------------------------------------------------------------------+ -//| RSI Berechnung (RSI Calculation) | -//+------------------------------------------------------------------+ -void BerechneRSI() -{ - if(!UseRSIFilter || rsi_handle == INVALID_HANDLE) - return; - - //--- RSI Werte vom Indicator kopieren (Copy RSI values from indicator) - int copied = CopyBuffer(rsi_handle, 0, 0, 3, rsi_array); - - if(copied <= 0) - { - Print("TRACE: Fehler beim Kopieren der RSI Werte - Copied: ", copied); - return; - } - - Print("TRACE: RSI Werte kopiert: ", copied, " Bars"); - Print("TRACE: RSI [0]: ", rsi_array[0], " [1]: ", rsi_array[1], " [2]: ", rsi_array[2]); -} - -//+------------------------------------------------------------------+ -//| Trigger-Bedingungen prüfen (Check trigger conditions) | -//+------------------------------------------------------------------+ -void PrüfeTrigger() -{ - if(ArraySize(ema_array) < 2) - { - Print("TRACE: Array zu klein - Größe: ", ArraySize(ema_array)); - return; - } - - //--- Aktuelle Werte (Current values) - double aktueller_preis = SymbolInfoDouble(_Symbol, SYMBOL_BID); - double aktueller_ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); - double aktueller_close = iClose(_Symbol, Timeframe, 0); - double pips_multiplier = (_Digits == 3 || _Digits == 5) ? 10.0 : 1.0; - - //--- EMA Werte in Variablen (EMA values in variables) - double ema_aktuell = ema_array[0]; - double ema_vorher = ema_array[1]; - - //--- EMA Crossover Erkennung (EMA Crossover Detection) - // Prüfe ob Preis die EMA kreuzt (Check if price crosses EMA) - static double last_close = 0; - static double last_ema = 0; - - if(last_close != 0 && last_ema != 0) - { - bool crossover_bullish = (last_close <= last_ema) && (aktueller_close > ema_aktuell); - bool crossover_bearish = (last_close >= last_ema) && (aktueller_close < ema_aktuell); - - //--- Neues Crossover-Ereignis erkannt (New crossover event detected) - if(crossover_bullish || crossover_bearish) - { - trades_in_current_crossover = 0; // Reset trade counter - Print("TRACE: EMA Crossover erkannt - ", (crossover_bullish ? "BULLISH" : "BEARISH"), " - Trade-Counter zurückgesetzt"); - Print("TRACE: Vorher: Close=", last_close, " EMA=", last_ema, " Jetzt: Close=", aktueller_close, " EMA=", ema_aktuell); - } - } - - //--- Aktuelle Werte für nächsten Vergleich speichern (Save current values for next comparison) - last_close = aktueller_close; - last_ema = ema_aktuell; - - //--- Preisbewegung zur EMA prüfen (Check price action to EMA) - double preis_abstand = MathAbs(aktueller_close - ema_aktuell) / _Point / pips_multiplier; - - Print("TRACE: Preis-Abstand: ", preis_abstand, " Pips (Schwelle: ", PreisSchwelle, ")"); - Print("TRACE: Close: ", aktueller_close, " EMA: ", ema_aktuell); - Print("TRACE: Trades im aktuellen Crossover: ", trades_in_current_crossover, "/", MaxTradesPerCrossover); - - if(preis_abstand > PreisSchwelle && !preis_trigger_aktiv) - { - preis_trigger_aktiv = true; - Print("TRACE: Preis-Trigger aktiviert: ", preis_abstand, " Pips"); - } - - //--- EMA Steigung prüfen (Check EMA slope) - double steigung = (ema_aktuell - ema_vorher) / _Point / pips_multiplier; - - Print("TRACE: EMA Steigung: ", steigung, " Pips (Schwelle: ", SteigungSchwelle, ")"); - - if(MathAbs(steigung) > SteigungSchwelle && !steigung_trigger_aktiv) - { - steigung_trigger_aktiv = true; - Print("TRACE: Steigungs-Trigger aktiviert: ", steigung, " Pips"); - } - - //--- Überwachung starten wenn beide Trigger aktiv sind (Start monitoring when both triggers are active) - if(preis_trigger_aktiv && steigung_trigger_aktiv && !überwachung_aktiv) - { - überwachung_aktiv = true; - trigger_price = aktueller_close; // Preis beim Trigger speichern für Pullback-Prüfung - - if(UseBarData) - { - letzte_überwachung_zeit = iTime(_Symbol, Timeframe, 0); // Aktuelle Bar-Zeit - Print("TRACE: Überwachung gestartet - Beide Trigger aktiv (Bar: ", TimeToString(letzte_überwachung_zeit), ")"); - } - else - { - letzte_überwachung_zeit = TimeCurrent(); // Aktuelle Tick-Zeit - Print("TRACE: Überwachung gestartet - Beide Trigger aktiv (Tick)"); - } - } - - //--- Trade platzieren wenn Überwachung aktiv und Preis über/unter EMA (Place trade when monitoring active and price above/below EMA) - if(überwachung_aktiv) - { - bool bullish_signal = aktueller_close > ema_aktuell; - bool bearish_signal = aktueller_close < ema_aktuell; - - Print("TRACE: Signal Check - Bullish: ", bullish_signal, " Bearish: ", bearish_signal); - Print("TRACE: Close: ", aktueller_close, " EMA: ", ema_aktuell); - Print("TRACE: Differenz: ", aktueller_close - ema_aktuell); - - //--- Trade-Limit prüfen (Check trade limit) - if(trades_in_current_crossover >= MaxTradesPerCrossover) - { - Print("TRACE: Trade-Limit erreicht (", MaxTradesPerCrossover, ") - Kein neuer Trade"); - return; - } - - //--- Neue Strategie: V-Shape Reversal Trading + RSI 50 Crossover für Haupt-Trades - if(!PositionSelect(_Symbol)) - { - //--- 1. Prüfe auf V-Shape Reversal Pattern (Check for V-Shape Reversal Pattern) - if(UseVShapeReversalTrading) - { - ENUM_ORDER_TYPE vshape_direction = PrüfeVShapePattern(aktueller_close, ema_aktuell); - - if(vshape_direction == ORDER_TYPE_BUY) - { - // V-Shape erkannt: Preis war hoch, jetzt fallend -> REVERSE TRADE (SELL) - Print("TRACE: V-SHAPE REVERSAL erkannt - REVERSE TRADE: VERKAUF"); - if(PlatziereVShapeTrade(ORDER_TYPE_SELL, aktueller_close, ema_aktuell)) - { - trades_in_current_crossover++; - entry_price = aktueller_close; - max_favorable_excursion = 0; - max_adverse_excursion = 0; - is_vshape_trade = true; - } - return; // V-Shape Trade platziert, keine weiteren Trades - } - else if(vshape_direction == ORDER_TYPE_SELL) - { - // V-Shape erkannt: Preis war niedrig, jetzt steigend -> REVERSE TRADE (BUY) - Print("TRACE: V-SHAPE REVERSAL erkannt - REVERSE TRADE: KAUF"); - if(PlatziereVShapeTrade(ORDER_TYPE_BUY, aktueller_close, ema_aktuell)) - { - trades_in_current_crossover++; - entry_price = aktueller_close; - max_favorable_excursion = 0; - max_adverse_excursion = 0; - is_vshape_trade = true; - } - return; // V-Shape Trade platziert, keine weiteren Trades - } - } - - //--- 2. Haupt-Trend Trade: Warte auf RSI 50 Crossover (Main Trend Trade: Wait for RSI 50 Crossover) - if(bullish_signal) - { - // Prüfe RSI 50 Crossover für KAUF (Check RSI 50 crossover for BUY) - bool rsi_ready = true; - if(UseRSI50Crossover) - { - rsi_ready = rsi_crossed_above_50 && (ArraySize(rsi_array) > 0 && rsi_array[0] > 50.0); - if(!rsi_ready) - { - Print("TRACE: KAUF-Signal wartet auf RSI 50 Crossover - RSI: ", (ArraySize(rsi_array) > 0 ? rsi_array[0] : 0)); - } - } - - if(rsi_ready) - { - Print("TRACE: Versuche KAUF-Trade zu platzieren (Trade #", trades_in_current_crossover + 1, ")"); - if(PlatziereTrade(ORDER_TYPE_BUY)) - { - trades_in_current_crossover++; - entry_price = aktueller_close; - max_favorable_excursion = 0; - max_adverse_excursion = 0; - is_vshape_trade = false; - rsi_crossed_above_50 = false; // Reset nach Trade - } - } - } - else if(bearish_signal) - { - // Prüfe RSI 50 Crossover für VERKAUF (Check RSI 50 crossover for SELL) - bool rsi_ready = true; - if(UseRSI50Crossover) - { - rsi_ready = rsi_crossed_below_50 && (ArraySize(rsi_array) > 0 && rsi_array[0] < 50.0); - if(!rsi_ready) - { - Print("TRACE: VERKAUF-Signal wartet auf RSI 50 Crossover - RSI: ", (ArraySize(rsi_array) > 0 ? rsi_array[0] : 0)); - } - } - - if(rsi_ready) - { - Print("TRACE: Versuche VERKAUF-Trade zu platzieren (Trade #", trades_in_current_crossover + 1, ")"); - if(PlatziereTrade(ORDER_TYPE_SELL)) - { - trades_in_current_crossover++; - entry_price = aktueller_close; - max_favorable_excursion = 0; - max_adverse_excursion = 0; - is_vshape_trade = false; - rsi_crossed_below_50 = false; // Reset nach Trade - } - } - } - } - else if(PositionSelect(_Symbol)) - { - Print("TRACE: Position bereits offen - kein neuer Trade"); - } - } -} - -//+------------------------------------------------------------------+ -//| V-Shape Pattern Detection | -//+------------------------------------------------------------------+ -ENUM_ORDER_TYPE PrüfeVShapePattern(double aktueller_preis, double ema_aktuell) -{ - if(!UseVShapeReversalTrading || ArraySize(rsi_array) < 3) - return WRONG_VALUE; - - double pips_multiplier = (_Digits == 3 || _Digits == 5) ? 10.0 : 1.0; - double current_rsi = rsi_array[0]; - double previous_rsi = rsi_array[1]; - double rsi_before = rsi_array[2]; - - //--- Hole Preis-Historie für V-Shape Erkennung (Get price history for V-Shape detection) - double close_0 = iClose(_Symbol, Timeframe, 0); - double close_1 = iClose(_Symbol, Timeframe, 1); - double close_2 = iClose(_Symbol, Timeframe, 2); - double close_3 = iClose(_Symbol, Timeframe, 3); - - if(close_1 == 0 || close_2 == 0 || close_3 == 0) - return WRONG_VALUE; - - //--- V-Shape Top Pattern: Preis war hoch (RSI überkauft), jetzt fallend (V-Shape Top Pattern) - // Pattern: Preis steigt -> erreicht Hoch -> fällt (RSI: hoch -> fällt) - bool vshape_top = false; - if(current_rsi < previous_rsi && previous_rsi > RSIOverbought) - { - // RSI war überkauft und fällt jetzt - if(close_0 < close_1 && close_1 < close_2) - { - // Preis fällt kontinuierlich - double price_drop = (close_2 - close_0) / _Point / pips_multiplier; - if(price_drop > 100.0) // Mindest-Fall von 100 Pips - { - vshape_top = true; - Print("TRACE: V-SHAPE TOP erkannt - RSI fällt von ", previous_rsi, " zu ", current_rsi); - Print("TRACE: Preis fällt von ", close_2, " zu ", close_0, " (", price_drop, " Pips)"); - } - } - } - - //--- V-Shape Bottom Pattern: Preis war niedrig (RSI überverkauft), jetzt steigend (V-Shape Bottom Pattern) - // Pattern: Preis fällt -> erreicht Tief -> steigt (RSI: niedrig -> steigt) - bool vshape_bottom = false; - if(current_rsi > previous_rsi && previous_rsi < RSIOversold) - { - // RSI war überverkauft und steigt jetzt - if(close_0 > close_1 && close_1 > close_2) - { - // Preis steigt kontinuierlich - double price_rise = (close_0 - close_2) / _Point / pips_multiplier; - if(price_rise > 100.0) // Mindest-Anstieg von 100 Pips - { - vshape_bottom = true; - Print("TRACE: V-SHAPE BOTTOM erkannt - RSI steigt von ", previous_rsi, " zu ", current_rsi); - Print("TRACE: Preis steigt von ", close_2, " zu ", close_0, " (", price_rise, " Pips)"); - } - } - } - - if(vshape_top) - return ORDER_TYPE_SELL; // Reverse Trade: Verkauf bei V-Shape Top - else if(vshape_bottom) - return ORDER_TYPE_BUY; // Reverse Trade: Kauf bei V-Shape Bottom - - return WRONG_VALUE; // Kein V-Shape erkannt -} - -//+------------------------------------------------------------------+ -//| V-Shape Reversal Trade platzieren (Place V-Shape Reversal Trade)| -//+------------------------------------------------------------------+ -bool PlatziereVShapeTrade(ENUM_ORDER_TYPE order_type, double aktueller_preis, double ema_aktuell) -{ - double pips_multiplier = (_Digits == 3 || _Digits == 5) ? 10.0 : 1.0; - double stop_loss_pips = VShapeReversalStopLoss; - double stop_loss_price = 0; - - Print("TRACE: Versuche V-SHAPE REVERSAL Trade zu platzieren - Typ: ", (order_type == ORDER_TYPE_BUY) ? "KAUF" : "VERKAUF"); - Print("TRACE: Lot: ", VShapeReversalLotSize, " Stop Loss: ", stop_loss_pips, " Pips"); - - //--- Berechne Stop Loss (Calculate Stop Loss) - if(order_type == ORDER_TYPE_BUY) - { - stop_loss_price = aktueller_preis - (stop_loss_pips * _Point * pips_multiplier); - } - else - { - stop_loss_price = aktueller_preis + (stop_loss_pips * _Point * pips_multiplier); - } - - bool success = false; - - if(order_type == ORDER_TYPE_BUY) - { - success = trade.Buy(VShapeReversalLotSize, _Symbol, 0, stop_loss_price, 0, "V-Shape Reversal Trade"); - } - else - { - success = trade.Sell(VShapeReversalLotSize, _Symbol, 0, stop_loss_price, 0, "V-Shape Reversal Trade"); - } - - if(success) - { - ticket = (int)trade.ResultOrder(); - Print("TRACE: V-SHAPE Trade erfolgreich platziert: ", (order_type == ORDER_TYPE_BUY) ? "KAUF" : "VERKAUF", " Ticket: ", ticket); - Print("TRACE: Stop Loss: ", stop_loss_price); - - //--- Trade-Öffnungszeit speichern (Save trade opening time) - trade_open_time = iTime(_Symbol, Timeframe, 0); - Print("TRACE: Trade-Öffnungszeit: ", TimeToString(trade_open_time)); - - //--- Überwachung zurücksetzen (Reset monitoring) - überwachung_aktiv = false; - preis_trigger_aktiv = false; - steigung_trigger_aktiv = false; - - return true; - } - else - { - Print("TRACE: Fehler beim Platzieren des V-SHAPE Trades - Retcode: ", trade.ResultRetcode()); - Print("TRACE: Fehlerbeschreibung: ", trade.ResultRetcodeDescription()); - - return false; - } -} - -//+------------------------------------------------------------------+ -//| Trade platzieren (Place trade) | -//+------------------------------------------------------------------+ -bool PlatziereTrade(ENUM_ORDER_TYPE order_type) -{ - Print("TRACE: Versuche Trade zu platzieren - Typ: ", (order_type == ORDER_TYPE_BUY) ? "KAUF" : "VERKAUF"); - Print("TRACE: Lot: ", LotGröße); - - bool success = false; - - if(order_type == ORDER_TYPE_BUY) - { - success = trade.Buy(LotGröße, _Symbol, 0, 0, 0, "EMA Crossover Trade"); - } - else - { - success = trade.Sell(LotGröße, _Symbol, 0, 0, 0, "EMA Crossover Trade"); - } - - if(success) - { - ticket = (int)trade.ResultOrder(); - Print("TRACE: Trade erfolgreich platziert: ", (order_type == ORDER_TYPE_BUY) ? "KAUF" : "VERKAUF", " Ticket: ", ticket); - - //--- Trade-Öffnungszeit speichern (Save trade opening time) - trade_open_time = iTime(_Symbol, Timeframe, 0); - Print("TRACE: Trade-Öffnungszeit: ", TimeToString(trade_open_time)); - - //--- Überwachung zurücksetzen (Reset monitoring) - überwachung_aktiv = false; - preis_trigger_aktiv = false; - steigung_trigger_aktiv = false; - - return true; - } - else - { - Print("TRACE: Fehler beim Platzieren des Trades - Retcode: ", trade.ResultRetcode()); - Print("TRACE: Fehlerbeschreibung: ", trade.ResultRetcodeDescription()); - - return false; - } -} - -//+------------------------------------------------------------------+ -//| Trades verwalten (Manage trades) | -//+------------------------------------------------------------------+ -void VerwalteTrades() -{ - if(!PositionSelect(_Symbol)) - return; - - double position_profit = PositionGetDouble(POSITION_PROFIT); - double position_open_price = PositionGetDouble(POSITION_PRICE_OPEN); - double current_price = PositionGetDouble(POSITION_PRICE_CURRENT); - ENUM_POSITION_TYPE position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); - - double pips_multiplier = (_Digits == 3 || _Digits == 5) ? 10.0 : 1.0; - double trailing_stop_pips = TrailingStop; - - //--- Für V-Shape Trades: Tighter Trailing Stop (For V-Shape trades: Tighter trailing stop) - if(is_vshape_trade) - { - trailing_stop_pips = VShapeReversalStopLoss * 0.5; // 50% des Stop Loss als Trailing - Print("TRACE: V-Shape Trade - Verwendeter Trailing Stop: ", trailing_stop_pips, " Pips"); - } - - //--- Gleitender Stop (Trailing Stop) - nur wenn Position im Profit ist - if(position_profit > 0) // Only apply trailing stop when in profit - { - if(position_type == POSITION_TYPE_BUY) - { - double new_stop_loss = current_price - (trailing_stop_pips * _Point * pips_multiplier); - double current_stop_loss = PositionGetDouble(POSITION_SL); - - // Only move stop loss if new stop is higher than current stop - if(new_stop_loss > current_stop_loss) - { - ÄndereStopLoss(new_stop_loss); - } - } - else if(position_type == POSITION_TYPE_SELL) - { - double new_stop_loss = current_price + (trailing_stop_pips * _Point * pips_multiplier); - double current_stop_loss = PositionGetDouble(POSITION_SL); - - // Only move stop loss if new stop is lower than current stop - if(new_stop_loss < current_stop_loss || current_stop_loss == 0) - { - ÄndereStopLoss(new_stop_loss); - } - } - } - - //--- Ausstieg bei Preis unter/über EMA (Exit when price below/above EMA) - if(ArraySize(ema_array) >= 1) - { - double aktueller_close = iClose(_Symbol, Timeframe, 0); - double ema_aktuell = ema_array[0]; - bool exit_bullish = (position_type == POSITION_TYPE_SELL && aktueller_close > ema_aktuell); - bool exit_bearish = (position_type == POSITION_TYPE_BUY && aktueller_close < ema_aktuell); - - if(exit_bullish || exit_bearish) - { - Print("TRACE: Ausstiegssignal - Close: ", aktueller_close, " EMA: ", ema_aktuell); - SchließePosition("EMA Crossover Exit"); - - Print("TRACE: Position geschlossen - Trade-Counter bleibt bei ", trades_in_current_crossover); - } - } - - //--- Profit-Prüfung nach X Bars (Profit check after X bars) - if(CloseUnprofitableTrades && trade_open_time != 0 && PositionSelect(_Symbol)) - { - Print("TRACE: Profit-Prüfung aktiviert - CloseUnprofitableTrades: ", CloseUnprofitableTrades); - PrüfeProfitNachBars(); - } - else if(!CloseUnprofitableTrades) - { - Print("TRACE: Profit-Prüfung deaktiviert - CloseUnprofitableTrades: ", CloseUnprofitableTrades); - } -} - -//+------------------------------------------------------------------+ -//| Profit-Prüfung nach X Bars (Profit check after X bars) | -//+------------------------------------------------------------------+ -void PrüfeProfitNachBars() -{ - if(!PositionSelect(_Symbol)) - { - return; // Keine Position offen - } - - datetime current_bar_time = iTime(_Symbol, Timeframe, 0); - int bars_since_trade_open = iBarShift(_Symbol, Timeframe, trade_open_time); - - Print("TRACE: Bars seit Trade-Öffnung: ", bars_since_trade_open, "/", ProfitCheckBars); - - //--- Prüfe ob genügend Bars vergangen sind (Check if enough bars have passed) - if(bars_since_trade_open >= ProfitCheckBars) - { - double position_profit = PositionGetDouble(POSITION_PROFIT); - double position_volume = PositionGetDouble(POSITION_VOLUME); - ENUM_POSITION_TYPE position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); - - Print("TRACE: Profit-Prüfung nach ", ProfitCheckBars, " Bars"); - Print("TRACE: Position Profit: ", position_profit, " USD"); - - //--- Schließe Position wenn nicht im Profit (Close position if not in profit) - if(position_profit <= 0) - { - Print("TRACE: Position nicht im Profit - Schließe Position"); - SchließePosition("Profit Check - Unprofitable"); - - //--- Trade-Öffnungszeit zurücksetzen (Reset trade opening time) - trade_open_time = 0; - Print("TRACE: Trade-Öffnungszeit zurückgesetzt"); - } - else - { - Print("TRACE: Position im Profit - Behalte Position"); - //--- Trade-Öffnungszeit zurücksetzen um weitere Prüfungen zu vermeiden (Reset to avoid further checks) - trade_open_time = 0; - } - } -} - -//+------------------------------------------------------------------+ -//| Stop Loss ändern (Modify Stop Loss) | -//+------------------------------------------------------------------+ -void ÄndereStopLoss(double new_stop_loss) -{ - Print("TRACE: Versuche Stop Loss zu ändern auf: ", new_stop_loss); - - bool success = trade.PositionModify(_Symbol, new_stop_loss, PositionGetDouble(POSITION_TP)); - - if(success) - { - Print("TRACE: Stop Loss erfolgreich geändert auf: ", new_stop_loss); - } - else - { - Print("TRACE: Fehler beim Ändern des Stop Loss - Retcode: ", trade.ResultRetcode()); - Print("TRACE: Fehlerbeschreibung: ", trade.ResultRetcodeDescription()); - } -} - -//+------------------------------------------------------------------+ -//| Position schließen (Close position) | -//+------------------------------------------------------------------+ -void SchließePosition(string reason = "Unbekannt") -{ - Print("TRACE: Versuche Position zu schließen - Grund: ", reason); - - bool success = trade.PositionClose(_Symbol); - - if(success) - { - Print("TRACE: Position erfolgreich geschlossen - Grund: ", reason); - //--- Reset MAE tracking (Reset MAE tracking) - entry_price = 0; - max_favorable_excursion = 0; - max_adverse_excursion = 0; - is_vshape_trade = false; - } - else - { - Print("TRACE: Fehler beim Schließen der Position - Retcode: ", trade.ResultRetcode()); - Print("TRACE: Fehlerbeschreibung: ", trade.ResultRetcodeDescription()); - } -} - -//+------------------------------------------------------------------+ -//| V-Shape Reversal Protection Check | -//+------------------------------------------------------------------+ -bool PrüfeVShapeSchutz(ENUM_ORDER_TYPE order_type, double aktueller_preis, double ema_aktuell) -{ - double pips_multiplier = (_Digits == 3 || _Digits == 5) ? 10.0 : 1.0; - - //--- 1. RSI Filter: Vermeide Einstieg bei extremen RSI-Werten (RSI Filter: Avoid entry at extreme RSI values) - if(UseRSIFilter) - { - if(ArraySize(rsi_array) < 1) - { - Print("TRACE: RSI Array zu klein für Filter"); - return false; - } - - double current_rsi = rsi_array[0]; - - if(order_type == ORDER_TYPE_BUY) - { - // Vermeide Einstieg wenn RSI überkauft (Avoid entry when RSI overbought) - if(current_rsi > RSIOverbought) - { - Print("TRACE: RSI Filter blockiert KAUF - RSI: ", current_rsi, " > ", RSIOverbought); - return false; - } - } - else if(order_type == ORDER_TYPE_SELL) - { - // Vermeide Einstieg wenn RSI überverkauft (Avoid entry when RSI oversold) - if(current_rsi < RSIOversold) - { - Print("TRACE: RSI Filter blockiert VERKAUF - RSI: ", current_rsi, " < ", RSIOversold); - return false; - } - } - - Print("TRACE: RSI Filter bestanden - RSI: ", current_rsi); - } - - //--- 2. Momentum Confirmation: Prüfe ob Momentum in Richtung des Trades zeigt (Momentum Confirmation) - if(UseMomentumConfirmation) - { - if(!PrüfeMomentum(order_type)) - { - Print("TRACE: Momentum-Bestätigung fehlgeschlagen"); - return false; - } - Print("TRACE: Momentum-Bestätigung erfolgreich"); - } - - //--- 3. Pullback Confirmation: Warte auf Pullback statt Einstieg am Extrem (Pullback Confirmation) - if(UsePullbackConfirmation && trigger_price != 0) - { - double price_movement = MathAbs(aktueller_preis - trigger_price) / _Point / pips_multiplier; - double distance_to_ema = MathAbs(aktueller_preis - ema_aktuell) / _Point / pips_multiplier; - double initial_distance = MathAbs(trigger_price - ema_aktuell) / _Point / pips_multiplier; - - if(initial_distance > 0) - { - double pullback_ratio = distance_to_ema / initial_distance; - - // Erlaube Einstieg nur wenn Preis zurück zur EMA gezogen ist (Allow entry only if price pulled back toward EMA) - if(pullback_ratio > (1.0 - PullbackThreshold)) - { - Print("TRACE: Pullback-Bestätigung fehlgeschlagen - Ratio: ", pullback_ratio, " (benötigt < ", (1.0 - PullbackThreshold), ")"); - return false; - } - Print("TRACE: Pullback-Bestätigung erfolgreich - Ratio: ", pullback_ratio); - } - } - - return true; -} - -//+------------------------------------------------------------------+ -//| Momentum Confirmation Check | -//+------------------------------------------------------------------+ -bool PrüfeMomentum(ENUM_ORDER_TYPE order_type) -{ - if(MomentumBars < 1) - return true; - - //--- Prüfe ob die letzten Bars Momentum in Richtung des Trades zeigen (Check if recent bars show momentum in trade direction) - double close_0 = iClose(_Symbol, Timeframe, 0); - double close_n = iClose(_Symbol, Timeframe, MomentumBars); - - if(close_n == 0) - return true; // Nicht genug Daten (Not enough data) - - if(order_type == ORDER_TYPE_BUY) - { - // Für KAUF: Preis sollte höher sein als vor N Bars (For BUY: Price should be higher than N bars ago) - if(close_0 <= close_n) - { - Print("TRACE: Momentum fehlt für KAUF - Close[0]: ", close_0, " Close[", MomentumBars, "]: ", close_n); - return false; - } - } - else if(order_type == ORDER_TYPE_SELL) - { - // Für VERKAUF: Preis sollte niedriger sein als vor N Bars (For SELL: Price should be lower than N bars ago) - if(close_0 >= close_n) - { - Print("TRACE: Momentum fehlt für VERKAUF - Close[0]: ", close_0, " Close[", MomentumBars, "]: ", close_n); - return false; - } - } - - return true; -} - -//+------------------------------------------------------------------+ -//| Maximum Adverse Excursion Check | -//+------------------------------------------------------------------+ -void PrüfeMAE() -{ - if(!PositionSelect(_Symbol) || entry_price == 0) - return; - - double current_price = PositionGetDouble(POSITION_PRICE_CURRENT); - ENUM_POSITION_TYPE position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); - double pips_multiplier = (_Digits == 3 || _Digits == 5) ? 10.0 : 1.0; - - double current_excursion = 0; - - if(position_type == POSITION_TYPE_BUY) - { - current_excursion = (current_price - entry_price) / _Point / pips_multiplier; - } - else if(position_type == POSITION_TYPE_SELL) - { - current_excursion = (entry_price - current_price) / _Point / pips_multiplier; - } - - //--- Update maximale Bewegungen (Update maximum movements) - if(current_excursion > max_favorable_excursion) - { - max_favorable_excursion = current_excursion; - } - - if(current_excursion < -max_adverse_excursion) - { - max_adverse_excursion = -current_excursion; - } - - //--- Prüfe ob MAE-Schwelle überschritten wurde (Check if MAE threshold exceeded) - if(max_adverse_excursion > MAEThreshold) - { - // Prüfe ob genug Bars vergangen sind (Check if enough bars have passed) - datetime current_bar_time = iTime(_Symbol, Timeframe, 0); - int bars_since_entry = iBarShift(_Symbol, Timeframe, trade_open_time); - - if(bars_since_entry >= MAECheckBars) - { - double position_profit = PositionGetDouble(POSITION_PROFIT); - - // Schließe nur wenn Position nicht im Profit ist (Close only if position not in profit) - if(position_profit <= 0) - { - Print("TRACE: MAE-Schwelle überschritten - MAE: ", max_adverse_excursion, " Pips (Schwelle: ", MAEThreshold, ")"); - Print("TRACE: Position Profit: ", position_profit, " - Schließe Position"); - SchließePosition("MAE Protection - Excessive Adverse Excursion"); - } - else - { - Print("TRACE: MAE-Schwelle überschritten aber Position im Profit - MAE: ", max_adverse_excursion, " Profit: ", position_profit); - } - } - } -} - -//+------------------------------------------------------------------+ -//| Early Reversal Detection | -//+------------------------------------------------------------------+ -bool PrüfeFrüheReversal(ENUM_POSITION_TYPE position_type, double aktueller_preis, double ema_aktuell) -{ - if(!UseEarlyReversalDetection || entry_price == 0) - return false; - - double pips_multiplier = (_Digits == 3 || _Digits == 5) ? 10.0 : 1.0; - double price_to_ema = MathAbs(aktueller_preis - ema_aktuell) / _Point / pips_multiplier; - double entry_to_ema = MathAbs(entry_price - ema_aktuell) / _Point / pips_multiplier; - - if(entry_to_ema == 0) - return false; - - //--- Prüfe ob Preis sich zu weit zurück zur EMA bewegt hat (Check if price moved too far back toward EMA) - double reversal_ratio = price_to_ema / entry_to_ema; - - if(reversal_ratio < ReversalThreshold) - { - // Preis hat sich mehr als X% zurück zur EMA bewegt - mögliche Reversal (Price moved more than X% back toward EMA - possible reversal) - Print("TRACE: Frühe Reversal erkannt - Ratio: ", reversal_ratio, " (Schwelle: ", ReversalThreshold, ")"); - - // Prüfe ob Position im Verlust ist (Check if position is in loss) - if(PositionSelect(_Symbol)) - { - double position_profit = PositionGetDouble(POSITION_PROFIT); - if(position_profit <= 0) - { - Print("TRACE: Reversal erkannt und Position im Verlust - Schließe Position"); - return true; - } - } - } - - return false; -} - -//+------------------------------------------------------------------+ \ No newline at end of file diff --git a/lab/EAs/Derivative.mq5 b/lab/EAs/Derivative.mq5 deleted file mode 100644 index eed4ffc..0000000 --- a/lab/EAs/Derivative.mq5 +++ /dev/null @@ -1,1582 +0,0 @@ -//+------------------------------------------------------------------+ - -//| Derivative.mq5 | - -//| EA: finite-difference d1–d3 of price + optional demo signals | - -//| (Former indicator — attach as Expert Advisor on chart.) | - -//+------------------------------------------------------------------+ - -#property copyright "Lab" - -#property link "" - -#property version "3.00" - -#property strict - -#include - -#include - -#property description "DERIVATIVE_CALC EA v3 — derivatives + optional trades; canvas strip or legacy DerivativePlots." - -#property description "Canvas mode draws d1/d2/d3 at bottom without indicators; legacy mode optional." - -enum ENUM_DERIVATIVE_VIEW - -{ - - DERIVATIVE_ALL = 0, - - DERIVATIVE_LEVEL_1 = 1, - - DERIVATIVE_LEVEL_2 = 2, - - DERIVATIVE_LEVEL_3 = 3 - -}; - -input group "=== Instrument ===" - -input string InpSymbol = ""; // blank = chart symbol - -input group "=== Series ===" - -input ENUM_TIMEFRAMES InpSignalTF = PERIOD_CURRENT; // PERIOD_CURRENT = chart TF - -input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE; - -input group "=== Layout (reporting focus) ===" - -input ENUM_DERIVATIVE_VIEW InpWhichDerivative = DERIVATIVE_ALL; // Which values drive Comment / optional trade filter - -input group "=== Calculus discretization ===" - -input int InpDiffStep = 1; - -input bool InpNormalizePoints = true; - -input group "=== Smoothing ===" - -input int InpSmoothPeriod = 0; - -input group "=== On-chart guide (labels on main window) ===" - -input bool InpShowHelpPanel = true; - -input color InpHelpTitleColor = clrWhite; - -input color InpHelpBodyColor = clrSilver; - -input group "=== Display ===" - -input bool InpShowComment = true; // Status line + d1/d2/d3 on chart - -input int InpCommentThrottleMs = 200; // Min real-time ms between Comment() calls (0=off). Visual tester floods redraws without this. - -input bool InpDebugTrace = false; // Experts/Journal: derivatives + attach diagnostics - -input group "=== Canvas strip (EA draws d1/d2/d3 — no indicator .ex5) ===" - -input bool InpUseCanvasPlots = true; // Three stacked strips at bottom (bitmap on main window) - -input int InpCanvasPlotBars = 320; // Bars across width (series 0 = current) - -input int InpCanvasPanelHeight = 210; // Total pixel height for three strips - -input int InpCanvasBottomMargin = 28; // From chart bottom (CORNER_LEFT_LOWER) - -input int InpCanvasSideMargin = 4; // Left/right inset - -input int InpCanvasRedrawMs = 350; // Min ms between canvas rebuilds - -input color InpCanvasBgColor = clrBlack; - -input color InpCanvasGridColor = clrDimGray; - -input group "=== Legacy: DerivativePlots indicator (optional) ===" - -input bool InpAutoAttachDerivativePlots = false; // Requires DerivativePlots.ex5 in Indicators - -input bool InpAttachPlotsInTester = false; // Non-visual tester: set true if .ex5 present - -input string InpPlotsIndicatorPath = "DerivativePlots"; // .ex5 basename in Indicators folder - -input bool InpPlotsSeparateWindows = false; // Three iCustom instances + stacked subwindows - -input bool InpPlotsUnifyYScale = true; // DerivativePlots InpUnifyPlotYScale - -input group "=== Optional demo trading (off by default) ===" - -input bool InpTradeEnabled = false; - -input double InpLots = 0.01; - -input ulong InpMagic = 931001; - -input int InpSlippagePoints = 30; - -input int InpAtrPeriod = 14; - -input double InpSlAtrMult = 2.0; - -input double InpTpAtrMult = 3.0; - -CTrade g_trade; - -datetime g_lastBarTime = 0; - -string g_chartSymbol = ""; - -bool g_pendingDerivativePlotsAttach = false; - -bool g_derivativePlotsFailedToLoad = false; - -bool g_derivPlotsAttachDone = false; - -uint g_lastCommentWallMs = 0; - -CCanvas g_deriv_canvas; - -bool g_deriv_canvas_created = false; - -uint g_lastCanvasRedrawMs = 0; - -const string HELPER_FAMILY = "DerivRead"; - -const string DERIV_CANVAS_OBJ = "DerivEA_CanvasStrip_v3"; - -void CommentThrottled(const string text) - -{ - - if(InpCommentThrottleMs <= 0) - - { - - Comment(text); - - return; - - } - - const uint now = GetTickCount(); - - if(g_lastCommentWallMs != 0 && (now - g_lastCommentWallMs) < (uint)InpCommentThrottleMs) - - return; - - g_lastCommentWallMs = now; - - Comment(text); - -} - -string DerivativePlotsMissingHint() - -{ - - if(!g_derivativePlotsFailedToLoad || !InpAutoAttachDerivativePlots) - - return ""; - - const string want = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\" + InpPlotsIndicatorPath + ".ex5"; - - return "\n--- DerivativePlots NOT loaded ---\nPlace compiled file:\n" + want + - - "\n(Navigator: Indicators -> right-click -> Open folder -> paste .mq5, Compile.)"; - -} - -string HelpPrefix() - -{ - - return HELPER_FAMILY + "_EA_L" + IntegerToString((int)InpWhichDerivative) + "_"; - -} - -void DeleteOurHelpObjects() - -{ - - const string px = HelpPrefix(); - - ObjectDelete(0, px + "title"); - - ObjectDelete(0, px + "body"); - - ObjectDelete(0, px + "interp"); - -} - -bool LabelCreateMain(const string name, const int corner, const int xd, const int yd, - - const string text, const color clr, const int fontSize, const int anchor) - -{ - - if(!ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0)) - - return false; - - ObjectSetInteger(0, name, OBJPROP_CORNER, corner); - - ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor); - - ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xd); - - ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yd); - - ObjectSetString(0, name, OBJPROP_TEXT, text); - - ObjectSetInteger(0, name, OBJPROP_COLOR, clr); - - ObjectSetInteger(0, name, OBJPROP_FONTSIZE, fontSize); - - ObjectSetString(0, name, OBJPROP_FONT, "Consolas"); - - ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); - - ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); - - return true; - -} - -void TryBuildHelpPanel() - -{ - - if(!InpShowHelpPanel) - - { - - DeleteOurHelpObjects(); - - return; - - } - - const string px = HelpPrefix(); - - ObjectDelete(0, px + "title"); - - ObjectDelete(0, px + "body"); - - ObjectDelete(0, px + "interp"); - - const int x0 = 8; - - string title = "DERIVATIVE_CALC EA — readout\n"; - - string body = ""; - - string interp = ""; - - if(InpWhichDerivative == DERIVATIVE_ALL) - - { - - body = - - "d1 = slope of price / step h (velocity)\n" - - "d2 = change of d1 (acceleration)\n" - - "d3 = change of d2 (jerk)\n" - - "See Experts log + Comment line for numbers."; - - interp = "Optional demo trades use Which derivative + sign rules (inputs)."; - - } - - else if(InpWhichDerivative == DERIVATIVE_LEVEL_1) - - { - - title = "EA focus: d1 only\n"; - - body = "d1 > 0 : rising over h bars; < 0 falling; cross 0 : flip."; - - interp = "Demo buy bias if d1>0 & d2>0 when trade enabled."; - - } - - else if(InpWhichDerivative == DERIVATIVE_LEVEL_2) - - { - - title = "EA focus: d2 only\n"; - - body = "d2 : momentum building (+) or fading (-) vs d1."; - - interp = "Use with price context."; - - } - - else - - { - - title = "EA focus: d3 only\n"; - - body = "d3 : noisy; regime / climax hints."; - - interp = "Large |d3| → acceleration changing fast."; - - } - - if(!LabelCreateMain(px + "title", CORNER_LEFT_UPPER, x0, 20, title, InpHelpTitleColor, 10, ANCHOR_LEFT_UPPER)) - - return; - - if(!LabelCreateMain(px + "body", CORNER_LEFT_UPPER, x0, 42, body, InpHelpBodyColor, 8, ANCHOR_LEFT_UPPER)) - - { - - ObjectDelete(0, px + "title"); - - return; - - } - - if(!LabelCreateMain(px + "interp", CORNER_LEFT_LOWER, x0, 8, interp, InpHelpBodyColor, 8, ANCHOR_LEFT_LOWER)) - - { - - ObjectDelete(0, px + "title"); - - ObjectDelete(0, px + "body"); - - return; - - } - -} - -double AppliedFromRates(const MqlRates &r) - -{ - - switch(InpAppliedPrice) - - { - - case PRICE_OPEN: return r.open; - - case PRICE_HIGH: return r.high; - - case PRICE_LOW: return r.low; - - case PRICE_CLOSE: return r.close; - - case PRICE_MEDIAN: return (r.high + r.low) * 0.5; - - case PRICE_TYPICAL: return (r.high + r.low + r.close) / 3.0; - - case PRICE_WEIGHTED:return (r.high + r.low + r.close + r.close) / 4.0; - - default: return r.close; - - } - -} - -void SmoothPriceArray(const int total, const double &src[], double &dst[]) - -{ - - ArrayResize(dst, total); - - const int p = InpSmoothPeriod; - - if(p <= 1) - - { - - ArrayCopy(dst, src); - - return; - - } - - const double alpha = 2.0 / (p + 1.0); - - const int oldest = total - 1; - - double ema = src[oldest]; - - dst[oldest] = ema; - - for(int i = oldest - 1; i >= 0; i--) - - { - - ema = alpha * src[i] + (1.0 - alpha) * ema; - - dst[i] = ema; - - } - -} - -double SrcAt(const int i, const bool useSmooth, const double &smooth[], const double &raw[]) - -{ - - return useSmooth ? smooth[i] : raw[i]; - -} - -bool ComputeDerivatives(const string sym, const ENUM_TIMEFRAMES tf, - - double &out_d1, double &out_d2, double &out_d3) - -{ - - out_d1 = out_d2 = out_d3 = 0.0; - - const int h = MathMax(InpDiffStep, 1); - - const int needBars = 50 + h * 6; - - MqlRates rates[]; - - ArraySetAsSeries(rates, true); - - const int n = CopyRates(sym, tf, 0, needBars, rates); - - if(n < h * 3 + 5) - - return false; - - double raw[]; - - ArrayResize(raw, n); - - ArraySetAsSeries(raw, true); - - for(int i = 0; i < n; i++) - - raw[i] = AppliedFromRates(rates[i]); - - double smoothed[]; - - SmoothPriceArray(n, raw, smoothed); - - const bool useSmooth = (InpSmoothPeriod > 1); - - const double scale = InpNormalizePoints ? SymbolInfoDouble(sym, SYMBOL_POINT) : 1.0; - - if(scale <= 0.0) - - return false; - - const int i = 1; - - if(i + h >= n) - - return false; - - const double d1_i = (SrcAt(i, useSmooth, smoothed, raw) - SrcAt(i + h, useSmooth, smoothed, raw)) / ((double)h * scale); - - if(i + 2 * h >= n) - - { - - out_d1 = d1_i; - - return true; - - } - - const double d1_ip = (SrcAt(i + h, useSmooth, smoothed, raw) - SrcAt(i + 2 * h, useSmooth, smoothed, raw)) / ((double)h * scale); - - const double d2_i = (d1_i - d1_ip) / ((double)h * scale); - - if(i + 3 * h >= n) - - { - - out_d1 = d1_i; - - out_d2 = d2_i; - - return true; - - } - - const double d1_ip2 = (SrcAt(i + 2 * h, useSmooth, smoothed, raw) - SrcAt(i + 3 * h, useSmooth, smoothed, raw)) / ((double)h * scale); - - const double d2_ip = (d1_ip - d1_ip2) / ((double)h * scale); - - const double d3_i = (d2_i - d2_ip) / ((double)h * scale); - - out_d1 = d1_i; - - out_d2 = d2_i; - - out_d3 = d3_i; - - return true; - -} - -double CanvasSeriesAt(const int row, const int si, - - const double &d1[], const double &d2[], const double &d3[]) - -{ - - if(row == 0) - - return d1[si]; - - if(row == 1) - - return d2[si]; - - return d3[si]; - -} - -bool ComputeDerivativeSeries(const string sym, const ENUM_TIMEFRAMES tf, - - const int plotBars, - - double &d1[], double &d2[], double &d3[]) - -{ - - const int h = MathMax(InpDiffStep, 1); - - const int need = plotBars + h * 4 + 10; - - MqlRates rates[]; - - ArraySetAsSeries(rates, true); - - const int n = CopyRates(sym, tf, 0, need, rates); - - if(n < h * 3 + 5) - - return false; - - double raw[]; - - ArrayResize(raw, n); - - ArraySetAsSeries(raw, true); - - for(int i = 0; i < n; i++) - - raw[i] = AppliedFromRates(rates[i]); - - double smoothed[]; - - SmoothPriceArray(n, raw, smoothed); - - const bool useSmooth = (InpSmoothPeriod > 1); - - const double scale = InpNormalizePoints ? SymbolInfoDouble(sym, SYMBOL_POINT) : 1.0; - - if(scale <= 0.0) - - return false; - - ArrayResize(d1, plotBars); - - ArrayResize(d2, plotBars); - - ArrayResize(d3, plotBars); - - ArrayInitialize(d1, EMPTY_VALUE); - - ArrayInitialize(d2, EMPTY_VALUE); - - ArrayInitialize(d3, EMPTY_VALUE); - - const int d1Count = MathMin(plotBars, n - h); - - for(int si = 0; si < d1Count; si++) - - d1[si] = (SrcAt(si, useSmooth, smoothed, raw) - SrcAt(si + h, useSmooth, smoothed, raw)) / ((double)h * scale); - - for(int si = 0; si < plotBars; si++) - - { - - if(si + 2 * h >= n || si + h >= d1Count) - - break; - - d2[si] = (d1[si] - d1[si + h]) / ((double)h * scale); - - } - - for(int si = 0; si < plotBars; si++) - - { - - if(si + 3 * h >= n) - - break; - - if(si + h >= plotBars) - - break; - - if(d2[si] == EMPTY_VALUE || d2[si + h] == EMPTY_VALUE) - - continue; - - d3[si] = (d2[si] - d2[si + h]) / ((double)h * scale); - - } - - return true; - -} - -void UpdateDerivativeCanvasStrip() - -{ - - if(!InpUseCanvasPlots) - - return; - - ENUM_TIMEFRAMES tf = InpSignalTF; - - if(tf == PERIOD_CURRENT) - - tf = (ENUM_TIMEFRAMES)Period(); - - double d1[], d2[], d3[]; - - if(!ComputeDerivativeSeries(g_chartSymbol, tf, InpCanvasPlotBars, d1, d2, d3)) - - return; - - const int chartW = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS); - - if(chartW < 80) - - return; - - const int panelW = MathMax(60, chartW - InpCanvasSideMargin * 2); - - const int panelH = MathMax(90, InpCanvasPanelHeight); - - const int x0 = InpCanvasSideMargin; - - const int y0 = InpCanvasBottomMargin; - - if(!g_deriv_canvas_created) - - { - - if(!g_deriv_canvas.CreateBitmapLabel(0, 0, DERIV_CANVAS_OBJ, x0, y0, panelW, panelH, COLOR_FORMAT_ARGB_NORMALIZE)) - - { - - if(InpDebugTrace) - - Print("DERIVATIVE_CALC: canvas CreateBitmapLabel failed err=", GetLastError()); - - return; - - } - - ObjectSetInteger(0, DERIV_CANVAS_OBJ, OBJPROP_CORNER, CORNER_LEFT_LOWER); - - ObjectSetInteger(0, DERIV_CANVAS_OBJ, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER); - - ObjectSetInteger(0, DERIV_CANVAS_OBJ, OBJPROP_SELECTABLE, false); - - ObjectSetInteger(0, DERIV_CANVAS_OBJ, OBJPROP_HIDDEN, true); - - g_deriv_canvas_created = true; - - } - - else - - { - - g_deriv_canvas.Resize(panelW, panelH); - - ObjectSetInteger(0, DERIV_CANVAS_OBJ, OBJPROP_XDISTANCE, x0); - - ObjectSetInteger(0, DERIV_CANVAS_OBJ, OBJPROP_YDISTANCE, y0); - - } - - g_deriv_canvas.Erase(ColorToARGB(InpCanvasBgColor, 255)); - - const int rows = 3; - - const int rowH = MathMax(24, panelH / rows); - - const uint clrLines[3] = { - - ColorToARGB(clrDodgerBlue, 235), - - ColorToARGB(clrOrange, 235), - - ColorToARGB(clrMagenta, 235) - - }; - - const string tags[3] = { "d1 velocity", "d2 acceleration", "d3 jerk" }; - - const int nPts = MathMin(InpCanvasPlotBars, ArraySize(d1)); - - if(nPts < 3) - - { - - g_deriv_canvas.Update(); - - return; - - } - - for(int r = 0; r < rows; r++) - - { - - const int yBase = r * rowH; - - const int midY = yBase + rowH / 2; - - g_deriv_canvas.LineAA(0.0, (double)midY, (double)(panelW - 1), (double)midY, ColorToARGB(InpCanvasGridColor, 70)); - - double vmin = DBL_MAX; - - double vmax = -DBL_MAX; - - for(int si = 0; si < nPts; si++) - - { - - const double v = CanvasSeriesAt(r, si, d1, d2, d3); - - if(v == EMPTY_VALUE || !MathIsValidNumber(v)) - - continue; - - if(v < vmin) - - vmin = v; - - if(v > vmax) - - vmax = v; - - } - - if(vmin == DBL_MAX) - - continue; - - if(MathAbs(vmax - vmin) < 1e-15) - - { - - vmin -= 1.0; - - vmax += 1.0; - - } - - g_deriv_canvas.FontSet("Consolas", -90); - - g_deriv_canvas.TextOut(4, yBase + 2, tags[r], ColorToARGB(clrSilver, 220)); - - const double denom = (double)MathMax(1, nPts - 1); - - for(int si = 0; si < nPts - 1; si++) - - { - - const double v0 = CanvasSeriesAt(r, si, d1, d2, d3); - - const double v1 = CanvasSeriesAt(r, si + 1, d1, d2, d3); - - if(v0 == EMPTY_VALUE || v1 == EMPTY_VALUE) - - continue; - - const double xf0 = (double)(panelW - 1) * (double)(nPts - 1 - si) / denom; - - const double xf1 = (double)(panelW - 1) * (double)(nPts - 2 - si) / denom; - - const double t0 = (v0 - vmin) / (vmax - vmin); - - const double t1 = (v1 - vmin) / (vmax - vmin); - - const int py0 = yBase + 3 + (int)((double)(rowH - 6) * (1.0 - t0)); - - const int py1 = yBase + 3 + (int)((double)(rowH - 6) * (1.0 - t1)); - - g_deriv_canvas.LineAA(xf0, (double)py0, xf1, (double)py1, clrLines[r]); - - } - - } - - g_deriv_canvas.Update(); - - ChartRedraw(0); - -} - -bool HasOurPosition(const string sym) - -{ - - for(int i = PositionsTotal() - 1; i >= 0; i--) - - { - - const ulong t = PositionGetTicket(i); - - if(t == 0 || !PositionSelectByTicket(t)) - - continue; - - if(PositionGetString(POSITION_SYMBOL) != sym) - - continue; - - if((ulong)PositionGetInteger(POSITION_MAGIC) != InpMagic) - - continue; - - return true; - - } - - return false; - -} - -double AtrPoints(const string sym, const ENUM_TIMEFRAMES tf) - -{ - - const int h = iATR(sym, tf, InpAtrPeriod); - - if(h == INVALID_HANDLE) - - return 0.0; - - double b[]; - - ArraySetAsSeries(b, true); - - if(CopyBuffer(h, 0, 1, 1, b) != 1) - - { - - IndicatorRelease(h); - - return 0.0; - - } - - IndicatorRelease(h); - - const double pt = SymbolInfoDouble(sym, SYMBOL_POINT); - - return (pt > 0.0 ? b[0] / pt : 0.0); - -} - -void RemoveDerivativePlotsIndicatorsFromChart() - -{ - - const int nw = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL); - - for(int w = nw - 1; w >= 0; w--) - - { - - const int nc = ChartIndicatorsTotal(0, w); - - for(int k = nc - 1; k >= 0; k--) - - { - - const string nm = ChartIndicatorName(0, w, k); - - if(StringFind(nm, "DERIV_") >= 0 || - - StringFind(nm, "DERIV_PLOTS") >= 0 || - - StringFind(nm, InpPlotsIndicatorPath) >= 0 || - - StringFind(nm, "DerivativePlots") >= 0) - - ChartIndicatorDelete(0, w, nm); - - } - - } - -} - -bool DerivativePlotsAlreadyOnChart() - -{ - - const int nw = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL); - - for(int w = 0; w < nw; w++) - - { - - const int nc = ChartIndicatorsTotal(0, w); - - for(int k = 0; k < nc; k++) - - { - - const string nm = ChartIndicatorName(0, w, k); - - if(StringFind(nm, "DERIV_") >= 0 || StringFind(nm, "DERIV_PLOTS") >= 0 || - - StringFind(nm, InpPlotsIndicatorPath) >= 0) - - return true; - - } - - } - - return false; - -} - -// Pass every DerivativePlots input (same order as .mq5) so each WhichDerivative gets its own handle. - -int MakeDerivativePlotsHandle(const string sym, const ENUM_TIMEFRAMES tf, - - const ENUM_DERIVATIVE_VIEW which, const bool unifyY) - -{ - - return iCustom(sym, tf, InpPlotsIndicatorPath, - - InpAppliedPrice, - - which, - - unifyY, - - InpDiffStep, - - InpNormalizePoints, - - InpSmoothPeriod, - - true, - - InpDebugTrace, - - false); - -} - -bool AttachDerivativePlotsIndicator(const string sym, const ENUM_TIMEFRAMES tf) - -{ - - if(!InpAutoAttachDerivativePlots) - - return false; - - if(g_derivPlotsAttachDone) - - return true; - - const string wantPath = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\" + InpPlotsIndicatorPath + ".ex5"; - - // ChartIndicatorAdd(chart, subwindow, handle). Subwindow index: use ChartWindowsTotal() before each add - - // so new panes are appended below existing windows (ATR etc.). Fixed 1,2,3 collides with other indicators. - - const bool unifyPass = InpPlotsSeparateWindows ? false : InpPlotsUnifyYScale; - - if(InpPlotsSeparateWindows) - - { - - ResetLastError(); - - const int ind1 = MakeDerivativePlotsHandle(sym, tf, DERIVATIVE_LEVEL_1, unifyPass); - - if(ind1 == INVALID_HANDLE) - - { - - g_derivativePlotsFailedToLoad = true; - - Print("DERIVATIVE_CALC: iCustom(", InpPlotsIndicatorPath, ", d1) failed err=", GetLastError(), - - ". Required:\n ", wantPath); - - if(InpDebugTrace) - - PrintFormat("DERIVATIVE_CALC dbg iCustom d1 sym=%s tf=%s", sym, EnumToString(tf)); - - return false; - - } - - ResetLastError(); - - const int ind2 = MakeDerivativePlotsHandle(sym, tf, DERIVATIVE_LEVEL_2, unifyPass); - - if(ind2 == INVALID_HANDLE) - - { - - IndicatorRelease(ind1); - - g_derivativePlotsFailedToLoad = true; - - Print("DERIVATIVE_CALC: iCustom(", InpPlotsIndicatorPath, ", d2) failed err=", GetLastError(), - - ". Required:\n ", wantPath); - - return false; - - } - - ResetLastError(); - - const int ind3 = MakeDerivativePlotsHandle(sym, tf, DERIVATIVE_LEVEL_3, unifyPass); - - if(ind3 == INVALID_HANDLE) - - { - - IndicatorRelease(ind1); - - IndicatorRelease(ind2); - - g_derivativePlotsFailedToLoad = true; - - Print("DERIVATIVE_CALC: iCustom(", InpPlotsIndicatorPath, ", d3) failed err=", GetLastError(), - - ". Required:\n ", wantPath); - - return false; - - } - - if(InpDebugTrace) - - PrintFormat("DERIVATIVE_CALC dbg triple iCustom handles ind1=%d ind2=%d ind3=%d (should differ)", - - ind1, ind2, ind3); - - RemoveDerivativePlotsIndicatorsFromChart(); - - int sw = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL); - - ResetLastError(); - - const bool ok1 = ChartIndicatorAdd(0, sw, ind1); - - const int err1 = GetLastError(); - - sw = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL); - - ResetLastError(); - - const bool ok2 = ChartIndicatorAdd(0, sw, ind2); - - const int err2 = GetLastError(); - - sw = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL); - - ResetLastError(); - - const bool ok3 = ChartIndicatorAdd(0, sw, ind3); - - const int err3 = GetLastError(); - - IndicatorRelease(ind1); - - IndicatorRelease(ind2); - - IndicatorRelease(ind3); - - if(!ok1 || !ok2 || !ok3) - - { - - g_derivativePlotsFailedToLoad = true; - - Print("DERIVATIVE_CALC: ChartIndicatorAdd (3 panes) failed ok=", ok1, ",", ok2, ",", ok3, - - " err=", err1, ",", err2, ",", err3, ". File: ", wantPath); - - return false; - - } - - g_derivativePlotsFailedToLoad = false; - - g_derivPlotsAttachDone = true; - - ChartRedraw(0); - - Print("DERIVATIVE_CALC: DerivativePlots attached as three stacked subwindows (indices chosen from CHART_WINDOWS_TOTAL)."); - - if(InpDebugTrace) - - PrintFormat("DERIVATIVE_CALC dbg triple attach OK sym=%s tf=%s", sym, EnumToString(tf)); - - return true; - - } - - ResetLastError(); - - const int ind = MakeDerivativePlotsHandle(sym, tf, InpWhichDerivative, unifyPass); - - if(ind == INVALID_HANDLE) - - { - - g_derivativePlotsFailedToLoad = true; - - Print("DERIVATIVE_CALC: iCustom(\"", InpPlotsIndicatorPath, "\") failed err=", GetLastError(), - - ". MT5 could not read the compiled indicator. Required file:\n ", wantPath, - - "\nCopy lab\\\\EAs\\\\DerivativePlots.mq5 into that Indicators folder, open in MetaEditor, press Compile (F7)."); - - if(InpDebugTrace) - - PrintFormat("DERIVATIVE_CALC dbg iCustom sym=%s tf=%s applied=%d which=%d unify=%s h=%d norm=%s sm=%d", - - sym, EnumToString(tf), (int)InpAppliedPrice, (int)InpWhichDerivative, - - InpPlotsUnifyYScale ? "on" : "off", - - InpDiffStep, InpNormalizePoints ? "on" : "off", InpSmoothPeriod); - - return false; - - } - - RemoveDerivativePlotsIndicatorsFromChart(); - - int sw = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL); - - ResetLastError(); - - const bool ok = ChartIndicatorAdd(0, sw, ind); - - const int errAfterAdd = GetLastError(); - - IndicatorRelease(ind); - - if(!ok) - - { - - g_derivativePlotsFailedToLoad = true; - - Print("DERIVATIVE_CALC: ChartIndicatorAdd failed err=", errAfterAdd, - - ". Expected file present: ", wantPath); - - return false; - - } - - g_derivativePlotsFailedToLoad = false; - - g_derivPlotsAttachDone = true; - - ChartRedraw(0); - - Print("DERIVATIVE_CALC: subwindow indicator attached (inputs synced from EA)."); - - if(InpDebugTrace) - - PrintFormat("DERIVATIVE_CALC dbg attach OK handle_was_valid ChartIndicatorAdd err=%d sym=%s tf=%s sw=%d", - - errAfterAdd, sym, EnumToString(tf), sw); - - return true; - -} - -void TryDemoTrade(const string sym, const ENUM_TIMEFRAMES tf, - - const double d1, const double d2, const double d3) - -{ - - if(!InpTradeEnabled || HasOurPosition(sym)) - - return; - - bool wantBuy = false; - - bool wantSell = false; - - switch(InpWhichDerivative) - - { - - case DERIVATIVE_ALL: - - case DERIVATIVE_LEVEL_1: - - wantBuy = (d1 > 0.0 && d2 > 0.0); - - wantSell = (d1 < 0.0 && d2 < 0.0); - - break; - - case DERIVATIVE_LEVEL_2: - - wantBuy = (d2 > 0.0); - - wantSell = (d2 < 0.0); - - break; - - default: - - wantBuy = (d3 > 0.0); - - wantSell = (d3 < 0.0); - - break; - - } - - if(!wantBuy && !wantSell) - - return; - - MqlTick tick; - - if(!SymbolInfoTick(sym, tick)) - - return; - - const double atrPts = AtrPoints(sym, tf); - - const double pt = SymbolInfoDouble(sym, SYMBOL_POINT); - - const double slPts = MathMax(atrPts * InpSlAtrMult, 10.0); - - const double tpPts = MathMax(atrPts * InpTpAtrMult, 10.0); - - double sl = 0.0, tp = 0.0; - - if(wantBuy) - - { - - sl = tick.ask - slPts * pt; - - tp = tick.ask + tpPts * pt; - - g_trade.Buy(InpLots, sym, tick.ask, sl, tp, "DERIVATIVE_CALC demo"); - - } - - else if(wantSell) - - { - - sl = tick.bid + slPts * pt; - - tp = tick.bid - tpPts * pt; - - g_trade.Sell(InpLots, sym, tick.bid, sl, tp, "DERIVATIVE_CALC demo"); - - } - -} - -int OnInit() - -{ - - g_derivPlotsAttachDone = false; - - g_lastCommentWallMs = 0; - - g_chartSymbol = InpSymbol; - - StringTrimLeft(g_chartSymbol); - - StringTrimRight(g_chartSymbol); - - if(StringLen(g_chartSymbol) == 0) - - g_chartSymbol = _Symbol; - - if(!SymbolSelect(g_chartSymbol, true)) - - { - - Print("DERIVATIVE_CALC EA: cannot select symbol ", g_chartSymbol); - - return INIT_FAILED; - - } - - g_trade.SetExpertMagicNumber((long)InpMagic); - - g_trade.SetDeviationInPoints(InpSlippagePoints); - - g_trade.SetTypeFillingBySymbol(g_chartSymbol); - - ENUM_TIMEFRAMES tf = InpSignalTF; - - if(tf == PERIOD_CURRENT) - - tf = (ENUM_TIMEFRAMES)Period(); - - Print("DERIVATIVE_CALC EA started on ", g_chartSymbol, " ", EnumToString(tf), - - ". This is an Expert Advisor — not the Accelerator indicator."); - - if(InpDebugTrace) - - PrintFormat("DERIVATIVE_CALC dbg chart_TF=%s signal_TF=%s normalize=%s h=%d sm=%d tester=%s visual=%s", - - EnumToString((ENUM_TIMEFRAMES)Period()), EnumToString(tf), - - InpNormalizePoints ? "on" : "off", InpDiffStep, InpSmoothPeriod, - - MQLInfoInteger(MQL_TESTER) ? "yes" : "no", - - MQLInfoInteger(MQL_VISUAL_MODE) ? "yes" : "no"); - - DeleteOurHelpObjects(); - - TryBuildHelpPanel(); - - // Do not call iCustom / ChartIndicatorAdd here — Strategy Tester treats failed indicator load in OnInit as a critical error. - - // Attachment runs on first OnTick instead (see g_pendingDerivativePlotsAttach). - - if(InpUseCanvasPlots) - - { - - RemoveDerivativePlotsIndicatorsFromChart(); - - EventSetMillisecondTimer(120); - - } - - else - - EventKillTimer(); - - if(InpAutoAttachDerivativePlots && !InpUseCanvasPlots) - - { - - RemoveDerivativePlotsIndicatorsFromChart(); - - const bool in_tester = (MQLInfoInteger(MQL_TESTER) != 0); - - const bool visual = (MQLInfoInteger(MQL_VISUAL_MODE) != 0); - - const bool skip_tester_attach = (in_tester && !visual && !InpAttachPlotsInTester); - - if(skip_tester_attach) - - { - - Print("DERIVATIVE_CALC: non-visual Strategy Tester - skipping DerivativePlots attach. ", - - "Use visual mode for subwindow plots, or set InpAttachPlotsInTester=true if DerivativePlots.ex5 is in MQL5\\Indicators\\."); - - } - - else - - { - - g_pendingDerivativePlotsAttach = true; - - Print("DERIVATIVE_CALC: DerivativePlots attach scheduled on first tick (OnInit cannot safely load custom indicators in tester)."); - - } - - } - - return INIT_SUCCEEDED; - -} - -void OnDeinit(const int reason) - -{ - - EventKillTimer(); - - if(g_deriv_canvas_created) - - { - - g_deriv_canvas.Destroy(); - - g_deriv_canvas_created = false; - - } - - ObjectDelete(0, DERIV_CANVAS_OBJ); - - g_derivPlotsAttachDone = false; - - DeleteOurHelpObjects(); - - Comment(""); - -} - -void OnTimer() - -{ - - if(!InpUseCanvasPlots) - - return; - - const uint now = GetTickCount(); - - if(InpCanvasRedrawMs > 0 && g_lastCanvasRedrawMs != 0 && - - (now - g_lastCanvasRedrawMs) < (uint)InpCanvasRedrawMs) - - return; - - g_lastCanvasRedrawMs = now; - - UpdateDerivativeCanvasStrip(); - -} - -void OnTick() - -{ - - ENUM_TIMEFRAMES tf = InpSignalTF; - - if(tf == PERIOD_CURRENT) - - tf = (ENUM_TIMEFRAMES)Period(); - - if(g_pendingDerivativePlotsAttach && !InpUseCanvasPlots) - - { - - g_pendingDerivativePlotsAttach = false; - - AttachDerivativePlotsIndicator(g_chartSymbol, tf); - - } - - const datetime barOpen = iTime(g_chartSymbol, tf, 0); - - if(barOpen == 0) - - return; - - if(barOpen == g_lastBarTime) - - return; - - g_lastBarTime = barOpen; - - double d1 = 0.0, d2 = 0.0, d3 = 0.0; - - if(!ComputeDerivatives(g_chartSymbol, tf, d1, d2, d3)) - - { - - if(InpDebugTrace) - - PrintFormat("DERIVATIVE_CALC dbg ComputeDerivatives FAILED sym=%s tf=%s bar=%s pt=%.12g", - - g_chartSymbol, EnumToString(tf), TimeToString(barOpen, TIME_DATE | TIME_MINUTES), - - SymbolInfoDouble(g_chartSymbol, SYMBOL_POINT)); - - if(InpShowComment) - - CommentThrottled("DERIVATIVE_CALC: not enough bars yet on " + g_chartSymbol + " " + EnumToString(tf) + - - DerivativePlotsMissingHint()); - - return; - - } - - if(InpDebugTrace) - - PrintFormat("DERIVATIVE_CALC dbg bar=%s sym=%s chart_TF=%s signal_TF=%s | d1=%.8g d2=%.8g d3=%.8g | pt=%.12g norm=%s h=%d", - - TimeToString(barOpen, TIME_DATE | TIME_MINUTES), g_chartSymbol, - - EnumToString((ENUM_TIMEFRAMES)Period()), EnumToString(tf), - - d1, d2, d3, SymbolInfoDouble(g_chartSymbol, SYMBOL_POINT), - - InpNormalizePoints ? "on" : "off", InpDiffStep); - - if(InpShowComment) - - { - - string c = "DERIVATIVE_CALC EA | " + g_chartSymbol + - - "\nChart TF: " + EnumToString((ENUM_TIMEFRAMES)Period()) + - - " Signal TF (inputs): " + EnumToString(tf) + - - "\nd1=" + DoubleToString(d1, 4) + " d2=" + DoubleToString(d2, 4) + " d3=" + DoubleToString(d3, 4) + - - "\n(InpWhichDerivative=" + IntegerToString((int)InpWhichDerivative) + - - " h=" + IntegerToString(InpDiffStep) + " sm=" + IntegerToString(InpSmoothPeriod) + ")" + - - (InpUseCanvasPlots - - ? "\nPlots: EA canvas strip (bottom of chart)." - - : ("\nPlots below: DerivativePlots indicator." + DerivativePlotsMissingHint())); - - CommentThrottled(c); - - } - - TryDemoTrade(g_chartSymbol, tf, d1, d2, d3); - -} - -//+------------------------------------------------------------------+ - diff --git a/lab/EAs/DerivativePlots.mq5 b/lab/EAs/DerivativePlots.mq5 deleted file mode 100644 index 5671e9f..0000000 --- a/lab/EAs/DerivativePlots.mq5 +++ /dev/null @@ -1,425 +0,0 @@ -//+------------------------------------------------------------------+ -//| DerivativePlots.mq5 | -//| Subwindow line plots for d1 / d2 / d3 — use with Derivative EA | -//| Compile into MQL5\\Indicators\\ (same name). EA can ChartIndicatorAdd.| -//+------------------------------------------------------------------+ -#property copyright "Lab" -#property link "" -#property version "1.10" -#property indicator_separate_window -#property indicator_buffers 3 -#property indicator_plots 3 -#property description "Plots d1 d2 d3 below chart. Match inputs to Derivative EA." - -#property indicator_label1 "d1 velocity" -#property indicator_type1 DRAW_LINE -#property indicator_color1 clrDodgerBlue -#property indicator_width1 1 - -#property indicator_label2 "d2 acceleration" -#property indicator_type2 DRAW_LINE -#property indicator_color2 clrOrange -#property indicator_width2 1 - -#property indicator_label3 "d3 jerk" -#property indicator_type3 DRAW_LINE -#property indicator_color3 clrMagenta -#property indicator_width3 1 - -enum ENUM_DERIVATIVE_VIEW -{ - DERIVATIVE_ALL = 0, - DERIVATIVE_LEVEL_1 = 1, - DERIVATIVE_LEVEL_2 = 2, - DERIVATIVE_LEVEL_3 = 3 -}; - -input group "=== Source ===" -input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE; - -input group "=== Layout ===" -input ENUM_DERIVATIVE_VIEW InpWhichDerivative = DERIVATIVE_ALL; // Single-line modes clear other buffers to EMPTY_VALUE so Y-scale matches the visible line -input bool InpUnifyPlotYScale = true; // Scale d2,d3 for comparable magnitude when normalized (shared subwindow) - -input group "=== Calculus ===" -input int InpDiffStep = 1; -input bool InpNormalizePoints = true; - -input group "=== Smoothing ===" -input int InpSmoothPeriod = 0; - -input group "=== Status ===" -input bool InpShowValueBanner = true; // Text label; short name is DERIV_ALL / DERIV_d1 / DERIV_d2 / DERIV_d3 for ChartWindowFind - -input group "=== Debug (Experts / Journal) ===" -input bool InpDebugTrace = false; // Print diagnostics to Experts tab -input bool InpDebugLogEveryCalculate = false; // Log every OnCalculate (very verbose) - -double ExtD1[]; -double ExtD2[]; -double ExtD3[]; - -string g_deriv_chart_title = "DERIV_ALL"; -string g_deriv_stat_obj = "DerivPV_ALL"; - -void SetupDerivIdentity() -{ - switch(InpWhichDerivative) - { - case DERIVATIVE_ALL: - g_deriv_chart_title = "DERIV_ALL"; - g_deriv_stat_obj = "DerivPV_ALL"; - break; - case DERIVATIVE_LEVEL_1: - g_deriv_chart_title = "DERIV_d1"; - g_deriv_stat_obj = "DerivPV_d1"; - break; - case DERIVATIVE_LEVEL_2: - g_deriv_chart_title = "DERIV_d2"; - g_deriv_stat_obj = "DerivPV_d2"; - break; - default: - g_deriv_chart_title = "DERIV_d3"; - g_deriv_stat_obj = "DerivPV_d3"; - break; - } -} - -// OnCalculate passes OHLC with index 0 = oldest bar (non-series). Do not ArraySetAsSeries() those arrays. - -double AppliedPriceRowNs(const int pos, const double &open[], const double &high[], - const double &low[], const double &close[]) -{ - switch(InpAppliedPrice) - { - case PRICE_OPEN: return open[pos]; - case PRICE_HIGH: return high[pos]; - case PRICE_LOW: return low[pos]; - case PRICE_CLOSE: return close[pos]; - case PRICE_MEDIAN: return (high[pos] + low[pos]) * 0.5; - case PRICE_TYPICAL: return (high[pos] + low[pos] + close[pos]) / 3.0; - case PRICE_WEIGHTED: return (high[pos] + low[pos] + close[pos] + close[pos]) / 4.0; - default: return close[pos]; - } -} - -void SmoothPriceArrayNs(const int total, const double &src[], double &dst[]) -{ - ArrayResize(dst, total); - const int p = InpSmoothPeriod; - if(p <= 1) - { - ArrayCopy(dst, src); - return; - } - const double alpha = 2.0 / (p + 1.0); - dst[0] = src[0]; - for(int pos = 1; pos < total; pos++) - dst[pos] = alpha * src[pos] + (1.0 - alpha) * dst[pos - 1]; -} - -double SrcNs(const int pos, const bool useSmooth, const double &smooth[], const double &raw[]) -{ - return useSmooth ? smooth[pos] : raw[pos]; -} - -double DerivativeScalePts() -{ - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - if(pt <= 0.0 || !MathIsValidNumber(pt)) - pt = _Point; - if(!InpNormalizePoints) - return 1.0; - if(pt <= 0.0) - return 1.0; - return pt; -} - -void DerivPlotsTrace(const int rates_total, const int prev_calculated, - const int h, const int min_bars, const double scale, const bool useSmooth, - const double &close[], const double &WorkNs[], const datetime &time[]) -{ - if(!InpDebugTrace) - return; - - static int s_call = 0; - s_call++; - - const int newest = rates_total - 1; - const datetime barOpen = time[newest]; - - static datetime s_prevBarOpen = 0; - const bool isNewBarTime = (barOpen != s_prevBarOpen); - if(isNewBarTime) - s_prevBarOpen = barOpen; - - const bool fullRecalc = (prev_calculated == 0); - - if(InpDebugLogEveryCalculate) - { - PrintFormat("DERIV_PLOTS #%d prev_calc=%d rates=%d bar=%s | d1[0]=%.8g d2[0]=%.8g d3[0]=%.8g", - s_call, prev_calculated, rates_total, TimeToString(barOpen, TIME_DATE | TIME_MINUTES), - ExtD1[0], ExtD2[0], ExtD3[0]); - return; - } - - if(fullRecalc) - { - const double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - const double rawStep = (newest >= h) ? (WorkNs[newest] - WorkNs[newest - h]) : 0.0; - PrintFormat("DERIV_PLOTS FULL_CALC #%d sym=%s rates=%d prev_calc=%d h=%d min_need=%d smooth=%s which=%d", - s_call, _Symbol, rates_total, prev_calculated, h, min_bars, - useSmooth ? "on" : "off", (int)InpWhichDerivative); - PrintFormat(" scale=%.12g normalize=%s SYPOINT=%.12g _Point=%.12g SYM_DIGITS=%d", - scale, InpNormalizePoints ? "on" : "off", pt, _Point, - (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS)); - PrintFormat(" close[oldest]=%.8f close[newest]=%.8f rawStep(newest..newest-h)=%.8f", - close[0], close[newest], rawStep); - PrintFormat(" series buf [0]=current bar: d1=%.8g d2=%.8g d3=%.8g (EMPTY_VALUE=%.8g)", - ExtD1[0], ExtD2[0], ExtD3[0], EMPTY_VALUE); - } - else if(isNewBarTime) - { - PrintFormat("DERIV_PLOTS BAR %s rates=%d prev_calc=%d | d1[0]=%.8g d2[0]=%.8g d3[0]=%.8g", - TimeToString(barOpen, TIME_DATE | TIME_MINUTES), rates_total, prev_calculated, - ExtD1[0], ExtD2[0], ExtD3[0]); - } -} - -string FormatPlotVal(const double v) -{ - if(v == EMPTY_VALUE || !MathIsValidNumber(v)) - return "—"; - return DoubleToString(v, 4); -} - -void UpdateValueBanner(const int rates_total) -{ - if(!InpShowValueBanner || rates_total < 1) - return; - - string txt = ""; - switch(InpWhichDerivative) - { - case DERIVATIVE_ALL: - txt = StringFormat("d1=%s d2=%s d3=%s (h=%d sm=%d%s)", - FormatPlotVal(ExtD1[0]), FormatPlotVal(ExtD2[0]), FormatPlotVal(ExtD3[0]), - InpDiffStep, InpSmoothPeriod, InpUnifyPlotYScale ? " unifyY" : ""); - break; - case DERIVATIVE_LEVEL_1: - txt = StringFormat("d1=%s", FormatPlotVal(ExtD1[0])); - break; - case DERIVATIVE_LEVEL_2: - txt = StringFormat("d2=%s", FormatPlotVal(ExtD2[0])); - break; - default: - txt = StringFormat("d3=%s", FormatPlotVal(ExtD3[0])); - break; - } - - IndicatorSetString(INDICATOR_SHORTNAME, g_deriv_chart_title); - - const int sub = ChartWindowFind(0, g_deriv_chart_title); - if(sub < 0) - return; - - if(ObjectFind(0, g_deriv_stat_obj) < 0) - { - if(!ObjectCreate(0, g_deriv_stat_obj, OBJ_LABEL, sub, 0, 0)) - return; - ObjectSetInteger(0, g_deriv_stat_obj, OBJPROP_CORNER, CORNER_LEFT_UPPER); - ObjectSetInteger(0, g_deriv_stat_obj, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER); - ObjectSetInteger(0, g_deriv_stat_obj, OBJPROP_XDISTANCE, 6); - ObjectSetInteger(0, g_deriv_stat_obj, OBJPROP_YDISTANCE, 16); - ObjectSetInteger(0, g_deriv_stat_obj, OBJPROP_COLOR, clrSilver); - ObjectSetInteger(0, g_deriv_stat_obj, OBJPROP_FONTSIZE, 9); - ObjectSetString(0, g_deriv_stat_obj, OBJPROP_FONT, "Consolas"); - ObjectSetInteger(0, g_deriv_stat_obj, OBJPROP_SELECTABLE, false); - ObjectSetInteger(0, g_deriv_stat_obj, OBJPROP_HIDDEN, true); - } - ObjectSetString(0, g_deriv_stat_obj, OBJPROP_TEXT, txt); -} - -// Hide unused buffers from autoscale: DRAW_NONE plots can still skew separate-window limits if buffers hold numbers. -void MaskBuffersForDerivativeView() -{ - switch(InpWhichDerivative) - { - case DERIVATIVE_ALL: - break; - case DERIVATIVE_LEVEL_1: - ArrayInitialize(ExtD2, EMPTY_VALUE); - ArrayInitialize(ExtD3, EMPTY_VALUE); - break; - case DERIVATIVE_LEVEL_2: - ArrayInitialize(ExtD1, EMPTY_VALUE); - ArrayInitialize(ExtD3, EMPTY_VALUE); - break; - default: - ArrayInitialize(ExtD1, EMPTY_VALUE); - ArrayInitialize(ExtD2, EMPTY_VALUE); - break; - } -} - -void ApplyDerivativeViewMode() -{ - switch(InpWhichDerivative) - { - case DERIVATIVE_ALL: - PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrDodgerBlue); - PlotIndexSetInteger(1, PLOT_LINE_COLOR, clrOrange); - PlotIndexSetInteger(2, PLOT_LINE_COLOR, clrMagenta); - PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2); - PlotIndexSetInteger(1, PLOT_LINE_WIDTH, 3); - PlotIndexSetInteger(2, PLOT_LINE_WIDTH, 3); - PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID); - PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_SOLID); - PlotIndexSetInteger(2, PLOT_LINE_STYLE, STYLE_SOLID); - PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE); - PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE); - break; - case DERIVATIVE_LEVEL_1: - PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_NONE); - PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_NONE); - PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrDodgerBlue); - PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2); - PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE); - break; - case DERIVATIVE_LEVEL_2: - PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_NONE); - PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_NONE); - PlotIndexSetInteger(1, PLOT_LINE_COLOR, clrOrange); - PlotIndexSetInteger(1, PLOT_LINE_WIDTH, 3); - PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE); - break; - default: - PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_NONE); - PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_NONE); - PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_LINE); - PlotIndexSetInteger(2, PLOT_LINE_COLOR, clrMagenta); - PlotIndexSetInteger(2, PLOT_LINE_WIDTH, 3); - PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE); - break; - } -} - -int OnInit() -{ - SetIndexBuffer(0, ExtD1, INDICATOR_DATA); - SetIndexBuffer(1, ExtD2, INDICATOR_DATA); - SetIndexBuffer(2, ExtD3, INDICATOR_DATA); - SetupDerivIdentity(); - ApplyDerivativeViewMode(); - IndicatorSetString(INDICATOR_SHORTNAME, g_deriv_chart_title); - const int dig = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); - IndicatorSetInteger(INDICATOR_DIGITS, MathMax(6, dig)); - if(InpDebugTrace) - PrintFormat("DERIV_PLOTS INIT sym=%s applied=%s h=%d sm=%d norm=%s dbg_every_calc=%s", - _Symbol, EnumToString(InpAppliedPrice), InpDiffStep, InpSmoothPeriod, - InpNormalizePoints ? "on" : "off", InpDebugLogEveryCalculate ? "on" : "off"); - return INIT_SUCCEEDED; -} - -void OnDeinit(const int reason) -{ - ObjectDelete(0, g_deriv_stat_obj); -} - -int OnCalculate(const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[]) -{ - const int h = MathMax(InpDiffStep, 1); - const int min_bars = 3 * h + 2; - - ApplyDerivativeViewMode(); - - ArrayResize(ExtD1, rates_total); - ArrayResize(ExtD2, rates_total); - ArrayResize(ExtD3, rates_total); - ArraySetAsSeries(ExtD1, true); - ArraySetAsSeries(ExtD2, true); - ArraySetAsSeries(ExtD3, true); - ArrayInitialize(ExtD1, EMPTY_VALUE); - ArrayInitialize(ExtD2, EMPTY_VALUE); - ArrayInitialize(ExtD3, EMPTY_VALUE); - - if(rates_total < min_bars) - { - if(InpDebugTrace) - PrintFormat("DERIV_PLOTS SHORT_HISTORY sym=%s rates=%d need=%d (3*h+2, h=%d) — buffers left EMPTY", - _Symbol, rates_total, min_bars, h); - return rates_total; - } - - double WorkNs[]; - ArrayResize(WorkNs, rates_total); - for(int pos = 0; pos < rates_total; pos++) - WorkNs[pos] = AppliedPriceRowNs(pos, open, high, low, close); - - static double SmoothNs[]; - SmoothPriceArrayNs(rates_total, WorkNs, SmoothNs); - - const bool useSmooth = (InpSmoothPeriod > 1); - const double scale = DerivativeScalePts(); - - // Bar index pos: 0 = oldest, rates_total-1 = newest. Map to series buffer si = rates_total - 1 - pos (0 = current bar). - const double hs = (double)h * scale; - const bool unify = InpUnifyPlotYScale; - - for(int pos = h; pos < rates_total; pos++) - { - const double d1 = (SrcNs(pos, useSmooth, SmoothNs, WorkNs) - SrcNs(pos - h, useSmooth, SmoothNs, WorkNs)) / ((double)h * scale); - const int si = rates_total - 1 - pos; - ExtD1[si] = d1; - } - - for(int pos = 2 * h; pos < rates_total; pos++) - { - const double d1_pos = (SrcNs(pos, useSmooth, SmoothNs, WorkNs) - SrcNs(pos - h, useSmooth, SmoothNs, WorkNs)) / ((double)h * scale); - const double d1_pm = (SrcNs(pos - h, useSmooth, SmoothNs, WorkNs) - SrcNs(pos - 2 * h, useSmooth, SmoothNs, WorkNs)) / ((double)h * scale); - double d2 = (d1_pos - d1_pm) / ((double)h * scale); - if(unify) - d2 *= hs; - const int si = rates_total - 1 - pos; - ExtD2[si] = d2; - } - - for(int pos = 3 * h; pos < rates_total; pos++) - { - const double d1_pos = (SrcNs(pos, useSmooth, SmoothNs, WorkNs) - SrcNs(pos - h, useSmooth, SmoothNs, WorkNs)) / ((double)h * scale); - const double d1_pm = (SrcNs(pos - h, useSmooth, SmoothNs, WorkNs) - SrcNs(pos - 2 * h, useSmooth, SmoothNs, WorkNs)) / ((double)h * scale); - const double d1_pm2 = (SrcNs(pos - 2 * h, useSmooth, SmoothNs, WorkNs) - SrcNs(pos - 3 * h, useSmooth, SmoothNs, WorkNs)) / ((double)h * scale); - const double d2_pos = (d1_pos - d1_pm) / ((double)h * scale); - const double d2_pm = (d1_pm - d1_pm2) / ((double)h * scale); - double d3 = (d2_pos - d2_pm) / ((double)h * scale); - if(unify) - d3 *= hs * hs; - const int si = rates_total - 1 - pos; - ExtD3[si] = d3; - } - - MaskBuffersForDerivativeView(); - - DerivPlotsTrace(rates_total, prev_calculated, h, min_bars, scale, useSmooth, close, WorkNs, time); - - UpdateValueBanner(rates_total); - - return rates_total; -} - -//+------------------------------------------------------------------+ diff --git a/lab/EAs/EMAPriceSlope.mq5 b/lab/EAs/EMAPriceSlope.mq5 deleted file mode 100644 index fbdd37b..0000000 --- a/lab/EAs/EMAPriceSlope.mq5 +++ /dev/null @@ -1,559 +0,0 @@ -//+------------------------------------------------------------------+ -//| EMAPriceSlope.mq5 | -//| Copyright 2025, MetaQuotes Ltd. | -//| https://www.mql5.com | -//+------------------------------------------------------------------+ -#property copyright "Copyright 2025, MetaQuotes Ltd." -#property link "https://www.mql5.com" -#property version "1.00" -#property description "Expert Advisor using EMA Slope for intelligent trend trading" -#property description "Trades based on EMA momentum, slope strength, and price confirmation" - -#include - -//--- Input parameters -input group "Timeframe Settings" -input ENUM_TIMEFRAMES InpTimeframe = PERIOD_M15; // Trading Timeframe - -input group "EMA Settings" -input int InpEMAPeriod = 20; // EMA Period -input int InpSlopeBars = 3; // Slope Calculation Bars (lookback for slope) - -input group "Slope Trading Logic" -input double InpMinSlopeStrength = 0.0001; // Minimum Slope Strength (0.01% per bar) -input bool InpUseSlopeAcceleration = true; // Require slope acceleration (increasing momentum) -input double InpMinAcceleration = 0.00005; // Minimum Acceleration Threshold -input bool InpUsePriceConfirmation = true; // Require price above/below EMA for confirmation -input double InpPriceDistanceMultiplier = 0.5; // Price distance from EMA (ATR multiplier) - -input group "Entry Filters" -input bool InpUseVolatilityFilter = true; // Use ATR volatility filter -input double InpMinATR = 0.0002; // Minimum ATR for trading (filter low volatility) -input double InpMaxATR = 0.01; // Maximum ATR for trading (filter high volatility) -input bool InpUseRSIFilter = false; // Use RSI filter -input int InpRSIPeriod = 14; // RSI Period -input double InpRSIOverbought = 70; // RSI Overbought (avoid longs) -input double InpRSIOversold = 30; // RSI Oversold (avoid shorts) - -input group "Trading Hours (Server Time)" -input int InpStartHour = 8; // Trading Start Hour (0-23) -input int InpEndHour = 18; // Trading End Hour (0-23) -input bool InpUseTimeFilter = true; // Use Trading Hours Filter - -input group "Risk Management" -input double InpLotSize = 0.01; // Lot Size -input int InpStopLoss = 50; // Stop Loss (pips) - 0 = no SL -input int InpTakeProfit = 100; // Take Profit (pips) - 0 = no TP -input bool InpUseTrailingStop = true; // Use Trailing Stop -input int InpTrailingStop = 30; // Trailing Stop (pips) -input int InpTrailingStep = 5; // Trailing Step (pips) -input int InpMagicNumber = 890123; // Magic Number -input int InpSlippage = 3; // Slippage (points) - -input group "Exit Strategy" -input bool InpUseSlopeReversalExit = true; // Exit on slope reversal -input double InpSlopeReversalThreshold = -0.00005; // Slope reversal threshold (negative slope for long exit) -input bool InpUseEMAExit = false; // Exit when price crosses EMA - -input group "Loss Minimization" -input bool InpUseMaxDailyLoss = true; // Use Max Daily Loss -input double InpMaxDailyLoss = 50.0; // Max Daily Loss (USD) - -//--- Global variables -CTrade trade; -int ema_handle; -int atr_handle; -int rsi_handle; -datetime last_bar_time = 0; -double daily_profit = 0.0; -datetime last_daily_reset = 0; -double last_profit = 0.0; -double last_slope = 0.0; - -//+------------------------------------------------------------------+ -//| Expert initialization function | -//+------------------------------------------------------------------+ -int OnInit() -{ - // Set trade parameters - trade.SetExpertMagicNumber(InpMagicNumber); - trade.SetDeviationInPoints(InpSlippage); - trade.SetTypeFilling(ORDER_FILLING_FOK); - - // Create indicators - ema_handle = iMA(_Symbol, InpTimeframe, InpEMAPeriod, 0, MODE_EMA, PRICE_CLOSE); - - if(InpUseVolatilityFilter) - { - atr_handle = iATR(_Symbol, InpTimeframe, 14); - if(atr_handle == INVALID_HANDLE) - { - Print("ERROR: Failed to create ATR indicator"); - return(INIT_FAILED); - } - } - - if(InpUseRSIFilter) - { - rsi_handle = iRSI(_Symbol, InpTimeframe, InpRSIPeriod, PRICE_CLOSE); - if(rsi_handle == INVALID_HANDLE) - { - Print("ERROR: Failed to create RSI indicator"); - return(INIT_FAILED); - } - } - - if(ema_handle == INVALID_HANDLE) - { - Print("ERROR: Failed to create EMA indicator"); - return(INIT_FAILED); - } - - // Initialize daily tracking - last_daily_reset = TimeCurrent(); - daily_profit = 0.0; - - Print("EMAPriceSlope EA initialized for ", _Symbol); - Print("Timeframe: ", EnumToString(InpTimeframe)); - Print("EMA Period: ", InpEMAPeriod, " Slope Bars: ", InpSlopeBars); - Print("Min Slope Strength: ", InpMinSlopeStrength); - Print("Trading Hours: ", InpStartHour, ":00 - ", InpEndHour, ":00"); - - return(INIT_SUCCEEDED); -} - -//+------------------------------------------------------------------+ -//| Expert deinitialization function | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) -{ - // Release indicators - if(ema_handle != INVALID_HANDLE) - IndicatorRelease(ema_handle); - if(atr_handle != INVALID_HANDLE) - IndicatorRelease(atr_handle); - if(rsi_handle != INVALID_HANDLE) - IndicatorRelease(rsi_handle); -} - -//+------------------------------------------------------------------+ -//| Expert tick function | -//+------------------------------------------------------------------+ -void OnTick() -{ - // Check if new bar on the specified timeframe - datetime current_bar_time = iTime(_Symbol, InpTimeframe, 0); - if(current_bar_time == last_bar_time) - { - // Still same bar - only manage existing positions - ManagePosition(); - return; - } - last_bar_time = current_bar_time; - - // Reset daily profit at midnight - MqlDateTime dt; - TimeToStruct(TimeCurrent(), dt); - MqlDateTime last_dt; - TimeToStruct(last_daily_reset, last_dt); - bool is_new_day = (dt.day != last_dt.day || dt.month != last_dt.month || dt.year != last_dt.year); - - if(is_new_day) - { - daily_profit = 0.0; - last_daily_reset = TimeCurrent(); - Print("Daily reset: New trading day started. Daily profit reset to 0."); - } - - // Check daily loss limit - if(InpUseMaxDailyLoss && daily_profit <= -InpMaxDailyLoss) - { - Print("Daily loss limit reached: ", daily_profit, " USD. Trading stopped for today."); - return; - } - - // Check trading hours - if(InpUseTimeFilter && !IsWithinTradingHours()) - { - return; // Outside trading hours - } - - // Get EMA values for slope calculation - double ema[]; - ArraySetAsSeries(ema, true); - - // Need enough bars for slope calculation - int bars_needed = InpSlopeBars + 5; - if(CopyBuffer(ema_handle, 0, 0, bars_needed, ema) < bars_needed) - { - Print("ERROR: Failed to copy EMA buffer"); - return; - } - - // Calculate EMA slope (rate of change) - double current_ema = ema[0]; - double previous_ema = ema[InpSlopeBars]; - double slope = (current_ema - previous_ema) / previous_ema; // Percentage change - - // Calculate slope acceleration (change in slope) - double previous_slope = last_slope; - double acceleration = 0.0; - if(previous_slope != 0.0) - { - acceleration = slope - previous_slope; - } - last_slope = slope; - - // Get current price - double current_price = iClose(_Symbol, InpTimeframe, 0); - double price_distance_from_ema = MathAbs(current_price - current_ema) / current_ema; - - // Get ATR for volatility filter - double atr_value = 0.0; - if(InpUseVolatilityFilter) - { - double atr_array[]; - ArraySetAsSeries(atr_array, true); - if(CopyBuffer(atr_handle, 0, 0, 1, atr_array) > 0) - { - atr_value = atr_array[0]; - } - } - - // Get RSI for filter - double rsi_value = 50.0; - if(InpUseRSIFilter) - { - double rsi_array[]; - ArraySetAsSeries(rsi_array, true); - if(CopyBuffer(rsi_handle, 0, 0, 1, rsi_array) > 0) - { - rsi_value = rsi_array[0]; - } - } - - // Check existing position - if(PositionSelect(_Symbol)) - { - ManagePosition(); - - // Check exit conditions - long position_type = PositionGetInteger(POSITION_TYPE); - - // Exit on slope reversal - if(InpUseSlopeReversalExit) - { - if(position_type == POSITION_TYPE_BUY && slope < InpSlopeReversalThreshold) - { - // Long position: exit on negative slope reversal - if(trade.PositionClose(_Symbol)) - { - Print("Position closed: Slope reversal (slope=", slope, ")"); - } - return; - } - else if(position_type == POSITION_TYPE_SELL && slope > -InpSlopeReversalThreshold) - { - // Short position: exit on positive slope reversal - if(trade.PositionClose(_Symbol)) - { - Print("Position closed: Slope reversal (slope=", slope, ")"); - } - return; - } - } - - // Exit when price crosses EMA (if enabled) - if(InpUseEMAExit) - { - double prev_price = iClose(_Symbol, InpTimeframe, 1); - if(position_type == POSITION_TYPE_BUY && current_price < current_ema && prev_price >= ema[1]) - { - if(trade.PositionClose(_Symbol)) - { - Print("Position closed: Price crossed below EMA"); - } - return; - } - else if(position_type == POSITION_TYPE_SELL && current_price > current_ema && prev_price <= ema[1]) - { - if(trade.PositionClose(_Symbol)) - { - Print("Position closed: Price crossed above EMA"); - } - return; - } - } - } - else - { - // No position - check for entry signals - - // Volatility filter - if(InpUseVolatilityFilter && atr_value > 0) - { - if(atr_value < InpMinATR || atr_value > InpMaxATR) - { - return; // Volatility out of range - } - } - - // RSI filter - if(InpUseRSIFilter) - { - if(rsi_value > InpRSIOverbought || rsi_value < InpRSIOversold) - { - return; // RSI in extreme zone - } - } - - // BUY Signal: Positive slope with strength - bool buy_signal = false; - if(slope > InpMinSlopeStrength) - { - // Check acceleration (if enabled) - if(InpUseSlopeAcceleration) - { - if(acceleration > InpMinAcceleration) - { - buy_signal = true; - } - } - else - { - buy_signal = true; - } - - // Price confirmation (if enabled) - if(buy_signal && InpUsePriceConfirmation) - { - double min_distance = atr_value * InpPriceDistanceMultiplier / current_price; - if(price_distance_from_ema < min_distance || current_price < current_ema) - { - buy_signal = false; // Price too close to EMA or below EMA - } - } - - // RSI filter for buy - if(buy_signal && InpUseRSIFilter && rsi_value > InpRSIOverbought) - { - buy_signal = false; - } - } - - // SELL Signal: Negative slope with strength - bool sell_signal = false; - if(slope < -InpMinSlopeStrength) - { - // Check acceleration (if enabled) - if(InpUseSlopeAcceleration) - { - if(acceleration < -InpMinAcceleration) - { - sell_signal = true; - } - } - else - { - sell_signal = true; - } - - // Price confirmation (if enabled) - if(sell_signal && InpUsePriceConfirmation) - { - double min_distance = atr_value * InpPriceDistanceMultiplier / current_price; - if(price_distance_from_ema < min_distance || current_price > current_ema) - { - sell_signal = false; // Price too close to EMA or above EMA - } - } - - // RSI filter for sell - if(sell_signal && InpUseRSIFilter && rsi_value < InpRSIOversold) - { - sell_signal = false; - } - } - - // Execute trades - if(buy_signal) - { - Print("BUY Signal: Slope=", slope, " Acceleration=", acceleration, " Price=", current_price); - OpenBuyPosition(); - } - else if(sell_signal) - { - Print("SELL Signal: Slope=", slope, " Acceleration=", acceleration, " Price=", current_price); - OpenSellPosition(); - } - } -} - -//+------------------------------------------------------------------+ -//| Check if current time is within trading hours | -//+------------------------------------------------------------------+ -bool IsWithinTradingHours() -{ - MqlDateTime dt; - TimeToStruct(TimeCurrent(), dt); - int current_hour = dt.hour; - - // Handle case where end hour is before start hour (overnight) - if(InpEndHour < InpStartHour) - { - return (current_hour >= InpStartHour || current_hour < InpEndHour); - } - else - { - return (current_hour >= InpStartHour && current_hour < InpEndHour); - } -} - -//+------------------------------------------------------------------+ -//| Open buy position | -//+------------------------------------------------------------------+ -void OpenBuyPosition() -{ - double price = SymbolInfoDouble(_Symbol, SYMBOL_ASK); - double sl = 0.0; - double tp = 0.0; - - if(InpStopLoss > 0) - { - sl = price - InpStopLoss * _Point * 10; - } - if(InpTakeProfit > 0) - { - tp = price + InpTakeProfit * _Point * 10; - } - - // Validate stops - int stop_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL); - double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - double min_stop = stop_level * point; - - if(sl > 0 && (price - sl) < min_stop) - sl = price - min_stop; - if(tp > 0 && (tp - price) < min_stop) - tp = price + min_stop; - - if(trade.Buy(InpLotSize, _Symbol, price, sl, tp, "EMA Slope Buy")) - { - Print("Buy order opened at ", price, " SL: ", sl, " TP: ", tp); - } - else - { - Print("Failed to open buy order: ", trade.ResultRetcodeDescription()); - } -} - -//+------------------------------------------------------------------+ -//| Open sell position | -//+------------------------------------------------------------------+ -void OpenSellPosition() -{ - double price = SymbolInfoDouble(_Symbol, SYMBOL_BID); - double sl = 0.0; - double tp = 0.0; - - if(InpStopLoss > 0) - { - sl = price + InpStopLoss * _Point * 10; - } - if(InpTakeProfit > 0) - { - tp = price - InpTakeProfit * _Point * 10; - } - - // Validate stops - int stop_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL); - double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - double min_stop = stop_level * point; - - if(sl > 0 && (sl - price) < min_stop) - sl = price + min_stop; - if(tp > 0 && (price - tp) < min_stop) - tp = price - min_stop; - - if(trade.Sell(InpLotSize, _Symbol, price, sl, tp, "EMA Slope Sell")) - { - Print("Sell order opened at ", price, " SL: ", sl, " TP: ", tp); - } - else - { - Print("Failed to open sell order: ", trade.ResultRetcodeDescription()); - } -} - -//+------------------------------------------------------------------+ -//| Manage existing position | -//+------------------------------------------------------------------+ -void ManagePosition() -{ - if(!PositionSelect(_Symbol)) - return; - - // Update daily profit - double current_profit = PositionGetDouble(POSITION_PROFIT); - if(current_profit != last_profit) - { - daily_profit += (current_profit - last_profit); - last_profit = current_profit; - } - - // Apply trailing stop - if(InpUseTrailingStop && InpTrailingStop > 0) - { - ApplyTrailingStop(); - } -} - -//+------------------------------------------------------------------+ -//| Apply trailing stop | -//+------------------------------------------------------------------+ -void ApplyTrailingStop() -{ - if(!PositionSelect(_Symbol)) - return; - - double position_sl = PositionGetDouble(POSITION_SL); - double position_tp = PositionGetDouble(POSITION_TP); - long position_type = PositionGetInteger(POSITION_TYPE); - double current_price = (position_type == POSITION_TYPE_BUY) ? - SymbolInfoDouble(_Symbol, SYMBOL_BID) : - SymbolInfoDouble(_Symbol, SYMBOL_ASK); - - double trailing_distance = InpTrailingStop * _Point * 10; - double new_sl = 0; - - if(position_type == POSITION_TYPE_BUY) - { - new_sl = current_price - trailing_distance; - if(new_sl > position_sl && new_sl < current_price) - { - // Check trailing step - if(position_sl == 0 || (new_sl - position_sl) >= InpTrailingStep * _Point * 10) - { - if(trade.PositionModify(_Symbol, new_sl, position_tp)) - { - Print("Trailing stop updated: New SL=", new_sl); - } - } - } - } - else if(position_type == POSITION_TYPE_SELL) - { - new_sl = current_price + trailing_distance; - if((position_sl == 0 || new_sl < position_sl) && new_sl > current_price) - { - // Check trailing step - if(position_sl == 0 || (position_sl - new_sl) >= InpTrailingStep * _Point * 10) - { - if(trade.PositionModify(_Symbol, new_sl, position_tp)) - { - Print("Trailing stop updated: New SL=", new_sl); - } - } - } - } -} diff --git a/lab/EAs/EMARSIWarm.mq5 b/lab/EAs/EMARSIWarm.mq5 deleted file mode 100644 index a219920..0000000 --- a/lab/EAs/EMARSIWarm.mq5 +++ /dev/null @@ -1,256 +0,0 @@ -#property strict -#property version "1.00" - -#include - -input group "=== Market ===" -input string InpSymbol = "BTCUSD"; -input ENUM_TIMEFRAMES InpTimeframe = PERIOD_M15; -input double InpLots = 0.01; -input int InpSlippagePoints = 30; -input int InpMagic = 930101; -input int InpMaxPositions = 6; -input bool InpDebugLogs = true; - -input group "=== EMA Trend State ===" -input int InpEmaPeriod = 200; -input int InpTrendLookbackBars = 12; -input double InpTrendMinPoints = 120; // total EMA delta over lookback -input double InpFlatMaxPoints = 40; // dead-flat band over lookback - -input group "=== RSI Entries ===" -input int InpRsiPeriod = 14; -input double InpRsiDipLevel = 35.0; // buy dip in uptrend -input double InpRsiSurgeLevel = 65.0; // sell surge in downtrend -input bool InpUseCrossSignal = true; // true=cross, false=state-based - -input group "=== Risk ===" -input bool InpUseHardSLTP = false; -input double InpSLPoints = 2500; -input double InpTPPoints = 4500; - -enum TrendState -{ - TREND_FLAT = 0, - TREND_UP = 1, - TREND_DOWN = -1 -}; - -CTrade trade; -datetime g_lastBarTime = 0; - -void DebugLog(const string msg) -{ - if(InpDebugLogs) - Print("[EMARSIWarm] ", msg); -} - -bool IsNewBar(const string symbol, ENUM_TIMEFRAMES tf) -{ - datetime t = iTime(symbol, tf, 0); - if(t <= 0 || t == g_lastBarTime) - return false; - g_lastBarTime = t; - return true; -} - -double GetIndicatorValue(const int handle, const int bufferIdx, const int shift) -{ - if(handle == INVALID_HANDLE) - return 0.0; - double v[1]; - if(CopyBuffer(handle, bufferIdx, shift, 1, v) <= 0) - return 0.0; - return v[0]; -} - -double GetEma(const string symbol, ENUM_TIMEFRAMES tf, const int period, const int shift) -{ - int h = iMA(symbol, tf, period, 0, MODE_EMA, PRICE_CLOSE); - double val = GetIndicatorValue(h, 0, shift); - if(h != INVALID_HANDLE) - IndicatorRelease(h); - return val; -} - -double GetRsi(const string symbol, ENUM_TIMEFRAMES tf, const int period, const int shift) -{ - int h = iRSI(symbol, tf, period, PRICE_CLOSE); - double val = GetIndicatorValue(h, 0, shift); - if(h != INVALID_HANDLE) - IndicatorRelease(h); - return val; -} - -TrendState GetTrendState() -{ - double emaNow = GetEma(InpSymbol, InpTimeframe, InpEmaPeriod, 1); - double emaPast = GetEma(InpSymbol, InpTimeframe, InpEmaPeriod, 1 + InpTrendLookbackBars); - if(emaNow == 0.0 || emaPast == 0.0) - return TREND_FLAT; - - double deltaPts = (emaNow - emaPast) / _Point; - if(MathAbs(deltaPts) <= InpFlatMaxPoints) - return TREND_FLAT; - if(deltaPts >= InpTrendMinPoints) - return TREND_UP; - if(deltaPts <= -InpTrendMinPoints) - return TREND_DOWN; - return TREND_FLAT; -} - -int CountPositionsByMagic(const string symbol, const int magic) -{ - int count = 0; - for(int i = PositionsTotal() - 1; i >= 0; --i) - { - ulong t = PositionGetTicket(i); - if(t == 0) - continue; - if(PositionGetString(POSITION_SYMBOL) == symbol && - (int)PositionGetInteger(POSITION_MAGIC) == magic) - count++; - } - return count; -} - -string TrendStateToString(const TrendState s) -{ - if(s == TREND_UP) return "UP"; - if(s == TREND_DOWN) return "DOWN"; - return "FLAT"; -} - -void CloseAllByMagic(const string symbol, const int magic) -{ - for(int i = PositionsTotal() - 1; i >= 0; --i) - { - ulong t = PositionGetTicket(i); - if(t == 0) - continue; - if(PositionGetString(POSITION_SYMBOL) == symbol && - (int)PositionGetInteger(POSITION_MAGIC) == magic) - trade.PositionClose(t); - } -} - -void ComputeSLTP(const bool isBuy, const double entry, double &sl, double &tp) -{ - if(!InpUseHardSLTP) - { - sl = 0.0; - tp = 0.0; - return; - } - - if(isBuy) - { - sl = entry - InpSLPoints * _Point; - tp = entry + InpTPPoints * _Point; - } - else - { - sl = entry + InpSLPoints * _Point; - tp = entry - InpTPPoints * _Point; - } -} - -bool BuySignal() -{ - double r1 = GetRsi(InpSymbol, InpTimeframe, InpRsiPeriod, 1); - double r2 = GetRsi(InpSymbol, InpTimeframe, InpRsiPeriod, 2); - if(r1 == 0.0 || r2 == 0.0) - return false; - - if(InpUseCrossSignal) - return (r2 > InpRsiDipLevel && r1 <= InpRsiDipLevel); // fresh dip - return (r1 <= InpRsiDipLevel); -} - -bool SellSignal() -{ - double r1 = GetRsi(InpSymbol, InpTimeframe, InpRsiPeriod, 1); - double r2 = GetRsi(InpSymbol, InpTimeframe, InpRsiPeriod, 2); - if(r1 == 0.0 || r2 == 0.0) - return false; - - if(InpUseCrossSignal) - return (r2 < InpRsiSurgeLevel && r1 >= InpRsiSurgeLevel); // fresh surge - return (r1 >= InpRsiSurgeLevel); -} - -void OnTick() -{ - if(_Symbol != InpSymbol) - { - static datetime lastMismatchLog = 0; - datetime nowBar = iTime(_Symbol, PERIOD_M1, 0); - if(nowBar != lastMismatchLog) - { - lastMismatchLog = nowBar; - DebugLog(StringFormat("Skipped: chart symbol=%s but InpSymbol=%s. Attach EA to %s chart or set InpSymbol=%s.", - _Symbol, InpSymbol, InpSymbol, _Symbol)); - } - return; - } - if(!IsNewBar(InpSymbol, InpTimeframe)) - return; - - TrendState state = GetTrendState(); - double rsi1 = GetRsi(InpSymbol, InpTimeframe, InpRsiPeriod, 1); - double rsi2 = GetRsi(InpSymbol, InpTimeframe, InpRsiPeriod, 2); - int posCount = CountPositionsByMagic(InpSymbol, InpMagic); - DebugLog(StringFormat("Bar=%s state=%s rsi1=%.2f rsi2=%.2f positions=%d", - TimeToString(iTime(InpSymbol, InpTimeframe, 1), TIME_DATE|TIME_MINUTES), - TrendStateToString(state), rsi1, rsi2, posCount)); - - // Core idea: when EMA is "dead flat", flatten everything. - if(state == TREND_FLAT) - { - DebugLog("Action: EMA flat -> closing all positions for this magic."); - CloseAllByMagic(InpSymbol, InpMagic); - return; - } - - if(posCount >= InpMaxPositions) - { - DebugLog(StringFormat("Skipped: max positions reached (%d).", InpMaxPositions)); - return; - } - - MqlTick tick; - if(!SymbolInfoTick(InpSymbol, tick)) - { - DebugLog("Skipped: SymbolInfoTick failed."); - return; - } - - double sl = 0.0, tp = 0.0; - trade.SetExpertMagicNumber(InpMagic); - trade.SetDeviationInPoints(InpSlippagePoints); - - if(state == TREND_UP && BuySignal()) - { - ComputeSLTP(true, tick.ask, sl, tp); - if(trade.Buy(InpLots, InpSymbol, tick.ask, sl, tp, "EMAUp_RSIDip_Buy")) - DebugLog(StringFormat("BUY opened lots=%.2f price=%.2f sl=%.2f tp=%.2f", InpLots, tick.ask, sl, tp)); - else - DebugLog(StringFormat("BUY failed retcode=%d", trade.ResultRetcode())); - } - else if(state == TREND_DOWN && SellSignal()) - { - ComputeSLTP(false, tick.bid, sl, tp); - if(trade.Sell(InpLots, InpSymbol, tick.bid, sl, tp, "EMADown_RSISurge_Sell")) - DebugLog(StringFormat("SELL opened lots=%.2f price=%.2f sl=%.2f tp=%.2f", InpLots, tick.bid, sl, tp)); - else - DebugLog(StringFormat("SELL failed retcode=%d", trade.ResultRetcode())); - } - else - { - if(state == TREND_UP) - DebugLog("No entry: UP trend but RSI dip condition not met."); - else if(state == TREND_DOWN) - DebugLog("No entry: DOWN trend but RSI surge condition not met."); - } -} - diff --git a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/BTCUSD_fixed.set b/lab/EAs/EMASlopeDistanceCocktailBTCUSD/BTCUSD_fixed.set deleted file mode 100644 index a6faa9d..0000000 --- a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/BTCUSD_fixed.set +++ /dev/null @@ -1,21 +0,0 @@ -; EMASlopeDistanceCocktailBTCUSD\main.mq5 — fixed inputs (same as desktop ultimate.set) -; Attach EA to BTCUSD chart. Timeframe 16385 = H1. -; -EMA_Periode=50||50||1||500||N -PreisSchwelle=700.0||700.0||70.000000||7000.000000||N -SteigungSchwelle=25.0||25.0||2.500000||250.000000||N -ÜberwachungTimeout=340||340||1||3400||N -TrailingStop=370.0||370.0||37.000000||3700.000000||N -LotGröße=0.07||0.07||0.007000||0.700000||N -MagicNumber=135790||135790||1||1357900||N -UseSpreadAdjustment=true||false||0||true||N -Timeframe=16385||0||0||49153||N -UseBarData=true||false||0||true||N -MaxTradesPerCrossover=10||10||1||100||N -ProfitCheckBars=15||15||1||150||N -CloseUnprofitableTrades=true||false||0||true||N -UseWeeklyADXFilter=true||false||0||true||N -WeeklyADXPeriod=15||15||1||150||N -WeeklyADXMin=40.0||40.0||4.000000||400.000000||N -WeeklyADXBarShift=2||2||1||20||N -WeeklyADXUseDirection=true||false||0||true||N diff --git a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/BTCUSD_test.set b/lab/EAs/EMASlopeDistanceCocktailBTCUSD/BTCUSD_test.set deleted file mode 100644 index 9e749a8..0000000 --- a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/BTCUSD_test.set +++ /dev/null @@ -1,24 +0,0 @@ -; EMASlopeDistanceCocktailBTCUSD\main.mq5 — BTCUSD Strategy Tester preset -; Load: Tester → Inputs → context menu → Load. Attach EA to BTCUSD chart (EA uses _Symbol). -; -; value||start||step||stop||Y|N (MT5 convention). Timeframe 16385 = H1. -; Tune PreisSchwelle / TrailingStop / SteigungSchwelle to your broker's _Point for BTC. -; -EMA_Periode=50||30||5||200||Y -PreisSchwelle=700.0||200.0||50.0||5000.0||Y -SteigungSchwelle=25.0||5.0||1.0||80.0||Y -ÜberwachungTimeout=340||60||20||900||Y -TrailingStop=370.0||150.0||20.0||5000.0||Y -LotGröße=0.07||0.01||0.01||0.50||N -MagicNumber=135790||135790||1||1357900||N -UseSpreadAdjustment=true||false||0||true||Y -Timeframe=16385||0||0||49153||N -UseBarData=true||false||0||true||N -MaxTradesPerCrossover=10||1||1||25||Y -ProfitCheckBars=15||5||1||60||Y -CloseUnprofitableTrades=true||false||0||true||Y -UseWeeklyADXFilter=true||false||0||true||Y -WeeklyADXPeriod=15||7||1||28||Y -WeeklyADXMin=40.0||15.0||2.0||55.0||Y -WeeklyADXBarShift=2||1||1||5||Y -WeeklyADXUseDirection=true||false||0||true||Y diff --git a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/report.html b/lab/EAs/EMASlopeDistanceCocktailBTCUSD/report.html deleted file mode 100644 index 8d9931f..0000000 Binary files a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/report.html and /dev/null differ diff --git a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/report.png b/lab/EAs/EMASlopeDistanceCocktailBTCUSD/report.png deleted file mode 100644 index c0bf45b..0000000 Binary files a/lab/EAs/EMASlopeDistanceCocktailBTCUSD/report.png and /dev/null differ diff --git a/lab/EAs/MartingaleBTCUSD_Safe.mq5 b/lab/EAs/MartingaleBTCUSD_Safe.mq5 deleted file mode 100644 index 158d234..0000000 --- a/lab/EAs/MartingaleBTCUSD_Safe.mq5 +++ /dev/null @@ -1,246 +0,0 @@ -//+------------------------------------------------------------------+ -//| MartingaleBTCUSD_Safe.mq5 | -//| Classic martingale: double lot after loss, reset after win (BTC) | -//+------------------------------------------------------------------+ -#property copyright "Lab" -#property version "1.01" -#property strict - -#include - -input group "=== Market ===" -input string InpSymbol = "BTCUSD"; -input ENUM_TIMEFRAMES InpTf = PERIOD_M15; -input ulong InpMagic = 202604241; -input int InpSlippagePts = 50; - -input group "=== Martingale (classic) ===" -input double InpBaseLots = 0.01; -input double InpLotMultiplier = 2.0; // traditional = 2.0 -input int InpMaxDoublings = 16; // cap exponent (0..MaxDoublings); then lot stops growing - -input group "=== Entry (RSI) ===" -input int InpRsiPeriod = 14; -input double InpRsiBuyBelow = 32.0; -input double InpRsiSellAbove = 68.0; - -input group "=== SL / TP (optional) ===" -input bool InpUseSLTP = false; -input double InpSLPts = 4000.0; -input double InpTPPts = 3500.0; - -CTrade g_trade; -int g_hRsi = INVALID_HANDLE; -int g_lossStreak = 0; -ulong g_lastPosId = 0; - -string WorkSym() { return InpSymbol; } -double SymPoint() { return SymbolInfoDouble(WorkSym(), SYMBOL_POINT); } - -void SetFilling() -{ - const long fill = SymbolInfoInteger(WorkSym(), SYMBOL_FILLING_MODE); - if((fill & SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK) - g_trade.SetTypeFilling(ORDER_FILLING_FOK); - else if((fill & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC) - g_trade.SetTypeFilling(ORDER_FILLING_IOC); -} - -double NetProfitForPositionId(const ulong posId) -{ - if(posId == 0) - return 0.0; - const datetime to = TimeCurrent(); - if(!HistorySelect(0, to)) - return 0.0; - double sum = 0.0; - const int n = HistoryDealsTotal(); - for(int i = 0; i < n; i++) - { - const ulong deal = HistoryDealGetTicket(i); - if(deal == 0) - continue; - if((ulong)HistoryDealGetInteger(deal, DEAL_POSITION_ID) != posId) - continue; - sum += HistoryDealGetDouble(deal, DEAL_PROFIT); - sum += HistoryDealGetDouble(deal, DEAL_SWAP); - sum += HistoryDealGetDouble(deal, DEAL_COMMISSION); - } - return sum; -} - -int OurPositionCount() -{ - int c = 0; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - const ulong t = PositionGetTicket(i); - if(t == 0 || !PositionSelectByTicket(t)) - continue; - if(PositionGetString(POSITION_SYMBOL) != WorkSym()) - continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) == InpMagic) - c++; - } - return c; -} - -double LotsNow() -{ - const int exp = MathMax(0, MathMin(g_lossStreak, InpMaxDoublings)); - double lot = InpBaseLots * MathPow(InpLotMultiplier, (double)exp); - const double minLot = SymbolInfoDouble(WorkSym(), SYMBOL_VOLUME_MIN); - const double maxLot = SymbolInfoDouble(WorkSym(), SYMBOL_VOLUME_MAX); - const double stepLot = SymbolInfoDouble(WorkSym(), SYMBOL_VOLUME_STEP); - if(stepLot > 0.0) - lot = MathFloor(lot / stepLot) * stepLot; - if(lot < minLot) - lot = minLot; - if(lot > maxLot) - lot = maxLot; - return NormalizeDouble(lot, 8); -} - -bool CopyRsi1(double &rsi1) -{ - double buf[1]; - if(CopyBuffer(g_hRsi, 0, 1, 1, buf) != 1) - return false; - rsi1 = buf[0]; - return true; -} - -void BuildSLTP(const bool isBuy, const double price, double &sl, double &tp) -{ - sl = tp = 0.0; - if(!InpUseSLTP) - return; - const double pt = SymPoint(); - if(pt <= 0.0) - return; - if(isBuy) - { - sl = price - InpSLPts * pt; - tp = price + InpTPPts * pt; - } - else - { - sl = price + InpSLPts * pt; - tp = price - InpTPPts * pt; - } -} - -void OnClosedPosition() -{ - const double net = NetProfitForPositionId(g_lastPosId); - if(net < 0.0) - g_lossStreak++; - else - g_lossStreak = 0; - Print("Martingale: closed net=", net, " lossStreak=", g_lossStreak, " next lot=", LotsNow()); - g_lastPosId = 0; -} - -bool OurPositionOpenById(const ulong posId) -{ - if(posId == 0) - return false; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - const ulong t = PositionGetTicket(i); - if(t == 0 || !PositionSelectByTicket(t)) - continue; - if(PositionGetString(POSITION_SYMBOL) != WorkSym()) - continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != InpMagic) - continue; - if((ulong)PositionGetInteger(POSITION_IDENTIFIER) == posId) - return true; - } - return false; -} - -void CaptureLastPositionId() -{ - Sleep(20); - for(int k = 0; k < PositionsTotal(); k++) - { - const ulong t = PositionGetTicket(k); - if(t == 0 || !PositionSelectByTicket(t)) - continue; - if(PositionGetString(POSITION_SYMBOL) != WorkSym()) - continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != InpMagic) - continue; - g_lastPosId = (ulong)PositionGetInteger(POSITION_IDENTIFIER); - return; - } -} - -int OnInit() -{ - if(InpBaseLots <= 0.0 || InpLotMultiplier < 1.0 || InpMaxDoublings < 0) - return INIT_PARAMETERS_INCORRECT; - if(!SymbolSelect(WorkSym(), true)) - Print("Martingale: SymbolSelect note ", WorkSym()); - g_hRsi = iRSI(WorkSym(), InpTf, InpRsiPeriod, PRICE_CLOSE); - if(g_hRsi == INVALID_HANDLE) - return INIT_FAILED; - g_trade.SetExpertMagicNumber(InpMagic); - g_trade.SetDeviationInPoints(InpSlippagePts); - SetFilling(); - return INIT_SUCCEEDED; -} - -void OnDeinit(const int reason) -{ - if(g_hRsi != INVALID_HANDLE) - IndicatorRelease(g_hRsi); -} - -void OnTick() -{ - if(_Symbol != WorkSym()) - return; - - if(g_lastPosId != 0 && !OurPositionOpenById(g_lastPosId)) - OnClosedPosition(); - - static datetime lastBar = 0; - const datetime tb = iTime(WorkSym(), InpTf, 0); - if(tb == 0 || tb == lastBar) - return; - lastBar = tb; - - if(OurPositionCount() > 0) - return; - - double rsi1 = 0.0; - if(!CopyRsi1(rsi1)) - return; - - const double lot = LotsNow(); - if(lot <= 0.0) - return; - - MqlTick tick; - if(!SymbolInfoTick(WorkSym(), tick)) - return; - - double sl = 0.0, tp = 0.0; - const bool wantBuy = (rsi1 <= InpRsiBuyBelow); - const bool wantSell = (rsi1 >= InpRsiSellAbove); - - if(wantBuy && !wantSell) - { - BuildSLTP(true, tick.ask, sl, tp); - if(g_trade.Buy(lot, WorkSym(), tick.ask, sl, tp, "Martingale buy")) - CaptureLastPositionId(); - } - else if(wantSell && !wantBuy) - { - BuildSLTP(false, tick.bid, sl, tp); - if(g_trade.Sell(lot, WorkSym(), tick.bid, sl, tp, "Martingale sell")) - CaptureLastPositionId(); - } -} diff --git a/lab/EAs/RSIConsolidationBTCUSD/RSIConsolidation.mq5 b/lab/EAs/RSIConsolidationBTCUSD/RSIConsolidation.mq5 deleted file mode 100644 index a859e7c..0000000 --- a/lab/EAs/RSIConsolidationBTCUSD/RSIConsolidation.mq5 +++ /dev/null @@ -1,367 +0,0 @@ -//+------------------------------------------------------------------+ -//| RSIConsolidation.mq5 | -//| Mean-reversion RSI for ranging markets; trend filters block runs | -//+------------------------------------------------------------------+ -#property copyright "Copyright 2025" -#property link "https://www.mql5.com" -#property version "1.01" - -#include - -//--- Symbol (empty = chart symbol) -input group "=== Symbol & session ===" -input string InpSymbol = ""; - -input group "=== Timeframe & bar logic ===" -input ENUM_TIMEFRAMES SignalTF = PERIOD_M15; -input bool EntryOnNewBarOnly = true; - -//--- Core: no trend / consolidation regime -input group "=== Regime: consolidation (anti-trend) ===" -input int ADX_Period = 23; -input double ADX_Max = 38.0; // allow more bars (was 29 — very few on BTC) -input bool UseATRRatioFilter = true; -input int ATR_Period = 8; -input int ATR_SMA_Period = 35; -input double ATR_Ratio_Max = 1.55; // slightly looser vs 1.36 -input bool UseFlatEMAFilter = true; -input int EMA_Fast = 13; -input int EMA_Slow = 17; -input double EMA_Separation_MaxPct = 0.42; // %; was 0.26 — very strict on crypto - -//--- RSI entries (fade extremes toward mean) -input group "=== RSI entries ===" -input int RSI_Period = 8; -input ENUM_APPLIED_PRICE RSI_Price = PRICE_CLOSE; // OPEN made crosses rarer; CLOSE is standard -input double RSI_Oversold = 28.0; -input double RSI_Overbought = 68.0; -input bool UseStrictRsiCross = false; // true = exact cross; false = looser bounce (more trades) -input double RsiCrossSlack = 4.0; // only if !UseStrictRsiCross: widen cross band - -//--- Exits: mean target + hard ATR bracket -input group "=== Exits ===" -input bool UseRSI_MeanExit = true; -input double RSI_Exit_Long = 48.0; -input double RSI_Exit_Short = 52.0; -input double SL_ATR_Mult = 2.15; -input double TP_ATR_Mult = 2.40; -input int MaxBarsInTrade = 54; - -input group "=== Risk & execution ===" -input double Lots = 0.10; -input ulong MagicNumber = 20250420; -input int Slippage = 10; -input int MaxSpreadPoints = 0; // 0 = off (BTC tester/live often blocked at 28) - -CTrade trade; -string g_sym; - -int h_rsi = INVALID_HANDLE; -int h_adx = INVALID_HANDLE; -int h_atr = INVALID_HANDLE; -int h_ema_fast = INVALID_HANDLE; -int h_ema_slow = INVALID_HANDLE; - -datetime g_last_bar = 0; - -bool PositionExistsByMagicSym(string sym, ulong magic) -{ - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong t = PositionGetTicket(i); - if(t == 0) continue; - if(PositionGetString(POSITION_SYMBOL) == sym && PositionGetInteger(POSITION_MAGIC) == (long)magic) - return true; - } - return false; -} - -ulong GetPositionTicketByMagicSym(string sym, ulong magic) -{ - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong t = PositionGetTicket(i); - if(t == 0) continue; - if(PositionGetString(POSITION_SYMBOL) == sym && PositionGetInteger(POSITION_MAGIC) == (long)magic) - return t; - } - return 0; -} - -bool SelectPositionTicketSymMagic(ulong ticket, string sym, ulong magic) -{ - if(!PositionSelectByTicket(ticket)) return false; - return PositionGetString(POSITION_SYMBOL) == sym && PositionGetInteger(POSITION_MAGIC) == (long)magic; -} - -double NormalizeVolume(string sym, double vol) -{ - double minLot = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN); - double maxLot = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX); - double step = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP); - if(step > 0.0) - vol = MathFloor(vol / step) * step; - if(vol < minLot) vol = minLot; - if(vol > maxLot) vol = maxLot; - return vol; -} - -int CurrentSpreadPoints(string sym) -{ - long spread = 0; - if(!SymbolInfoInteger(sym, SYMBOL_SPREAD, spread)) - return 999999; - return (int)spread; -} - -double MinStopsDistancePrice(string sym) -{ - long lvl = 0; - if(!SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL, lvl)) - return 0; - double pt = SymbolInfoDouble(sym, SYMBOL_POINT); - if(pt <= 0) - return 0; - return (double)lvl * pt; -} - -bool Copy1(int handle, double &v) -{ - double b[]; - ArraySetAsSeries(b, true); - if(CopyBuffer(handle, 0, 0, 1, b) < 1) return false; - v = b[0]; - return true; -} - -bool CopyAtShift(int handle, const int shift, double &v) -{ - double b[]; - ArraySetAsSeries(b, true); - if(CopyBuffer(handle, 0, shift, 1, b) < 1) return false; - v = b[0]; - return true; -} - -bool RSI_Buffers(double &cur, double &prev, double &twoAgo) -{ - double b[]; - ArraySetAsSeries(b, true); - if(CopyBuffer(h_rsi, 0, 0, 3, b) < 3) return false; - cur = b[0]; - prev = b[1]; - twoAgo = b[2]; - return true; -} - -bool Regime_IsConsolidation() -{ - const int sh = 1; - double adx = 0; - if(!CopyAtShift(h_adx, sh, adx)) - return false; - if(adx >= ADX_Max) - return false; - - if(UseATRRatioFilter) - { - double atrArr[]; - ArraySetAsSeries(atrArr, true); - if(CopyBuffer(h_atr, 0, sh, ATR_SMA_Period + 1, atrArr) < ATR_SMA_Period + 1) - return false; - double sum = 0; - for(int i = 1; i <= ATR_SMA_Period; i++) - sum += atrArr[i]; - double smaAtr = sum / (double)ATR_SMA_Period; - if(smaAtr <= 0.0) - return false; - double ratio = atrArr[0] / smaAtr; - if(ratio > ATR_Ratio_Max) - return false; - } - - if(UseFlatEMAFilter) - { - double ef[], es[]; - ArraySetAsSeries(ef, true); - ArraySetAsSeries(es, true); - if(CopyBuffer(h_ema_fast, 0, sh, 1, ef) < 1) return false; - if(CopyBuffer(h_ema_slow, 0, sh, 1, es) < 1) return false; - double c = SymbolInfoDouble(g_sym, SYMBOL_BID); - if(c <= 0) return false; - double sep = MathAbs(ef[0] - es[0]) / c * 100.0; - if(sep > EMA_Separation_MaxPct) - return false; - } - - return true; -} - -bool Entry_BuyCross(double twoAgo, double prev) -{ - if(UseStrictRsiCross) - return (twoAgo <= RSI_Oversold && prev > RSI_Oversold); - const double lo = RSI_Oversold - RsiCrossSlack; - const double hi = RSI_Oversold + RsiCrossSlack; - return (twoAgo <= hi && prev > lo && prev > twoAgo); -} - -bool Entry_SellCross(double twoAgo, double prev) -{ - if(UseStrictRsiCross) - return (twoAgo >= RSI_Overbought && prev < RSI_Overbought); - const double lo = RSI_Overbought - RsiCrossSlack; - const double hi = RSI_Overbought + RsiCrossSlack; - return (twoAgo >= lo && prev < hi && prev < twoAgo); -} - -void TryCloseByRSI(ENUM_POSITION_TYPE typ, double rsi) -{ - ulong tk = GetPositionTicketByMagicSym(g_sym, MagicNumber); - if(tk == 0 || !SelectPositionTicketSymMagic(tk, g_sym, MagicNumber)) - return; - if(!UseRSI_MeanExit) - return; - if(typ == POSITION_TYPE_BUY && rsi >= RSI_Exit_Long) - trade.PositionClose(tk); - else if(typ == POSITION_TYPE_SELL && rsi <= RSI_Exit_Short) - trade.PositionClose(tk); -} - -void ManageOpenPosition(double rsi) -{ - ulong tk = GetPositionTicketByMagicSym(g_sym, MagicNumber); - if(tk == 0 || !SelectPositionTicketSymMagic(tk, g_sym, MagicNumber)) - return; - ENUM_POSITION_TYPE typ = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); - datetime openT = (datetime)PositionGetInteger(POSITION_TIME); - int barsAgo = iBarShift(g_sym, SignalTF, openT, false); - if(barsAgo >= 0 && barsAgo >= MaxBarsInTrade) - { - trade.PositionClose(tk); - return; - } - TryCloseByRSI(typ, rsi); -} - -int OnInit() -{ - g_sym = InpSymbol; - StringTrimLeft(g_sym); - StringTrimRight(g_sym); - if(StringLen(g_sym) == 0) - g_sym = _Symbol; - - if(!SymbolSelect(g_sym, true)) - { - Print("RSIConsolidation: SymbolSelect failed: ", g_sym); - return INIT_FAILED; - } - - trade.SetExpertMagicNumber(MagicNumber); - trade.SetDeviationInPoints(Slippage); - trade.SetTypeFilling(ORDER_FILLING_RETURN); - - h_rsi = iRSI(g_sym, SignalTF, RSI_Period, RSI_Price); - h_adx = iADX(g_sym, SignalTF, ADX_Period); - h_atr = iATR(g_sym, SignalTF, ATR_Period); - h_ema_fast = iMA(g_sym, SignalTF, EMA_Fast, 0, MODE_EMA, PRICE_CLOSE); - h_ema_slow = iMA(g_sym, SignalTF, EMA_Slow, 0, MODE_EMA, PRICE_CLOSE); - - if(h_rsi == INVALID_HANDLE || h_adx == INVALID_HANDLE || h_atr == INVALID_HANDLE - || h_ema_fast == INVALID_HANDLE || h_ema_slow == INVALID_HANDLE) - { - Print("RSIConsolidation: indicator init failed"); - return INIT_FAILED; - } - - Print("RSIConsolidation: symbol=", g_sym, " TF=", EnumToString(SignalTF)); - return INIT_SUCCEEDED; -} - -void OnDeinit(const int reason) -{ - if(h_rsi != INVALID_HANDLE) IndicatorRelease(h_rsi); - if(h_adx != INVALID_HANDLE) IndicatorRelease(h_adx); - if(h_atr != INVALID_HANDLE) IndicatorRelease(h_atr); - if(h_ema_fast != INVALID_HANDLE) IndicatorRelease(h_ema_fast); - if(h_ema_slow != INVALID_HANDLE) IndicatorRelease(h_ema_slow); -} - -bool EnoughHistory() -{ - int need = MathMax(RSI_Period + 3, MathMax(ADX_Period + 2, ATR_SMA_Period + 3)); - if(Bars(g_sym, SignalTF) < need) - return false; - return true; -} - -void OnTick() -{ - if(!EnoughHistory()) - return; - - if(MaxSpreadPoints > 0 && CurrentSpreadPoints(g_sym) > MaxSpreadPoints) - return; - - double rsi, rsiPrev, rsi2; - if(!RSI_Buffers(rsi, rsiPrev, rsi2)) - return; - - datetime barTime = iTime(g_sym, SignalTF, 0); - bool isNew = (barTime != g_last_bar); - - if(PositionExistsByMagicSym(g_sym, MagicNumber)) - { - ManageOpenPosition(rsi); - if(isNew) - g_last_bar = barTime; - return; - } - - if(EntryOnNewBarOnly && !isNew) - return; - - g_last_bar = barTime; - - if(!Regime_IsConsolidation()) - return; - - double atrArr[]; - ArraySetAsSeries(atrArr, true); - if(CopyBuffer(h_atr, 0, 0, 1, atrArr) < 1) - return; - double atr = atrArr[0]; - int dig = (int)SymbolInfoInteger(g_sym, SYMBOL_DIGITS); - - double slDist = atr * SL_ATR_Mult; - double tpDist = atr * TP_ATR_Mult; - double minD = MinStopsDistancePrice(g_sym); - if(slDist < minD) - slDist = minD; - if(tpDist < minD) - tpDist = minD; - - double vol = NormalizeVolume(g_sym, Lots); - - if(Entry_BuyCross(rsi2, rsiPrev)) - { - double ask = SymbolInfoDouble(g_sym, SYMBOL_ASK); - double sl = ask - slDist; - double tp = ask + tpDist; - sl = NormalizeDouble(sl, dig); - tp = NormalizeDouble(tp, dig); - trade.Buy(vol, g_sym, ask, sl, tp, "RSIConsolidation BUY"); - } - else if(Entry_SellCross(rsi2, rsiPrev)) - { - double bid = SymbolInfoDouble(g_sym, SYMBOL_BID); - double sl = bid + slDist; - double tp = bid - tpDist; - sl = NormalizeDouble(sl, dig); - tp = NormalizeDouble(tp, dig); - trade.Sell(vol, g_sym, bid, sl, tp, "RSIConsolidation SELL"); - } -} - -//+------------------------------------------------------------------+ diff --git a/lab/EAs/RSIConsolidationBTCUSD/RSIConsolidation_optimization.set b/lab/EAs/RSIConsolidationBTCUSD/RSIConsolidation_optimization.set deleted file mode 100644 index 23d8c3f..0000000 --- a/lab/EAs/RSIConsolidationBTCUSD/RSIConsolidation_optimization.set +++ /dev/null @@ -1,38 +0,0 @@ -; RSIConsolidation.mq5 v1.01 — BTCUSD preset (matches relaxed defaults) -; Strategy Tester → Inputs → Load -; -; === Symbol & session === -InpSymbol=BTCUSD -; === Timeframe & bar logic === -SignalTF=15||15||0||15||N -EntryOnNewBarOnly=true||false||0||true||N -; === Regime: consolidation (anti-trend) === -ADX_Period=23||10||1||40||Y -ADX_Max=38.0||22.0||1.0||50.0||Y -UseATRRatioFilter=true||false||0||true||N -ATR_Period=8||5||1||21||Y -ATR_SMA_Period=35||14||2||80||Y -ATR_Ratio_Max=1.55||1.0||0.02||2.0||Y -UseFlatEMAFilter=true||false||0||true||N -EMA_Fast=13||5||1||21||Y -EMA_Slow=17||10||1||34||Y -EMA_Separation_MaxPct=0.42||0.10||0.02||0.70||Y -; === RSI entries === -RSI_Period=8||5||1||21||Y -RSI_Price=0||0||0||7||Y -RSI_Oversold=28.0||18.0||1.0||42.0||Y -RSI_Overbought=68.0||55.0||1.0||82.0||Y -UseStrictRsiCross=false||false||0||true||Y -RsiCrossSlack=4.0||0.0||0.5||12.0||Y -; === Exits === -UseRSI_MeanExit=true||false||0||true||N -RSI_Exit_Long=48.0||40.0||1.0||55.0||Y -RSI_Exit_Short=52.0||45.0||1.0||60.0||Y -SL_ATR_Mult=2.15||1.0||0.05||3.5||Y -TP_ATR_Mult=2.40||1.2||0.05||4.0||Y -MaxBarsInTrade=54||20||2||120||Y -; === Risk & execution === -Lots=0.1||0.01||0.01||0.50||N -MagicNumber=20250420||20250420||1||20250420||N -Slippage=30||20||5||200||N -MaxSpreadPoints=0||0||1||400||Y diff --git a/lab/EAs/RSILadderXAUUSD/report.html b/lab/EAs/RSILadderXAUUSD/report.html deleted file mode 100644 index 203dcf4..0000000 Binary files a/lab/EAs/RSILadderXAUUSD/report.html and /dev/null differ diff --git a/lab/EAs/RSILadderXAUUSD/report.png b/lab/EAs/RSILadderXAUUSD/report.png deleted file mode 100644 index c2c91f2..0000000 Binary files a/lab/EAs/RSILadderXAUUSD/report.png and /dev/null differ diff --git a/lab/EAs/RSIMidPointHijackBTCUSD/RSIMidPointHijackBTCUSD_optimize.set b/lab/EAs/RSIMidPointHijackBTCUSD/RSIMidPointHijackBTCUSD_optimize.set deleted file mode 100644 index 9cdfe0e..0000000 --- a/lab/EAs/RSIMidPointHijackBTCUSD/RSIMidPointHijackBTCUSD_optimize.set +++ /dev/null @@ -1,45 +0,0 @@ -; RSIFollowReverseEMACross (RSIMidPointHijackBTCUSD\main.mq5) — optimization preset -; Strategy Tester → Inputs → Load -; Format: Name=value||start||step||stop||Y|N -; -; Timeframe: leave N (ENUM not a linear range). Set manually or duplicate preset per TF. -; General Settings -InpTimeframe=16385||16385||0||16385||N -InpLotSize=0.02||0.02||0.001000||0.100000||N -InpMagicNumberRSIFollow=1001||1001||1||10010||N -InpMagicNumberRSIReverse=1002||1002||1||10020||N -InpMagicNumberEMACross=1003||1003||1||10030||N -; Strategy Switches -InpEnableRSIFollow=true||false||0||true||Y -InpEnableRSIReverse=true||false||0||true||Y -InpEnableEMACross=true||false||0||true||Y -InpEnableStrategyLock=false||false||0||true||Y -InpLockProfitThreshold=0.0||0.0||5.0||200.0||Y -InpCloseOppositeTrades=false||false||0||true||Y -; RSI Follow Strategy -InpRSIPeriod=32||14||2||48||Y -InpRSIOverbought=78||65||2||88||Y -InpRSIOversold=46||20||2||50||Y -InpRSIExitLevel=44||35||1||55||Y -InpRSIFollowStartHour=23||20||1||23||Y -InpRSIFollowEndHour=8||4||1||12||Y -InpRSIFollowCloseOutsideHours=false||false||0||true||Y -; RSI Reverse Strategy -InpRSIReversePeriod=59||28||3||80||Y -InpRSIReverseOverbought=51||48||1||78||Y -InpRSIReverseOversold=49||20||2||55||Y -InpRSIReverseCrossLevel=53||45||1||60||Y -InpRSIReverseExitLevel=48||35||1||55||Y -InpRSIReverseStartHour=7||0||1||12||Y -InpRSIReverseEndHour=13||10||1||18||Y -InpRSIReverseCloseOutsideHours=false||false||0||true||Y -InpRSIReverseCooldownBars=15||0||3||30||Y -InpRSIReverseCooldownOnLoss=true||false||0||true||Y -; EMA Cross Strategy -InpEMAPeriod=120||60||10||200||Y -InpEMACrossStartHour=8||0||1||12||Y -InpEMACrossEndHour=14||12||1||20||Y -InpEMACrossCloseOutsideHours=true||false||0||true||Y -InpUseEMADistanceEntry=true||false||0||true||Y -InpEMADistancePips=160.0||40.0||20.0||400.0||Y -InpEMADistancePeriod=26||10||2||40||Y diff --git a/lab/EAs/RSIMidPointHijackBTCUSD/report.html b/lab/EAs/RSIMidPointHijackBTCUSD/report.html deleted file mode 100644 index a731713..0000000 Binary files a/lab/EAs/RSIMidPointHijackBTCUSD/report.html and /dev/null differ diff --git a/lab/EAs/RSIMidPointHijackBTCUSD/report.png b/lab/EAs/RSIMidPointHijackBTCUSD/report.png deleted file mode 100644 index 71b2983..0000000 Binary files a/lab/EAs/RSIMidPointHijackBTCUSD/report.png and /dev/null differ diff --git a/lab/EAs/RSIScalpingAdaptive/MagicNumberHelpers.mqh b/lab/EAs/RSIScalpingAdaptive/MagicNumberHelpers.mqh new file mode 100644 index 0000000..01a8846 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/MagicNumberHelpers.mqh @@ -0,0 +1,69 @@ +//+------------------------------------------------------------------+ +//| MagicNumberHelpers.mqh | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include + +//+------------------------------------------------------------------+ +bool PositionSelectByMagic(string symbol, ulong magic_number) +{ + if(!PositionSelect(symbol)) + return false; + + if(PositionGetInteger(POSITION_MAGIC) != magic_number) + { + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + if(PositionGetTicket(i) > 0) + { + if(PositionGetString(POSITION_SYMBOL) == symbol && + PositionGetInteger(POSITION_MAGIC) == magic_number) + { + return true; + } + } + } + return false; + } + + return true; +} + +//+------------------------------------------------------------------+ +bool PositionSelectByTicketSymbolAndMagic(ulong ticket, string symbol, ulong magic_number) +{ + if(!PositionSelectByTicket(ticket)) + return false; + + return (PositionGetString(POSITION_SYMBOL) == symbol && + PositionGetInteger(POSITION_MAGIC) == magic_number); +} + +//+------------------------------------------------------------------+ +bool PositionExistsByMagic(string symbol, ulong magic_number) +{ + return PositionSelectByMagic(symbol, magic_number); +} + +//+------------------------------------------------------------------+ +bool ClosePositionByMagic(CTrade &trade_obj, string symbol, ulong magic_number) +{ + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + ulong ticket = PositionGetTicket(i); + if(ticket > 0) + { + if(PositionGetString(POSITION_SYMBOL) == symbol && + PositionGetInteger(POSITION_MAGIC) == magic_number) + { + return trade_obj.PositionClose(ticket); + } + } + } + return false; +} diff --git a/lab/EAs/RSIScalpingAdaptive/NVDA_Genetic_Optimization.set b/lab/EAs/RSIScalpingAdaptive/NVDA_Genetic_Optimization.set new file mode 100644 index 0000000..81b89e6 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/NVDA_Genetic_Optimization.set @@ -0,0 +1,28 @@ +; saved on 2026.02.07 +; Genetic Algorithm Optimization Parameters for RSIScalpingNVDA +; Recommended ranges for profitable parameter discovery +; +; Format: Parameter=Start||Step||Min||Max||Optimize(Y/N) +; +; NOTE: Current values show RSI_Overbought=19 and RSI_Oversold=50 which are unusual. +; This config uses STANDARD RSI ranges (60-85 overbought, 15-40 oversold). +; If your current values are intentional, use the alternative ranges in OPTIMIZATION_GUIDE.md +; +; === PHASE 1: CORE RSI PARAMETERS (Primary Optimization) === +RSI_Period=14||1||7||21||Y +RSI_Overbought=70.0||2.0||60.0||85.0||Y +RSI_Oversold=30.0||2.0||15.0||40.0||Y +RSI_Target_Buy=75.0||2.0||65.0||90.0||Y +RSI_Target_Sell=25.0||2.0||10.0||35.0||Y + +; === PHASE 2: RISK MANAGEMENT (Secondary Optimization) === +BarsToWait=2||1||1||8||Y +TimeFrame=16387||0||16385||16390||Y + +; === PHASE 3: POSITION SIZING (Optimize with caution) === +LotSize=50.0||5.0||10.0||100.0||Y + +; === FIXED PARAMETERS (Do Not Optimize) === +RSI_Applied_Price=1||0||1||1||N +MagicNumber=12345||0||12345||12345||N +Slippage=3||0||3||3||N diff --git a/lab/EAs/RSIScalpingAdaptive/NVDA_Genetic_Optimization_Alternative.set b/lab/EAs/RSIScalpingAdaptive/NVDA_Genetic_Optimization_Alternative.set new file mode 100644 index 0000000..3fca2be --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/NVDA_Genetic_Optimization_Alternative.set @@ -0,0 +1,24 @@ +; saved on 2026.02.07 +; Alternative Genetic Algorithm Optimization - Respects Current Unusual RSI Values +; Use this if RSI_Overbought=19 and RSI_Oversold=50 are intentional +; +; Format: Parameter=Start||Step||Min||Max||Optimize(Y/N) +; +; === PHASE 1: CORE RSI PARAMETERS === +RSI_Period=14||1||7||21||Y +RSI_Overbought=19.0||1.0||15.0||30.0||Y +RSI_Oversold=50.0||2.0||40.0||60.0||Y +RSI_Target_Buy=71.0||2.0||65.0||80.0||Y +RSI_Target_Sell=70.0||2.0||60.0||75.0||Y + +; === PHASE 2: RISK MANAGEMENT === +BarsToWait=1||1||1||8||Y +TimeFrame=16387||0||16385||16390||Y + +; === PHASE 3: POSITION SIZING === +LotSize=50.0||5.0||10.0||100.0||Y + +; === FIXED PARAMETERS === +RSI_Applied_Price=1||0||1||1||N +MagicNumber=12345||0||12345||12345||N +Slippage=3||0||3||3||N diff --git a/lab/EAs/RSIScalpingAdaptive/OPTIMIZATION_GUIDE.md b/lab/EAs/RSIScalpingAdaptive/OPTIMIZATION_GUIDE.md new file mode 100644 index 0000000..d7d5ba6 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/OPTIMIZATION_GUIDE.md @@ -0,0 +1,134 @@ +# Genetic Algorithm Optimization Guide for RSIScalpingNVDA + +## Recommended Optimization Strategy + +### Phase 1: Core RSI Parameters (Primary Focus) +These parameters directly control entry/exit signals and should be optimized first. + +#### **RSI_Period** (Y - Optimize) +- **Current**: 14 +- **Recommended Range**: 7-21 +- **Step**: 1 +- **Rationale**: Standard RSI periods. Shorter = more sensitive, longer = smoother signals + +#### **RSI_Overbought** (Y - Optimize) +- **Current**: 19.0 (unusually low - verify if this is correct) +- **Standard Range**: 60.0-85.0 +- **Step**: 2.0 +- **Alternative Range** (if current is intentional): 15.0-30.0 +- **Rationale**: Level where RSI indicates overbought condition for sell entries + +#### **RSI_Oversold** (Y - Optimize) +- **Current**: 50.0 (unusually high - verify if this is correct) +- **Standard Range**: 15.0-40.0 +- **Step**: 2.0 +- **Alternative Range** (if current is intentional): 40.0-60.0 +- **Rationale**: Level where RSI indicates oversold condition for buy entries + +#### **RSI_Target_Buy** (Y - Optimize) +- **Current**: 71.0 +- **Recommended Range**: 65.0-90.0 +- **Step**: 2.0 +- **Rationale**: Exit target for long positions. Must be > RSI_Oversold + +#### **RSI_Target_Sell** (Y - Optimize) +- **Current**: 70.0 +- **Recommended Range**: 10.0-35.0 +- **Step**: 2.0 +- **Rationale**: Exit target for short positions. Must be < RSI_Overbought + +### Phase 2: Risk Management Parameters + +#### **BarsToWait** (Y - Optimize) +- **Current**: 1 +- **Recommended Range**: 1-8 +- **Step**: 1 +- **Rationale**: Bars to wait before closing when RSI goes against position. Higher = more patience + +#### **TimeFrame** (Y - Optimize) +- **Current**: 16387 (M5) +- **Recommended**: Test M1, M5, M15, H1 +- **Values**: + - M1 = 16385 + - M5 = 16387 + - M15 = 16388 + - H1 = 16390 +- **Rationale**: Different timeframes can significantly affect scalping performance + +### Phase 3: Position Sizing (Optimize with Caution) + +#### **LotSize** (Y - Optimize with Fixed Risk) +- **Current**: 50.0 +- **Recommended Range**: 10.0-100.0 +- **Step**: 5.0 +- **Note**: Consider using fixed risk % instead of fixed lot size +- **Rationale**: Position sizing affects profitability but also risk + +### Fixed Parameters (Do NOT Optimize) + +#### **RSI_Applied_Price** (N) +- **Value**: 1 (PRICE_CLOSE) +- **Rationale**: Standard choice, changing may not improve results significantly + +#### **MagicNumber** (N) +- **Value**: 12345 +- **Rationale**: Identifier only, no impact on performance + +#### **Slippage** (N) +- **Value**: 3 +- **Rationale**: Broker-specific, should match your actual slippage + +## Genetic Algorithm Settings + +### Recommended GA Settings: +- **Optimization Criterion**: Balance (or Custom: Profit Factor * Total Net Profit) +- **Population Size**: 50-100 +- **Mutation Probability**: 0.1-0.2 +- **Crossover Probability**: 0.7-0.9 +- **Optimization Passes**: 3-5 +- **Forward Testing**: Always use out-of-sample data + +### Optimization Phases: + +1. **Broad Search** (First Pass): + - Optimize: RSI_Period, RSI_Overbought, RSI_Oversold, RSI_Target_Buy, RSI_Target_Sell + - Fix: BarsToWait=1, TimeFrame=M5, LotSize=50 + +2. **Refinement** (Second Pass): + - Use best results from Phase 1 + - Optimize: BarsToWait, TimeFrame + - Narrow ranges around Phase 1 winners + +3. **Fine-Tuning** (Third Pass): + - Optimize: LotSize (if needed) + - Very narrow ranges around Phase 2 winners + +## Important Notes + +⚠️ **Current Parameter Anomaly**: +- RSI_Overbought=19 and RSI_Oversold=50 are unusual +- Standard RSI ranges: Overbought 70-80, Oversold 20-30 +- **Verify** if these are intentional or if there's a scaling issue + +✅ **Validation Checklist**: +- Ensure RSI_Target_Buy > RSI_Oversold +- Ensure RSI_Target_Sell < RSI_Overbought +- Test on sufficient historical data (at least 6-12 months) +- Use forward testing on unseen data +- Check for overfitting (too many parameters optimized) + +## Example .set File Structure + +``` +RSI_Period=14||1||7||21||Y +RSI_Overbought=70.0||2.0||60.0||85.0||Y +RSI_Oversold=30.0||2.0||15.0||40.0||Y +RSI_Target_Buy=75.0||2.0||65.0||90.0||Y +RSI_Target_Sell=25.0||2.0||10.0||35.0||Y +BarsToWait=2||1||1||8||Y +TimeFrame=16387||0||16385||16390||Y +LotSize=50.0||5.0||10.0||100.0||Y +RSI_Applied_Price=1||0||1||1||N +MagicNumber=12345||0||12345||12345||N +Slippage=3||0||3||3||N +``` diff --git a/lab/EAs/RSIScalpingAdaptive/README.md b/lab/EAs/RSIScalpingAdaptive/README.md new file mode 100644 index 0000000..5011ebb --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/README.md @@ -0,0 +1,61 @@ +# RSIScalpingAdaptive XAUUSD — MT5 Strategy Tester + +## 快速开始(MT5 原生回测) + +1. 复制整个 `RSIScalpingAdaptive` 文件夹到 `MQL5\Experts\` +2. MetaEditor 编译 `main.mq5` +3. **或用脚本自动编译 + 启动 Tester**: + +```powershell +cd lab\EAs\RSIScalpingAdaptive + +# 单次回测 2004→现在 +python run_mt5_tester.py backtest --symbol XAUUSD --from 2004.01.01 --to 2026.01.01 + +# 遗传算法优化(MT5 Strategy Tester → Genetic) +python run_mt5_tester.py optimize --symbol XAUUSD --from 2004.01.01 --to 2026.01.01 +``` + +脚本会:编译 EA → 写入 `.ini` → 启动 `terminal64.exe /config:...` → 解析 HTML 报告。 + +## 手动在 MT5 里测 + +1. 策略测试器 → 专家:`RSIScalpingAdaptive.ex5` +2. 品种:**XAUUSD**,周期:**H1** +3. 日期:**2004.01.01** — **2026.01.01** +4. 模式:每个 tick 基于真实 tick / 1分钟 OHLC +5. Inputs → Load → `XAUUSD_Backtest.set`(固定参数)或 `XAUUSD_Genetic_Optimization.set`(遗传优化) +6. **EnableAdaptive 必须 = false**(Tester 里 EA 直接用 Inputs,不做 walk-forward 网格) + +## 当前 XAUUSD 参数(MT5 Demo 2004–2026 验证) + +| 参数 | 值 | 说明 | +|------|-----|------| +| TimeFrame | H1 | | +| RSI_Overbought | **6** | 反转 RSI 带(低值=卖入场) | +| RSI_Oversold | **66** | 买入场 | +| RSI_Target_Buy | 98 | 多单止盈 | +| RSI_Target_Sell | 52 | 空单止盈 | +| BarsToWait | 12 | RSI 反向等待 K 线 | +| LotSize | 0.1 | | +| EnableAdaptive | false | Tester 固定参数 | + +**MT5 回测结果(MetaQuotes Demo,$10,000 初始):** +- 净利润 ≈ **$25,287** +- 盈利因子 **1.38** +- 夏普 **1.30** +- 交易 **1552** 笔 + +## 文件 + +| 文件 | 用途 | +|------|------| +| `run_mt5_tester.py` | 启动 MT5 Strategy Tester | +| `XAUUSD_Backtest.set` | 固定参数回测 | +| `XAUUSD_Genetic_Optimization.set` | 遗传优化搜索范围 | +| `XAUUSD_Adaptive.set` | 实盘 adaptive(EnableAdaptive=true) | + +## 实盘 adaptive + +挂 XAUUSD H1,`EnableAdaptive=true`,每月自动用上月数据选参。 +**Tester 里请关闭 adaptive**,否则每次 OnInit 会跑网格搜索,极慢且干扰优化。 diff --git a/lab/EAs/RSIScalpingAdaptive/RSIScalpingAdaptiveOptimizer.mqh b/lab/EAs/RSIScalpingAdaptive/RSIScalpingAdaptiveOptimizer.mqh new file mode 100644 index 0000000..69bdf97 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/RSIScalpingAdaptiveOptimizer.mqh @@ -0,0 +1,532 @@ +//+------------------------------------------------------------------+ +//| RSIScalpingAdaptiveOptimizer.mqh | +//| Walk-forward: backtest prior month, pick best params for next | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +struct RSIAdaptiveParams +{ + ENUM_TIMEFRAMES timeframe; + int rsi_period; + double rsi_overbought; + double rsi_oversold; + double rsi_target_buy; + double rsi_target_sell; + int bars_to_wait; + + bool IsValid() const + { + return (rsi_target_buy > rsi_oversold && + rsi_target_sell < rsi_overbought && + rsi_period >= 2 && + bars_to_wait >= 1); + } + + string ToString() const + { + return StringFormat( + "TF=%s RSI=%d OB=%.1f OS=%.1f TB=%.1f TS=%.1f Wait=%d", + EnumToString(timeframe), + rsi_period, + rsi_overbought, + rsi_oversold, + rsi_target_buy, + rsi_target_sell, + bars_to_wait + ); + } +}; + +//+------------------------------------------------------------------+ +struct RSIAdaptiveMetrics +{ + double net_profit; + int total_trades; + double win_rate; + double profit_factor; + double sharpe; + double max_drawdown_pct; + double score; +}; + +//+------------------------------------------------------------------+ +struct RSIAdaptiveSearchConfig +{ + ENUM_TIMEFRAMES timeframe; + int rsi_period_min; + int rsi_period_max; + int rsi_period_step; + double rsi_overbought_min; + double rsi_overbought_max; + double rsi_overbought_step; + double rsi_oversold_min; + double rsi_oversold_max; + double rsi_oversold_step; + double rsi_target_buy_min; + double rsi_target_buy_max; + double rsi_target_buy_step; + double rsi_target_sell_min; + double rsi_target_sell_max; + double rsi_target_sell_step; + int bars_to_wait_min; + int bars_to_wait_max; + int bars_to_wait_step; + int min_trades; + double lot_size; + double initial_balance; + int slippage_points; + double weight_sharpe; + double weight_net_profit; + double weight_profit_factor; + double weight_max_dd; + int max_combinations; +}; + +//+------------------------------------------------------------------+ +class CRSIAdaptiveOptimizer +{ +private: + string m_symbol; + datetime m_opt_start; + datetime m_opt_end; + int m_combos_tested; + + double FillBuy(const double mid, const double point, const double half_spread, const int slippage_pts) const + { + return mid + half_spread + slippage_pts * point; + } + + double FillSell(const double mid, const double point, const double half_spread, const int slippage_pts) const + { + return mid - half_spread - slippage_pts * point; + } + + double CalcTradeProfit(const ENUM_ORDER_TYPE order_type, + const double volume, + const double entry, + const double exit_px) const + { + double profit = 0.0; + if(!OrderCalcProfit(order_type, m_symbol, volume, entry, exit_px, profit)) + return 0.0; + return profit; + } + + int BarsPerYear(const ENUM_TIMEFRAMES tf) const + { + switch(tf) + { + case PERIOD_M1: return 252 * 24 * 60; + case PERIOD_M5: return 252 * 24 * 12; + case PERIOD_M15: return 252 * 24 * 4; + case PERIOD_M30: return 252 * 24 * 2; + case PERIOD_H1: return 252 * 24; + case PERIOD_H4: return 252 * 6; + case PERIOD_D1: return 252; + default: return 252 * 24; + } + } + + double ComputeSharpe(const double &equity[], const int count, const ENUM_TIMEFRAMES tf) const + { + if(count < 12) + return 0.0; + + double sum = 0.0; + double sum_sq = 0.0; + int n = 0; + + for(int i = 1; i < count; i++) + { + if(equity[i - 1] <= 0.0) + continue; + double r = (equity[i] - equity[i - 1]) / equity[i - 1]; + sum += r; + sum_sq += r * r; + n++; + } + + if(n < 10) + return 0.0; + + double mean = sum / n; + double var = sum_sq / n - mean * mean; + if(var <= 0.0) + return 0.0; + + double std = MathSqrt(var); + double scale = MathSqrt((double)BarsPerYear(tf) / (double)n); + return mean / std * scale; + } + + double ComputeScore(const RSIAdaptiveMetrics &m, const RSIAdaptiveSearchConfig &cfg) const + { + if(m.total_trades < cfg.min_trades || m.net_profit <= 0.0 || m.profit_factor < 1.05) + return -1.0e12; + + double pf = MathMin(m.profit_factor, 4.0) / 4.0; + return m.sharpe * cfg.weight_sharpe + + (m.net_profit / 2000.0) * cfg.weight_net_profit + + pf * cfg.weight_profit_factor + - m.max_drawdown_pct * cfg.weight_max_dd; + } + + bool BacktestParams(const RSIAdaptiveParams ¶ms, + const RSIAdaptiveSearchConfig &cfg, + RSIAdaptiveMetrics &out) const + { + out.net_profit = 0.0; + out.total_trades = 0; + out.win_rate = 0.0; + out.profit_factor = 0.0; + out.sharpe = 0.0; + out.max_drawdown_pct = 0.0; + out.score = -1.0e12; + + if(!params.IsValid()) + return false; + + int bt_rsi_handle = iRSI(m_symbol, params.timeframe, params.rsi_period, PRICE_CLOSE); + if(bt_rsi_handle == INVALID_HANDLE) + return false; + + int end_shift = iBarShift(m_symbol, params.timeframe, m_opt_end, false); + int start_shift = iBarShift(m_symbol, params.timeframe, m_opt_start, false); + if(end_shift < 0) + end_shift = 0; + if(start_shift < 0) + { + IndicatorRelease(bt_rsi_handle); + return false; + } + + int bars_count = start_shift - end_shift + 1; + if(bars_count < params.rsi_period + 5) + { + IndicatorRelease(bt_rsi_handle); + return false; + } + + double rsi[]; + double opens[]; + datetime times[]; + ArraySetAsSeries(rsi, false); + ArraySetAsSeries(opens, false); + ArraySetAsSeries(times, false); + + // Copy from oldest bar (start_shift): buffer[0]=oldest, buffer[n-1]=newest + if(CopyBuffer(bt_rsi_handle, 0, start_shift, bars_count, rsi) < bars_count || + CopyOpen(m_symbol, params.timeframe, start_shift, bars_count, opens) < bars_count || + CopyTime(m_symbol, params.timeframe, start_shift, bars_count, times) < bars_count) + { + IndicatorRelease(bt_rsi_handle); + return false; + } + + IndicatorRelease(bt_rsi_handle); + + const double point = SymbolInfoDouble(m_symbol, SYMBOL_POINT); + const long spread_pts = SymbolInfoInteger(m_symbol, SYMBOL_SPREAD); + const double half_spread = spread_pts * point / 2.0; + + bool has_position = false; + ENUM_ORDER_TYPE pos_type = ORDER_TYPE_BUY; + double entry_px = 0.0; + bool rsi_against = false; + int bars_against = 0; + + double balance = cfg.initial_balance; + double peak = balance; + double max_dd_pct = 0.0; + double gross_profit = 0.0; + double gross_loss = 0.0; + int wins = 0; + + double equity[]; + ArrayResize(equity, bars_count); + int equity_count = 0; + + // Chronological loop: index 0 = oldest bar in window (matches Python run_backtest.py) + for(int i = params.rsi_period + 2; i < bars_count; i++) + { + const double sig = rsi[i - 1]; + const double prev = rsi[i - 2]; + const double two = rsi[i - 3]; + const double mid = opens[i]; + + if(has_position) + { + if(pos_type == ORDER_TYPE_BUY) + { + if(sig < params.rsi_oversold) + { + if(!rsi_against) + { + rsi_against = true; + bars_against = 1; + } + else + bars_against++; + + if(bars_against >= params.bars_to_wait) + { + const double exit_px = FillSell(mid, point, half_spread, cfg.slippage_points); + const double pnl = CalcTradeProfit(ORDER_TYPE_BUY, cfg.lot_size, entry_px, exit_px); + balance += pnl; + out.total_trades++; + if(pnl >= 0.0) { gross_profit += pnl; wins++; } else gross_loss += MathAbs(pnl); + has_position = false; + rsi_against = false; + bars_against = 0; + } + } + else + { + rsi_against = false; + bars_against = 0; + if(sig >= params.rsi_target_buy) + { + const double exit_px = FillSell(mid, point, half_spread, cfg.slippage_points); + const double pnl = CalcTradeProfit(ORDER_TYPE_BUY, cfg.lot_size, entry_px, exit_px); + balance += pnl; + out.total_trades++; + if(pnl >= 0.0) { gross_profit += pnl; wins++; } else gross_loss += MathAbs(pnl); + has_position = false; + } + } + } + else + { + if(sig > params.rsi_overbought) + { + if(!rsi_against) + { + rsi_against = true; + bars_against = 1; + } + else + bars_against++; + + if(bars_against >= params.bars_to_wait) + { + const double exit_px = FillBuy(mid, point, half_spread, cfg.slippage_points); + const double pnl = CalcTradeProfit(ORDER_TYPE_SELL, cfg.lot_size, entry_px, exit_px); + balance += pnl; + out.total_trades++; + if(pnl >= 0.0) { gross_profit += pnl; wins++; } else gross_loss += MathAbs(pnl); + has_position = false; + rsi_against = false; + bars_against = 0; + } + } + else + { + rsi_against = false; + bars_against = 0; + if(sig <= params.rsi_target_sell) + { + const double exit_px = FillBuy(mid, point, half_spread, cfg.slippage_points); + const double pnl = CalcTradeProfit(ORDER_TYPE_SELL, cfg.lot_size, entry_px, exit_px); + balance += pnl; + out.total_trades++; + if(pnl >= 0.0) { gross_profit += pnl; wins++; } else gross_loss += MathAbs(pnl); + has_position = false; + } + } + } + } + + if(!has_position) + { + if(two <= params.rsi_oversold && prev > params.rsi_oversold) + { + entry_px = FillBuy(mid, point, half_spread, cfg.slippage_points); + pos_type = ORDER_TYPE_BUY; + has_position = true; + rsi_against = false; + bars_against = 0; + } + else if(two >= params.rsi_overbought && prev < params.rsi_overbought) + { + entry_px = FillSell(mid, point, half_spread, cfg.slippage_points); + pos_type = ORDER_TYPE_SELL; + has_position = true; + rsi_against = false; + bars_against = 0; + } + } + + double mark = balance; + if(has_position) + { + const double mark_mid = opens[i]; + if(pos_type == ORDER_TYPE_BUY) + mark += CalcTradeProfit(ORDER_TYPE_BUY, cfg.lot_size, entry_px, FillSell(mark_mid, point, half_spread, 0)); + else + mark += CalcTradeProfit(ORDER_TYPE_SELL, cfg.lot_size, entry_px, FillBuy(mark_mid, point, half_spread, 0)); + } + + if(equity_count < bars_count) + equity[equity_count++] = mark; + + if(mark > peak) + peak = mark; + if(peak > 0.0) + { + const double dd = (peak - mark) / peak * 100.0; + if(dd > max_dd_pct) + max_dd_pct = dd; + } + } + + if(has_position) + { + const double mid = opens[bars_count - 1]; + if(pos_type == ORDER_TYPE_BUY) + { + const double exit_px = FillSell(mid, point, half_spread, cfg.slippage_points); + const double pnl = CalcTradeProfit(ORDER_TYPE_BUY, cfg.lot_size, entry_px, exit_px); + balance += pnl; + out.total_trades++; + if(pnl >= 0.0) { gross_profit += pnl; wins++; } else gross_loss += MathAbs(pnl); + } + else + { + const double exit_px = FillBuy(mid, point, half_spread, cfg.slippage_points); + const double pnl = CalcTradeProfit(ORDER_TYPE_SELL, cfg.lot_size, entry_px, exit_px); + balance += pnl; + out.total_trades++; + if(pnl >= 0.0) { gross_profit += pnl; wins++; } else gross_loss += MathAbs(pnl); + } + } + + out.net_profit = balance - cfg.initial_balance; + out.max_drawdown_pct = max_dd_pct; + out.win_rate = (out.total_trades > 0) ? (100.0 * wins / out.total_trades) : 0.0; + out.profit_factor = (gross_loss > 0.0) ? (gross_profit / gross_loss) : (gross_profit > 0.0 ? 999.0 : 0.0); + out.sharpe = ComputeSharpe(equity, equity_count, params.timeframe); + out.score = ComputeScore(out, cfg); + return true; + } + +public: + CRSIAdaptiveOptimizer() : m_combos_tested(0) {} + + static void PreviousCalendarMonth(const datetime now, datetime &month_start, datetime &month_end) + { + MqlDateTime dt; + TimeToStruct(now, dt); + datetime this_month_start = StringToTime(StringFormat("%04d.%02d.01 00:00", dt.year, dt.mon)); + month_end = this_month_start - 1; + + TimeToStruct(month_end, dt); + month_start = StringToTime(StringFormat("%04d.%02d.01 00:00", dt.year, dt.mon)); + } + + static int MonthKey(const datetime t) + { + MqlDateTime dt; + TimeToStruct(t, dt); + return dt.year * 100 + dt.mon; + } + + bool Optimize(const string symbol, + const datetime opt_start, + const datetime opt_end, + const RSIAdaptiveParams &fallback, + const RSIAdaptiveSearchConfig &cfg, + RSIAdaptiveParams &best_out, + RSIAdaptiveMetrics &best_metrics_out) + { + m_symbol = symbol; + m_opt_start = opt_start; + m_opt_end = opt_end; + m_combos_tested = 0; + + best_out = fallback; + best_metrics_out.net_profit = 0.0; + best_metrics_out.total_trades = 0; + best_metrics_out.win_rate = 0.0; + best_metrics_out.profit_factor = 0.0; + best_metrics_out.sharpe = 0.0; + best_metrics_out.max_drawdown_pct = 0.0; + best_metrics_out.score = -1.0e12; + + RSIAdaptiveMetrics fallback_metrics; + if(BacktestParams(fallback, cfg, fallback_metrics)) + { + if(fallback_metrics.score > best_metrics_out.score) + { + best_out = fallback; + best_metrics_out = fallback_metrics; + } + m_combos_tested++; + } + + bool stop_search = false; + for(int rp = cfg.rsi_period_min; rp <= cfg.rsi_period_max && !stop_search; rp += cfg.rsi_period_step) + { + for(double ob = cfg.rsi_overbought_min; ob <= cfg.rsi_overbought_max + 0.001 && !stop_search; ob += cfg.rsi_overbought_step) + { + for(double os = cfg.rsi_oversold_min; os <= cfg.rsi_oversold_max + 0.001 && !stop_search; os += cfg.rsi_oversold_step) + { + for(double tb = cfg.rsi_target_buy_min; tb <= cfg.rsi_target_buy_max + 0.001 && !stop_search; tb += cfg.rsi_target_buy_step) + { + for(double ts = cfg.rsi_target_sell_min; ts <= cfg.rsi_target_sell_max + 0.001 && !stop_search; ts += cfg.rsi_target_sell_step) + { + for(int bw = cfg.bars_to_wait_min; bw <= cfg.bars_to_wait_max && !stop_search; bw += cfg.bars_to_wait_step) + { + if(m_combos_tested >= cfg.max_combinations) + { + stop_search = true; + break; + } + + RSIAdaptiveParams p; + p.timeframe = cfg.timeframe; + p.rsi_period = rp; + p.rsi_overbought = ob; + p.rsi_oversold = os; + p.rsi_target_buy = tb; + p.rsi_target_sell = ts; + p.bars_to_wait = bw; + + if(!p.IsValid()) + continue; + + RSIAdaptiveMetrics m; + if(!BacktestParams(p, cfg, m)) + continue; + + m_combos_tested++; + if(m.score > best_metrics_out.score) + { + best_out = p; + best_metrics_out = m; + } + } + } + } + } + } + } + + PrintFormat("[Adaptive] %s tested %d combos | window %s -> %s", + symbol, + m_combos_tested, + TimeToString(opt_start, TIME_DATE), + TimeToString(opt_end, TIME_DATE)); + PrintFormat("[Adaptive] Best score=%.4f net=$%.2f sharpe=%.2f PF=%.2f trades=%d DD=%.2f%% | %s", + best_metrics_out.score, + best_metrics_out.net_profit, + best_metrics_out.sharpe, + best_metrics_out.profit_factor, + best_metrics_out.total_trades, + best_metrics_out.max_drawdown_pct, + best_out.ToString()); + + return (best_metrics_out.score > -1.0e11); + } + + int CombosTested() const { return m_combos_tested; } +}; diff --git a/lab/EAs/RSIScalpingAdaptive/RSIScalpingSuperMagic.mqh b/lab/EAs/RSIScalpingAdaptive/RSIScalpingSuperMagic.mqh new file mode 100644 index 0000000..dbd3bb0 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/RSIScalpingSuperMagic.mqh @@ -0,0 +1,6 @@ +#ifndef RSI_SCALPING_SUPER_MAGIC_MQH +#define RSI_SCALPING_SUPER_MAGIC_MQH + +#define RS_SUPER_MAGIC_BASE 941001 + +#endif diff --git a/lab/EAs/RSIScalpingAdaptive/RSIScalpingSuperParams.mqh b/lab/EAs/RSIScalpingAdaptive/RSIScalpingSuperParams.mqh new file mode 100644 index 0000000..8dd12cb --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/RSIScalpingSuperParams.mqh @@ -0,0 +1,60 @@ +// RSIScalpingSuperParams.mqh — per-symbol H1 RSI scalping +// XAUUSD: MT5 genetic 2026-06-23. Forex: run MT5 Genetic per symbol (see SUPER_EA_README.md) +#ifndef RSI_SCALPING_SUPER_PARAMS_MQH +#define RSI_SCALPING_SUPER_PARAMS_MQH + +#include "RSIScalpingSuperMagic.mqh" + +#define RS_SUPER_SLOT_COUNT 9 + +struct RSSlotParams +{ + int rsiPeriod; + double rsiOverbought; + double rsiOversold; + double rsiTargetBuy; + double rsiTargetSell; + int barsToWait; + double lotSize; +}; + +struct RSSlotConfig +{ + string symbol; + int magic; + bool enabled; + RSSlotParams p; +}; + +const RSSlotConfig RS_SUPER_SLOTS[RS_SUPER_SLOT_COUNT] = +{ + // EURUSD — pending MT5 genetic (disable until optimized) + { "EURUSD", RS_SUPER_MAGIC_BASE + 1, false, + { 14, 8.0, 72.0, 85.0, 18.0, 8, 0.10 } }, + // GBPUSD — pending MT5 genetic + { "GBPUSD", RS_SUPER_MAGIC_BASE + 2, false, + { 12, 7.0, 70.0, 88.0, 22.0, 10, 0.10 } }, + // USDJPY — pending MT5 genetic + { "USDJPY", RS_SUPER_MAGIC_BASE + 3, false, + { 16, 5.0, 76.0, 82.0, 28.0, 9, 0.10 } }, + // AUDUSD — pending MT5 genetic + { "AUDUSD", RS_SUPER_MAGIC_BASE + 4, false, + { 15, 9.0, 68.0, 86.0, 20.0, 7, 0.10 } }, + // USDCHF — pending MT5 genetic + { "USDCHF", RS_SUPER_MAGIC_BASE + 5, false, + { 13, 6.0, 74.0, 84.0, 26.0, 11, 0.10 } }, + // USDCAD — pending MT5 genetic + { "USDCAD", RS_SUPER_MAGIC_BASE + 6, false, + { 14, 10.0, 66.0, 87.0, 16.0, 8, 0.10 } }, + // NZDUSD — pending MT5 genetic + { "NZDUSD", RS_SUPER_MAGIC_BASE + 7, false, + { 11, 8.0, 71.0, 89.0, 19.0, 9, 0.10 } }, + // EURJPY — pending MT5 genetic + { "EURJPY", RS_SUPER_MAGIC_BASE + 8, false, + { 18, 4.0, 77.0, 80.0, 30.0, 10, 0.10 } }, + // XAUUSD — MT5 genetic profit=$28,071 PF=1.47 DD=5.3% (2004–2026) + { "XAUUSD", RS_SUPER_MAGIC_BASE + 9, true, + { 14, 19.0, 68.0, 89.0, 20.0, 12, 0.10 } }, +}; + +#endif diff --git a/lab/EAs/RSIScalpingAdaptive/SUPER_EA_README.md b/lab/EAs/RSIScalpingAdaptive/SUPER_EA_README.md new file mode 100644 index 0000000..b24296e --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/SUPER_EA_README.md @@ -0,0 +1,50 @@ +# RSIScalpingSuper — 多品种 Super EA + +9 个品种 H1 RSI Scalping 组合:**EURUSD GBPUSD USDJPY AUDUSD USDCHF USDCAD NZDUSD EURJPY XAUUSD** + +每个品种独立 magic、独立 RSI 参数(MT5 遗传算法 2004–2026 优化)。 + +## MT5 组合回测 + +```powershell +cd lab\EAs\RSIScalpingAdaptive + +# 编译 + 启动 MT5 Strategy Tester(9 品种组合) +python run_mt5_tester.py backtest --expert super --symbol EURUSD --from 2004.01.01 --to 2026.01.01 +``` + +手动测试: +1. 专家:`RSIScalpingAdaptive\SuperEA.ex5`(或 `RSIScalpingSuper.ex5`) +2. 挂到 **EURUSD H1** +3. Inputs → Load → `SuperEA_portfolio.set` +4. 日期 2004.01.01 – 2026.01.01 + +## 逐品种 MT5 遗传优化(更新参数表) + +```powershell +# 全部 9 品种依次跑 MT5 Genetic(约 30min/品种) +python run_mt5_cluster.py optimize --all-forex + +# 或单个 +python run_mt5_tester.py optimize --symbol EURUSD --from 2004.01.01 --to 2026.01.01 +``` + +优化完成后自动生成 `RSIScalpingSuperParams.mqh`。 + +## 文件 + +| 文件 | 说明 | +|------|------| +| `SuperEA.mq5` | 多品种 Super EA | +| `RSIScalpingSuperParams.mqh` | 每品种硬编码参数 | +| `SuperEA_portfolio.set` | Tester 输入 | +| `run_mt5_cluster.py` | 批量 MT5 遗传优化 | +| `run_mt5_tester.py` | 单 EA / Super EA Tester 启动器 | + +## 已验证 + +| 品种 | 净利润 | PF | 回撤 | 参数来源 | +|------|--------|-----|------|----------| +| XAUUSD | $10,470 | 1.56 | 9.1% | MT5 genetic Pass 306 | + +外汇品种需跑 `run_mt5_cluster.py optimize` 写入真实参数(不能共用 XAUUSD 参数)。 diff --git a/lab/EAs/RSIScalpingAdaptive/SuperEA.mq5 b/lab/EAs/RSIScalpingAdaptive/SuperEA.mq5 new file mode 100644 index 0000000..253e31e --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/SuperEA.mq5 @@ -0,0 +1,331 @@ +//+------------------------------------------------------------------+ +//| RSIScalpingSuper.mq5 | +//| Multi-symbol RSI Scalping portfolio (H1, MT5-optimized params) | +//+------------------------------------------------------------------+ +#property copyright "Frontline" +#property version "1.00" +#property description "RSI Scalping Super EA — EURUSD GBPUSD USDJPY AUDUSD USDCHF USDCAD NZDUSD EURJPY XAUUSD" + +#include +#include "MagicNumberHelpers.mqh" +#include "RSIScalpingSuperParams.mqh" + +input group "=== Portfolio ===" +input double LotMultiplier = 1.0; +input bool ScaleLotsToDeposit = true; +input double ReferenceDeposit = 10000.0; +input int Slippage = 3; +input int MaxOpenPositions = 9; + +input group "=== Slot toggles ===" +input bool Enable_EURUSD = true; +input bool Enable_GBPUSD = true; +input bool Enable_USDJPY = true; +input bool Enable_AUDUSD = true; +input bool Enable_USDCHF = true; +input bool Enable_USDCAD = true; +input bool Enable_NZDUSD = true; +input bool Enable_EURJPY = true; +input bool Enable_XAUUSD = true; + +#define RS_TF PERIOD_H1 + +struct RSSymCtx +{ + string name; + RSSlotParams p; + int magic; + bool enabled; + int rsiHandle; + datetime lastBar; + bool posOpen; + ulong posTicket; + ENUM_POSITION_TYPE posType; + bool rsiAgainst; + int barsAgainst; +}; + +CTrade g_trade; +RSSymCtx g_ctx[RS_SUPER_SLOT_COUNT]; +int g_count = 0; + +//+------------------------------------------------------------------+ +bool SlotEnabled(const int idx) +{ + switch(idx) + { + case 0: return Enable_EURUSD; + case 1: return Enable_GBPUSD; + case 2: return Enable_USDJPY; + case 3: return Enable_AUDUSD; + case 4: return Enable_USDCHF; + case 5: return Enable_USDCAD; + case 6: return Enable_NZDUSD; + case 7: return Enable_EURJPY; + case 8: return Enable_XAUUSD; + } + return true; +} + +//+------------------------------------------------------------------+ +double CalcLot(const string sym, const double baseLot) +{ + double lot = baseLot * LotMultiplier; + if(ScaleLotsToDeposit && ReferenceDeposit > 0) + { + double bal = AccountInfoDouble(ACCOUNT_BALANCE); + lot *= bal / ReferenceDeposit; + } + double step = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP); + double minL = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN); + double maxL = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX); + if(step > 0) + lot = MathFloor(lot / step) * step; + if(lot < minL) lot = minL; + if(lot > maxL) lot = maxL; + return lot; +} + +//+------------------------------------------------------------------+ +int CountOurPositions() +{ + int n = 0; + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + if(PositionGetTicket(i) == 0) continue; + ulong mg = (ulong)PositionGetInteger(POSITION_MAGIC); + if(mg >= (ulong)RS_SUPER_MAGIC_BASE && mg < (ulong)(RS_SUPER_MAGIC_BASE + RS_SUPER_SLOT_COUNT + 1)) + n++; + } + return n; +} + +//+------------------------------------------------------------------+ +bool UpdateRsi(RSSymCtx &c, double &cur, double &prev, double &two) +{ + double buf[]; + ArraySetAsSeries(buf, true); + if(CopyBuffer(c.rsiHandle, 0, 0, 3, buf) < 3) + return false; + cur = buf[0]; + prev = buf[1]; + two = buf[2]; + return true; +} + +//+------------------------------------------------------------------+ +void SyncPosition(RSSymCtx &c) +{ + if(!PositionExistsByMagic(c.name, c.magic)) + { + c.posOpen = false; + c.posTicket = 0; + c.rsiAgainst = false; + c.barsAgainst = 0; + return; + } + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + ulong t = PositionGetTicket(i); + if(t == 0) continue; + if(PositionGetString(POSITION_SYMBOL) != c.name) continue; + if(PositionGetInteger(POSITION_MAGIC) != c.magic) continue; + c.posTicket = t; + c.posOpen = true; + c.posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + return; + } +} + +//+------------------------------------------------------------------+ +void CloseSlot(RSSymCtx &c) +{ + g_trade.SetExpertMagicNumber(c.magic); + ClosePositionByMagic(g_trade, c.name, c.magic); + c.posOpen = false; + c.posTicket = 0; + c.rsiAgainst = false; + c.barsAgainst = 0; +} + +//+------------------------------------------------------------------+ +void OpenBuy(RSSymCtx &c) +{ + if(CountOurPositions() >= MaxOpenPositions) return; + if(PositionExistsByMagic(c.name, c.magic)) return; + g_trade.SetExpertMagicNumber(c.magic); + double ask = SymbolInfoDouble(c.name, SYMBOL_ASK); + double lot = CalcLot(c.name, c.p.lotSize); + if(g_trade.Buy(lot, c.name, ask, 0, 0, "RS Super Buy")) + { + ulong t = g_trade.ResultOrder(); + if(t > 0 && PositionSelectByTicketSymbolAndMagic(t, c.name, c.magic)) + { + c.posTicket = t; + c.posOpen = true; + c.posType = POSITION_TYPE_BUY; + c.rsiAgainst = false; + c.barsAgainst = 0; + } + } +} + +//+------------------------------------------------------------------+ +void OpenSell(RSSymCtx &c) +{ + if(CountOurPositions() >= MaxOpenPositions) return; + if(PositionExistsByMagic(c.name, c.magic)) return; + g_trade.SetExpertMagicNumber(c.magic); + double bid = SymbolInfoDouble(c.name, SYMBOL_BID); + double lot = CalcLot(c.name, c.p.lotSize); + if(g_trade.Sell(lot, c.name, bid, 0, 0, "RS Super Sell")) + { + ulong t = g_trade.ResultOrder(); + if(t > 0 && PositionSelectByTicketSymbolAndMagic(t, c.name, c.magic)) + { + c.posTicket = t; + c.posOpen = true; + c.posType = POSITION_TYPE_SELL; + c.rsiAgainst = false; + c.barsAgainst = 0; + } + } +} + +//+------------------------------------------------------------------+ +void ManageExit(RSSymCtx &c, const double cur) +{ + if(!c.posOpen) + SyncPosition(c); + if(!c.posOpen) return; + + if(!PositionSelectByTicketSymbolAndMagic(c.posTicket, c.name, c.magic)) + { + c.posOpen = false; + c.posTicket = 0; + return; + } + + if(c.posType == POSITION_TYPE_BUY) + { + if(cur < c.p.rsiOversold) + { + if(!c.rsiAgainst) { c.rsiAgainst = true; c.barsAgainst = 1; } + else c.barsAgainst++; + if(c.barsAgainst >= c.p.barsToWait) { CloseSlot(c); return; } + } + else + { + c.rsiAgainst = false; + c.barsAgainst = 0; + if(cur >= c.p.rsiTargetBuy) CloseSlot(c); + } + } + else + { + if(cur > c.p.rsiOverbought) + { + if(!c.rsiAgainst) { c.rsiAgainst = true; c.barsAgainst = 1; } + else c.barsAgainst++; + if(c.barsAgainst >= c.p.barsToWait) { CloseSlot(c); return; } + } + else + { + c.rsiAgainst = false; + c.barsAgainst = 0; + if(cur <= c.p.rsiTargetSell) CloseSlot(c); + } + } +} + +//+------------------------------------------------------------------+ +void CheckEntry(RSSymCtx &c, const double prev, const double two) +{ + if(c.posOpen || PositionExistsByMagic(c.name, c.magic)) return; + if(two <= c.p.rsiOversold && prev > c.p.rsiOversold) + OpenBuy(c); + if(two >= c.p.rsiOverbought && prev < c.p.rsiOverbought) + OpenSell(c); +} + +//+------------------------------------------------------------------+ +void ProcessSlot(RSSymCtx &c) +{ + if(!c.enabled) return; + if(!SymbolSelect(c.name, true)) return; + if(Bars(c.name, RS_TF) < c.p.rsiPeriod + 2) return; + + datetime bt = iTime(c.name, RS_TF, 0); + if(bt <= 0 || bt == c.lastBar) return; + c.lastBar = bt; + + double cur, prev, two; + if(!UpdateRsi(c, cur, prev, two)) return; + + ManageExit(c, cur); + if(!c.posOpen) + CheckEntry(c, prev, two); +} + +//+------------------------------------------------------------------+ +int OnInit() +{ + g_trade.SetDeviationInPoints(Slippage); + g_trade.SetTypeFilling(ORDER_FILLING_FOK); + g_count = 0; + + for(int i = 0; i < RS_SUPER_SLOT_COUNT; i++) + { + const RSSlotConfig cfg = RS_SUPER_SLOTS[i]; + RSSymCtx c; + c.name = cfg.symbol; + c.p = cfg.p; + c.magic = cfg.magic; + c.enabled = cfg.enabled && SlotEnabled(i); + c.rsiHandle = INVALID_HANDLE; + c.lastBar = 0; + c.posOpen = false; + c.posTicket = 0; + c.rsiAgainst = false; + c.barsAgainst = 0; + + if(c.enabled) + { + SymbolSelect(c.name, true); + c.rsiHandle = iRSI(c.name, RS_TF, c.p.rsiPeriod, PRICE_CLOSE); + if(c.rsiHandle == INVALID_HANDLE) + { + Print("Failed RSI handle for ", c.name); + c.enabled = false; + } + SyncPosition(c); + } + g_ctx[g_count] = c; + g_count++; + } + + Print("RSIScalpingSuper initialized slots=", g_count); + return INIT_SUCCEEDED; +} + +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + for(int i = 0; i < g_count; i++) + if(g_ctx[i].rsiHandle != INVALID_HANDLE) + IndicatorRelease(g_ctx[i].rsiHandle); + Comment(""); +} + +//+------------------------------------------------------------------+ +void OnTick() +{ + string status = "RSIScalpingSuper\n"; + for(int i = 0; i < g_count; i++) + { + ProcessSlot(g_ctx[i]); + if(g_ctx[i].enabled) + status += StringFormat("%s %s | ", g_ctx[i].name, g_ctx[i].posOpen ? "IN" : "--"); + } + Comment(status); +} diff --git a/lab/EAs/RSIScalpingAdaptive/SuperEA_portfolio.set b/lab/EAs/RSIScalpingAdaptive/SuperEA_portfolio.set new file mode 100644 index 0000000..0680d8a --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/SuperEA_portfolio.set @@ -0,0 +1,15 @@ +; RSIScalpingSuper portfolio — attach to EURUSD H1 in Strategy Tester +LotMultiplier=1.0||1.0||0.100000||10.000000||N +ScaleLotsToDeposit=true||false||0||true||N +ReferenceDeposit=10000.0||10000.0||1000.000000||100000.000000||N +Slippage=3||3||1||30||N +MaxOpenPositions=9||9||1||90||N +Enable_EURUSD=true||false||0||true||N +Enable_GBPUSD=true||false||0||true||N +Enable_USDJPY=true||false||0||true||N +Enable_AUDUSD=true||false||0||true||N +Enable_USDCHF=true||false||0||true||N +Enable_USDCAD=true||false||0||true||N +Enable_NZDUSD=true||false||0||true||N +Enable_EURJPY=true||false||0||true||N +Enable_XAUUSD=true||false||0||true||N diff --git a/lab/EAs/RSIScalpingAdaptive/XAUUSD_Adaptive.set b/lab/EAs/RSIScalpingAdaptive/XAUUSD_Adaptive.set new file mode 100644 index 0000000..4ffddee --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/XAUUSD_Adaptive.set @@ -0,0 +1,41 @@ +; RSIScalpingAdaptive XAUUSD — monthly walk-forward adaptive params +; Attach to XAUUSD chart (H1 recommended). EA re-optimizes each calendar month. +; +TimeFrame=16385||16385||0||16385||N +RSI_Period=14||14||1||140||N +RSI_Applied_Price=1||1||0||7||N +RSI_Overbought=71.0||71.0||1.000000||100.000000||N +RSI_Oversold=57.0||57.0||1.000000||100.000000||N +RSI_Target_Buy=80.0||80.0||1.000000||100.000000||N +RSI_Target_Sell=57.0||57.0||1.000000||100.000000||N +BarsToWait=1||1||1||50||N +LotSize=0.1||0.1||0.010000||1.000000||N +MagicNumber=129102315||129102315||1||1291023150||N +Slippage=3||3||1||30||N +EnableAdaptive=true||false||0||true||N +OptimizationCheckSeconds=3600||3600||60||86400||N +MinTradesForSelection=8||8||1||80||N +MaxCombinations=600||600||50||2000||N +BacktestInitialBalance=10000.0||10000.0||1000.000000||100000.000000||N +ScoreWeightSharpe=0.35||0.35||0.035000||3.500000||N +ScoreWeightNetProfit=0.25||0.25||0.025000||2.500000||N +ScoreWeightProfitFactor=0.15||0.15||0.015000||1.500000||N +ScoreWeightMaxDD=0.10||0.10||0.010000||1.000000||N +Search_RSI_Period_Min=12||12||1||120||N +Search_RSI_Period_Max=18||18||1||180||N +Search_RSI_Period_Step=2||2||1||20||N +Search_RSI_Overbought_Min=65.0||65.0||1.000000||100.000000||N +Search_RSI_Overbought_Max=77.0||77.0||1.000000||100.000000||N +Search_RSI_Overbought_Step=3.0||3.0||0.300000||30.000000||N +Search_RSI_Oversold_Min=50.0||50.0||1.000000||100.000000||N +Search_RSI_Oversold_Max=63.0||63.0||1.000000||100.000000||N +Search_RSI_Oversold_Step=3.0||3.0||0.300000||30.000000||N +Search_RSI_Target_Buy_Min=75.0||75.0||1.000000||100.000000||N +Search_RSI_Target_Buy_Max=86.0||86.0||1.000000||100.000000||N +Search_RSI_Target_Buy_Step=3.0||3.0||0.300000||30.000000||N +Search_RSI_Target_Sell_Min=50.0||50.0||1.000000||100.000000||N +Search_RSI_Target_Sell_Max=63.0||63.0||1.000000||100.000000||N +Search_RSI_Target_Sell_Step=3.0||3.0||0.300000||30.000000||N +Search_BarsToWait_Min=1||1||1||10||N +Search_BarsToWait_Max=4||4||1||40||N +Search_BarsToWait_Step=1||1||1||10||N diff --git a/lab/EAs/RSIScalpingAdaptive/XAUUSD_Backtest.set b/lab/EAs/RSIScalpingAdaptive/XAUUSD_Backtest.set new file mode 100644 index 0000000..f26c3b5 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/XAUUSD_Backtest.set @@ -0,0 +1,42 @@ +; RSIScalpingAdaptive XAUUSD — MT5 Genetic Optimization winner (Pass 306) +; MetaQuotes Demo 2004.01.01–2026.01.01 | Profit $10,470 | PF 1.56 | DD 9.1% | Sharpe 2.79 +; Strategy Tester → Inputs → Load +; +TimeFrame=16385||16385||0||16385||N +RSI_Period=17||17||1||140||N +RSI_Applied_Price=1||1||0||7||N +RSI_Overbought=6.0||6.0||1.000000||100.000000||N +RSI_Oversold=74.0||74.0||1.000000||100.000000||N +RSI_Target_Buy=79.0||79.0||1.000000||100.000000||N +RSI_Target_Sell=24.0||24.0||1.000000||100.000000||N +BarsToWait=12||12||1||50||N +LotSize=0.1||0.1||0.010000||1.000000||N +MagicNumber=129102315||129102315||1||1291023150||N +Slippage=3||3||1||30||N +EnableAdaptive=false||false||0||true||N +OptimizationCheckSeconds=3600||3600||60||86400||N +MinTradesForSelection=8||8||1||80||N +MaxCombinations=600||600||50||2000||N +BacktestInitialBalance=10000.0||10000.0||1000.000000||100000.000000||N +ScoreWeightSharpe=0.35||0.35||0.035000||3.500000||N +ScoreWeightNetProfit=0.25||0.25||0.025000||2.500000||N +ScoreWeightProfitFactor=0.15||0.15||0.015000||1.500000||N +ScoreWeightMaxDD=0.10||0.10||0.010000||1.000000||N +Search_RSI_Period_Min=12||12||1||120||N +Search_RSI_Period_Max=18||18||1||180||N +Search_RSI_Period_Step=2||2||1||20||N +Search_RSI_Overbought_Min=65.0||65.0||1.000000||100.000000||N +Search_RSI_Overbought_Max=77.0||77.0||1.000000||100.000000||N +Search_RSI_Overbought_Step=3.0||3.0||0.300000||30.000000||N +Search_RSI_Oversold_Min=50.0||50.0||1.000000||100.000000||N +Search_RSI_Oversold_Max=63.0||63.0||1.000000||100.000000||N +Search_RSI_Oversold_Step=3.0||3.0||0.300000||30.000000||N +Search_RSI_Target_Buy_Min=75.0||75.0||1.000000||100.000000||N +Search_RSI_Target_Buy_Max=86.0||86.0||1.000000||100.000000||N +Search_RSI_Target_Buy_Step=3.0||3.0||0.300000||30.000000||N +Search_RSI_Target_Sell_Min=50.0||50.0||1.000000||100.000000||N +Search_RSI_Target_Sell_Max=63.0||63.0||1.000000||100.000000||N +Search_RSI_Target_Sell_Step=3.0||3.0||0.300000||30.000000||N +Search_BarsToWait_Min=1||1||1||10||N +Search_BarsToWait_Max=4||4||1||40||N +Search_BarsToWait_Step=1||1||1||10||N diff --git a/lab/EAs/RSIScalpingAdaptive/XAUUSD_Genetic_Optimization.set b/lab/EAs/RSIScalpingAdaptive/XAUUSD_Genetic_Optimization.set new file mode 100644 index 0000000..f06ed8f --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/XAUUSD_Genetic_Optimization.set @@ -0,0 +1,42 @@ +; RSIScalpingAdaptive XAUUSD — MT5 Genetic Optimization +; Strategy Tester → Optimization → Genetic algorithm → Load this set +; Criterion: Balance + Profit Factor (or Custom max) +; +TimeFrame=16385||16385||0||16388||N +RSI_Period=14||10||1||21||Y +RSI_Applied_Price=1||1||0||7||N +RSI_Overbought=6.0||4.0||1.0||30.0||Y +RSI_Oversold=66.0||50.0||2.0||78.0||Y +RSI_Target_Buy=98.0||75.0||2.0||99.0||Y +RSI_Target_Sell=52.0||4.0||2.0||65.0||Y +BarsToWait=12||1||1||12||Y +LotSize=0.1||0.1||0||0.1||N +MagicNumber=129102315||129102315||1||1291023150||N +Slippage=3||3||1||30||N +EnableAdaptive=false||false||0||true||N +OptimizationCheckSeconds=3600||3600||60||86400||N +MinTradesForSelection=8||8||1||80||N +MaxCombinations=600||600||50||2000||N +BacktestInitialBalance=10000.0||10000.0||1000.000000||100000.000000||N +ScoreWeightSharpe=0.35||0.35||0.035000||3.500000||N +ScoreWeightNetProfit=0.25||0.25||0.025000||2.500000||N +ScoreWeightProfitFactor=0.15||0.15||0.015000||1.500000||N +ScoreWeightMaxDD=0.10||0.10||0.010000||1.000000||N +Search_RSI_Period_Min=12||12||1||120||N +Search_RSI_Period_Max=18||18||1||180||N +Search_RSI_Period_Step=2||2||1||20||N +Search_RSI_Overbought_Min=65.0||65.0||1.000000||100.000000||N +Search_RSI_Overbought_Max=77.0||77.0||1.000000||100.000000||N +Search_RSI_Overbought_Step=3.0||3.0||0.300000||30.000000||N +Search_RSI_Oversold_Min=50.0||50.0||1.000000||100.000000||N +Search_RSI_Oversold_Max=63.0||63.0||1.000000||100.000000||N +Search_RSI_Oversold_Step=3.0||3.0||0.300000||30.000000||N +Search_RSI_Target_Buy_Min=75.0||75.0||1.000000||100.000000||N +Search_RSI_Target_Buy_Max=86.0||86.0||1.000000||100.000000||N +Search_RSI_Target_Buy_Step=3.0||3.0||0.300000||30.000000||N +Search_RSI_Target_Sell_Min=50.0||50.0||1.000000||100.000000||N +Search_RSI_Target_Sell_Max=63.0||63.0||1.000000||100.000000||N +Search_RSI_Target_Sell_Step=3.0||3.0||0.300000||30.000000||N +Search_BarsToWait_Min=1||1||1||10||N +Search_BarsToWait_Max=4||4||1||40||N +Search_BarsToWait_Step=1||1||1||10||N diff --git a/lab/EAs/RSIScalpingAdaptive/main.mq5 b/lab/EAs/RSIScalpingAdaptive/main.mq5 new file mode 100644 index 0000000..77fb1f9 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/main.mq5 @@ -0,0 +1,488 @@ +//+------------------------------------------------------------------+ +//| RSIScalpingAdaptiveXAUUSD.mq5 | +//| RSI Scalping with monthly walk-forward parameter adaptation | +//| Backtests prior calendar month on each new month, applies best | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "2.00" +#property description "XAUUSD RSI Scalping — monthly walk-forward adaptive params" + +#include +#include "MagicNumberHelpers.mqh" +#include "RSIScalpingAdaptiveOptimizer.mqh" + +//--- Fallback defaults (XAUUSD 123.set baseline) +input group "=== Fallback / seed parameters ===" +input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1; +input int RSI_Period = 17; +input ENUM_APPLIED_PRICE RSI_Applied_Price = PRICE_CLOSE; +input double RSI_Overbought = 6.0; +input double RSI_Oversold = 74.0; +input double RSI_Target_Buy = 79.0; +input double RSI_Target_Sell = 24.0; +input int BarsToWait = 12; + +input group "=== Execution ===" +input double LotSize = 0.1; +input int MagicNumber = 129102315; +input int Slippage = 3; + +input group "=== Adaptive walk-forward ===" +input bool EnableAdaptive = true; +input int OptimizationCheckSeconds = 3600; // Timer interval for new-month check +input int MinTradesForSelection = 8; +input int MaxCombinations = 600; +input double BacktestInitialBalance = 10000.0; +input double ScoreWeightSharpe = 0.35; +input double ScoreWeightNetProfit = 0.25; +input double ScoreWeightProfitFactor = 0.15; +input double ScoreWeightMaxDD = 0.10; + +input group "=== XAUUSD search ranges ===" +input int Search_RSI_Period_Min = 12; +input int Search_RSI_Period_Max = 18; +input int Search_RSI_Period_Step = 2; +input double Search_RSI_Overbought_Min = 65.0; +input double Search_RSI_Overbought_Max = 77.0; +input double Search_RSI_Overbought_Step = 3.0; +input double Search_RSI_Oversold_Min = 50.0; +input double Search_RSI_Oversold_Max = 63.0; +input double Search_RSI_Oversold_Step = 3.0; +input double Search_RSI_Target_Buy_Min = 75.0; +input double Search_RSI_Target_Buy_Max = 86.0; +input double Search_RSI_Target_Buy_Step = 3.0; +input double Search_RSI_Target_Sell_Min = 50.0; +input double Search_RSI_Target_Sell_Max = 63.0; +input double Search_RSI_Target_Sell_Step = 3.0; +input int Search_BarsToWait_Min = 1; +input int Search_BarsToWait_Max = 4; +input int Search_BarsToWait_Step = 1; + +CTrade trade; +CRSIAdaptiveOptimizer g_optimizer; + +int rsi_handle = INVALID_HANDLE; +double rsi_buffer[]; +double rsi_prev, rsi_current, rsi_two_bars_ago; + +bool position_open = false; +ulong position_ticket = 0; +ENUM_POSITION_TYPE current_position_type = POSITION_TYPE_BUY; +datetime last_bar_time = 0; +bool rsi_against_position = false; +int bars_against_count = 0; + +RSIAdaptiveParams g_active; +RSIAdaptiveMetrics g_last_metrics; +int g_applied_month_key = 0; +bool g_optimization_done = false; +bool g_optimizing = false; +string g_status_line = ""; + +//+------------------------------------------------------------------+ +void SyncOpenPosition() +{ + if(!PositionExistsByMagic(_Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + return; + } + + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + ulong ticket = PositionGetTicket(i); + if(ticket == 0) + continue; + if(PositionGetString(POSITION_SYMBOL) != _Symbol) + continue; + if(PositionGetInteger(POSITION_MAGIC) != MagicNumber) + continue; + + position_ticket = ticket; + position_open = true; + current_position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); + return; + } +} + +//+------------------------------------------------------------------+ +bool IsStrategyTester() +{ + return (bool)MQLInfoInteger(MQL_TESTER); +} + +//+------------------------------------------------------------------+ +RSIAdaptiveParams BuildFallbackParams() +{ + RSIAdaptiveParams p; + p.timeframe = TimeFrame; + p.rsi_period = RSI_Period; + p.rsi_overbought = RSI_Overbought; + p.rsi_oversold = RSI_Oversold; + p.rsi_target_buy = RSI_Target_Buy; + p.rsi_target_sell = RSI_Target_Sell; + p.bars_to_wait = BarsToWait; + return p; +} + +//+------------------------------------------------------------------+ +RSIAdaptiveSearchConfig BuildSearchConfig() +{ + RSIAdaptiveSearchConfig cfg; + cfg.timeframe = TimeFrame; + cfg.rsi_period_min = Search_RSI_Period_Min; + cfg.rsi_period_max = Search_RSI_Period_Max; + cfg.rsi_period_step = MathMax(1, Search_RSI_Period_Step); + cfg.rsi_overbought_min = Search_RSI_Overbought_Min; + cfg.rsi_overbought_max = Search_RSI_Overbought_Max; + cfg.rsi_overbought_step = Search_RSI_Overbought_Step; + cfg.rsi_oversold_min = Search_RSI_Oversold_Min; + cfg.rsi_oversold_max = Search_RSI_Oversold_Max; + cfg.rsi_oversold_step = Search_RSI_Oversold_Step; + cfg.rsi_target_buy_min = Search_RSI_Target_Buy_Min; + cfg.rsi_target_buy_max = Search_RSI_Target_Buy_Max; + cfg.rsi_target_buy_step = Search_RSI_Target_Buy_Step; + cfg.rsi_target_sell_min = Search_RSI_Target_Sell_Min; + cfg.rsi_target_sell_max = Search_RSI_Target_Sell_Max; + cfg.rsi_target_sell_step = Search_RSI_Target_Sell_Step; + cfg.bars_to_wait_min = Search_BarsToWait_Min; + cfg.bars_to_wait_max = Search_BarsToWait_Max; + cfg.bars_to_wait_step = MathMax(1, Search_BarsToWait_Step); + cfg.min_trades = MinTradesForSelection; + cfg.lot_size = LotSize; + cfg.initial_balance = BacktestInitialBalance; + cfg.slippage_points = Slippage; + cfg.weight_sharpe = ScoreWeightSharpe; + cfg.weight_net_profit = ScoreWeightNetProfit; + cfg.weight_profit_factor = ScoreWeightProfitFactor; + cfg.weight_max_dd = ScoreWeightMaxDD; + cfg.max_combinations = MaxCombinations; + return cfg; +} + +//+------------------------------------------------------------------+ +bool RecreateRsiHandle() +{ + if(rsi_handle != INVALID_HANDLE) + IndicatorRelease(rsi_handle); + + rsi_handle = iRSI(_Symbol, g_active.timeframe, g_active.rsi_period, RSI_Applied_Price); + if(rsi_handle == INVALID_HANDLE) + { + Print("ERROR: failed to create RSI handle for ", g_active.ToString()); + return false; + } + return true; +} + +//+------------------------------------------------------------------+ +void UpdateStatusComment() +{ + g_status_line = StringFormat( + "RSI Adaptive XAUUSD | month=%d | %s\n" + "BT: net=$%.0f sharpe=%.2f PF=%.2f trades=%d DD=%.1f%% | combos=%d", + g_applied_month_key, + g_active.ToString(), + g_last_metrics.net_profit, + g_last_metrics.sharpe, + g_last_metrics.profit_factor, + g_last_metrics.total_trades, + g_last_metrics.max_drawdown_pct, + g_optimizer.CombosTested() + ); + Comment(g_status_line); +} + +//+------------------------------------------------------------------+ +bool RunMonthlyOptimization(const string reason) +{ + if(g_optimizing) + return true; + + g_optimizing = true; + RSIAdaptiveParams fallback = BuildFallbackParams(); + RSIAdaptiveSearchConfig cfg = BuildSearchConfig(); + + datetime opt_start, opt_end; + CRSIAdaptiveOptimizer::PreviousCalendarMonth(TimeCurrent(), opt_start, opt_end); + + PrintFormat("[Adaptive] %s — optimizing on prior month (%s to %s)", + reason, + TimeToString(opt_start, TIME_DATE), + TimeToString(opt_end, TIME_DATE)); + + RSIAdaptiveParams best; + RSIAdaptiveMetrics best_metrics; + const bool ok = g_optimizer.Optimize(_Symbol, opt_start, opt_end, fallback, cfg, best, best_metrics); + + if(ok) + { + g_active = best; + g_last_metrics = best_metrics; + } + else + { + Print("[Adaptive] Optimization found no valid combo — keeping fallback params"); + g_active = fallback; + g_last_metrics = best_metrics; + } + + g_applied_month_key = CRSIAdaptiveOptimizer::MonthKey(TimeCurrent()); + g_optimization_done = true; + + if(!RecreateRsiHandle()) + { + g_optimizing = false; + return false; + } + + last_bar_time = 0; + g_optimizing = false; + UpdateStatusComment(); + return true; +} + +//+------------------------------------------------------------------+ +void CheckMonthlyOptimizationSchedule(const string reason) +{ + if(!EnableAdaptive || IsStrategyTester()) + return; + + const int month_key = CRSIAdaptiveOptimizer::MonthKey(TimeCurrent()); + if(!g_optimization_done || month_key != g_applied_month_key) + RunMonthlyOptimization(reason); +} + +//+------------------------------------------------------------------+ +int OnInit() +{ + trade.SetExpertMagicNumber(MagicNumber); + trade.SetDeviationInPoints(Slippage); + trade.SetTypeFilling(ORDER_FILLING_FOK); + ArraySetAsSeries(rsi_buffer, true); + + g_active = BuildFallbackParams(); + if(!RecreateRsiHandle()) + return INIT_FAILED; + + EventSetTimer(OptimizationCheckSeconds); + + // Strategy Tester / Optimization: use Inputs directly — no walk-forward grid search + if(IsStrategyTester() || !EnableAdaptive) + { + g_active = BuildFallbackParams(); + g_optimization_done = true; + g_applied_month_key = CRSIAdaptiveOptimizer::MonthKey(TimeCurrent()); + if(!RecreateRsiHandle()) + return INIT_FAILED; + UpdateStatusComment(); + SyncOpenPosition(); + return INIT_SUCCEEDED; + } + + if(!RunMonthlyOptimization("OnInit")) + return INIT_FAILED; + + SyncOpenPosition(); + + return INIT_SUCCEEDED; +} + +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + EventKillTimer(); + if(rsi_handle != INVALID_HANDLE) + IndicatorRelease(rsi_handle); + Comment(""); +} + +//+------------------------------------------------------------------+ +void OnTimer() +{ + CheckMonthlyOptimizationSchedule("OnTimer"); +} + +//+------------------------------------------------------------------+ +void OnTick() +{ + if(Bars(_Symbol, g_active.timeframe) < g_active.rsi_period + 2) + return; + + datetime current_bar_time = iTime(_Symbol, g_active.timeframe, 0); + if(current_bar_time == last_bar_time) + return; + + last_bar_time = current_bar_time; + + if(!UpdateRSI()) + return; + + CheckExistingPosition(); + + if(!position_open && !PositionExistsByMagic(_Symbol, MagicNumber)) + CheckEntrySignals(); + + UpdateStatusComment(); +} + +//+------------------------------------------------------------------+ +bool UpdateRSI() +{ + if(CopyBuffer(rsi_handle, 0, 0, 3, rsi_buffer) < 3) + return false; + + rsi_current = rsi_buffer[0]; + rsi_prev = rsi_buffer[1]; + rsi_two_bars_ago = rsi_buffer[2]; + return true; +} + +//+------------------------------------------------------------------+ +void CheckExistingPosition() +{ + if(!position_open) + SyncOpenPosition(); + + if(!position_open) + return; + + if(!PositionSelectByTicketSymbolAndMagic(position_ticket, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + return; + } + + if(current_position_type == POSITION_TYPE_BUY) + { + if(rsi_current < g_active.rsi_oversold) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + bars_against_count++; + + if(bars_against_count >= g_active.bars_to_wait) + { + ClosePosition(); + return; + } + } + else + { + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + if(rsi_current >= g_active.rsi_target_buy) + ClosePosition(); + } + } + else if(current_position_type == POSITION_TYPE_SELL) + { + if(rsi_current > g_active.rsi_overbought) + { + if(!rsi_against_position) + { + rsi_against_position = true; + bars_against_count = 1; + } + else + bars_against_count++; + + if(bars_against_count >= g_active.bars_to_wait) + { + ClosePosition(); + return; + } + } + else + { + if(rsi_against_position) + { + rsi_against_position = false; + bars_against_count = 0; + } + if(rsi_current <= g_active.rsi_target_sell) + ClosePosition(); + } + } +} + +//+------------------------------------------------------------------+ +void CheckEntrySignals() +{ + if(rsi_two_bars_ago <= g_active.rsi_oversold && rsi_prev > g_active.rsi_oversold) + OpenBuyPosition(); + + if(rsi_two_bars_ago >= g_active.rsi_overbought && rsi_prev < g_active.rsi_overbought) + OpenSellPosition(); +} + +//+------------------------------------------------------------------+ +void OpenBuyPosition() +{ + if(PositionExistsByMagic(_Symbol, MagicNumber)) + return; + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + if(trade.Buy(LotSize, _Symbol, ask, 0, 0, "RSI Adaptive Buy")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0 && PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_BUY; + } + } +} + +//+------------------------------------------------------------------+ +void OpenSellPosition() +{ + if(PositionExistsByMagic(_Symbol, MagicNumber)) + return; + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + if(trade.Sell(LotSize, _Symbol, bid, 0, 0, "RSI Adaptive Sell")) + { + ulong new_ticket = trade.ResultOrder(); + if(new_ticket > 0 && PositionSelectByTicketSymbolAndMagic(new_ticket, _Symbol, MagicNumber)) + { + position_ticket = new_ticket; + position_open = true; + current_position_type = POSITION_TYPE_SELL; + } + } +} + +//+------------------------------------------------------------------+ +void ClosePosition() +{ + if(ClosePositionByMagic(trade, _Symbol, MagicNumber)) + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } + else + { + position_open = false; + position_ticket = 0; + rsi_against_position = false; + bars_against_count = 0; + } +} diff --git a/lab/EAs/RSIScalpingAdaptive/run_backtest.py b/lab/EAs/RSIScalpingAdaptive/run_backtest.py new file mode 100644 index 0000000..a66a8d3 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/run_backtest.py @@ -0,0 +1,292 @@ +""" +RSIScalpingNVDA — bar backtest mirroring main.mq5 inputs. + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, + equity_curve.png, drawdown.png, monthly_returns.png, + pnl_distribution.png, exit_reasons.png + +Usage: + python run_backtest.py + python run_backtest.py --start 2021-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema, calculate_rsi # noqa: E402 + +STRATEGY_ID = "RSIScalpingNVDA" + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + trades = report.trades_list + if not trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + if report.equity_curve is not None and len(report.equity_curve) > 1: + eq = report.equity_curve + else: + eq = pd.Series(bal0 + df["profit"].cumsum().values, index=df["close_time"]) + equity_times = eq.index + equity = eq + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(equity_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + dd = (equity - equity.cummax()) / equity.cummax() * 100 + ax2.fill_between(equity_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax3.axhline(0, color="black", lw=0.6) + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + plt.figure(figsize=(12, 5)) + plt.plot(equity_times, equity, lw=2) + plt.title("Equity Curve") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "equity_curve.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.fill_between(equity_times, dd, 0, color="red", alpha=0.3) + plt.plot(equity_times, dd, color="darkred") + plt.title("Drawdown %") + plt.grid(alpha=0.3) + plt.tight_layout() + plt.savefig(out_dir / "drawdown.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(12, 5)) + plt.bar(range(len(monthly)), monthly.values, color=["green" if v >= 0 else "red" for v in monthly], alpha=0.75) + plt.title("Monthly PnL") + plt.axhline(0, color="black") + plt.grid(alpha=0.3, axis="y") + plt.tight_layout() + plt.savefig(out_dir / "monthly_returns.png", dpi=200, bbox_inches="tight") + plt.close() + + plt.figure(figsize=(10, 5)) + plt.hist(df["profit"], bins=40, color="#6a5acd", alpha=0.85) + plt.axvline(0, color="black") + plt.title("Per-Trade PnL Distribution") + plt.tight_layout() + plt.savefig(out_dir / "pnl_distribution.png", dpi=200, bbox_inches="tight") + plt.close() + + if report.exit_reason_breakdown: + labels = list(report.exit_reason_breakdown.keys()) + counts = [report.exit_reason_breakdown[k]["count"] for k in labels] + plt.figure(figsize=(8, 5)) + plt.bar(labels, counts, color="#e377c2") + plt.title("Exit Reason Counts") + plt.tight_layout() + plt.savefig(out_dir / "exit_reasons.png", dpi=200, bbox_inches="tight") + plt.close() + + + +@dataclass +class StrategyParams: + rsi_period: int = 14 + rsi_overbought: float = 6 + rsi_oversold: float = 66 + rsi_target_buy: float = 98 + rsi_target_sell: float = 52 + bars_to_wait: int = 12 + lot_size: float = 5 + use_reversal_escape: bool = False + reversal_atr_period: int = 14 + reversal_adverse_atr_mult: float = 1.5 + reversal_signs_required: int = 2 + reversal_rsi_velocity: float = 8.0 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def make_params(balance: float) -> StrategyParams: + return StrategyParams(initial_balance=balance) + + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label, tf_label="H1"): + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.01 + rsi = calculate_rsi(df["close"], params.rsi_period).to_numpy() + atr = calculate_atr(df, params.reversal_atr_period).to_numpy() + p = params.to_dict() + + def on_bar(i, st, open_pos, close): + if i < 3 or np.isnan(rsi[i - 1]): + return + sig, prev, two = rsi[i - 1], rsi[i - 2], rsi[i - 3] + mid = float(df["open"].iloc[i]) + hi, lo = float(df["high"].iloc[i]), float(df["low"].iloc[i]) + + if st.side and params.use_reversal_escape: + a = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + if a > 0: + signs = 0 + if st.side == "BUY": + if st.entry - lo >= params.reversal_adverse_atr_mult * a: + signs += 1 + if sig - prev >= params.reversal_rsi_velocity: + signs += 1 + else: + if hi - st.entry >= params.reversal_adverse_atr_mult * a: + signs += 1 + if prev - sig >= params.reversal_rsi_velocity: + signs += 1 + if signs >= params.reversal_signs_required: + close(i, mid, "reversal_escape") + return + + if st.side == "BUY": + if sig < params.rsi_oversold: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig >= params.rsi_target_buy: + close(i, mid, "target") + elif st.side == "SELL": + if sig > params.rsi_overbought: + st.bars_against = st.bars_against + 1 if st.rsi_against else 1 + st.rsi_against = True + if st.bars_against >= params.bars_to_wait: + close(i, mid, "rsi_against") + else: + st.rsi_against = False + st.bars_against = 0 + if sig <= params.rsi_target_sell: + close(i, mid, "target") + else: + if two <= params.rsi_oversold and prev > params.rsi_oversold: + open_pos(i, "BUY", mid) + elif two >= params.rsi_overbought and prev < params.rsi_overbought: + open_pos(i, "SELL", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, STRATEGY_ID, tf_label, period_label, p, params.initial_balance, on_bar + ) + + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest") + p.add_argument("--symbol", default="XAUUSD") + p.add_argument("--start", default="2023-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + p.add_argument("--lot", type=float, default=0.1) + p.add_argument("--timeframe", default="H1", choices=["M20", "H1"]) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = make_params(args.balance) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + tf_map = {"M20": mt5.TIMEFRAME_M20, "H1": mt5.TIMEFRAME_H1} + tf = tf_map[args.timeframe] + print(f"Loading {symbol} {args.timeframe} bars ...") + df = load_bars(symbol, tf, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label, args.timeframe) + save_reports(report, out_dir) + print(f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f}") + print(f"Saved to {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/RSIScalpingAdaptive/run_mt5_cluster.py b/lab/EAs/RSIScalpingAdaptive/run_mt5_cluster.py new file mode 100644 index 0000000..2ed1dcb --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/run_mt5_cluster.py @@ -0,0 +1,197 @@ +""" +Batch MT5 genetic optimization per symbol → regenerate RSIScalpingSuperParams.mqh + +Usage: + python run_mt5_cluster.py optimize --symbols EURUSD,GBPUSD,USDJPY + python run_mt5_cluster.py optimize --all-forex + python run_mt5_cluster.py backtest-portfolio +""" + +from __future__ import annotations + +import argparse +import re +import subprocess +import sys +import xml.etree.ElementTree as ET +from datetime import datetime +from pathlib import Path + +LAB = Path(__file__).resolve().parent +TESTER = LAB / "run_mt5_tester.py" +OPT_SET = LAB / "XAUUSD_Genetic_Optimization.set" +PARAMS_MQH = LAB / "RSIScalpingSuperParams.mqh" +MAGIC_MQH = LAB / "RSIScalpingSuperMagic.mqh" + +FOREX_MAJORS = [ + "EURUSD", "GBPUSD", "USDJPY", "AUDUSD", "USDCHF", "USDCAD", "NZDUSD", "EURJPY", "XAUUSD" +] + + +def parse_best_from_xml(xml_path: Path) -> dict | None: + if not xml_path.exists(): + return None + ns = {"ss": "urn:schemas-microsoft-com:office:spreadsheet"} + root = ET.parse(xml_path).getroot() + rows = root.findall(".//ss:Worksheet/ss:Table/ss:Row", ns) + if len(rows) < 2: + return None + headers = [c.find("ss:Data", ns).text for c in rows[0].findall("ss:Cell", ns)] + best = None + best_score = float("-inf") + for row in rows[1:]: + cells = [c.find("ss:Data", ns).text for c in row.findall("ss:Cell", ns)] + if len(cells) < len(headers): + continue + d = dict(zip(headers, cells)) + try: + profit = float(d.get("Profit", 0)) + pf = float(d.get("Profit Factor", 0)) + dd = float(d.get("Equity DD %", 100)) + sharpe = float(d.get("Sharpe Ratio", 0)) + except (TypeError, ValueError): + continue + if profit <= 0 or pf < 1.05 or dd > 20: + continue + score = profit * pf / max(dd, 1.0) + sharpe * 100 + if score > best_score: + best_score = score + best = { + "profit": profit, + "pf": pf, + "dd": dd, + "sharpe": sharpe, + "trades": int(float(d.get("Trades", 0))), + "rsi_period": int(float(d["RSI_Period"])), + "rsi_overbought": float(d["RSI_Overbought"]), + "rsi_oversold": float(d["RSI_Oversold"]), + "rsi_target_buy": float(d["RSI_Target_Buy"]), + "rsi_target_sell": float(d["RSI_Target_Sell"]), + "bars_to_wait": int(float(d["BarsToWait"])), + } + return best + + +def run_optimize_symbol(symbol: str, from_date: str, to_date: str, timeout: int) -> dict | None: + cmd = [ + sys.executable, + str(TESTER), + "optimize", + "--symbol", + symbol, + "--from", + from_date, + "--to", + to_date, + "--set", + str(OPT_SET), + "--timeout", + str(timeout), + ] + print(f"\n=== MT5 genetic optimize {symbol} ===") + subprocess.run(cmd, check=False) + import MetaTrader5 as mt5 + + if not mt5.initialize(): + return None + data = Path(mt5.terminal_info().data_path) + mt5.shutdown() + xml = data / f"RSIScalpingAdaptive_{symbol}_optimize.xml" + return parse_best_from_xml(xml) + + +def write_params_mqh(results: dict[str, dict]) -> None: + lines = [ + "// RSIScalpingSuperParams.mqh — auto-generated from MT5 genetic optimization", + f"// Generated: {datetime.now().isoformat(timespec='seconds')}", + "#ifndef RSI_SCALPING_SUPER_PARAMS_MQH", + "#define RSI_SCALPING_SUPER_PARAMS_MQH", + "", + '#include "RSIScalpingSuperMagic.mqh"', + "", + f"#define RS_SUPER_SLOT_COUNT {len(results)}", + "", + "struct RSSlotParams", + "{", + " int rsiPeriod;", + " double rsiOverbought;", + " double rsiOversold;", + " double rsiTargetBuy;", + " double rsiTargetSell;", + " int barsToWait;", + " double lotSize;", + "};", + "", + "struct RSSlotConfig", + "{", + " string symbol;", + " int magic;", + " bool enabled;", + " RSSlotParams p;", + "};", + "", + "const RSSlotConfig RS_SUPER_SLOTS[RS_SUPER_SLOT_COUNT] =", + "{", + ] + for i, (sym, r) in enumerate(results.items(), start=1): + comment = f"// {sym} MT5 genetic profit=${r['profit']:.0f} PF={r['pf']:.2f} DD={r['dd']:.1f}%" + lines.append(f" {comment}") + lines.append( + f' {{ "{sym}", RS_SUPER_MAGIC_BASE + {i}, true,' + ) + lines.append( + f" {{ {r['rsi_period']}, {r['rsi_overbought']:.1f}, {r['rsi_oversold']:.1f}, " + f"{r['rsi_target_buy']:.1f}, {r['rsi_target_sell']:.1f}, {r['bars_to_wait']}, 0.10 }} }}," + ) + lines += ["};", "", "#endif", ""] + PARAMS_MQH.write_text("\n".join(lines), encoding="utf-8") + print(f"Wrote {PARAMS_MQH}") + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("mode", choices=["optimize", "backtest-portfolio"]) + p.add_argument("--symbols", default=",".join(FOREX_MAJORS)) + p.add_argument("--all-forex", action="store_true") + p.add_argument("--from", dest="from_date", default="2004.01.01") + p.add_argument("--to", dest="to_date", default="2026.01.01") + p.add_argument("--timeout", type=int, default=7200) + args = p.parse_args() + + syms = FOREX_MAJORS if args.all_forex else [s.strip() for s in args.symbols.split(",") if s.strip()] + + if args.mode == "optimize": + results: dict[str, dict] = {} + for sym in syms: + best = run_optimize_symbol(sym, args.from_date, args.to_date, args.timeout) + if best: + results[sym] = best + print(f" {sym}: profit=${best['profit']:.0f} PF={best['pf']:.2f} DD={best['dd']:.1f}%") + else: + print(f" {sym}: no stable candidate — skipped") + if not results: + raise SystemExit("No symbols passed optimization gates") + if len(results) < len(syms): + print(f"WARNING: only {len(results)}/{len(syms)} symbols optimized — merge manually into RSIScalpingSuperParams.mqh") + return + write_params_mqh(results) + else: + cmd = [ + sys.executable, + str(LAB / "run_mt5_tester.py"), + "backtest", + "--symbol", + "EURUSD", + "--from", + args.from_date, + "--to", + args.to_date, + "--set", + str(LAB / "SuperEA_portfolio.set"), + ] + # portfolio backtest uses SuperEA — extend run_mt5_tester for SuperEA + print("Use MT5 Tester manually: Expert=RSIScalpingSuper.ex5 on EURUSD H1, load SuperEA_portfolio.set") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/RSIScalpingAdaptive/run_mt5_tester.py b/lab/EAs/RSIScalpingAdaptive/run_mt5_tester.py new file mode 100644 index 0000000..cc9763f --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/run_mt5_tester.py @@ -0,0 +1,353 @@ +""" +Launch MT5 Strategy Tester for RSIScalpingAdaptive (native backtest / genetic optimize). + +Examples: + python run_mt5_tester.py backtest + python run_mt5_tester.py backtest --symbol XAUUSD --from 2004.01.01 --to 2026.01.01 + python run_mt5_tester.py optimize --symbol XAUUSD --from 2004.01.01 --to 2026.01.01 +""" + +from __future__ import annotations + +import argparse +import re +import shutil +import subprocess +import time +from pathlib import Path + +import MetaTrader5 as mt5 + +LAB = Path(__file__).resolve().parent +EA_MAIN = LAB / "main.mq5" +EA_OPTIMIZER = LAB / "RSIScalpingAdaptiveOptimizer.mqh" +EA_HELPERS = LAB / "MagicNumberHelpers.mqh" +EA_SUPER = LAB / "SuperEA.mq5" +EA_SUPER_PARAMS = LAB / "RSIScalpingSuperParams.mqh" +EA_SUPER_MAGIC = LAB / "RSIScalpingSuperMagic.mqh" +DEFAULT_SET = LAB / "XAUUSD_Backtest.set" +SUPER_SET = LAB / "SuperEA_portfolio.set" +OPT_SET = LAB / "XAUUSD_Genetic_Optimization.set" +EA_FOLDER = "RSIScalpingAdaptive" +SUPER_EX5 = "RSIScalpingSuper" + +LABELS = { + "profit_factor": ("Profit Factor", "盈利因子"), + "net_profit": ("Total Net Profit", "总净盈利"), + "total_trades": ("Total Trades", "交易总计"), + "sharpe": ("Sharpe Ratio", "夏普比率"), + "equity_dd": ("Equity Drawdown Maximal", "最大回撤"), + "recovery": ("Recovery Factor", "恢复因子"), +} + + +def read_text(path: Path) -> str: + text = path.read_text(encoding="utf-16", errors="ignore") + if not text.strip(): + text = path.read_text(encoding="utf-8", errors="ignore") + return text + + +def grab_metric(text: str, key: str) -> str | None: + for label in LABELS[key]: + for pat in ( + rf">{re.escape(label)}\s*]*>(?:)?([^<]+)", + rf">{re.escape(label)}:\s*]*>(?:)?([^<]+)", + ): + m = re.search(pat, text, re.I) + if m: + return m.group(1).strip() + return None + + +def parse_report(data: Path, report: str) -> dict: + xml_path = data / f"{report}.xml" + if xml_path.exists(): + text = xml_path.read_text(encoding="utf-8", errors="ignore") + m = re.search( + r"\s*]*>]*>Pass.*?\s*(.*?)", + text, + re.S, + ) + if m: + cells = re.findall(r"([^<]+)", m.group(1)) + if len(cells) >= 10: + return { + "ready": True, + "report": str(xml_path), + "net_profit": float(cells[2]), + "profit_factor": float(cells[4]), + "sharpe": float(cells[6]), + "max_drawdown": f"{cells[8]}%", + "total_trades": int(float(cells[9])), + "RSI_Period": cells[10] if len(cells) > 10 else None, + "RSI_Overbought": cells[11] if len(cells) > 11 else None, + "RSI_Oversold": cells[12] if len(cells) > 12 else None, + } + for path in sorted(data.glob(f"**/{report}*.htm*"), key=lambda p: p.stat().st_mtime, reverse=True): + text = read_text(path) + pf = grab_metric(text, "profit_factor") + profit = grab_metric(text, "net_profit") + trades = grab_metric(text, "total_trades") + sharpe = grab_metric(text, "sharpe") + dd = grab_metric(text, "equity_dd") + recovery = grab_metric(text, "recovery") + if pf or profit or trades: + return { + "profit_factor": float(pf) if pf else None, + "net_profit": _num(profit), + "total_trades": int(float(trades)) if trades and trades[0].isdigit() else None, + "sharpe": float(sharpe) if sharpe else None, + "max_drawdown": dd, + "recovery_factor": float(recovery) if recovery else None, + "report": str(path), + "ready": True, + } + for ext in (".htm", ".html"): + p = data / f"{report}{ext}" + if p.exists(): + text = read_text(p) + pf = grab_metric(text, "profit_factor") + if pf: + return {"ready": True, "report": str(p), "profit_factor": float(pf)} + return {"ready": False} + + +def _num(s: str | None) -> float | None: + if not s: + return None + s = s.replace(" ", "").replace(",", "") + if s.endswith("%"): + return float(s[:-1]) + return float(s) + + +def mt5_context() -> dict: + if not mt5.initialize(): + raise RuntimeError(f"MT5 init failed: {mt5.last_error()}") + info = mt5.terminal_info() + acc = mt5.account_info() + ctx = { + "data": Path(info.data_path), + "mt5_path": Path(info.path), + "login": acc.login if acc else 0, + "server": acc.server if acc else "", + } + mt5.shutdown() + return ctx + + +def deploy_ea(data: Path, mt5_path: Path, expert: str = "single") -> Path: + dst_dir = data / "MQL5" / "Experts" / EA_FOLDER + dst_dir.mkdir(parents=True, exist_ok=True) + shutil.copy2(EA_HELPERS, dst_dir / "MagicNumberHelpers.mqh") + + if expert == "super": + shutil.copy2(EA_SUPER, dst_dir / "SuperEA.mq5") + shutil.copy2(EA_SUPER_PARAMS, dst_dir / "RSIScalpingSuperParams.mqh") + shutil.copy2(EA_SUPER_MAGIC, dst_dir / "RSIScalpingSuperMagic.mqh") + dst = dst_dir / "SuperEA.mq5" + log = dst_dir / "compile_super.log" + subprocess.run( + [str(mt5_path / "metaeditor64.exe"), f"/compile:{dst}", f"/log:{log}"], + timeout=180, + capture_output=True, + ) + time.sleep(3) + ex5 = dst_dir / "SuperEA.ex5" + if not ex5.exists(): + tail = log.read_text(encoding="utf-8", errors="ignore")[-3000:] if log.exists() else "" + raise RuntimeError(f"SuperEA compile failed:\n{tail}") + pub = data / "MQL5" / "Experts" / f"{SUPER_EX5}.ex5" + shutil.copy2(ex5, pub) + return pub + + shutil.copy2(EA_MAIN, dst_dir / "main.mq5") + shutil.copy2(EA_OPTIMIZER, dst_dir / "RSIScalpingAdaptiveOptimizer.mqh") + + dst = dst_dir / "main.mq5" + log = dst_dir / "compile.log" + subprocess.run( + [str(mt5_path / "metaeditor64.exe"), f"/compile:{dst}", f"/log:{log}"], + timeout=180, + capture_output=True, + ) + time.sleep(3) + ex5 = dst_dir / "main.ex5" + if not ex5.exists(): + tail = log.read_text(encoding="utf-8", errors="ignore")[-3000:] if log.exists() else "" + raise RuntimeError(f"Compile failed — check MetaEditor:\n{dst}\n{tail}") + pub = data / "MQL5" / "Experts" / f"{EA_FOLDER}.ex5" + shutil.copy2(ex5, pub) + return pub + + +def copy_set_to_tester(data: Path, set_path: Path, set_name: str) -> Path: + profiles = data / "MQL5" / "Profiles" / "Tester" + profiles.mkdir(parents=True, exist_ok=True) + dst = profiles / set_name + shutil.copy2(set_path, dst) + return dst + + +def build_ini( + *, + set_name: str, + report: str, + login: int, + server: str, + symbol: str, + period: str, + from_date: str, + to_date: str, + deposit: float, + leverage: int, + optimization: int, + expert: str, + visual: bool, +) -> str: + ex5_name = "RSIScalpingAdaptive\\SuperEA.ex5" if expert == "super" else f"{EA_FOLDER}.ex5" + return f"""[Common] +Login={login} +Server={server} +[Tester] +Expert={ex5_name} +ExpertParameters={set_name} +Symbol={symbol} +Period={period} +Optimization={optimization} +Model=1 +Dates=1 +FromDate={from_date} +ToDate={to_date} +ForwardMode=0 +Deposit={deposit} +Currency=USD +Leverage={leverage} +ExecutionMode=0 +Report={report} +ReplaceReport=1 +ShutdownTerminal=1 +Visual={1 if visual else 0} +""" + + +def run_tester( + ctx: dict, + *, + mode: str, + set_path: Path, + set_name: str, + report: str, + symbol: str, + period: str, + from_date: str, + to_date: str, + deposit: float, + leverage: int, + visual: bool, + expert: str = "single", + timeout_sec: int = 7200, +) -> dict: + data: Path = ctx["data"] + mt5_path: Path = ctx["mt5_path"] + deploy_ea(data, mt5_path, expert) + copy_set_to_tester(data, set_path, set_name) + + optimization = 2 if mode == "optimize" else 0 + ini_body = build_ini( + set_name=set_name, + report=report, + login=ctx["login"], + server=ctx["server"], + symbol=symbol, + period=period, + from_date=from_date, + to_date=to_date, + deposit=deposit, + leverage=leverage, + optimization=optimization, + expert=expert, + visual=visual, + ) + ini = data / f"{report}.ini" + ini.write_text(ini_body, encoding="utf-8") + for ext in (".htm", ".html"): + p = data / f"{report}{ext}" + if p.exists(): + p.unlink(missing_ok=True) + + subprocess.run(["taskkill", "/IM", "terminal64.exe", "/F"], capture_output=True) + subprocess.run(["taskkill", "/IM", "metatester64.exe", "/F"], capture_output=True) + time.sleep(4) + + print(f"Starting MT5 Strategy Tester ({mode}) …") + print(f" EA: {SUPER_EX5 if expert == 'super' else EA_FOLDER}.ex5 Symbol: {symbol} Period: {period}") + print(f" Range: {from_date} → {to_date} Visual: {visual}") + t0 = time.time() + subprocess.run([str(mt5_path / "terminal64.exe"), f"/config:{ini}"], timeout=timeout_sec) + metrics = parse_report(data, report) + metrics["elapsed_sec"] = round(time.time() - t0, 1) + metrics["mode"] = mode + return metrics + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description="RSIScalpingAdaptive MT5 Strategy Tester") + p.add_argument("mode", choices=["backtest", "optimize"]) + p.add_argument("--symbol", default="XAUUSD") + p.add_argument("--period", default="H1", choices=["M15", "M30", "H1", "H4"]) + p.add_argument("--from", dest="from_date", default="2004.01.01") + p.add_argument("--to", dest="to_date", default="2026.01.01") + p.add_argument("--deposit", type=float, default=10000) + p.add_argument("--leverage", type=int, default=100) + p.add_argument("--visual", action="store_true") + p.add_argument("--set", dest="set_file", default="") + p.add_argument("--expert", choices=["single", "super"], default="single") + p.add_argument("--timeout", type=int, default=7200) + return p.parse_args() + + +def main() -> None: + args = parse_args() + ctx = mt5_context() + if args.expert == "super": + set_path = Path(args.set_file) if args.set_file else SUPER_SET + report = f"{SUPER_EX5}_{args.mode}" + symbol = args.symbol if args.symbol != "XAUUSD" or args.set_file else "EURUSD" + else: + set_path = Path(args.set_file) if args.set_file else (OPT_SET if args.mode == "optimize" else DEFAULT_SET) + report = f"RSIScalpingAdaptive_{args.symbol}_{args.mode}" + symbol = args.symbol + + set_name = set_path.name + + metrics = run_tester( + ctx, + mode=args.mode, + set_path=set_path, + set_name=set_name, + report=report, + symbol=symbol, + period=args.period, + from_date=args.from_date, + to_date=args.to_date, + deposit=args.deposit, + leverage=args.leverage, + visual=args.visual, + expert=args.expert, + timeout_sec=args.timeout, + ) + + if metrics.get("ready"): + print("\n=== MT5 Strategy Tester Report ===") + for k in ("net_profit", "profit_factor", "total_trades", "sharpe", "recovery_factor", "max_drawdown", "elapsed_sec"): + if k in metrics and metrics[k] is not None: + print(f" {k}: {metrics[k]}") + print(f" report: {metrics.get('report')}") + else: + print("Report not found — open MT5 → View → Strategy Tester → Journal for errors.") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/RSIScalpingAdaptive/run_walk_forward.py b/lab/EAs/RSIScalpingAdaptive/run_walk_forward.py new file mode 100644 index 0000000..96c33af --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/run_walk_forward.py @@ -0,0 +1,254 @@ +""" +RSIScalpingAdaptive XAUUSD — monthly walk-forward validation (Python). + +Mirrors the in-EA optimizer: each calendar month, grid-search the prior month, +pick the best score, then forward-test that month with the selected params. + +Usage: + python run_walk_forward.py + python run_walk_forward.py --symbol XAUUSD --start 2023-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from run_backtest import StrategyParams, run_backtest # noqa: E402 + +STRATEGY_ID = "RSIScalpingAdaptiveXAUUSD" + + +@dataclass +class SearchGrid: + rsi_period: tuple[int, int, int] = (12, 18, 2) + rsi_overbought: tuple[float, float, float] = (65.0, 77.0, 3.0) + rsi_oversold: tuple[float, float, float] = (50.0, 63.0, 3.0) + rsi_target_buy: tuple[float, float, float] = (75.0, 86.0, 3.0) + rsi_target_sell: tuple[float, float, float] = (50.0, 63.0, 3.0) + bars_to_wait: tuple[int, int, int] = (1, 4, 1) + min_trades: int = 8 + max_combos: int = 600 + weight_sharpe: float = 0.35 + weight_net: float = 0.25 + weight_pf: float = 0.15 + weight_dd: float = 0.10 + + +def _frange(start: float, stop: float, step: float) -> list[float]: + out: list[float] = [] + v = start + while v <= stop + 1e-9: + out.append(round(v, 6)) + v += step + return out + + +def _irange(start: int, stop: int, step: int) -> list[int]: + return list(range(start, stop + 1, step)) + + +def score_report(report, min_trades: int, grid: SearchGrid) -> float: + if report.total_trades < min_trades or report.net_profit <= 0 or report.profit_factor < 1.05: + return float("-inf") + pf = min(report.profit_factor, 4.0) / 4.0 + return ( + report.sharpe * grid.weight_sharpe + + (report.net_profit / 2000.0) * grid.weight_net + + pf * grid.weight_pf + - report.max_drawdown_pct * grid.weight_dd + ) + + +def is_valid(p: StrategyParams) -> bool: + return p.rsi_target_buy > p.rsi_oversold and p.rsi_target_sell < p.rsi_overbought + + +def iter_params(fallback: StrategyParams, grid: SearchGrid): + yield fallback + tested = 0 + for rp in _irange(*grid.rsi_period): + for ob in _frange(*grid.rsi_overbought): + for os in _frange(*grid.rsi_oversold): + for tb in _frange(*grid.rsi_target_buy): + for ts in _frange(*grid.rsi_target_sell): + for bw in _irange(*grid.bars_to_wait): + if tested >= grid.max_combos: + return + p = StrategyParams( + rsi_period=rp, + rsi_overbought=ob, + rsi_oversold=os, + rsi_target_buy=tb, + rsi_target_sell=ts, + bars_to_wait=bw, + lot_size=fallback.lot_size, + initial_balance=fallback.initial_balance, + ) + if is_valid(p): + tested += 1 + yield p + + +def month_starts(start: datetime, end: datetime) -> list[pd.Timestamp]: + idx = pd.date_range(start=start, end=end, freq="MS") + return list(idx) + + +def previous_month_bounds(ts: pd.Timestamp) -> tuple[datetime, datetime]: + prev_end = ts - pd.Timedelta(seconds=1) + prev_start = prev_end.replace(day=1) + return prev_start.to_pydatetime(), prev_end.to_pydatetime() + + +def month_bounds(ts: pd.Timestamp) -> tuple[datetime, datetime]: + start = ts.to_pydatetime() + end = (ts + pd.offsets.MonthBegin(1) - pd.Timedelta(seconds=1)).to_pydatetime() + return start, end + + +def optimize_month( + df_all: pd.DataFrame, + symbol: str, + costs: CostModel, + opt_start: datetime, + opt_end: datetime, + fallback: StrategyParams, + grid: SearchGrid, +): + df = df_all.loc[(df_all.index >= opt_start) & (df_all.index <= opt_end)] + if len(df) < 80: + return fallback, None, 0 + + best_p = fallback + best_r = None + best_score = float("-inf") + combos = 0 + + for p in iter_params(fallback, grid): + report = run_backtest(df, symbol, p, costs, f"{opt_start.date()}_{opt_end.date()}", "H1") + combos += 1 + sc = score_report(report, grid.min_trades, grid) + if sc > best_score: + best_score = sc + best_p = p + best_r = report + + return best_p, best_r, combos + + +def forward_month( + df_all: pd.DataFrame, + symbol: str, + costs: CostModel, + fwd_start: datetime, + fwd_end: datetime, + params: StrategyParams, +): + df = df_all.loc[(df_all.index >= fwd_start) & (df_all.index <= fwd_end)] + if len(df) < 20: + return None + return run_backtest(df, symbol, params, costs, f"{fwd_start.date()}_{fwd_end.date()}", "H1") + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} walk-forward") + p.add_argument("--symbol", default="XAUUSD") + p.add_argument("--start", default="2023-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + p.add_argument("--lot", type=float, default=0.1) + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + fallback = StrategyParams(lot_size=args.lot, initial_balance=args.balance) + grid = SearchGrid() + + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed") + + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + warmup = start - pd.Timedelta(days=45) + print(f"Loading {symbol} H1 bars from {warmup.date()} to {end.date()} ...") + df_all = load_bars(symbol, mt5.TIMEFRAME_H1, warmup.to_pydatetime(), end) + costs = CostModel.for_symbol(symbol) + + rows = [] + cumulative = 0.0 + for month_ts in month_starts(start, end): + if month_ts.to_pydatetime() >= end: + break + opt_start, opt_end = previous_month_bounds(month_ts) + fwd_start, fwd_end = month_bounds(month_ts) + if fwd_start >= end: + continue + + best_p, opt_report, combos = optimize_month( + df_all, symbol, costs, opt_start, opt_end, fallback, grid + ) + fwd_report = forward_month(df_all, symbol, costs, fwd_start, fwd_end, best_p) + if fwd_report is None: + continue + + cumulative += fwd_report.net_profit + rows.append( + { + "month": str(month_ts.date())[:7], + "opt_window": f"{opt_start.date()}..{opt_end.date()}", + "combos_tested": combos, + "selected": asdict(best_p), + "opt_net": opt_report.net_profit if opt_report else 0.0, + "opt_sharpe": opt_report.sharpe if opt_report else 0.0, + "fwd_net": fwd_report.net_profit, + "fwd_trades": fwd_report.total_trades, + "fwd_sharpe": fwd_report.sharpe, + "fwd_pf": fwd_report.profit_factor, + "fwd_dd_pct": fwd_report.max_drawdown_pct, + "cumulative_net": cumulative, + } + ) + print( + f"{rows[-1]['month']} | opt ${rows[-1]['opt_net']:,.0f} " + f"-> fwd ${rows[-1]['fwd_net']:,.0f} | cum ${cumulative:,.0f} | " + f"RSI={best_p.rsi_period} OB={best_p.rsi_overbought} OS={best_p.rsi_oversold}" + ) + + summary = { + "strategy": STRATEGY_ID, + "symbol": symbol, + "start": args.start, + "end": args.end, + "months": len(rows), + "cumulative_net": cumulative, + "rows": rows, + } + out_path = out_dir / "walk_forward_report.json" + with open(out_path, "w", encoding="utf-8") as f: + json.dump(summary, f, indent=2, ensure_ascii=False) + + pd.DataFrame(rows).to_csv(out_dir / "walk_forward_monthly.csv", index=False) + print(f"\nWalk-forward cumulative net: ${cumulative:,.2f} over {len(rows)} months") + print(f"Saved {out_path}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/RSIScalpingAdaptive/run_xauusd_optimize.py b/lab/EAs/RSIScalpingAdaptive/run_xauusd_optimize.py new file mode 100644 index 0000000..014b972 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/run_xauusd_optimize.py @@ -0,0 +1,295 @@ +""" +XAUUSD H1 optimizer — MetaQuotes Demo history from 2004. + +Phase 1: fast random search (full + OOS only) +Phase 2: stability check (year/month win rates) on top candidates +""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from rsi_scalping_backtest import ( # noqa: E402 + CostModel, + RsiScalpParams, + backtest_rsi_scalping, + load_rates, + split_walk_forward, +) + + +@dataclass +class CandidateScore: + params: RsiScalpParams + full_net: float + full_trades: int + full_pf: float + full_dd: float + full_wr: float + oos_net: float + oos_trades: int + oos_pf: float + oos_dd: float + win_year_pct: float + win_month_pct: float + score: float + + +def yearly_stats(df: pd.DataFrame, symbol: str, params: RsiScalpParams, costs: CostModel, balance: float) -> float: + wins = total = 0 + for _, chunk in df.groupby(df.index.year): + if len(chunk) < 200: + continue + r = backtest_rsi_scalping(chunk, symbol, params, balance, costs=costs) + total += 1 + if r.net_profit > 0: + wins += 1 + return (100.0 * wins / total) if total else 0.0 + + +def monthly_stats(df: pd.DataFrame, symbol: str, params: RsiScalpParams, costs: CostModel, balance: float) -> float: + wins = total = 0 + for _, chunk in df.groupby(pd.Grouper(freq="ME")): + if len(chunk) < 30: + continue + r = backtest_rsi_scalping(chunk, symbol, params, balance, costs=costs) + total += 1 + if r.net_profit > 0: + wins += 1 + return (100.0 * wins / total) if total else 0.0 + + +def fast_score(full_r, oos_r) -> float: + if full_r.total_trades < 200 or oos_r.total_trades < 80: + return float("-inf") + if full_r.net_profit <= 0 or oos_r.net_profit <= 0: + return float("-inf") + if full_r.profit_factor < 1.08 or oos_r.profit_factor < 1.05: + return float("-inf") + if full_r.max_drawdown_pct > 35 or oos_r.max_drawdown_pct > 45: + return float("-inf") + pf = min(full_r.profit_factor, 3.0) / 3.0 + oos_pf = min(oos_r.profit_factor, 3.0) / 3.0 + return ( + (full_r.net_profit / 5000.0) * 0.35 + + (oos_r.net_profit / 3000.0) * 0.35 + + pf * 0.15 + + oos_pf * 0.15 + - full_r.max_drawdown_pct * 0.05 + - oos_r.max_drawdown_pct * 0.03 + ) + + +def final_score(full_r, oos_r, win_year_pct: float, win_month_pct: float) -> float: + base = fast_score(full_r, oos_r) + if base == float("-inf"): + return base + if win_year_pct < 55 or win_month_pct < 52: + return float("-inf") + return base + (win_year_pct / 100.0) * 0.20 + (win_month_pct / 100.0) * 0.12 + + +def sample_params(rng: random.Random, lot: float) -> RsiScalpParams: + inverted = rng.random() < 0.55 + if inverted: + ob = rng.uniform(4.0, 22.0) + os = rng.uniform(52.0, 78.0) + tb = rng.uniform(85.0, 99.0) + ts = rng.uniform(4.0, 55.0) + else: + ob = rng.uniform(62.0, 82.0) + os = rng.uniform(38.0, 58.0) + tb = rng.uniform(72.0, 92.0) + ts = rng.uniform(18.0, 62.0) + + if tb <= os: + tb = os + 5 + if ts >= ob: + ts = ob - 5 + + use_trail = rng.random() < 0.25 + return RsiScalpParams( + rsi_period=rng.choice([10, 12, 14, 16, 18, 21]), + rsi_overbought=round(ob, 1), + rsi_oversold=round(os, 1), + rsi_target_buy=round(tb, 1), + rsi_target_sell=round(ts, 1), + bars_to_wait=rng.choice([1, 2, 3, 4, 6, 8, 12]), + use_trailing=use_trail, + trail_distance_pts=rng.choice([40, 55, 71, 90, 120, 150]), + trail_activation_pts=rng.choice([20, 35, 41, 55, 70, 90]), + lot_size=lot, + ) + + +def parse_args(): + p = argparse.ArgumentParser() + p.add_argument("--symbol", default="XAUUSD") + p.add_argument("--start", default="2004-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--trials", type=int, default=3000) + p.add_argument("--lot", type=float, default=0.1) + p.add_argument("--balance", type=float, default=10_000.0) + p.add_argument("--seed", type=int, default=7) + p.add_argument("--train-ratio", type=float, default=0.65) + p.add_argument("--top-k", type=int, default=40) + return p.parse_args() + + +def main(): + args = parse_args() + out_dir = Path(__file__).resolve().parent + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + + try: + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + df = load_rates(args.symbol, mt5.TIMEFRAME_H1, start, end) + train_df, test_df = split_walk_forward(df, args.train_ratio) + costs = CostModel.from_symbol(args.symbol, slippage_points=3.0) + + print(f"Loaded {len(df)} H1 bars {df.index[0]} -> {df.index[-1]}") + print(f"Train {len(train_df)} | Test {len(test_df)}") + + rng = random.Random(args.seed) + rows: list[dict] = [] + + for n in range(1, args.trials + 1): + p = sample_params(rng, args.lot) + full_r = backtest_rsi_scalping(df, args.symbol, p, args.balance, costs=costs) + oos_r = backtest_rsi_scalping(test_df, args.symbol, p, args.balance, costs=costs) + sc = fast_score(full_r, oos_r) + rows.append( + { + "trial": n, + "fast_score": sc, + "full_net": full_r.net_profit, + "full_trades": full_r.total_trades, + "full_pf": full_r.profit_factor, + "full_dd": full_r.max_drawdown_pct, + "oos_net": oos_r.net_profit, + "oos_trades": oos_r.total_trades, + "oos_pf": oos_r.profit_factor, + "oos_dd": oos_r.max_drawdown_pct, + **asdict(p), + } + ) + if n % 500 == 0: + valid = [r for r in rows if r["fast_score"] > float("-inf")] + msg = f"trial {n}/{args.trials} valid={len(valid)}" + if valid: + top = max(valid, key=lambda r: r["fast_score"]) + msg += f" best_fast={top['fast_score']:.3f} full=${top['full_net']:,.0f} dd={top['full_dd']:.1f}%" + print(msg) + + df_rows = pd.DataFrame(rows) + df_rows.sort_values("fast_score", ascending=False).to_csv(out_dir / "xauusd_opt_trials.csv", index=False) + + candidates = df_rows[df_rows["fast_score"] > float("-inf")].head(args.top_k) + if candidates.empty: + candidates = df_rows[(df_rows["full_net"] > 0) & (df_rows["oos_net"] > 0)].sort_values( + "oos_net", ascending=False + ).head(args.top_k) + if candidates.empty: + raise SystemExit("No profitable candidate found") + + print(f"\nStability check on top {len(candidates)} candidates ...") + best: CandidateScore | None = None + for _, row in candidates.iterrows(): + p = RsiScalpParams.from_dict({k: row[k] for k in RsiScalpParams.__dataclass_fields__}) + full_r = backtest_rsi_scalping(df, args.symbol, p, args.balance, costs=costs) + oos_r = backtest_rsi_scalping(test_df, args.symbol, p, args.balance, costs=costs) + wy = yearly_stats(df, args.symbol, p, costs, args.balance) + wm = monthly_stats(df, args.symbol, p, costs, args.balance) + sc = final_score(full_r, oos_r, wy, wm) + if sc == float("-inf"): + continue + cand = CandidateScore( + params=p, + full_net=full_r.net_profit, + full_trades=full_r.total_trades, + full_pf=full_r.profit_factor, + full_dd=full_r.max_drawdown_pct, + full_wr=full_r.win_rate, + oos_net=oos_r.net_profit, + oos_trades=oos_r.total_trades, + oos_pf=oos_r.profit_factor, + oos_dd=oos_r.max_drawdown_pct, + win_year_pct=wy, + win_month_pct=wm, + score=sc, + ) + if best is None or cand.score > best.score: + best = cand + + if best is None: + row = candidates.iloc[0] + p = RsiScalpParams.from_dict({k: row[k] for k in RsiScalpParams.__dataclass_fields__}) + full_r = backtest_rsi_scalping(df, args.symbol, p, args.balance, costs=costs) + oos_r = backtest_rsi_scalping(test_df, args.symbol, p, args.balance, costs=costs) + best = CandidateScore( + params=p, + full_net=full_r.net_profit, + full_trades=full_r.total_trades, + full_pf=full_r.profit_factor, + full_dd=full_r.max_drawdown_pct, + full_wr=full_r.win_rate, + oos_net=oos_r.net_profit, + oos_trades=oos_r.total_trades, + oos_pf=oos_r.profit_factor, + oos_dd=oos_r.max_drawdown_pct, + win_year_pct=yearly_stats(df, args.symbol, p, costs, args.balance), + win_month_pct=monthly_stats(df, args.symbol, p, costs, args.balance), + score=float(row["fast_score"]), + ) + + report = { + "symbol": args.symbol, + "period": [args.start, args.end], + "trials": args.trials, + "best": { + "params": asdict(best.params), + "full_net": best.full_net, + "full_trades": best.full_trades, + "full_pf": best.full_pf, + "full_dd": best.full_dd, + "full_wr": best.full_wr, + "oos_net": best.oos_net, + "oos_trades": best.oos_trades, + "oos_pf": best.oos_pf, + "oos_dd": best.oos_dd, + "win_year_pct": best.win_year_pct, + "win_month_pct": best.win_month_pct, + "score": best.score, + }, + } + json_path = out_dir / "xauusd_best_params.json" + json_path.write_text(json.dumps(report, indent=2), encoding="utf-8") + + print("\n=== BEST XAUUSD PARAMS ===") + for k, v in asdict(best.params).items(): + print(f" {k}: {v}") + print(f" FULL net=${best.full_net:,.2f} trades={best.full_trades} PF={best.full_pf:.2f} DD={best.full_dd:.1f}%") + print(f" OOS net=${best.oos_net:,.2f} trades={best.oos_trades} PF={best.oos_pf:.2f} DD={best.oos_dd:.1f}%") + print(f" Win years={best.win_year_pct:.1f}% Win months={best.win_month_pct:.1f}%") + print(f"Saved {json_path}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/RSIScalpingAdaptive/xauusd_opt_trials.csv b/lab/EAs/RSIScalpingAdaptive/xauusd_opt_trials.csv new file mode 100644 index 0000000..1985626 --- /dev/null +++ b/lab/EAs/RSIScalpingAdaptive/xauusd_opt_trials.csv @@ -0,0 +1,3001 @@ +trial,fast_score,full_net,full_trades,full_pf,full_dd,oos_net,oos_trades,oos_pf,oos_dd,rsi_period,rsi_overbought,rsi_oversold,rsi_target_buy,rsi_target_sell,bars_to_wait,use_trailing,trail_distance_pts,trail_activation_pts,lot_size +378,5.161117796834841,41881.700000000405,2625,1.2971867744480856,15.691408803226462,29571.999999999978,939,1.4556703000718052,19.12467611321743,12,78.0,48.0,85.5,47.7,6,False,55,35,0.1 +3,4.974934412760322,39601.00000000044,2588,1.3121088885736363,15.441007359705205,28076.29999999998,893,1.485798723399102,14.68496443954723,14,73.5,45.9,91.5,20.0,4,False,55,70,0.1 +203,4.933443753922031,39820.30000000039,2525,1.3513860761448404,13.014105949236699,26291.59999999999,919,1.492649125502644,13.760901401062265,16,13.4,52.5,85.5,8.4,6,False,120,35,0.1 +305,4.805006384483194,39833.800000000425,2671,1.291327347418786,19.67424946850515,28701.600000000028,921,1.482606129596905,16.22879386474551,12,69.8,41.4,91.2,42.8,3,False,120,20,0.1 +319,4.775803225820434,40299.00000000034,1800,1.3771097145124407,12.817827896361578,25263.800000000025,655,1.4827997408638254,16.489139515455275,14,68.1,53.3,86.8,40.4,12,False,120,90,0.1 +449,4.770091820280188,41275.9000000002,1596,1.3713417673233597,17.968440675729067,27951.999999999978,561,1.536203109563682,20.908101881479617,21,64.5,42.0,81.1,43.8,4,False,40,70,0.1 +533,4.752283649257773,39717.7000000002,1429,1.3964360610019886,16.469204580625103,27408.899999999994,503,1.6124360111632736,18.421457510641595,21,65.5,44.4,87.5,55.7,6,False,150,20,0.1 +323,4.734915428791701,42172.700000000164,1005,1.4849722282914946,22.644298106462013,29143.000000000015,353,1.7766102878278733,21.601815278594838,21,68.1,45.1,81.4,60.7,12,False,40,55,0.1 +136,4.71941101166855,39549.300000000105,731,1.5142229699860108,21.905144862886058,28877.499999999993,246,1.9441812409472699,16.524820746682785,21,68.6,42.8,90.2,45.8,12,False,120,55,0.1 +414,4.70049666051041,39141.400000000365,1848,1.387142272168888,9.322568103666006,23342.90000000001,664,1.4699332431431293,14.648834780174983,14,62.4,55.5,89.8,23.2,12,False,120,35,0.1 +118,4.654253557882403,39078.50000000024,1283,1.3715300819717313,22.158669358317148,29348.899999999994,443,1.6821724345519926,18.33438111204248,12,78.3,41.9,91.6,39.6,8,False,150,35,0.1 +154,4.586972004349887,39510.30000000039,2785,1.310699836040437,23.120508094849015,27946.899999999972,997,1.4762463872832357,14.084752291351204,10,6.7,55.9,89.2,1.7,8,False,40,41,0.1 +233,4.582771913479764,38932.400000000394,2158,1.3556266013856981,11.97871416159821,24244.4,789,1.4653444632331343,17.104075500154256,16,13.1,52.5,87.0,8.1,8,False,40,20,0.1 +420,4.550439497393796,37694.40000000061,3781,1.2969238997807828,12.92028127885054,26741.900000000045,1387,1.4413335445774602,23.298521473832377,18,69.2,51.9,77.4,57.2,3,False,90,55,0.1 +182,4.5002981730008464,38775.50000000022,1894,1.3518216915350687,10.298102981029588,23538.699999999997,702,1.4326028545278775,19.48281906391678,18,80.2,50.2,84.3,45.6,8,False,40,35,0.1 +395,4.482761088854235,39765.700000000434,2394,1.333114974370746,15.319860795721233,23946.800000000032,849,1.4268196174329657,15.55449780944188,10,14.4,58.1,93.3,9.4,12,False,55,20,0.1 +272,4.479392583117223,39935.600000000166,919,1.4803883948279781,22.04254617155142,27810.000000000007,315,1.7752305342149572,20.708435158578826,21,70.0,45.1,88.9,38.4,12,False,55,41,0.1 +167,4.425740711078459,37206.00000000041,2634,1.3278529622730317,13.60189632277182,24695.99999999997,944,1.459823190758849,17.305609347818983,21,77.6,47.4,87.7,28.1,3,False,90,90,0.1 +157,4.422985572561005,38041.00000000029,1523,1.3911079764806742,11.030935690338199,22969.700000000004,543,1.485705646269724,17.065888579765247,18,78.9,51.4,85.0,56.6,12,False,55,90,0.1 +205,4.41867858817046,37078.10000000059,3104,1.346335594718018,12.84095996756033,23665.800000000017,1127,1.4590469835629307,14.533984745520451,16,7.3,54.2,85.7,2.3,4,False,40,70,0.1 +442,4.418563730194263,39547.8000000004,2798,1.313382452459102,20.382626257112094,25113.999999999956,996,1.4288351237037522,13.257616747498835,10,10.4,56.3,93.9,5.4,8,False,55,90,0.1 +247,4.380503656017046,36563.70000000048,2350,1.314917084245576,9.50100162403215,22734.300000000007,854,1.4058631037923994,16.409309072775933,10,7.3,59.9,87.0,2.3,12,False,71,41,0.1 +253,4.327222508013304,37344.00000000018,1433,1.3534894111254896,21.946824680044756,27958.399999999958,488,1.6262619474814806,20.010571974938216,18,72.3,40.2,89.9,48.4,4,False,150,35,0.1 +229,4.3265052185455035,35677.40000000047,2495,1.3207202348044593,14.10788033441861,24490.599999999984,898,1.4682124244359223,15.40673547874271,21,64.9,49.5,86.9,25.2,4,False,150,55,0.1 +249,4.319783183661498,35786.30000000032,1706,1.4054484583094942,12.546871584469615,23549.000000000007,627,1.5645983030163535,15.12666361715568,18,71.9,56.4,87.5,41.7,12,False,120,90,0.1 +299,4.3147684029214535,40604.40000000023,1454,1.387277685207882,18.484236328591024,24804.9,515,1.5023583902594122,21.390486147412496,14,67.9,49.4,91.1,39.2,12,False,71,70,0.1 +46,4.30766648125094,37223.60000000045,2741,1.3098635633360807,13.99551398704904,23052.899999999994,1009,1.3875941752176046,14.0862568774774,16,64.1,54.4,80.6,39.8,6,False,71,90,0.1 +214,4.298834580425145,36937.60000000064,3300,1.3062057531294031,14.775439725075232,25191.400000000016,1200,1.4426564235208117,20.815506960677236,14,8.4,52.7,93.0,3.4,4,False,40,41,0.1 +362,4.289064626263334,35970.70000000057,3312,1.322846341774267,12.467714186397105,24228.700000000048,1209,1.4566033895621973,19.038427255011527,18,14.0,52.0,88.6,9.0,3,False,71,41,0.1 +529,4.262556562861639,37122.60000000044,2376,1.3226825980040635,13.107303146739813,24155.000000000007,844,1.4556154533897199,21.25528385681414,12,18.2,58.6,85.6,5.9,12,False,71,41,0.1 +230,4.259421624453091,36594.60000000038,2189,1.299580280124337,25.984210270825507,29681.000000000015,707,1.5657273773853897,20.301285940482718,16,74.1,38.7,91.4,20.3,2,False,71,90,0.1 +111,4.258561697274439,39560.80000000025,1660,1.3544293364080964,18.57155689967497,24941.300000000017,591,1.4749710537942373,21.11349368617608,12,79.8,50.8,89.1,45.3,12,False,90,35,0.1 +285,4.255322581478026,35779.4000000004,1894,1.3738419117454994,10.930564831801506,22974.10000000002,679,1.514143701800637,17.580604142530106,16,17.7,56.4,94.3,12.7,12,False,55,20,0.1 +479,4.244829975475714,34971.800000000556,3094,1.3292228875795136,11.25389440977913,23034.600000000028,1125,1.4514808869445563,15.563549758719175,16,4.1,54.6,90.3,-0.9,4,False,90,20,0.1 +58,4.223434023357951,36728.80000000037,2150,1.3348079463195908,14.981291342029374,23746.499999999993,789,1.4495272169690774,16.938638923501273,16,66.1,52.8,91.5,39.7,8,False,71,20,0.1 +80,4.217812912816853,37795.60000000021,1517,1.4088295836700075,11.661431214768221,21566.599999999995,552,1.4771266122430924,16.840288985791318,21,14.8,52.3,89.2,9.8,12,False,55,55,0.1 +313,4.20536952876066,36336.800000000345,2827,1.2793329243674507,23.243233886393156,26788.40000000001,972,1.4698128528410566,14.6271799704489,16,62.7,41.6,88.4,47.9,2,False,150,55,0.1 +510,4.202968302801518,36879.80000000048,2969,1.2805215233740057,13.650784678108261,22762.099999999973,1071,1.35184143246226,16.109164813941522,12,67.3,53.8,86.6,33.0,6,False,120,20,0.1 +386,4.201546659250102,35042.40000000049,2947,1.3094429260840592,13.047043336936524,24780.30000000001,1082,1.4606209198923363,20.95357887339754,21,62.6,50.0,91.3,33.1,3,False,40,35,0.1 +8,4.200321956753852,38254.800000000396,1948,1.3721903157042674,11.1972628366067,21749.199999999986,723,1.4110595141570328,19.80733531918566,18,73.5,55.5,78.3,48.6,12,False,90,20,0.1 +367,4.196525205003951,35416.400000000576,3463,1.2266746798102708,14.155390841201134,24693.199999999975,1221,1.3355847713997604,19.46131862766211,10,71.3,47.2,88.8,36.3,4,False,90,55,0.1 +289,4.181492817431546,34335.00000000054,2943,1.3782729117594585,12.24594157802023,23489.499999999993,1042,1.5611469715574373,16.569092149999644,21,10.5,54.4,89.0,5.5,3,False,150,35,0.1 +107,4.176390165174817,36695.10000000013,972,1.4012849394164744,29.697284112421567,29341.600000000013,315,1.842062970477746,16.425223045516404,16,66.1,38.1,90.0,36.6,6,False,71,55,0.1 +238,4.1430369404909415,38200.500000000386,2167,1.2783272604868618,16.783249424865346,24729.4,776,1.3724486722251679,23.64903505226955,14,66.4,45.7,83.0,34.1,6,False,90,55,0.1 +290,4.124268127376396,35164.20000000034,2202,1.3476396249974048,11.107685317408611,21608.399999999987,806,1.447435390390918,14.75251191742036,21,17.5,52.7,90.5,11.4,6,False,150,35,0.1 +518,4.122246915620321,33313.10000000045,2589,1.379910955607814,9.862462742844487,22430.100000000006,926,1.5499447115561427,15.996157686522828,21,7.6,55.1,92.1,2.6,4,False,120,41,0.1 +222,4.110102708836497,36739.20000000038,2431,1.2815111208508967,23.70405460692027,27969.200000000026,806,1.4878564401682863,22.59934240672706,14,71.9,38.3,90.2,39.0,2,False,55,70,0.1 +427,4.098565513921455,36321.10000000028,1742,1.3412691030212494,18.982394098088687,25117.799999999996,595,1.5339100860877888,18.965358020986056,21,69.0,41.7,89.4,41.4,3,False,55,35,0.1 +132,4.095539223644021,36890.0000000004,2245,1.31457723088468,12.483001884460702,22064.70000000002,827,1.3835518093148813,19.057737804765047,16,81.9,52.5,81.6,41.7,8,False,90,20,0.1 +409,4.091851516094734,36208.30000000033,2313,1.2922373876415174,21.437198603919725,25858.79999999998,808,1.4586910556414885,17.509199195781637,16,69.2,42.5,89.8,44.9,3,False,90,41,0.1 +54,4.079134736880362,37397.600000000435,2322,1.2902298783672512,12.68886468052807,20869.4,847,1.3243556606896674,15.658221312648138,10,72.1,56.2,87.1,43.0,12,False,150,70,0.1 +484,4.072612182268195,34181.90000000063,2969,1.2900106308695642,14.305630906268743,23102.000000000044,1059,1.4154378443699571,14.511500983790892,10,12.2,60.3,87.9,7.2,8,False,90,55,0.1 +122,4.071887217026545,36443.900000000285,1728,1.3405071368974377,11.079759706654535,22024.200000000015,628,1.4340641906207203,21.11387880055527,18,71.1,48.4,85.8,57.4,8,False,90,90,0.1 +478,4.042246430573403,37181.300000000396,2616,1.2711847470842097,23.71175453759694,27751.400000000016,886,1.4557920444896288,24.962300515293474,14,80.6,38.6,85.0,57.0,2,False,150,55,0.1 +39,3.9975940403839316,34603.20000000046,2586,1.3032931434040724,14.016155362859323,24067.100000000006,901,1.4612791257065207,22.32930460873326,10,16.7,62.0,92.2,11.7,12,False,55,20,0.1 +141,3.9898748242339033,34537.2000000004,1891,1.3607206642644514,14.453723439685353,22558.10000000002,699,1.49767687107848,15.991373796077985,21,6.0,52.9,96.9,1.0,8,False,71,55,0.1 +368,3.988686566946996,34239.50000000052,3067,1.3282091443623707,14.92458003268607,23607.20000000001,1113,1.4752588464798297,18.53987214313935,21,17.6,52.2,88.3,14.2,3,False,120,41,0.1 +36,3.9599856264804076,30147.200000000317,1699,1.4724252002312972,13.629941620238139,23080.699999999997,593,1.8074183685606138,10.852060142687852,21,7.8,59.9,86.7,2.8,8,False,71,35,0.1 +103,3.9591064845807526,33444.60000000087,3762,1.251427806767015,14.442506562371724,23921.500000000015,1336,1.3871669957595585,19.422053136457272,14,22.0,53.0,95.3,17.0,4,False,150,41,0.1 +241,3.9112358086277017,38466.900000000205,1591,1.3189642734540972,19.459314022737292,24264.999999999985,567,1.4327873179849755,25.89952454913554,14,74.1,45.0,85.2,40.7,8,False,40,70,0.1 +115,3.894309849191186,36374.400000000416,2685,1.2827750426210252,20.221670401550032,24636.09999999999,981,1.4051583640457117,21.64743225771146,16,71.3,46.9,84.4,54.0,4,False,40,20,0.1 +186,3.879720958167248,34937.40000000031,1862,1.311984805012845,23.846695699558033,26791.499999999985,628,1.5480694878015853,21.407999049853032,21,70.1,39.3,85.6,44.1,2,False,90,55,0.1 +232,3.8759891908972595,36577.30000000047,2953,1.2683975600288517,19.136137209155414,23851.899999999994,1053,1.3707078635095542,21.40972954961961,18,80.7,43.0,80.4,45.8,2,False,40,41,0.1 +113,3.8689115774525913,34387.80000000038,2407,1.2904971206083704,15.141376524600226,24311.099999999962,873,1.4289237869910176,25.11438805657965,16,78.8,51.4,85.4,32.3,6,False,150,41,0.1 +298,3.852342660764378,34786.80000000046,2819,1.283377050782843,18.289466179992434,23048.399999999987,1014,1.399338144204863,16.379192999513858,10,79.3,57.5,91.2,45.3,8,False,150,41,0.1 +393,3.83827050081965,36783.90000000041,2577,1.2989644637375373,18.659310711555094,22408.100000000057,944,1.3709821347271034,18.380420895306504,12,5.7,54.7,85.8,0.7,8,False,150,35,0.1 +2,3.8347385868098853,33643.80000000049,2590,1.3095157049518764,16.168243896828933,22986.100000000028,920,1.449753659882367,17.71967844190283,12,11.5,58.3,92.7,7.0,8,False,150,70,0.1 +5,3.784681345807752,30734.500000000473,2723,1.3550691318773749,12.503641057061188,21504.6,971,1.5381248733174684,13.169376719965465,18,5.1,57.4,94.5,0.1,4,False,71,41,0.1 +306,3.764594693293099,34361.00000000031,2582,1.2569052491332726,20.900905938932265,23792.899999999994,920,1.3828807662475167,16.781921462089375,10,4.8,53.1,94.8,-0.2,8,False,55,55,0.1 +191,3.7607494116404707,37685.000000000444,2282,1.2654164823741199,14.897896247032904,21710.500000000015,826,1.309841044215912,26.465343966802855,16,74.4,45.8,78.2,44.4,6,False,40,41,0.1 +52,3.72249683123629,29927.300000000396,2732,1.3369387038229632,11.656990176185404,21081.99999999999,973,1.5054059885407418,13.041618707977248,18,63.7,57.2,89.1,24.8,4,False,71,90,0.1 +30,3.720206070032857,35182.300000000585,3434,1.2479426964225444,15.044204362368262,21521.099999999973,1260,1.3021930341887542,20.954883279311108,12,75.2,54.3,82.3,54.4,6,False,55,70,0.1 +71,3.7104343742178165,32753.400000000445,2611,1.302601176095603,14.08248181773922,21111.999999999993,932,1.4124339699309214,15.899931962108168,16,16.0,55.1,94.0,7.8,6,False,55,55,0.1 +155,3.7094836930055934,33809.80000000036,2051,1.3250798522373053,13.932332567328299,21319.000000000007,755,1.4260996264457981,19.512043974294635,18,11.0,52.9,90.6,6.0,8,False,71,55,0.1 +172,3.697827428516537,35201.000000000655,3539,1.2560069003535996,14.171840079462298,22081.000000000007,1289,1.3286953855222778,25.433411615695206,12,77.6,51.4,89.9,52.7,4,False,150,35,0.1 +126,3.6975441981821797,33124.70000000036,2211,1.2621294840374568,24.324191583827275,27134.500000000007,754,1.48022773850777,23.592825014013645,18,62.9,39.1,83.3,31.4,2,False,90,70,0.1 +430,3.6887810530014686,30380.000000000793,4518,1.243265166237871,14.62585418196143,23190.200000000026,1614,1.3922856234225829,18.12757035722917,14,9.1,52.9,98.6,4.1,2,False,150,90,0.1 +387,3.6469955685174837,32271.900000000365,1964,1.3405944167756363,11.217506346765688,20485.599999999977,710,1.4695484353046084,19.388530780497764,14,12.1,58.4,95.4,7.1,12,False,40,90,0.1 +243,3.642844337646727,35288.90000000059,3253,1.2730466189987266,14.939634258799192,22402.400000000045,1204,1.356222978054879,27.515792086645796,16,78.4,48.4,86.8,50.7,3,False,150,90,0.1 +493,3.608809534451967,36867.500000000386,2313,1.2438376712750079,18.963505442708747,22089.900000000012,808,1.3067023585226556,24.28073983008355,10,64.7,44.4,87.1,25.4,6,False,90,55,0.1 +215,3.5836103344922963,34625.90000000049,3042,1.2858179380866337,18.83399407479416,20934.500000000022,1101,1.3620827128400153,15.775210921589919,12,12.7,56.0,92.2,7.7,6,False,90,41,0.1 +464,3.568607362355013,28903.60000000066,3747,1.2700450797654927,14.230041705598584,22623.50000000002,1344,1.4513452476428748,17.287346735628574,14,75.1,56.6,87.2,54.8,3,False,55,20,0.1 +339,3.5600140367306743,34845.30000000057,3953,1.21331118923714,15.846608010276928,21668.799999999992,1427,1.270037062053391,24.63402139955703,16,66.8,45.1,78.5,36.7,2,False,120,35,0.1 +408,3.5178772176608266,30947.200000000616,3586,1.2778955610810432,18.364836379970754,23057.200000000026,1280,1.444958200498661,18.544477269544434,12,13.7,58.3,88.0,8.7,4,False,71,41,0.1 +431,3.514364911658958,29749.60000000056,3155,1.3110913125406536,12.394981689114735,20635.1,1124,1.458061036032036,16.47479848824373,18,69.7,55.9,86.2,51.9,3,False,120,35,0.1 +268,3.469930922353342,29602.600000000682,3637,1.2663136521439504,15.112453402781464,21438.900000000045,1279,1.4135909406590026,16.060954571592838,12,16.7,58.8,97.6,11.7,4,False,120,70,0.1 +498,3.465447948041766,29325.900000000285,1560,1.4068690428291961,14.353544466074396,20215.40000000002,555,1.621259150445307,12.651919055053131,21,16.5,58.6,88.3,11.5,12,False,40,90,0.1 +265,3.4457118760018997,31584.60000000034,1929,1.3473369579561354,16.137500489766964,20515.400000000005,691,1.4810999303515024,16.440675908616385,14,7.4,59.4,88.3,5.8,12,False,55,35,0.1 +483,3.408664481234008,30425.700000000295,1809,1.3632988809338435,10.68802916893079,18932.40000000002,650,1.4671241089867437,17.90114032718347,16,13.2,60.2,86.4,8.2,12,False,150,35,0.1 +34,3.403070112303413,34382.700000000346,2116,1.2405265985577933,26.87314556990874,24864.800000000025,769,1.3868827563887134,23.07751367606123,12,66.0,43.5,82.2,53.5,8,False,120,41,0.1 +211,3.402164613806093,33092.20000000017,1078,1.3428728325795596,29.844784798601804,27264.900000000016,362,1.7031476060914759,25.175205606579414,14,78.0,41.1,88.7,21.4,8,False,55,55,0.1 +535,3.372885855496201,31946.100000000646,4141,1.2562216527712644,14.664625165023182,21127.200000000015,1498,1.351532355079759,24.17791955484126,12,8.5,54.6,89.6,5.3,3,False,40,70,0.1 +419,3.362322081303974,29553.000000000655,3906,1.1948522042766891,18.04687270699313,22157.399999999994,1358,1.3217213531306151,17.163432040559307,10,19.8,56.2,95.3,12.7,6,False,71,55,0.1 +158,3.3097256821073064,28713.100000000326,1993,1.3281864711704863,13.097899608401436,19315.200000000023,724,1.4510136318421896,14.589878087442711,12,6.2,63.2,88.6,1.2,12,False,90,90,0.1 +48,3.264874778135469,28119.20000000042,2052,1.326132012994619,18.40905312057522,21405.800000000014,724,1.5417297248050064,14.125099535303825,18,17.3,58.6,87.3,8.3,8,False,71,70,0.1 +538,3.245787501563465,32264.40000000054,3391,1.2630607419486386,17.31306186991866,22188.89999999995,1238,1.3727259899817585,28.918724717905135,21,78.6,48.4,81.7,36.3,2,False,55,35,0.1 +532,3.241062510137593,27036.200000000463,2255,1.323401068904637,11.123890174934365,19044.100000000002,807,1.464950658456913,15.216874471682178,14,15.8,61.9,96.8,10.8,8,False,40,41,0.1 +134,3.2401587392532525,34879.900000000576,4108,1.2268443185350861,22.284097940422008,25062.799999999996,1501,1.3350319220609763,37.97721696962743,14,67.3,49.1,80.7,52.7,3,False,150,35,0.1 +494,3.2366428260631137,27770.500000000444,2432,1.3539379185970188,13.124133730437979,18804.30000000001,872,1.4963232965223086,12.914451605699517,21,14.3,57.8,87.1,9.3,4,False,40,20,0.1 +70,3.2296701478858165,27459.600000000406,2136,1.3119498055681469,14.627215467994233,20250.899999999994,763,1.494927523834896,15.469664839488376,16,11.5,59.3,88.6,6.5,8,False,55,41,0.1 +458,3.219041856056191,29102.500000000386,2363,1.3223078805813464,17.16954351906898,20302.6,819,1.4902150633696865,15.630626061820148,18,15.7,57.4,91.0,9.6,6,False,71,90,0.1 +504,3.209992913859374,30508.30000000039,2106,1.3190483859497921,14.831703615409204,19979.100000000028,754,1.4383255997630584,21.75888682186127,18,16.2,56.2,90.2,11.2,8,False,55,90,0.1 +89,3.163156717473723,32544.600000000493,2827,1.188457754426887,22.858749385000486,22557.49999999997,991,1.2760924669564173,24.232121922626046,12,70.6,39.0,81.5,34.4,3,False,71,90,0.1 +185,3.161100940083972,29036.000000000407,2220,1.3251926897722666,12.076275498089982,17765.200000000015,796,1.4086481065302459,15.896799716445045,10,14.2,67.0,97.8,9.2,12,False,90,70,0.1 +60,3.15093472134976,28233.500000000487,2333,1.291599705854405,16.879354453803156,20792.7,825,1.4597591608218443,18.160849976464313,14,5.1,59.0,94.4,0.1,8,False,120,41,0.1 +435,3.1444669536202614,30227.50000000048,2634,1.2431143407501535,17.3311343754477,20634.50000000004,964,1.3388231623714084,21.378551203226785,18,66.4,53.9,76.2,54.9,8,False,40,35,0.1 +316,3.1422551802943355,26862.200000000368,1799,1.3647342044055073,18.784262220191373,21294.10000000002,628,1.649010518102658,14.462820382939935,21,8.1,58.5,97.3,3.1,8,False,55,41,0.1 +88,3.1287164698681327,26855.90000000059,3221,1.2882746820551139,11.724187173703669,19049.500000000044,1139,1.4292632252598185,17.443524449304785,12,9.0,61.1,98.4,4.0,4,False,71,41,0.1 +77,3.124035153995401,28076.700000000375,1939,1.315887356270109,16.88324297255424,20924.500000000004,685,1.509837603401436,19.321653734238577,21,6.0,56.0,92.3,1.0,8,False,150,55,0.1 +194,3.1071069987903117,31652.900000000496,2626,1.2144467644878878,19.079113444740887,20020.30000000001,954,1.275893954678,20.495301053254668,10,75.0,54.0,84.0,56.3,12,False,55,70,0.1 +489,3.096103603043267,28330.700000000477,2408,1.2849480156219664,16.179234326498133,19717.700000000015,828,1.438421498500256,17.155016322376852,16,21.1,58.1,91.7,16.1,8,False,55,70,0.1 +377,3.0912407914557467,26523.000000000786,4298,1.2394213375025747,12.585423201008311,19559.800000000014,1506,1.3818617708727856,18.30462901931094,16,19.4,55.2,86.9,14.4,2,False,40,90,0.1 +153,3.0903802935675624,31272.200000000696,4362,1.1860205875267313,23.87261243075894,22960.199999999975,1521,1.2925443877453513,23.58871112193799,10,69.0,42.7,91.1,29.4,2,False,150,20,0.1 +426,3.09002184764091,32144.200000000797,3874,1.2340164838484926,18.916541931990473,19952.900000000016,1427,1.2891012359273801,22.27464250272499,14,75.8,53.5,79.9,59.4,4,False,90,55,0.1 +534,3.086947000295431,27621.70000000023,1583,1.3532435145694397,14.348681352473905,19070.5,578,1.5110186341395453,16.574756872766844,21,78.9,57.6,90.9,38.7,12,False,55,90,0.1 +49,3.0560740374697124,25423.70000000031,2195,1.359125792977583,12.476266207948086,17847.00000000001,781,1.5117037869578183,10.84877103765588,14,9.3,63.9,87.2,4.3,6,False,71,35,0.1 +106,3.020128850336165,33259.10000000039,2309,1.232136812269105,21.083106267029255,20230.100000000002,855,1.2835992676642363,24.660599121413316,14,68.2,49.3,79.1,36.3,8,False,55,55,0.1 +400,3.0177191710205933,25144.400000000365,1873,1.3651721048037733,12.45518400579772,17581.89999999999,665,1.5237774633201773,10.509959125413618,16,10.6,62.7,94.1,5.6,8,False,150,55,0.1 +15,3.0156749211154135,32714.50000000062,4001,1.2353784675954862,12.44168789119861,17834.500000000044,1441,1.2589980191578203,28.588872510967878,10,77.6,55.5,88.0,35.3,4,False,150,55,0.1 +264,3.0134016172442446,27639.80000000062,3746,1.2482256319067442,13.30190058479452,18970.000000000055,1346,1.3567814812167807,19.99021252796408,10,10.5,60.7,97.2,5.5,4,False,71,70,0.1 +372,2.9986476764039987,24809.500000000393,1940,1.344214963177554,13.891561427564497,18347.399999999983,689,1.5359189610753783,10.932531614348278,16,5.6,62.0,94.3,0.6,8,False,40,41,0.1 +213,2.9977915027287,25831.700000000572,3291,1.2657861215888913,13.079361282219251,19374.000000000025,1164,1.4203350704463706,18.36884975873812,12,10.6,60.6,95.3,5.6,4,False,55,41,0.1 +188,2.9898465137869286,30494.600000000413,2910,1.2132236027884813,16.038786639728606,20246.79999999997,1028,1.2975597712028326,27.683399653096608,18,79.2,42.4,74.4,38.8,2,False,90,90,0.1 +343,2.963397221089137,28777.100000000755,4171,1.2109620413330815,18.196961079059413,20935.199999999983,1468,1.331943838841894,23.691233965556385,12,20.4,55.5,89.2,15.4,4,False,150,55,0.1 +366,2.9515994911552457,32731.800000000163,888,1.3602011204907187,28.205128205128,25337.1,288,1.6964645020835856,34.606612657236,16,68.6,39.4,87.1,34.7,8,False,40,20,0.1 +237,2.9482497803061216,33073.500000000306,2075,1.2342435308316013,17.061000007724065,19694.899999999994,739,1.2860377435218178,31.25325387862336,14,80.3,49.5,77.5,50.4,12,False,90,70,0.1 +20,2.932083485931357,29069.600000000304,2188,1.244161708332353,19.418592340933166,20489.800000000014,744,1.3648332238288807,21.75951034322455,18,77.2,44.0,84.9,22.0,3,False,55,41,0.1 +173,2.92744935480023,26603.700000000375,2196,1.2786822050543436,12.593192470980568,17417.89999999999,776,1.3770181670205686,15.667445786261535,12,17.4,63.4,97.4,12.4,12,False,55,55,0.1 +281,2.920081737963012,30853.50000000054,3370,1.2208358026918174,13.975596913751406,18690.199999999997,1251,1.266707573757625,28.192797283508668,18,77.6,47.8,75.8,59.9,3,False,55,70,0.1 +332,2.893132341868567,31474.700000000186,1131,1.3161383247673004,30.455090633415306,24528.19999999999,374,1.5857970218406323,26.46874090414701,21,71.6,38.6,84.9,46.7,4,False,120,41,0.1 +192,2.883486687550816,25543.800000000418,2080,1.3362933453050352,14.7357662926708,18271.000000000004,745,1.4975477981923695,14.703324055240344,14,14.3,63.4,94.5,11.4,8,False,55,90,0.1 +481,2.879380301279544,25606.100000000464,3092,1.232728564988514,15.76535288725864,19017.999999999985,1110,1.362886991365739,15.777549961397783,10,5.2,61.4,91.6,0.2,6,False,55,55,0.1 +24,2.8646103528411633,27763.700000000434,2196,1.2895686773502137,16.122147317234376,19441.30000000002,774,1.4366770737404841,22.573507850611744,16,7.5,57.3,93.7,2.5,8,False,71,90,0.1 +35,2.8472787058354614,32366.000000000648,5055,1.1856364872111844,22.734824183309797,21526.700000000008,1801,1.2490634104125162,30.49278044045372,14,79.9,42.1,81.0,36.3,1,False,150,35,0.1 +542,2.8408307096376806,25402.400000000358,2300,1.31771944021623,11.518771331057948,17215.199999999993,828,1.4439035207599513,16.93066239527517,16,11.5,60.5,98.9,6.5,6,False,120,20,0.1 +245,2.8270708450878352,23749.9000000004,2294,1.332362132108559,12.361627952524078,18156.99999999998,797,1.5376060733467958,15.971861140847363,21,19.3,59.3,93.7,9.7,4,False,71,90,0.1 +184,2.80218409866828,27483.000000000757,4098,1.204013156966832,18.874900321386747,20137.89999999999,1447,1.3234271434100873,21.78915223159821,12,19.7,55.6,89.3,14.7,4,False,40,41,0.1 +180,2.796088488565238,27059.700000000652,3845,1.230632140214988,19.65689100342124,19840.80000000004,1372,1.3527454006272348,18.639161276862033,10,9.7,59.8,93.2,4.7,4,False,150,70,0.1 +293,2.783634976324011,32075.800000000185,1410,1.3252619015507738,22.197080413192783,20673.70000000001,455,1.4769041610341915,30.128565760409316,18,80.9,47.9,82.0,24.9,8,False,40,35,0.1 +139,2.7773653903804694,23571.10000000032,1777,1.3383434147405775,17.805507092467057,18169.30000000004,627,1.5541414289287006,8.223738794877834,10,4.7,70.0,93.9,-0.3,12,False,120,41,0.1 +519,2.76772398632306,32371.700000000135,1061,1.2942114193842154,31.21590190008711,24866.699999999997,369,1.4938386103161807,32.60058067192039,21,64.1,39.4,79.7,39.3,6,False,55,55,0.1 +445,2.756143007660022,25141.900000000467,2625,1.3034053896847553,19.376964694309095,19432.899999999983,933,1.4994602624666526,14.741890229959703,18,7.8,58.6,85.3,2.8,4,False,150,90,0.1 +179,2.7404789831753753,24879.90000000056,2761,1.250563720281945,15.582266290971978,18818.199999999975,956,1.4059154571084078,18.342710927074897,12,18.9,62.5,92.1,17.9,8,False,90,20,0.1 +108,2.6920031524950385,26566.900000000256,1871,1.1978882996156508,22.78232967865648,21175.899999999976,654,1.3607232897247197,20.900520323527928,18,64.6,39.0,74.8,53.5,6,False,71,90,0.1 +234,2.689663420235128,27044.800000000578,3566,1.2050956930723506,18.983698672898868,18964.80000000002,1266,1.302757654030477,19.741343782503733,10,15.5,58.9,94.5,10.5,6,False,40,41,0.1 +465,2.6783220315869984,25527.200000000725,3954,1.2355490102719122,16.54932680538488,19604.000000000007,1417,1.3847701369384435,23.308830627921985,12,4.4,58.0,97.4,-0.6,3,False,40,70,0.1 +124,2.6512129097419868,29513.200000000477,2432,1.2450265257494866,14.274311267126993,16498.600000000006,899,1.2685738657081826,25.050407104708288,18,63.0,54.4,77.1,46.1,8,False,71,90,0.1 +356,2.648250957607127,24953.800000000367,2252,1.2987040969497332,13.794970567531692,17624.400000000016,802,1.4413094755186948,20.06490642132456,18,15.0,58.9,97.7,10.0,6,False,90,70,0.1 +187,2.6300064483827374,24415.10000000056,2582,1.258689615055747,15.429954980516142,17714.099999999984,910,1.3940897987514864,16.894559109395136,10,5.5,64.3,97.5,0.5,8,False,150,20,0.1 +99,2.628155132457607,29574.800000000403,2491,1.1951827966072617,28.474685896599976,22126.60000000001,888,1.3234939794265403,24.190569272692645,12,73.6,44.5,79.9,61.7,8,False,40,90,0.1 +399,2.6171657725942463,27516.600000000843,4868,1.2109316250257764,23.219634842218944,22627.799999999996,1766,1.363631980870102,30.555088852988604,21,71.6,47.9,87.6,58.0,1,False,55,90,0.1 +176,2.5874088583106043,21498.700000000263,1379,1.4154346191973306,12.394383485975524,16202.000000000018,485,1.6272114215811526,11.33822009209657,14,10.5,68.8,85.3,6.3,12,False,40,70,0.1 +183,2.5813574669877846,19356.000000000247,1260,1.430341810032417,9.315649944226209,15287.100000000013,437,1.7210624127391418,8.294841564650046,16,15.4,68.3,87.4,10.4,12,False,40,90,0.1 +421,2.564582470273139,24301.90000000038,2710,1.2638247472148618,17.528667122981407,18077.500000000004,962,1.414801370318783,16.769671537372215,12,8.7,62.2,90.4,3.7,6,False,90,70,0.1 +208,2.5533188051236424,28750.400000000445,3499,1.202590301168317,22.799871278072917,20097.89999999998,1198,1.3005387832739406,26.304236173161787,16,78.7,38.9,87.7,49.2,1,False,40,35,0.1 +477,2.54833815988017,20159.500000000276,1404,1.4034344812956627,8.407162232784893,14325.90000000002,488,1.5802308626974482,8.766899856008752,12,10.6,71.2,90.2,5.6,12,False,55,41,0.1 +456,2.507363429427628,24625.60000000095,5062,1.1895223076751371,17.369729504867117,19199.200000000023,1847,1.3052395276221493,23.752895125353877,21,63.7,49.2,84.3,52.8,1,False,150,70,0.1 +389,2.4245765022543533,27294.200000000368,1962,1.2897759545262937,18.046767979881615,18265.600000000006,705,1.4072960799179421,28.317312238015706,21,15.6,55.4,93.1,10.6,8,False,55,41,0.1 +537,2.4114737970925164,30363.700000000383,2447,1.2035479801196227,24.254259720306393,20554.199999999997,891,1.2887336803984972,34.129209997269875,14,73.5,44.4,78.9,54.9,6,False,40,70,0.1 +37,2.38392141137348,21877.100000000446,2263,1.2629433851597565,13.442261137848421,16259.200000000004,822,1.3990653655088472,16.845654531140923,12,6.5,64.2,95.5,1.5,8,False,55,35,0.1 +276,2.369352263736501,31660.10000000037,2155,1.2385734168563722,15.757690996353887,14700.099999999995,801,1.2180085719794151,29.893698418476184,16,80.8,49.3,76.6,39.9,8,False,150,70,0.1 +396,2.3668174336003016,28579.500000000466,4077,1.180583006450051,21.35476127747998,18791.799999999992,1397,1.247944657825605,29.32708508020603,14,81.7,38.8,84.4,48.4,1,False,90,70,0.1 +390,2.2750875397305297,21125.600000000726,4224,1.1960537928487196,18.596168791018503,19089.20000000001,1462,1.3994701410236812,21.024851691518347,12,20.9,60.6,96.8,15.9,3,False,40,20,0.1 +505,2.271477662164148,19321.60000000025,1421,1.3847521720169722,9.861501489263453,13005.599999999999,499,1.5271571711144971,8.36249101764235,12,14.7,72.0,90.2,9.7,12,False,40,70,0.1 +57,2.2688421498436155,27859.000000000226,1554,1.205809259828375,28.254856956275137,20836.899999999983,553,1.3516283794843933,27.579618365831543,10,80.0,39.8,82.5,50.8,12,False,71,35,0.1 +536,2.2506104078094227,22962.30000000062,3416,1.2286687652426436,18.250522108868374,18323.29999999998,1208,1.396865070684274,23.773983729229307,16,17.3,57.2,91.5,12.3,3,False,150,90,0.1 +150,2.2346035787982275,18736.500000000302,1601,1.3348614015334281,10.304629789265462,13830.0,542,1.5211846682017052,10.600741174175905,12,17.6,71.6,94.0,12.6,12,False,90,90,0.1 +416,2.157643145310046,22830.000000000284,1709,1.2558837572657304,12.399663514076275,13772.300000000028,627,1.3073851627173045,18.51351527728827,21,72.2,58.0,75.5,43.9,12,False,55,41,0.1 +166,2.1450032609828047,25753.800000000592,3163,1.2356016056967853,16.572227952916812,16499.4,1138,1.3095845224625817,29.37802159264547,16,66.5,57.3,79.1,46.1,4,False,71,70,0.1 +467,2.113975221604871,18575.30000000017,1063,1.4734912886657063,11.466656294798048,14356.099999999999,366,1.7564880146280024,14.978008738441902,21,15.7,66.0,98.1,10.7,12,False,150,20,0.1 +336,2.1113723780061733,24236.100000000573,3026,1.236707247395947,17.37834520792434,16386.100000000024,1089,1.3309286990942237,25.211027519627567,16,66.9,57.6,82.0,46.0,4,False,55,41,0.1 +358,2.060191403644175,24883.700000000863,4892,1.1822972336405613,22.266630761888976,19090.900000000005,1720,1.2993613194484739,30.656355086085192,10,15.9,56.6,98.3,10.9,3,False,90,41,0.1 +461,2.0498311781209875,20145.30000000025,1316,1.3585708640815073,17.120692098663206,15060.89999999999,464,1.552888356999162,13.566105933330064,21,12.2,62.6,93.6,7.2,12,False,40,20,0.1 +202,2.047147195489205,20477.400000000733,4201,1.1915021359688174,25.903896590482077,20234.00000000003,1444,1.4323254854954945,19.43002297977649,12,21.9,61.7,86.5,16.9,3,False,120,20,0.1 +260,2.0292372885483263,22380.70000000074,3801,1.2021177448049776,16.40363330622507,15397.700000000033,1352,1.294891486704918,21.28262803497677,10,12.1,62.0,85.8,7.1,4,False,40,70,0.1 +438,2.0158687297261224,25732.30000000033,2112,1.1879423792269581,23.795655170148866,15812.5,756,1.2350423856672068,18.71834722259438,21,63.4,47.6,74.7,38.0,6,False,90,35,0.1 +174,1.9998822149901425,17565.50000000028,1706,1.3238841388873015,13.670270865261239,14208.2,609,1.5383892505551293,11.564208151742312,18,5.1,64.1,87.0,0.1,6,False,150,20,0.1 +353,1.9960191619889276,27336.30000000063,3855,1.184475755430593,19.038255890163626,15289.2,1420,1.2062173258593059,28.962789918914332,14,63.0,51.9,78.5,46.4,4,False,120,20,0.1 +125,1.9892439150077643,22272.900000000936,5425,1.1666479614283027,26.512867000904983,19580.59999999998,1915,1.3165518568156005,21.759301973085922,10,4.6,55.9,93.6,-0.4,2,False,90,35,0.1 +251,1.9846267930345736,19068.400000000434,2384,1.2786889558591004,12.203833789736654,13678.599999999988,840,1.405363916548127,15.66696092552166,16,10.7,62.4,92.9,5.7,4,False,90,55,0.1 +526,1.9793657384334884,26568.800000000352,2112,1.1755740778310046,25.248460842212456,17190.09999999999,765,1.2414180524600216,24.812949754571026,12,74.1,43.8,81.3,49.5,8,False,55,55,0.1 +120,1.943740377059348,26674.900000000787,4744,1.165970841287107,22.887444836161546,18427.09999999999,1678,1.2312165056596107,34.960602727109915,12,71.6,49.8,84.3,28.4,2,False,90,35,0.1 +23,1.9021991298093368,24917.000000001033,6045,1.1613201879101476,25.98731134098642,20191.60000000001,2158,1.2729885756776853,34.00091359958247,14,81.1,46.9,90.7,61.5,1,False,55,20,0.1 +102,1.8975410061343028,28020.90000000051,3083,1.1642419965370792,33.28888404187732,22101.700000000004,1080,1.2835376101029135,36.67994795901778,10,75.3,38.1,84.7,49.2,3,False,71,35,0.1 +473,1.8936212653347801,27298.200000000877,4451,1.1820548748240207,24.486633087949507,19092.000000000007,1593,1.2692856145458236,38.09627015787664,10,17.1,54.5,98.1,12.1,4,False,55,20,0.1 +450,1.8851636059048973,26136.400000000365,2759,1.1582615235284464,24.350409380223855,17954.999999999964,997,1.2262640162713516,31.361340069130662,12,63.1,47.4,80.0,47.6,8,False,150,55,0.1 +491,1.8836440928799778,23431.20000000098,5899,1.149855524416313,27.808627658867703,20759.99999999998,2082,1.2837135313314878,30.326232565469773,10,16.0,52.6,90.2,12.3,2,False,120,41,0.1 +374,1.8699376658593692,19280.200000000492,2809,1.2522107455314193,15.616944393297361,13966.500000000004,1029,1.372229566218565,15.315871002109887,12,12.4,64.7,93.2,7.4,4,False,150,70,0.1 +428,1.840314753042571,18615.20000000035,2104,1.313631140718877,17.381175725121356,14857.69999999999,742,1.5192294923274237,15.62439418956776,18,5.2,62.7,92.0,0.2,4,False,90,35,0.1 +454,1.811841274388476,22919.60000000096,4899,1.2061452503917005,33.59168139350947,20870.5,1735,1.4082576793444581,22.61861563631972,21,6.8,52.5,95.6,1.8,1,False,55,35,0.1 +12,1.7930458567035292,23067.500000000655,3883,1.1918561663033487,17.78849432509859,14079.40000000002,1398,1.2281705388165742,23.195080965475086,16,78.4,55.3,77.6,36.3,2,False,55,20,0.1 +462,1.7868151908952408,26943.30000000065,3945,1.153103199033078,31.614193772829108,20370.19999999998,1363,1.2533313932592387,33.84503944704323,10,76.3,38.6,85.6,55.4,2,False,120,41,0.1 +178,1.7581228246490028,15515.400000000394,2080,1.2427414131363277,12.687629561177346,12404.40000000002,714,1.4146202055653052,9.120725940908033,14,18.0,66.4,97.8,13.0,6,False,40,41,0.1 +199,1.7260277758893197,22935.30000000031,1749,1.1843192092098118,14.275426979131131,12416.70000000003,612,1.207978305548064,24.463391696401427,18,80.5,49.7,72.2,34.9,12,False,71,20,0.1 +337,1.710964062549211,23071.30000000036,2223,1.1744247407591102,14.87860363155049,12549.600000000024,803,1.1893127652160262,24.746787705734967,21,62.5,51.2,72.3,53.5,12,False,71,20,0.1 +405,1.7030665889348526,15680.600000000228,1150,1.3807098218404499,13.936381282545193,12802.300000000007,404,1.6361359695107098,11.406676772404298,16,5.6,69.0,96.7,0.6,12,False,71,20,0.1 +354,1.7006254397728473,17603.700000000197,1215,1.358745226226916,16.27330902084885,13198.2,424,1.5437085983587655,13.429360013800263,21,15.7,64.2,89.8,10.7,12,False,150,55,0.1 +480,1.6190616635916073,17785.700000000517,2836,1.2282969219315607,18.68211801130198,13949.600000000006,1030,1.3693741642504413,14.97227744952547,12,14.0,64.8,90.7,9.0,4,False,90,20,0.1 +437,1.6106865709173772,15312.90000000035,1825,1.2767083186512334,13.167150268178549,11819.800000000014,638,1.4420054372824063,10.59237567123567,14,13.2,67.3,88.2,8.2,6,False,71,90,0.1 +497,1.60052434758879,16561.400000000518,2538,1.2526267297976685,22.638350243999437,15112.50000000004,882,1.4898227076783466,10.903453736169347,18,16.2,61.6,92.3,11.2,3,False,120,55,0.1 +302,1.5807508405029418,19396.900000000704,3811,1.2103392859466586,23.959942366852005,16936.099999999995,1346,1.4006789926304448,22.848809613889827,16,19.5,58.6,86.3,14.5,2,False,120,55,0.1 +404,1.5629428989678962,21547.80000000042,2176,1.2116407417120183,16.947336720134217,13751.700000000008,772,1.2715162356509073,27.55197046311898,21,80.7,55.8,73.0,47.2,8,False,71,55,0.1 +87,1.5584623574129521,24086.60000000064,3563,1.1484103555635239,20.086790588644902,15415.29999999997,1282,1.1957376620375366,34.630639356718795,14,72.5,47.4,78.2,49.9,4,False,55,20,0.1 +291,1.4414161813899469,19725.40000000058,3445,1.211817513114167,25.300774811487564,17292.30000000001,1226,1.4056749401773554,27.421090023343098,14,16.9,60.1,93.6,11.9,3,False,55,41,0.1 +121,1.4196389184035023,26163.000000000786,5078,1.1685835259428425,24.226280079410976,16556.299999999996,1848,1.216674867950603,41.709611021800285,18,67.6,44.6,79.5,52.9,1,False,150,41,0.1 +64,1.3143634410071945,15212.200000000525,2848,1.2060715253318872,22.803422546887077,14301.300000000028,978,1.4311256481369827,13.688809677397831,16,19.8,62.2,87.2,14.8,3,False,150,35,0.1 +468,1.2711617161981295,20253.000000000986,5939,1.1290861670720345,26.160269192421033,17232.799999999996,2157,1.225311305311934,32.22493437111397,10,66.4,53.1,89.7,49.4,2,False,120,55,0.1 +100,1.2711530297571678,17980.20000000108,6305,1.1330812860039001,27.698905971720293,17139.8,2272,1.266496463516459,24.071263082208137,14,4.7,52.1,97.4,-0.3,1,False,71,35,0.1 +198,1.2641245426844427,14502.700000000379,1800,1.250981674826379,14.770867715361655,11405.600000000017,633,1.4085919811996668,15.871769589404625,10,10.9,72.5,95.1,5.9,8,False,90,55,0.1 +217,1.2519222982247058,11368.200000000106,667,1.560946605414954,8.477929207028117,8306.900000000005,244,1.8699599941352654,8.68796349115801,16,6.9,73.6,98.7,1.9,12,False,120,41,0.1 +331,1.2124090890730654,11815.200000000237,1346,1.303171507749153,13.566635584077702,10644.5,448,1.6121539399376603,10.79825791469133,12,16.2,74.5,87.1,11.2,8,False,120,41,0.1 +503,1.1938041935018358,17854.60000000065,3745,1.2076819016667277,26.40963120999558,16594.600000000017,1325,1.4121745307505245,26.752191142865385,14,12.2,60.6,92.6,7.2,2,False,90,90,0.1 +502,1.1796710961865333,20176.800000000494,2855,1.1750051607822194,17.933399389946825,11098.000000000022,1049,1.1873652541957969,24.96400405772432,18,74.8,55.6,74.3,40.4,4,False,150,20,0.1 +501,1.1376571936889355,13150.400000000158,914,1.438959747113466,17.793988437599037,11226.300000000003,329,1.8008889015716303,12.163293895512625,16,6.4,71.4,90.2,1.4,12,False,71,35,0.1 +524,1.1017926057281777,12099.300000000301,1535,1.2427199852353517,15.31159313363788,10791.80000000001,538,1.462068729287445,12.462050221647461,16,18.7,67.7,90.7,16.2,8,False,71,41,0.1 +161,1.0971515785678683,22128.500000000317,2033,1.1461623668151277,30.93374665228041,16966.19999999999,721,1.248122576899398,33.47534453346194,12,81.0,42.0,79.0,55.3,8,False,90,70,0.1 +342,1.0416073842697333,10205.400000000187,1045,1.3364565475405505,13.274507634431892,9233.2,351,1.6935841289634406,7.925131150018373,14,18.0,74.4,87.6,13.0,8,False,40,20,0.1 +496,1.0254876456358666,16464.70000000065,3485,1.2025337787968537,24.787068348603306,15280.700000000023,1230,1.3994682714377578,26.68454575930267,16,10.8,59.8,94.3,5.8,2,False,90,90,0.1 +66,1.0206080449324764,20473.000000000884,4997,1.1526885505588336,28.72009621556113,17091.200000000023,1765,1.2710707414826468,36.38861474083129,10,17.3,58.6,85.9,12.3,3,False,90,41,0.1 +320,0.9988813421714673,16264.700000000663,3669,1.191812922049282,28.54471069549815,15944.90000000003,1302,1.4032824284608636,23.41350746375052,14,5.1,60.8,89.5,0.1,2,False,55,41,0.1 +13,0.988080794991635,17904.900000000907,5229,1.1432041436256424,28.707294610018934,16877.000000000004,1855,1.2891655030026827,30.683309672407727,10,8.2,58.1,91.8,3.2,2,False,90,70,0.1 +1,0.9722729368421306,13950.200000000448,2409,1.1867699174877064,18.361545419304043,9738.300000000017,869,1.2564715053607702,11.482028777837492,10,6.7,68.9,86.0,1.7,6,False,55,20,0.1 +324,0.8384484198872978,9081.700000000175,1035,1.299752783251312,16.771203349945623,9457.899999999998,361,1.668124245014446,7.017531023179588,12,7.2,75.3,92.7,2.2,8,False,40,35,0.1 +440,0.8224639240429837,18766.400000000544,3194,1.1234970383322296,18.029344889520907,10453.600000000031,1159,1.1377565408528203,30.745539236897724,14,76.9,53.5,76.0,51.2,8,False,40,90,0.1 +344,0.8032620578048241,10160.000000000247,1434,1.2584038475722492,16.114826014736288,10134.900000000001,499,1.5354024142211888,14.14306515160169,10,10.1,75.9,95.0,5.1,6,False,55,35,0.1 +63,0.7571052003181598,10154.400000000249,1460,1.240273153833596,13.936252443958171,8611.399999999994,501,1.4209533213732275,13.153827819254104,10,13.4,76.8,86.9,8.4,8,False,71,35,0.1 +97,0.7335277964202724,11655.600000000148,858,1.3866486206759276,18.15144766146976,9856.100000000013,310,1.6793983635599121,15.932416768379214,21,11.5,68.1,94.4,6.5,12,False,40,41,0.1 +65,0.7151037557808859,16550.100000001,5546,1.1496916190384885,34.662754363231755,16693.299999999977,1949,1.3276562585872553,26.056152886851564,16,10.8,55.1,89.6,5.8,1,False,55,90,0.1 +204,0.6199991596146298,14177.500000000644,3586,1.155617657486386,29.945175045686025,13757.60000000002,1256,1.3275907639482518,20.14602808353937,12,18.0,63.1,98.3,13.0,3,False,40,41,0.1 +73,0.6141691055529147,12291.200000000295,1474,1.2428207924391135,23.40891571966032,11122.800000000017,529,1.4539881307091378,16.942318487383467,16,8.7,66.8,97.4,3.7,8,False,120,35,0.1 +355,0.6133202455058886,8295.80000000021,1164,1.248283581642853,16.68904283694004,8751.0,407,1.5473548580792862,9.788851154441023,10,5.2,77.4,88.7,0.2,8,False,120,90,0.1 +541,0.5984758932900887,20437.600000000442,2832,1.1249785970422348,31.813385170785182,15130.299999999985,1004,1.1984278218355453,37.428627859374565,12,74.1,39.2,79.3,59.5,4,False,150,90,0.1 +407,0.5611801359637738,12095.400000000638,3414,1.1585238308680719,27.45734168750908,12925.50000000003,1220,1.3566530817221323,18.21215417634434,14,5.5,62.2,91.5,0.5,2,False,150,55,0.1 +411,0.554303031028241,11159.100000000253,1317,1.252843013968664,18.581288191903525,10021.600000000006,471,1.4605387719088632,20.087510511238136,18,8.4,66.7,94.2,3.4,8,False,120,90,0.1 +506,0.5051609028518493,8489.10000000018,1011,1.2672848349364778,18.82479728144168,8864.2,357,1.5988595981569818,10.84333737991396,16,16.0,71.9,85.6,11.0,8,False,120,41,0.1 +147,0.48880181083237384,8829.7000000004,2425,1.1393193788322031,18.314772087276552,9481.799999999992,850,1.3108124498057774,14.741839207857488,10,7.9,70.2,92.0,2.9,4,False,150,70,0.1 +311,0.45983359383444666,15704.400000000609,3733,1.0884423582150917,24.24402433857796,11870.100000000013,1352,1.1400109460036467,30.784695148254542,12,65.7,49.1,77.8,48.2,6,False,71,70,0.1 +201,0.4597683554609566,10662.900000000162,859,1.3722819635500316,19.303719700636453,9229.300000000007,308,1.67028098741403,18.344282457403406,18,7.3,70.2,90.1,2.3,12,False,55,35,0.1 +495,0.36435565264808856,12417.30000000016,1073,1.3447813411078697,17.63934246274575,8002.0,362,1.4949129480162042,23.281320177916847,12,18.8,77.2,97.7,7.6,12,False,55,55,0.1 +84,0.335592156962092,7076.700000000215,1239,1.240098119711476,23.35825038664335,9020.300000000003,435,1.670210789886246,6.3249367506325065,12,8.8,75.1,86.5,3.8,4,False,90,90,0.1 +6,0.2727301940134631,7089.10000000021,1143,1.194480336885999,16.10630668635289,7777.799999999999,405,1.426587540997993,15.221828852103547,14,7.2,72.3,86.1,2.2,8,False,90,41,0.1 +258,0.12430732951218249,7783.6000000002205,1237,1.2113936839360775,17.876513408516317,7593.30000000001,439,1.4186496559633028,18.136872235232914,10,5.4,76.6,91.9,0.4,8,False,40,90,0.1 +218,0.11089814196437298,8416.100000000351,2135,1.1523629003642473,22.2642451921354,9296.299999999985,739,1.3592592449461482,19.172201300924428,10,12.0,72.5,98.2,7.0,4,False,55,41,0.1 +487,0.07908086604453068,14642.800000000632,4204,1.0990900884196413,20.647198419235895,6663.100000000006,1553,1.0870119931885387,26.67406612469317,16,75.0,52.0,72.3,38.2,2,False,40,41,0.1 +114,0.07628771936082734,17035.90000000102,6447,1.082898264118848,34.06974385453522,13650.000000000011,2283,1.1377542524687267,37.20902379139544,12,68.2,43.0,79.8,34.2,1,False,40,70,0.1 +92,0.04887408438571228,17038.80000000068,4798,1.1020264209556916,23.953390753600353,9650.599999999966,1716,1.1166792607951819,39.433699845173024,21,68.3,43.5,72.1,51.2,1,False,40,35,0.1 +471,-0.027372781090451048,9462.600000000235,1457,1.2448805306184783,25.97837160097136,10293.599999999977,527,1.5540448893912473,24.390082401412766,21,17.1,65.9,86.0,7.8,4,False,150,70,0.1 +540,-0.035888541843845156,8791.70000000039,1964,1.1685619024063838,24.13002220876161,9521.700000000012,690,1.39000184316697,22.78665395614869,21,16.9,63.2,86.3,11.9,3,False,40,35,0.1 +304,-0.049011558000254474,10594.300000000232,1368,1.2438240208420592,23.27000950854736,8837.999999999996,490,1.4000470750122218,26.34685457885387,21,13.1,65.2,96.7,8.1,6,False,40,55,0.1 +317,-0.09719710338792836,5926.500000000122,729,1.2922222003076798,14.783380358605502,4892.899999999998,265,1.4579008937345004,16.040919116436793,12,5.1,77.8,90.0,0.1,8,False,40,70,0.1 +224,-0.10318689307740725,5301.300000000163,907,1.2079626229816876,19.042147014122797,5909.799999999992,311,1.4919094389878467,11.554693737880713,16,16.9,73.2,97.1,11.9,6,False,40,41,0.1 +143,-0.1302240664750351,4230.900000000196,908,1.1639731187796478,16.77741351470246,4870.600000000011,307,1.4030785782265072,9.470188075230052,14,17.7,75.7,95.8,12.7,6,False,150,20,0.1 +45,-0.1716273774325725,5004.200000000203,1095,1.1680699927790545,17.71208915640973,5478.100000000008,373,1.4063359962022597,13.471629524261116,12,18.5,77.9,85.5,4.9,6,False,90,35,0.1 +424,-0.19928737403314079,12806.400000000645,4524,1.084496169551846,26.30342250726867,9052.600000000002,1652,1.118328608084033,31.5614051406071,14,62.8,54.5,83.3,33.6,2,False,40,70,0.1 +349,-0.23937784353650893,7930.900000000231,1342,1.2253948224755364,27.023927902747104,9613.599999999984,484,1.5663187162751226,23.48389306677891,21,11.3,66.5,90.1,4.5,4,False,120,41,0.1 +279,-0.3185321028502003,4276.1000000001695,920,1.1757751643229155,24.516001188941676,6072.300000000001,316,1.5445618251605266,7.883696429243349,16,17.5,73.5,88.9,8.6,4,False,71,90,0.1 +425,-0.32176501140956915,8361.60000000025,1393,1.1942773498762782,22.165696706574558,6937.3999999999905,482,1.3354090720094358,24.48799435028256,12,14.8,73.5,96.7,9.8,8,False,55,90,0.1 +156,-0.38850554494916995,3186.000000000133,638,1.1783624912526254,22.169844297740596,4904.200000000004,229,1.5908389957110496,7.121669035900012,21,8.6,71.2,85.1,3.6,6,False,120,90,0.1 +485,-0.46804607651334884,6869.100000000148,934,1.2311124120597923,20.213707501348992,5287.599999999997,341,1.3528124374457875,22.80935368626183,21,13.2,68.3,96.4,8.2,8,False,40,70,0.1 +221,-0.5220759989586498,7607.200000000445,2580,1.1147697047326375,28.386208390384915,8785.499999999985,903,1.289271708960162,26.0148883374691,14,16.5,65.5,96.8,11.5,3,False,71,90,0.1 +539,-0.5562731491738232,4597.700000000217,1420,1.1326143577821548,26.354220710592212,6697.999999999985,493,1.4051977592527616,15.624168427643504,10,10.5,76.9,94.7,10.4,4,False,120,70,0.1 +142,-0.5692391414106299,5195.900000000427,2328,1.094101688284874,27.216912714335585,7402.000000000018,822,1.2758183816816655,18.472305861962543,10,5.8,71.7,87.9,0.8,3,False,71,41,0.1 +394,-0.609656556598431,6213.800000000352,1920,1.1466511530210297,33.50814484940588,9169.500000000011,682,1.4771606094667167,19.006030075085,10,7.1,73.9,99.0,2.1,3,False,120,20,0.1 +19,-0.6961333451812575,13298.500000000473,4124,1.0889067316672714,31.948634886354306,9252.699999999964,1426,1.122512075503677,40.65497359629284,14,71.6,51.8,82.3,27.0,2,False,150,70,0.1 +101,-0.8843030355277979,2189.8000000001266,877,1.0965567113043395,24.31225226291173,4188.299999999999,314,1.358378683643085,14.445273070986373,12,7.4,77.3,93.2,2.4,4,False,120,41,0.1 +350,-0.9193537157339968,1888.800000000123,656,1.1012007136772062,29.533999999998766,4236.000000000004,230,1.5179497212168638,6.6675745826257,14,16.4,77.5,97.2,11.4,6,False,90,55,0.1 +338,-1.0536870484018621,3721.0000000002947,1695,1.0975276057379044,32.56141803698686,6767.5999999999985,599,1.3849864609643423,19.992172774032845,10,10.8,75.6,90.3,5.8,3,False,40,41,0.1 +175,-1.138813620495347,3800.5000000002474,1340,1.1093219193252832,32.605131649118945,6533.099999999988,470,1.395504407206508,22.067611812200166,16,9.8,70.1,92.0,4.8,4,False,150,20,0.1 +2973,-inf,0.0,1657,0.0,0.0,0.0,594,0.0,0.0,21,73.4,52.0,73.9,32.8,8,False,71,70,0.1 +2974,-inf,0.0,5413,0.0,0.0,0.0,1884,0.0,0.0,14,5.7,58.2,93.6,0.7,1,False,40,55,0.1 +2975,-inf,0.0,1400,0.0,0.0,0.0,494,0.0,0.0,18,4.5,69.5,96.6,-0.5,2,False,55,35,0.1 +2976,-inf,0.0,924,0.0,0.0,0.0,318,0.0,0.0,14,19.5,75.4,94.9,7.7,12,False,120,41,0.1 +2977,-inf,0.0,1498,0.0,0.0,0.0,542,0.0,0.0,21,76.0,52.5,86.1,29.1,12,False,55,41,0.1 +2978,-inf,0.0,2992,0.0,0.0,0.0,1070,0.0,0.0,21,13.2,53.9,85.8,8.2,3,False,120,20,0.1 +2979,-inf,0.0,2014,0.0,0.0,0.0,709,0.0,0.0,14,9.6,65.3,93.2,8.2,6,False,55,55,0.1 +2980,-inf,0.0,3935,0.0,0.0,0.0,1408,0.0,0.0,12,78.9,51.7,88.7,25.7,3,False,40,90,0.1 +2981,-inf,0.0,5169,0.0,0.0,0.0,1849,0.0,0.0,16,8.5,57.6,88.4,3.5,1,True,150,20,0.1 +2982,-inf,0.0,4861,0.0,0.0,0.0,1793,0.0,0.0,21,78.3,48.2,79.4,48.6,2,True,40,35,0.1 +2983,-inf,0.0,3537,0.0,0.0,0.0,1271,0.0,0.0,16,67.9,44.7,85.7,59.9,2,False,120,20,0.1 +25,-inf,3321.4000000002434,1294,1.1001661695653344,40.069301311345754,7058.200000000001,437,1.4932768645868275,12.977446344125147,12,15.9,75.7,96.0,10.9,4,False,150,41,0.1 +26,-inf,-5592.799999999548,3239,0.8980456067624443,90.01737498002431,2643.8000000000047,1124,1.1159098780749792,14.989871708305172,12,21.0,70.8,91.5,16.0,2,True,55,20,0.1 +27,-inf,-1412.6999999998898,589,0.9150531556667307,27.903921206045013,532.8000000000029,216,1.0629065964556002,19.666583641813634,21,20.3,73.0,87.0,15.3,3,False,55,70,0.1 +28,-inf,3546.7000000002845,1552,1.0888683424539431,36.919659735348674,5900.199999999992,554,1.2982082838442293,29.375777442244466,12,4.4,72.8,95.2,-0.6,4,False,55,35,0.1 +29,-inf,-548.699999999295,4135,0.9925537097778876,69.61025229334831,4616.1,1487,1.1294221549331298,33.83397881125376,12,7.8,65.0,95.7,2.8,1,False,150,41,0.1 +31,-inf,-17423.199999999702,2636,0.6986981724610217,178.86108283940706,-6733.5000000000255,941,0.7525267374765695,72.53587762182644,12,19.7,72.2,93.5,14.7,4,True,120,90,0.1 +32,-inf,-935.9999999997035,1620,0.9662737948106318,39.454005224636646,2218.8999999999905,588,1.1590130570007595,18.649163331158718,18,5.1,69.7,92.4,0.1,1,False,55,35,0.1 +33,-inf,6144.500000000391,2297,1.102917603943516,35.188339625953525,8166.6999999999825,802,1.2972779161024466,24.368080659738013,16,17.9,65.2,92.9,12.9,3,False,120,70,0.1 +38,-inf,-25404.79999999961,6377,0.776752360573481,267.42128212446835,-12356.000000000035,2323,0.7810043033469702,139.25605090491044,14,81.9,46.1,80.4,33.7,1,True,71,70,0.1 +40,-inf,-1156.1999999999662,240,0.8963151617329231,24.031801863872033,-1370.400000000005,100,0.8032589189577202,24.507701126047042,21,8.9,75.6,87.5,3.9,12,False,71,55,0.1 +41,-inf,-4769.499999999681,1988,0.8578674303492297,97.18909965374817,1637.5999999999822,733,1.112888104560746,33.11200000000012,21,20.5,66.8,94.8,8.6,2,True,90,20,0.1 +42,-inf,-11340.799999999712,5150,0.904633605284982,169.37842145380992,-1206.8999999999742,1934,0.9780159129161282,68.74499999999983,14,4.3,54.3,88.6,-0.7,12,True,40,55,0.1 +43,-inf,-3238.3999999995713,2969,0.9348512708267123,70.28452892660462,2543.3000000000065,1047,1.1152566798390318,13.736166358158396,21,21.9,62.9,97.8,16.9,2,True,40,35,0.1 +44,-inf,-3791.1999999998934,609,0.7148101341999158,49.89199999999895,944.7000000000025,233,1.174086905244536,9.680022004217435,16,7.3,76.2,93.8,2.3,6,True,150,35,0.1 +47,-inf,-5674.999999999511,5823,0.9311943568460711,99.28778896271345,2210.300000000003,2064,1.0608795767102495,22.613304804512545,14,8.1,57.2,97.3,3.1,1,True,55,20,0.1 +50,-inf,-47407.0999999999,5163,0.6170515772042499,486.6604988012439,-17279.899999999998,1878,0.6857542940796698,187.403,14,19.9,57.7,87.6,14.9,6,True,150,35,0.1 +51,-inf,16062.600000001017,5764,1.136346273663626,39.6309450277916,16992.499999999956,2034,1.3138210541284758,23.146886193506056,16,18.0,54.4,96.4,11.3,1,False,71,41,0.1 +53,-inf,18184.700000000328,1804,1.1670963983401268,39.068447040957324,11748.499999999996,619,1.2218351412845432,56.725252965009766,18,65.0,52.5,84.9,19.9,8,False,90,90,0.1 +55,-inf,-6267.7999999993135,4109,0.9229913909294543,117.77976477060899,-1249.7000000000135,1488,0.9678320274291349,68.08760343730125,21,76.2,57.1,84.9,21.7,3,True,40,55,0.1 +56,-inf,30358.000000000742,4329,1.1808270224357047,23.745068886905866,17117.299999999985,1575,1.2030379842929149,49.984977215443415,10,73.2,50.6,84.5,47.9,4,False,40,90,0.1 +59,-inf,-8156.399999999781,1662,0.9511836311588312,103.02171214061353,-663.4999999999854,568,0.9916577397566844,48.22225265418787,14,74.9,39.5,74.9,29.2,6,False,120,35,0.1 +61,-inf,15757.200000001005,5555,1.1423226927613883,36.444657997114085,16213.799999999977,1950,1.3181409695433275,28.95178878638866,16,12.4,55.1,97.5,7.4,1,False,71,55,0.1 +62,-inf,-1997.6999999998116,1034,0.8922886967023955,32.698026223879026,17.399999999995998,374,1.0018575454778376,17.31295663501295,12,13.1,77.9,98.9,8.1,1,False,120,20,0.1 +67,-inf,-66083.1999999999,5499,0.5592028949255432,674.9747900837656,-29858.300000000007,1982,0.5812364746125935,313.64000000000004,14,67.6,39.0,85.2,45.9,4,True,120,41,0.1 +68,-inf,-971.5999999999367,314,0.8935524513831826,16.90743129278688,251.90000000000146,124,1.0535399264596481,11.270994224005696,18,10.7,76.9,97.4,5.7,6,False,55,90,0.1 +69,-inf,3188.000000000691,3981,1.0439691994930043,54.34511517472672,7981.6999999999825,1377,1.2372512068104529,22.35259987632373,16,20.8,62.7,93.6,11.1,1,False,120,35,0.1 +72,-inf,-20109.49999999985,5055,0.8247710682956745,244.1105262641987,-10214.800000000028,1849,0.8127185222532876,147.93793873643932,14,81.9,47.0,74.8,26.5,6,True,40,41,0.1 +74,-inf,-44177.59999999988,4618,0.6114693991344212,448.71084169175725,-17448.000000000007,1748,0.6639128114941498,182.454,18,10.1,53.6,88.9,5.1,6,True,150,35,0.1 +75,-inf,14858.700000000907,5354,1.1270762883635532,44.1776920326277,17566.199999999993,1837,1.341082652282563,21.893261096267477,10,20.1,62.0,94.0,15.1,2,False,40,55,0.1 +76,-inf,7578.9000000001,780,1.097335597121119,37.836299083399226,-7191.299999999999,174,0.8066719716969464,80.66300000000001,18,79.9,47.5,83.7,18.0,12,False,90,55,0.1 +78,-inf,-15191.099999999497,4528,0.8401952863653014,165.8851532282009,-6320.499999999995,1666,0.8577319494808295,77.72599999999994,21,18.0,52.0,86.8,13.0,3,True,55,90,0.1 +79,-inf,-879.6999999997988,1294,0.9706187856744449,47.096971309737015,3327.199999999999,454,1.2266623975584336,21.51002172398239,18,15.5,70.2,86.6,7.6,2,False,90,41,0.1 +81,-inf,-43059.59999999992,5964,0.6812878871988466,472.024189685453,-14158.0,2252,0.7679100098029233,183.78200000000004,12,13.8,52.8,90.8,8.8,4,True,150,90,0.1 +82,-inf,-13612.899999999909,2340,0.7304899247274786,145.14580068083484,-4568.6000000000095,859,0.8110157397257439,55.04523312456517,14,8.6,69.4,98.0,3.6,8,True,90,41,0.1 +83,-inf,-43240.2,8715,0.7581995906635531,474.08657052143326,-17958.29999999999,3196,0.7951396969240657,223.0369999999999,12,66.0,53.9,86.8,40.2,3,True,55,35,0.1 +85,-inf,-3521.899999999874,706,0.7413429689852452,38.20650489416688,-1238.100000000004,261,0.8295731413547703,19.439976396014007,16,14.7,76.0,85.8,5.2,1,False,150,20,0.1 +86,-inf,-6263.399999999585,2695,0.8676172198643914,83.02388062682485,-835.2000000000044,977,0.9630563443828126,29.584992146364225,12,12.1,70.5,89.4,9.8,3,True,55,35,0.1 +90,-inf,-47028.39999999996,11015,0.7862514510216021,478.52117180503893,-18746.600000000042,3955,0.8197884172630762,201.78098483864258,10,62.6,46.2,88.2,51.7,4,True,40,20,0.1 +91,-inf,-3415.099999999891,602,0.7051092747541206,34.958999999998916,-1426.3999999999978,225,0.760466170716553,19.230805808899753,18,17.5,75.4,89.7,12.5,1,False,71,90,0.1 +93,-inf,6820.100000000501,2733,1.1097325910670628,39.650557686061546,9028.8,963,1.313494557386156,19.30526435896341,16,16.9,64.1,95.9,11.9,2,False,90,35,0.1 +94,-inf,-10428.599999999606,4995,0.8952761495813992,160.67260810486368,627.4999999999709,1801,1.014116763065599,50.16599668006665,14,20.8,59.9,94.7,11.7,4,True,71,70,0.1 +95,-inf,-3766.6999999998498,1188,0.8448608908750166,56.12741674813799,24.699999999991633,441,1.002049316341431,22.816426168012992,18,7.6,71.6,88.5,7.3,6,True,71,35,0.1 +96,-inf,-25836.299999999967,4397,0.7432506695419299,308.18634057396486,-8519.800000000008,1653,0.8201465881935688,136.92000000000007,16,79.7,57.8,77.3,21.7,8,True,90,35,0.1 +98,-inf,-1813.9999999994343,5168,0.9781729534737396,107.42152421623432,6336.500000000011,1863,1.1757629384711819,25.981851977694788,12,14.2,61.7,95.3,14.2,2,True,55,41,0.1 +104,-inf,-35934.49999999977,5735,0.7639838323227455,371.41392524759624,-13392.599999999991,2168,0.814843131101282,147.14244386141667,10,9.6,57.3,96.1,4.6,12,True,90,90,0.1 +105,-inf,8264.50000000027,2022,1.0513867489401814,42.89669507378834,9464.299999999988,700,1.1279947094311953,34.41158298647245,14,74.8,39.8,75.3,48.6,8,False,71,55,0.1 +109,-inf,-10719.099999999828,4196,0.8841352488653073,170.41767276645683,-230.3000000000102,1545,0.9945567008359927,65.69217540842666,16,6.6,59.4,92.3,1.6,12,True,55,41,0.1 +110,-inf,-2852.1999999998798,750,0.7963528874164618,28.968999999998797,-982.3999999999978,255,0.8471757696436067,13.575026728181626,16,21.0,77.4,91.8,6.7,1,False,150,70,0.1 +112,-inf,-26349.7,4904,0.7746000923850792,290.01002173028616,-10813.500000000016,1816,0.8132676902248522,136.02752019144498,21,62.8,56.8,75.1,33.8,12,True,55,20,0.1 +116,-inf,-4446.499999999495,4534,0.9466471005371901,75.39694360868158,-669.5000000000073,1648,0.9825473333524487,37.45300000000006,21,11.8,54.4,91.2,6.8,2,True,40,90,0.1 +117,-inf,15005.500000001259,6986,1.1093198933720323,38.03441870802467,16476.90000000003,2458,1.2599687915645716,24.210337895519483,12,17.0,54.1,95.5,12.0,1,False,40,70,0.1 +119,-inf,-1346.399999999796,1286,0.9541163721126781,49.448930217737725,2572.899999999996,466,1.1803164947297597,24.98749332977589,16,10.3,71.7,87.2,5.3,2,False,71,70,0.1 +123,-inf,5684.700000000643,3713,1.0482774200068476,68.51182676143658,5398.39999999998,1298,1.0913027006548686,61.56094457864475,16,67.3,57.8,83.5,33.9,2,False,55,70,0.1 +127,-inf,-11014.799999999796,4840,0.892670159618889,181.89718824210055,992.0999999999531,1772,1.0214434389042464,62.03505686247126,12,6.4,61.5,96.6,1.4,8,True,55,55,0.1 +128,-inf,-1211.5999999995638,2568,0.9701881815676539,51.353229681693946,3759.6999999999753,898,1.2037667335103783,17.533219167221773,10,15.5,74.7,96.0,10.5,1,False,150,70,0.1 +129,-inf,16079.600000001166,7013,1.0941343145089295,50.28920086690831,13883.0,2520,1.1659540234556647,58.31063804978807,12,73.9,49.6,84.0,40.8,1,False,40,20,0.1 +130,-inf,-12619.799999999817,4164,0.8564772219372696,177.33332002953267,-1939.4000000000087,1498,0.9516930112535296,70.70100000000014,18,11.3,58.2,85.8,6.3,8,True,55,35,0.1 +131,-inf,4272.000000000264,1438,1.124527773891143,39.765115700420424,7661.19999999999,508,1.4939905086144638,19.856244384546397,18,13.3,68.7,94.1,8.3,3,False,40,41,0.1 +133,-inf,-60408.09999999997,4623,0.5536455031381022,624.6489518278365,-23780.10000000002,1698,0.6004163852117721,261.28600000000023,14,71.0,42.5,74.1,28.2,8,True,150,41,0.1 +135,-inf,-29628.59999999962,5790,0.7735050281507642,312.12214805220293,-9994.600000000002,2143,0.8370649321008783,116.567,12,13.1,56.4,97.7,8.1,8,True,71,35,0.1 +137,-inf,-18437.49999999979,5085,0.8472812964627252,202.57053167755603,-3551.499999999982,1905,0.9353905040504865,58.02418413558043,14,13.6,52.2,85.4,8.6,12,True,55,55,0.1 +138,-inf,-41330.19999999962,7637,0.7655751661753775,448.8248966942111,-17547.40000000002,2836,0.7951345715810119,213.34100000000018,12,63.6,56.2,74.9,19.2,3,True,55,90,0.1 +140,-inf,5919.000000000264,1538,1.1400343520660945,42.54621935532209,8749.199999999975,550,1.4441556463690117,32.42418750755123,21,21.2,65.9,94.3,16.2,4,False,40,35,0.1 +144,-inf,-77006.59999999974,7670,0.5499640294286626,789.1608774954871,-31750.00000000003,2869,0.6066123812403046,338.8760000000004,18,62.6,48.4,74.0,38.6,2,True,150,20,0.1 +145,-inf,2532.1000000007443,7546,1.0118320494758286,88.55635025344723,5608.499999999976,2657,1.0540023975389115,62.00348525950835,10,67.7,46.7,82.5,30.7,1,False,71,55,0.1 +146,-inf,-1974.9999999998763,715,0.8986488220170682,41.54777687634709,337.39999999999236,264,1.0325858105889394,26.80811660270861,18,16.5,73.5,98.5,11.5,3,False,120,35,0.1 +148,-inf,6937.300000000581,3828,1.0344744305405313,33.067835080686784,-182.79999999998108,1351,0.9981938918370442,39.43170308204314,10,74.6,45.1,80.0,35.4,4,False,150,20,0.1 +149,-inf,5450.200000000426,2226,1.1061990701589601,51.88869830378945,9977.200000000008,780,1.425017465537513,16.672374873511302,21,9.5,63.1,92.6,4.5,2,False,90,35,0.1 +151,-inf,-69739.09999999989,6514,0.5983057661779955,720.5651115456745,-32776.80000000002,2460,0.6052932952316269,352.35700000000014,14,68.5,47.3,85.8,29.3,4,True,150,90,0.1 +152,-inf,-24994.199999999786,5362,0.7354778009082635,295.05414659393796,-4488.900000000015,1941,0.8904232310854402,90.9140000000001,12,7.4,59.8,94.8,2.4,2,True,150,41,0.1 +159,-inf,-12365.39999999975,1443,0.8905991768440517,118.20521415672589,-16867.70000000001,406,0.7090652251904181,156.23682423982578,18,65.1,55.0,81.7,18.9,8,False,150,35,0.1 +160,-inf,-24083.69999999995,5067,0.7830432162325084,251.88163748743327,-6829.4000000000015,1780,0.8597762793715453,81.81503227453413,14,68.6,38.2,88.6,58.0,6,True,55,35,0.1 +162,-inf,10270.30000000049,2550,1.1726179171155666,43.21295463307857,12821.8,873,1.4749782363073949,17.46298187844201,21,18.3,61.6,89.8,13.3,2,False,90,70,0.1 +163,-inf,-9284.799999999526,4210,0.9404662519412195,147.78225006939292,-3219.9000000000015,1493,0.9584179743242393,88.67124596278946,16,64.4,57.7,79.1,20.5,1,False,40,20,0.1 +164,-inf,-8090.699999999823,1074,0.6624444583515864,85.4971203848785,-3093.600000000003,394,0.7466878469777112,35.539610045671196,21,11.6,70.2,89.9,6.6,4,True,120,35,0.1 +165,-inf,-16312.299999999646,4462,0.8148090963481353,186.31143321056206,-6590.200000000006,1642,0.8397948269155955,90.05988023952101,21,81.2,47.2,75.3,58.9,2,True,90,90,0.1 +168,-inf,3152.1000000002095,1228,1.0957020457484983,36.25405016791431,6126.399999999987,437,1.3955476356499055,22.101454999289217,16,4.0,70.8,88.9,-1.0,4,False,90,70,0.1 +169,-inf,-19641.999999999745,4740,0.8104385237714286,207.40302602540598,-11654.400000000005,1731,0.7728151706069489,127.98283176520853,18,75.2,45.2,90.6,55.6,3,True,55,70,0.1 +170,-inf,5593.10000000043,2395,1.0362682440336477,45.15889267002217,5751.00000000002,822,1.081679086830365,35.2020981438848,14,74.7,38.3,72.2,59.9,6,False,40,70,0.1 +171,-inf,203.70000000015716,918,1.0099352768171996,25.783139725862302,2425.9000000000124,339,1.2323525467884986,11.450743286307306,18,8.2,72.2,89.9,3.2,2,False,120,90,0.1 +177,-inf,-62876.09999999995,6195,0.6256213980645215,644.9548515839349,-19699.799999999974,2329,0.7315565923965689,214.41799999999986,10,17.6,55.8,88.0,12.6,12,True,150,41,0.1 +181,-inf,-48080.39999999997,3321,0.5138532471865813,478.4826093002001,-18605.000000000015,1182,0.5799448204859586,186.20775744986832,16,72.9,39.0,78.0,18.3,6,True,150,20,0.1 +189,-inf,-71428.49999999983,6863,0.5822589370568039,709.6516474791556,-30322.300000000043,2517,0.6186281969852296,303.2230000000004,10,80.5,45.3,86.9,48.6,3,True,150,70,0.1 +190,-inf,-9623.599999999513,9215,0.9411267741771684,131.78974709771597,-643.7000000000389,3295,0.9917233274358124,49.686702048855565,10,71.2,56.6,77.1,60.4,1,False,40,90,0.1 +193,-inf,22369.000000000455,3583,1.1622957789602473,30.974145576096024,14260.60000000002,1276,1.2054430020500215,47.3400234588817,14,71.5,53.6,81.1,30.0,3,False,71,20,0.1 +195,-inf,843.7000000004045,2413,1.0060473524107707,38.633104170459845,-4263.999999999979,868,0.940345447982742,54.465439082119694,12,73.7,57.5,76.9,35.0,12,False,90,41,0.1 +196,-inf,-1172.8999999989737,6187,0.9946046996015053,59.20959254448401,-533.0000000000018,2191,0.994793838952829,46.11059856961499,10,68.4,43.4,75.1,58.5,3,False,55,70,0.1 +197,-inf,-2530.199999999786,1176,0.8833423240245097,31.22611671505469,186.59999999999673,421,1.0175664862320544,15.262726286737122,18,21.6,72.7,92.7,16.6,1,False,120,70,0.1 +200,-inf,-1891.299999999912,503,0.8304846241406819,22.237311152604853,117.60000000000582,195,1.0208592003973178,9.061962213448936,18,14.4,75.3,97.4,9.4,2,False,55,35,0.1 +206,-inf,-54364.699999999844,6398,0.6627554394283975,554.4679790680273,-20184.79999999999,2430,0.731675380490341,214.1459999999999,10,80.4,52.1,73.8,32.0,8,True,120,55,0.1 +207,-inf,-2105.0999999993555,4581,0.9752230992135328,77.00050879415141,3157.9000000000196,1645,1.0834994738150252,24.340967480731386,14,19.3,61.6,88.3,14.3,3,True,40,70,0.1 +209,-inf,9048.500000000717,4224,1.1042033742154695,62.39221305567636,14042.299999999967,1515,1.3590517880611825,29.89001761920511,21,4.1,57.2,95.5,-0.9,1,False,90,41,0.1 +210,-inf,4448.900000000573,3167,1.076721707264497,61.606486357579485,9962.299999999981,1123,1.378696762814178,17.707293486398843,21,11.0,61.7,90.3,6.0,1,False,90,90,0.1 +212,-inf,-17441.199999999826,1082,0.8526044289997733,162.5715459594222,-20492.29999999999,337,0.6471541327749961,207.3967304372971,14,80.5,45.7,72.4,21.3,12,False,55,55,0.1 +216,-inf,-671.0999999997566,1426,0.9689765162721891,42.34009422662058,2417.899999999994,489,1.2492243627405495,18.51245898324403,12,17.6,77.2,91.0,17.3,1,True,90,41,0.1 +219,-inf,-33077.09999999991,6900,0.8121409180231044,351.59779104535573,-14525.200000000004,2477,0.8214287470556113,171.14142490008504,10,64.8,41.6,87.4,49.3,12,True,40,70,0.1 +220,-inf,5708.500000000435,2832,1.0307872109434968,48.06522672799422,2637.3000000000084,978,1.0302949197166817,61.05450257818133,12,77.2,41.5,74.7,47.5,6,False,71,35,0.1 +223,-inf,-48571.499999999876,4485,0.5839543417482119,500.74033588392996,-18901.000000000025,1603,0.642523461702861,206.56000000000017,18,69.3,41.3,79.4,44.2,4,True,120,20,0.1 +225,-inf,14572.00000000095,5736,1.0768313348679952,35.42992587190073,7901.099999999991,2041,1.082637289539574,57.15362414750277,10,81.1,47.9,82.3,41.3,2,False,40,35,0.1 +226,-inf,-20953.59999999985,5047,0.8060970384676264,220.93863528668254,-8593.000000000018,1825,0.8258753346018325,99.03700526145323,21,65.4,44.2,83.1,60.0,8,True,55,41,0.1 +227,-inf,-12921.299999999484,4514,0.8603144985881505,165.63272959386708,-3715.900000000006,1631,0.9146829223492678,73.77036074747681,10,14.8,67.0,92.3,9.8,8,True,55,20,0.1 +228,-inf,-24335.49999999986,3429,0.6786179336356702,247.49621091257018,-11975.29999999998,1239,0.6734982659716016,124.3189999999998,12,12.4,67.2,95.7,9.6,6,True,120,35,0.1 +231,-inf,3990.9000000005362,3089,1.0556411439693154,38.534431434803224,7596.400000000009,1039,1.2363681623000806,19.899693249501496,10,21.7,72.9,97.8,16.7,3,False,120,35,0.1 +235,-inf,7983.6000000010135,6034,1.0715309684402183,71.25826328436197,14497.200000000023,2140,1.2873834137831914,27.554863767519883,12,4.2,58.2,85.6,-0.8,1,False,40,70,0.1 +236,-inf,4821.500000000891,5295,1.0421682795534357,62.14369477095224,7313.70000000003,1875,1.131996231618312,38.56820681042988,16,80.4,56.0,73.7,44.0,1,False,120,35,0.1 +239,-inf,12639.60000000101,6155,1.0678510193542619,41.54603556113668,10207.500000000004,2209,1.1128439210761365,48.94279954013033,16,62.6,44.7,75.8,42.0,1,False,71,35,0.1 +240,-inf,11696.600000000824,5938,1.0671480148549315,52.22479468306646,8501.899999999969,2094,1.0986056793456835,64.00022584993697,14,66.8,49.1,81.8,30.5,1,False,40,35,0.1 +242,-inf,-1666.6999999998316,911,0.922928593228333,33.27802960724362,1216.300000000012,327,1.119228733311114,15.067141296302792,21,21.3,71.2,87.2,21.2,2,False,120,70,0.1 +244,-inf,-7059.399999999361,4354,0.9674575252340878,82.0655753702,-12472.799999999994,1529,0.8867881371162608,122.51479559318939,10,76.1,46.3,74.1,36.1,4,False,90,70,0.1 +246,-inf,-10575.299999999736,2056,0.7740624659500968,140.36939840545747,-1945.6000000000022,776,0.9144294711656876,54.203506668664794,21,10.4,65.7,93.3,5.4,12,True,90,55,0.1 +248,-inf,2372.4000000014257,8327,1.0112207933730961,79.99656873957441,4523.200000000039,2951,1.0448648262618705,59.555926837847196,10,74.2,42.9,78.5,60.8,1,False,40,41,0.1 +250,-inf,25741.200000000666,4269,1.1901817872856055,28.229003564645993,15087.100000000017,1543,1.2257105113946607,50.741419963322045,21,69.8,45.2,83.9,33.4,1,False,120,35,0.1 +252,-inf,-31235.29999999954,6189,0.7476989411292434,325.44326417154315,-12317.300000000014,2264,0.7947858857713129,137.15293771745002,14,80.0,49.7,85.8,50.8,3,True,71,20,0.1 +254,-inf,-7796.899999999493,4438,0.9139151815731782,131.338272978283,1029.7999999999884,1591,1.026631427049335,43.28500000000019,18,18.7,57.4,97.5,13.7,6,True,40,41,0.1 +255,-inf,-50701.39999999991,3688,0.5277387601202684,503.9360076219198,-24940.80000000001,1297,0.5061257061839236,249.40800000000013,21,74.6,52.5,85.8,18.5,8,True,120,20,0.1 +256,-inf,-24129.79999999975,3489,0.7545681920588485,256.12905143626944,-8763.500000000015,1232,0.8016769258622245,103.88863987250376,18,70.0,40.0,72.3,19.3,6,True,71,90,0.1 +257,-inf,-39642.09999999996,3272,0.5690214129782486,396.5120903595286,-14948.50000000001,1176,0.6256960998377442,151.15253797739817,18,72.3,40.9,76.0,44.5,12,True,120,20,0.1 +259,-inf,1221.4000000003143,2046,1.0077362847844635,37.6102635689825,-1338.3000000000065,717,0.9830407526291712,45.32193723065095,10,68.5,52.3,79.1,25.5,12,False,120,20,0.1 +261,-inf,-19630.099999999744,5011,0.7954946545512919,234.44884822838497,-2959.900000000007,1833,0.930631787651102,68.64900000000013,16,8.0,56.1,93.2,3.0,3,True,90,70,0.1 +262,-inf,-3343.6999999999116,444,0.6956676071721131,35.36333547399034,-1778.699999999999,158,0.6632971775796466,19.624852528577243,18,20.0,77.5,85.9,15.0,2,False,90,41,0.1 +263,-inf,-11898.499999999603,5721,0.8824385515789325,149.1437421199417,-1365.300000000003,2081,0.9702916652160283,45.05786490316492,16,16.8,52.6,97.2,8.5,2,True,40,41,0.1 +266,-inf,21187.300000000683,3967,1.1308559153917046,30.418098031000458,10578.89999999999,1388,1.1330528619401579,54.75055800205105,12,63.9,43.4,88.7,23.6,2,False,71,41,0.1 +267,-inf,1705.3000000005031,2695,1.029246014323735,59.08214804637302,6973.900000000049,943,1.2581233783778785,22.20185028151454,12,11.3,68.4,93.1,6.3,2,False,90,90,0.1 +269,-inf,15904.700000001016,5709,1.1400372265678675,37.609785183630194,16574.19999999998,1989,1.322501683121695,25.852122689416955,16,19.7,55.2,92.2,14.7,1,False,150,90,0.1 +270,-inf,-14212.899999999854,3671,0.9260978034571471,142.87224215724405,-12945.700000000015,1236,0.8637086713235183,128.4184895417533,14,68.2,45.8,73.7,25.8,2,False,150,20,0.1 +271,-inf,-70.99999999945976,3128,0.9989080585280643,69.00500861163921,6752.399999999976,1076,1.2374128037803793,22.197779463485297,10,20.4,72.9,95.6,13.8,2,False,71,35,0.1 +273,-inf,-3549.8999999998896,644,0.7555636654088744,46.61699999999889,-720.4999999999891,258,0.908010316122772,18.74067294108276,21,10.6,72.8,94.7,5.6,8,True,90,35,0.1 +274,-inf,-9376.599999999893,1761,0.9252214065546704,106.6413516183236,-13031.4,617,0.81075790360291,139.29654640816395,18,70.0,56.1,74.0,30.8,8,False,55,90,0.1 +275,-inf,-27822.999999999938,6279,0.7429943015916577,304.76479303178746,-6661.00000000003,2265,0.8665154335893742,94.31400000000029,21,70.1,50.2,80.6,51.3,1,True,120,41,0.1 +277,-inf,-5467.599999999874,799,0.6971412428752638,75.64999999999874,23.200000000006185,318,1.002679881253537,23.063183746371873,18,4.0,73.7,95.9,-1.0,6,True,150,20,0.1 +278,-inf,4705.8000000004795,3596,1.023772429679922,68.73207684784322,5803.900000000005,1267,1.0630372212748862,58.564513522020626,10,75.6,38.7,78.4,52.2,4,False,150,90,0.1 +280,-inf,3135.5000000002856,1619,1.076160195094462,38.051794603596996,6295.099999999982,547,1.3391135244621137,24.167488610211034,12,16.4,73.8,93.8,11.4,4,False,150,70,0.1 +282,-inf,-13174.199999999662,5354,0.8725588828225089,169.12686975102778,-2047.2000000000335,1885,0.9560630124050301,58.29576239840889,14,18.1,58.1,88.6,13.1,4,True,40,35,0.1 +283,-inf,10659.700000000521,3732,1.0600334755179313,35.26133318033719,7502.499999999942,1325,1.0866361501100497,28.325755353476385,10,64.7,51.7,81.7,39.2,6,False,150,55,0.1 +284,-inf,7703.900000000405,2272,1.1392352444691054,41.205406179853505,10598.800000000007,778,1.4186617896262814,9.097926059513062,12,15.5,70.1,86.9,10.5,3,False,150,20,0.1 +286,-inf,-7813.199999999169,5701,0.9642148865558964,94.81040988308041,-5044.90000000002,2007,0.9511049340896973,70.01090320765353,10,62.2,47.7,72.9,57.4,8,False,71,55,0.1 +287,-inf,-1577.9999999991524,7586,0.9926356695870444,112.21747280101499,3829.1999999999935,2681,1.03685629970143,63.78279914993288,10,65.2,46.9,83.4,30.7,1,False,90,55,0.1 +288,-inf,-659.8999999999123,471,0.9502157643792627,17.293093509715778,618.1000000000022,174,1.0965328752147427,12.980610358409168,16,16.9,77.5,92.9,9.5,4,False,55,70,0.1 +292,-inf,-3399.199999999898,584,0.7759985238782472,45.94899999999901,615.6000000000058,229,1.0969784807334821,8.25260307410656,21,20.6,73.8,88.5,6.9,12,True,150,55,0.1 +294,-inf,-45480.7999999999,7148,0.7241534912043645,466.7812834436546,-22947.100000000013,2629,0.7214447856856724,244.80400000000012,16,65.3,46.9,91.4,21.9,4,True,55,35,0.1 +295,-inf,10275.900000000987,7123,1.0739597420740448,40.789216796429244,11763.799999999974,2550,1.1773657333347423,32.61884372444624,14,62.1,54.8,89.1,52.6,1,False,150,20,0.1 +296,-inf,12038.500000000517,2637,1.1956763785606872,35.08832972211972,13379.10000000002,908,1.4702638294282646,13.614843074558411,21,11.6,60.8,91.1,6.6,2,False,90,41,0.1 +297,-inf,597.6000000002241,1267,1.0167715826076211,47.27132594883387,3465.3999999999924,445,1.2041352497643727,34.36772505819965,18,18.5,69.6,92.9,13.5,4,False,90,70,0.1 +300,-inf,-42360.899999999754,4709,0.6785983361216393,421.8513454603073,-18091.50000000001,1711,0.7039887037449108,178.1390880903922,21,62.6,41.8,85.6,37.7,6,True,71,70,0.1 +301,-inf,-54394.79999999992,8227,0.6943530256605073,563.7181498619739,-23530.599999999995,3050,0.7252670784247313,258.34999999999985,12,70.3,48.6,83.3,35.4,2,True,120,90,0.1 +303,-inf,-10734.199999999706,4960,0.9028877113718076,160.03076159761554,-1373.3999999999778,1832,0.9728685386466275,66.88799999999982,16,14.3,54.9,92.2,9.3,8,True,40,55,0.1 +307,-inf,-19056.99999999973,3714,0.8858257904184034,202.5310080581423,-16146.40000000001,1250,0.8099618662021557,172.15028533356522,14,63.8,57.8,76.0,23.0,2,False,71,90,0.1 +308,-inf,-40158.99999999983,4463,0.6501932869583988,431.2868457095201,-13632.400000000007,1718,0.7381144486195307,168.5320000000001,18,78.1,52.7,72.2,29.2,8,True,120,41,0.1 +309,-inf,-20342.29999999944,9756,0.9072832740891532,202.0655284713257,-13341.100000000017,3487,0.8776394991887617,133.3011063490483,10,62.9,50.1,74.0,42.1,1,False,150,35,0.1 +310,-inf,-6063.599999999481,5235,0.9353927196941649,109.55036563344356,756.6999999999753,1868,1.017040605147538,41.44787432714513,10,7.5,63.6,96.7,2.5,4,True,40,20,0.1 +312,-inf,-32627.199999999873,887,0.7035184646699616,314.80360102118175,-29776.5,277,0.47973651794840444,311.289,16,77.2,43.4,80.9,19.1,6,False,90,20,0.1 +314,-inf,-26982.799999999927,3719,0.6785967403228707,275.0997128270572,-10287.899999999981,1312,0.731897427878978,108.65499999999982,12,19.7,67.9,86.1,14.7,6,True,120,20,0.1 +315,-inf,-1951.4999999996062,2307,0.9501953648384126,52.96162747960792,3017.7999999999756,789,1.167387735179269,19.479775980087354,14,18.7,70.9,89.6,13.7,1,False,71,70,0.1 +318,-inf,-42989.99999999992,5833,0.7176258236734528,473.0592340020604,-18519.50000000002,2086,0.7390899459569119,231.6670000000002,14,63.9,42.0,80.5,43.2,12,True,55,35,0.1 +321,-inf,1011.1000000001641,980,1.0518587284328014,19.294096604627267,2647.3000000000047,364,1.2671557744318405,13.334399090553756,14,7.7,75.1,94.4,2.7,2,False,120,20,0.1 +322,-inf,15214.800000000942,5584,1.1149744581809413,44.08895133079015,15581.199999999968,1953,1.25409695710528,39.62424402173133,10,17.0,58.6,93.0,12.0,2,False,120,20,0.1 +325,-inf,-1943.8999999997277,1590,0.9401206274103925,52.101860141248665,1945.200000000008,582,1.1253625149839528,22.198287420225654,12,12.1,75.2,89.0,7.1,8,True,40,35,0.1 +326,-inf,-71976.79999999993,7975,0.627954002360154,742.8418707350447,-32424.699999999983,3009,0.6586345466087892,347.89300000000003,12,63.6,54.2,89.5,33.0,3,True,120,90,0.1 +327,-inf,-7294.099999999795,2124,0.9340008559683894,89.72189682849448,-9057.5,731,0.8482187593737373,102.83441074092492,21,74.8,56.5,76.2,32.4,4,False,90,70,0.1 +328,-inf,-11198.099999999886,644,0.9015071089630552,122.35103626942913,-15069.600000000002,211,0.7327900333533702,163.2968837792281,14,68.8,39.1,80.3,20.0,12,False,90,70,0.1 +329,-inf,-1735.9999999997162,1639,0.9361229265708008,44.96311307663617,2404.0000000000036,568,1.188482496373828,11.613551663716589,14,20.9,74.7,85.4,20.2,1,False,90,70,0.1 +330,-inf,-18281.299999999632,3393,0.9099679295869262,182.61287408460473,-15933.299999999988,1186,0.842503254555142,158.7535027175445,10,78.7,41.1,72.4,27.3,3,False,71,55,0.1 +333,-inf,-24744.799999999843,4967,0.7240994833164973,295.42882193527623,-5244.499999999998,1810,0.8666224151655484,101.14499999999997,14,13.5,59.1,88.5,8.5,2,True,150,35,0.1 +334,-inf,2148.70000000027,1525,1.0450861036096988,43.36692143915244,5898.800000000007,502,1.293614331294206,16.35504529834423,12,21.6,76.4,93.7,10.2,6,False,55,41,0.1 +335,-inf,13459.000000000538,3187,1.0716689182461014,36.10245716295538,9908.200000000012,1115,1.1148775479680608,46.4656426839126,12,69.3,41.0,75.5,50.5,6,False,40,41,0.1 +340,-inf,5007.400000000436,3070,1.0688754948268397,62.66720914539315,10814.500000000015,1020,1.3471392986916273,21.535674816737817,10,20.8,72.0,98.4,11.0,3,False,40,55,0.1 +341,-inf,-25458.299999999734,7792,0.8575525149311274,271.4651579480353,-8264.00000000001,2867,0.8978206519991981,103.75465021322935,10,67.0,44.4,84.2,60.1,12,True,55,90,0.1 +345,-inf,19421.60000000025,1651,1.1255439574504387,38.820390471332885,11577.399999999998,570,1.1589509626381347,35.08494365291552,10,75.8,38.8,82.1,28.2,8,False,40,20,0.1 +346,-inf,-14418.599999999782,7626,0.8829015619784604,176.63726143472118,-1198.3000000000102,2743,0.9791917732575299,47.94400286971142,16,68.3,55.6,74.4,39.4,1,True,55,35,0.1 +347,-inf,-7545.699999999473,4746,0.9514484645432955,95.20276084120076,-5689.499999999994,1624,0.9283240591548556,81.11180045178321,16,65.0,52.8,82.0,22.9,1,False,71,35,0.1 +348,-inf,-13071.999999999462,5666,0.866614558727043,149.08382027598938,-5369.600000000017,1997,0.8844064031137245,72.48199462585798,14,81.4,42.5,73.4,49.0,1,True,40,35,0.1 +351,-inf,-6082.7999999993135,4809,0.9708565383539239,92.74250594838304,-3140.0000000000045,1655,0.9693720390126077,70.42459968466002,10,69.7,45.7,80.2,24.3,2,False,120,70,0.1 +352,-inf,-65705.89999999962,11351,0.6749495153373434,698.9354934897093,-23258.100000000006,4200,0.7563515110373608,277.63493836518126,10,67.1,50.2,79.5,28.6,1,True,120,20,0.1 +357,-inf,59.30000000015207,804,1.0035502816876123,18.019528263042933,1178.9000000000106,301,1.1318001922947918,10.880006015207094,14,6.6,76.1,92.4,1.6,2,False,150,35,0.1 +359,-inf,-37024.899999999936,3445,0.6367764695264213,391.89006106611595,-13474.000000000011,1243,0.6978307233090159,157.4990000000001,14,78.4,40.5,75.1,29.1,8,True,120,70,0.1 +360,-inf,-24983.39999999991,3472,0.667308522028157,266.0589999999992,-8591.90000000002,1254,0.7522241543887582,102.11510762977744,21,15.9,59.2,89.1,10.9,4,True,150,35,0.1 +361,-inf,-45526.499999999745,7340,0.743340461120672,456.6039231226444,-18162.100000000006,2737,0.7878214728814391,185.6354797102888,14,65.0,51.6,79.3,40.9,6,True,71,55,0.1 +363,-inf,-21934.39999999961,4779,0.8135421333199586,245.77373340866586,-4777.600000000004,1801,0.9096995150053484,75.49000000000004,16,19.0,54.4,93.9,14.0,12,True,71,70,0.1 +364,-inf,-29266.499999999793,1484,0.7057404072669798,301.7360327382967,-24900.299999999996,418,0.5191256302951066,261.9049999999999,16,80.4,52.3,79.5,19.8,4,False,150,70,0.1 +365,-inf,-23897.299999999675,4818,0.7637974200601149,260.85899915686815,-7448.20000000003,1756,0.8349301330851158,97.6896277125227,21,69.0,45.7,83.6,58.7,6,True,71,20,0.1 +369,-inf,-29879.2999999999,2132,0.8408120056558888,304.1710727294075,-22667.999999999993,700,0.7585165836083594,220.66110585300686,10,77.4,40.4,76.4,21.4,4,False,40,35,0.1 +370,-inf,-50957.69999999981,5525,0.65993944566827,514.6169024977918,-23787.10000000003,2077,0.6778596656590946,246.05855069572615,21,63.1,51.6,86.2,39.2,8,True,90,70,0.1 +371,-inf,-39518.59999999984,7297,0.706508072427939,424.11830379393353,-13777.800000000008,2670,0.7783882813341919,167.7410000000001,10,11.3,53.3,93.8,6.3,2,True,120,41,0.1 +373,-inf,-14025.199999999777,3446,0.7717438359508495,159.92823324196135,-2914.9000000000187,1219,0.8915773342359574,49.49625035911374,10,19.6,72.9,97.0,17.1,2,True,120,90,0.1 +375,-inf,-2872.7999999992417,4463,0.9855099364470884,83.11839282230822,-1063.3999999999833,1553,0.9883006707806119,63.866860676609484,10,76.6,38.2,73.4,59.9,3,False,55,55,0.1 +376,-inf,-1256.1999999998188,1134,0.9508559714571865,43.405836470176006,2246.2000000000007,402,1.1845413168142755,17.89656051851656,16,16.8,72.9,93.3,11.8,2,False,55,20,0.1 +379,-inf,-32475.99999999985,7126,0.811886986224007,326.59687407844115,-16823.200000000004,2674,0.8017174929223556,172.13653381171522,10,76.3,48.3,81.3,26.9,4,True,55,90,0.1 +380,-inf,10423.900000001253,7348,1.05587607656554,60.836434792611925,9868.699999999964,2610,1.1090830511022485,59.3671553256687,12,76.1,46.8,80.5,56.2,1,False,55,55,0.1 +381,-inf,-15929.199999999742,2913,0.7133984411546682,170.3659999999974,-4227.300000000013,1057,0.8331386031530502,53.622943486256894,14,8.2,67.1,89.5,3.2,3,True,120,35,0.1 +382,-inf,-2532.3999999999687,208,0.6535372744312044,25.33669276223011,-1624.300000000003,87,0.6060297363506271,21.09041575987111,21,18.4,77.5,90.5,5.7,3,False,55,90,0.1 +383,-inf,695.1000000008444,5212,1.0077198336754034,75.72627951676795,7084.899999999994,1849,1.1659188309407258,30.729812446048943,10,5.7,64.1,95.2,0.7,1,False,71,20,0.1 +384,-inf,3152.500000000271,1680,1.0212611271061336,61.092047337673584,-7380.300000000005,576,0.9038590302401859,109.24301834834927,10,66.2,51.1,82.5,21.2,12,False,90,20,0.1 +385,-inf,-4369.399999999308,4212,0.9442577609720129,109.29536429126645,2789.0000000000364,1541,1.078208029432465,38.17835229641977,16,9.0,59.9,93.2,4.0,3,True,55,70,0.1 +388,-inf,8311.200000001394,8391,1.0437902208584164,66.27801291442186,7209.899999999987,3055,1.0751822229637413,68.05467286248414,10,63.9,49.0,87.8,44.2,1,False,120,70,0.1 +391,-inf,10523.700000000175,2405,1.0655158524369626,35.90005678591591,-2010.1000000000022,813,0.9747952371637658,56.46827194041869,12,64.3,47.9,82.7,23.2,6,False,120,20,0.1 +392,-inf,-40336.59999999977,5308,0.6943379555290181,419.6333071077847,-13387.700000000004,2000,0.7801026911250672,151.45800000000003,12,10.6,57.1,90.7,5.6,8,True,120,70,0.1 +397,-inf,-72455.29999999983,7936,0.5852482832996366,732.4639091324273,-32159.199999999983,2967,0.6199080476072283,334.044,12,62.2,56.8,80.2,35.9,2,True,150,70,0.1 +398,-inf,-45451.19999999994,6694,0.727189568532734,473.09499549901386,-18002.20000000002,2416,0.7658707244114974,200.90816166063865,14,65.0,44.9,74.8,26.7,8,True,40,20,0.1 +401,-inf,-934.6999999999534,269,0.9004536934480701,18.77298592940905,-414.9999999999891,104,0.9248501530159536,17.92092783595183,21,18.9,76.4,97.7,13.9,6,False,55,55,0.1 +402,-inf,-1378.9999999999618,225,0.8497182899052971,30.030382720146946,-2622.599999999996,90,0.5841169661121774,33.58492361871219,21,15.5,76.4,92.2,10.5,8,False,40,20,0.1 +403,-inf,-28376.899999999954,3871,0.7280929452629064,308.71570050455597,-12760.700000000015,1375,0.7369443098774467,154.98148000637264,16,77.7,43.0,88.8,28.2,6,True,55,55,0.1 +406,-inf,1138.1000000001204,746,1.058365599117925,28.22864862748093,3399.7999999999975,275,1.3586097779652981,15.675160555210335,14,14.9,76.7,97.3,9.9,4,False,55,41,0.1 +410,-inf,-4056.2999999993235,5792,0.9542781589528052,100.74605309028664,2095.6999999999953,2071,1.051137084573714,41.772940240876245,18,72.1,57.8,75.8,54.5,1,True,40,35,0.1 +412,-inf,-2033.4999999998508,877,0.9138037004853445,46.42958553230543,1110.9999999999982,306,1.1019949140249898,23.08028819112758,16,20.7,75.2,94.3,7.9,3,False,71,41,0.1 +413,-inf,-5374.699999999813,1177,0.7792196055717807,62.93742578604237,-1161.8000000000065,429,0.9011175133837761,23.38796969228392,21,16.8,69.8,98.1,11.8,4,True,90,41,0.1 +415,-inf,-2844.199999999825,2169,0.9823732141274574,69.0537843935116,-10784.800000000012,718,0.8689327880706571,117.78239889093297,14,77.0,38.7,78.5,24.0,2,False,55,70,0.1 +417,-inf,1989.8000000003722,2142,1.0155314434063951,48.18957174253928,-7334.09999999999,706,0.8869861747175471,86.50399538388899,21,62.5,49.0,80.2,21.7,4,False,90,90,0.1 +418,-inf,-7843.699999999508,3956,0.8913197999786622,114.44309056769113,-1347.400000000005,1387,0.9596197531752161,49.987125908613955,18,20.3,60.4,96.7,15.3,3,True,55,35,0.1 +422,-inf,-1946.9999999998427,1582,0.9832493506649933,61.33604503854468,-5818.800000000012,550,0.9012138600750383,78.63140799219286,16,74.7,53.6,78.3,24.7,8,False,120,90,0.1 +423,-inf,2792.4000000005635,3019,1.0501025411914142,65.06809057490494,8792.400000000016,1064,1.3477786216062269,18.798346761872562,21,5.4,62.2,95.0,0.4,1,False,71,55,0.1 +429,-inf,-22796.499999999796,5064,0.817583636340362,234.28217330953598,-8196.100000000002,1909,0.8628843782779111,89.60841003854931,21,67.5,54.9,87.8,54.9,12,True,55,70,0.1 +432,-inf,-73177.89999999982,8344,0.6283129250042172,746.6674622590824,-25859.900000000016,3064,0.7027789015879441,277.0700000000001,10,68.2,45.2,83.4,57.1,8,True,120,20,0.1 +433,-inf,10179.000000000826,4807,1.1101002573224446,56.06371466908628,13917.199999999986,1687,1.336197546133796,29.087577556261678,18,21.2,57.7,91.4,16.2,1,False,90,70,0.1 +434,-inf,-17643.29999999984,2374,0.7184734027869761,178.04457468652032,-6490.300000000016,863,0.7738595066950521,67.01113824527978,21,78.1,38.8,88.5,22.9,3,True,71,70,0.1 +436,-inf,3524.0000000004547,4184,1.0244867101924178,157.08184433015953,8678.999999999982,1458,1.1256047596374419,106.6982046890153,21,62.6,48.1,80.5,20.8,1,False,120,20,0.1 +439,-inf,5336.0000000006185,3383,1.0875328083989506,45.19737367286202,9164.600000000013,1202,1.3170297187254607,13.10824001414197,18,7.4,62.5,89.0,2.4,1,False,90,35,0.1 +441,-inf,-25944.89999999996,236,0.5902127679737682,219.31143885484184,-28335.9,72,0.2636812946948278,283.359,21,76.4,39.3,76.1,18.6,8,False,150,70,0.1 +443,-inf,-14009.899999999723,2591,0.7312811325785112,161.78739435496453,-3487.0000000000055,911,0.8497500861771796,56.990937397411614,12,20.2,72.9,91.4,9.2,3,True,90,55,0.1 +444,-inf,-56908.59999999979,7248,0.658586570021474,615.5221053680875,-17947.099999999984,2725,0.7633108079593162,227.53099999999998,10,80.2,53.9,81.5,54.2,6,True,120,41,0.1 +446,-inf,-4507.599999999868,867,0.7649855840167672,64.44199999999864,216.700000000008,331,1.0250775355274724,19.948760090878245,18,18.6,73.9,86.9,4.7,6,True,90,20,0.1 +447,-inf,-3843.7999999997846,1154,0.8197277954432463,43.894359803244484,-1181.7999999999956,417,0.893383613301337,23.453653489038075,18,18.9,72.4,91.5,6.2,1,False,71,41,0.1 +448,-inf,-25560.099999999795,5672,0.7854864888908305,269.7804422759709,-10644.800000000003,2061,0.8143098371408231,122.3871196315396,14,79.7,47.7,84.8,27.1,4,True,40,20,0.1 +451,-inf,-29367.799999999945,5206,0.7600820863393417,324.3974794182346,-12899.500000000013,1821,0.7698802617401299,157.5338442737101,12,71.4,40.8,90.2,44.4,12,True,55,20,0.1 +452,-inf,-2895.4999999994543,3212,0.9456495215355892,59.85230277929695,2711.8000000000047,1113,1.1184233510340984,19.699989160253086,10,18.2,73.4,93.9,13.2,2,True,40,20,0.1 +453,-inf,-2755.19999999992,420,0.7237368521322358,39.116999999999194,-725.1000000000022,167,0.8611052581170385,19.796091758708613,18,11.2,76.5,98.4,6.2,8,True,120,55,0.1 +455,-inf,-16000.299999998737,10493,0.9264521069697271,175.46050884628127,-8995.600000000011,3766,0.9155505278326708,105.78798745733945,10,65.3,48.2,74.1,52.6,1,False,40,70,0.1 +457,-inf,-42807.69999999983,4550,0.6500508888171294,425.5507263634177,-19147.100000000006,1721,0.6842793470930335,191.47100000000006,18,71.1,51.4,83.2,27.2,12,True,90,35,0.1 +459,-inf,656.3000000002103,1211,1.0221533621600454,48.64487922609579,5109.999999999987,414,1.4068600910857034,18.577737422097627,14,17.1,74.1,96.9,9.2,3,False,71,35,0.1 +460,-inf,-18748.599999999875,3143,0.7336797412452214,191.39099999999877,-5996.600000000011,1146,0.8175606194286406,64.35048596378718,21,14.4,60.7,87.7,8.0,8,True,120,35,0.1 +463,-inf,15619.900000000944,5577,1.1178005101202024,47.680626746191564,15998.899999999969,1949,1.2583855927207785,40.061190503853595,10,16.7,58.6,89.2,11.7,2,False,90,35,0.1 +466,-inf,-6429.699999999634,2386,0.8556586470790278,80.01577255574934,-79.5000000000091,877,0.9961982095719041,27.246515679442528,10,4.6,74.1,91.0,-0.4,4,True,55,35,0.1 +469,-inf,-28294.799999999716,8088,0.8694574383026915,291.19478238561476,-12073.20000000001,2868,0.8845137327187192,131.51608360880041,10,65.3,57.0,77.7,35.2,1,False,150,35,0.1 +470,-inf,-51666.69999999971,6782,0.6950345358408959,529.8960585563218,-21209.700000000033,2591,0.7423909518552131,228.2217866701159,10,74.4,51.1,86.8,24.2,8,True,90,41,0.1 +472,-inf,-21725.599999999806,1363,0.8346813375793765,211.84854731688142,-21261.700000000004,440,0.6918241363866295,209.82960169498472,16,67.5,53.4,75.6,22.4,8,False,150,35,0.1 +474,-inf,-60350.59999999994,7657,0.6436566194774734,603.7292790193221,-26805.500000000007,2859,0.6778270286122244,270.50009982032344,10,78.1,51.4,77.6,18.4,2,True,150,90,0.1 +475,-inf,-25375.2999999998,1370,0.8184851792665664,231.44143668494107,-25277.799999999996,433,0.6493796336752455,256.7902574959737,16,75.2,41.6,74.9,22.3,3,False,150,20,0.1 +476,-inf,-54908.7,6047,0.6342660402883072,550.8087138167709,-22096.500000000015,2200,0.6797065589382546,225.07600000000005,14,66.5,39.3,72.3,55.5,3,True,120,90,0.1 +482,-inf,-15074.599999999667,5946,0.8755354388699764,190.7126249478316,-4240.500000000003,2183,0.9271195150581855,82.95672692369229,16,73.3,55.4,91.2,55.7,6,True,40,35,0.1 +486,-inf,17354.800000000283,2435,1.1221582310467815,40.54964123246979,5482.500000000031,896,1.0758588340777382,34.06854237224531,14,77.5,51.3,74.8,34.0,8,False,40,41,0.1 +488,-inf,10440.000000000917,5202,1.103131992156438,47.24828767122908,13554.39999999999,1847,1.292276276379884,31.16830298533026,16,6.5,57.0,95.5,1.5,1,False,150,35,0.1 +490,-inf,12042.000000001222,7078,1.0683132880747876,53.4829095965534,9821.799999999988,2550,1.1142493552841104,52.928891098956065,14,65.8,47.4,78.2,52.5,1,False,90,35,0.1 +492,-inf,22632.200000000536,2948,1.1486118325019192,26.568680883981223,9395.599999999984,1054,1.1207193617893327,49.70104387978614,14,71.5,49.0,79.7,29.5,4,False,55,35,0.1 +499,-inf,-55011.59999999974,5511,0.6002113345983394,552.8305277661268,-29078.20000000003,2108,0.5854239259990073,293.91918203512716,16,74.5,47.4,85.4,53.2,3,True,150,90,0.1 +500,-inf,8971.50000000108,6406,1.045991583460768,61.948278447243176,8982.49999999997,2283,1.0948439522660127,58.108248673763086,10,79.8,47.3,78.5,60.7,2,False,120,55,0.1 +507,-inf,-15485.399999999758,2174,0.6504850424553213,173.65490359852197,-4692.799999999999,776,0.7648909574601328,66.16525571958303,12,18.4,73.8,86.2,16.7,3,True,150,35,0.1 +508,-inf,-1539.7999999999338,373,0.8367610889661612,19.36433310344148,-362.49999999999636,144,0.9299963308421683,11.994911980984915,18,6.1,76.3,98.6,1.1,3,False,71,41,0.1 +509,-inf,-20519.999999999804,7043,0.8026315789473728,240.84060427780645,-2824.0000000000064,2508,0.9386805460558154,64.28200000000011,10,12.6,58.7,85.8,8.3,1,True,120,20,0.1 +511,-inf,-22917.399999999885,1110,0.8243310677237637,203.2557693383728,-23582.4,348,0.6391938225497741,231.10045075914786,10,78.8,46.5,77.9,18.7,12,False,90,20,0.1 +512,-inf,-2335.199999999826,1002,0.8719055638140902,29.81631696049793,-517.799999999992,380,0.9484499133862968,18.32492133939855,18,6.7,72.6,91.3,1.7,1,False,150,55,0.1 +513,-inf,15380.800000000167,1035,1.1256514049269457,30.023090598726267,3125.000000000002,348,1.0515786363763908,53.048032639167,12,64.8,41.9,83.6,22.7,12,False,71,70,0.1 +514,-inf,-11283.699999999728,2068,0.704863190878868,133.34626325316512,-2366.7999999999975,744,0.8630648977962408,44.461301978320314,14,13.6,70.8,85.4,8.6,2,True,150,90,0.1 +515,-inf,2344.8000000004868,3800,1.0164579937924587,67.60008685299884,575.3000000000084,1349,1.007918592519387,77.82363294289001,14,74.3,56.0,76.1,31.7,2,False,55,20,0.1 +516,-inf,2926.800000000234,1293,1.0882174753067622,36.00282781212745,5860.999999999991,442,1.4002622431348974,17.187335817457388,14,17.9,73.5,95.0,12.9,4,False,71,70,0.1 +517,-inf,-19857.099999999777,4305,0.896469652210276,216.9609085737645,-17090.400000000016,1465,0.8218926253392183,185.14165073749692,12,63.1,50.2,73.8,20.2,2,False,150,35,0.1 +520,-inf,996.3000000001393,818,1.0474595809952079,23.469826323088892,2419.0999999999876,295,1.2262511573965824,17.417484388938558,21,12.6,70.5,95.8,7.6,3,False,120,20,0.1 +521,-inf,1168.5000000002856,1583,1.0338919633844974,47.384400975558336,5502.900000000032,561,1.3500461181260153,14.631042205564937,18,12.2,68.6,88.9,5.9,2,False,40,55,0.1 +522,-inf,21544.000000000986,5570,1.1639331788153044,39.33675059109381,20971.80000000005,2000,1.3405906312322577,15.569851112511133,18,62.7,51.2,89.0,47.1,1,False,55,55,0.1 +523,-inf,10240.400000000976,5828,1.0772828880936198,55.97916132888754,12335.0,2077,1.1959223997992354,32.00960438199937,18,76.3,52.7,72.6,58.0,1,False,150,20,0.1 +525,-inf,-1132.9999999999727,169,0.786024551463645,13.994451880734808,-458.40000000000146,75,0.851323300467047,13.134991442409245,21,8.4,77.3,86.6,3.4,4,False,90,35,0.1 +527,-inf,11278.200000000517,2688,1.1788577917052538,35.57354599645412,12826.60000000002,922,1.4391904153726582,16.216105035823194,21,18.6,60.8,88.5,17.0,2,False,120,41,0.1 +528,-inf,-5126.299999999528,2831,0.9180981869539935,88.3053541273421,-8.100000000016735,1003,0.9997069867384364,44.403232216187696,10,17.1,74.1,94.6,12.1,12,True,55,70,0.1 +530,-inf,3101.5000000004693,2897,1.01701353842103,48.62390145464674,17.200000000008004,1055,1.0001863056669411,60.988539863137895,10,68.0,50.4,79.9,30.5,8,False,90,90,0.1 +531,-inf,-13104.899999999754,4813,0.8530191586866852,155.90860585026033,-4412.499999999999,1763,0.8991824928256772,69.13500000000002,21,73.3,56.2,88.3,46.3,2,True,55,41,0.1 +543,-inf,-13829.0999999992,6708,0.8971599270925757,152.3779477876724,0.0,2424,0.0,0.0,12,64.9,57.1,92.0,42.7,1,False,150,70,0.1 +544,-inf,0.0,794,0.0,0.0,0.0,266,0.0,0.0,18,64.3,49.4,73.1,20.4,12,False,150,90,0.1 +545,-inf,0.0,3533,0.0,0.0,0.0,1225,0.0,0.0,10,72.2,56.7,83.2,24.3,4,False,55,70,0.1 +546,-inf,0.0,5466,0.0,0.0,0.0,1983,0.0,0.0,10,74.1,42.7,76.3,45.7,12,True,71,90,0.1 +547,-inf,0.0,3982,0.0,0.0,0.0,1427,0.0,0.0,12,18.1,66.0,88.2,13.1,12,True,55,70,0.1 +548,-inf,0.0,2010,0.0,0.0,0.0,693,0.0,0.0,16,64.2,47.2,83.9,27.5,6,False,40,55,0.1 +549,-inf,0.0,4386,0.0,0.0,0.0,1537,0.0,0.0,12,70.9,39.7,73.4,53.1,3,False,90,35,0.1 +550,-inf,0.0,4351,0.0,0.0,0.0,1578,0.0,0.0,12,82.0,44.7,87.3,28.8,12,True,90,41,0.1 +551,-inf,0.0,7591,0.0,0.0,0.0,2678,0.0,0.0,14,68.1,41.2,76.4,21.7,1,True,120,41,0.1 +552,-inf,0.0,1992,0.0,0.0,0.0,696,0.0,0.0,16,12.6,63.4,98.6,7.6,6,False,55,55,0.1 +553,-inf,0.0,5714,0.0,0.0,0.0,2010,0.0,0.0,16,64.9,41.4,73.5,48.9,1,False,71,90,0.1 +554,-inf,0.0,1037,0.0,0.0,0.0,367,0.0,0.0,18,10.3,70.0,90.5,5.3,6,False,40,20,0.1 +555,-inf,0.0,1819,0.0,0.0,0.0,651,0.0,0.0,16,76.6,45.1,84.6,58.5,6,False,71,35,0.1 +556,-inf,0.0,1657,0.0,0.0,0.0,583,0.0,0.0,16,75.3,52.7,91.0,24.4,12,False,71,70,0.1 +557,-inf,0.0,6667,0.0,0.0,0.0,2387,0.0,0.0,14,66.4,54.0,75.1,42.3,1,False,55,20,0.1 +558,-inf,0.0,4246,0.0,0.0,0.0,1593,0.0,0.0,18,78.1,46.8,77.5,40.9,6,True,71,90,0.1 +559,-inf,0.0,4123,0.0,0.0,0.0,1470,0.0,0.0,10,64.3,43.1,84.2,42.9,3,False,90,20,0.1 +560,-inf,0.0,2535,0.0,0.0,0.0,873,0.0,0.0,12,20.4,66.0,88.9,15.4,8,False,90,20,0.1 +561,-inf,0.0,1551,0.0,0.0,0.0,570,0.0,0.0,16,7.8,71.2,87.0,2.8,3,True,40,90,0.1 +562,-inf,0.0,2873,0.0,0.0,0.0,1013,0.0,0.0,12,80.1,40.1,74.9,42.2,4,False,55,20,0.1 +563,-inf,0.0,3679,0.0,0.0,0.0,1342,0.0,0.0,18,79.2,45.7,73.9,56.4,2,False,71,20,0.1 +564,-inf,0.0,5642,0.0,0.0,0.0,2065,0.0,0.0,16,6.9,53.0,89.6,1.9,2,True,40,35,0.1 +565,-inf,0.0,713,0.0,0.0,0.0,263,0.0,0.0,14,10.4,76.5,87.8,10.2,4,False,90,41,0.1 +566,-inf,0.0,5281,0.0,0.0,0.0,1984,0.0,0.0,12,12.7,52.6,94.4,7.7,12,True,71,90,0.1 +567,-inf,0.0,4425,0.0,0.0,0.0,1533,0.0,0.0,18,63.2,48.6,85.6,19.5,1,False,90,55,0.1 +568,-inf,0.0,1825,0.0,0.0,0.0,658,0.0,0.0,18,74.0,44.7,79.9,59.5,6,False,55,55,0.1 +569,-inf,0.0,1566,0.0,0.0,0.0,574,0.0,0.0,18,10.9,70.0,85.1,5.9,1,False,71,55,0.1 +570,-inf,0.0,1695,0.0,0.0,0.0,604,0.0,0.0,18,65.8,45.6,85.3,32.7,6,False,55,41,0.1 +571,-inf,0.0,4743,0.0,0.0,0.0,1700,0.0,0.0,10,65.8,57.9,76.2,47.2,6,False,150,41,0.1 +572,-inf,0.0,3239,0.0,0.0,0.0,1154,0.0,0.0,16,17.6,58.8,93.6,12.1,3,False,40,55,0.1 +573,-inf,0.0,1190,0.0,0.0,0.0,401,0.0,0.0,18,77.1,41.0,87.2,43.2,6,False,90,90,0.1 +574,-inf,0.0,6893,0.0,0.0,0.0,2615,0.0,0.0,16,63.7,53.5,74.1,30.2,4,True,150,41,0.1 +575,-inf,0.0,3003,0.0,0.0,0.0,1068,0.0,0.0,10,12.1,61.6,85.5,7.1,8,False,71,41,0.1 +576,-inf,0.0,1214,0.0,0.0,0.0,432,0.0,0.0,21,66.1,48.2,82.0,41.2,12,False,150,41,0.1 +577,-inf,0.0,2777,0.0,0.0,0.0,1020,0.0,0.0,21,19.5,62.4,98.3,14.5,12,True,55,90,0.1 +578,-inf,0.0,637,0.0,0.0,0.0,236,0.0,0.0,16,14.8,74.5,95.3,9.8,12,False,55,41,0.1 +579,-inf,0.0,8319,0.0,0.0,0.0,2947,0.0,0.0,10,62.7,47.6,73.7,55.5,2,False,90,70,0.1 +580,-inf,0.0,2678,0.0,0.0,0.0,936,0.0,0.0,12,16.9,71.0,89.8,11.9,8,True,40,90,0.1 +581,-inf,0.0,3697,0.0,0.0,0.0,1309,0.0,0.0,12,13.0,60.7,87.3,8.0,3,False,71,20,0.1 +582,-inf,0.0,1431,0.0,0.0,0.0,495,0.0,0.0,18,20.3,67.9,98.6,15.3,6,False,90,35,0.1 +583,-inf,0.0,1437,0.0,0.0,0.0,513,0.0,0.0,16,20.4,72.9,94.5,15.4,4,True,120,35,0.1 +584,-inf,0.0,8444,0.0,0.0,0.0,3144,0.0,0.0,12,65.2,51.7,83.1,35.8,4,True,90,55,0.1 +585,-inf,0.0,4787,0.0,0.0,0.0,1675,0.0,0.0,14,73.3,40.0,81.9,60.9,1,False,71,55,0.1 +586,-inf,0.0,2415,0.0,0.0,0.0,830,0.0,0.0,18,81.6,40.8,83.6,60.5,2,False,71,20,0.1 +587,-inf,0.0,185,0.0,0.0,0.0,76,0.0,0.0,21,12.2,76.9,91.4,7.2,8,False,71,55,0.1 +588,-inf,0.0,3814,0.0,0.0,0.0,1388,0.0,0.0,18,74.7,48.9,89.3,47.5,2,False,71,41,0.1 +589,-inf,0.0,1730,0.0,0.0,0.0,552,0.0,0.0,12,66.9,57.5,73.3,18.4,6,False,120,90,0.1 +590,-inf,0.0,906,0.0,0.0,0.0,317,0.0,0.0,21,19.1,69.4,94.6,14.1,6,False,150,90,0.1 +591,-inf,0.0,2979,0.0,0.0,0.0,1071,0.0,0.0,10,4.9,63.1,98.6,-0.1,6,False,90,41,0.1 +592,-inf,0.0,8638,0.0,0.0,0.0,3114,0.0,0.0,12,73.8,54.5,72.3,26.9,1,True,55,20,0.1 +593,-inf,0.0,2296,0.0,0.0,0.0,835,0.0,0.0,21,19.8,65.4,89.5,14.8,1,False,40,70,0.1 +594,-inf,0.0,3015,0.0,0.0,0.0,1072,0.0,0.0,14,81.6,40.2,86.9,29.9,12,True,150,20,0.1 +595,-inf,0.0,3825,0.0,0.0,0.0,1397,0.0,0.0,21,81.9,57.9,84.5,46.8,3,True,120,35,0.1 +596,-inf,0.0,4232,0.0,0.0,0.0,1521,0.0,0.0,18,20.2,58.6,87.0,12.1,12,True,40,35,0.1 +597,-inf,0.0,4741,0.0,0.0,0.0,1674,0.0,0.0,21,14.2,54.5,92.0,9.2,1,False,55,55,0.1 +598,-inf,0.0,2679,0.0,0.0,0.0,954,0.0,0.0,16,20.7,52.1,97.5,15.7,6,False,90,55,0.1 +599,-inf,0.0,3577,0.0,0.0,0.0,1269,0.0,0.0,18,17.8,57.8,94.4,12.8,2,False,40,70,0.1 +600,-inf,0.0,3123,0.0,0.0,0.0,1116,0.0,0.0,10,66.0,43.2,87.5,51.2,4,False,71,20,0.1 +601,-inf,0.0,3776,0.0,0.0,0.0,1329,0.0,0.0,10,20.9,58.4,87.2,19.6,8,False,120,55,0.1 +602,-inf,0.0,1153,0.0,0.0,0.0,401,0.0,0.0,21,73.7,48.0,91.8,50.3,12,False,40,41,0.1 +603,-inf,0.0,4960,0.0,0.0,0.0,1781,0.0,0.0,12,10.0,54.7,95.4,5.0,2,False,150,35,0.1 +604,-inf,0.0,5942,0.0,0.0,0.0,2130,0.0,0.0,16,15.9,54.4,97.6,4.2,1,True,55,55,0.1 +605,-inf,0.0,1205,0.0,0.0,0.0,409,0.0,0.0,12,16.4,77.8,89.7,11.4,1,False,90,55,0.1 +606,-inf,0.0,3934,0.0,0.0,0.0,1383,0.0,0.0,21,70.6,41.1,73.4,41.9,1,False,90,70,0.1 +607,-inf,0.0,1643,0.0,0.0,0.0,560,0.0,0.0,10,67.1,40.0,90.5,42.8,6,False,90,35,0.1 +608,-inf,0.0,4667,0.0,0.0,0.0,1662,0.0,0.0,21,12.7,55.3,94.6,7.7,1,False,150,20,0.1 +609,-inf,0.0,1543,0.0,0.0,0.0,558,0.0,0.0,21,9.8,53.4,93.2,4.8,12,False,71,55,0.1 +610,-inf,0.0,4609,0.0,0.0,0.0,1711,0.0,0.0,21,67.5,57.6,80.8,18.2,4,True,55,90,0.1 +611,-inf,0.0,7691,0.0,0.0,0.0,2727,0.0,0.0,12,75.2,43.2,74.3,53.5,1,True,55,20,0.1 +612,-inf,0.0,986,0.0,0.0,0.0,347,0.0,0.0,18,63.7,44.1,83.8,55.3,12,False,120,55,0.1 +613,-inf,0.0,2012,0.0,0.0,0.0,675,0.0,0.0,16,74.9,57.0,83.3,26.6,8,False,71,35,0.1 +614,-inf,0.0,2234,0.0,0.0,0.0,803,0.0,0.0,18,13.2,67.3,88.1,8.2,1,False,90,55,0.1 +615,-inf,0.0,3275,0.0,0.0,0.0,1181,0.0,0.0,14,65.7,48.6,77.5,51.9,6,False,90,35,0.1 +616,-inf,0.0,1925,0.0,0.0,0.0,673,0.0,0.0,10,79.4,48.9,82.9,30.9,12,False,71,55,0.1 +617,-inf,0.0,2055,0.0,0.0,0.0,698,0.0,0.0,10,16.3,71.0,97.1,11.3,12,False,71,90,0.1 +618,-inf,0.0,2688,0.0,0.0,0.0,965,0.0,0.0,14,78.5,57.7,80.6,50.3,8,False,40,41,0.1 +619,-inf,0.0,1804,0.0,0.0,0.0,654,0.0,0.0,14,10.2,62.7,91.1,5.2,12,False,55,41,0.1 +620,-inf,0.0,1216,0.0,0.0,0.0,431,0.0,0.0,14,6.0,72.7,95.3,1.0,4,False,40,90,0.1 +621,-inf,0.0,4381,0.0,0.0,0.0,1627,0.0,0.0,12,10.1,62.9,98.4,5.1,8,True,55,90,0.1 +622,-inf,0.0,1517,0.0,0.0,0.0,532,0.0,0.0,10,9.1,76.0,96.9,4.1,4,False,90,35,0.1 +623,-inf,0.0,2021,0.0,0.0,0.0,718,0.0,0.0,18,18.1,65.2,86.6,17.9,3,False,40,55,0.1 +624,-inf,0.0,4919,0.0,0.0,0.0,1731,0.0,0.0,21,10.8,52.3,90.2,5.8,1,False,120,90,0.1 +625,-inf,0.0,2872,0.0,0.0,0.0,1040,0.0,0.0,12,4.4,69.5,93.6,-0.6,2,True,90,70,0.1 +626,-inf,0.0,2252,0.0,0.0,0.0,790,0.0,0.0,10,79.6,40.4,83.4,40.7,6,False,90,20,0.1 +627,-inf,0.0,664,0.0,0.0,0.0,242,0.0,0.0,14,11.9,77.8,97.8,4.8,4,True,55,90,0.1 +628,-inf,0.0,2715,0.0,0.0,0.0,901,0.0,0.0,14,66.9,49.7,79.5,19.7,3,False,90,90,0.1 +629,-inf,0.0,1810,0.0,0.0,0.0,645,0.0,0.0,18,21.8,53.4,90.3,15.6,12,False,90,70,0.1 +630,-inf,0.0,4555,0.0,0.0,0.0,1629,0.0,0.0,10,65.2,57.1,91.6,51.4,3,False,90,35,0.1 +631,-inf,0.0,2226,0.0,0.0,0.0,757,0.0,0.0,16,63.3,56.1,75.7,18.2,3,False,150,41,0.1 +632,-inf,0.0,3902,0.0,0.0,0.0,1383,0.0,0.0,18,21.7,56.4,92.1,16.7,2,False,55,55,0.1 +633,-inf,0.0,1570,0.0,0.0,0.0,568,0.0,0.0,21,10.0,68.0,92.9,5.0,3,True,40,41,0.1 +634,-inf,0.0,5668,0.0,0.0,0.0,2036,0.0,0.0,16,72.6,44.6,78.6,55.2,1,False,71,35,0.1 +635,-inf,0.0,2474,0.0,0.0,0.0,859,0.0,0.0,12,6.9,69.2,94.3,1.9,2,False,150,55,0.1 +636,-inf,0.0,1352,0.0,0.0,0.0,461,0.0,0.0,14,20.5,73.2,85.8,15.5,8,False,90,90,0.1 +637,-inf,0.0,2117,0.0,0.0,0.0,783,0.0,0.0,12,13.8,72.8,92.6,7.4,3,True,150,70,0.1 +638,-inf,0.0,2684,0.0,0.0,0.0,960,0.0,0.0,12,15.0,56.5,92.1,10.0,8,False,90,90,0.1 +639,-inf,0.0,927,0.0,0.0,0.0,319,0.0,0.0,18,64.7,44.2,85.6,42.0,12,False,55,90,0.1 +640,-inf,0.0,2067,0.0,0.0,0.0,711,0.0,0.0,12,18.9,66.7,95.5,13.9,12,False,40,90,0.1 +641,-inf,0.0,4433,0.0,0.0,0.0,1618,0.0,0.0,12,63.6,50.5,83.8,48.3,3,False,40,35,0.1 +642,-inf,0.0,2156,0.0,0.0,0.0,771,0.0,0.0,21,81.0,38.5,84.4,28.1,4,True,120,35,0.1 +643,-inf,0.0,6555,0.0,0.0,0.0,2277,0.0,0.0,10,66.1,56.0,78.8,19.1,1,False,40,70,0.1 +644,-inf,0.0,2056,0.0,0.0,0.0,738,0.0,0.0,10,63.0,52.0,85.4,31.2,12,False,55,55,0.1 +645,-inf,0.0,3836,0.0,0.0,0.0,1250,0.0,0.0,14,81.4,49.1,72.1,20.6,1,False,150,70,0.1 +646,-inf,0.0,593,0.0,0.0,0.0,217,0.0,0.0,16,14.8,75.0,90.3,9.8,12,False,55,35,0.1 +647,-inf,0.0,2200,0.0,0.0,0.0,766,0.0,0.0,12,17.4,73.6,88.5,12.4,1,False,55,55,0.1 +648,-inf,0.0,782,0.0,0.0,0.0,203,0.0,0.0,21,69.4,48.2,82.0,19.2,12,False,150,41,0.1 +649,-inf,0.0,4042,0.0,0.0,0.0,1476,0.0,0.0,12,6.9,64.9,97.8,1.9,4,True,55,55,0.1 +650,-inf,0.0,4519,0.0,0.0,0.0,1610,0.0,0.0,10,66.2,56.9,85.1,28.9,3,False,71,41,0.1 +651,-inf,0.0,1544,0.0,0.0,0.0,540,0.0,0.0,10,71.6,45.5,83.6,27.6,12,False,71,41,0.1 +652,-inf,0.0,4431,0.0,0.0,0.0,1619,0.0,0.0,12,64.8,49.1,83.3,57.5,3,False,150,20,0.1 +653,-inf,0.0,2468,0.0,0.0,0.0,901,0.0,0.0,12,75.6,54.3,80.7,47.6,12,False,40,35,0.1 +654,-inf,0.0,6585,0.0,0.0,0.0,2328,0.0,0.0,12,13.2,55.9,88.1,8.2,1,False,55,90,0.1 +655,-inf,0.0,8085,0.0,0.0,0.0,2874,0.0,0.0,10,65.8,47.5,82.8,37.3,1,False,55,55,0.1 +656,-inf,0.0,1873,0.0,0.0,0.0,641,0.0,0.0,14,17.8,66.8,92.5,15.1,8,False,150,70,0.1 +657,-inf,0.0,1373,0.0,0.0,0.0,489,0.0,0.0,21,14.3,68.9,90.2,9.3,2,True,150,41,0.1 +658,-inf,0.0,2932,0.0,0.0,0.0,1012,0.0,0.0,10,13.9,71.1,86.4,8.9,2,False,55,35,0.1 +659,-inf,0.0,4170,0.0,0.0,0.0,1493,0.0,0.0,16,8.5,54.2,91.9,3.5,2,False,71,35,0.1 +660,-inf,0.0,1767,0.0,0.0,0.0,588,0.0,0.0,10,76.5,40.3,76.5,18.4,4,False,150,55,0.1 +661,-inf,0.0,2011,0.0,0.0,0.0,702,0.0,0.0,18,81.9,42.2,72.7,51.3,4,False,55,41,0.1 +662,-inf,0.0,597,0.0,0.0,0.0,215,0.0,0.0,18,15.1,73.0,95.5,10.1,12,False,90,41,0.1 +663,-inf,0.0,599,0.0,0.0,0.0,222,0.0,0.0,16,11.3,75.2,90.7,6.3,6,False,55,70,0.1 +664,-inf,0.0,2221,0.0,0.0,0.0,819,0.0,0.0,14,6.1,69.8,97.6,1.1,8,True,90,90,0.1 +665,-inf,0.0,1694,0.0,0.0,0.0,608,0.0,0.0,12,7.5,73.3,97.2,2.5,2,False,150,55,0.1 +666,-inf,0.0,4124,0.0,0.0,0.0,1417,0.0,0.0,14,75.2,38.4,80.8,32.3,1,False,55,20,0.1 +667,-inf,0.0,8525,0.0,0.0,0.0,3037,0.0,0.0,10,67.7,53.8,78.1,42.0,1,False,150,90,0.1 +668,-inf,0.0,4907,0.0,0.0,0.0,1839,0.0,0.0,16,20.9,52.7,95.1,15.9,8,True,120,90,0.1 +669,-inf,0.0,2394,0.0,0.0,0.0,844,0.0,0.0,16,6.2,65.6,89.2,1.2,2,False,90,35,0.1 +670,-inf,0.0,2023,0.0,0.0,0.0,682,0.0,0.0,10,15.6,73.6,90.5,10.6,6,False,40,90,0.1 +671,-inf,0.0,3393,0.0,0.0,0.0,1200,0.0,0.0,12,19.7,57.3,91.2,14.7,6,False,120,35,0.1 +672,-inf,0.0,2349,0.0,0.0,0.0,780,0.0,0.0,10,20.9,75.3,88.3,15.9,6,False,90,90,0.1 +673,-inf,0.0,3436,0.0,0.0,0.0,1187,0.0,0.0,10,68.1,49.7,86.2,20.8,4,False,71,70,0.1 +674,-inf,0.0,7828,0.0,0.0,0.0,2888,0.0,0.0,12,62.4,45.5,74.5,38.8,6,True,55,90,0.1 +675,-inf,0.0,2947,0.0,0.0,0.0,1058,0.0,0.0,16,5.6,57.1,92.2,0.6,4,False,71,70,0.1 +676,-inf,0.0,3646,0.0,0.0,0.0,1290,0.0,0.0,16,19.1,53.2,95.4,9.0,3,False,120,20,0.1 +677,-inf,0.0,1064,0.0,0.0,0.0,359,0.0,0.0,14,64.0,39.3,85.9,43.9,8,False,90,41,0.1 +678,-inf,0.0,1940,0.0,0.0,0.0,681,0.0,0.0,21,11.9,59.3,93.2,6.9,6,False,40,20,0.1 +679,-inf,0.0,2339,0.0,0.0,0.0,830,0.0,0.0,21,71.9,42.6,74.3,40.4,3,False,71,35,0.1 +680,-inf,0.0,3308,0.0,0.0,0.0,1167,0.0,0.0,16,20.1,59.1,98.7,15.1,3,False,120,35,0.1 +681,-inf,0.0,3446,0.0,0.0,0.0,1231,0.0,0.0,21,13.9,55.3,96.3,4.8,2,False,71,41,0.1 +682,-inf,0.0,6166,0.0,0.0,0.0,2169,0.0,0.0,10,80.6,46.0,75.5,46.6,2,False,90,90,0.1 +683,-inf,0.0,2954,0.0,0.0,0.0,1017,0.0,0.0,16,75.7,38.9,75.8,60.2,2,False,71,90,0.1 +684,-inf,0.0,3958,0.0,0.0,0.0,1444,0.0,0.0,12,76.8,51.0,80.0,43.1,4,False,55,70,0.1 +685,-inf,0.0,1762,0.0,0.0,0.0,627,0.0,0.0,21,81.9,47.3,88.8,28.6,6,False,55,41,0.1 +686,-inf,0.0,2065,0.0,0.0,0.0,750,0.0,0.0,12,67.4,53.7,81.5,31.7,12,False,120,90,0.1 +687,-inf,0.0,484,0.0,0.0,0.0,189,0.0,0.0,18,5.6,75.2,92.4,0.6,2,False,55,90,0.1 +688,-inf,0.0,6342,0.0,0.0,0.0,2327,0.0,0.0,12,81.6,54.2,91.4,30.7,4,True,40,55,0.1 +689,-inf,0.0,4470,0.0,0.0,0.0,1632,0.0,0.0,12,12.4,63.5,93.8,7.4,4,True,71,35,0.1 +690,-inf,0.0,2156,0.0,0.0,0.0,779,0.0,0.0,14,5.8,70.5,93.1,0.8,2,True,40,41,0.1 +691,-inf,0.0,1700,0.0,0.0,0.0,632,0.0,0.0,18,62.6,54.9,87.3,44.0,12,False,150,55,0.1 +692,-inf,0.0,6878,0.0,0.0,0.0,2402,0.0,0.0,12,18.6,56.0,92.6,17.6,1,False,150,70,0.1 +693,-inf,0.0,1928,0.0,0.0,0.0,637,0.0,0.0,21,75.3,44.7,80.7,26.5,3,False,40,70,0.1 +694,-inf,0.0,2325,0.0,0.0,0.0,815,0.0,0.0,21,5.8,60.7,94.9,0.8,3,False,90,70,0.1 +695,-inf,0.0,2650,0.0,0.0,0.0,922,0.0,0.0,10,12.3,71.8,89.4,9.6,2,False,150,90,0.1 +696,-inf,0.0,4318,0.0,0.0,0.0,1560,0.0,0.0,14,76.1,42.2,76.2,47.4,8,True,90,55,0.1 +697,-inf,0.0,5333,0.0,0.0,0.0,1887,0.0,0.0,16,74.6,41.5,91.4,25.7,1,True,40,55,0.1 +698,-inf,0.0,4738,0.0,0.0,0.0,1669,0.0,0.0,16,72.1,39.7,76.6,24.1,2,True,71,41,0.1 +699,-inf,0.0,4954,0.0,0.0,0.0,1765,0.0,0.0,16,70.3,39.1,89.6,18.4,2,True,55,41,0.1 +700,-inf,0.0,3506,0.0,0.0,0.0,1261,0.0,0.0,16,62.5,54.8,89.1,55.8,3,False,40,70,0.1 +701,-inf,0.0,400,0.0,0.0,0.0,151,0.0,0.0,16,9.7,76.9,93.8,4.7,6,False,120,55,0.1 +702,-inf,0.0,3714,0.0,0.0,0.0,1329,0.0,0.0,10,5.8,69.1,92.0,0.8,1,False,150,70,0.1 +703,-inf,0.0,688,0.0,0.0,0.0,251,0.0,0.0,18,17.8,74.0,89.3,12.8,3,False,150,20,0.1 +704,-inf,0.0,1411,0.0,0.0,0.0,501,0.0,0.0,18,79.9,43.0,83.5,34.7,6,False,40,41,0.1 +705,-inf,0.0,558,0.0,0.0,0.0,229,0.0,0.0,21,8.2,73.5,90.6,3.2,1,False,90,55,0.1 +706,-inf,0.0,6026,0.0,0.0,0.0,2151,0.0,0.0,18,74.7,49.6,74.9,50.3,1,False,150,41,0.1 +707,-inf,0.0,1688,0.0,0.0,0.0,587,0.0,0.0,10,62.3,44.4,89.5,20.6,8,False,55,41,0.1 +708,-inf,0.0,2716,0.0,0.0,0.0,967,0.0,0.0,14,10.9,57.9,94.9,5.9,6,False,120,35,0.1 +709,-inf,0.0,4246,0.0,0.0,0.0,1520,0.0,0.0,14,77.6,57.0,76.9,40.7,2,False,90,35,0.1 +710,-inf,0.0,7538,0.0,0.0,0.0,2656,0.0,0.0,10,81.2,43.8,79.4,41.2,1,False,55,20,0.1 +711,-inf,0.0,1408,0.0,0.0,0.0,518,0.0,0.0,12,13.9,76.1,85.9,8.9,3,True,120,90,0.1 +712,-inf,0.0,2825,0.0,0.0,0.0,967,0.0,0.0,10,19.8,74.2,91.4,14.8,2,False,55,41,0.1 +713,-inf,0.0,623,0.0,0.0,0.0,228,0.0,0.0,16,4.0,74.6,96.6,-1.0,8,False,120,41,0.1 +714,-inf,0.0,4393,0.0,0.0,0.0,1610,0.0,0.0,21,64.6,41.7,86.1,35.3,6,True,90,41,0.1 +715,-inf,0.0,2697,0.0,0.0,0.0,972,0.0,0.0,21,74.1,41.7,84.3,34.4,8,True,40,90,0.1 +716,-inf,0.0,2077,0.0,0.0,0.0,711,0.0,0.0,21,66.0,44.1,72.1,32.2,4,False,120,35,0.1 +717,-inf,0.0,5684,0.0,0.0,0.0,2021,0.0,0.0,10,5.7,62.5,87.5,0.7,1,False,150,55,0.1 +718,-inf,0.0,2545,0.0,0.0,0.0,902,0.0,0.0,10,8.4,69.3,97.2,3.4,4,False,71,35,0.1 +719,-inf,0.0,2188,0.0,0.0,0.0,738,0.0,0.0,12,18.2,70.6,96.0,13.2,4,False,40,41,0.1 +720,-inf,0.0,4040,0.0,0.0,0.0,1523,0.0,0.0,21,9.3,55.0,91.1,4.3,12,True,90,41,0.1 +721,-inf,0.0,1059,0.0,0.0,0.0,356,0.0,0.0,14,20.6,76.4,91.3,15.6,4,False,71,55,0.1 +722,-inf,0.0,1080,0.0,0.0,0.0,386,0.0,0.0,16,13.0,72.0,87.2,8.0,4,False,71,55,0.1 +723,-inf,0.0,5697,0.0,0.0,0.0,2132,0.0,0.0,16,73.1,52.5,73.7,35.3,6,True,55,41,0.1 +724,-inf,0.0,2268,0.0,0.0,0.0,817,0.0,0.0,18,18.9,59.5,97.2,13.9,6,False,55,35,0.1 +725,-inf,0.0,4867,0.0,0.0,0.0,1842,0.0,0.0,18,74.8,55.4,80.3,61.6,12,True,90,41,0.1 +726,-inf,0.0,1382,0.0,0.0,0.0,485,0.0,0.0,21,79.5,46.5,72.4,61.8,12,False,150,90,0.1 +727,-inf,0.0,154,0.0,0.0,0.0,62,0.0,0.0,21,15.5,77.8,89.3,14.3,8,False,90,90,0.1 +728,-inf,0.0,2187,0.0,0.0,0.0,771,0.0,0.0,16,11.0,57.9,89.3,9.9,8,False,71,70,0.1 +729,-inf,0.0,703,0.0,0.0,0.0,259,0.0,0.0,14,7.1,76.4,93.3,2.1,4,False,71,55,0.1 +730,-inf,0.0,5146,0.0,0.0,0.0,1856,0.0,0.0,10,62.7,48.0,82.2,47.1,3,False,71,20,0.1 +731,-inf,0.0,3463,0.0,0.0,0.0,1253,0.0,0.0,10,66.7,53.6,80.8,41.7,8,False,40,35,0.1 +732,-inf,0.0,4986,0.0,0.0,0.0,1760,0.0,0.0,10,75.8,45.6,90.4,54.1,2,False,120,41,0.1 +733,-inf,0.0,596,0.0,0.0,0.0,189,0.0,0.0,21,66.5,38.9,81.7,19.5,8,False,71,41,0.1 +734,-inf,0.0,2800,0.0,0.0,0.0,1002,0.0,0.0,21,8.2,56.8,87.5,3.2,3,False,55,70,0.1 +735,-inf,0.0,2733,0.0,0.0,0.0,980,0.0,0.0,14,78.2,53.3,73.3,31.4,6,False,55,90,0.1 +736,-inf,0.0,3238,0.0,0.0,0.0,1199,0.0,0.0,21,73.1,45.7,84.4,32.0,12,True,90,90,0.1 +737,-inf,0.0,1616,0.0,0.0,0.0,570,0.0,0.0,14,68.0,42.6,86.1,31.1,6,False,90,70,0.1 +738,-inf,0.0,1845,0.0,0.0,0.0,622,0.0,0.0,10,16.5,75.9,86.2,11.5,6,False,120,90,0.1 +739,-inf,0.0,3628,0.0,0.0,0.0,1252,0.0,0.0,12,17.9,60.2,87.9,12.9,4,False,40,55,0.1 +740,-inf,0.0,2597,0.0,0.0,0.0,893,0.0,0.0,12,66.4,47.4,72.0,29.4,8,False,90,90,0.1 +741,-inf,0.0,2062,0.0,0.0,0.0,690,0.0,0.0,14,78.9,43.7,81.8,26.1,4,False,71,20,0.1 +742,-inf,0.0,2519,0.0,0.0,0.0,875,0.0,0.0,10,10.3,71.0,93.1,5.3,3,False,120,35,0.1 +743,-inf,0.0,2170,0.0,0.0,0.0,779,0.0,0.0,14,68.1,53.2,80.3,46.3,12,False,150,90,0.1 +744,-inf,0.0,6311,0.0,0.0,0.0,2264,0.0,0.0,14,73.2,43.1,91.0,60.1,2,True,71,35,0.1 +745,-inf,0.0,2527,0.0,0.0,0.0,890,0.0,0.0,18,67.3,44.8,86.6,46.5,3,False,55,35,0.1 +746,-inf,0.0,4017,0.0,0.0,0.0,1470,0.0,0.0,16,15.5,60.9,92.1,10.5,4,True,71,41,0.1 +747,-inf,0.0,1244,0.0,0.0,0.0,436,0.0,0.0,18,17.9,70.8,89.8,12.9,2,False,90,55,0.1 +748,-inf,0.0,1567,0.0,0.0,0.0,569,0.0,0.0,12,6.4,75.0,93.5,1.4,1,False,55,90,0.1 +749,-inf,0.0,2941,0.0,0.0,0.0,1036,0.0,0.0,10,6.4,69.7,91.9,1.4,2,False,150,90,0.1 +750,-inf,0.0,3866,0.0,0.0,0.0,1393,0.0,0.0,14,13.3,64.4,85.6,8.3,1,True,90,35,0.1 +751,-inf,0.0,740,0.0,0.0,0.0,246,0.0,0.0,16,20.0,76.8,93.8,15.0,2,True,71,35,0.1 +752,-inf,0.0,6968,0.0,0.0,0.0,2425,0.0,0.0,14,68.7,39.6,81.6,52.6,1,True,90,55,0.1 +753,-inf,0.0,253,0.0,0.0,0.0,101,0.0,0.0,21,13.8,76.5,86.6,8.8,2,False,120,20,0.1 +754,-inf,0.0,4009,0.0,0.0,0.0,1428,0.0,0.0,10,6.7,57.0,92.8,1.7,4,False,40,70,0.1 +755,-inf,0.0,2156,0.0,0.0,0.0,758,0.0,0.0,14,20.8,62.0,96.2,15.8,12,False,120,20,0.1 +756,-inf,0.0,4291,0.0,0.0,0.0,1530,0.0,0.0,21,7.2,57.3,89.8,2.2,1,True,150,20,0.1 +757,-inf,0.0,2161,0.0,0.0,0.0,785,0.0,0.0,18,19.2,53.1,86.8,14.2,8,False,71,41,0.1 +758,-inf,0.0,2247,0.0,0.0,0.0,818,0.0,0.0,12,70.2,49.3,82.6,29.9,8,False,55,35,0.1 +759,-inf,0.0,3260,0.0,0.0,0.0,1108,0.0,0.0,10,20.2,69.3,93.2,10.7,4,False,90,90,0.1 +760,-inf,0.0,5008,0.0,0.0,0.0,1760,0.0,0.0,10,22.0,54.7,98.4,17.0,4,False,150,35,0.1 +761,-inf,0.0,5238,0.0,0.0,0.0,1889,0.0,0.0,16,12.8,55.8,92.2,7.8,3,True,71,20,0.1 +762,-inf,0.0,1542,0.0,0.0,0.0,541,0.0,0.0,18,12.3,68.8,93.0,7.3,2,False,120,35,0.1 +763,-inf,0.0,6179,0.0,0.0,0.0,2269,0.0,0.0,10,5.7,58.0,88.2,0.7,4,True,90,90,0.1 +764,-inf,0.0,4780,0.0,0.0,0.0,1816,0.0,0.0,18,76.6,53.2,78.0,50.1,8,True,120,55,0.1 +765,-inf,0.0,1937,0.0,0.0,0.0,693,0.0,0.0,10,65.4,44.9,88.5,53.4,8,False,55,55,0.1 +766,-inf,0.0,1115,0.0,0.0,0.0,404,0.0,0.0,18,17.0,71.4,94.1,12.0,2,False,150,90,0.1 +767,-inf,0.0,5467,0.0,0.0,0.0,2064,0.0,0.0,14,8.8,52.2,93.1,3.8,4,True,150,55,0.1 +768,-inf,0.0,1986,0.0,0.0,0.0,703,0.0,0.0,14,8.3,65.5,92.2,3.3,6,False,40,55,0.1 +769,-inf,0.0,2917,0.0,0.0,0.0,1011,0.0,0.0,12,17.0,62.3,91.3,12.0,6,False,40,35,0.1 +770,-inf,0.0,4116,0.0,0.0,0.0,1498,0.0,0.0,12,80.8,43.7,81.3,32.2,12,True,150,35,0.1 +771,-inf,0.0,2021,0.0,0.0,0.0,708,0.0,0.0,12,18.9,74.7,97.6,13.9,12,True,71,20,0.1 +772,-inf,0.0,1266,0.0,0.0,0.0,435,0.0,0.0,16,18.7,70.3,96.0,13.7,8,False,55,20,0.1 +773,-inf,0.0,7080,0.0,0.0,0.0,2554,0.0,0.0,12,70.9,49.6,87.8,59.2,1,False,150,70,0.1 +774,-inf,0.0,2202,0.0,0.0,0.0,770,0.0,0.0,16,11.4,65.1,95.1,6.4,3,False,55,70,0.1 +775,-inf,0.0,5101,0.0,0.0,0.0,1823,0.0,0.0,21,63.8,50.2,88.9,50.0,1,False,71,70,0.1 +776,-inf,0.0,597,0.0,0.0,0.0,219,0.0,0.0,16,8.5,76.3,87.5,3.5,1,False,71,70,0.1 +777,-inf,0.0,1508,0.0,0.0,0.0,524,0.0,0.0,18,19.5,65.9,87.1,14.5,8,False,71,55,0.1 +778,-inf,0.0,8629,0.0,0.0,0.0,3080,0.0,0.0,12,65.1,43.2,80.8,58.0,4,True,55,35,0.1 +779,-inf,0.0,3149,0.0,0.0,0.0,1159,0.0,0.0,12,65.5,54.4,78.1,55.5,12,False,71,20,0.1 +780,-inf,0.0,3401,0.0,0.0,0.0,1195,0.0,0.0,16,20.6,58.5,98.7,15.6,3,False,55,35,0.1 +781,-inf,0.0,6807,0.0,0.0,0.0,2584,0.0,0.0,12,69.2,52.0,81.2,41.2,8,True,71,90,0.1 +782,-inf,0.0,5336,0.0,0.0,0.0,1863,0.0,0.0,10,67.3,51.5,87.0,26.2,2,False,40,41,0.1 +783,-inf,0.0,830,0.0,0.0,0.0,277,0.0,0.0,21,68.5,43.0,77.8,30.3,12,False,40,90,0.1 +784,-inf,0.0,3991,0.0,0.0,0.0,1021,0.0,0.0,18,73.3,51.2,83.5,19.0,1,False,150,70,0.1 +785,-inf,0.0,3805,0.0,0.0,0.0,1410,0.0,0.0,14,65.9,47.8,82.9,53.5,3,False,40,55,0.1 +786,-inf,0.0,4482,0.0,0.0,0.0,1748,0.0,0.0,18,69.1,55.8,77.9,22.4,8,True,150,90,0.1 +787,-inf,0.0,2325,0.0,0.0,0.0,866,0.0,0.0,16,8.9,67.9,88.3,3.9,3,True,120,35,0.1 +788,-inf,0.0,1494,0.0,0.0,0.0,531,0.0,0.0,18,68.8,43.4,84.5,56.1,6,False,71,35,0.1 +789,-inf,0.0,3182,0.0,0.0,0.0,1129,0.0,0.0,12,79.9,49.1,72.6,34.2,6,False,150,55,0.1 +790,-inf,0.0,4376,0.0,0.0,0.0,1445,0.0,0.0,12,71.4,38.8,88.6,18.8,1,False,120,20,0.1 +791,-inf,0.0,5783,0.0,0.0,0.0,2123,0.0,0.0,21,64.6,43.9,89.0,48.3,2,True,90,90,0.1 +792,-inf,0.0,3889,0.0,0.0,0.0,1364,0.0,0.0,12,15.9,60.3,86.9,12.4,3,False,90,35,0.1 +793,-inf,0.0,1061,0.0,0.0,0.0,354,0.0,0.0,16,73.0,46.1,88.0,21.9,12,False,150,20,0.1 +794,-inf,0.0,4756,0.0,0.0,0.0,1644,0.0,0.0,10,72.7,53.8,83.5,23.2,2,False,71,41,0.1 +795,-inf,0.0,3958,0.0,0.0,0.0,1390,0.0,0.0,14,62.4,40.0,75.6,59.2,3,False,40,35,0.1 +796,-inf,0.0,2164,0.0,0.0,0.0,768,0.0,0.0,16,67.5,40.5,78.9,46.7,4,False,150,20,0.1 +797,-inf,0.0,1350,0.0,0.0,0.0,485,0.0,0.0,21,9.8,65.3,95.4,4.8,6,False,90,90,0.1 +798,-inf,0.0,1961,0.0,0.0,0.0,707,0.0,0.0,14,77.2,49.1,79.3,30.0,8,False,40,90,0.1 +799,-inf,0.0,4072,0.0,0.0,0.0,1426,0.0,0.0,18,21.4,53.0,96.3,16.4,2,False,90,70,0.1 +800,-inf,0.0,1696,0.0,0.0,0.0,605,0.0,0.0,18,6.4,58.5,94.5,1.4,12,False,150,20,0.1 +801,-inf,0.0,4226,0.0,0.0,0.0,1508,0.0,0.0,18,63.0,38.2,76.7,52.3,12,True,55,35,0.1 +802,-inf,0.0,2640,0.0,0.0,0.0,950,0.0,0.0,10,79.2,53.2,83.5,60.6,12,False,55,90,0.1 +803,-inf,0.0,1494,0.0,0.0,0.0,526,0.0,0.0,12,14.1,72.4,97.9,5.8,8,False,120,55,0.1 +804,-inf,0.0,840,0.0,0.0,0.0,300,0.0,0.0,21,14.8,69.2,89.6,9.8,8,False,90,70,0.1 +805,-inf,0.0,2218,0.0,0.0,0.0,801,0.0,0.0,10,65.0,44.8,86.3,54.2,8,False,90,20,0.1 +806,-inf,0.0,2759,0.0,0.0,0.0,916,0.0,0.0,21,71.4,39.8,80.0,28.2,1,False,90,70,0.1 +807,-inf,0.0,3404,0.0,0.0,0.0,1231,0.0,0.0,21,73.2,46.9,78.2,44.5,2,False,90,20,0.1 +808,-inf,0.0,2301,0.0,0.0,0.0,805,0.0,0.0,12,13.2,70.5,92.6,8.2,2,False,55,35,0.1 +809,-inf,0.0,1502,0.0,0.0,0.0,523,0.0,0.0,21,4.4,59.1,85.8,-0.6,12,False,120,55,0.1 +810,-inf,0.0,1708,0.0,0.0,0.0,613,0.0,0.0,16,68.0,52.7,85.8,49.4,12,False,71,55,0.1 +811,-inf,0.0,869,0.0,0.0,0.0,314,0.0,0.0,21,12.4,68.0,87.6,7.4,12,False,90,35,0.1 +812,-inf,0.0,1932,0.0,0.0,0.0,671,0.0,0.0,14,10.6,67.9,93.4,5.6,4,False,120,20,0.1 +813,-inf,0.0,6398,0.0,0.0,0.0,2297,0.0,0.0,10,79.7,44.6,86.4,53.9,6,True,40,55,0.1 +814,-inf,0.0,454,0.0,0.0,0.0,166,0.0,0.0,16,17.2,77.6,98.1,9.3,6,False,71,41,0.1 +815,-inf,0.0,334,0.0,0.0,0.0,130,0.0,0.0,18,4.5,76.6,88.7,-0.5,6,False,150,55,0.1 +816,-inf,0.0,6232,0.0,0.0,0.0,2240,0.0,0.0,14,67.1,54.4,72.4,36.3,1,False,71,20,0.1 +817,-inf,0.0,2886,0.0,0.0,0.0,984,0.0,0.0,10,66.7,52.2,85.1,22.2,6,False,150,41,0.1 +818,-inf,0.0,4934,0.0,0.0,0.0,1766,0.0,0.0,12,6.6,54.0,99.0,1.6,2,False,150,70,0.1 +819,-inf,0.0,2441,0.0,0.0,0.0,858,0.0,0.0,14,80.7,44.8,88.4,38.9,4,False,120,70,0.1 +820,-inf,0.0,3712,0.0,0.0,0.0,1278,0.0,0.0,10,78.4,39.7,91.6,41.9,2,False,90,41,0.1 +821,-inf,0.0,1720,0.0,0.0,0.0,633,0.0,0.0,21,11.4,67.4,91.0,4.1,6,True,55,35,0.1 +822,-inf,0.0,2955,0.0,0.0,0.0,1043,0.0,0.0,10,18.5,74.4,97.3,12.9,6,True,71,41,0.1 +823,-inf,0.0,6001,0.0,0.0,0.0,2244,0.0,0.0,10,11.8,58.2,93.2,6.8,8,True,150,35,0.1 +824,-inf,0.0,2796,0.0,0.0,0.0,968,0.0,0.0,16,8.0,63.4,98.8,3.0,2,False,90,55,0.1 +825,-inf,0.0,1564,0.0,0.0,0.0,499,0.0,0.0,16,68.5,53.9,75.7,22.5,6,False,90,20,0.1 +826,-inf,0.0,955,0.0,0.0,0.0,336,0.0,0.0,16,8.3,72.7,96.9,8.3,4,False,90,55,0.1 +827,-inf,0.0,2108,0.0,0.0,0.0,759,0.0,0.0,18,74.2,46.5,75.7,38.4,6,False,55,41,0.1 +828,-inf,0.0,866,0.0,0.0,0.0,302,0.0,0.0,16,14.7,73.2,88.3,9.7,6,False,90,55,0.1 +829,-inf,0.0,5168,0.0,0.0,0.0,1818,0.0,0.0,10,18.2,55.7,88.2,13.2,3,False,40,55,0.1 +830,-inf,0.0,371,0.0,0.0,0.0,144,0.0,0.0,18,12.3,77.2,97.3,7.3,1,False,120,55,0.1 +831,-inf,0.0,1236,0.0,0.0,0.0,427,0.0,0.0,14,21.7,76.4,86.8,16.7,2,False,71,90,0.1 +832,-inf,0.0,4505,0.0,0.0,0.0,1622,0.0,0.0,14,72.8,43.3,87.6,18.2,8,True,120,20,0.1 +833,-inf,0.0,1509,0.0,0.0,0.0,541,0.0,0.0,16,9.4,67.8,96.3,4.4,6,False,90,90,0.1 +834,-inf,0.0,1658,0.0,0.0,0.0,538,0.0,0.0,12,21.8,75.9,97.9,16.8,6,False,40,35,0.1 +835,-inf,0.0,2434,0.0,0.0,0.0,840,0.0,0.0,18,75.5,50.6,78.3,29.8,4,False,40,41,0.1 +836,-inf,0.0,3239,0.0,0.0,0.0,1168,0.0,0.0,10,10.3,53.8,98.7,5.3,6,False,90,20,0.1 +837,-inf,0.0,6698,0.0,0.0,0.0,2382,0.0,0.0,16,71.6,54.7,73.8,56.9,1,False,120,90,0.1 +838,-inf,0.0,676,0.0,0.0,0.0,265,0.0,0.0,18,8.2,74.3,86.7,3.2,4,True,150,70,0.1 +839,-inf,0.0,6978,0.0,0.0,0.0,2566,0.0,0.0,12,81.7,53.5,90.5,60.4,2,True,55,41,0.1 +840,-inf,0.0,4388,0.0,0.0,0.0,1551,0.0,0.0,16,69.8,55.2,78.9,47.3,2,False,150,41,0.1 +841,-inf,0.0,3875,0.0,0.0,0.0,1345,0.0,0.0,12,17.8,60.8,90.8,12.8,3,False,40,41,0.1 +842,-inf,0.0,5367,0.0,0.0,0.0,1979,0.0,0.0,14,73.5,46.2,83.3,21.4,6,True,40,55,0.1 +843,-inf,0.0,956,0.0,0.0,0.0,338,0.0,0.0,18,16.9,71.0,93.6,14.5,6,False,55,70,0.1 +844,-inf,0.0,4310,0.0,0.0,0.0,1519,0.0,0.0,12,69.9,43.4,75.0,56.1,4,False,71,70,0.1 +845,-inf,0.0,1927,0.0,0.0,0.0,674,0.0,0.0,21,19.4,57.7,88.2,19.4,8,False,120,70,0.1 +846,-inf,0.0,7879,0.0,0.0,0.0,2808,0.0,0.0,10,73.1,51.0,86.7,41.9,1,False,55,90,0.1 +847,-inf,0.0,579,0.0,0.0,0.0,197,0.0,0.0,16,64.6,38.4,81.9,18.3,12,False,55,55,0.1 +848,-inf,0.0,4101,0.0,0.0,0.0,1450,0.0,0.0,14,8.7,58.3,89.5,3.7,2,False,40,70,0.1 +849,-inf,0.0,1689,0.0,0.0,0.0,558,0.0,0.0,16,76.8,47.9,72.1,28.3,8,False,55,55,0.1 +850,-inf,0.0,1870,0.0,0.0,0.0,622,0.0,0.0,18,64.4,48.0,83.2,23.2,6,False,150,35,0.1 +851,-inf,0.0,2666,0.0,0.0,0.0,822,0.0,0.0,14,74.4,45.6,73.4,18.7,1,False,40,35,0.1 +852,-inf,0.0,2531,0.0,0.0,0.0,886,0.0,0.0,14,6.1,66.7,98.6,1.1,2,False,71,55,0.1 +853,-inf,0.0,3038,0.0,0.0,0.0,1000,0.0,0.0,12,75.5,42.7,79.6,22.4,2,False,55,41,0.1 +854,-inf,0.0,2610,0.0,0.0,0.0,937,0.0,0.0,16,15.9,55.7,95.9,10.9,6,False,55,35,0.1 +855,-inf,0.0,5548,0.0,0.0,0.0,2002,0.0,0.0,10,6.6,54.0,89.9,1.6,2,False,40,70,0.1 +856,-inf,0.0,2748,0.0,0.0,0.0,1002,0.0,0.0,10,62.4,51.5,83.5,60.2,12,False,71,35,0.1 +857,-inf,0.0,2517,0.0,0.0,0.0,886,0.0,0.0,18,70.4,57.3,79.5,50.1,6,False,150,35,0.1 +858,-inf,0.0,5334,0.0,0.0,0.0,1934,0.0,0.0,12,72.8,52.3,84.8,60.2,2,False,55,70,0.1 +859,-inf,0.0,3590,0.0,0.0,0.0,1279,0.0,0.0,16,20.4,63.2,91.6,15.4,4,True,150,41,0.1 +860,-inf,0.0,2150,0.0,0.0,0.0,750,0.0,0.0,16,81.8,58.0,88.0,29.6,8,False,40,55,0.1 +861,-inf,0.0,1543,0.0,0.0,0.0,540,0.0,0.0,16,13.0,69.0,87.3,8.0,4,False,40,20,0.1 +862,-inf,0.0,3287,0.0,0.0,0.0,1125,0.0,0.0,18,70.8,57.4,81.6,30.2,2,False,90,20,0.1 +863,-inf,0.0,3421,0.0,0.0,0.0,1237,0.0,0.0,16,63.7,45.3,75.0,52.3,4,False,120,20,0.1 +864,-inf,0.0,704,0.0,0.0,0.0,247,0.0,0.0,18,21.4,75.5,88.1,20.9,4,True,120,70,0.1 +865,-inf,0.0,1455,0.0,0.0,0.0,517,0.0,0.0,21,4.7,67.4,96.7,-0.3,2,False,120,70,0.1 +866,-inf,0.0,2523,0.0,0.0,0.0,892,0.0,0.0,18,80.0,44.2,80.3,39.6,3,False,55,41,0.1 +867,-inf,0.0,2797,0.0,0.0,0.0,1024,0.0,0.0,12,8.2,64.6,87.5,3.2,4,False,40,55,0.1 +868,-inf,0.0,4394,0.0,0.0,0.0,1610,0.0,0.0,16,16.4,58.6,86.0,11.4,12,True,55,55,0.1 +869,-inf,0.0,5244,0.0,0.0,0.0,1898,0.0,0.0,12,19.8,61.6,96.9,14.8,8,True,55,70,0.1 +870,-inf,0.0,1865,0.0,0.0,0.0,658,0.0,0.0,21,14.8,57.8,88.7,4.3,8,False,150,35,0.1 +871,-inf,0.0,457,0.0,0.0,0.0,176,0.0,0.0,21,15.0,74.4,98.4,10.0,2,True,55,90,0.1 +872,-inf,0.0,1740,0.0,0.0,0.0,660,0.0,0.0,21,13.2,67.1,91.4,8.2,12,True,120,41,0.1 +873,-inf,0.0,737,0.0,0.0,0.0,253,0.0,0.0,16,19.0,76.4,97.9,14.0,3,True,90,35,0.1 +874,-inf,0.0,756,0.0,0.0,0.0,282,0.0,0.0,16,17.4,75.5,86.9,12.4,2,False,40,41,0.1 +875,-inf,0.0,1808,0.0,0.0,0.0,625,0.0,0.0,10,13.3,72.4,87.6,8.3,12,False,120,55,0.1 +876,-inf,0.0,4006,0.0,0.0,0.0,1405,0.0,0.0,12,17.5,63.0,98.0,15.4,2,False,40,41,0.1 +877,-inf,0.0,2225,0.0,0.0,0.0,802,0.0,0.0,10,5.4,62.1,98.6,0.4,12,False,120,35,0.1 +878,-inf,0.0,1821,0.0,0.0,0.0,665,0.0,0.0,21,5.8,67.1,91.2,0.8,1,False,40,55,0.1 +879,-inf,0.0,5241,0.0,0.0,0.0,1855,0.0,0.0,14,4.9,58.8,93.9,-0.1,1,False,150,55,0.1 +880,-inf,0.0,7875,0.0,0.0,0.0,2915,0.0,0.0,12,66.9,47.8,76.3,48.5,6,True,150,20,0.1 +881,-inf,0.0,1376,0.0,0.0,0.0,479,0.0,0.0,10,63.5,41.5,83.5,27.2,12,False,71,35,0.1 +882,-inf,0.0,2999,0.0,0.0,0.0,1017,0.0,0.0,18,74.2,38.1,84.1,45.0,1,False,40,20,0.1 +883,-inf,0.0,2927,0.0,0.0,0.0,1060,0.0,0.0,18,15.8,54.1,86.5,10.8,4,False,71,55,0.1 +884,-inf,0.0,2068,0.0,0.0,0.0,734,0.0,0.0,16,73.6,42.8,83.3,55.6,4,False,120,55,0.1 +885,-inf,0.0,2226,0.0,0.0,0.0,755,0.0,0.0,21,74.8,41.6,83.6,32.1,2,False,40,70,0.1 +886,-inf,0.0,5021,0.0,0.0,0.0,1790,0.0,0.0,10,13.6,65.0,97.1,8.6,3,True,55,70,0.1 +887,-inf,0.0,2424,0.0,0.0,0.0,841,0.0,0.0,12,19.6,62.0,96.4,16.2,12,False,71,90,0.1 +888,-inf,0.0,1378,0.0,0.0,0.0,453,0.0,0.0,21,67.0,39.4,84.6,19.1,3,False,71,70,0.1 +889,-inf,0.0,1748,0.0,0.0,0.0,636,0.0,0.0,18,16.3,56.2,90.1,11.3,12,False,40,20,0.1 +890,-inf,0.0,2035,0.0,0.0,0.0,747,0.0,0.0,18,8.6,52.8,94.0,3.6,8,False,90,55,0.1 +891,-inf,0.0,3807,0.0,0.0,0.0,1377,0.0,0.0,14,10.3,52.8,85.7,5.3,3,False,55,20,0.1 +892,-inf,0.0,8638,0.0,0.0,0.0,3219,0.0,0.0,10,72.2,47.5,90.5,51.5,3,True,150,55,0.1 +893,-inf,0.0,3852,0.0,0.0,0.0,1394,0.0,0.0,18,75.0,48.0,72.7,37.9,2,False,40,41,0.1 +894,-inf,0.0,1107,0.0,0.0,0.0,383,0.0,0.0,21,20.3,66.2,87.3,15.3,12,False,40,41,0.1 +895,-inf,0.0,6857,0.0,0.0,0.0,2399,0.0,0.0,10,18.6,60.9,87.0,13.6,1,False,40,70,0.1 +896,-inf,0.0,4136,0.0,0.0,0.0,1490,0.0,0.0,14,77.5,46.8,90.8,44.8,2,False,90,90,0.1 +897,-inf,0.0,1799,0.0,0.0,0.0,635,0.0,0.0,18,15.8,68.8,97.7,10.8,6,True,90,41,0.1 +898,-inf,0.0,1928,0.0,0.0,0.0,670,0.0,0.0,12,5.5,70.3,87.4,0.5,4,False,120,41,0.1 +899,-inf,0.0,3497,0.0,0.0,0.0,1246,0.0,0.0,18,9.4,57.8,92.9,4.4,2,False,55,35,0.1 +900,-inf,0.0,3035,0.0,0.0,0.0,1087,0.0,0.0,21,10.5,61.9,95.7,5.5,3,True,40,20,0.1 +901,-inf,0.0,363,0.0,0.0,0.0,142,0.0,0.0,16,6.7,77.9,89.5,1.7,4,False,150,35,0.1 +902,-inf,0.0,879,0.0,0.0,0.0,316,0.0,0.0,18,7.3,70.1,86.8,2.3,12,False,120,90,0.1 +903,-inf,0.0,642,0.0,0.0,0.0,239,0.0,0.0,14,6.3,76.6,94.2,1.3,6,False,40,90,0.1 +904,-inf,0.0,3636,0.0,0.0,0.0,1330,0.0,0.0,21,12.8,58.3,91.1,9.8,8,True,71,41,0.1 +905,-inf,0.0,2641,0.0,0.0,0.0,955,0.0,0.0,14,72.9,53.1,88.8,29.2,6,False,40,70,0.1 +906,-inf,0.0,3468,0.0,0.0,0.0,1243,0.0,0.0,21,71.8,48.9,89.6,21.1,2,False,120,20,0.1 +907,-inf,0.0,2710,0.0,0.0,0.0,988,0.0,0.0,21,8.7,57.8,94.4,3.7,3,False,71,70,0.1 +908,-inf,0.0,3562,0.0,0.0,0.0,1260,0.0,0.0,12,5.9,61.3,86.0,0.9,3,False,71,20,0.1 +909,-inf,0.0,4865,0.0,0.0,0.0,1754,0.0,0.0,16,74.0,42.9,85.6,48.5,3,True,120,41,0.1 +910,-inf,0.0,326,0.0,0.0,0.0,122,0.0,0.0,21,19.6,75.3,89.6,4.4,8,False,150,70,0.1 +911,-inf,0.0,1084,0.0,0.0,0.0,381,0.0,0.0,12,5.4,75.4,90.1,0.4,6,False,150,35,0.1 +912,-inf,0.0,2014,0.0,0.0,0.0,697,0.0,0.0,12,14.1,71.2,87.2,9.1,3,False,150,35,0.1 +913,-inf,0.0,1855,0.0,0.0,0.0,658,0.0,0.0,14,18.8,73.0,93.8,13.8,1,True,71,55,0.1 +914,-inf,0.0,4067,0.0,0.0,0.0,1459,0.0,0.0,14,77.6,43.8,91.9,20.6,8,True,40,70,0.1 +915,-inf,0.0,1838,0.0,0.0,0.0,650,0.0,0.0,16,69.2,45.8,89.1,41.4,6,False,90,70,0.1 +916,-inf,0.0,2145,0.0,0.0,0.0,761,0.0,0.0,16,13.5,64.4,87.0,11.5,4,False,40,20,0.1 +917,-inf,0.0,1236,0.0,0.0,0.0,414,0.0,0.0,14,20.3,74.3,94.9,15.3,6,False,90,20,0.1 +918,-inf,0.0,3644,0.0,0.0,0.0,1314,0.0,0.0,18,70.7,46.4,80.0,40.9,2,False,150,35,0.1 +919,-inf,0.0,3080,0.0,0.0,0.0,1069,0.0,0.0,12,80.5,41.9,78.9,33.3,3,False,90,35,0.1 +920,-inf,0.0,4006,0.0,0.0,0.0,1417,0.0,0.0,14,13.6,59.3,94.4,8.6,2,False,90,70,0.1 +921,-inf,0.0,6805,0.0,0.0,0.0,2500,0.0,0.0,12,76.4,51.0,80.6,21.8,3,True,55,70,0.1 +922,-inf,0.0,5111,0.0,0.0,0.0,1850,0.0,0.0,12,15.9,60.9,97.7,10.9,4,True,55,90,0.1 +923,-inf,0.0,801,0.0,0.0,0.0,274,0.0,0.0,18,73.6,43.0,88.2,47.7,12,False,150,70,0.1 +924,-inf,0.0,3604,0.0,0.0,0.0,1281,0.0,0.0,10,5.6,61.5,98.2,0.6,4,False,40,41,0.1 +925,-inf,0.0,536,0.0,0.0,0.0,186,0.0,0.0,18,21.9,77.8,85.3,16.9,2,True,71,55,0.1 +926,-inf,0.0,1875,0.0,0.0,0.0,642,0.0,0.0,18,78.8,38.5,74.6,60.9,3,False,120,41,0.1 +927,-inf,0.0,4843,0.0,0.0,0.0,1808,0.0,0.0,16,11.6,55.8,92.7,6.6,6,True,120,41,0.1 +928,-inf,0.0,5304,0.0,0.0,0.0,1841,0.0,0.0,14,75.0,38.8,73.5,54.7,1,True,40,35,0.1 +929,-inf,0.0,2402,0.0,0.0,0.0,838,0.0,0.0,10,13.4,73.3,87.8,8.4,2,False,55,90,0.1 +930,-inf,0.0,620,0.0,0.0,0.0,227,0.0,0.0,14,13.2,77.5,92.6,8.2,4,False,150,70,0.1 +931,-inf,0.0,3683,0.0,0.0,0.0,1295,0.0,0.0,10,16.5,66.3,90.4,11.5,3,False,55,90,0.1 +932,-inf,0.0,4168,0.0,0.0,0.0,1558,0.0,0.0,21,69.6,50.1,83.0,26.8,12,True,55,70,0.1 +933,-inf,0.0,808,0.0,0.0,0.0,320,0.0,0.0,18,11.0,73.7,88.1,6.0,8,True,90,70,0.1 +934,-inf,0.0,1370,0.0,0.0,0.0,497,0.0,0.0,16,11.4,72.5,97.2,6.4,1,True,55,20,0.1 +935,-inf,0.0,1773,0.0,0.0,0.0,667,0.0,0.0,21,5.4,67.1,88.1,0.4,4,True,120,20,0.1 +936,-inf,0.0,890,0.0,0.0,0.0,304,0.0,0.0,18,81.0,43.9,85.7,35.5,12,False,120,70,0.1 +937,-inf,0.0,2941,0.0,0.0,0.0,1044,0.0,0.0,10,12.9,53.6,86.6,11.5,8,False,90,70,0.1 +938,-inf,0.0,6679,0.0,0.0,0.0,2381,0.0,0.0,12,71.1,45.9,87.9,46.8,1,False,40,35,0.1 +939,-inf,0.0,1774,0.0,0.0,0.0,665,0.0,0.0,12,5.8,73.9,86.2,0.8,3,True,150,55,0.1 +940,-inf,0.0,2816,0.0,0.0,0.0,995,0.0,0.0,12,62.5,45.2,86.7,22.9,4,False,55,90,0.1 +941,-inf,0.0,5055,0.0,0.0,0.0,1672,0.0,0.0,14,77.6,46.9,84.5,22.1,1,False,120,20,0.1 +942,-inf,0.0,2247,0.0,0.0,0.0,756,0.0,0.0,12,17.6,70.0,93.4,12.6,4,False,55,55,0.1 +943,-inf,0.0,1989,0.0,0.0,0.0,712,0.0,0.0,16,10.0,65.4,95.2,5.0,4,False,40,55,0.1 +944,-inf,0.0,5087,0.0,0.0,0.0,1758,0.0,0.0,10,19.8,63.3,91.6,14.8,2,False,71,41,0.1 +945,-inf,0.0,1720,0.0,0.0,0.0,576,0.0,0.0,10,67.8,41.3,90.6,22.0,6,False,55,20,0.1 +946,-inf,0.0,3047,0.0,0.0,0.0,1075,0.0,0.0,18,80.4,44.5,85.3,26.3,2,False,120,20,0.1 +947,-inf,0.0,939,0.0,0.0,0.0,332,0.0,0.0,21,13.4,68.8,86.2,8.4,6,False,55,70,0.1 +948,-inf,0.0,4664,0.0,0.0,0.0,1685,0.0,0.0,10,11.4,54.2,95.4,6.4,3,False,90,70,0.1 +949,-inf,0.0,5774,0.0,0.0,0.0,2058,0.0,0.0,16,76.9,53.3,77.6,45.2,1,False,120,90,0.1 +950,-inf,0.0,2693,0.0,0.0,0.0,928,0.0,0.0,21,65.4,54.8,75.2,31.8,3,False,120,20,0.1 +951,-inf,0.0,7879,0.0,0.0,0.0,2794,0.0,0.0,14,64.6,39.5,85.9,20.5,1,True,150,20,0.1 +952,-inf,0.0,2600,0.0,0.0,0.0,944,0.0,0.0,18,9.6,65.1,86.8,4.6,12,True,40,35,0.1 +953,-inf,0.0,6496,0.0,0.0,0.0,2373,0.0,0.0,10,5.2,58.1,94.3,0.2,2,True,150,35,0.1 +954,-inf,0.0,1787,0.0,0.0,0.0,650,0.0,0.0,14,4.4,53.8,90.2,-0.6,12,False,71,70,0.1 +955,-inf,0.0,1278,0.0,0.0,0.0,439,0.0,0.0,14,21.7,76.0,98.2,16.7,2,False,55,41,0.1 +956,-inf,0.0,5668,0.0,0.0,0.0,2054,0.0,0.0,10,78.6,41.0,88.3,29.7,4,True,120,55,0.1 +957,-inf,0.0,4332,0.0,0.0,0.0,1569,0.0,0.0,16,77.5,57.9,75.1,58.1,2,False,55,35,0.1 +958,-inf,0.0,2286,0.0,0.0,0.0,795,0.0,0.0,10,15.1,71.4,85.1,10.1,8,False,150,20,0.1 +959,-inf,0.0,5639,0.0,0.0,0.0,2041,0.0,0.0,16,81.2,47.4,87.2,40.4,1,False,55,55,0.1 +960,-inf,0.0,8451,0.0,0.0,0.0,3113,0.0,0.0,14,68.1,52.2,89.2,56.8,2,True,40,70,0.1 +961,-inf,0.0,3723,0.0,0.0,0.0,1316,0.0,0.0,18,71.3,56.0,88.1,61.8,2,False,150,70,0.1 +962,-inf,0.0,1533,0.0,0.0,0.0,537,0.0,0.0,12,70.0,48.0,82.2,27.5,12,False,71,90,0.1 +963,-inf,0.0,1827,0.0,0.0,0.0,640,0.0,0.0,14,5.4,68.6,87.5,0.4,4,False,55,41,0.1 +964,-inf,0.0,1795,0.0,0.0,0.0,643,0.0,0.0,16,5.4,58.6,96.5,0.4,12,False,55,41,0.1 +965,-inf,0.0,4844,0.0,0.0,0.0,1744,0.0,0.0,10,11.8,65.8,94.3,6.8,1,False,40,20,0.1 +966,-inf,0.0,708,0.0,0.0,0.0,241,0.0,0.0,12,70.3,39.6,88.2,42.6,12,False,150,90,0.1 +967,-inf,0.0,1572,0.0,0.0,0.0,577,0.0,0.0,21,13.5,54.0,96.7,8.5,12,False,71,35,0.1 +968,-inf,0.0,1640,0.0,0.0,0.0,594,0.0,0.0,16,9.9,71.2,92.9,4.9,1,True,40,70,0.1 +969,-inf,0.0,1901,0.0,0.0,0.0,687,0.0,0.0,14,12.1,55.5,97.4,10.6,12,False,120,70,0.1 +970,-inf,0.0,1570,0.0,0.0,0.0,552,0.0,0.0,14,74.3,45.7,91.5,29.4,8,False,90,41,0.1 +971,-inf,0.0,2700,0.0,0.0,0.0,986,0.0,0.0,18,79.8,53.2,74.4,48.2,6,False,40,41,0.1 +972,-inf,0.0,2201,0.0,0.0,0.0,718,0.0,0.0,14,77.7,53.5,85.5,20.8,6,False,120,55,0.1 +973,-inf,0.0,1330,0.0,0.0,0.0,466,0.0,0.0,12,6.4,73.1,94.6,1.4,8,False,40,70,0.1 +974,-inf,0.0,2659,0.0,0.0,0.0,932,0.0,0.0,14,80.4,40.5,79.2,57.8,3,False,71,55,0.1 +975,-inf,0.0,1135,0.0,0.0,0.0,398,0.0,0.0,21,8.5,65.1,85.2,3.5,12,False,55,20,0.1 +976,-inf,0.0,5198,0.0,0.0,0.0,1824,0.0,0.0,18,20.6,55.6,94.8,15.6,1,False,120,55,0.1 +977,-inf,0.0,5897,0.0,0.0,0.0,2104,0.0,0.0,14,75.0,44.0,88.4,21.6,2,True,55,90,0.1 +978,-inf,0.0,2169,0.0,0.0,0.0,755,0.0,0.0,12,5.7,68.8,87.0,0.7,4,False,90,35,0.1 +979,-inf,0.0,1155,0.0,0.0,0.0,394,0.0,0.0,18,21.8,69.0,96.5,12.8,12,False,120,35,0.1 +980,-inf,0.0,3522,0.0,0.0,0.0,1284,0.0,0.0,12,71.8,53.1,82.7,30.2,4,False,40,55,0.1 +981,-inf,0.0,1533,0.0,0.0,0.0,537,0.0,0.0,18,19.7,70.7,87.9,14.7,1,False,90,70,0.1 +982,-inf,0.0,684,0.0,0.0,0.0,243,0.0,0.0,21,71.1,38.1,72.2,19.9,3,False,90,41,0.1 +983,-inf,0.0,292,0.0,0.0,0.0,117,0.0,0.0,18,7.9,77.0,91.5,2.9,8,False,120,41,0.1 +984,-inf,0.0,666,0.0,0.0,0.0,242,0.0,0.0,14,15.3,76.9,90.3,10.3,8,False,55,55,0.1 +985,-inf,0.0,1137,0.0,0.0,0.0,407,0.0,0.0,18,70.3,45.0,81.3,50.0,12,False,71,35,0.1 +986,-inf,0.0,3120,0.0,0.0,0.0,1096,0.0,0.0,16,64.8,39.1,78.3,58.2,2,False,150,90,0.1 +987,-inf,0.0,2042,0.0,0.0,0.0,710,0.0,0.0,12,66.5,44.4,72.1,30.2,12,False,150,41,0.1 +988,-inf,0.0,10470,0.0,0.0,0.0,3747,0.0,0.0,12,67.0,46.1,72.0,57.0,1,True,40,41,0.1 +989,-inf,0.0,2651,0.0,0.0,0.0,968,0.0,0.0,12,74.7,52.7,84.4,46.4,8,False,150,35,0.1 +990,-inf,0.0,7196,0.0,0.0,0.0,2584,0.0,0.0,12,8.3,53.0,92.7,8.1,1,True,40,41,0.1 +991,-inf,0.0,2364,0.0,0.0,0.0,849,0.0,0.0,10,5.2,69.3,86.2,0.2,6,False,71,41,0.1 +992,-inf,0.0,4376,0.0,0.0,0.0,1619,0.0,0.0,16,62.8,49.0,74.5,50.4,3,False,150,35,0.1 +993,-inf,0.0,1923,0.0,0.0,0.0,671,0.0,0.0,21,76.1,40.3,74.5,52.1,3,False,55,70,0.1 +994,-inf,0.0,6121,0.0,0.0,0.0,2156,0.0,0.0,10,75.7,41.9,72.9,46.2,2,False,120,41,0.1 +995,-inf,0.0,5551,0.0,0.0,0.0,1999,0.0,0.0,16,64.6,46.3,91.6,50.7,1,False,55,70,0.1 +996,-inf,0.0,1401,0.0,0.0,0.0,494,0.0,0.0,12,7.7,73.0,85.4,2.7,8,False,90,35,0.1 +997,-inf,0.0,2194,0.0,0.0,0.0,806,0.0,0.0,12,64.5,48.3,86.9,52.4,8,False,120,55,0.1 +998,-inf,0.0,2011,0.0,0.0,0.0,669,0.0,0.0,21,68.9,40.3,83.4,35.8,2,False,120,70,0.1 +999,-inf,0.0,7944,0.0,0.0,0.0,2997,0.0,0.0,10,73.9,54.2,74.9,43.2,3,True,150,90,0.1 +1000,-inf,0.0,4517,0.0,0.0,0.0,1621,0.0,0.0,10,74.0,56.7,92.0,31.4,3,False,40,20,0.1 +1001,-inf,0.0,8383,0.0,0.0,0.0,3141,0.0,0.0,10,68.3,56.1,77.6,49.8,6,True,120,20,0.1 +1002,-inf,0.0,5774,0.0,0.0,0.0,2135,0.0,0.0,16,77.1,48.9,82.5,53.4,2,True,150,41,0.1 +1003,-inf,0.0,6418,0.0,0.0,0.0,2299,0.0,0.0,16,73.2,57.1,80.5,46.9,1,True,40,20,0.1 +1004,-inf,0.0,3813,0.0,0.0,0.0,1343,0.0,0.0,10,18.6,55.0,89.2,13.6,6,False,40,35,0.1 +1005,-inf,0.0,2436,0.0,0.0,0.0,838,0.0,0.0,10,70.1,39.8,81.6,34.4,6,False,55,20,0.1 +1006,-inf,0.0,712,0.0,0.0,0.0,271,0.0,0.0,14,13.9,77.0,95.9,9.7,3,False,150,20,0.1 +1007,-inf,0.0,1963,0.0,0.0,0.0,694,0.0,0.0,10,67.1,46.7,82.5,34.7,12,False,90,35,0.1 +1008,-inf,0.0,5751,0.0,0.0,0.0,2077,0.0,0.0,16,70.0,48.1,87.1,53.7,1,False,150,90,0.1 +1009,-inf,0.0,4906,0.0,0.0,0.0,1721,0.0,0.0,21,15.1,52.4,87.7,12.9,1,False,40,20,0.1 +1010,-inf,0.0,1796,0.0,0.0,0.0,639,0.0,0.0,10,10.3,76.8,98.6,7.4,1,False,55,90,0.1 +1011,-inf,0.0,1669,0.0,0.0,0.0,582,0.0,0.0,21,77.5,41.0,73.7,41.0,4,False,55,70,0.1 +1012,-inf,0.0,2974,0.0,0.0,0.0,1062,0.0,0.0,16,7.9,56.8,89.7,2.9,4,False,120,20,0.1 +1013,-inf,0.0,964,0.0,0.0,0.0,336,0.0,0.0,16,14.3,72.3,98.0,9.3,6,False,150,90,0.1 +1014,-inf,0.0,735,0.0,0.0,0.0,230,0.0,0.0,16,71.9,38.1,89.9,27.0,8,False,71,41,0.1 +1015,-inf,0.0,894,0.0,0.0,0.0,312,0.0,0.0,12,13.8,77.5,98.9,8.8,6,False,120,41,0.1 +1016,-inf,0.0,2449,0.0,0.0,0.0,892,0.0,0.0,21,18.2,64.6,95.7,13.2,1,False,120,35,0.1 +1017,-inf,0.0,1927,0.0,0.0,0.0,690,0.0,0.0,12,12.3,53.6,87.5,7.3,12,False,90,41,0.1 +1018,-inf,0.0,3587,0.0,0.0,0.0,1271,0.0,0.0,10,14.9,57.9,88.0,9.9,6,False,150,70,0.1 +1019,-inf,0.0,3894,0.0,0.0,0.0,1354,0.0,0.0,12,17.7,60.7,94.8,12.7,3,False,150,35,0.1 +1020,-inf,0.0,5288,0.0,0.0,0.0,1946,0.0,0.0,12,77.9,47.8,82.0,55.1,12,True,40,90,0.1 +1021,-inf,0.0,1328,0.0,0.0,0.0,459,0.0,0.0,10,12.2,76.8,98.0,7.2,8,False,71,70,0.1 +1022,-inf,0.0,4336,0.0,0.0,0.0,1505,0.0,0.0,12,74.3,56.7,80.7,30.0,2,False,71,41,0.1 +1023,-inf,0.0,6497,0.0,0.0,0.0,2271,0.0,0.0,10,20.7,52.5,88.3,19.8,2,False,150,70,0.1 +1024,-inf,0.0,7235,0.0,0.0,0.0,2650,0.0,0.0,10,81.5,54.1,73.0,39.3,4,True,55,55,0.1 +1025,-inf,0.0,2621,0.0,0.0,0.0,878,0.0,0.0,16,73.5,40.6,77.7,20.9,1,False,55,55,0.1 +1026,-inf,0.0,2978,0.0,0.0,0.0,1081,0.0,0.0,12,8.6,57.0,93.8,3.6,6,False,40,41,0.1 +1027,-inf,0.0,1639,0.0,0.0,0.0,549,0.0,0.0,12,80.9,38.1,89.7,22.7,4,False,40,20,0.1 +1028,-inf,0.0,3787,0.0,0.0,0.0,1386,0.0,0.0,14,81.2,49.6,83.9,60.9,3,False,40,41,0.1 +1029,-inf,0.0,3809,0.0,0.0,0.0,1377,0.0,0.0,18,63.3,56.5,90.7,47.1,2,False,150,20,0.1 +1030,-inf,0.0,5874,0.0,0.0,0.0,2089,0.0,0.0,18,66.4,39.6,86.9,37.9,1,True,71,55,0.1 +1031,-inf,0.0,1538,0.0,0.0,0.0,531,0.0,0.0,16,19.8,68.1,95.5,14.8,8,False,90,35,0.1 +1032,-inf,0.0,2687,0.0,0.0,0.0,949,0.0,0.0,10,18.0,75.0,89.2,13.0,2,True,150,41,0.1 +1033,-inf,0.0,3510,0.0,0.0,0.0,1266,0.0,0.0,12,68.6,57.9,86.4,32.1,4,False,55,55,0.1 +1034,-inf,0.0,4208,0.0,0.0,0.0,1616,0.0,0.0,21,75.0,51.1,75.0,40.9,6,True,150,90,0.1 +1035,-inf,0.0,4107,0.0,0.0,0.0,1450,0.0,0.0,14,20.0,63.7,87.0,15.0,6,True,55,35,0.1 +1036,-inf,0.0,1903,0.0,0.0,0.0,690,0.0,0.0,16,71.5,47.7,81.7,44.8,8,False,120,70,0.1 +1037,-inf,0.0,1249,0.0,0.0,0.0,454,0.0,0.0,16,8.2,72.8,96.0,3.2,1,False,55,20,0.1 +1038,-inf,0.0,1004,0.0,0.0,0.0,360,0.0,0.0,18,20.6,72.6,98.5,15.6,2,False,150,20,0.1 +1039,-inf,0.0,3448,0.0,0.0,0.0,1241,0.0,0.0,14,17.1,52.9,97.0,12.1,4,False,71,90,0.1 +1040,-inf,0.0,2070,0.0,0.0,0.0,735,0.0,0.0,14,62.3,41.3,84.8,34.8,4,False,90,70,0.1 +1041,-inf,0.0,5238,0.0,0.0,0.0,1877,0.0,0.0,10,65.1,57.6,82.1,50.1,3,False,90,90,0.1 +1042,-inf,0.0,6143,0.0,0.0,0.0,2321,0.0,0.0,12,63.8,57.6,83.7,38.2,8,True,71,90,0.1 +1043,-inf,0.0,1985,0.0,0.0,0.0,722,0.0,0.0,12,8.1,55.5,97.9,3.1,12,False,71,70,0.1 +1044,-inf,0.0,1475,0.0,0.0,0.0,537,0.0,0.0,21,70.3,52.1,82.8,31.7,12,False,40,35,0.1 +1045,-inf,0.0,3636,0.0,0.0,0.0,1290,0.0,0.0,14,15.0,64.9,87.3,10.0,1,False,55,55,0.1 +1046,-inf,0.0,4915,0.0,0.0,0.0,1710,0.0,0.0,14,74.5,39.1,77.4,59.0,1,False,120,20,0.1 +1047,-inf,0.0,735,0.0,0.0,0.0,253,0.0,0.0,16,21.1,77.5,86.8,15.5,12,True,71,70,0.1 +1048,-inf,0.0,2644,0.0,0.0,0.0,851,0.0,0.0,12,79.7,39.4,72.5,22.9,2,False,90,35,0.1 +1049,-inf,0.0,1154,0.0,0.0,0.0,390,0.0,0.0,12,17.1,77.1,98.7,12.1,4,False,120,35,0.1 +1050,-inf,0.0,2850,0.0,0.0,0.0,983,0.0,0.0,10,79.7,40.8,75.3,57.7,8,False,120,41,0.1 +1051,-inf,0.0,497,0.0,0.0,0.0,181,0.0,0.0,21,17.3,72.7,89.5,4.1,6,False,71,41,0.1 +1052,-inf,0.0,5706,0.0,0.0,0.0,2144,0.0,0.0,21,66.4,54.2,79.9,52.8,4,True,120,55,0.1 +1053,-inf,0.0,5498,0.0,0.0,0.0,2020,0.0,0.0,14,18.5,55.9,96.8,15.3,4,True,150,41,0.1 +1054,-inf,0.0,4187,0.0,0.0,0.0,1511,0.0,0.0,16,76.1,54.5,90.4,59.9,2,False,40,41,0.1 +1055,-inf,0.0,2527,0.0,0.0,0.0,898,0.0,0.0,10,10.4,52.0,98.9,5.4,8,False,71,20,0.1 +1056,-inf,0.0,2145,0.0,0.0,0.0,765,0.0,0.0,16,75.5,47.8,73.8,54.6,12,False,120,35,0.1 +1057,-inf,0.0,2585,0.0,0.0,0.0,925,0.0,0.0,14,71.9,47.5,81.7,50.4,6,False,55,55,0.1 +1058,-inf,0.0,2742,0.0,0.0,0.0,986,0.0,0.0,14,78.5,38.1,85.9,50.7,12,True,90,70,0.1 +1059,-inf,0.0,3621,0.0,0.0,0.0,1287,0.0,0.0,12,77.1,43.7,82.4,58.7,3,False,150,55,0.1 +1060,-inf,0.0,1376,0.0,0.0,0.0,493,0.0,0.0,21,77.1,46.4,74.4,55.6,12,False,55,70,0.1 +1061,-inf,0.0,2527,0.0,0.0,0.0,875,0.0,0.0,21,13.3,61.5,91.9,8.3,2,False,150,35,0.1 +1062,-inf,0.0,1192,0.0,0.0,0.0,427,0.0,0.0,18,4.7,68.0,95.7,-0.3,8,False,55,41,0.1 +1063,-inf,0.0,6843,0.0,0.0,0.0,2455,0.0,0.0,14,78.9,49.7,86.9,22.6,1,True,120,20,0.1 +1064,-inf,0.0,1711,0.0,0.0,0.0,630,0.0,0.0,21,78.6,55.8,79.7,61.4,12,False,55,41,0.1 +1065,-inf,0.0,5809,0.0,0.0,0.0,2043,0.0,0.0,12,67.8,56.4,75.1,27.0,1,False,120,70,0.1 +1066,-inf,0.0,1826,0.0,0.0,0.0,659,0.0,0.0,12,68.0,53.3,89.5,34.8,12,False,71,20,0.1 +1067,-inf,0.0,4850,0.0,0.0,0.0,1810,0.0,0.0,14,74.8,46.9,84.8,26.1,8,True,120,41,0.1 +1068,-inf,0.0,2707,0.0,0.0,0.0,930,0.0,0.0,21,13.8,60.5,88.7,8.8,2,False,150,90,0.1 +1069,-inf,0.0,535,0.0,0.0,0.0,196,0.0,0.0,18,4.6,73.9,92.7,-0.4,8,False,90,20,0.1 +1070,-inf,0.0,3646,0.0,0.0,0.0,1300,0.0,0.0,12,11.6,66.9,89.9,6.6,1,False,120,35,0.1 +1071,-inf,0.0,1520,0.0,0.0,0.0,554,0.0,0.0,14,14.3,73.6,86.8,9.3,1,False,40,20,0.1 +1072,-inf,0.0,2313,0.0,0.0,0.0,850,0.0,0.0,10,9.7,74.5,94.6,4.7,8,True,71,41,0.1 +1073,-inf,0.0,7848,0.0,0.0,0.0,2851,0.0,0.0,10,72.7,43.8,80.5,39.9,3,True,150,41,0.1 +1074,-inf,0.0,4339,0.0,0.0,0.0,1513,0.0,0.0,10,20.7,70.0,87.2,15.7,12,True,71,20,0.1 +1075,-inf,0.0,3063,0.0,0.0,0.0,1129,0.0,0.0,16,77.1,50.7,83.7,40.5,4,False,71,55,0.1 +1076,-inf,0.0,5334,0.0,0.0,0.0,1904,0.0,0.0,10,72.7,44.9,78.7,56.3,3,False,150,35,0.1 +1077,-inf,0.0,1956,0.0,0.0,0.0,637,0.0,0.0,21,66.4,40.2,83.9,28.7,2,False,55,90,0.1 +1078,-inf,0.0,3151,0.0,0.0,0.0,1159,0.0,0.0,14,78.9,47.7,83.2,58.9,4,False,90,90,0.1 +1079,-inf,0.0,254,0.0,0.0,0.0,104,0.0,0.0,21,12.3,76.7,86.3,7.3,3,True,120,55,0.1 +1080,-inf,0.0,3911,0.0,0.0,0.0,1436,0.0,0.0,14,65.8,50.7,80.0,61.0,4,False,71,41,0.1 +1081,-inf,0.0,3471,0.0,0.0,0.0,1262,0.0,0.0,10,63.0,56.7,86.4,39.7,6,False,40,20,0.1 +1082,-inf,0.0,2329,0.0,0.0,0.0,845,0.0,0.0,10,81.2,57.1,87.0,38.1,12,False,120,41,0.1 +1083,-inf,0.0,4447,0.0,0.0,0.0,1619,0.0,0.0,21,19.5,54.3,97.2,14.5,3,True,90,70,0.1 +1084,-inf,0.0,1822,0.0,0.0,0.0,619,0.0,0.0,10,16.1,74.1,88.2,13.6,12,False,40,70,0.1 +1085,-inf,0.0,6646,0.0,0.0,0.0,2450,0.0,0.0,12,64.3,42.3,86.3,44.1,8,True,150,55,0.1 +1086,-inf,0.0,2545,0.0,0.0,0.0,910,0.0,0.0,16,4.5,55.5,87.4,-0.5,6,False,40,70,0.1 +1087,-inf,0.0,3172,0.0,0.0,0.0,1157,0.0,0.0,16,69.3,54.4,72.1,55.2,12,False,55,20,0.1 +1088,-inf,0.0,2958,0.0,0.0,0.0,1099,0.0,0.0,21,79.5,44.5,73.4,60.5,12,True,150,55,0.1 +1089,-inf,0.0,4683,0.0,0.0,0.0,1488,0.0,0.0,16,81.7,50.0,83.1,23.1,1,False,120,55,0.1 +1090,-inf,0.0,7444,0.0,0.0,0.0,2636,0.0,0.0,12,69.6,43.1,72.6,27.0,3,True,55,41,0.1 +1091,-inf,0.0,2588,0.0,0.0,0.0,918,0.0,0.0,12,66.6,39.7,82.4,50.7,4,False,120,41,0.1 +1092,-inf,0.0,4107,0.0,0.0,0.0,1487,0.0,0.0,14,74.6,43.9,85.7,23.9,12,True,90,20,0.1 +1093,-inf,0.0,2488,0.0,0.0,0.0,893,0.0,0.0,21,73.2,56.9,90.6,34.6,4,False,150,20,0.1 +1094,-inf,0.0,3256,0.0,0.0,0.0,1144,0.0,0.0,10,69.9,41.5,88.0,35.5,3,False,90,55,0.1 +1095,-inf,0.0,521,0.0,0.0,0.0,188,0.0,0.0,18,17.9,74.4,85.3,12.9,12,False,71,70,0.1 +1096,-inf,0.0,1719,0.0,0.0,0.0,602,0.0,0.0,12,4.4,69.3,94.6,-0.6,8,False,71,35,0.1 +1097,-inf,0.0,965,0.0,0.0,0.0,369,0.0,0.0,18,16.6,73.0,89.4,11.6,3,True,90,55,0.1 +1098,-inf,0.0,2665,0.0,0.0,0.0,898,0.0,0.0,14,71.1,39.1,88.0,56.1,2,False,150,70,0.1 +1099,-inf,0.0,4171,0.0,0.0,0.0,1472,0.0,0.0,14,4.8,57.7,94.1,-0.2,2,False,90,20,0.1 +1100,-inf,0.0,5250,0.0,0.0,0.0,1876,0.0,0.0,18,78.8,53.0,80.9,41.6,1,False,120,20,0.1 +1101,-inf,0.0,5008,0.0,0.0,0.0,1864,0.0,0.0,12,76.4,45.2,87.1,38.1,8,True,150,90,0.1 +1102,-inf,0.0,2733,0.0,0.0,0.0,986,0.0,0.0,10,78.0,47.5,88.5,59.3,6,False,71,55,0.1 +1103,-inf,0.0,3413,0.0,0.0,0.0,1180,0.0,0.0,10,69.3,41.3,81.1,24.2,3,False,150,20,0.1 +1104,-inf,0.0,4229,0.0,0.0,0.0,1583,0.0,0.0,21,20.8,54.8,93.8,15.8,6,True,120,55,0.1 +1105,-inf,0.0,7676,0.0,0.0,0.0,2810,0.0,0.0,14,65.7,47.5,88.7,45.2,4,True,40,70,0.1 +1106,-inf,0.0,1856,0.0,0.0,0.0,649,0.0,0.0,16,13.2,63.2,85.0,9.4,8,False,71,55,0.1 +1107,-inf,0.0,6003,0.0,0.0,0.0,2203,0.0,0.0,14,4.9,54.1,96.6,-0.1,2,True,40,41,0.1 +1108,-inf,0.0,733,0.0,0.0,0.0,263,0.0,0.0,18,13.4,71.6,92.1,8.4,12,False,40,70,0.1 +1109,-inf,0.0,5543,0.0,0.0,0.0,2042,0.0,0.0,14,16.1,55.4,97.6,6.8,4,True,55,70,0.1 +1110,-inf,0.0,2252,0.0,0.0,0.0,819,0.0,0.0,14,9.5,52.3,86.0,4.5,8,False,40,35,0.1 +1111,-inf,0.0,3885,0.0,0.0,0.0,1400,0.0,0.0,21,77.9,43.1,74.9,60.7,1,False,71,90,0.1 +1112,-inf,0.0,1807,0.0,0.0,0.0,656,0.0,0.0,16,64.4,56.4,91.7,56.4,12,False,120,90,0.1 +1113,-inf,0.0,1324,0.0,0.0,0.0,470,0.0,0.0,18,19.6,71.8,97.7,14.6,1,True,55,90,0.1 +1114,-inf,0.0,4312,0.0,0.0,0.0,1516,0.0,0.0,18,78.1,43.3,90.1,31.8,1,False,150,90,0.1 +1115,-inf,0.0,5129,0.0,0.0,0.0,1831,0.0,0.0,12,69.4,47.2,83.7,53.4,2,False,90,70,0.1 +1116,-inf,0.0,2217,0.0,0.0,0.0,764,0.0,0.0,16,81.9,41.5,72.3,53.4,4,False,150,90,0.1 +1117,-inf,0.0,6049,0.0,0.0,0.0,2211,0.0,0.0,14,16.3,54.2,89.6,5.1,2,True,40,70,0.1 +1118,-inf,0.0,2797,0.0,0.0,0.0,1021,0.0,0.0,12,10.2,64.6,97.5,8.2,4,False,71,55,0.1 +1119,-inf,0.0,5111,0.0,0.0,0.0,1864,0.0,0.0,18,67.6,44.6,82.5,55.2,8,True,40,70,0.1 +1120,-inf,0.0,2132,0.0,0.0,0.0,771,0.0,0.0,18,16.1,68.0,98.5,11.1,1,True,40,41,0.1 +1121,-inf,0.0,7378,0.0,0.0,0.0,2750,0.0,0.0,16,65.9,54.3,80.1,27.9,2,True,120,20,0.1 +1122,-inf,0.0,3643,0.0,0.0,0.0,1290,0.0,0.0,12,14.3,57.6,97.6,9.3,4,False,120,90,0.1 +1123,-inf,0.0,1582,0.0,0.0,0.0,554,0.0,0.0,21,15.7,63.4,95.0,10.7,6,False,55,20,0.1 +1124,-inf,0.0,8067,0.0,0.0,0.0,2915,0.0,0.0,10,20.5,53.2,96.9,15.5,2,True,150,35,0.1 +1125,-inf,0.0,3579,0.0,0.0,0.0,1247,0.0,0.0,21,20.3,54.5,92.8,15.3,2,False,150,41,0.1 +1126,-inf,0.0,1817,0.0,0.0,0.0,616,0.0,0.0,16,68.3,39.5,91.9,46.9,3,False,120,90,0.1 +1127,-inf,0.0,1935,0.0,0.0,0.0,702,0.0,0.0,21,66.8,44.1,80.0,47.6,4,False,120,55,0.1 +1128,-inf,0.0,4393,0.0,0.0,0.0,1633,0.0,0.0,14,15.5,60.6,94.7,10.5,6,True,150,55,0.1 +1129,-inf,0.0,2317,0.0,0.0,0.0,838,0.0,0.0,21,80.3,46.3,73.3,53.6,4,False,90,55,0.1 +1130,-inf,0.0,2305,0.0,0.0,0.0,816,0.0,0.0,18,4.6,57.9,95.5,-0.4,6,False,120,20,0.1 +1131,-inf,0.0,3779,0.0,0.0,0.0,1398,0.0,0.0,14,14.2,63.4,85.6,11.8,6,True,90,90,0.1 +1132,-inf,0.0,5514,0.0,0.0,0.0,1960,0.0,0.0,16,9.2,56.5,94.3,4.2,1,True,55,20,0.1 +1133,-inf,0.0,1328,0.0,0.0,0.0,472,0.0,0.0,18,10.6,64.7,97.6,9.2,12,False,71,70,0.1 +1134,-inf,0.0,1165,0.0,0.0,0.0,431,0.0,0.0,14,12.0,75.1,95.9,7.0,2,True,71,55,0.1 +1135,-inf,0.0,1921,0.0,0.0,0.0,655,0.0,0.0,12,76.6,40.1,88.6,23.6,4,False,150,41,0.1 +1136,-inf,0.0,1836,0.0,0.0,0.0,643,0.0,0.0,18,13.5,61.0,92.7,8.5,8,False,90,41,0.1 +1137,-inf,0.0,1754,0.0,0.0,0.0,622,0.0,0.0,16,13.1,65.6,95.2,8.1,6,False,90,41,0.1 +1138,-inf,0.0,5749,0.0,0.0,0.0,2164,0.0,0.0,10,77.4,48.2,75.3,34.6,12,True,150,35,0.1 +1139,-inf,0.0,5460,0.0,0.0,0.0,1975,0.0,0.0,21,73.3,50.4,74.8,54.6,1,False,71,55,0.1 +1140,-inf,0.0,4100,0.0,0.0,0.0,1468,0.0,0.0,21,72.5,44.4,91.8,52.0,1,False,90,41,0.1 +1141,-inf,0.0,5458,0.0,0.0,0.0,2037,0.0,0.0,12,80.1,51.4,80.7,40.0,12,True,71,70,0.1 +1142,-inf,0.0,2011,0.0,0.0,0.0,711,0.0,0.0,18,70.5,40.7,81.5,60.9,3,False,71,70,0.1 +1143,-inf,0.0,1518,0.0,0.0,0.0,515,0.0,0.0,21,70.1,38.0,74.6,37.6,4,False,71,20,0.1 +1144,-inf,0.0,2766,0.0,0.0,0.0,1003,0.0,0.0,10,76.3,47.6,87.2,39.6,6,False,120,35,0.1 +1145,-inf,0.0,2827,0.0,0.0,0.0,1011,0.0,0.0,16,68.0,42.8,80.6,61.9,3,False,55,35,0.1 +1146,-inf,0.0,6217,0.0,0.0,0.0,2227,0.0,0.0,10,75.5,43.6,91.9,38.7,8,True,120,20,0.1 +1147,-inf,0.0,4145,0.0,0.0,0.0,1525,0.0,0.0,14,74.6,50.1,80.5,54.2,3,False,90,55,0.1 +1148,-inf,0.0,2363,0.0,0.0,0.0,791,0.0,0.0,16,80.1,39.7,81.4,19.3,12,True,90,35,0.1 +1149,-inf,0.0,4140,0.0,0.0,0.0,1419,0.0,0.0,12,71.2,54.4,80.6,24.6,2,False,120,20,0.1 +1150,-inf,0.0,2128,0.0,0.0,0.0,763,0.0,0.0,12,17.0,54.9,98.6,12.0,12,False,150,70,0.1 +1151,-inf,0.0,1922,0.0,0.0,0.0,684,0.0,0.0,16,16.6,70.2,90.7,11.6,1,False,150,35,0.1 +1152,-inf,0.0,3682,0.0,0.0,0.0,1232,0.0,0.0,16,69.2,52.4,76.4,29.7,2,False,55,55,0.1 +1153,-inf,0.0,3718,0.0,0.0,0.0,1320,0.0,0.0,10,16.6,70.1,95.7,7.5,6,True,150,20,0.1 +1154,-inf,0.0,2537,0.0,0.0,0.0,893,0.0,0.0,18,8.8,63.2,85.8,3.8,2,False,71,70,0.1 +1155,-inf,0.0,2160,0.0,0.0,0.0,755,0.0,0.0,16,16.7,69.3,93.9,11.7,1,False,55,90,0.1 +1156,-inf,0.0,1572,0.0,0.0,0.0,544,0.0,0.0,16,81.7,46.7,75.1,39.7,12,False,71,41,0.1 +1157,-inf,0.0,3013,0.0,0.0,0.0,1056,0.0,0.0,14,20.1,57.4,90.9,15.1,6,False,90,41,0.1 +1158,-inf,0.0,2530,0.0,0.0,0.0,925,0.0,0.0,10,8.4,73.4,98.2,3.4,8,True,90,70,0.1 +1159,-inf,0.0,3890,0.0,0.0,0.0,1388,0.0,0.0,16,72.9,57.2,91.8,48.0,2,False,40,55,0.1 +1160,-inf,0.0,1412,0.0,0.0,0.0,493,0.0,0.0,10,10.2,76.1,98.9,5.2,6,False,90,41,0.1 +1161,-inf,0.0,3822,0.0,0.0,0.0,1324,0.0,0.0,16,18.6,62.9,91.2,13.6,1,False,71,70,0.1 +1162,-inf,0.0,2415,0.0,0.0,0.0,846,0.0,0.0,18,15.7,60.7,93.8,10.7,4,False,150,90,0.1 +1163,-inf,0.0,4064,0.0,0.0,0.0,1426,0.0,0.0,10,75.9,45.8,75.0,34.0,4,False,90,70,0.1 +1164,-inf,0.0,455,0.0,0.0,0.0,138,0.0,0.0,21,66.0,38.4,83.1,42.9,12,False,90,70,0.1 +1165,-inf,0.0,3612,0.0,0.0,0.0,1299,0.0,0.0,12,9.7,56.9,90.9,4.7,4,False,150,90,0.1 +1166,-inf,0.0,3182,0.0,0.0,0.0,1115,0.0,0.0,12,4.4,61.4,90.0,-0.6,4,False,90,70,0.1 +1167,-inf,0.0,4346,0.0,0.0,0.0,1585,0.0,0.0,12,72.5,52.5,85.5,56.8,3,False,150,90,0.1 +1168,-inf,0.0,6901,0.0,0.0,0.0,2552,0.0,0.0,18,67.6,48.6,87.1,19.0,2,True,71,41,0.1 +1169,-inf,0.0,2862,0.0,0.0,0.0,980,0.0,0.0,14,65.7,48.1,80.2,25.7,4,False,40,41,0.1 +1170,-inf,0.0,2945,0.0,0.0,0.0,1023,0.0,0.0,12,69.4,49.8,74.9,44.8,12,False,150,35,0.1 +1171,-inf,0.0,2147,0.0,0.0,0.0,804,0.0,0.0,21,21.5,66.2,97.9,16.5,2,True,120,55,0.1 +1172,-inf,0.0,2424,0.0,0.0,0.0,836,0.0,0.0,14,19.7,66.4,94.2,14.7,4,False,40,35,0.1 +1173,-inf,0.0,8644,0.0,0.0,0.0,3061,0.0,0.0,12,68.9,41.8,76.9,39.5,1,True,150,90,0.1 +1174,-inf,0.0,3950,0.0,0.0,0.0,1391,0.0,0.0,12,15.0,62.6,94.9,10.0,2,False,40,20,0.1 +1175,-inf,0.0,6049,0.0,0.0,0.0,2143,0.0,0.0,12,69.3,43.9,90.7,34.3,1,False,90,90,0.1 +1176,-inf,0.0,3648,0.0,0.0,0.0,1359,0.0,0.0,21,78.4,56.3,76.6,20.3,8,True,120,70,0.1 +1177,-inf,0.0,6063,0.0,0.0,0.0,2189,0.0,0.0,12,16.8,57.7,93.5,11.8,2,True,150,35,0.1 +1178,-inf,0.0,4730,0.0,0.0,0.0,1584,0.0,0.0,14,70.7,47.1,76.1,24.1,1,False,120,20,0.1 +1179,-inf,0.0,6173,0.0,0.0,0.0,2245,0.0,0.0,12,8.8,56.2,95.7,3.8,3,True,55,35,0.1 +1180,-inf,0.0,1057,0.0,0.0,0.0,375,0.0,0.0,16,14.1,72.2,85.4,9.1,4,False,150,55,0.1 +1181,-inf,0.0,1411,0.0,0.0,0.0,506,0.0,0.0,21,7.0,68.6,88.0,2.0,8,True,55,55,0.1 +1182,-inf,0.0,5621,0.0,0.0,0.0,1965,0.0,0.0,10,17.7,59.0,92.0,12.7,2,False,90,41,0.1 +1183,-inf,0.0,1296,0.0,0.0,0.0,434,0.0,0.0,16,67.0,39.1,81.4,32.7,6,False,150,41,0.1 +1184,-inf,0.0,5914,0.0,0.0,0.0,2163,0.0,0.0,16,63.7,51.3,79.9,38.3,1,False,71,70,0.1 +1185,-inf,0.0,1580,0.0,0.0,0.0,558,0.0,0.0,18,66.4,47.3,83.6,31.4,8,False,40,20,0.1 +1186,-inf,0.0,1673,0.0,0.0,0.0,562,0.0,0.0,14,19.3,70.6,91.9,14.3,6,False,90,20,0.1 +1187,-inf,0.0,2185,0.0,0.0,0.0,765,0.0,0.0,12,14.4,67.7,90.5,9.4,6,False,90,20,0.1 +1188,-inf,0.0,4109,0.0,0.0,0.0,1489,0.0,0.0,10,77.9,55.9,82.4,59.6,6,False,90,70,0.1 +1189,-inf,0.0,5881,0.0,0.0,0.0,2128,0.0,0.0,12,17.9,58.1,85.4,12.9,6,True,71,35,0.1 +1190,-inf,0.0,832,0.0,0.0,0.0,296,0.0,0.0,12,13.7,77.9,97.4,8.7,6,False,150,55,0.1 +1191,-inf,0.0,1914,0.0,0.0,0.0,659,0.0,0.0,16,80.5,42.0,72.9,41.6,6,False,90,41,0.1 +1192,-inf,0.0,3199,0.0,0.0,0.0,1111,0.0,0.0,14,16.5,66.8,89.0,11.5,1,False,55,55,0.1 +1193,-inf,0.0,5260,0.0,0.0,0.0,1874,0.0,0.0,18,75.9,45.3,74.4,44.2,1,False,150,90,0.1 +1194,-inf,0.0,1144,0.0,0.0,0.0,423,0.0,0.0,16,4.8,73.3,97.2,-0.2,4,True,40,41,0.1 +1195,-inf,0.0,3635,0.0,0.0,0.0,1313,0.0,0.0,16,71.4,56.1,72.1,58.1,8,False,120,41,0.1 +1196,-inf,0.0,1768,0.0,0.0,0.0,584,0.0,0.0,12,21.2,75.5,88.8,16.2,4,False,90,70,0.1 +1197,-inf,0.0,3647,0.0,0.0,0.0,1266,0.0,0.0,14,21.9,60.9,88.8,16.9,3,False,55,20,0.1 +1198,-inf,0.0,5264,0.0,0.0,0.0,1853,0.0,0.0,10,68.0,38.0,74.4,54.4,3,False,120,55,0.1 +1199,-inf,0.0,4002,0.0,0.0,0.0,1398,0.0,0.0,14,16.2,59.6,95.6,11.2,2,False,40,41,0.1 +1200,-inf,0.0,4971,0.0,0.0,0.0,1785,0.0,0.0,18,81.1,46.0,90.6,58.1,1,False,40,70,0.1 +1201,-inf,0.0,3295,0.0,0.0,0.0,1220,0.0,0.0,18,62.6,49.1,72.5,38.7,4,False,55,55,0.1 +1202,-inf,0.0,3892,0.0,0.0,0.0,1374,0.0,0.0,18,81.4,54.3,90.6,60.8,2,False,90,20,0.1 +1203,-inf,0.0,3409,0.0,0.0,0.0,1212,0.0,0.0,10,8.1,63.7,92.6,3.1,4,False,150,20,0.1 +1204,-inf,0.0,3645,0.0,0.0,0.0,1303,0.0,0.0,12,66.2,56.6,77.3,41.5,6,False,90,41,0.1 +1205,-inf,0.0,6519,0.0,0.0,0.0,2364,0.0,0.0,16,68.4,45.2,80.5,26.4,3,True,71,35,0.1 +1206,-inf,0.0,4791,0.0,0.0,0.0,1788,0.0,0.0,18,5.3,53.0,89.6,0.3,4,True,90,70,0.1 +1207,-inf,0.0,1620,0.0,0.0,0.0,555,0.0,0.0,18,73.3,38.2,81.6,47.0,3,False,40,35,0.1 +1208,-inf,0.0,9434,0.0,0.0,0.0,3394,0.0,0.0,10,64.7,39.4,72.7,42.0,2,True,120,55,0.1 +1209,-inf,0.0,736,0.0,0.0,0.0,282,0.0,0.0,14,4.4,76.7,89.3,-0.6,2,False,150,55,0.1 +1210,-inf,0.0,5778,0.0,0.0,0.0,2064,0.0,0.0,16,8.0,52.9,98.8,3.0,1,False,90,41,0.1 +1211,-inf,0.0,2406,0.0,0.0,0.0,847,0.0,0.0,12,16.2,72.3,98.6,11.2,3,True,40,70,0.1 +1212,-inf,0.0,462,0.0,0.0,0.0,170,0.0,0.0,18,15.2,75.2,86.4,10.2,4,False,90,70,0.1 +1213,-inf,0.0,4627,0.0,0.0,0.0,1642,0.0,0.0,18,5.0,57.7,93.6,0.0,1,False,71,41,0.1 +1214,-inf,0.0,5901,0.0,0.0,0.0,2159,0.0,0.0,10,14.6,60.9,95.7,9.6,8,True,71,55,0.1 +1215,-inf,0.0,535,0.0,0.0,0.0,172,0.0,0.0,21,73.1,39.4,81.6,34.0,12,False,120,35,0.1 +1216,-inf,0.0,3446,0.0,0.0,0.0,1259,0.0,0.0,14,68.1,47.9,91.5,53.8,3,False,55,90,0.1 +1217,-inf,0.0,2781,0.0,0.0,0.0,991,0.0,0.0,10,11.7,63.2,88.6,6.7,8,False,150,35,0.1 +1218,-inf,0.0,8766,0.0,0.0,0.0,3120,0.0,0.0,10,63.1,41.4,72.8,40.1,6,True,40,35,0.1 +1219,-inf,0.0,1072,0.0,0.0,0.0,376,0.0,0.0,12,13.1,76.0,94.9,8.1,6,False,150,90,0.1 +1220,-inf,0.0,3100,0.0,0.0,0.0,1054,0.0,0.0,16,69.9,39.7,77.5,49.1,2,False,71,55,0.1 +1221,-inf,0.0,2436,0.0,0.0,0.0,866,0.0,0.0,16,5.4,62.1,92.4,0.4,4,False,71,20,0.1 +1222,-inf,0.0,1357,0.0,0.0,0.0,473,0.0,0.0,21,7.0,61.8,87.6,2.0,12,False,120,70,0.1 +1223,-inf,0.0,10552,0.0,0.0,0.0,3832,0.0,0.0,10,63.1,44.2,83.6,36.3,2,True,71,90,0.1 +1224,-inf,0.0,4628,0.0,0.0,0.0,1716,0.0,0.0,21,67.1,51.8,91.4,18.5,12,True,40,41,0.1 +1225,-inf,0.0,2094,0.0,0.0,0.0,746,0.0,0.0,18,13.1,60.4,89.9,8.1,6,False,90,70,0.1 +1226,-inf,0.0,1675,0.0,0.0,0.0,593,0.0,0.0,14,80.2,46.6,90.4,53.1,8,False,55,35,0.1 +1227,-inf,0.0,3883,0.0,0.0,0.0,1368,0.0,0.0,18,7.5,54.8,97.7,2.5,2,False,150,90,0.1 +1228,-inf,0.0,1952,0.0,0.0,0.0,687,0.0,0.0,14,70.8,48.4,74.6,28.6,8,False,71,35,0.1 +1229,-inf,0.0,2459,0.0,0.0,0.0,880,0.0,0.0,12,11.7,67.2,86.0,6.7,4,False,40,20,0.1 +1230,-inf,0.0,1124,0.0,0.0,0.0,402,0.0,0.0,21,12.7,67.3,85.2,7.7,6,False,90,41,0.1 +1231,-inf,0.0,2718,0.0,0.0,0.0,957,0.0,0.0,16,72.6,44.9,73.7,50.6,6,False,55,55,0.1 +1232,-inf,0.0,2631,0.0,0.0,0.0,934,0.0,0.0,18,78.2,57.3,72.8,59.4,8,False,150,20,0.1 +1233,-inf,0.0,1421,0.0,0.0,0.0,495,0.0,0.0,21,80.2,53.0,78.6,28.6,12,False,150,90,0.1 +1234,-inf,0.0,1569,0.0,0.0,0.0,591,0.0,0.0,14,11.6,73.0,96.1,6.6,6,True,71,55,0.1 +1235,-inf,0.0,1357,0.0,0.0,0.0,485,0.0,0.0,18,71.3,49.8,83.3,30.6,12,False,40,41,0.1 +1236,-inf,0.0,2432,0.0,0.0,0.0,871,0.0,0.0,21,72.1,45.9,86.1,46.6,3,False,90,90,0.1 +1237,-inf,0.0,1398,0.0,0.0,0.0,509,0.0,0.0,16,4.8,72.3,91.0,-0.2,1,True,71,20,0.1 +1238,-inf,0.0,2213,0.0,0.0,0.0,806,0.0,0.0,18,77.2,51.2,83.9,29.0,6,False,120,55,0.1 +1239,-inf,0.0,3617,0.0,0.0,0.0,1294,0.0,0.0,12,20.3,68.2,89.8,15.3,12,True,90,90,0.1 +1240,-inf,0.0,2419,0.0,0.0,0.0,865,0.0,0.0,16,66.3,47.4,76.7,53.3,8,False,90,70,0.1 +1241,-inf,0.0,1434,0.0,0.0,0.0,501,0.0,0.0,16,7.8,70.0,89.4,2.8,3,False,90,55,0.1 +1242,-inf,0.0,4720,0.0,0.0,0.0,1735,0.0,0.0,21,75.2,46.7,78.8,56.7,2,True,90,55,0.1 +1243,-inf,0.0,547,0.0,0.0,0.0,197,0.0,0.0,14,13.2,77.7,86.5,8.2,8,False,40,70,0.1 +1244,-inf,0.0,2993,0.0,0.0,0.0,1080,0.0,0.0,12,10.9,54.0,88.0,5.9,6,False,90,55,0.1 +1245,-inf,0.0,1359,0.0,0.0,0.0,474,0.0,0.0,16,13.7,69.5,89.6,8.7,6,False,90,55,0.1 +1246,-inf,0.0,1576,0.0,0.0,0.0,506,0.0,0.0,21,64.3,47.4,77.9,25.4,6,False,120,55,0.1 +1247,-inf,0.0,522,0.0,0.0,0.0,190,0.0,0.0,21,15.1,72.3,98.6,10.1,6,False,90,41,0.1 +1248,-inf,0.0,2625,0.0,0.0,0.0,941,0.0,0.0,18,10.2,58.3,96.1,5.2,4,False,90,20,0.1 +1249,-inf,0.0,2568,0.0,0.0,0.0,895,0.0,0.0,14,17.2,65.8,98.9,12.2,3,False,40,41,0.1 +1250,-inf,0.0,12253,0.0,0.0,0.0,4435,0.0,0.0,10,64.2,51.7,75.5,49.0,1,True,71,70,0.1 +1251,-inf,0.0,3245,0.0,0.0,0.0,1162,0.0,0.0,10,17.4,72.5,93.4,11.1,4,True,120,41,0.1 +1252,-inf,0.0,1479,0.0,0.0,0.0,514,0.0,0.0,21,69.4,45.0,90.6,31.4,6,False,40,90,0.1 +1253,-inf,0.0,2216,0.0,0.0,0.0,800,0.0,0.0,12,81.1,48.4,84.4,37.5,8,False,150,20,0.1 +1254,-inf,0.0,7225,0.0,0.0,0.0,2604,0.0,0.0,10,15.5,55.8,94.5,10.5,3,True,71,41,0.1 +1255,-inf,0.0,4330,0.0,0.0,0.0,1550,0.0,0.0,10,62.0,54.0,73.8,40.0,8,False,90,55,0.1 +1256,-inf,0.0,1534,0.0,0.0,0.0,548,0.0,0.0,14,8.4,72.0,92.4,4.9,2,False,71,41,0.1 +1257,-inf,0.0,3413,0.0,0.0,0.0,1193,0.0,0.0,10,20.0,73.0,90.4,15.0,12,True,71,90,0.1 +1258,-inf,0.0,9499,0.0,0.0,0.0,3363,0.0,0.0,10,64.8,38.9,89.1,26.2,2,True,40,41,0.1 +1259,-inf,0.0,7545,0.0,0.0,0.0,2714,0.0,0.0,16,67.4,43.8,88.3,32.2,1,True,120,20,0.1 +1260,-inf,0.0,4319,0.0,0.0,0.0,1594,0.0,0.0,21,79.3,45.7,77.2,40.8,2,True,40,70,0.1 +1261,-inf,0.0,3260,0.0,0.0,0.0,1172,0.0,0.0,10,71.1,49.0,79.0,30.7,6,False,150,55,0.1 +1262,-inf,0.0,2176,0.0,0.0,0.0,769,0.0,0.0,16,14.8,58.9,95.1,9.8,8,False,40,20,0.1 +1263,-inf,0.0,363,0.0,0.0,0.0,141,0.0,0.0,21,8.3,74.8,98.0,6.8,2,False,71,55,0.1 +1264,-inf,0.0,888,0.0,0.0,0.0,297,0.0,0.0,21,70.5,41.4,90.0,61.2,8,False,120,90,0.1 +1265,-inf,0.0,6891,0.0,0.0,0.0,2453,0.0,0.0,18,65.5,42.6,87.7,20.5,1,True,71,41,0.1 +1266,-inf,0.0,2604,0.0,0.0,0.0,912,0.0,0.0,16,21.1,68.1,95.3,16.1,1,False,90,20,0.1 +1267,-inf,0.0,1745,0.0,0.0,0.0,608,0.0,0.0,18,14.7,62.3,97.9,9.7,8,False,90,41,0.1 +1268,-inf,0.0,4588,0.0,0.0,0.0,1600,0.0,0.0,10,17.0,64.2,88.2,12.0,2,False,71,20,0.1 +1269,-inf,0.0,2557,0.0,0.0,0.0,892,0.0,0.0,12,10.1,69.0,89.3,5.1,2,False,55,90,0.1 +1270,-inf,0.0,7433,0.0,0.0,0.0,2712,0.0,0.0,12,66.7,46.5,84.4,45.3,8,True,71,41,0.1 +1271,-inf,0.0,1635,0.0,0.0,0.0,576,0.0,0.0,12,13.5,71.0,88.3,8.5,8,False,40,20,0.1 +1272,-inf,0.0,5481,0.0,0.0,0.0,1928,0.0,0.0,10,64.8,42.1,74.7,40.0,3,False,71,90,0.1 +1273,-inf,0.0,819,0.0,0.0,0.0,261,0.0,0.0,18,81.1,39.6,87.8,57.0,8,False,120,35,0.1 +1274,-inf,0.0,480,0.0,0.0,0.0,178,0.0,0.0,16,13.7,77.2,97.6,8.7,2,False,55,90,0.1 +1275,-inf,0.0,2983,0.0,0.0,0.0,1053,0.0,0.0,14,19.2,55.1,95.4,14.2,6,False,150,35,0.1 +1276,-inf,0.0,2274,0.0,0.0,0.0,826,0.0,0.0,12,4.3,71.9,90.8,-0.7,1,False,55,55,0.1 +1277,-inf,0.0,4568,0.0,0.0,0.0,1621,0.0,0.0,14,75.5,41.2,80.5,61.8,6,True,55,41,0.1 +1278,-inf,0.0,2078,0.0,0.0,0.0,728,0.0,0.0,12,9.0,68.1,85.9,4.0,6,False,40,90,0.1 +1279,-inf,0.0,5060,0.0,0.0,0.0,1792,0.0,0.0,10,10.3,65.0,86.5,5.3,1,False,120,55,0.1 +1280,-inf,0.0,6664,0.0,0.0,0.0,2412,0.0,0.0,10,73.8,40.6,84.6,21.6,3,True,120,55,0.1 +1281,-inf,0.0,4147,0.0,0.0,0.0,1466,0.0,0.0,16,9.0,55.1,97.5,4.0,2,False,120,20,0.1 +1282,-inf,0.0,2002,0.0,0.0,0.0,700,0.0,0.0,16,18.7,69.8,86.1,13.7,3,True,55,90,0.1 +1283,-inf,0.0,1470,0.0,0.0,0.0,510,0.0,0.0,14,15.8,71.1,89.6,6.8,6,False,120,55,0.1 +1284,-inf,0.0,4748,0.0,0.0,0.0,1694,0.0,0.0,12,74.8,57.0,91.1,50.5,2,False,71,90,0.1 +1285,-inf,0.0,4320,0.0,0.0,0.0,1618,0.0,0.0,21,73.6,55.2,87.5,32.6,6,True,40,70,0.1 +1286,-inf,0.0,3069,0.0,0.0,0.0,1091,0.0,0.0,10,9.0,62.4,94.2,4.0,6,False,40,90,0.1 +1287,-inf,0.0,1815,0.0,0.0,0.0,651,0.0,0.0,10,9.6,76.6,98.3,5.8,1,False,40,20,0.1 +1288,-inf,0.0,4234,0.0,0.0,0.0,1519,0.0,0.0,14,78.9,45.7,76.2,37.4,2,False,40,35,0.1 +1289,-inf,0.0,2365,0.0,0.0,0.0,835,0.0,0.0,18,70.9,47.0,89.2,23.3,4,False,90,35,0.1 +1290,-inf,0.0,1360,0.0,0.0,0.0,482,0.0,0.0,18,14.7,66.5,86.6,9.7,8,False,71,55,0.1 +1291,-inf,0.0,4178,0.0,0.0,0.0,1494,0.0,0.0,21,18.5,57.8,92.3,11.7,1,False,120,70,0.1 +1292,-inf,0.0,1224,0.0,0.0,0.0,412,0.0,0.0,16,20.2,71.6,91.2,15.2,6,False,120,41,0.1 +1293,-inf,0.0,1951,0.0,0.0,0.0,717,0.0,0.0,21,66.9,54.9,85.1,58.5,8,False,71,20,0.1 +1294,-inf,0.0,3230,0.0,0.0,0.0,1127,0.0,0.0,14,78.8,50.7,83.1,26.5,3,False,40,41,0.1 +1295,-inf,0.0,1361,0.0,0.0,0.0,504,0.0,0.0,14,8.3,73.9,87.5,3.3,12,True,71,35,0.1 +1296,-inf,0.0,1588,0.0,0.0,0.0,546,0.0,0.0,14,79.7,42.7,80.6,28.2,6,False,150,20,0.1 +1297,-inf,0.0,2824,0.0,0.0,0.0,993,0.0,0.0,16,14.2,59.3,97.2,9.2,4,False,150,35,0.1 +1298,-inf,0.0,4665,0.0,0.0,0.0,1665,0.0,0.0,12,20.4,52.1,87.6,15.4,3,False,40,35,0.1 +1299,-inf,0.0,2682,0.0,0.0,0.0,965,0.0,0.0,12,14.1,56.3,88.5,9.1,8,False,90,70,0.1 +1300,-inf,0.0,3249,0.0,0.0,0.0,1130,0.0,0.0,12,19.4,65.8,93.0,14.4,3,False,150,20,0.1 +1301,-inf,0.0,2251,0.0,0.0,0.0,803,0.0,0.0,14,9.0,65.7,85.5,4.0,4,False,40,55,0.1 +1302,-inf,0.0,8898,0.0,0.0,0.0,3192,0.0,0.0,10,78.2,53.3,76.2,60.0,1,False,150,70,0.1 +1303,-inf,0.0,2768,0.0,0.0,0.0,970,0.0,0.0,16,20.0,67.5,93.9,5.4,1,True,55,90,0.1 +1304,-inf,0.0,3779,0.0,0.0,0.0,1343,0.0,0.0,18,14.5,55.6,96.0,9.5,2,False,55,41,0.1 +1305,-inf,0.0,2122,0.0,0.0,0.0,777,0.0,0.0,10,6.8,75.1,86.0,1.8,8,True,55,41,0.1 +1306,-inf,0.0,579,0.0,0.0,0.0,187,0.0,0.0,18,74.1,40.1,89.3,49.0,12,False,120,90,0.1 +1307,-inf,0.0,1058,0.0,0.0,0.0,350,0.0,0.0,18,79.2,39.8,90.1,50.7,6,False,71,90,0.1 +1308,-inf,0.0,1158,0.0,0.0,0.0,397,0.0,0.0,16,66.2,46.8,85.7,27.8,12,False,40,20,0.1 +1309,-inf,0.0,1843,0.0,0.0,0.0,676,0.0,0.0,14,6.1,55.1,95.6,1.1,12,False,120,70,0.1 +1310,-inf,0.0,2482,0.0,0.0,0.0,864,0.0,0.0,18,80.8,44.5,84.1,42.5,3,False,120,55,0.1 +1311,-inf,0.0,3578,0.0,0.0,0.0,1275,0.0,0.0,12,67.4,55.9,88.7,26.5,4,False,40,41,0.1 +1312,-inf,0.0,4916,0.0,0.0,0.0,1739,0.0,0.0,21,7.7,52.2,85.4,2.7,1,False,40,20,0.1 +1313,-inf,0.0,3048,0.0,0.0,0.0,1121,0.0,0.0,10,7.7,71.7,86.1,2.7,2,True,71,20,0.1 +1314,-inf,0.0,5375,0.0,0.0,0.0,1913,0.0,0.0,10,66.9,56.9,75.6,45.2,4,False,71,70,0.1 +1315,-inf,0.0,908,0.0,0.0,0.0,322,0.0,0.0,18,15.8,70.1,87.5,10.8,12,False,120,90,0.1 +1316,-inf,0.0,1172,0.0,0.0,0.0,385,0.0,0.0,16,20.7,72.3,99.0,19.3,6,False,71,70,0.1 +1317,-inf,0.0,1768,0.0,0.0,0.0,630,0.0,0.0,12,78.9,42.5,82.1,38.1,8,False,40,90,0.1 +1318,-inf,0.0,7978,0.0,0.0,0.0,2982,0.0,0.0,10,73.1,54.0,81.1,40.9,4,True,120,55,0.1 +1319,-inf,0.0,973,0.0,0.0,0.0,328,0.0,0.0,18,21.5,72.3,85.4,16.5,4,False,55,41,0.1 +1320,-inf,0.0,5291,0.0,0.0,0.0,1874,0.0,0.0,14,9.5,58.7,95.8,4.5,1,False,40,35,0.1 +1321,-inf,0.0,2111,0.0,0.0,0.0,785,0.0,0.0,18,76.1,50.2,75.5,40.1,8,False,150,35,0.1 +1322,-inf,0.0,291,0.0,0.0,0.0,113,0.0,0.0,21,6.7,74.9,88.7,1.7,8,False,71,35,0.1 +1323,-inf,0.0,5908,0.0,0.0,0.0,2133,0.0,0.0,18,67.4,43.0,74.4,32.5,2,True,90,35,0.1 +1324,-inf,0.0,4452,0.0,0.0,0.0,1555,0.0,0.0,12,20.4,58.4,95.8,14.4,3,False,120,41,0.1 +1325,-inf,0.0,1290,0.0,0.0,0.0,452,0.0,0.0,16,14.3,70.6,88.2,10.7,4,False,71,35,0.1 +1326,-inf,0.0,6482,0.0,0.0,0.0,2273,0.0,0.0,10,21.0,52.8,96.8,16.0,2,False,40,70,0.1 +1327,-inf,0.0,6360,0.0,0.0,0.0,2239,0.0,0.0,10,70.6,41.3,89.9,42.6,1,False,150,70,0.1 +1328,-inf,0.0,2339,0.0,0.0,0.0,846,0.0,0.0,10,4.2,64.1,85.4,-0.8,12,False,55,20,0.1 +1329,-inf,0.0,2029,0.0,0.0,0.0,709,0.0,0.0,21,70.7,53.9,79.9,29.3,6,False,150,70,0.1 +1330,-inf,0.0,3198,0.0,0.0,0.0,1142,0.0,0.0,16,11.2,58.4,94.3,5.9,3,False,40,55,0.1 +1331,-inf,0.0,912,0.0,0.0,0.0,314,0.0,0.0,16,17.7,73.8,87.0,16.7,4,False,120,55,0.1 +1332,-inf,0.0,1976,0.0,0.0,0.0,575,0.0,0.0,21,80.9,54.4,78.4,23.2,4,False,150,55,0.1 +1333,-inf,0.0,3600,0.0,0.0,0.0,1314,0.0,0.0,12,4.4,53.5,93.1,-0.6,4,False,150,70,0.1 +1334,-inf,0.0,2209,0.0,0.0,0.0,800,0.0,0.0,18,18.1,67.8,87.3,13.1,1,True,90,41,0.1 +1335,-inf,0.0,5576,0.0,0.0,0.0,1977,0.0,0.0,10,77.9,55.7,77.4,38.0,2,False,55,20,0.1 +1336,-inf,0.0,3304,0.0,0.0,0.0,1177,0.0,0.0,18,14.2,54.5,97.1,9.2,3,False,150,70,0.1 +1337,-inf,0.0,998,0.0,0.0,0.0,358,0.0,0.0,18,10.1,69.8,96.1,10.0,8,False,71,35,0.1 +1338,-inf,0.0,1332,0.0,0.0,0.0,473,0.0,0.0,12,15.5,76.2,88.5,10.5,2,False,150,90,0.1 +1339,-inf,0.0,885,0.0,0.0,0.0,296,0.0,0.0,16,21.9,76.9,92.6,16.9,1,True,55,55,0.1 +1340,-inf,0.0,8856,0.0,0.0,0.0,3193,0.0,0.0,10,66.8,43.3,80.4,25.4,4,True,40,35,0.1 +1341,-inf,0.0,2058,0.0,0.0,0.0,726,0.0,0.0,16,63.0,47.6,89.8,45.0,6,False,90,70,0.1 +1342,-inf,0.0,3360,0.0,0.0,0.0,1215,0.0,0.0,10,5.0,56.1,87.0,-0.0,6,False,55,35,0.1 +1343,-inf,0.0,1655,0.0,0.0,0.0,587,0.0,0.0,14,12.7,71.6,94.5,7.7,2,False,71,20,0.1 +1344,-inf,0.0,1584,0.0,0.0,0.0,557,0.0,0.0,14,10.5,70.5,88.6,5.5,4,False,55,20,0.1 +1345,-inf,0.0,2305,0.0,0.0,0.0,793,0.0,0.0,16,67.0,42.5,89.7,28.4,3,False,90,20,0.1 +1346,-inf,0.0,7286,0.0,0.0,0.0,2687,0.0,0.0,10,79.3,56.5,86.1,27.9,2,True,120,70,0.1 +1347,-inf,0.0,3257,0.0,0.0,0.0,1172,0.0,0.0,18,64.8,53.9,85.5,35.9,3,False,55,90,0.1 +1348,-inf,0.0,1310,0.0,0.0,0.0,463,0.0,0.0,14,69.0,47.6,88.5,53.4,12,False,55,90,0.1 +1349,-inf,0.0,2569,0.0,0.0,0.0,871,0.0,0.0,12,20.8,67.9,97.2,14.0,6,False,71,41,0.1 +1350,-inf,0.0,2646,0.0,0.0,0.0,965,0.0,0.0,21,70.9,51.8,85.8,37.3,4,False,71,41,0.1 +1351,-inf,0.0,2083,0.0,0.0,0.0,755,0.0,0.0,12,78.5,56.1,85.8,35.1,12,False,71,90,0.1 +1352,-inf,0.0,2268,0.0,0.0,0.0,825,0.0,0.0,12,8.7,72.0,96.5,3.7,1,False,90,70,0.1 +1353,-inf,0.0,1735,0.0,0.0,0.0,609,0.0,0.0,21,5.3,63.5,97.5,0.3,4,False,90,90,0.1 +1354,-inf,0.0,3001,0.0,0.0,0.0,1063,0.0,0.0,18,80.8,43.9,91.8,18.3,2,False,71,41,0.1 +1355,-inf,0.0,3093,0.0,0.0,0.0,1108,0.0,0.0,12,7.4,62.0,95.1,2.4,4,False,55,41,0.1 +1356,-inf,0.0,347,0.0,0.0,0.0,129,0.0,0.0,18,18.2,77.7,94.4,13.2,4,False,71,41,0.1 +1357,-inf,0.0,3983,0.0,0.0,0.0,1418,0.0,0.0,21,10.0,58.7,89.1,5.0,1,True,150,20,0.1 +1358,-inf,0.0,998,0.0,0.0,0.0,354,0.0,0.0,21,11.6,68.9,94.5,6.6,4,False,150,55,0.1 +1359,-inf,0.0,4250,0.0,0.0,0.0,1472,0.0,0.0,14,72.8,48.6,87.1,25.7,2,False,150,20,0.1 +1360,-inf,0.0,5322,0.0,0.0,0.0,1889,0.0,0.0,12,6.1,60.9,98.2,1.1,1,False,120,41,0.1 +1361,-inf,0.0,1607,0.0,0.0,0.0,551,0.0,0.0,16,20.6,65.6,89.3,15.6,12,False,120,55,0.1 +1362,-inf,0.0,1097,0.0,0.0,0.0,360,0.0,0.0,18,65.3,43.7,73.8,19.3,6,False,40,55,0.1 +1363,-inf,0.0,3083,0.0,0.0,0.0,1073,0.0,0.0,12,21.1,56.5,96.4,16.1,8,False,120,20,0.1 +1364,-inf,0.0,5588,0.0,0.0,0.0,1956,0.0,0.0,16,21.6,57.2,87.8,16.6,1,True,120,35,0.1 +1365,-inf,0.0,5680,0.0,0.0,0.0,2122,0.0,0.0,16,71.5,52.2,82.3,32.8,6,True,71,70,0.1 +1366,-inf,0.0,1565,0.0,0.0,0.0,574,0.0,0.0,21,10.4,53.9,92.7,5.4,12,False,150,70,0.1 +1367,-inf,0.0,4065,0.0,0.0,0.0,1486,0.0,0.0,21,77.2,44.6,91.8,50.4,2,True,40,90,0.1 +1368,-inf,0.0,2865,0.0,0.0,0.0,1002,0.0,0.0,10,14.7,65.6,86.5,9.7,8,False,40,70,0.1 +1369,-inf,0.0,3696,0.0,0.0,0.0,1325,0.0,0.0,18,7.6,56.3,93.2,2.6,2,False,150,41,0.1 +1370,-inf,0.0,2555,0.0,0.0,0.0,910,0.0,0.0,10,13.0,74.3,95.2,8.0,1,False,55,20,0.1 +1371,-inf,0.0,2283,0.0,0.0,0.0,812,0.0,0.0,18,10.5,62.8,94.2,5.5,3,False,90,55,0.1 +1372,-inf,0.0,3360,0.0,0.0,0.0,1200,0.0,0.0,10,66.9,45.7,86.8,30.7,4,False,40,55,0.1 +1373,-inf,0.0,3330,0.0,0.0,0.0,1201,0.0,0.0,12,76.2,49.1,89.5,47.8,4,False,90,41,0.1 +1374,-inf,0.0,4492,0.0,0.0,0.0,1587,0.0,0.0,14,62.8,49.5,91.8,35.8,2,False,120,35,0.1 +1375,-inf,0.0,3768,0.0,0.0,0.0,1372,0.0,0.0,12,14.1,66.0,93.9,9.1,4,True,90,90,0.1 +1376,-inf,0.0,4212,0.0,0.0,0.0,1483,0.0,0.0,12,5.0,60.4,89.9,-0.0,2,False,120,41,0.1 +1377,-inf,0.0,2407,0.0,0.0,0.0,891,0.0,0.0,12,62.3,48.0,84.7,57.3,8,False,55,70,0.1 +1378,-inf,0.0,1754,0.0,0.0,0.0,599,0.0,0.0,14,77.1,47.7,90.5,20.1,8,False,120,70,0.1 +1379,-inf,0.0,5066,0.0,0.0,0.0,1888,0.0,0.0,16,12.9,52.4,85.5,7.9,6,True,40,70,0.1 +1380,-inf,0.0,3213,0.0,0.0,0.0,1165,0.0,0.0,16,67.6,48.0,74.5,55.1,6,False,120,90,0.1 +1381,-inf,0.0,4759,0.0,0.0,0.0,1684,0.0,0.0,12,21.1,52.5,87.3,16.1,3,False,120,55,0.1 +1382,-inf,0.0,2903,0.0,0.0,0.0,1041,0.0,0.0,16,66.9,45.3,83.7,39.9,3,False,71,90,0.1 +1383,-inf,0.0,1277,0.0,0.0,0.0,446,0.0,0.0,18,18.2,68.8,98.2,13.2,6,False,40,35,0.1 +1384,-inf,0.0,2243,0.0,0.0,0.0,776,0.0,0.0,10,75.0,38.3,81.2,23.1,4,False,150,35,0.1 +1385,-inf,0.0,1020,0.0,0.0,0.0,365,0.0,0.0,12,6.3,76.3,93.0,1.3,4,False,71,41,0.1 +1386,-inf,0.0,3799,0.0,0.0,0.0,1421,0.0,0.0,12,7.6,64.9,90.5,2.6,6,True,150,90,0.1 +1387,-inf,0.0,4154,0.0,0.0,0.0,1509,0.0,0.0,16,67.1,44.6,78.7,61.9,2,False,71,90,0.1 +1388,-inf,0.0,3980,0.0,0.0,0.0,1357,0.0,0.0,14,66.1,38.8,91.4,58.2,1,False,90,70,0.1 +1389,-inf,0.0,1444,0.0,0.0,0.0,484,0.0,0.0,12,18.2,75.0,95.0,13.2,6,False,150,35,0.1 +1390,-inf,0.0,865,0.0,0.0,0.0,304,0.0,0.0,14,13.9,75.2,95.7,8.9,6,False,40,20,0.1 +1391,-inf,0.0,1812,0.0,0.0,0.0,639,0.0,0.0,18,19.4,67.0,88.7,14.8,3,False,55,35,0.1 +1392,-inf,0.0,4070,0.0,0.0,0.0,1441,0.0,0.0,12,12.1,61.8,87.6,7.1,2,False,71,90,0.1 +1393,-inf,0.0,4073,0.0,0.0,0.0,1431,0.0,0.0,14,20.9,64.5,89.8,5.8,1,False,40,35,0.1 +1394,-inf,0.0,5845,0.0,0.0,0.0,2143,0.0,0.0,10,15.1,61.1,95.3,10.1,6,True,90,70,0.1 +1395,-inf,0.0,2409,0.0,0.0,0.0,846,0.0,0.0,16,11.7,65.6,87.4,6.7,2,False,120,90,0.1 +1396,-inf,0.0,455,0.0,0.0,0.0,175,0.0,0.0,18,8.6,76.0,85.8,3.6,8,True,71,55,0.1 +1397,-inf,0.0,2475,0.0,0.0,0.0,896,0.0,0.0,12,6.0,53.9,91.3,1.0,8,False,71,55,0.1 +1398,-inf,0.0,1102,0.0,0.0,0.0,388,0.0,0.0,21,7.7,68.6,86.8,2.7,3,False,71,70,0.1 +1399,-inf,0.0,1415,0.0,0.0,0.0,496,0.0,0.0,21,4.2,63.7,87.1,-0.8,8,False,150,70,0.1 +1400,-inf,0.0,4235,0.0,0.0,0.0,1498,0.0,0.0,16,66.5,51.0,89.3,50.1,2,False,120,35,0.1 +1401,-inf,0.0,2319,0.0,0.0,0.0,821,0.0,0.0,18,21.2,59.8,94.4,16.2,6,False,40,20,0.1 +1402,-inf,0.0,3124,0.0,0.0,0.0,1121,0.0,0.0,16,6.0,64.8,92.4,1.0,1,False,150,90,0.1 +1403,-inf,0.0,4019,0.0,0.0,0.0,1409,0.0,0.0,18,18.9,52.8,88.3,5.4,2,False,120,20,0.1 +1404,-inf,0.0,2767,0.0,0.0,0.0,988,0.0,0.0,14,11.8,61.8,93.7,6.8,4,False,150,41,0.1 +1405,-inf,0.0,4985,0.0,0.0,0.0,1777,0.0,0.0,12,14.9,62.7,98.7,9.9,1,False,71,41,0.1 +1406,-inf,0.0,9402,0.0,0.0,0.0,3497,0.0,0.0,12,65.0,48.5,74.7,56.8,3,True,150,41,0.1 +1407,-inf,0.0,2682,0.0,0.0,0.0,936,0.0,0.0,14,21.5,70.0,85.5,11.1,4,True,90,41,0.1 +1408,-inf,0.0,1056,0.0,0.0,0.0,392,0.0,0.0,21,6.9,70.0,96.6,1.9,12,True,150,90,0.1 +1409,-inf,0.0,1874,0.0,0.0,0.0,649,0.0,0.0,18,70.4,43.5,86.9,28.1,4,False,150,41,0.1 +1410,-inf,0.0,6122,0.0,0.0,0.0,2214,0.0,0.0,10,76.0,43.3,82.5,49.4,8,True,40,70,0.1 +1411,-inf,0.0,2898,0.0,0.0,0.0,998,0.0,0.0,18,19.3,61.9,97.0,16.1,2,False,120,41,0.1 +1412,-inf,0.0,415,0.0,0.0,0.0,155,0.0,0.0,18,17.7,77.4,90.9,12.7,6,True,90,70,0.1 +1413,-inf,0.0,1105,0.0,0.0,0.0,343,0.0,0.0,16,81.2,47.6,80.9,19.3,6,False,40,90,0.1 +1414,-inf,0.0,3964,0.0,0.0,0.0,1468,0.0,0.0,18,6.1,59.0,97.4,1.1,4,True,150,20,0.1 +1415,-inf,0.0,2645,0.0,0.0,0.0,937,0.0,0.0,16,17.6,56.0,97.9,12.6,6,False,55,55,0.1 +1416,-inf,0.0,5355,0.0,0.0,0.0,1890,0.0,0.0,16,80.7,55.8,84.3,40.9,1,False,150,90,0.1 +1417,-inf,0.0,1784,0.0,0.0,0.0,627,0.0,0.0,14,14.0,71.1,93.2,9.0,2,False,150,20,0.1 +1418,-inf,0.0,5196,0.0,0.0,0.0,1864,0.0,0.0,12,11.9,61.8,89.1,6.9,1,False,150,41,0.1 +1419,-inf,0.0,1756,0.0,0.0,0.0,616,0.0,0.0,18,15.5,69.2,90.6,4.5,1,False,150,35,0.1 +1420,-inf,0.0,6580,0.0,0.0,0.0,2406,0.0,0.0,14,75.2,51.1,79.0,53.0,4,True,40,55,0.1 +1421,-inf,0.0,2800,0.0,0.0,0.0,986,0.0,0.0,14,8.7,65.2,97.7,3.7,2,False,55,35,0.1 +1422,-inf,0.0,2207,0.0,0.0,0.0,760,0.0,0.0,21,71.7,41.1,81.8,55.2,2,False,90,35,0.1 +1423,-inf,0.0,3416,0.0,0.0,0.0,1204,0.0,0.0,21,69.2,40.2,91.5,57.2,6,True,55,41,0.1 +1424,-inf,0.0,5053,0.0,0.0,0.0,1811,0.0,0.0,12,11.8,52.2,93.1,6.8,2,False,71,35,0.1 +1425,-inf,0.0,2612,0.0,0.0,0.0,955,0.0,0.0,12,76.3,56.7,83.5,33.9,8,False,40,20,0.1 +1426,-inf,0.0,1595,0.0,0.0,0.0,574,0.0,0.0,12,9.7,73.4,85.1,4.7,3,False,150,90,0.1 +1427,-inf,0.0,6383,0.0,0.0,0.0,2285,0.0,0.0,12,17.4,56.4,97.3,12.4,2,True,120,35,0.1 +1428,-inf,0.0,6076,0.0,0.0,0.0,2189,0.0,0.0,16,73.0,58.0,86.1,41.2,1,True,40,90,0.1 +1429,-inf,0.0,2499,0.0,0.0,0.0,897,0.0,0.0,21,7.1,56.8,95.4,2.1,4,False,90,90,0.1 +1430,-inf,0.0,3976,0.0,0.0,0.0,1460,0.0,0.0,16,9.7,60.8,88.5,4.7,3,True,150,20,0.1 +1431,-inf,0.0,4021,0.0,0.0,0.0,1404,0.0,0.0,12,21.3,68.0,94.1,13.8,2,True,40,55,0.1 +1432,-inf,0.0,1047,0.0,0.0,0.0,344,0.0,0.0,14,66.0,39.5,83.9,22.2,8,False,55,41,0.1 +1433,-inf,0.0,2635,0.0,0.0,0.0,922,0.0,0.0,12,17.5,53.0,94.9,10.3,8,False,40,35,0.1 +1434,-inf,0.0,279,0.0,0.0,0.0,111,0.0,0.0,21,9.4,75.7,97.7,4.4,3,False,120,55,0.1 +1435,-inf,0.0,1011,0.0,0.0,0.0,348,0.0,0.0,14,21.0,77.0,88.6,16.0,4,False,40,41,0.1 +1436,-inf,0.0,1295,0.0,0.0,0.0,446,0.0,0.0,14,13.0,71.9,95.3,8.0,6,False,40,55,0.1 +1437,-inf,0.0,321,0.0,0.0,0.0,124,0.0,0.0,21,9.9,74.6,97.7,4.9,6,False,120,41,0.1 +1438,-inf,0.0,1158,0.0,0.0,0.0,419,0.0,0.0,18,21.2,72.7,93.0,16.2,12,True,71,35,0.1 +1439,-inf,0.0,1249,0.0,0.0,0.0,428,0.0,0.0,12,14.5,74.6,87.5,9.5,8,False,120,41,0.1 +1440,-inf,0.0,3345,0.0,0.0,0.0,1206,0.0,0.0,14,10.0,55.1,88.7,5.0,4,False,150,55,0.1 +1441,-inf,0.0,6547,0.0,0.0,0.0,2447,0.0,0.0,10,77.3,47.9,78.7,37.0,8,True,120,35,0.1 +1442,-inf,0.0,724,0.0,0.0,0.0,222,0.0,0.0,18,76.5,41.1,76.9,20.3,4,False,71,20,0.1 +1443,-inf,0.0,3174,0.0,0.0,0.0,1152,0.0,0.0,21,9.7,60.4,96.9,4.7,8,True,150,20,0.1 +1444,-inf,0.0,3893,0.0,0.0,0.0,1367,0.0,0.0,16,66.0,55.4,79.0,31.6,2,False,150,70,0.1 +1445,-inf,0.0,2626,0.0,0.0,0.0,924,0.0,0.0,12,20.8,73.1,91.1,15.8,4,True,90,70,0.1 +1446,-inf,0.0,2975,0.0,0.0,0.0,1100,0.0,0.0,12,62.4,52.0,82.8,56.8,8,False,150,20,0.1 +1447,-inf,0.0,1497,0.0,0.0,0.0,505,0.0,0.0,16,73.0,41.0,81.6,23.7,4,False,55,20,0.1 +1448,-inf,0.0,3955,0.0,0.0,0.0,1467,0.0,0.0,12,63.1,51.2,82.7,44.3,4,False,120,41,0.1 +1449,-inf,0.0,5655,0.0,0.0,0.0,2063,0.0,0.0,16,67.0,57.9,86.4,38.7,6,True,71,41,0.1 +1450,-inf,0.0,4986,0.0,0.0,0.0,1778,0.0,0.0,10,77.0,52.4,75.4,54.5,6,False,40,20,0.1 +1451,-inf,0.0,1678,0.0,0.0,0.0,592,0.0,0.0,12,7.9,71.9,95.7,2.9,4,False,55,35,0.1 +1452,-inf,0.0,1015,0.0,0.0,0.0,365,0.0,0.0,18,8.7,71.1,96.7,3.7,3,False,71,55,0.1 +1453,-inf,0.0,2225,0.0,0.0,0.0,785,0.0,0.0,10,13.6,56.0,96.8,8.6,12,False,55,90,0.1 +1454,-inf,0.0,3584,0.0,0.0,0.0,1247,0.0,0.0,12,21.5,65.4,85.2,16.5,3,False,90,55,0.1 +1455,-inf,0.0,1188,0.0,0.0,0.0,415,0.0,0.0,14,66.2,40.9,79.5,34.2,12,False,71,90,0.1 +1456,-inf,0.0,1786,0.0,0.0,0.0,656,0.0,0.0,16,12.3,55.0,98.5,7.3,12,False,71,55,0.1 +1457,-inf,0.0,2562,0.0,0.0,0.0,861,0.0,0.0,21,75.1,38.3,84.3,32.5,1,False,150,35,0.1 +1458,-inf,0.0,1573,0.0,0.0,0.0,576,0.0,0.0,21,64.2,44.8,76.2,42.3,8,False,150,70,0.1 +1459,-inf,0.0,3206,0.0,0.0,0.0,1160,0.0,0.0,10,6.7,60.2,91.6,1.7,6,False,120,55,0.1 +1460,-inf,0.0,1582,0.0,0.0,0.0,524,0.0,0.0,18,67.0,39.0,89.0,26.2,3,False,150,90,0.1 +1461,-inf,0.0,2124,0.0,0.0,0.0,770,0.0,0.0,14,7.5,62.4,93.4,2.5,8,False,90,55,0.1 +1462,-inf,0.0,1956,0.0,0.0,0.0,679,0.0,0.0,14,14.4,68.1,95.0,5.8,4,False,40,90,0.1 +1463,-inf,0.0,2543,0.0,0.0,0.0,896,0.0,0.0,21,6.9,59.0,92.8,1.9,3,False,71,55,0.1 +1464,-inf,0.0,1183,0.0,0.0,0.0,416,0.0,0.0,21,73.7,43.1,74.5,45.5,12,False,40,20,0.1 +1465,-inf,0.0,4479,0.0,0.0,0.0,1561,0.0,0.0,18,66.9,43.9,89.2,30.0,1,False,40,90,0.1 +1466,-inf,0.0,656,0.0,0.0,0.0,265,0.0,0.0,21,7.6,72.7,96.0,2.6,2,True,55,90,0.1 +1467,-inf,0.0,4353,0.0,0.0,0.0,1561,0.0,0.0,10,79.4,52.7,73.9,51.9,8,False,120,41,0.1 +1468,-inf,0.0,3574,0.0,0.0,0.0,1261,0.0,0.0,18,77.3,44.4,78.4,20.5,6,True,40,70,0.1 +1469,-inf,0.0,2628,0.0,0.0,0.0,924,0.0,0.0,10,17.5,61.0,92.1,12.5,12,False,150,35,0.1 +1470,-inf,0.0,5271,0.0,0.0,0.0,1973,0.0,0.0,12,15.0,58.4,86.0,10.0,6,True,150,90,0.1 +1471,-inf,0.0,7690,0.0,0.0,0.0,2929,0.0,0.0,10,63.4,53.0,74.9,20.6,6,True,150,90,0.1 +1472,-inf,0.0,5558,0.0,0.0,0.0,1973,0.0,0.0,12,62.3,41.0,72.9,35.9,2,False,120,20,0.1 +1473,-inf,0.0,1107,0.0,0.0,0.0,383,0.0,0.0,18,10.5,70.5,85.8,5.5,3,False,90,35,0.1 +1474,-inf,0.0,2937,0.0,0.0,0.0,1089,0.0,0.0,18,82.0,49.0,74.3,47.4,4,False,90,20,0.1 +1475,-inf,0.0,3685,0.0,0.0,0.0,1318,0.0,0.0,18,19.3,60.7,95.3,14.3,6,True,90,55,0.1 +1476,-inf,0.0,2590,0.0,0.0,0.0,914,0.0,0.0,21,16.6,63.9,91.6,11.6,1,False,55,35,0.1 +1477,-inf,0.0,2826,0.0,0.0,0.0,1024,0.0,0.0,12,80.9,53.4,83.8,30.5,6,False,55,35,0.1 +1478,-inf,0.0,1240,0.0,0.0,0.0,427,0.0,0.0,12,14.8,75.1,93.3,9.8,6,False,40,55,0.1 +1479,-inf,0.0,3785,0.0,0.0,0.0,1347,0.0,0.0,12,14.4,67.0,91.5,9.4,1,True,120,90,0.1 +1480,-inf,0.0,728,0.0,0.0,0.0,269,0.0,0.0,16,13.0,75.8,91.5,8.0,1,True,55,35,0.1 +1481,-inf,0.0,4087,0.0,0.0,0.0,1432,0.0,0.0,10,15.5,63.5,98.0,13.5,3,False,150,41,0.1 +1482,-inf,0.0,1561,0.0,0.0,0.0,543,0.0,0.0,16,20.1,68.0,94.0,15.1,8,False,55,70,0.1 +1483,-inf,0.0,3638,0.0,0.0,0.0,1295,0.0,0.0,16,18.4,53.5,87.5,13.4,3,False,150,55,0.1 +1484,-inf,0.0,1104,0.0,0.0,0.0,391,0.0,0.0,16,6.9,71.1,89.6,1.9,6,False,55,55,0.1 +1485,-inf,0.0,3627,0.0,0.0,0.0,1296,0.0,0.0,21,16.9,58.9,87.4,11.9,3,True,71,70,0.1 +1486,-inf,0.0,5884,0.0,0.0,0.0,2174,0.0,0.0,16,71.7,55.3,74.6,35.8,4,True,71,55,0.1 +1487,-inf,0.0,1916,0.0,0.0,0.0,665,0.0,0.0,16,80.4,42.0,73.4,54.7,6,False,71,90,0.1 +1488,-inf,0.0,1010,0.0,0.0,0.0,384,0.0,0.0,16,4.4,73.9,91.0,-0.6,4,True,71,90,0.1 +1489,-inf,0.0,906,0.0,0.0,0.0,314,0.0,0.0,12,14.7,77.6,92.2,9.7,6,False,150,20,0.1 +1490,-inf,0.0,1321,0.0,0.0,0.0,473,0.0,0.0,12,12.8,72.5,91.6,7.8,12,False,40,41,0.1 +1491,-inf,0.0,3395,0.0,0.0,0.0,1260,0.0,0.0,16,65.8,49.2,84.1,42.3,3,False,55,90,0.1 +1492,-inf,0.0,1334,0.0,0.0,0.0,475,0.0,0.0,21,62.8,50.0,91.0,57.9,12,False,150,90,0.1 +1493,-inf,0.0,6203,0.0,0.0,0.0,2339,0.0,0.0,14,74.3,48.3,90.1,52.4,4,True,120,70,0.1 +1494,-inf,0.0,1480,0.0,0.0,0.0,478,0.0,0.0,12,81.3,38.2,79.3,26.3,6,False,90,41,0.1 +1495,-inf,0.0,3688,0.0,0.0,0.0,1270,0.0,0.0,12,65.1,40.1,81.5,25.4,2,False,55,70,0.1 +1496,-inf,0.0,4464,0.0,0.0,0.0,1592,0.0,0.0,14,12.1,55.7,96.3,12.0,2,False,150,35,0.1 +1497,-inf,0.0,2579,0.0,0.0,0.0,932,0.0,0.0,10,12.9,74.0,85.2,7.9,8,True,55,41,0.1 +1498,-inf,0.0,8746,0.0,0.0,0.0,3187,0.0,0.0,10,65.5,47.8,86.6,44.4,8,True,55,41,0.1 +1499,-inf,0.0,5516,0.0,0.0,0.0,2011,0.0,0.0,10,80.0,44.0,73.0,45.9,8,True,150,55,0.1 +1500,-inf,0.0,2439,0.0,0.0,0.0,878,0.0,0.0,18,69.6,52.4,72.3,48.6,12,False,90,90,0.1 +1501,-inf,0.0,1073,0.0,0.0,0.0,374,0.0,0.0,16,17.6,71.6,96.2,12.6,8,False,40,90,0.1 +1502,-inf,0.0,3310,0.0,0.0,0.0,1163,0.0,0.0,14,62.3,39.1,75.8,42.4,3,False,150,41,0.1 +1503,-inf,0.0,2036,0.0,0.0,0.0,687,0.0,0.0,16,70.1,55.4,82.8,26.6,8,False,71,70,0.1 +1504,-inf,0.0,829,0.0,0.0,0.0,261,0.0,0.0,21,67.7,38.5,85.8,34.6,6,False,90,90,0.1 +1505,-inf,0.0,529,0.0,0.0,0.0,204,0.0,0.0,18,12.7,75.0,92.5,7.7,2,False,55,55,0.1 +1506,-inf,0.0,3100,0.0,0.0,0.0,817,0.0,0.0,18,80.3,52.4,79.3,21.4,1,False,120,35,0.1 +1507,-inf,0.0,3803,0.0,0.0,0.0,1309,0.0,0.0,12,74.1,57.7,76.7,27.7,2,False,55,55,0.1 +1508,-inf,0.0,391,0.0,0.0,0.0,149,0.0,0.0,21,13.0,73.1,95.8,6.0,12,False,71,90,0.1 +1509,-inf,0.0,1922,0.0,0.0,0.0,692,0.0,0.0,16,19.5,55.5,88.6,14.5,12,False,40,55,0.1 +1510,-inf,0.0,6918,0.0,0.0,0.0,2612,0.0,0.0,10,70.0,56.9,73.0,37.9,12,True,71,55,0.1 +1511,-inf,0.0,2058,0.0,0.0,0.0,718,0.0,0.0,10,13.2,74.1,85.2,8.2,4,False,55,20,0.1 +1512,-inf,0.0,1863,0.0,0.0,0.0,694,0.0,0.0,21,21.3,67.0,93.9,14.8,8,True,150,35,0.1 +1513,-inf,0.0,3360,0.0,0.0,0.0,1130,0.0,0.0,21,71.3,52.2,73.2,28.3,1,False,120,90,0.1 +1514,-inf,0.0,5022,0.0,0.0,0.0,1789,0.0,0.0,14,72.7,39.3,75.3,50.7,3,True,40,41,0.1 +1515,-inf,0.0,2577,0.0,0.0,0.0,917,0.0,0.0,12,76.8,49.9,91.7,19.4,6,False,40,20,0.1 +1516,-inf,0.0,2415,0.0,0.0,0.0,850,0.0,0.0,10,15.8,65.4,97.3,10.8,12,False,150,20,0.1 +1517,-inf,0.0,2666,0.0,0.0,0.0,970,0.0,0.0,16,9.8,65.9,88.0,4.8,4,True,150,90,0.1 +1518,-inf,0.0,1606,0.0,0.0,0.0,572,0.0,0.0,18,11.4,60.4,95.4,8.7,12,False,150,70,0.1 +1519,-inf,0.0,2126,0.0,0.0,0.0,752,0.0,0.0,18,68.9,57.8,81.6,47.6,8,False,55,90,0.1 +1520,-inf,0.0,1595,0.0,0.0,0.0,581,0.0,0.0,16,11.4,71.3,87.2,6.4,1,False,55,20,0.1 +1521,-inf,0.0,5096,0.0,0.0,0.0,1808,0.0,0.0,10,14.7,65.9,89.4,9.7,1,True,90,35,0.1 +1522,-inf,0.0,5107,0.0,0.0,0.0,1811,0.0,0.0,10,17.3,65.7,98.2,12.3,3,True,71,55,0.1 +1523,-inf,0.0,3816,0.0,0.0,0.0,1330,0.0,0.0,12,18.3,61.8,89.1,14.6,3,False,71,41,0.1 +1524,-inf,0.0,3854,0.0,0.0,0.0,1375,0.0,0.0,10,7.4,65.7,89.6,2.4,2,False,90,90,0.1 +1525,-inf,0.0,3040,0.0,0.0,0.0,1091,0.0,0.0,16,5.0,59.7,91.2,0.0,3,False,40,90,0.1 +1526,-inf,0.0,2803,0.0,0.0,0.0,1005,0.0,0.0,16,9.8,61.3,97.0,4.8,3,False,120,55,0.1 +1527,-inf,0.0,6650,0.0,0.0,0.0,2396,0.0,0.0,14,63.6,48.7,85.4,58.5,1,False,71,35,0.1 +1528,-inf,0.0,2832,0.0,0.0,0.0,1033,0.0,0.0,18,65.9,56.2,82.3,44.0,4,False,90,55,0.1 +1529,-inf,0.0,6609,0.0,0.0,0.0,2493,0.0,0.0,12,71.5,49.5,78.0,24.7,6,True,150,20,0.1 +1530,-inf,0.0,2557,0.0,0.0,0.0,928,0.0,0.0,12,63.4,51.3,82.4,33.1,8,False,55,41,0.1 +1531,-inf,0.0,1349,0.0,0.0,0.0,470,0.0,0.0,14,15.3,69.8,96.2,10.3,12,False,120,41,0.1 +1532,-inf,0.0,1684,0.0,0.0,0.0,599,0.0,0.0,14,75.9,46.5,87.7,37.5,8,False,40,90,0.1 +1533,-inf,0.0,3562,0.0,0.0,0.0,1242,0.0,0.0,12,64.4,41.9,77.6,42.1,4,False,40,20,0.1 +1534,-inf,0.0,1848,0.0,0.0,0.0,638,0.0,0.0,12,73.8,56.4,86.3,23.7,12,False,90,20,0.1 +1535,-inf,0.0,811,0.0,0.0,0.0,287,0.0,0.0,16,19.5,75.3,87.6,14.5,3,False,55,20,0.1 +1536,-inf,0.0,7525,0.0,0.0,0.0,2674,0.0,0.0,10,69.3,50.6,87.3,32.9,1,False,55,55,0.1 +1537,-inf,0.0,3648,0.0,0.0,0.0,1307,0.0,0.0,10,68.2,52.0,80.6,49.3,8,False,71,35,0.1 +1538,-inf,0.0,4960,0.0,0.0,0.0,1820,0.0,0.0,16,75.4,45.7,86.6,43.8,6,True,55,41,0.1 +1539,-inf,0.0,2560,0.0,0.0,0.0,912,0.0,0.0,16,6.7,64.5,92.5,5.7,2,False,55,41,0.1 +1540,-inf,0.0,3984,0.0,0.0,0.0,1379,0.0,0.0,18,69.3,42.1,77.8,30.3,1,False,55,90,0.1 +1541,-inf,0.0,5259,0.0,0.0,0.0,1965,0.0,0.0,16,14.7,52.3,92.3,9.7,4,True,120,35,0.1 +1542,-inf,0.0,7410,0.0,0.0,0.0,2604,0.0,0.0,10,70.7,45.9,90.5,40.0,1,False,40,70,0.1 +1543,-inf,0.0,688,0.0,0.0,0.0,259,0.0,0.0,16,10.6,75.8,87.5,5.6,3,True,71,41,0.1 +1544,-inf,0.0,2729,0.0,0.0,0.0,992,0.0,0.0,12,74.6,50.4,87.8,34.3,6,False,120,41,0.1 +1545,-inf,0.0,5303,0.0,0.0,0.0,1907,0.0,0.0,12,4.8,61.7,96.9,-0.2,1,True,55,35,0.1 +1546,-inf,0.0,1266,0.0,0.0,0.0,462,0.0,0.0,21,9.7,69.4,95.1,6.3,12,True,55,35,0.1 +1547,-inf,0.0,3701,0.0,0.0,0.0,1353,0.0,0.0,14,80.3,51.0,79.0,53.7,4,False,40,90,0.1 +1548,-inf,0.0,1953,0.0,0.0,0.0,688,0.0,0.0,14,11.1,69.9,95.6,6.1,2,False,120,55,0.1 +1549,-inf,0.0,810,0.0,0.0,0.0,293,0.0,0.0,18,5.5,72.5,94.3,0.5,3,False,90,70,0.1 +1550,-inf,0.0,4282,0.0,0.0,0.0,1544,0.0,0.0,16,72.6,54.8,83.0,49.2,2,False,71,70,0.1 +1551,-inf,0.0,5175,0.0,0.0,0.0,1914,0.0,0.0,16,6.8,54.2,86.3,1.8,3,True,71,90,0.1 +1552,-inf,0.0,2836,0.0,0.0,0.0,1047,0.0,0.0,18,6.3,64.1,90.1,1.3,3,True,55,90,0.1 +1553,-inf,0.0,1947,0.0,0.0,0.0,691,0.0,0.0,21,12.5,55.8,92.8,7.5,8,False,90,90,0.1 +1554,-inf,0.0,3826,0.0,0.0,0.0,1365,0.0,0.0,12,16.0,54.9,89.9,11.0,4,False,90,55,0.1 +1555,-inf,0.0,2706,0.0,0.0,0.0,962,0.0,0.0,14,66.9,56.5,72.6,35.3,8,False,150,55,0.1 +1556,-inf,0.0,622,0.0,0.0,0.0,230,0.0,0.0,21,14.6,72.1,88.2,6.3,3,False,150,41,0.1 +1557,-inf,0.0,4776,0.0,0.0,0.0,1715,0.0,0.0,21,66.0,55.6,84.8,59.6,1,False,71,35,0.1 +1558,-inf,0.0,3008,0.0,0.0,0.0,1083,0.0,0.0,18,14.0,58.0,88.5,9.0,3,False,55,90,0.1 +1559,-inf,0.0,871,0.0,0.0,0.0,304,0.0,0.0,18,11.0,71.3,90.7,5.0,6,False,150,41,0.1 +1560,-inf,0.0,2230,0.0,0.0,0.0,783,0.0,0.0,16,17.2,58.6,90.9,7.1,8,False,90,41,0.1 +1561,-inf,0.0,938,0.0,0.0,0.0,300,0.0,0.0,21,70.6,39.8,91.2,22.4,6,False,40,70,0.1 +1562,-inf,0.0,2004,0.0,0.0,0.0,729,0.0,0.0,21,20.9,54.1,98.1,5.7,8,False,90,20,0.1 +1563,-inf,0.0,2485,0.0,0.0,0.0,919,0.0,0.0,16,73.9,50.0,76.2,35.6,6,False,120,55,0.1 +1564,-inf,0.0,6741,0.0,0.0,0.0,2455,0.0,0.0,10,9.6,57.2,89.0,4.6,3,True,71,55,0.1 +1565,-inf,0.0,1741,0.0,0.0,0.0,633,0.0,0.0,16,10.7,70.3,88.6,8.6,4,True,90,90,0.1 +1566,-inf,0.0,3048,0.0,0.0,0.0,1066,0.0,0.0,12,21.6,64.1,96.6,7.9,6,False,120,55,0.1 +1567,-inf,0.0,2111,0.0,0.0,0.0,754,0.0,0.0,18,4.9,60.3,85.2,-0.1,6,False,90,35,0.1 +1568,-inf,0.0,1886,0.0,0.0,0.0,639,0.0,0.0,16,74.1,38.4,73.6,32.2,4,False,150,35,0.1 +1569,-inf,0.0,1236,0.0,0.0,0.0,434,0.0,0.0,16,4.1,70.2,94.8,-0.9,6,False,71,90,0.1 +1570,-inf,0.0,1339,0.0,0.0,0.0,473,0.0,0.0,18,69.0,49.3,91.6,49.8,12,False,120,35,0.1 +1571,-inf,0.0,4592,0.0,0.0,0.0,1644,0.0,0.0,14,13.2,52.6,92.6,12.5,2,False,120,55,0.1 +1572,-inf,0.0,1924,0.0,0.0,0.0,658,0.0,0.0,14,20.3,52.2,89.2,15.5,12,False,40,41,0.1 +1573,-inf,0.0,5159,0.0,0.0,0.0,1811,0.0,0.0,10,65.8,54.3,90.5,24.3,2,False,40,35,0.1 +1574,-inf,0.0,1025,0.0,0.0,0.0,376,0.0,0.0,18,20.2,73.2,90.7,15.2,1,False,150,35,0.1 +1575,-inf,0.0,6496,0.0,0.0,0.0,2330,0.0,0.0,10,9.9,60.0,97.9,4.9,1,False,55,70,0.1 +1576,-inf,0.0,3432,0.0,0.0,0.0,1227,0.0,0.0,21,70.9,55.4,88.4,47.2,2,False,40,20,0.1 +1577,-inf,0.0,2285,0.0,0.0,0.0,862,0.0,0.0,16,6.6,67.9,92.1,1.6,6,True,120,41,0.1 +1578,-inf,0.0,1653,0.0,0.0,0.0,575,0.0,0.0,12,12.5,68.5,94.8,7.5,12,False,90,20,0.1 +1579,-inf,0.0,3906,0.0,0.0,0.0,1402,0.0,0.0,18,11.7,54.1,95.1,6.7,2,False,150,41,0.1 +1580,-inf,0.0,1723,0.0,0.0,0.0,615,0.0,0.0,18,17.1,59.0,90.4,10.3,12,False,120,70,0.1 +1581,-inf,0.0,5257,0.0,0.0,0.0,1946,0.0,0.0,16,11.2,54.0,86.4,6.2,4,True,40,55,0.1 +1582,-inf,0.0,369,0.0,0.0,0.0,141,0.0,0.0,16,10.5,77.4,88.5,5.5,8,False,150,70,0.1 +1583,-inf,0.0,1781,0.0,0.0,0.0,612,0.0,0.0,16,69.1,38.0,79.5,48.5,4,False,120,55,0.1 +1584,-inf,0.0,4512,0.0,0.0,0.0,1592,0.0,0.0,12,18.7,53.8,94.8,15.2,3,False,55,20,0.1 +1585,-inf,0.0,4926,0.0,0.0,0.0,1854,0.0,0.0,16,79.4,48.9,90.9,28.0,4,True,90,90,0.1 +1586,-inf,0.0,1787,0.0,0.0,0.0,631,0.0,0.0,16,20.6,71.5,89.0,15.5,1,False,150,20,0.1 +1587,-inf,0.0,1784,0.0,0.0,0.0,616,0.0,0.0,16,81.0,39.6,75.9,34.7,4,False,150,90,0.1 +1588,-inf,0.0,4035,0.0,0.0,0.0,1469,0.0,0.0,14,71.2,45.5,87.5,46.2,2,False,90,90,0.1 +1589,-inf,0.0,5464,0.0,0.0,0.0,1826,0.0,0.0,16,74.8,49.3,89.1,21.5,1,False,55,70,0.1 +1590,-inf,0.0,1974,0.0,0.0,0.0,710,0.0,0.0,14,63.8,45.0,81.3,49.5,8,False,55,55,0.1 +1591,-inf,0.0,2402,0.0,0.0,0.0,834,0.0,0.0,12,75.5,39.9,90.6,61.8,3,False,71,90,0.1 +1592,-inf,0.0,11601,0.0,0.0,0.0,4159,0.0,0.0,12,63.3,48.4,90.6,55.7,1,True,40,41,0.1 +1593,-inf,0.0,3056,0.0,0.0,0.0,1098,0.0,0.0,18,21.2,52.8,94.6,16.2,4,False,55,70,0.1 +1594,-inf,0.0,1339,0.0,0.0,0.0,448,0.0,0.0,14,21.0,74.5,88.1,16.0,4,False,55,90,0.1 +1595,-inf,0.0,1849,0.0,0.0,0.0,693,0.0,0.0,21,64.2,50.7,80.1,38.7,8,False,40,20,0.1 +1596,-inf,0.0,5228,0.0,0.0,0.0,1933,0.0,0.0,21,67.5,53.0,77.9,18.0,6,True,120,20,0.1 +1597,-inf,0.0,3234,0.0,0.0,0.0,1181,0.0,0.0,18,65.4,51.8,72.3,57.4,8,False,90,70,0.1 +1598,-inf,0.0,1364,0.0,0.0,0.0,482,0.0,0.0,18,17.7,70.1,90.1,12.7,2,False,40,41,0.1 +1599,-inf,0.0,876,0.0,0.0,0.0,322,0.0,0.0,12,7.6,77.5,91.5,2.6,3,False,55,41,0.1 +1600,-inf,0.0,2345,0.0,0.0,0.0,837,0.0,0.0,18,71.0,46.6,90.6,60.1,4,False,40,35,0.1 +1601,-inf,0.0,4595,0.0,0.0,0.0,1603,0.0,0.0,12,79.4,42.2,73.7,46.4,2,False,90,70,0.1 +1602,-inf,0.0,6140,0.0,0.0,0.0,2163,0.0,0.0,14,19.1,56.0,88.1,14.1,1,False,71,20,0.1 +1603,-inf,0.0,4568,0.0,0.0,0.0,1678,0.0,0.0,14,4.3,60.4,95.7,-0.7,2,True,150,90,0.1 +1604,-inf,0.0,2534,0.0,0.0,0.0,902,0.0,0.0,14,77.0,42.7,78.9,37.2,4,False,55,20,0.1 +1605,-inf,0.0,1962,0.0,0.0,0.0,690,0.0,0.0,18,15.6,68.5,87.6,8.9,1,False,120,20,0.1 +1606,-inf,0.0,1231,0.0,0.0,0.0,449,0.0,0.0,12,7.3,76.6,87.5,2.3,1,False,90,70,0.1 +1607,-inf,0.0,1811,0.0,0.0,0.0,635,0.0,0.0,21,71.0,57.8,86.5,23.7,8,False,90,70,0.1 +1608,-inf,0.0,2377,0.0,0.0,0.0,836,0.0,0.0,18,15.9,56.9,91.5,11.7,6,False,55,70,0.1 +1609,-inf,0.0,4095,0.0,0.0,0.0,1425,0.0,0.0,12,20.2,61.0,86.4,15.2,3,False,55,55,0.1 +1610,-inf,0.0,5142,0.0,0.0,0.0,1833,0.0,0.0,14,9.0,59.2,91.7,4.0,1,False,55,55,0.1 +1611,-inf,0.0,1961,0.0,0.0,0.0,669,0.0,0.0,10,15.0,77.1,86.5,10.6,1,False,90,90,0.1 +1612,-inf,0.0,2549,0.0,0.0,0.0,903,0.0,0.0,12,8.5,58.5,94.5,3.5,8,False,90,55,0.1 +1613,-inf,0.0,6576,0.0,0.0,0.0,2401,0.0,0.0,12,14.8,52.6,90.0,9.8,3,True,71,35,0.1 +1614,-inf,0.0,1116,0.0,0.0,0.0,417,0.0,0.0,14,5.1,75.2,96.6,0.1,3,True,40,55,0.1 +1615,-inf,0.0,1421,0.0,0.0,0.0,480,0.0,0.0,14,19.3,70.7,92.0,14.3,12,False,71,90,0.1 +1616,-inf,0.0,1280,0.0,0.0,0.0,458,0.0,0.0,18,71.3,40.5,81.8,60.5,6,False,150,55,0.1 +1617,-inf,0.0,4752,0.0,0.0,0.0,1690,0.0,0.0,10,18.8,54.4,86.0,13.8,4,False,55,35,0.1 +1618,-inf,0.0,1779,0.0,0.0,0.0,642,0.0,0.0,16,67.0,57.6,82.8,31.1,12,False,71,20,0.1 +1619,-inf,0.0,4236,0.0,0.0,0.0,1540,0.0,0.0,14,78.9,53.0,76.5,34.2,2,False,150,41,0.1 +1620,-inf,0.0,3410,0.0,0.0,0.0,1226,0.0,0.0,12,8.8,67.4,88.1,3.8,12,True,55,20,0.1 +1621,-inf,0.0,1413,0.0,0.0,0.0,503,0.0,0.0,18,11.5,63.7,93.3,6.5,12,False,90,41,0.1 +1622,-inf,0.0,2622,0.0,0.0,0.0,950,0.0,0.0,14,8.9,52.3,97.7,3.9,6,False,55,90,0.1 +1623,-inf,0.0,3895,0.0,0.0,0.0,1387,0.0,0.0,10,9.0,62.8,98.4,4.0,3,False,90,55,0.1 +1624,-inf,0.0,1732,0.0,0.0,0.0,629,0.0,0.0,16,70.4,53.9,89.9,59.2,12,False,71,90,0.1 +1625,-inf,0.0,3607,0.0,0.0,0.0,1286,0.0,0.0,12,78.1,52.9,73.1,46.5,8,False,71,41,0.1 +1626,-inf,0.0,5139,0.0,0.0,0.0,1901,0.0,0.0,16,8.6,54.8,87.1,3.6,4,True,90,41,0.1 +1627,-inf,0.0,744,0.0,0.0,0.0,251,0.0,0.0,16,19.9,76.6,86.6,14.9,6,True,90,90,0.1 +1628,-inf,0.0,3272,0.0,0.0,0.0,1178,0.0,0.0,18,11.2,62.5,98.1,6.2,6,True,71,20,0.1 +1629,-inf,0.0,2394,0.0,0.0,0.0,848,0.0,0.0,18,16.6,56.8,90.1,11.6,6,False,150,20,0.1 +1630,-inf,0.0,3571,0.0,0.0,0.0,1297,0.0,0.0,21,70.5,47.9,78.9,54.7,2,False,150,70,0.1 +1631,-inf,0.0,6253,0.0,0.0,0.0,2252,0.0,0.0,14,71.1,51.9,89.7,39.5,1,False,55,70,0.1 +1632,-inf,0.0,2248,0.0,0.0,0.0,802,0.0,0.0,12,75.4,48.7,80.6,30.8,8,False,120,20,0.1 +1633,-inf,0.0,1898,0.0,0.0,0.0,667,0.0,0.0,12,73.5,39.0,87.6,47.7,4,False,150,90,0.1 +1634,-inf,0.0,2006,0.0,0.0,0.0,700,0.0,0.0,10,9.5,71.7,94.6,4.5,6,False,150,20,0.1 +1635,-inf,0.0,1955,0.0,0.0,0.0,687,0.0,0.0,21,79.0,41.6,74.1,42.0,3,False,71,20,0.1 +1636,-inf,0.0,1231,0.0,0.0,0.0,412,0.0,0.0,14,19.3,74.6,92.6,14.3,3,False,120,70,0.1 +1637,-inf,0.0,3365,0.0,0.0,0.0,1154,0.0,0.0,12,21.3,66.4,90.0,16.3,3,False,120,20,0.1 +1638,-inf,0.0,1841,0.0,0.0,0.0,638,0.0,0.0,12,14.8,71.6,92.1,9.8,4,False,90,90,0.1 +1639,-inf,0.0,628,0.0,0.0,0.0,228,0.0,0.0,21,19.6,72.4,90.6,14.6,3,False,55,20,0.1 +1640,-inf,0.0,2689,0.0,0.0,0.0,985,0.0,0.0,14,75.0,57.9,77.2,35.7,6,False,55,35,0.1 +1641,-inf,0.0,5521,0.0,0.0,0.0,2042,0.0,0.0,14,9.0,53.3,91.1,8.0,4,True,55,90,0.1 +1642,-inf,0.0,6306,0.0,0.0,0.0,2295,0.0,0.0,12,70.1,44.8,72.1,32.6,8,True,90,20,0.1 +1643,-inf,0.0,4496,0.0,0.0,0.0,1638,0.0,0.0,21,62.3,45.8,82.8,37.8,1,False,150,41,0.1 +1644,-inf,0.0,5330,0.0,0.0,0.0,1859,0.0,0.0,12,76.0,38.3,77.8,21.9,2,True,71,20,0.1 +1645,-inf,0.0,2368,0.0,0.0,0.0,836,0.0,0.0,14,12.0,67.7,94.4,10.6,2,False,40,90,0.1 +1646,-inf,0.0,3892,0.0,0.0,0.0,1360,0.0,0.0,10,15.2,61.4,95.2,10.2,4,False,90,70,0.1 +1647,-inf,0.0,4701,0.0,0.0,0.0,1656,0.0,0.0,14,81.7,39.9,79.7,28.3,1,True,90,20,0.1 +1648,-inf,0.0,2406,0.0,0.0,0.0,882,0.0,0.0,16,75.5,50.9,90.3,43.6,6,False,55,90,0.1 +1649,-inf,0.0,3699,0.0,0.0,0.0,1313,0.0,0.0,16,20.8,52.8,94.0,7.7,3,False,55,70,0.1 +1650,-inf,0.0,5347,0.0,0.0,0.0,1920,0.0,0.0,10,66.9,56.0,79.7,42.6,3,False,120,70,0.1 +1651,-inf,0.0,3250,0.0,0.0,0.0,1166,0.0,0.0,18,68.8,45.1,91.4,52.2,2,False,150,35,0.1 +1652,-inf,0.0,4891,0.0,0.0,0.0,1779,0.0,0.0,12,8.2,61.5,93.6,3.2,3,True,120,41,0.1 +1653,-inf,0.0,5504,0.0,0.0,0.0,1987,0.0,0.0,10,4.2,54.3,91.5,-0.8,2,False,40,70,0.1 +1654,-inf,0.0,1167,0.0,0.0,0.0,434,0.0,0.0,12,10.5,76.3,95.9,6.2,2,False,55,41,0.1 +1655,-inf,0.0,1258,0.0,0.0,0.0,439,0.0,0.0,18,78.2,44.1,87.4,37.5,8,False,71,41,0.1 +1656,-inf,0.0,1021,0.0,0.0,0.0,355,0.0,0.0,21,20.8,68.8,92.4,15.8,6,False,120,90,0.1 +1657,-inf,0.0,1035,0.0,0.0,0.0,361,0.0,0.0,21,72.3,44.8,78.2,37.1,12,False,40,20,0.1 +1658,-inf,0.0,4661,0.0,0.0,0.0,1697,0.0,0.0,21,71.4,56.6,90.9,50.9,8,True,40,20,0.1 +1659,-inf,0.0,5263,0.0,0.0,0.0,1906,0.0,0.0,12,6.3,59.8,85.7,1.3,6,True,40,41,0.1 +1660,-inf,0.0,4095,0.0,0.0,0.0,1411,0.0,0.0,12,21.9,60.0,98.6,21.7,4,False,71,41,0.1 +1661,-inf,0.0,1757,0.0,0.0,0.0,649,0.0,0.0,12,9.3,74.2,93.9,4.3,4,True,71,35,0.1 +1662,-inf,0.0,3954,0.0,0.0,0.0,1428,0.0,0.0,18,68.3,41.3,87.5,60.1,12,True,120,70,0.1 +1663,-inf,0.0,1583,0.0,0.0,0.0,543,0.0,0.0,12,72.2,48.9,78.0,26.3,12,False,55,55,0.1 +1664,-inf,0.0,6132,0.0,0.0,0.0,2221,0.0,0.0,16,67.0,53.1,82.0,52.9,1,False,55,90,0.1 +1665,-inf,0.0,5529,0.0,0.0,0.0,2023,0.0,0.0,14,7.8,55.7,93.2,2.8,3,True,120,20,0.1 +1666,-inf,0.0,2938,0.0,0.0,0.0,997,0.0,0.0,21,70.4,52.6,76.1,28.9,2,False,55,20,0.1 +1667,-inf,0.0,4258,0.0,0.0,0.0,1578,0.0,0.0,16,9.7,59.1,89.5,4.7,4,True,150,41,0.1 +1668,-inf,0.0,2675,0.0,0.0,0.0,956,0.0,0.0,18,11.0,57.9,98.6,6.0,4,False,71,35,0.1 +1669,-inf,0.0,3465,0.0,0.0,0.0,1280,0.0,0.0,21,73.5,51.4,74.4,54.5,3,False,55,90,0.1 +1670,-inf,0.0,5683,0.0,0.0,0.0,2151,0.0,0.0,18,69.9,53.8,79.4,57.1,6,True,71,90,0.1 +1671,-inf,0.0,3317,0.0,0.0,0.0,1147,0.0,0.0,21,75.0,56.7,81.1,22.6,12,True,90,90,0.1 +1672,-inf,0.0,6901,0.0,0.0,0.0,2448,0.0,0.0,10,81.4,43.1,76.0,43.2,2,True,40,90,0.1 +1673,-inf,0.0,2075,0.0,0.0,0.0,727,0.0,0.0,18,11.9,57.1,94.6,6.9,8,False,90,70,0.1 +1674,-inf,0.0,5358,0.0,0.0,0.0,1909,0.0,0.0,10,68.3,49.5,88.5,28.8,2,False,120,20,0.1 +1675,-inf,0.0,1469,0.0,0.0,0.0,500,0.0,0.0,21,78.0,40.8,77.5,35.1,4,False,120,55,0.1 +1676,-inf,0.0,1929,0.0,0.0,0.0,674,0.0,0.0,12,15.7,73.1,87.7,10.7,2,False,40,90,0.1 +1677,-inf,0.0,1238,0.0,0.0,0.0,424,0.0,0.0,21,70.7,41.5,75.5,31.5,6,False,71,55,0.1 +1678,-inf,0.0,1153,0.0,0.0,0.0,426,0.0,0.0,21,16.6,69.8,87.5,11.6,6,True,120,55,0.1 +1679,-inf,0.0,1901,0.0,0.0,0.0,691,0.0,0.0,21,5.3,66.8,87.2,4.2,1,False,71,20,0.1 +1680,-inf,0.0,4824,0.0,0.0,0.0,1668,0.0,0.0,16,79.0,50.6,72.7,30.1,1,False,120,70,0.1 +1681,-inf,0.0,5754,0.0,0.0,0.0,2185,0.0,0.0,10,8.0,52.6,90.6,3.0,12,True,150,35,0.1 +1682,-inf,0.0,2509,0.0,0.0,0.0,908,0.0,0.0,12,8.1,53.6,87.2,3.1,8,False,55,90,0.1 +1683,-inf,0.0,1677,0.0,0.0,0.0,587,0.0,0.0,16,10.3,65.0,85.0,5.3,8,False,90,55,0.1 +1684,-inf,0.0,2021,0.0,0.0,0.0,720,0.0,0.0,12,12.8,71.9,90.5,7.8,2,False,120,35,0.1 +1685,-inf,0.0,5000,0.0,0.0,0.0,1894,0.0,0.0,16,70.4,48.2,83.2,27.0,8,True,120,70,0.1 +1686,-inf,0.0,5505,0.0,0.0,0.0,1982,0.0,0.0,16,67.7,39.0,88.2,57.5,2,True,40,70,0.1 +1687,-inf,0.0,1769,0.0,0.0,0.0,625,0.0,0.0,21,16.8,61.2,98.5,8.8,6,False,150,20,0.1 +1688,-inf,0.0,2332,0.0,0.0,0.0,819,0.0,0.0,10,13.9,68.8,95.2,8.9,8,False,55,55,0.1 +1689,-inf,0.0,5530,0.0,0.0,0.0,1952,0.0,0.0,12,10.9,60.4,98.9,5.9,1,False,120,35,0.1 +1690,-inf,0.0,6501,0.0,0.0,0.0,2328,0.0,0.0,12,12.9,57.6,95.5,7.9,1,True,55,20,0.1 +1691,-inf,0.0,1706,0.0,0.0,0.0,601,0.0,0.0,10,80.5,41.0,82.2,58.1,12,False,40,90,0.1 +1692,-inf,0.0,2041,0.0,0.0,0.0,705,0.0,0.0,18,12.6,61.1,86.0,7.6,6,False,90,90,0.1 +1693,-inf,0.0,5001,0.0,0.0,0.0,1808,0.0,0.0,12,72.0,49.4,78.4,53.9,3,False,120,55,0.1 +1694,-inf,0.0,1905,0.0,0.0,0.0,667,0.0,0.0,16,9.8,66.1,94.7,4.8,4,False,90,41,0.1 +1695,-inf,0.0,4682,0.0,0.0,0.0,1736,0.0,0.0,16,17.7,56.4,87.6,12.7,12,True,55,70,0.1 +1696,-inf,0.0,443,0.0,0.0,0.0,175,0.0,0.0,18,10.6,75.3,93.6,5.6,3,False,40,41,0.1 +1697,-inf,0.0,1312,0.0,0.0,0.0,468,0.0,0.0,16,16.6,73.0,98.5,4.9,1,False,90,20,0.1 +1698,-inf,0.0,3828,0.0,0.0,0.0,1398,0.0,0.0,18,70.7,48.9,87.2,56.2,2,False,40,55,0.1 +1699,-inf,0.0,672,0.0,0.0,0.0,249,0.0,0.0,18,7.4,72.1,94.4,2.4,12,False,90,55,0.1 +1700,-inf,0.0,5558,0.0,0.0,0.0,1926,0.0,0.0,12,78.4,38.4,88.6,49.9,1,True,40,55,0.1 +1701,-inf,0.0,6432,0.0,0.0,0.0,2247,0.0,0.0,12,69.2,43.2,84.0,35.5,8,True,40,20,0.1 +1702,-inf,0.0,3316,0.0,0.0,0.0,1179,0.0,0.0,10,18.8,72.9,91.4,13.8,2,True,150,90,0.1 +1703,-inf,0.0,5326,0.0,0.0,0.0,1900,0.0,0.0,16,8.7,56.3,97.1,3.7,1,False,71,90,0.1 +1704,-inf,0.0,4340,0.0,0.0,0.0,1616,0.0,0.0,21,65.7,47.6,87.4,33.3,12,True,150,70,0.1 +1705,-inf,0.0,1526,0.0,0.0,0.0,525,0.0,0.0,12,62.8,41.0,89.8,28.0,6,False,71,90,0.1 +1706,-inf,0.0,2544,0.0,0.0,0.0,906,0.0,0.0,14,70.4,46.8,75.7,33.9,6,False,55,70,0.1 +1707,-inf,0.0,1702,0.0,0.0,0.0,607,0.0,0.0,21,19.6,60.6,96.5,14.6,8,False,150,41,0.1 +1708,-inf,0.0,2759,0.0,0.0,0.0,997,0.0,0.0,10,80.8,56.4,89.6,32.2,8,False,55,35,0.1 +1709,-inf,0.0,3436,0.0,0.0,0.0,1163,0.0,0.0,21,72.9,57.1,78.6,20.9,12,True,90,41,0.1 +1710,-inf,0.0,2317,0.0,0.0,0.0,788,0.0,0.0,16,62.7,56.7,77.7,26.8,6,False,90,90,0.1 +1711,-inf,0.0,2410,0.0,0.0,0.0,871,0.0,0.0,14,6.6,55.5,85.7,1.6,8,False,71,20,0.1 +1712,-inf,0.0,1407,0.0,0.0,0.0,498,0.0,0.0,16,10.2,65.6,96.9,5.2,12,False,120,90,0.1 +1713,-inf,0.0,3766,0.0,0.0,0.0,1382,0.0,0.0,18,81.9,48.7,86.4,34.1,2,False,150,90,0.1 +1714,-inf,0.0,2277,0.0,0.0,0.0,819,0.0,0.0,21,19.3,54.1,92.0,14.3,6,False,120,55,0.1 +1715,-inf,0.0,1944,0.0,0.0,0.0,708,0.0,0.0,18,78.2,51.2,91.4,54.7,8,False,150,70,0.1 +1716,-inf,0.0,2652,0.0,0.0,0.0,926,0.0,0.0,12,18.6,65.2,98.6,7.5,6,False,120,20,0.1 +1717,-inf,0.0,1055,0.0,0.0,0.0,335,0.0,0.0,16,79.4,47.7,79.7,20.0,6,False,120,55,0.1 +1718,-inf,0.0,4594,0.0,0.0,0.0,1631,0.0,0.0,10,15.6,67.2,88.5,10.6,1,False,120,70,0.1 +1719,-inf,0.0,2386,0.0,0.0,0.0,831,0.0,0.0,21,17.3,60.4,85.7,12.1,3,False,150,55,0.1 +1720,-inf,0.0,1488,0.0,0.0,0.0,510,0.0,0.0,12,73.1,38.9,85.3,33.6,6,False,90,41,0.1 +1721,-inf,0.0,813,0.0,0.0,0.0,299,0.0,0.0,14,16.2,76.6,90.1,11.2,3,False,71,41,0.1 +1722,-inf,0.0,3495,0.0,0.0,0.0,1281,0.0,0.0,14,75.1,48.1,88.6,62.0,3,False,55,90,0.1 +1723,-inf,0.0,1652,0.0,0.0,0.0,588,0.0,0.0,14,20.2,74.2,85.8,12.8,8,True,55,35,0.1 +1724,-inf,0.0,4105,0.0,0.0,0.0,1440,0.0,0.0,16,18.6,56.5,94.8,13.6,2,False,90,55,0.1 +1725,-inf,0.0,932,0.0,0.0,0.0,322,0.0,0.0,18,18.8,71.9,92.4,13.8,4,False,40,41,0.1 +1726,-inf,0.0,4460,0.0,0.0,0.0,1620,0.0,0.0,14,81.1,47.1,81.3,43.7,2,False,90,55,0.1 +1727,-inf,0.0,2067,0.0,0.0,0.0,743,0.0,0.0,10,64.4,51.6,84.1,29.7,12,False,150,20,0.1 +1728,-inf,0.0,2463,0.0,0.0,0.0,865,0.0,0.0,21,7.5,59.8,88.7,2.5,3,False,40,41,0.1 +1729,-inf,0.0,1808,0.0,0.0,0.0,638,0.0,0.0,14,5.7,69.5,94.8,0.7,3,False,150,20,0.1 +1730,-inf,0.0,5970,0.0,0.0,0.0,2221,0.0,0.0,18,62.2,57.1,80.3,53.1,3,True,150,70,0.1 +1731,-inf,0.0,6064,0.0,0.0,0.0,2186,0.0,0.0,18,63.8,56.3,73.1,54.1,1,False,55,90,0.1 +1732,-inf,0.0,7427,0.0,0.0,0.0,2715,0.0,0.0,14,67.0,56.6,80.3,55.8,4,True,55,55,0.1 +1733,-inf,0.0,4127,0.0,0.0,0.0,1537,0.0,0.0,21,6.6,56.0,92.2,1.6,6,True,71,55,0.1 +1734,-inf,0.0,2197,0.0,0.0,0.0,799,0.0,0.0,10,69.1,46.9,88.2,58.5,8,False,40,20,0.1 +1735,-inf,0.0,7648,0.0,0.0,0.0,2794,0.0,0.0,21,63.7,48.0,81.7,33.9,1,True,71,70,0.1 +1736,-inf,0.0,5604,0.0,0.0,0.0,1998,0.0,0.0,21,66.9,54.0,72.9,54.8,1,False,150,90,0.1 +1737,-inf,0.0,5512,0.0,0.0,0.0,1909,0.0,0.0,14,62.1,46.9,72.4,20.7,1,False,55,41,0.1 +1738,-inf,0.0,1678,0.0,0.0,0.0,594,0.0,0.0,18,77.6,45.6,86.4,33.1,6,False,55,55,0.1 +1739,-inf,0.0,2204,0.0,0.0,0.0,779,0.0,0.0,16,5.2,56.9,97.6,0.2,8,False,90,70,0.1 +1740,-inf,0.0,7475,0.0,0.0,0.0,2689,0.0,0.0,10,13.6,54.8,88.4,8.6,2,True,90,20,0.1 +1741,-inf,0.0,2156,0.0,0.0,0.0,745,0.0,0.0,21,21.2,64.0,87.4,20.1,2,False,71,70,0.1 +1742,-inf,0.0,4777,0.0,0.0,0.0,1690,0.0,0.0,10,15.7,59.2,86.9,10.7,3,False,90,20,0.1 +1743,-inf,0.0,4010,0.0,0.0,0.0,1451,0.0,0.0,12,73.9,51.5,91.5,26.9,3,False,120,70,0.1 +1744,-inf,0.0,1199,0.0,0.0,0.0,417,0.0,0.0,21,75.1,44.8,86.2,29.9,8,False,90,35,0.1 +1745,-inf,0.0,553,0.0,0.0,0.0,228,0.0,0.0,21,8.3,73.5,98.3,3.3,2,True,90,55,0.1 +1746,-inf,0.0,2219,0.0,0.0,0.0,779,0.0,0.0,14,15.2,66.5,98.7,10.2,4,False,40,35,0.1 +1747,-inf,0.0,7639,0.0,0.0,0.0,2829,0.0,0.0,16,66.5,52.1,85.0,55.9,3,True,71,41,0.1 +1748,-inf,0.0,197,0.0,0.0,0.0,81,0.0,0.0,21,7.3,76.7,86.2,2.3,8,False,55,20,0.1 +1749,-inf,0.0,3863,0.0,0.0,0.0,1295,0.0,0.0,10,69.1,41.6,75.9,19.2,2,False,90,55,0.1 +1750,-inf,0.0,3958,0.0,0.0,0.0,1448,0.0,0.0,21,70.9,44.2,87.7,29.5,4,True,150,55,0.1 +1751,-inf,0.0,7170,0.0,0.0,0.0,2595,0.0,0.0,10,11.8,54.6,95.5,6.8,4,True,40,20,0.1 +1752,-inf,0.0,1087,0.0,0.0,0.0,382,0.0,0.0,16,64.6,41.6,80.5,45.9,12,False,90,55,0.1 +1753,-inf,0.0,1172,0.0,0.0,0.0,417,0.0,0.0,10,9.7,76.8,93.4,4.7,12,False,40,90,0.1 +1754,-inf,0.0,4666,0.0,0.0,0.0,1608,0.0,0.0,12,18.8,60.1,87.5,13.8,2,False,150,35,0.1 +1755,-inf,0.0,782,0.0,0.0,0.0,260,0.0,0.0,21,65.0,39.1,82.5,58.4,8,False,40,90,0.1 +1756,-inf,0.0,5548,0.0,0.0,0.0,1988,0.0,0.0,14,79.7,44.0,86.4,50.6,1,False,71,70,0.1 +1757,-inf,0.0,1195,0.0,0.0,0.0,422,0.0,0.0,18,18.9,71.2,88.2,13.9,2,False,90,70,0.1 +1758,-inf,0.0,2557,0.0,0.0,0.0,870,0.0,0.0,18,73.2,44.4,79.3,25.2,2,False,120,70,0.1 +1759,-inf,0.0,6333,0.0,0.0,0.0,2269,0.0,0.0,14,13.4,52.7,93.0,8.4,1,False,120,20,0.1 +1760,-inf,0.0,3812,0.0,0.0,0.0,1367,0.0,0.0,14,14.5,64.3,88.1,9.5,1,False,90,70,0.1 +1761,-inf,0.0,1601,0.0,0.0,0.0,581,0.0,0.0,21,11.4,55.4,91.5,6.4,12,False,90,20,0.1 +1762,-inf,0.0,3903,0.0,0.0,0.0,1419,0.0,0.0,14,73.6,54.9,78.1,39.7,3,False,90,55,0.1 +1763,-inf,0.0,2360,0.0,0.0,0.0,871,0.0,0.0,18,4.7,66.0,92.3,-0.3,3,True,150,90,0.1 +1764,-inf,0.0,3670,0.0,0.0,0.0,1331,0.0,0.0,14,78.3,50.1,89.9,50.8,3,False,40,35,0.1 +1765,-inf,0.0,1426,0.0,0.0,0.0,474,0.0,0.0,14,20.6,72.6,94.7,15.6,8,False,55,55,0.1 +1766,-inf,0.0,3253,0.0,0.0,0.0,1164,0.0,0.0,10,11.0,71.2,92.0,7.7,1,False,90,20,0.1 +1767,-inf,0.0,5210,0.0,0.0,0.0,1846,0.0,0.0,10,19.5,66.4,91.9,14.5,2,True,40,90,0.1 +1768,-inf,0.0,2511,0.0,0.0,0.0,914,0.0,0.0,12,77.7,54.9,91.2,57.8,8,False,90,90,0.1 +1769,-inf,0.0,1637,0.0,0.0,0.0,557,0.0,0.0,12,80.3,38.4,80.6,60.0,8,False,90,55,0.1 +1770,-inf,0.0,481,0.0,0.0,0.0,179,0.0,0.0,18,17.3,75.4,85.6,12.3,4,False,71,70,0.1 +1771,-inf,0.0,509,0.0,0.0,0.0,167,0.0,0.0,16,70.2,38.1,85.1,26.3,12,False,55,41,0.1 +1772,-inf,0.0,4460,0.0,0.0,0.0,1623,0.0,0.0,16,64.4,55.5,82.7,58.0,2,False,150,35,0.1 +1773,-inf,0.0,812,0.0,0.0,0.0,276,0.0,0.0,18,63.4,53.6,75.5,18.1,12,False,55,35,0.1 +1774,-inf,0.0,8135,0.0,0.0,0.0,2995,0.0,0.0,14,65.2,44.9,82.7,46.1,2,True,150,55,0.1 +1775,-inf,0.0,1917,0.0,0.0,0.0,690,0.0,0.0,14,16.4,62.3,95.1,9.6,12,False,40,90,0.1 +1776,-inf,0.0,7145,0.0,0.0,0.0,2556,0.0,0.0,21,62.5,44.2,73.0,40.5,1,True,90,41,0.1 +1777,-inf,0.0,4203,0.0,0.0,0.0,1472,0.0,0.0,16,80.5,40.5,74.2,49.7,1,False,55,35,0.1 +1778,-inf,0.0,2047,0.0,0.0,0.0,695,0.0,0.0,14,19.4,67.3,85.9,14.4,6,False,120,20,0.1 +1779,-inf,0.0,1475,0.0,0.0,0.0,472,0.0,0.0,18,69.7,52.6,86.9,20.3,12,False,90,20,0.1 +1780,-inf,0.0,2874,0.0,0.0,0.0,1023,0.0,0.0,21,71.9,56.6,78.0,48.3,3,False,55,20,0.1 +1781,-inf,0.0,5028,0.0,0.0,0.0,1768,0.0,0.0,12,19.0,57.8,95.7,14.0,2,False,71,41,0.1 +1782,-inf,0.0,2151,0.0,0.0,0.0,775,0.0,0.0,16,69.7,48.4,90.1,39.2,6,False,40,41,0.1 +1783,-inf,0.0,1954,0.0,0.0,0.0,717,0.0,0.0,21,20.2,52.2,92.9,17.0,8,False,150,35,0.1 +1784,-inf,0.0,1499,0.0,0.0,0.0,522,0.0,0.0,16,81.8,40.3,76.6,39.3,6,False,55,41,0.1 +1785,-inf,0.0,4057,0.0,0.0,0.0,1484,0.0,0.0,10,9.7,54.0,96.3,4.7,4,False,71,90,0.1 +1786,-inf,0.0,2370,0.0,0.0,0.0,827,0.0,0.0,16,19.2,63.6,93.5,6.6,4,False,150,35,0.1 +1787,-inf,0.0,7410,0.0,0.0,0.0,2597,0.0,0.0,10,21.7,60.6,92.2,16.7,1,False,40,70,0.1 +1788,-inf,0.0,3130,0.0,0.0,0.0,1095,0.0,0.0,10,81.6,50.3,74.7,26.5,6,False,71,35,0.1 +1789,-inf,0.0,1634,0.0,0.0,0.0,569,0.0,0.0,10,9.9,73.8,92.8,4.9,8,False,150,90,0.1 +1790,-inf,0.0,2313,0.0,0.0,0.0,835,0.0,0.0,18,69.4,54.3,74.0,49.8,12,False,120,90,0.1 +1791,-inf,0.0,2904,0.0,0.0,0.0,1043,0.0,0.0,18,11.7,64.4,93.5,6.7,1,False,90,90,0.1 +1792,-inf,0.0,4049,0.0,0.0,0.0,1522,0.0,0.0,21,16.7,52.2,97.3,6.5,8,True,90,90,0.1 +1793,-inf,0.0,925,0.0,0.0,0.0,330,0.0,0.0,12,12.8,76.2,94.0,7.8,12,False,40,90,0.1 +1794,-inf,0.0,5884,0.0,0.0,0.0,2174,0.0,0.0,14,78.1,53.9,79.9,48.0,8,True,40,35,0.1 +1795,-inf,0.0,2929,0.0,0.0,0.0,1050,0.0,0.0,21,73.0,52.2,79.2,35.5,3,False,120,35,0.1 +1796,-inf,0.0,1273,0.0,0.0,0.0,456,0.0,0.0,21,10.6,65.1,95.5,5.6,8,False,40,41,0.1 +1797,-inf,0.0,1435,0.0,0.0,0.0,504,0.0,0.0,21,4.2,63.3,87.7,-0.8,8,False,150,41,0.1 +1798,-inf,0.0,2374,0.0,0.0,0.0,872,0.0,0.0,18,13.2,65.7,86.6,8.2,8,True,150,41,0.1 +1799,-inf,0.0,2705,0.0,0.0,0.0,952,0.0,0.0,14,12.9,66.0,85.1,7.9,2,False,55,35,0.1 +1800,-inf,0.0,798,0.0,0.0,0.0,258,0.0,0.0,21,72.2,40.5,82.9,28.2,8,False,150,20,0.1 +1801,-inf,0.0,2008,0.0,0.0,0.0,744,0.0,0.0,12,76.6,55.4,88.7,39.8,12,False,55,20,0.1 +1802,-inf,0.0,3214,0.0,0.0,0.0,1073,0.0,0.0,18,72.9,46.4,82.0,27.2,2,False,90,90,0.1 +1803,-inf,0.0,2026,0.0,0.0,0.0,743,0.0,0.0,21,21.2,66.7,91.9,16.2,2,True,71,35,0.1 +1804,-inf,0.0,1862,0.0,0.0,0.0,544,0.0,0.0,18,65.9,54.8,83.0,19.1,6,False,40,70,0.1 +1805,-inf,0.0,2464,0.0,0.0,0.0,878,0.0,0.0,14,12.7,64.3,97.9,7.7,4,False,150,70,0.1 +1806,-inf,0.0,1988,0.0,0.0,0.0,689,0.0,0.0,12,14.5,71.4,96.6,6.6,3,False,71,70,0.1 +1807,-inf,0.0,2531,0.0,0.0,0.0,901,0.0,0.0,12,65.3,57.7,82.8,27.7,8,False,90,55,0.1 +1808,-inf,0.0,1054,0.0,0.0,0.0,394,0.0,0.0,16,15.5,74.1,95.3,10.5,4,True,71,20,0.1 +1809,-inf,0.0,1911,0.0,0.0,0.0,680,0.0,0.0,16,16.0,67.6,85.0,11.0,3,False,90,35,0.1 +1810,-inf,0.0,2174,0.0,0.0,0.0,788,0.0,0.0,10,4.7,63.3,97.3,-0.3,12,False,40,35,0.1 +1811,-inf,0.0,5901,0.0,0.0,0.0,2087,0.0,0.0,14,16.0,56.5,86.9,11.0,1,False,150,20,0.1 +1812,-inf,0.0,2292,0.0,0.0,0.0,846,0.0,0.0,16,77.5,49.7,85.4,32.9,6,False,150,70,0.1 +1813,-inf,0.0,1594,0.0,0.0,0.0,562,0.0,0.0,16,16.8,64.1,95.6,11.8,12,False,71,55,0.1 +1814,-inf,0.0,3498,0.0,0.0,0.0,1251,0.0,0.0,16,7.2,53.4,97.7,2.2,3,False,71,41,0.1 +1815,-inf,0.0,3489,0.0,0.0,0.0,1214,0.0,0.0,10,65.1,38.3,90.6,47.8,2,False,90,35,0.1 +1816,-inf,0.0,470,0.0,0.0,0.0,145,0.0,0.0,21,68.1,39.1,89.9,37.2,12,False,55,20,0.1 +1817,-inf,0.0,1834,0.0,0.0,0.0,641,0.0,0.0,16,12.3,68.8,91.2,7.3,2,False,120,55,0.1 +1818,-inf,0.0,3324,0.0,0.0,0.0,1182,0.0,0.0,12,9.3,62.8,95.9,4.3,3,False,40,41,0.1 +1819,-inf,0.0,3208,0.0,0.0,0.0,1128,0.0,0.0,10,12.8,61.9,98.4,7.8,6,False,40,41,0.1 +1820,-inf,0.0,273,0.0,0.0,0.0,108,0.0,0.0,18,11.4,77.2,97.5,6.4,12,False,71,90,0.1 +1821,-inf,0.0,2436,0.0,0.0,0.0,895,0.0,0.0,10,65.7,49.8,90.0,61.0,8,False,71,70,0.1 +1822,-inf,0.0,4481,0.0,0.0,0.0,1647,0.0,0.0,21,77.9,53.8,80.6,45.4,8,True,55,20,0.1 +1823,-inf,0.0,6064,0.0,0.0,0.0,2147,0.0,0.0,12,7.5,58.0,96.6,2.5,1,False,55,70,0.1 +1824,-inf,0.0,2161,0.0,0.0,0.0,770,0.0,0.0,18,10.5,65.3,95.2,5.5,2,False,120,90,0.1 +1825,-inf,0.0,2132,0.0,0.0,0.0,749,0.0,0.0,18,65.9,45.4,86.4,27.1,4,False,150,90,0.1 +1826,-inf,0.0,226,0.0,0.0,0.0,92,0.0,0.0,21,7.4,76.6,88.4,2.4,3,False,40,90,0.1 +1827,-inf,0.0,1691,0.0,0.0,0.0,621,0.0,0.0,18,62.9,55.5,91.6,53.3,12,False,40,20,0.1 +1828,-inf,0.0,3466,0.0,0.0,0.0,1218,0.0,0.0,14,18.8,57.1,87.2,13.8,4,False,71,20,0.1 +1829,-inf,0.0,1861,0.0,0.0,0.0,657,0.0,0.0,18,15.6,64.8,93.6,10.6,4,False,40,35,0.1 +1830,-inf,0.0,2224,0.0,0.0,0.0,834,0.0,0.0,18,11.5,66.8,85.8,6.5,12,True,120,20,0.1 +1831,-inf,0.0,3155,0.0,0.0,0.0,1134,0.0,0.0,16,17.7,55.7,87.2,11.8,4,False,40,70,0.1 +1832,-inf,0.0,3928,0.0,0.0,0.0,1379,0.0,0.0,18,8.2,52.7,88.3,3.2,2,False,90,90,0.1 +1833,-inf,0.0,5275,0.0,0.0,0.0,1855,0.0,0.0,12,18.6,55.2,97.6,13.6,2,False,55,90,0.1 +1834,-inf,0.0,2382,0.0,0.0,0.0,834,0.0,0.0,12,10.1,68.6,98.7,5.1,3,False,71,20,0.1 +1835,-inf,0.0,3113,0.0,0.0,0.0,1135,0.0,0.0,18,16.5,63.2,85.2,11.5,3,True,120,41,0.1 +1836,-inf,0.0,8417,0.0,0.0,0.0,3036,0.0,0.0,14,62.1,42.0,87.9,48.6,2,True,40,90,0.1 +1837,-inf,0.0,2618,0.0,0.0,0.0,939,0.0,0.0,10,69.0,49.3,82.0,29.5,8,False,120,35,0.1 +1838,-inf,0.0,444,0.0,0.0,0.0,165,0.0,0.0,18,16.0,75.8,89.2,11.0,3,False,40,70,0.1 +1839,-inf,0.0,2273,0.0,0.0,0.0,797,0.0,0.0,16,63.1,47.5,72.7,41.9,12,False,55,35,0.1 +1840,-inf,0.0,1291,0.0,0.0,0.0,458,0.0,0.0,14,6.4,72.2,94.9,1.4,4,False,55,20,0.1 +1841,-inf,0.0,1865,0.0,0.0,0.0,631,0.0,0.0,10,14.7,74.4,93.5,9.7,6,False,55,90,0.1 +1842,-inf,0.0,2989,0.0,0.0,0.0,1070,0.0,0.0,16,9.3,56.6,98.3,4.3,4,False,40,55,0.1 +1843,-inf,0.0,2933,0.0,0.0,0.0,1038,0.0,0.0,21,20.1,56.3,93.0,18.5,3,False,90,35,0.1 +1844,-inf,0.0,2246,0.0,0.0,0.0,822,0.0,0.0,21,17.5,53.7,89.2,12.5,6,False,55,70,0.1 +1845,-inf,0.0,2477,0.0,0.0,0.0,857,0.0,0.0,14,63.6,38.6,77.6,58.2,6,False,120,55,0.1 +1846,-inf,0.0,1830,0.0,0.0,0.0,635,0.0,0.0,10,68.8,41.6,90.7,51.5,6,False,71,35,0.1 +1847,-inf,0.0,1503,0.0,0.0,0.0,536,0.0,0.0,16,5.7,64.3,91.6,0.7,12,False,90,41,0.1 +1848,-inf,0.0,5975,0.0,0.0,0.0,2030,0.0,0.0,10,70.8,54.7,85.6,19.9,1,False,40,70,0.1 +1849,-inf,0.0,2260,0.0,0.0,0.0,826,0.0,0.0,10,12.0,74.9,92.3,7.0,8,True,90,55,0.1 +1850,-inf,0.0,6974,0.0,0.0,0.0,2496,0.0,0.0,14,76.1,55.3,78.5,28.0,1,True,40,55,0.1 +1851,-inf,0.0,370,0.0,0.0,0.0,143,0.0,0.0,21,4.5,73.8,97.5,-0.5,6,False,150,70,0.1 +1852,-inf,0.0,1920,0.0,0.0,0.0,637,0.0,0.0,21,75.8,39.8,87.6,60.0,2,False,55,70,0.1 +1853,-inf,0.0,8841,0.0,0.0,0.0,3241,0.0,0.0,12,71.9,52.6,90.5,27.4,1,True,150,55,0.1 +1854,-inf,0.0,4229,0.0,0.0,0.0,1523,0.0,0.0,16,72.4,50.5,85.2,43.1,2,False,40,55,0.1 +1855,-inf,0.0,2530,0.0,0.0,0.0,906,0.0,0.0,12,67.2,55.4,90.3,39.2,8,False,120,41,0.1 +1856,-inf,0.0,2368,0.0,0.0,0.0,807,0.0,0.0,10,16.7,73.6,97.1,11.7,3,False,120,35,0.1 +1857,-inf,0.0,3255,0.0,0.0,0.0,1168,0.0,0.0,18,67.9,55.6,77.3,38.7,3,False,90,55,0.1 +1858,-inf,0.0,1977,0.0,0.0,0.0,689,0.0,0.0,18,17.2,62.1,90.7,9.3,6,False,71,41,0.1 +1859,-inf,0.0,4022,0.0,0.0,0.0,1421,0.0,0.0,14,19.4,55.6,85.5,7.4,3,False,71,41,0.1 +1860,-inf,0.0,1323,0.0,0.0,0.0,457,0.0,0.0,18,18.5,65.9,92.5,13.5,12,False,71,35,0.1 +1861,-inf,0.0,4219,0.0,0.0,0.0,1526,0.0,0.0,14,10.3,62.8,85.2,5.3,1,False,150,90,0.1 +1862,-inf,0.0,2179,0.0,0.0,0.0,754,0.0,0.0,16,73.1,44.4,92.0,52.4,4,False,71,90,0.1 +1863,-inf,0.0,4672,0.0,0.0,0.0,1683,0.0,0.0,12,17.8,63.5,89.8,17.2,3,True,71,90,0.1 +1864,-inf,0.0,1481,0.0,0.0,0.0,547,0.0,0.0,14,7.9,73.5,96.1,2.9,1,False,55,90,0.1 +1865,-inf,0.0,3579,0.0,0.0,0.0,1248,0.0,0.0,10,81.3,54.6,78.0,23.3,3,False,90,41,0.1 +1866,-inf,0.0,3232,0.0,0.0,0.0,1165,0.0,0.0,21,18.6,60.2,90.4,15.6,12,True,120,55,0.1 +1867,-inf,0.0,1217,0.0,0.0,0.0,416,0.0,0.0,12,16.2,77.7,93.4,11.2,3,True,71,90,0.1 +1868,-inf,0.0,1886,0.0,0.0,0.0,686,0.0,0.0,18,6.6,68.5,97.4,1.6,2,True,55,90,0.1 +1869,-inf,0.0,5078,0.0,0.0,0.0,1856,0.0,0.0,16,68.4,43.9,78.7,40.8,8,True,71,70,0.1 +1870,-inf,0.0,3095,0.0,0.0,0.0,1121,0.0,0.0,16,10.6,53.2,97.4,5.6,4,False,40,41,0.1 +1871,-inf,0.0,3503,0.0,0.0,0.0,1277,0.0,0.0,12,73.4,51.6,90.2,29.2,4,False,71,90,0.1 +1872,-inf,0.0,1980,0.0,0.0,0.0,692,0.0,0.0,18,19.8,65.9,92.8,14.8,3,False,71,70,0.1 +1873,-inf,0.0,435,0.0,0.0,0.0,150,0.0,0.0,18,20.9,77.5,97.4,15.9,4,False,55,70,0.1 +1874,-inf,0.0,2828,0.0,0.0,0.0,981,0.0,0.0,12,75.6,42.6,91.8,57.4,3,False,71,35,0.1 +1875,-inf,0.0,3962,0.0,0.0,0.0,1413,0.0,0.0,18,67.6,55.1,79.1,43.9,2,False,40,90,0.1 +1876,-inf,0.0,2388,0.0,0.0,0.0,847,0.0,0.0,12,10.4,67.4,96.2,5.4,4,False,150,55,0.1 +1877,-inf,0.0,991,0.0,0.0,0.0,349,0.0,0.0,18,5.5,68.9,94.1,0.5,12,False,55,55,0.1 +1878,-inf,0.0,2726,0.0,0.0,0.0,994,0.0,0.0,14,4.7,54.3,98.7,-0.3,6,False,71,70,0.1 +1879,-inf,0.0,8237,0.0,0.0,0.0,2897,0.0,0.0,10,18.1,52.7,98.0,13.1,1,False,71,55,0.1 +1880,-inf,0.0,1848,0.0,0.0,0.0,645,0.0,0.0,16,64.4,41.7,84.9,42.6,4,False,120,70,0.1 +1881,-inf,0.0,343,0.0,0.0,0.0,131,0.0,0.0,21,8.3,74.3,88.7,3.3,6,False,150,20,0.1 +1882,-inf,0.0,2043,0.0,0.0,0.0,715,0.0,0.0,16,65.2,43.5,91.1,43.5,4,False,150,41,0.1 +1883,-inf,0.0,5077,0.0,0.0,0.0,1941,0.0,0.0,14,70.3,57.6,80.8,23.6,8,True,90,90,0.1 +1884,-inf,0.0,3477,0.0,0.0,0.0,1269,0.0,0.0,18,16.2,60.9,96.7,11.2,8,True,71,90,0.1 +1885,-inf,0.0,1875,0.0,0.0,0.0,657,0.0,0.0,21,66.7,38.8,76.5,59.4,3,False,90,20,0.1 +1886,-inf,0.0,1213,0.0,0.0,0.0,431,0.0,0.0,21,70.6,48.5,85.0,52.9,12,False,150,35,0.1 +1887,-inf,0.0,6148,0.0,0.0,0.0,2247,0.0,0.0,10,15.9,60.8,91.6,10.9,3,True,150,20,0.1 +1888,-inf,0.0,3281,0.0,0.0,0.0,1186,0.0,0.0,18,68.9,56.2,77.1,60.7,4,False,55,41,0.1 +1889,-inf,0.0,3093,0.0,0.0,0.0,1093,0.0,0.0,16,74.1,54.2,72.4,33.0,3,False,40,55,0.1 +1890,-inf,0.0,2119,0.0,0.0,0.0,733,0.0,0.0,12,69.4,41.2,91.6,40.7,4,False,40,70,0.1 +1891,-inf,0.0,3162,0.0,0.0,0.0,1107,0.0,0.0,18,80.2,54.9,80.9,35.7,3,False,90,35,0.1 +1892,-inf,0.0,7978,0.0,0.0,0.0,2944,0.0,0.0,12,70.2,55.5,74.4,31.8,2,True,90,70,0.1 +1893,-inf,0.0,6355,0.0,0.0,0.0,2292,0.0,0.0,16,64.0,39.2,81.0,53.6,2,True,71,70,0.1 +1894,-inf,0.0,2761,0.0,0.0,0.0,1004,0.0,0.0,14,63.6,51.8,77.7,41.5,8,False,71,41,0.1 +1895,-inf,0.0,4772,0.0,0.0,0.0,1665,0.0,0.0,14,78.3,41.5,90.5,58.6,1,False,40,55,0.1 +1896,-inf,0.0,3744,0.0,0.0,0.0,1303,0.0,0.0,10,18.9,61.0,96.3,13.9,6,False,90,55,0.1 +1897,-inf,0.0,2546,0.0,0.0,0.0,903,0.0,0.0,10,5.4,64.9,93.5,0.4,8,False,55,90,0.1 +1898,-inf,0.0,733,0.0,0.0,0.0,290,0.0,0.0,16,8.8,75.6,93.6,3.8,2,True,55,41,0.1 +1899,-inf,0.0,382,0.0,0.0,0.0,148,0.0,0.0,18,8.3,76.0,85.1,7.5,4,False,40,35,0.1 +1900,-inf,0.0,5540,0.0,0.0,0.0,1947,0.0,0.0,16,62.0,56.6,75.8,33.4,1,False,71,55,0.1 +1901,-inf,0.0,3896,0.0,0.0,0.0,1394,0.0,0.0,14,4.6,63.7,98.0,-0.4,1,False,40,41,0.1 +1902,-inf,0.0,1608,0.0,0.0,0.0,585,0.0,0.0,21,15.1,57.0,91.0,7.5,12,False,120,41,0.1 +1903,-inf,0.0,4010,0.0,0.0,0.0,1426,0.0,0.0,21,15.9,58.3,97.0,10.9,1,False,120,41,0.1 +1904,-inf,0.0,5576,0.0,0.0,0.0,1990,0.0,0.0,10,8.6,52.5,88.4,3.6,2,False,55,41,0.1 +1905,-inf,0.0,328,0.0,0.0,0.0,121,0.0,0.0,21,19.6,75.7,89.9,14.6,4,False,40,70,0.1 +1906,-inf,0.0,914,0.0,0.0,0.0,316,0.0,0.0,18,62.6,40.3,86.5,32.5,8,False,90,70,0.1 +1907,-inf,0.0,1687,0.0,0.0,0.0,555,0.0,0.0,14,71.6,56.2,79.9,18.3,4,False,40,70,0.1 +1908,-inf,0.0,2920,0.0,0.0,0.0,1057,0.0,0.0,18,13.8,63.9,87.6,11.9,6,True,55,55,0.1 +1909,-inf,0.0,2561,0.0,0.0,0.0,910,0.0,0.0,21,17.5,64.0,86.7,12.5,1,False,40,35,0.1 +1910,-inf,0.0,3136,0.0,0.0,0.0,1126,0.0,0.0,18,8.0,56.4,87.7,3.0,3,False,150,35,0.1 +1911,-inf,0.0,1720,0.0,0.0,0.0,574,0.0,0.0,12,20.7,74.9,86.8,15.7,6,False,90,35,0.1 +1912,-inf,0.0,2769,0.0,0.0,0.0,1009,0.0,0.0,14,8.9,54.4,86.0,3.9,6,False,150,35,0.1 +1913,-inf,0.0,4485,0.0,0.0,0.0,1556,0.0,0.0,14,20.5,58.0,87.8,15.3,2,False,150,90,0.1 +1914,-inf,0.0,2859,0.0,0.0,0.0,1055,0.0,0.0,18,16.6,63.9,88.2,11.6,6,True,150,55,0.1 +1915,-inf,0.0,1443,0.0,0.0,0.0,505,0.0,0.0,14,20.2,75.3,87.6,14.7,4,True,40,55,0.1 +1916,-inf,0.0,2615,0.0,0.0,0.0,930,0.0,0.0,14,6.2,64.5,88.6,1.2,3,False,120,41,0.1 +1917,-inf,0.0,1965,0.0,0.0,0.0,716,0.0,0.0,12,5.1,73.3,86.2,0.1,3,True,55,41,0.1 +1918,-inf,0.0,2420,0.0,0.0,0.0,849,0.0,0.0,18,20.8,58.2,94.1,16.2,6,False,40,20,0.1 +1919,-inf,0.0,1393,0.0,0.0,0.0,450,0.0,0.0,16,79.9,48.5,73.6,21.3,6,False,120,90,0.1 +1920,-inf,0.0,1887,0.0,0.0,0.0,670,0.0,0.0,14,17.7,72.2,94.4,15.8,6,True,71,70,0.1 +1921,-inf,0.0,3340,0.0,0.0,0.0,1217,0.0,0.0,14,65.6,47.2,91.0,58.7,3,False,90,90,0.1 +1922,-inf,0.0,2469,0.0,0.0,0.0,874,0.0,0.0,10,15.8,75.1,96.4,14.8,2,True,120,41,0.1 +1923,-inf,0.0,5532,0.0,0.0,0.0,1946,0.0,0.0,16,12.3,55.2,86.2,7.3,1,False,71,41,0.1 +1924,-inf,0.0,1484,0.0,0.0,0.0,493,0.0,0.0,12,18.0,75.3,94.5,13.0,4,False,55,35,0.1 +1925,-inf,0.0,1623,0.0,0.0,0.0,581,0.0,0.0,18,10.3,64.8,94.1,5.3,6,False,120,55,0.1 +1926,-inf,0.0,3113,0.0,0.0,0.0,1128,0.0,0.0,14,4.8,66.1,91.0,-0.2,3,True,40,90,0.1 +1927,-inf,0.0,938,0.0,0.0,0.0,353,0.0,0.0,12,4.4,77.9,94.9,-0.6,4,True,150,55,0.1 +1928,-inf,0.0,3252,0.0,0.0,0.0,1160,0.0,0.0,18,6.1,54.8,91.0,1.1,3,False,120,41,0.1 +1929,-inf,0.0,3733,0.0,0.0,0.0,1314,0.0,0.0,18,75.2,41.1,88.1,56.5,1,False,40,35,0.1 +1930,-inf,0.0,1214,0.0,0.0,0.0,414,0.0,0.0,21,16.0,68.8,93.0,5.5,2,False,40,35,0.1 +1931,-inf,0.0,1887,0.0,0.0,0.0,659,0.0,0.0,14,15.3,68.8,90.5,10.3,4,False,71,35,0.1 +1932,-inf,0.0,1211,0.0,0.0,0.0,428,0.0,0.0,14,6.0,70.6,87.4,1.0,12,False,55,35,0.1 +1933,-inf,0.0,2553,0.0,0.0,0.0,910,0.0,0.0,12,14.5,71.1,96.7,10.0,4,True,90,70,0.1 +1934,-inf,0.0,6430,0.0,0.0,0.0,2405,0.0,0.0,10,17.0,52.3,97.7,12.0,8,True,71,90,0.1 +1935,-inf,0.0,5473,0.0,0.0,0.0,2012,0.0,0.0,18,71.1,46.6,87.9,39.7,4,True,90,20,0.1 +1936,-inf,0.0,5020,0.0,0.0,0.0,1829,0.0,0.0,10,79.4,53.9,73.4,42.3,4,False,71,70,0.1 +1937,-inf,0.0,1892,0.0,0.0,0.0,666,0.0,0.0,21,16.7,57.6,87.5,11.7,8,False,150,90,0.1 +1938,-inf,0.0,7294,0.0,0.0,0.0,2673,0.0,0.0,12,75.6,57.8,84.1,47.6,1,True,150,70,0.1 +1939,-inf,0.0,2675,0.0,0.0,0.0,940,0.0,0.0,16,81.3,44.3,85.8,59.3,3,False,120,70,0.1 +1940,-inf,0.0,4001,0.0,0.0,0.0,1417,0.0,0.0,14,19.3,52.3,97.5,14.3,3,False,90,20,0.1 +1941,-inf,0.0,2718,0.0,0.0,0.0,929,0.0,0.0,12,76.6,46.0,86.8,24.0,4,False,150,20,0.1 +1942,-inf,0.0,873,0.0,0.0,0.0,311,0.0,0.0,21,11.7,70.1,97.7,6.7,3,False,120,55,0.1 +1943,-inf,0.0,1513,0.0,0.0,0.0,524,0.0,0.0,16,13.9,69.2,92.6,8.9,4,False,90,55,0.1 +1944,-inf,0.0,2240,0.0,0.0,0.0,795,0.0,0.0,16,11.8,61.1,93.8,6.8,6,False,55,20,0.1 +1945,-inf,0.0,4486,0.0,0.0,0.0,1595,0.0,0.0,14,78.8,44.1,92.0,27.5,8,True,40,35,0.1 +1946,-inf,0.0,1698,0.0,0.0,0.0,611,0.0,0.0,18,10.6,67.1,89.5,5.6,3,False,150,20,0.1 +1947,-inf,0.0,585,0.0,0.0,0.0,221,0.0,0.0,18,18.5,75.6,87.1,13.5,12,True,150,20,0.1 +1948,-inf,0.0,2473,0.0,0.0,0.0,866,0.0,0.0,14,68.8,43.7,82.8,33.8,4,False,55,70,0.1 +1949,-inf,0.0,1188,0.0,0.0,0.0,418,0.0,0.0,10,72.3,39.8,85.3,42.5,12,False,55,70,0.1 +1950,-inf,0.0,1905,0.0,0.0,0.0,721,0.0,0.0,21,7.9,66.6,94.0,2.9,2,True,55,90,0.1 +1951,-inf,0.0,3013,0.0,0.0,0.0,1085,0.0,0.0,21,68.4,51.8,87.7,27.8,3,False,71,90,0.1 +1952,-inf,0.0,4132,0.0,0.0,0.0,1478,0.0,0.0,14,12.1,63.1,86.2,7.1,1,False,55,41,0.1 +1953,-inf,0.0,4527,0.0,0.0,0.0,1616,0.0,0.0,14,7.3,53.9,92.7,2.3,2,False,120,90,0.1 +1954,-inf,0.0,1488,0.0,0.0,0.0,548,0.0,0.0,12,6.6,75.4,87.2,1.6,1,False,55,90,0.1 +1955,-inf,0.0,1395,0.0,0.0,0.0,477,0.0,0.0,14,16.5,72.4,88.7,14.0,4,False,71,35,0.1 +1956,-inf,0.0,1431,0.0,0.0,0.0,508,0.0,0.0,18,10.8,63.4,87.8,5.8,12,False,90,35,0.1 +1957,-inf,0.0,2147,0.0,0.0,0.0,770,0.0,0.0,14,78.7,44.0,81.1,58.5,6,False,40,70,0.1 +1958,-inf,0.0,1705,0.0,0.0,0.0,598,0.0,0.0,21,14.3,60.0,85.1,9.3,8,False,55,20,0.1 +1959,-inf,0.0,3052,0.0,0.0,0.0,1065,0.0,0.0,12,20.4,56.9,91.7,16.1,8,False,120,35,0.1 +1960,-inf,0.0,1788,0.0,0.0,0.0,628,0.0,0.0,12,7.6,71.8,93.1,2.6,3,False,150,20,0.1 +1961,-inf,0.0,2298,0.0,0.0,0.0,784,0.0,0.0,10,17.0,72.3,89.0,6.9,6,False,71,90,0.1 +1962,-inf,0.0,4858,0.0,0.0,0.0,1812,0.0,0.0,18,74.2,54.3,72.4,35.2,8,True,90,41,0.1 +1963,-inf,0.0,4581,0.0,0.0,0.0,1692,0.0,0.0,21,72.6,56.6,73.5,30.4,2,True,71,90,0.1 +1964,-inf,0.0,1421,0.0,0.0,0.0,496,0.0,0.0,16,14.9,70.4,88.6,9.9,3,False,71,70,0.1 +1965,-inf,0.0,3762,0.0,0.0,0.0,1361,0.0,0.0,14,4.6,53.0,98.5,-0.4,3,False,40,41,0.1 +1966,-inf,0.0,6654,0.0,0.0,0.0,2483,0.0,0.0,12,70.0,51.0,78.0,23.6,6,True,90,90,0.1 +1967,-inf,0.0,1422,0.0,0.0,0.0,497,0.0,0.0,14,11.0,68.0,87.7,6.0,12,False,120,35,0.1 +1968,-inf,0.0,6874,0.0,0.0,0.0,2549,0.0,0.0,12,74.8,54.0,84.6,57.1,8,True,40,70,0.1 +1969,-inf,0.0,3040,0.0,0.0,0.0,1093,0.0,0.0,21,8.7,53.0,92.4,3.7,3,False,150,55,0.1 +1970,-inf,0.0,2540,0.0,0.0,0.0,882,0.0,0.0,12,16.3,62.9,95.8,11.3,8,False,90,20,0.1 +1971,-inf,0.0,2975,0.0,0.0,0.0,1057,0.0,0.0,12,14.8,53.0,93.4,9.8,6,False,120,20,0.1 +1972,-inf,0.0,2459,0.0,0.0,0.0,841,0.0,0.0,14,19.2,68.4,92.8,14.2,2,False,55,41,0.1 +1973,-inf,0.0,779,0.0,0.0,0.0,284,0.0,0.0,18,11.8,71.1,96.4,6.8,12,False,90,90,0.1 +1974,-inf,0.0,4919,0.0,0.0,0.0,1731,0.0,0.0,21,9.4,52.3,98.0,4.4,1,False,55,41,0.1 +1975,-inf,0.0,5631,0.0,0.0,0.0,2048,0.0,0.0,12,18.6,58.9,89.3,4.6,8,True,71,55,0.1 +1976,-inf,0.0,5437,0.0,0.0,0.0,1954,0.0,0.0,18,78.8,50.3,83.6,43.8,1,False,120,90,0.1 +1977,-inf,0.0,2960,0.0,0.0,0.0,1036,0.0,0.0,10,69.1,41.0,91.6,28.3,3,False,71,20,0.1 +1978,-inf,0.0,243,0.0,0.0,0.0,99,0.0,0.0,18,12.3,78.0,95.9,7.3,8,False,150,35,0.1 +1979,-inf,0.0,3397,0.0,0.0,0.0,1198,0.0,0.0,21,18.1,60.2,98.7,11.4,8,True,71,20,0.1 +1980,-inf,0.0,5773,0.0,0.0,0.0,2034,0.0,0.0,16,19.4,56.1,88.2,14.4,1,True,55,20,0.1 +1981,-inf,0.0,1989,0.0,0.0,0.0,675,0.0,0.0,14,75.1,39.0,87.8,59.2,3,False,71,90,0.1 +1982,-inf,0.0,4571,0.0,0.0,0.0,1635,0.0,0.0,14,11.3,52.2,88.2,6.3,2,False,71,20,0.1 +1983,-inf,0.0,862,0.0,0.0,0.0,310,0.0,0.0,21,10.5,69.8,86.3,4.9,4,False,120,35,0.1 +1984,-inf,0.0,1127,0.0,0.0,0.0,361,0.0,0.0,21,76.1,49.2,77.2,25.7,8,False,120,20,0.1 +1985,-inf,0.0,6942,0.0,0.0,0.0,2543,0.0,0.0,21,63.1,52.1,83.2,20.1,2,True,55,55,0.1 +1986,-inf,0.0,8454,0.0,0.0,0.0,3192,0.0,0.0,12,64.8,53.6,76.2,49.3,3,True,150,90,0.1 +1987,-inf,0.0,4762,0.0,0.0,0.0,1671,0.0,0.0,10,13.0,62.0,87.0,8.0,2,False,120,41,0.1 +1988,-inf,0.0,1347,0.0,0.0,0.0,452,0.0,0.0,14,18.8,71.3,97.6,13.8,12,False,120,55,0.1 +1989,-inf,0.0,2015,0.0,0.0,0.0,705,0.0,0.0,16,13.0,63.2,93.9,8.0,6,False,40,41,0.1 +1990,-inf,0.0,3277,0.0,0.0,0.0,1167,0.0,0.0,18,81.2,53.3,90.4,48.7,3,False,120,35,0.1 +1991,-inf,0.0,4916,0.0,0.0,0.0,1731,0.0,0.0,16,10.2,58.2,94.2,5.2,1,False,120,35,0.1 +1992,-inf,0.0,5363,0.0,0.0,0.0,1891,0.0,0.0,14,16.8,58.9,85.4,11.8,1,False,90,20,0.1 +1993,-inf,0.0,3447,0.0,0.0,0.0,1217,0.0,0.0,16,16.4,56.7,93.1,11.4,3,False,90,35,0.1 +1994,-inf,0.0,3621,0.0,0.0,0.0,1270,0.0,0.0,21,12.4,60.0,93.7,7.4,1,False,90,90,0.1 +1995,-inf,0.0,2439,0.0,0.0,0.0,814,0.0,0.0,12,74.3,38.2,72.8,40.6,8,False,90,35,0.1 +1996,-inf,0.0,8673,0.0,0.0,0.0,3158,0.0,0.0,16,65.5,48.5,91.2,26.2,1,True,90,70,0.1 +1997,-inf,0.0,4659,0.0,0.0,0.0,1680,0.0,0.0,10,4.1,52.8,85.4,-0.9,3,False,120,35,0.1 +1998,-inf,0.0,5303,0.0,0.0,0.0,1885,0.0,0.0,10,75.0,47.7,90.4,46.8,2,False,150,90,0.1 +1999,-inf,0.0,5000,0.0,0.0,0.0,1822,0.0,0.0,18,66.7,44.5,89.9,48.8,8,True,71,90,0.1 +2000,-inf,0.0,4580,0.0,0.0,0.0,1569,0.0,0.0,18,64.1,52.5,80.0,25.0,1,False,71,20,0.1 +2001,-inf,0.0,5657,0.0,0.0,0.0,2092,0.0,0.0,12,76.6,47.5,83.6,29.7,8,True,120,20,0.1 +2002,-inf,0.0,1279,0.0,0.0,0.0,450,0.0,0.0,16,21.0,74.0,95.3,16.0,4,True,71,20,0.1 +2003,-inf,0.0,4206,0.0,0.0,0.0,1534,0.0,0.0,12,64.2,47.9,83.1,41.7,3,False,71,90,0.1 +2004,-inf,0.0,7401,0.0,0.0,0.0,2686,0.0,0.0,10,21.3,56.4,87.9,16.3,6,True,90,41,0.1 +2005,-inf,0.0,3416,0.0,0.0,0.0,1187,0.0,0.0,12,75.2,55.4,90.3,18.6,4,False,120,55,0.1 +2006,-inf,0.0,4306,0.0,0.0,0.0,1540,0.0,0.0,10,64.4,48.8,90.6,36.0,3,False,150,20,0.1 +2007,-inf,0.0,2712,0.0,0.0,0.0,968,0.0,0.0,16,19.1,54.2,92.2,16.1,6,False,55,55,0.1 +2008,-inf,0.0,5796,0.0,0.0,0.0,2045,0.0,0.0,12,75.7,55.6,81.4,30.7,1,False,90,20,0.1 +2009,-inf,0.0,3504,0.0,0.0,0.0,1170,0.0,0.0,18,81.7,54.7,79.2,29.3,2,False,71,70,0.1 +2010,-inf,0.0,3654,0.0,0.0,0.0,1314,0.0,0.0,16,10.0,62.7,93.5,5.0,2,True,120,20,0.1 +2011,-inf,0.0,3169,0.0,0.0,0.0,1059,0.0,0.0,12,68.8,56.8,79.6,22.0,3,False,90,55,0.1 +2012,-inf,0.0,306,0.0,0.0,0.0,119,0.0,0.0,18,14.9,77.9,87.3,9.9,2,False,90,70,0.1 +2013,-inf,0.0,6578,0.0,0.0,0.0,2364,0.0,0.0,10,68.6,39.1,85.9,32.1,6,True,120,20,0.1 +2014,-inf,0.0,1336,0.0,0.0,0.0,477,0.0,0.0,18,5.1,66.5,91.1,0.1,8,False,120,90,0.1 +2015,-inf,0.0,1067,0.0,0.0,0.0,376,0.0,0.0,18,4.1,68.2,85.0,-0.9,12,False,55,35,0.1 +2016,-inf,0.0,3390,0.0,0.0,0.0,1177,0.0,0.0,14,18.8,58.0,93.3,13.8,4,False,120,20,0.1 +2017,-inf,0.0,2218,0.0,0.0,0.0,788,0.0,0.0,16,10.0,61.3,96.9,5.0,6,False,150,90,0.1 +2018,-inf,0.0,3170,0.0,0.0,0.0,1108,0.0,0.0,14,81.8,42.8,72.0,40.5,3,False,150,35,0.1 +2019,-inf,0.0,2833,0.0,0.0,0.0,995,0.0,0.0,18,76.0,43.0,84.9,42.1,2,False,90,70,0.1 +2020,-inf,0.0,2750,0.0,0.0,0.0,993,0.0,0.0,12,14.8,70.3,90.7,14.6,4,True,55,90,0.1 +2021,-inf,0.0,5366,0.0,0.0,0.0,1957,0.0,0.0,18,63.4,46.6,80.7,32.7,12,True,90,41,0.1 +2022,-inf,0.0,742,0.0,0.0,0.0,252,0.0,0.0,16,20.0,75.8,90.7,15.0,4,False,90,70,0.1 +2023,-inf,0.0,500,0.0,0.0,0.0,185,0.0,0.0,21,14.6,72.9,89.9,9.6,4,False,55,35,0.1 +2024,-inf,0.0,621,0.0,0.0,0.0,241,0.0,0.0,18,14.8,74.9,85.3,9.2,2,True,120,41,0.1 +2025,-inf,0.0,2372,0.0,0.0,0.0,835,0.0,0.0,14,16.5,63.1,88.8,11.5,6,False,150,90,0.1 +2026,-inf,0.0,4039,0.0,0.0,0.0,1440,0.0,0.0,21,66.2,44.9,89.1,19.1,1,False,71,90,0.1 +2027,-inf,0.0,497,0.0,0.0,0.0,176,0.0,0.0,16,18.6,77.5,98.7,13.6,6,False,40,20,0.1 +2028,-inf,0.0,1349,0.0,0.0,0.0,485,0.0,0.0,21,16.2,66.6,86.6,15.1,4,False,120,35,0.1 +2029,-inf,0.0,3263,0.0,0.0,0.0,1184,0.0,0.0,10,76.8,51.5,82.9,54.0,8,False,150,41,0.1 +2030,-inf,0.0,4033,0.0,0.0,0.0,1437,0.0,0.0,14,20.9,64.0,91.4,8.0,8,True,40,70,0.1 +2031,-inf,0.0,2367,0.0,0.0,0.0,883,0.0,0.0,14,63.4,55.2,80.4,54.2,12,False,150,70,0.1 +2032,-inf,0.0,1607,0.0,0.0,0.0,547,0.0,0.0,12,64.7,46.2,81.4,19.0,8,False,90,20,0.1 +2033,-inf,0.0,2103,0.0,0.0,0.0,766,0.0,0.0,18,6.8,54.5,96.0,1.8,8,False,90,70,0.1 +2034,-inf,0.0,2011,0.0,0.0,0.0,726,0.0,0.0,12,64.3,39.4,82.0,59.4,8,False,120,90,0.1 +2035,-inf,0.0,1472,0.0,0.0,0.0,522,0.0,0.0,18,18.6,70.6,89.7,10.2,6,True,55,55,0.1 +2036,-inf,0.0,4403,0.0,0.0,0.0,1567,0.0,0.0,18,11.1,58.7,85.2,6.1,1,False,120,90,0.1 +2037,-inf,0.0,4079,0.0,0.0,0.0,1411,0.0,0.0,14,19.0,59.9,88.3,14.0,2,False,55,20,0.1 +2038,-inf,0.0,3846,0.0,0.0,0.0,1339,0.0,0.0,18,65.4,41.9,89.5,23.4,1,False,40,41,0.1 +2039,-inf,0.0,5521,0.0,0.0,0.0,2030,0.0,0.0,14,72.8,57.9,79.4,48.9,8,True,90,70,0.1 +2040,-inf,0.0,1906,0.0,0.0,0.0,666,0.0,0.0,16,5.5,66.0,94.2,0.5,4,False,120,41,0.1 +2041,-inf,0.0,2073,0.0,0.0,0.0,734,0.0,0.0,10,12.4,74.2,85.9,7.4,3,False,40,90,0.1 +2042,-inf,0.0,970,0.0,0.0,0.0,332,0.0,0.0,14,17.1,75.0,99.0,12.1,6,False,71,55,0.1 +2043,-inf,0.0,1135,0.0,0.0,0.0,401,0.0,0.0,10,8.0,76.9,98.5,3.0,12,False,71,41,0.1 +2044,-inf,0.0,2790,0.0,0.0,0.0,1032,0.0,0.0,21,66.7,48.3,85.8,44.2,3,False,90,90,0.1 +2045,-inf,0.0,1227,0.0,0.0,0.0,428,0.0,0.0,21,11.1,63.8,96.6,5.5,12,False,40,20,0.1 +2046,-inf,0.0,3586,0.0,0.0,0.0,1301,0.0,0.0,14,69.1,55.7,76.7,52.0,6,False,120,70,0.1 +2047,-inf,0.0,3715,0.0,0.0,0.0,1322,0.0,0.0,18,79.9,55.8,91.4,27.0,2,False,120,35,0.1 +2048,-inf,0.0,1753,0.0,0.0,0.0,590,0.0,0.0,10,14.3,75.9,92.6,13.2,4,False,90,20,0.1 +2049,-inf,0.0,1557,0.0,0.0,0.0,555,0.0,0.0,14,72.3,41.8,81.1,38.7,8,False,55,55,0.1 +2050,-inf,0.0,2340,0.0,0.0,0.0,864,0.0,0.0,18,7.3,66.6,90.5,2.3,4,True,71,20,0.1 +2051,-inf,0.0,2387,0.0,0.0,0.0,868,0.0,0.0,10,6.4,66.5,92.3,1.4,8,False,90,41,0.1 +2052,-inf,0.0,2599,0.0,0.0,0.0,913,0.0,0.0,14,7.0,66.3,91.7,2.0,2,False,55,55,0.1 +2053,-inf,0.0,3736,0.0,0.0,0.0,1343,0.0,0.0,18,64.3,56.9,86.0,45.7,2,False,90,41,0.1 +2054,-inf,0.0,2023,0.0,0.0,0.0,684,0.0,0.0,10,15.7,72.8,96.8,12.2,8,False,55,90,0.1 +2055,-inf,0.0,507,0.0,0.0,0.0,190,0.0,0.0,16,6.3,76.2,93.5,1.3,4,False,55,55,0.1 +2056,-inf,0.0,1155,0.0,0.0,0.0,402,0.0,0.0,21,12.5,67.9,92.0,7.5,4,False,40,55,0.1 +2057,-inf,0.0,6287,0.0,0.0,0.0,2199,0.0,0.0,12,63.8,46.5,89.5,26.1,1,False,40,35,0.1 +2058,-inf,0.0,3731,0.0,0.0,0.0,1348,0.0,0.0,16,80.0,46.2,90.3,32.3,2,False,40,90,0.1 +2059,-inf,0.0,1140,0.0,0.0,0.0,404,0.0,0.0,21,73.7,44.1,76.7,46.8,12,False,90,41,0.1 +2060,-inf,0.0,8897,0.0,0.0,0.0,3271,0.0,0.0,10,73.8,53.8,81.0,56.9,3,True,55,70,0.1 +2061,-inf,0.0,3124,0.0,0.0,0.0,1115,0.0,0.0,18,10.7,56.2,88.9,5.7,3,False,55,41,0.1 +2062,-inf,0.0,3662,0.0,0.0,0.0,1320,0.0,0.0,16,74.0,39.0,82.5,44.3,4,True,120,41,0.1 +2063,-inf,0.0,2303,0.0,0.0,0.0,813,0.0,0.0,16,9.6,64.4,87.3,4.6,3,False,55,90,0.1 +2064,-inf,0.0,6529,0.0,0.0,0.0,2346,0.0,0.0,14,64.9,53.4,89.9,47.4,1,False,90,90,0.1 +2065,-inf,0.0,1126,0.0,0.0,0.0,383,0.0,0.0,10,77.7,45.5,91.7,21.1,12,False,150,41,0.1 +2066,-inf,0.0,6491,0.0,0.0,0.0,2387,0.0,0.0,12,11.7,53.6,94.8,9.9,2,True,120,41,0.1 +2067,-inf,0.0,9527,0.0,0.0,0.0,3445,0.0,0.0,10,76.0,52.0,80.6,26.9,1,True,71,41,0.1 +2068,-inf,0.0,3062,0.0,0.0,0.0,1119,0.0,0.0,18,76.4,54.7,80.5,58.6,4,False,55,55,0.1 +2069,-inf,0.0,4915,0.0,0.0,0.0,1758,0.0,0.0,16,76.2,44.0,75.4,51.9,3,True,90,35,0.1 +2070,-inf,0.0,630,0.0,0.0,0.0,218,0.0,0.0,18,20.3,73.8,89.6,15.3,12,False,55,41,0.1 +2071,-inf,0.0,1081,0.0,0.0,0.0,378,0.0,0.0,16,67.6,40.2,83.8,43.3,8,False,90,70,0.1 +2072,-inf,0.0,1848,0.0,0.0,0.0,669,0.0,0.0,18,21.5,55.1,97.5,16.5,12,False,55,41,0.1 +2073,-inf,0.0,3737,0.0,0.0,0.0,1311,0.0,0.0,12,81.9,40.8,83.1,50.9,2,False,150,90,0.1 +2074,-inf,0.0,3498,0.0,0.0,0.0,1243,0.0,0.0,16,15.0,55.3,92.3,10.0,3,False,120,41,0.1 +2075,-inf,0.0,3308,0.0,0.0,0.0,1169,0.0,0.0,21,5.0,61.1,86.7,-0.0,1,False,150,35,0.1 +2076,-inf,0.0,1157,0.0,0.0,0.0,365,0.0,0.0,12,75.4,42.3,72.8,19.0,6,False,71,41,0.1 +2077,-inf,0.0,8287,0.0,0.0,0.0,3098,0.0,0.0,10,75.6,53.9,86.0,32.7,2,True,150,20,0.1 +2078,-inf,0.0,2654,0.0,0.0,0.0,877,0.0,0.0,10,76.0,50.1,80.2,20.1,4,False,71,90,0.1 +2079,-inf,0.0,4104,0.0,0.0,0.0,1548,0.0,0.0,21,79.9,55.2,86.4,59.2,8,True,90,70,0.1 +2080,-inf,0.0,4729,0.0,0.0,0.0,1668,0.0,0.0,14,17.7,61.4,92.8,7.8,1,False,90,35,0.1 +2081,-inf,0.0,3046,0.0,0.0,0.0,1120,0.0,0.0,14,76.4,47.8,81.1,35.3,4,False,90,70,0.1 +2082,-inf,0.0,2361,0.0,0.0,0.0,838,0.0,0.0,14,71.0,49.5,89.9,20.7,6,False,90,41,0.1 +2083,-inf,0.0,589,0.0,0.0,0.0,221,0.0,0.0,21,12.7,72.3,87.5,7.7,3,False,71,55,0.1 +2084,-inf,0.0,1839,0.0,0.0,0.0,588,0.0,0.0,21,68.9,48.9,77.7,22.8,3,False,40,70,0.1 +2085,-inf,0.0,3519,0.0,0.0,0.0,1310,0.0,0.0,21,75.3,44.7,84.7,60.7,6,True,150,55,0.1 +2086,-inf,0.0,4139,0.0,0.0,0.0,1479,0.0,0.0,12,11.4,56.3,93.8,6.4,3,False,150,55,0.1 +2087,-inf,0.0,6968,0.0,0.0,0.0,2471,0.0,0.0,10,78.5,41.0,77.7,57.2,2,True,55,35,0.1 +2088,-inf,0.0,2061,0.0,0.0,0.0,725,0.0,0.0,12,64.7,41.5,83.1,38.3,6,False,90,55,0.1 +2089,-inf,0.0,3221,0.0,0.0,0.0,1073,0.0,0.0,10,21.7,72.1,95.0,16.7,3,False,150,90,0.1 +2090,-inf,0.0,2031,0.0,0.0,0.0,712,0.0,0.0,21,65.4,55.9,74.9,18.7,2,False,40,70,0.1 +2091,-inf,0.0,1898,0.0,0.0,0.0,700,0.0,0.0,10,6.7,75.7,94.3,1.7,4,True,150,55,0.1 +2092,-inf,0.0,4212,0.0,0.0,0.0,1603,0.0,0.0,21,80.3,50.7,86.5,44.5,6,True,150,35,0.1 +2093,-inf,0.0,1479,0.0,0.0,0.0,528,0.0,0.0,21,15.1,68.5,87.4,10.1,3,True,40,41,0.1 +2094,-inf,0.0,2581,0.0,0.0,0.0,952,0.0,0.0,10,80.5,51.1,87.8,41.5,8,False,40,70,0.1 +2095,-inf,0.0,4437,0.0,0.0,0.0,1558,0.0,0.0,10,16.9,56.1,93.6,11.9,4,False,150,20,0.1 +2096,-inf,0.0,4640,0.0,0.0,0.0,1726,0.0,0.0,18,17.7,55.3,88.4,12.7,4,True,150,55,0.1 +2097,-inf,0.0,6816,0.0,0.0,0.0,2438,0.0,0.0,14,74.4,54.4,73.5,49.4,1,False,90,41,0.1 +2098,-inf,0.0,3258,0.0,0.0,0.0,1191,0.0,0.0,18,81.5,50.7,89.9,44.9,3,False,55,55,0.1 +2099,-inf,0.0,7439,0.0,0.0,0.0,2661,0.0,0.0,10,73.0,51.8,76.5,53.5,2,False,40,70,0.1 +2100,-inf,0.0,5209,0.0,0.0,0.0,1913,0.0,0.0,16,76.2,48.4,83.6,45.5,6,True,40,55,0.1 +2101,-inf,0.0,5878,0.0,0.0,0.0,2191,0.0,0.0,16,63.5,48.7,75.5,21.3,12,True,71,35,0.1 +2102,-inf,0.0,8199,0.0,0.0,0.0,2981,0.0,0.0,12,64.3,53.0,82.4,60.7,1,False,150,55,0.1 +2103,-inf,0.0,1933,0.0,0.0,0.0,690,0.0,0.0,21,72.7,56.4,85.5,58.0,8,False,120,41,0.1 +2104,-inf,0.0,772,0.0,0.0,0.0,291,0.0,0.0,21,15.0,71.4,86.0,10.0,2,False,90,20,0.1 +2105,-inf,0.0,2685,0.0,0.0,0.0,953,0.0,0.0,16,80.3,42.6,77.0,54.1,3,False,120,35,0.1 +2106,-inf,0.0,5828,0.0,0.0,0.0,2179,0.0,0.0,12,5.6,52.3,90.5,0.6,6,True,40,90,0.1 +2107,-inf,0.0,1797,0.0,0.0,0.0,588,0.0,0.0,12,76.7,50.8,81.3,22.9,8,False,90,41,0.1 +2108,-inf,0.0,4533,0.0,0.0,0.0,1663,0.0,0.0,21,64.9,41.1,78.0,45.5,4,True,120,41,0.1 +2109,-inf,0.0,6903,0.0,0.0,0.0,2419,0.0,0.0,12,17.3,55.2,96.4,12.3,1,False,150,35,0.1 +2110,-inf,0.0,5739,0.0,0.0,0.0,2031,0.0,0.0,12,62.6,44.8,73.4,53.9,3,False,150,90,0.1 +2111,-inf,0.0,2102,0.0,0.0,0.0,747,0.0,0.0,21,79.5,45.7,72.5,34.2,4,False,71,55,0.1 +2112,-inf,0.0,5284,0.0,0.0,0.0,1952,0.0,0.0,18,67.6,55.9,90.6,41.9,12,True,55,35,0.1 +2113,-inf,0.0,2551,0.0,0.0,0.0,946,0.0,0.0,18,65.8,53.6,80.1,43.4,6,False,40,41,0.1 +2114,-inf,0.0,1612,0.0,0.0,0.0,550,0.0,0.0,18,19.1,69.0,89.1,14.1,2,False,90,55,0.1 +2115,-inf,0.0,969,0.0,0.0,0.0,335,0.0,0.0,21,64.8,42.0,84.3,39.7,8,False,71,35,0.1 +2116,-inf,0.0,1446,0.0,0.0,0.0,500,0.0,0.0,14,21.0,75.5,90.6,16.0,1,False,150,90,0.1 +2117,-inf,0.0,7360,0.0,0.0,0.0,2629,0.0,0.0,14,62.4,39.4,83.8,61.4,8,True,90,20,0.1 +2118,-inf,0.0,3034,0.0,0.0,0.0,1079,0.0,0.0,12,15.3,65.6,85.8,12.7,3,False,40,20,0.1 +2119,-inf,0.0,2479,0.0,0.0,0.0,860,0.0,0.0,18,79.5,44.7,88.7,56.1,3,False,40,70,0.1 +2120,-inf,0.0,2432,0.0,0.0,0.0,810,0.0,0.0,16,62.6,39.6,88.4,24.5,2,False,90,20,0.1 +2121,-inf,0.0,3007,0.0,0.0,0.0,1038,0.0,0.0,18,71.9,44.5,72.1,31.8,2,False,120,90,0.1 +2122,-inf,0.0,5039,0.0,0.0,0.0,1732,0.0,0.0,18,80.9,49.3,81.7,31.8,1,False,120,55,0.1 +2123,-inf,0.0,6128,0.0,0.0,0.0,2293,0.0,0.0,10,9.2,57.9,97.0,4.2,6,True,150,20,0.1 +2124,-inf,0.0,4174,0.0,0.0,0.0,1513,0.0,0.0,12,8.2,64.8,94.3,3.2,1,False,40,20,0.1 +2125,-inf,0.0,4597,0.0,0.0,0.0,1596,0.0,0.0,14,62.6,38.2,80.8,53.5,1,False,71,20,0.1 +2126,-inf,0.0,4865,0.0,0.0,0.0,1735,0.0,0.0,12,68.2,48.7,89.7,50.2,2,False,120,70,0.1 +2127,-inf,0.0,2024,0.0,0.0,0.0,704,0.0,0.0,14,79.3,50.6,81.7,23.8,6,False,150,41,0.1 +2128,-inf,0.0,2894,0.0,0.0,0.0,1005,0.0,0.0,10,68.4,39.7,87.8,23.2,3,False,120,41,0.1 +2129,-inf,0.0,7219,0.0,0.0,0.0,2728,0.0,0.0,10,74.2,53.2,90.3,30.4,6,True,71,70,0.1 +2130,-inf,0.0,3007,0.0,0.0,0.0,1053,0.0,0.0,12,20.8,64.8,85.2,15.8,6,False,40,41,0.1 +2131,-inf,0.0,362,0.0,0.0,0.0,140,0.0,0.0,18,10.2,75.3,87.0,5.2,12,False,55,70,0.1 +2132,-inf,0.0,1752,0.0,0.0,0.0,616,0.0,0.0,18,4.3,61.9,87.0,-0.7,8,False,40,20,0.1 +2133,-inf,0.0,1407,0.0,0.0,0.0,491,0.0,0.0,14,10.2,70.9,95.1,5.2,6,False,55,55,0.1 +2134,-inf,0.0,5433,0.0,0.0,0.0,1936,0.0,0.0,16,80.3,56.2,73.4,51.2,1,False,120,55,0.1 +2135,-inf,0.0,880,0.0,0.0,0.0,299,0.0,0.0,16,77.0,41.1,82.0,44.0,12,False,150,35,0.1 +2136,-inf,0.0,1154,0.0,0.0,0.0,392,0.0,0.0,18,71.1,40.6,85.2,38.8,6,False,55,55,0.1 +2137,-inf,0.0,3988,0.0,0.0,0.0,1443,0.0,0.0,14,76.6,39.5,89.5,31.0,4,True,120,41,0.1 +2138,-inf,0.0,4167,0.0,0.0,0.0,1517,0.0,0.0,18,82.0,50.6,73.0,53.7,2,False,150,55,0.1 +2139,-inf,0.0,8541,0.0,0.0,0.0,3079,0.0,0.0,16,67.0,53.5,87.5,54.8,1,True,40,55,0.1 +2140,-inf,0.0,1765,0.0,0.0,0.0,657,0.0,0.0,12,7.0,74.0,96.1,2.0,4,True,90,90,0.1 +2141,-inf,0.0,5248,0.0,0.0,0.0,1919,0.0,0.0,18,73.0,55.5,75.8,34.4,3,True,90,55,0.1 +2142,-inf,0.0,5289,0.0,0.0,0.0,1879,0.0,0.0,16,12.0,56.6,90.0,7.0,1,False,90,35,0.1 +2143,-inf,0.0,1953,0.0,0.0,0.0,700,0.0,0.0,14,15.7,72.0,95.9,11.7,1,True,150,90,0.1 +2144,-inf,0.0,3453,0.0,0.0,0.0,1235,0.0,0.0,16,15.4,63.8,98.2,10.4,1,False,150,90,0.1 +2145,-inf,0.0,8463,0.0,0.0,0.0,3255,0.0,0.0,10,67.7,50.6,81.6,53.2,8,True,150,70,0.1 +2146,-inf,0.0,1591,0.0,0.0,0.0,575,0.0,0.0,21,14.8,57.3,91.4,9.8,12,False,120,35,0.1 +2147,-inf,0.0,1041,0.0,0.0,0.0,344,0.0,0.0,16,68.2,39.7,82.2,20.4,6,False,90,35,0.1 +2148,-inf,0.0,3871,0.0,0.0,0.0,1434,0.0,0.0,16,17.5,60.8,86.0,12.5,6,True,150,70,0.1 +2149,-inf,0.0,1770,0.0,0.0,0.0,591,0.0,0.0,12,74.8,57.6,76.9,21.0,6,False,90,35,0.1 +2150,-inf,0.0,2137,0.0,0.0,0.0,753,0.0,0.0,21,6.7,56.5,85.5,1.7,6,False,120,90,0.1 +2151,-inf,0.0,3914,0.0,0.0,0.0,1399,0.0,0.0,12,12.7,59.2,86.2,7.7,3,False,55,55,0.1 +2152,-inf,0.0,4417,0.0,0.0,0.0,1565,0.0,0.0,18,21.0,59.3,94.5,16.0,1,False,150,70,0.1 +2153,-inf,0.0,1321,0.0,0.0,0.0,467,0.0,0.0,14,78.5,49.8,84.0,22.3,12,False,55,35,0.1 +2154,-inf,0.0,1667,0.0,0.0,0.0,583,0.0,0.0,12,67.2,42.0,89.2,41.5,6,False,150,55,0.1 +2155,-inf,0.0,4839,0.0,0.0,0.0,1741,0.0,0.0,21,4.4,55.2,93.2,-0.6,1,True,40,70,0.1 +2156,-inf,0.0,4538,0.0,0.0,0.0,1629,0.0,0.0,14,9.8,62.0,91.7,4.8,1,True,120,70,0.1 +2157,-inf,0.0,1882,0.0,0.0,0.0,644,0.0,0.0,16,18.7,69.3,95.0,13.7,2,False,90,20,0.1 +2158,-inf,0.0,1304,0.0,0.0,0.0,478,0.0,0.0,18,71.9,44.2,78.5,58.0,12,False,90,41,0.1 +2159,-inf,0.0,1166,0.0,0.0,0.0,398,0.0,0.0,18,21.1,69.9,98.8,21.0,8,False,71,35,0.1 +2160,-inf,0.0,7334,0.0,0.0,0.0,2645,0.0,0.0,12,73.1,57.8,75.7,54.5,1,False,55,55,0.1 +2161,-inf,0.0,5927,0.0,0.0,0.0,2090,0.0,0.0,14,16.9,56.7,95.8,11.9,1,False,55,70,0.1 +2162,-inf,0.0,1398,0.0,0.0,0.0,517,0.0,0.0,14,10.1,74.0,93.1,5.1,1,True,55,41,0.1 +2163,-inf,0.0,341,0.0,0.0,0.0,133,0.0,0.0,21,15.4,75.8,91.3,10.4,1,True,150,55,0.1 +2164,-inf,0.0,6164,0.0,0.0,0.0,2306,0.0,0.0,12,63.7,44.8,77.5,24.9,12,True,120,20,0.1 +2165,-inf,0.0,7319,0.0,0.0,0.0,2698,0.0,0.0,14,68.4,44.6,90.0,24.1,2,True,150,41,0.1 +2166,-inf,0.0,1224,0.0,0.0,0.0,462,0.0,0.0,16,5.6,72.8,92.8,0.6,3,True,71,90,0.1 +2167,-inf,0.0,1315,0.0,0.0,0.0,443,0.0,0.0,21,69.9,40.2,83.7,34.5,4,False,40,20,0.1 +2168,-inf,0.0,1274,0.0,0.0,0.0,447,0.0,0.0,10,7.2,77.3,86.6,2.2,6,False,71,90,0.1 +2169,-inf,0.0,4132,0.0,0.0,0.0,1485,0.0,0.0,12,8.9,55.2,93.5,3.9,3,False,120,70,0.1 +2170,-inf,0.0,538,0.0,0.0,0.0,195,0.0,0.0,21,4.5,72.0,94.5,-0.5,6,False,90,35,0.1 +2171,-inf,0.0,1082,0.0,0.0,0.0,386,0.0,0.0,16,5.9,70.7,90.2,0.9,8,False,150,70,0.1 +2172,-inf,0.0,2884,0.0,0.0,0.0,1008,0.0,0.0,21,19.8,59.8,91.9,14.8,2,False,150,41,0.1 +2173,-inf,0.0,3341,0.0,0.0,0.0,1189,0.0,0.0,18,19.1,59.5,98.6,10.6,2,False,120,55,0.1 +2174,-inf,0.0,2067,0.0,0.0,0.0,735,0.0,0.0,18,9.5,63.0,91.1,7.7,4,False,55,55,0.1 +2175,-inf,0.0,3263,0.0,0.0,0.0,1168,0.0,0.0,21,20.7,57.7,98.8,4.1,2,False,71,70,0.1 +2176,-inf,0.0,5073,0.0,0.0,0.0,1905,0.0,0.0,16,73.1,49.1,78.0,38.7,8,True,120,55,0.1 +2177,-inf,0.0,781,0.0,0.0,0.0,282,0.0,0.0,16,18.6,76.0,93.9,13.6,8,True,120,70,0.1 +2178,-inf,0.0,3487,0.0,0.0,0.0,1267,0.0,0.0,14,5.9,64.7,92.6,0.9,3,True,120,55,0.1 +2179,-inf,0.0,2823,0.0,0.0,0.0,1017,0.0,0.0,12,4.8,70.1,88.5,4.5,1,True,120,55,0.1 +2180,-inf,0.0,6483,0.0,0.0,0.0,2444,0.0,0.0,14,73.5,52.1,87.8,30.8,3,True,150,41,0.1 +2181,-inf,0.0,1369,0.0,0.0,0.0,488,0.0,0.0,18,10.4,64.1,89.8,5.4,12,False,40,35,0.1 +2182,-inf,0.0,5057,0.0,0.0,0.0,1645,0.0,0.0,12,81.9,46.9,80.7,24.0,1,False,90,35,0.1 +2183,-inf,0.0,4475,0.0,0.0,0.0,1603,0.0,0.0,14,5.1,61.8,98.7,0.1,1,False,90,55,0.1 +2184,-inf,0.0,4868,0.0,0.0,0.0,1780,0.0,0.0,16,75.5,46.4,74.3,61.5,8,True,71,41,0.1 +2185,-inf,0.0,828,0.0,0.0,0.0,272,0.0,0.0,14,69.7,39.1,79.8,19.2,8,False,55,70,0.1 +2186,-inf,0.0,4086,0.0,0.0,0.0,1475,0.0,0.0,12,66.4,49.6,85.8,40.7,3,False,150,55,0.1 +2187,-inf,0.0,1806,0.0,0.0,0.0,626,0.0,0.0,16,21.7,67.8,86.0,16.7,6,False,150,90,0.1 +2188,-inf,0.0,7164,0.0,0.0,0.0,2536,0.0,0.0,10,19.2,60.8,93.2,14.2,1,True,71,70,0.1 +2189,-inf,0.0,867,0.0,0.0,0.0,308,0.0,0.0,18,9.3,70.9,96.6,4.3,8,False,120,70,0.1 +2190,-inf,0.0,5489,0.0,0.0,0.0,2054,0.0,0.0,12,13.9,57.3,97.9,8.9,8,True,150,20,0.1 +2191,-inf,0.0,6985,0.0,0.0,0.0,2527,0.0,0.0,10,6.2,56.5,85.5,1.2,2,True,71,41,0.1 +2192,-inf,0.0,970,0.0,0.0,0.0,342,0.0,0.0,18,18.1,71.9,92.5,13.1,3,False,55,90,0.1 +2193,-inf,0.0,469,0.0,0.0,0.0,187,0.0,0.0,16,8.3,77.5,97.1,3.3,4,True,71,55,0.1 +2194,-inf,0.0,3852,0.0,0.0,0.0,1335,0.0,0.0,18,70.5,51.5,87.1,27.1,2,False,71,55,0.1 +2195,-inf,0.0,2890,0.0,0.0,0.0,1001,0.0,0.0,10,76.8,45.4,87.3,22.2,4,False,71,20,0.1 +2196,-inf,0.0,3337,0.0,0.0,0.0,1144,0.0,0.0,10,20.8,65.6,94.4,17.7,8,False,120,20,0.1 +2197,-inf,0.0,5340,0.0,0.0,0.0,1899,0.0,0.0,12,73.7,40.5,79.8,44.5,6,True,90,35,0.1 +2198,-inf,0.0,1613,0.0,0.0,0.0,599,0.0,0.0,16,4.9,71.0,92.8,-0.1,8,True,71,20,0.1 +2199,-inf,0.0,5524,0.0,0.0,0.0,1978,0.0,0.0,12,75.9,54.7,72.7,43.8,2,False,90,55,0.1 +2200,-inf,0.0,3874,0.0,0.0,0.0,1378,0.0,0.0,10,10.2,65.8,91.1,5.2,2,False,40,35,0.1 +2201,-inf,0.0,1621,0.0,0.0,0.0,590,0.0,0.0,21,7.2,66.5,85.5,2.2,2,False,55,90,0.1 +2202,-inf,0.0,1436,0.0,0.0,0.0,472,0.0,0.0,12,20.7,76.5,98.2,15.7,8,False,120,90,0.1 +2203,-inf,0.0,2174,0.0,0.0,0.0,788,0.0,0.0,12,10.2,57.8,85.4,5.2,12,False,120,90,0.1 +2204,-inf,0.0,940,0.0,0.0,0.0,360,0.0,0.0,16,16.8,74.9,97.8,11.8,2,True,71,41,0.1 +2205,-inf,0.0,1683,0.0,0.0,0.0,595,0.0,0.0,18,66.4,57.2,87.9,26.9,12,False,90,90,0.1 +2206,-inf,0.0,3628,0.0,0.0,0.0,1299,0.0,0.0,18,9.4,57.0,96.4,4.4,2,False,40,70,0.1 +2207,-inf,0.0,1572,0.0,0.0,0.0,574,0.0,0.0,21,10.8,54.4,86.4,5.8,12,False,90,70,0.1 +2208,-inf,0.0,5480,0.0,0.0,0.0,1931,0.0,0.0,16,16.6,56.0,98.3,8.0,1,False,40,70,0.1 +2209,-inf,0.0,2809,0.0,0.0,0.0,1010,0.0,0.0,18,11.2,55.9,92.3,6.2,4,False,150,35,0.1 +2210,-inf,0.0,2103,0.0,0.0,0.0,736,0.0,0.0,16,63.2,52.9,83.5,27.4,8,False,40,55,0.1 +2211,-inf,0.0,3787,0.0,0.0,0.0,1318,0.0,0.0,12,19.9,59.5,91.7,7.7,4,False,71,20,0.1 +2212,-inf,0.0,4465,0.0,0.0,0.0,1589,0.0,0.0,21,11.2,56.2,96.6,6.2,1,False,90,55,0.1 +2213,-inf,0.0,3495,0.0,0.0,0.0,1271,0.0,0.0,16,10.7,52.0,86.9,5.7,3,False,150,35,0.1 +2214,-inf,0.0,1840,0.0,0.0,0.0,626,0.0,0.0,16,20.9,68.3,92.7,5.9,4,False,55,55,0.1 +2215,-inf,0.0,2193,0.0,0.0,0.0,783,0.0,0.0,16,71.6,42.1,74.0,56.5,8,False,90,41,0.1 +2216,-inf,0.0,4272,0.0,0.0,0.0,1546,0.0,0.0,14,63.4,47.1,89.3,41.7,2,False,150,20,0.1 +2217,-inf,0.0,5282,0.0,0.0,0.0,1879,0.0,0.0,16,10.4,56.6,98.1,5.4,1,False,120,20,0.1 +2218,-inf,0.0,1090,0.0,0.0,0.0,360,0.0,0.0,16,68.7,39.3,90.0,61.1,6,False,40,35,0.1 +2219,-inf,0.0,2686,0.0,0.0,0.0,976,0.0,0.0,14,7.2,53.4,90.7,2.2,6,False,90,55,0.1 +2220,-inf,0.0,3300,0.0,0.0,0.0,1194,0.0,0.0,18,6.9,52.3,87.8,1.9,3,False,90,35,0.1 +2221,-inf,0.0,3761,0.0,0.0,0.0,1389,0.0,0.0,14,71.8,55.8,80.4,56.0,4,False,71,55,0.1 +2222,-inf,0.0,3919,0.0,0.0,0.0,1472,0.0,0.0,21,79.3,56.6,90.5,28.8,4,True,120,90,0.1 +2223,-inf,0.0,1754,0.0,0.0,0.0,616,0.0,0.0,14,8.4,70.9,95.9,3.4,2,False,71,70,0.1 +2224,-inf,0.0,1116,0.0,0.0,0.0,394,0.0,0.0,14,10.0,72.6,86.0,5.0,8,False,40,90,0.1 +2225,-inf,0.0,4104,0.0,0.0,0.0,1463,0.0,0.0,18,70.2,38.6,81.7,18.2,2,True,90,90,0.1 +2226,-inf,0.0,3302,0.0,0.0,0.0,1186,0.0,0.0,12,6.4,68.0,97.7,1.4,2,True,90,35,0.1 +2227,-inf,0.0,1169,0.0,0.0,0.0,402,0.0,0.0,16,20.5,70.7,93.3,12.9,12,False,150,55,0.1 +2228,-inf,0.0,3075,0.0,0.0,0.0,1075,0.0,0.0,18,10.9,60.5,90.7,5.9,2,False,90,90,0.1 +2229,-inf,0.0,3603,0.0,0.0,0.0,1301,0.0,0.0,10,63.0,49.7,83.2,46.3,6,False,71,20,0.1 +2230,-inf,0.0,1205,0.0,0.0,0.0,447,0.0,0.0,14,15.4,75.1,90.1,10.4,8,True,120,70,0.1 +2231,-inf,0.0,4769,0.0,0.0,0.0,1709,0.0,0.0,12,76.6,55.9,91.3,29.8,2,False,120,90,0.1 +2232,-inf,0.0,4409,0.0,0.0,0.0,1632,0.0,0.0,14,6.0,60.4,94.8,1.0,6,True,90,70,0.1 +2233,-inf,0.0,3004,0.0,0.0,0.0,1039,0.0,0.0,12,66.8,47.9,72.1,20.6,3,False,90,55,0.1 +2234,-inf,0.0,6949,0.0,0.0,0.0,2496,0.0,0.0,12,68.7,51.8,87.8,40.4,1,False,40,41,0.1 +2235,-inf,0.0,1843,0.0,0.0,0.0,620,0.0,0.0,10,18.3,77.8,96.3,13.3,3,False,150,70,0.1 +2236,-inf,0.0,2992,0.0,0.0,0.0,1058,0.0,0.0,14,20.3,53.6,93.3,15.3,6,False,40,55,0.1 +2237,-inf,0.0,1262,0.0,0.0,0.0,448,0.0,0.0,18,7.9,70.2,94.9,2.9,2,False,90,41,0.1 +2238,-inf,0.0,699,0.0,0.0,0.0,245,0.0,0.0,16,17.1,76.3,92.7,12.1,1,False,40,55,0.1 +2239,-inf,0.0,2598,0.0,0.0,0.0,927,0.0,0.0,21,5.8,64.0,93.7,0.8,1,True,120,70,0.1 +2240,-inf,0.0,7415,0.0,0.0,0.0,2727,0.0,0.0,14,65.2,51.1,73.4,35.5,6,True,55,41,0.1 +2241,-inf,0.0,2490,0.0,0.0,0.0,873,0.0,0.0,10,14.3,74.7,88.6,9.3,1,False,55,55,0.1 +2242,-inf,0.0,7473,0.0,0.0,0.0,2646,0.0,0.0,10,8.1,54.8,94.1,3.1,1,False,55,70,0.1 +2243,-inf,0.0,909,0.0,0.0,0.0,332,0.0,0.0,18,12.6,72.3,95.6,7.6,2,False,120,90,0.1 +2244,-inf,0.0,1904,0.0,0.0,0.0,641,0.0,0.0,12,20.4,72.9,95.3,8.3,6,False,90,35,0.1 +2245,-inf,0.0,1523,0.0,0.0,0.0,546,0.0,0.0,16,21.7,72.8,94.3,11.4,4,True,150,35,0.1 +2246,-inf,0.0,6311,0.0,0.0,0.0,2228,0.0,0.0,10,81.1,41.0,87.5,48.9,1,False,55,20,0.1 +2247,-inf,0.0,5567,0.0,0.0,0.0,2006,0.0,0.0,12,68.1,53.4,73.4,37.7,2,False,120,35,0.1 +2248,-inf,0.0,4727,0.0,0.0,0.0,1735,0.0,0.0,21,4.6,52.2,96.2,-0.4,2,True,55,70,0.1 +2249,-inf,0.0,5324,0.0,0.0,0.0,1858,0.0,0.0,12,79.8,39.0,76.8,50.0,1,False,40,55,0.1 +7,-inf,-3702.499999999246,5838,0.9800726265973512,109.82528050701528,-2439.700000000009,2106,0.9739617297087294,99.05403201379352,16,63.5,48.2,75.3,33.1,1,False,150,20,0.1 +2251,-inf,0.0,2071,0.0,0.0,0.0,742,0.0,0.0,18,80.8,56.3,87.6,41.4,8,False,90,41,0.1 +2252,-inf,0.0,1503,0.0,0.0,0.0,532,0.0,0.0,21,12.4,63.9,90.9,7.4,6,False,120,90,0.1 +2253,-inf,0.0,3999,0.0,0.0,0.0,1413,0.0,0.0,21,78.6,44.1,92.0,55.7,1,False,90,55,0.1 +2254,-inf,0.0,2547,0.0,0.0,0.0,886,0.0,0.0,21,5.8,61.3,93.8,0.8,2,False,120,41,0.1 +2255,-inf,0.0,2190,0.0,0.0,0.0,771,0.0,0.0,10,80.4,38.2,86.7,30.8,4,False,71,90,0.1 +2256,-inf,0.0,6605,0.0,0.0,0.0,2430,0.0,0.0,10,15.1,53.2,86.2,10.1,8,True,90,55,0.1 +2257,-inf,0.0,4365,0.0,0.0,0.0,1576,0.0,0.0,10,5.8,59.1,95.9,0.8,3,False,71,70,0.1 +2258,-inf,0.0,2625,0.0,0.0,0.0,938,0.0,0.0,10,68.9,47.8,91.0,46.9,6,False,150,20,0.1 +2259,-inf,0.0,2614,0.0,0.0,0.0,939,0.0,0.0,14,12.0,63.1,96.0,7.0,4,False,150,20,0.1 +2260,-inf,0.0,5307,0.0,0.0,0.0,1932,0.0,0.0,18,71.5,44.7,88.2,21.1,2,True,150,41,0.1 +2261,-inf,0.0,3363,0.0,0.0,0.0,1210,0.0,0.0,12,13.0,65.1,95.2,8.0,2,False,40,70,0.1 +2262,-inf,0.0,4843,0.0,0.0,0.0,1753,0.0,0.0,12,9.8,62.3,95.3,4.8,4,True,40,20,0.1 +2263,-inf,0.0,2742,0.0,0.0,0.0,959,0.0,0.0,10,19.5,75.5,90.5,15.1,4,True,150,41,0.1 +2264,-inf,0.0,3294,0.0,0.0,0.0,1156,0.0,0.0,14,62.3,42.3,91.8,52.5,2,False,71,55,0.1 +2265,-inf,0.0,393,0.0,0.0,0.0,151,0.0,0.0,21,8.1,74.0,90.1,3.1,3,False,71,55,0.1 +2266,-inf,0.0,3010,0.0,0.0,0.0,1076,0.0,0.0,18,18.5,58.6,88.4,13.5,3,False,90,90,0.1 +2267,-inf,0.0,3245,0.0,0.0,0.0,1164,0.0,0.0,16,6.8,58.0,98.7,1.8,3,False,150,55,0.1 +2268,-inf,0.0,5304,0.0,0.0,0.0,1861,0.0,0.0,10,19.9,54.8,91.8,8.1,3,False,120,55,0.1 +2269,-inf,0.0,4071,0.0,0.0,0.0,1423,0.0,0.0,10,15.7,69.1,89.9,10.7,1,False,71,70,0.1 +2270,-inf,0.0,963,0.0,0.0,0.0,336,0.0,0.0,21,78.6,45.1,82.5,58.5,12,False,55,20,0.1 +2271,-inf,0.0,5633,0.0,0.0,0.0,1980,0.0,0.0,12,21.5,54.5,88.6,16.5,2,False,90,90,0.1 +2272,-inf,0.0,1961,0.0,0.0,0.0,728,0.0,0.0,21,67.0,53.5,77.1,36.7,8,False,90,90,0.1 +2273,-inf,0.0,1667,0.0,0.0,0.0,547,0.0,0.0,12,79.9,56.9,82.5,23.4,12,False,71,55,0.1 +2274,-inf,0.0,797,0.0,0.0,0.0,280,0.0,0.0,18,16.1,72.2,85.3,11.1,6,False,90,20,0.1 +2275,-inf,0.0,1402,0.0,0.0,0.0,490,0.0,0.0,21,21.1,62.7,86.6,16.1,12,False,90,90,0.1 +2276,-inf,0.0,3798,0.0,0.0,0.0,1398,0.0,0.0,16,11.6,61.2,90.8,4.3,8,True,120,20,0.1 +2277,-inf,0.0,2333,0.0,0.0,0.0,816,0.0,0.0,16,72.7,42.3,85.6,40.2,3,False,150,20,0.1 +2278,-inf,0.0,5354,0.0,0.0,0.0,1900,0.0,0.0,18,10.2,53.5,96.0,5.2,1,False,55,90,0.1 +2279,-inf,0.0,8712,0.0,0.0,0.0,3077,0.0,0.0,10,19.7,52.7,89.5,14.7,1,True,120,41,0.1 +2280,-inf,0.0,1126,0.0,0.0,0.0,406,0.0,0.0,12,10.6,76.1,97.0,5.6,3,False,120,90,0.1 +2281,-inf,0.0,1104,0.0,0.0,0.0,386,0.0,0.0,16,17.8,72.8,86.2,12.8,3,False,150,70,0.1 +2282,-inf,0.0,3187,0.0,0.0,0.0,1131,0.0,0.0,12,17.6,69.2,88.2,8.0,6,True,90,70,0.1 +2283,-inf,0.0,3611,0.0,0.0,0.0,1266,0.0,0.0,18,4.2,61.7,85.6,-0.8,1,False,71,20,0.1 +2284,-inf,0.0,1289,0.0,0.0,0.0,460,0.0,0.0,21,11.4,63.0,93.6,6.4,12,False,150,55,0.1 +2285,-inf,0.0,3156,0.0,0.0,0.0,1139,0.0,0.0,10,63.0,55.9,85.0,44.5,8,False,40,35,0.1 +2286,-inf,0.0,2908,0.0,0.0,0.0,1032,0.0,0.0,16,71.3,45.9,90.0,39.4,3,False,90,41,0.1 +2287,-inf,0.0,4011,0.0,0.0,0.0,1377,0.0,0.0,14,76.2,38.8,87.0,49.3,1,False,40,90,0.1 +2288,-inf,0.0,3237,0.0,0.0,0.0,1151,0.0,0.0,18,67.8,54.9,90.4,50.1,3,False,120,41,0.1 +2289,-inf,0.0,7676,0.0,0.0,0.0,2790,0.0,0.0,18,66.3,53.1,88.4,50.3,1,True,150,55,0.1 +2290,-inf,0.0,647,0.0,0.0,0.0,243,0.0,0.0,18,5.3,73.8,96.1,0.3,3,False,120,35,0.1 +2291,-inf,0.0,2642,0.0,0.0,0.0,945,0.0,0.0,12,13.7,63.6,87.9,8.7,6,False,71,70,0.1 +2292,-inf,0.0,11972,0.0,0.0,0.0,4341,0.0,0.0,10,67.9,49.7,78.7,60.3,1,True,55,55,0.1 +2293,-inf,0.0,2645,0.0,0.0,0.0,945,0.0,0.0,21,20.4,56.3,87.0,15.4,4,False,40,70,0.1 +2294,-inf,0.0,2690,0.0,0.0,0.0,917,0.0,0.0,21,68.1,39.8,73.1,46.1,2,False,40,55,0.1 +2295,-inf,0.0,2259,0.0,0.0,0.0,800,0.0,0.0,14,17.2,62.8,85.3,14.3,8,False,40,35,0.1 +2296,-inf,0.0,653,0.0,0.0,0.0,254,0.0,0.0,18,5.7,74.0,93.5,0.7,2,False,55,90,0.1 +2297,-inf,0.0,1345,0.0,0.0,0.0,441,0.0,0.0,12,73.0,42.6,76.3,19.7,6,False,71,90,0.1 +2298,-inf,0.0,4922,0.0,0.0,0.0,1760,0.0,0.0,14,72.7,40.9,84.9,25.1,4,True,90,55,0.1 +2299,-inf,0.0,3135,0.0,0.0,0.0,1115,0.0,0.0,18,8.3,55.9,96.5,3.3,3,False,71,90,0.1 +2300,-inf,0.0,3161,0.0,0.0,0.0,1138,0.0,0.0,21,7.0,57.8,95.5,2.0,2,False,90,90,0.1 +2301,-inf,0.0,5052,0.0,0.0,0.0,1937,0.0,0.0,14,78.1,55.8,81.9,32.6,6,True,150,90,0.1 +2302,-inf,0.0,3027,0.0,0.0,0.0,1090,0.0,0.0,21,15.0,53.3,95.9,10.0,3,False,40,55,0.1 +2303,-inf,0.0,2896,0.0,0.0,0.0,1032,0.0,0.0,18,69.7,57.8,76.6,45.1,4,False,150,35,0.1 +2304,-inf,0.0,1740,0.0,0.0,0.0,617,0.0,0.0,18,18.1,68.2,88.6,14.7,2,False,55,55,0.1 +2305,-inf,0.0,3455,0.0,0.0,0.0,1265,0.0,0.0,10,70.5,57.5,84.4,36.4,6,False,40,35,0.1 +2306,-inf,0.0,3827,0.0,0.0,0.0,1447,0.0,0.0,21,15.2,54.0,86.6,10.2,12,True,120,90,0.1 +2307,-inf,0.0,1696,0.0,0.0,0.0,605,0.0,0.0,10,66.8,50.6,92.0,57.4,12,False,71,41,0.1 +2308,-inf,0.0,6256,0.0,0.0,0.0,2262,0.0,0.0,21,70.2,50.3,85.6,37.1,1,True,90,70,0.1 +2309,-inf,0.0,646,0.0,0.0,0.0,247,0.0,0.0,16,4.5,76.0,90.6,-0.5,12,True,71,41,0.1 +2310,-inf,0.0,3159,0.0,0.0,0.0,1110,0.0,0.0,18,20.7,63.7,88.7,15.7,12,True,40,20,0.1 +2311,-inf,0.0,4832,0.0,0.0,0.0,1837,0.0,0.0,16,77.6,52.5,82.7,52.3,12,True,120,70,0.1 +2312,-inf,0.0,339,0.0,0.0,0.0,126,0.0,0.0,21,20.7,76.2,92.9,5.0,3,False,120,55,0.1 +2313,-inf,0.0,2986,0.0,0.0,0.0,1066,0.0,0.0,21,73.2,53.9,89.2,59.8,3,False,71,41,0.1 +2314,-inf,0.0,2675,0.0,0.0,0.0,904,0.0,0.0,21,80.3,38.7,83.2,61.9,1,False,71,41,0.1 +2315,-inf,0.0,2064,0.0,0.0,0.0,714,0.0,0.0,12,19.2,73.5,95.8,14.2,2,False,55,41,0.1 +2316,-inf,0.0,3116,0.0,0.0,0.0,1106,0.0,0.0,21,12.9,61.4,88.9,7.9,4,True,40,55,0.1 +2317,-inf,0.0,1685,0.0,0.0,0.0,567,0.0,0.0,14,20.2,68.0,95.3,15.2,12,False,90,41,0.1 +2318,-inf,0.0,1451,0.0,0.0,0.0,525,0.0,0.0,21,11.1,65.8,89.8,6.1,4,False,150,55,0.1 +2319,-inf,0.0,1645,0.0,0.0,0.0,606,0.0,0.0,14,7.2,72.7,87.3,2.2,1,False,120,20,0.1 +2320,-inf,0.0,2510,0.0,0.0,0.0,870,0.0,0.0,12,20.0,73.3,92.7,15.0,1,False,40,35,0.1 +2321,-inf,0.0,612,0.0,0.0,0.0,202,0.0,0.0,21,64.9,40.8,84.3,37.2,12,False,90,35,0.1 +2322,-inf,0.0,5339,0.0,0.0,0.0,1949,0.0,0.0,21,77.0,50.7,83.6,44.6,1,True,120,35,0.1 +2323,-inf,0.0,7902,0.0,0.0,0.0,2837,0.0,0.0,12,77.4,47.8,84.3,30.2,1,True,120,35,0.1 +2324,-inf,0.0,1311,0.0,0.0,0.0,465,0.0,0.0,14,8.0,70.9,97.5,3.0,8,False,90,70,0.1 +2325,-inf,0.0,2796,0.0,0.0,0.0,1009,0.0,0.0,10,80.2,54.9,88.9,45.0,8,False,120,55,0.1 +2326,-inf,0.0,3839,0.0,0.0,0.0,1338,0.0,0.0,12,20.3,59.4,94.0,7.0,4,False,40,35,0.1 +2327,-inf,0.0,3617,0.0,0.0,0.0,1270,0.0,0.0,12,16.2,67.4,89.1,11.2,6,True,40,41,0.1 +2328,-inf,0.0,1674,0.0,0.0,0.0,578,0.0,0.0,10,65.8,51.1,84.9,21.5,12,False,55,20,0.1 +2329,-inf,0.0,4959,0.0,0.0,0.0,1773,0.0,0.0,18,77.3,45.4,81.3,43.6,1,False,55,35,0.1 +2330,-inf,0.0,4793,0.0,0.0,0.0,1717,0.0,0.0,14,16.5,61.0,88.6,11.5,1,False,40,41,0.1 +2331,-inf,0.0,2120,0.0,0.0,0.0,773,0.0,0.0,16,7.4,52.4,89.6,2.4,8,False,150,55,0.1 +2332,-inf,0.0,8652,0.0,0.0,0.0,3232,0.0,0.0,12,64.8,48.1,84.4,18.9,3,True,90,90,0.1 +2333,-inf,0.0,2655,0.0,0.0,0.0,944,0.0,0.0,10,7.9,63.5,96.1,2.9,8,False,40,20,0.1 +2334,-inf,0.0,2203,0.0,0.0,0.0,768,0.0,0.0,16,72.4,40.5,82.1,58.9,3,False,71,70,0.1 +2335,-inf,0.0,2296,0.0,0.0,0.0,794,0.0,0.0,18,17.0,61.7,97.8,12.0,4,False,40,55,0.1 +2336,-inf,0.0,1553,0.0,0.0,0.0,534,0.0,0.0,10,68.2,39.3,79.3,27.5,12,False,40,70,0.1 +2337,-inf,0.0,5386,0.0,0.0,0.0,1882,0.0,0.0,10,74.2,44.2,73.4,39.8,3,False,90,70,0.1 +2338,-inf,0.0,3245,0.0,0.0,0.0,1125,0.0,0.0,12,22.0,71.2,88.6,17.0,1,False,40,70,0.1 +2339,-inf,0.0,5584,0.0,0.0,0.0,1966,0.0,0.0,12,7.0,60.0,94.8,2.0,1,False,55,90,0.1 +2340,-inf,0.0,7821,0.0,0.0,0.0,2875,0.0,0.0,10,75.0,55.4,86.4,39.8,4,True,40,55,0.1 +2341,-inf,0.0,2937,0.0,0.0,0.0,1062,0.0,0.0,12,81.0,38.8,86.9,30.1,12,True,150,70,0.1 +2342,-inf,0.0,4099,0.0,0.0,0.0,1494,0.0,0.0,18,78.8,42.9,80.4,34.7,2,True,120,41,0.1 +2343,-inf,0.0,8438,0.0,0.0,0.0,2961,0.0,0.0,10,20.1,53.0,87.9,9.6,1,False,120,55,0.1 +2344,-inf,0.0,870,0.0,0.0,0.0,308,0.0,0.0,14,4.4,74.7,95.6,-0.6,6,False,55,55,0.1 +2345,-inf,0.0,2280,0.0,0.0,0.0,769,0.0,0.0,14,64.7,38.4,77.5,29.5,4,False,71,90,0.1 +2346,-inf,0.0,5939,0.0,0.0,0.0,2114,0.0,0.0,12,6.9,58.5,86.6,1.9,1,False,150,20,0.1 +2347,-inf,0.0,6201,0.0,0.0,0.0,2292,0.0,0.0,12,12.9,54.6,87.3,7.9,4,True,71,55,0.1 +2348,-inf,0.0,741,0.0,0.0,0.0,265,0.0,0.0,14,16.0,76.4,94.7,11.0,8,False,90,20,0.1 +2349,-inf,0.0,478,0.0,0.0,0.0,179,0.0,0.0,18,9.1,74.9,91.6,9.0,4,False,40,90,0.1 +2350,-inf,0.0,2426,0.0,0.0,0.0,865,0.0,0.0,14,14.6,56.1,92.7,9.6,8,False,90,35,0.1 +2351,-inf,0.0,5652,0.0,0.0,0.0,2000,0.0,0.0,16,71.6,43.6,75.9,42.8,1,False,120,55,0.1 +2352,-inf,0.0,1471,0.0,0.0,0.0,513,0.0,0.0,16,5.3,69.3,92.9,0.3,4,False,90,70,0.1 +2353,-inf,0.0,4302,0.0,0.0,0.0,1588,0.0,0.0,10,75.6,54.4,86.9,52.3,4,False,71,90,0.1 +2354,-inf,0.0,3517,0.0,0.0,0.0,1254,0.0,0.0,12,19.0,64.1,88.4,14.0,3,False,71,35,0.1 +2355,-inf,0.0,4253,0.0,0.0,0.0,1593,0.0,0.0,12,4.2,63.1,96.3,-0.8,8,True,150,41,0.1 +2356,-inf,0.0,6645,0.0,0.0,0.0,2362,0.0,0.0,14,20.0,52.1,94.7,15.0,1,False,40,90,0.1 +2357,-inf,0.0,1635,0.0,0.0,0.0,582,0.0,0.0,18,77.6,53.1,91.6,34.6,12,False,40,20,0.1 +2358,-inf,0.0,5991,0.0,0.0,0.0,2096,0.0,0.0,12,16.0,60.0,88.9,8.9,1,True,40,70,0.1 +2359,-inf,0.0,1391,0.0,0.0,0.0,480,0.0,0.0,16,13.2,70.5,87.0,8.2,3,False,40,70,0.1 +2360,-inf,0.0,4865,0.0,0.0,0.0,1790,0.0,0.0,21,75.6,47.5,81.3,61.8,2,True,71,55,0.1 +2361,-inf,0.0,2339,0.0,0.0,0.0,814,0.0,0.0,18,11.4,61.1,88.6,6.4,4,False,55,41,0.1 +2362,-inf,0.0,1418,0.0,0.0,0.0,497,0.0,0.0,21,7.7,60.6,95.9,2.7,12,False,150,90,0.1 +2363,-inf,0.0,1003,0.0,0.0,0.0,349,0.0,0.0,14,12.9,74.0,97.2,7.9,6,False,150,70,0.1 +2364,-inf,0.0,4516,0.0,0.0,0.0,1580,0.0,0.0,14,75.1,39.1,79.8,36.3,1,False,71,35,0.1 +2365,-inf,0.0,4864,0.0,0.0,0.0,1783,0.0,0.0,12,4.6,61.2,90.9,-0.4,12,True,55,41,0.1 +2366,-inf,0.0,4721,0.0,0.0,0.0,1669,0.0,0.0,21,17.0,54.7,88.2,15.7,1,False,71,70,0.1 +2367,-inf,0.0,2534,0.0,0.0,0.0,904,0.0,0.0,16,5.8,61.5,86.3,0.8,4,False,71,41,0.1 +2368,-inf,0.0,366,0.0,0.0,0.0,133,0.0,0.0,18,19.1,77.7,94.7,8.5,4,False,40,35,0.1 +2369,-inf,0.0,1222,0.0,0.0,0.0,439,0.0,0.0,21,21.8,70.5,88.5,16.8,1,True,40,90,0.1 +2370,-inf,0.0,844,0.0,0.0,0.0,299,0.0,0.0,12,8.3,77.3,93.2,3.3,6,False,90,90,0.1 +2371,-inf,0.0,3726,0.0,0.0,0.0,1294,0.0,0.0,16,20.0,63.4,91.6,15.0,1,False,40,55,0.1 +2372,-inf,0.0,576,0.0,0.0,0.0,212,0.0,0.0,21,19.8,72.9,90.0,14.8,3,False,150,70,0.1 +2373,-inf,0.0,2577,0.0,0.0,0.0,933,0.0,0.0,10,74.0,53.8,89.6,24.0,8,False,120,55,0.1 +2374,-inf,0.0,1496,0.0,0.0,0.0,522,0.0,0.0,10,9.3,75.5,90.6,4.3,6,False,40,55,0.1 +2375,-inf,0.0,1262,0.0,0.0,0.0,446,0.0,0.0,21,7.2,63.3,95.0,2.2,12,False,120,70,0.1 +2376,-inf,0.0,1290,0.0,0.0,0.0,443,0.0,0.0,10,12.2,78.0,86.0,7.2,6,False,71,41,0.1 +2377,-inf,0.0,2906,0.0,0.0,0.0,1026,0.0,0.0,21,62.1,54.9,88.1,57.3,3,False,55,90,0.1 +2378,-inf,0.0,1094,0.0,0.0,0.0,379,0.0,0.0,18,79.8,46.5,90.1,26.9,12,False,90,35,0.1 +2379,-inf,0.0,2061,0.0,0.0,0.0,737,0.0,0.0,18,19.1,66.6,90.1,14.1,2,False,150,55,0.1 +2380,-inf,0.0,3961,0.0,0.0,0.0,1316,0.0,0.0,16,77.3,50.8,75.2,25.9,1,False,90,41,0.1 +2381,-inf,0.0,765,0.0,0.0,0.0,259,0.0,0.0,12,79.7,40.4,88.6,58.0,12,False,120,41,0.1 +2382,-inf,0.0,5229,0.0,0.0,0.0,1958,0.0,0.0,21,66.2,48.4,90.6,30.7,6,True,40,90,0.1 +2383,-inf,0.0,1422,0.0,0.0,0.0,506,0.0,0.0,14,75.3,44.2,89.0,45.1,8,False,120,70,0.1 +2384,-inf,0.0,1309,0.0,0.0,0.0,474,0.0,0.0,12,11.2,76.5,91.2,6.2,1,False,150,90,0.1 +2385,-inf,0.0,1614,0.0,0.0,0.0,569,0.0,0.0,18,16.8,64.1,90.8,11.8,8,False,55,90,0.1 +2386,-inf,0.0,2172,0.0,0.0,0.0,787,0.0,0.0,10,6.6,68.5,97.7,1.6,8,False,120,70,0.1 +2387,-inf,0.0,2768,0.0,0.0,0.0,1016,0.0,0.0,16,65.0,54.6,80.0,41.6,6,False,120,90,0.1 +2388,-inf,0.0,4799,0.0,0.0,0.0,1620,0.0,0.0,14,73.5,49.9,78.2,24.9,1,False,40,90,0.1 +2389,-inf,0.0,7156,0.0,0.0,0.0,2536,0.0,0.0,10,66.2,57.3,82.0,29.4,1,False,120,70,0.1 +2390,-inf,0.0,4592,0.0,0.0,0.0,1678,0.0,0.0,16,4.0,57.7,90.9,-1.0,6,True,71,55,0.1 +2391,-inf,0.0,1522,0.0,0.0,0.0,532,0.0,0.0,18,12.5,68.9,88.0,7.5,2,False,55,90,0.1 +2392,-inf,0.0,1963,0.0,0.0,0.0,695,0.0,0.0,16,19.9,56.9,86.1,4.3,12,False,120,55,0.1 +2393,-inf,0.0,2560,0.0,0.0,0.0,919,0.0,0.0,18,21.7,66.7,97.3,15.9,6,True,40,20,0.1 +2394,-inf,0.0,8106,0.0,0.0,0.0,3020,0.0,0.0,12,68.4,52.3,82.3,55.0,6,True,90,70,0.1 +2395,-inf,0.0,4064,0.0,0.0,0.0,1447,0.0,0.0,21,74.8,44.3,88.8,37.1,1,False,120,41,0.1 +2396,-inf,0.0,7450,0.0,0.0,0.0,2741,0.0,0.0,16,62.3,48.4,91.1,57.3,8,True,71,90,0.1 +2397,-inf,0.0,2230,0.0,0.0,0.0,785,0.0,0.0,21,4.8,61.2,97.1,-0.2,3,False,150,70,0.1 +2398,-inf,0.0,2794,0.0,0.0,0.0,986,0.0,0.0,18,16.2,60.0,93.1,11.2,3,False,55,20,0.1 +2399,-inf,0.0,1114,0.0,0.0,0.0,386,0.0,0.0,18,8.8,67.5,87.9,3.8,12,False,120,90,0.1 +2400,-inf,0.0,5948,0.0,0.0,0.0,2202,0.0,0.0,10,76.4,46.5,81.0,60.0,12,True,150,55,0.1 +2401,-inf,0.0,233,0.0,0.0,0.0,97,0.0,0.0,21,10.0,75.7,88.4,5.0,12,False,120,35,0.1 +2402,-inf,0.0,2721,0.0,0.0,0.0,946,0.0,0.0,16,18.5,62.6,98.4,13.5,3,False,120,90,0.1 +2403,-inf,0.0,1714,0.0,0.0,0.0,597,0.0,0.0,14,67.3,52.9,78.8,28.0,12,False,90,20,0.1 +2404,-inf,0.0,2567,0.0,0.0,0.0,928,0.0,0.0,12,70.6,57.4,87.8,31.1,8,False,55,20,0.1 +2405,-inf,0.0,2690,0.0,0.0,0.0,966,0.0,0.0,16,19.2,53.8,88.0,14.3,6,False,90,41,0.1 +2406,-inf,0.0,543,0.0,0.0,0.0,205,0.0,0.0,18,17.2,75.0,90.1,15.4,3,False,150,55,0.1 +2407,-inf,0.0,2855,0.0,0.0,0.0,997,0.0,0.0,21,17.9,59.8,93.7,12.9,2,False,71,70,0.1 +2408,-inf,0.0,1495,0.0,0.0,0.0,551,0.0,0.0,14,10.6,73.5,88.0,5.6,1,False,71,70,0.1 +2409,-inf,0.0,736,0.0,0.0,0.0,263,0.0,0.0,18,6.9,72.0,86.4,1.9,8,False,71,90,0.1 +2410,-inf,0.0,5756,0.0,0.0,0.0,2097,0.0,0.0,16,67.6,45.1,89.7,48.5,8,True,120,20,0.1 +2411,-inf,0.0,1146,0.0,0.0,0.0,403,0.0,0.0,10,10.6,77.1,95.7,5.6,12,False,90,35,0.1 +2412,-inf,0.0,7650,0.0,0.0,0.0,2723,0.0,0.0,10,11.0,53.2,96.1,6.0,1,False,90,35,0.1 +2413,-inf,0.0,4347,0.0,0.0,0.0,1566,0.0,0.0,18,67.5,38.9,75.9,21.5,4,True,71,20,0.1 +2414,-inf,0.0,4533,0.0,0.0,0.0,1595,0.0,0.0,10,11.5,62.4,94.8,6.5,2,False,90,41,0.1 +2415,-inf,0.0,3279,0.0,0.0,0.0,1174,0.0,0.0,18,79.4,39.8,89.0,29.0,2,True,40,70,0.1 +2416,-inf,0.0,2198,0.0,0.0,0.0,570,0.0,0.0,21,65.4,54.0,85.8,18.7,4,False,120,41,0.1 +2417,-inf,0.0,1925,0.0,0.0,0.0,688,0.0,0.0,12,5.6,67.4,93.6,0.6,8,False,90,35,0.1 +2418,-inf,0.0,3633,0.0,0.0,0.0,1262,0.0,0.0,16,67.4,44.9,72.6,49.5,4,False,55,55,0.1 +2419,-inf,0.0,3842,0.0,0.0,0.0,1370,0.0,0.0,14,65.1,47.3,73.5,31.5,3,False,120,70,0.1 +2420,-inf,0.0,2843,0.0,0.0,0.0,1026,0.0,0.0,10,4.8,68.6,92.4,-0.2,3,False,150,55,0.1 +2421,-inf,0.0,3454,0.0,0.0,0.0,1231,0.0,0.0,12,10.6,58.7,93.2,5.6,4,False,90,90,0.1 +2422,-inf,0.0,4117,0.0,0.0,0.0,1500,0.0,0.0,21,80.3,44.0,74.4,20.4,1,True,55,90,0.1 +2423,-inf,0.0,3370,0.0,0.0,0.0,1190,0.0,0.0,12,76.7,51.7,73.8,43.1,8,False,40,20,0.1 +2424,-inf,0.0,1557,0.0,0.0,0.0,563,0.0,0.0,21,16.6,68.1,85.6,11.6,8,True,71,41,0.1 +2425,-inf,0.0,1639,0.0,0.0,0.0,589,0.0,0.0,21,18.3,55.3,88.9,13.3,12,False,90,35,0.1 +2426,-inf,0.0,7039,0.0,0.0,0.0,2674,0.0,0.0,10,72.7,51.2,77.7,48.9,12,True,150,55,0.1 +2427,-inf,0.0,1790,0.0,0.0,0.0,625,0.0,0.0,16,14.7,63.8,94.3,8.1,8,False,71,20,0.1 +2428,-inf,0.0,298,0.0,0.0,0.0,120,0.0,0.0,21,14.1,76.4,92.3,9.1,12,True,55,20,0.1 +2429,-inf,0.0,5222,0.0,0.0,0.0,1867,0.0,0.0,12,67.0,53.7,73.2,56.8,6,False,40,90,0.1 +2430,-inf,0.0,1020,0.0,0.0,0.0,345,0.0,0.0,21,66.1,40.9,72.5,19.6,4,False,120,70,0.1 +2431,-inf,0.0,3375,0.0,0.0,0.0,1209,0.0,0.0,18,16.6,58.8,91.8,11.6,2,False,90,35,0.1 +2432,-inf,0.0,1114,0.0,0.0,0.0,367,0.0,0.0,12,74.1,40.5,80.9,28.0,12,False,40,55,0.1 +2433,-inf,0.0,1108,0.0,0.0,0.0,392,0.0,0.0,18,12.1,68.9,91.3,7.1,8,False,120,90,0.1 +2434,-inf,0.0,4648,0.0,0.0,0.0,1698,0.0,0.0,14,4.7,60.0,98.3,-0.3,3,True,40,90,0.1 +2435,-inf,0.0,2479,0.0,0.0,0.0,893,0.0,0.0,12,62.7,47.6,86.9,33.1,6,False,90,35,0.1 +2436,-inf,0.0,1623,0.0,0.0,0.0,560,0.0,0.0,10,69.7,39.6,83.1,25.6,8,False,150,20,0.1 +2437,-inf,0.0,3058,0.0,0.0,0.0,1127,0.0,0.0,16,70.4,51.0,82.7,35.8,4,False,40,20,0.1 +2438,-inf,0.0,2512,0.0,0.0,0.0,881,0.0,0.0,18,74.2,44.8,86.6,50.5,3,False,40,55,0.1 +2439,-inf,0.0,6131,0.0,0.0,0.0,2142,0.0,0.0,12,18.7,59.3,95.2,13.7,1,False,90,35,0.1 +2440,-inf,0.0,2154,0.0,0.0,0.0,787,0.0,0.0,16,68.5,48.7,77.0,61.9,12,False,40,41,0.1 +2441,-inf,0.0,5811,0.0,0.0,0.0,2015,0.0,0.0,10,76.5,39.7,72.5,27.5,1,False,55,41,0.1 +2442,-inf,0.0,1782,0.0,0.0,0.0,593,0.0,0.0,18,71.2,48.7,74.1,23.3,3,False,90,20,0.1 +2443,-inf,0.0,4903,0.0,0.0,0.0,1755,0.0,0.0,12,76.6,52.5,85.2,32.8,2,False,40,55,0.1 +2444,-inf,0.0,830,0.0,0.0,0.0,292,0.0,0.0,18,11.7,71.6,96.4,6.7,6,False,40,41,0.1 +2445,-inf,0.0,5569,0.0,0.0,0.0,2069,0.0,0.0,12,16.4,53.2,89.4,11.4,12,True,40,70,0.1 +2446,-inf,0.0,1444,0.0,0.0,0.0,506,0.0,0.0,21,14.1,63.3,88.0,9.1,8,False,150,55,0.1 +2447,-inf,0.0,2131,0.0,0.0,0.0,750,0.0,0.0,21,14.1,63.6,95.3,9.1,2,False,90,20,0.1 +2448,-inf,0.0,599,0.0,0.0,0.0,228,0.0,0.0,16,8.5,75.9,89.0,3.5,2,False,90,55,0.1 +2449,-inf,0.0,1953,0.0,0.0,0.0,666,0.0,0.0,12,66.9,44.9,80.5,21.2,6,False,40,35,0.1 +2450,-inf,0.0,2977,0.0,0.0,0.0,1086,0.0,0.0,12,6.8,56.5,95.6,1.8,6,False,40,41,0.1 +2451,-inf,0.0,2173,0.0,0.0,0.0,785,0.0,0.0,12,13.8,58.6,87.4,8.8,12,False,55,55,0.1 +2452,-inf,0.0,421,0.0,0.0,0.0,158,0.0,0.0,16,8.7,76.5,97.4,3.7,8,False,71,35,0.1 +2453,-inf,0.0,1928,0.0,0.0,0.0,680,0.0,0.0,16,63.7,46.4,88.2,32.3,6,False,40,20,0.1 +2454,-inf,0.0,5977,0.0,0.0,0.0,2192,0.0,0.0,10,78.3,44.9,76.3,54.3,8,True,150,55,0.1 +2455,-inf,0.0,2890,0.0,0.0,0.0,1014,0.0,0.0,10,20.3,59.3,94.9,18.0,12,False,150,20,0.1 +2456,-inf,0.0,1666,0.0,0.0,0.0,447,0.0,0.0,21,78.0,53.0,78.1,22.6,3,False,55,55,0.1 +2457,-inf,0.0,5039,0.0,0.0,0.0,1803,0.0,0.0,10,11.7,60.3,86.7,6.7,2,False,90,41,0.1 +2458,-inf,0.0,2914,0.0,0.0,0.0,1047,0.0,0.0,18,7.5,54.5,89.5,2.5,4,False,55,55,0.1 +2459,-inf,0.0,3858,0.0,0.0,0.0,1410,0.0,0.0,12,12.6,65.4,92.1,7.6,8,True,40,90,0.1 +2460,-inf,0.0,7592,0.0,0.0,0.0,2810,0.0,0.0,12,68.9,48.4,87.6,22.1,4,True,90,70,0.1 +2461,-inf,0.0,3171,0.0,0.0,0.0,1153,0.0,0.0,12,66.1,52.4,78.2,32.3,6,False,90,20,0.1 +2462,-inf,0.0,722,0.0,0.0,0.0,288,0.0,0.0,18,10.0,74.1,95.0,5.0,3,True,120,55,0.1 +2463,-inf,0.0,3020,0.0,0.0,0.0,1096,0.0,0.0,16,80.3,40.0,76.8,49.9,8,True,120,20,0.1 +2464,-inf,0.0,1424,0.0,0.0,0.0,495,0.0,0.0,14,19.1,74.9,95.1,14.1,1,False,55,90,0.1 +2465,-inf,0.0,480,0.0,0.0,0.0,183,0.0,0.0,18,12.7,75.4,98.2,7.7,2,False,90,35,0.1 +2466,-inf,0.0,349,0.0,0.0,0.0,131,0.0,0.0,18,19.4,78.0,96.2,14.4,6,False,55,20,0.1 +2467,-inf,0.0,2251,0.0,0.0,0.0,789,0.0,0.0,10,71.3,44.9,90.9,41.3,6,False,71,55,0.1 +2468,-inf,0.0,4044,0.0,0.0,0.0,1457,0.0,0.0,10,79.4,56.5,88.8,40.3,4,False,150,35,0.1 +2469,-inf,0.0,2356,0.0,0.0,0.0,852,0.0,0.0,14,8.6,54.8,96.4,3.6,8,False,55,35,0.1 +2470,-inf,0.0,2102,0.0,0.0,0.0,743,0.0,0.0,16,76.8,42.6,81.8,61.4,4,False,150,55,0.1 +2471,-inf,0.0,757,0.0,0.0,0.0,272,0.0,0.0,12,11.1,77.9,93.3,6.1,8,False,120,90,0.1 +2472,-inf,0.0,4706,0.0,0.0,0.0,1646,0.0,0.0,10,74.8,44.0,76.4,46.2,4,False,150,20,0.1 +2473,-inf,0.0,1686,0.0,0.0,0.0,608,0.0,0.0,21,12.9,65.1,95.3,7.9,3,False,120,41,0.1 +2474,-inf,0.0,2589,0.0,0.0,0.0,931,0.0,0.0,16,74.9,55.1,86.1,58.7,6,False,120,35,0.1 +2475,-inf,0.0,3942,0.0,0.0,0.0,1420,0.0,0.0,10,9.8,52.0,89.6,4.8,4,False,71,20,0.1 +2476,-inf,0.0,12028,0.0,0.0,0.0,4368,0.0,0.0,10,67.6,50.1,83.2,60.3,1,True,71,55,0.1 +2477,-inf,0.0,2285,0.0,0.0,0.0,812,0.0,0.0,18,69.5,46.2,89.0,60.9,4,False,90,20,0.1 +2478,-inf,0.0,1882,0.0,0.0,0.0,636,0.0,0.0,18,71.6,40.4,75.2,28.9,3,False,120,70,0.1 +2479,-inf,0.0,1374,0.0,0.0,0.0,487,0.0,0.0,21,4.4,68.9,93.7,-0.6,3,True,71,35,0.1 +2480,-inf,0.0,1653,0.0,0.0,0.0,592,0.0,0.0,12,15.8,75.6,96.6,10.8,6,True,40,41,0.1 +2481,-inf,0.0,1487,0.0,0.0,0.0,503,0.0,0.0,18,64.0,52.4,72.1,28.4,12,False,55,70,0.1 +2482,-inf,0.0,2160,0.0,0.0,0.0,798,0.0,0.0,21,67.3,45.7,79.6,45.7,4,False,90,41,0.1 +2483,-inf,0.0,6232,0.0,0.0,0.0,2307,0.0,0.0,12,79.9,46.5,79.1,47.6,3,True,71,90,0.1 +2484,-inf,0.0,2072,0.0,0.0,0.0,726,0.0,0.0,21,6.9,57.9,95.6,1.9,6,False,120,55,0.1 +2485,-inf,0.0,2105,0.0,0.0,0.0,761,0.0,0.0,21,71.7,56.4,77.9,53.3,8,False,40,55,0.1 +2486,-inf,0.0,3647,0.0,0.0,0.0,1326,0.0,0.0,14,70.5,49.5,87.3,46.5,3,False,55,55,0.1 +2487,-inf,0.0,4851,0.0,0.0,0.0,1816,0.0,0.0,16,81.0,50.4,75.0,42.5,8,True,120,35,0.1 +2488,-inf,0.0,3618,0.0,0.0,0.0,1343,0.0,0.0,21,17.7,57.9,85.7,12.7,12,True,150,20,0.1 +2489,-inf,0.0,1408,0.0,0.0,0.0,459,0.0,0.0,16,68.2,43.5,74.6,23.5,6,False,55,35,0.1 +2490,-inf,0.0,2058,0.0,0.0,0.0,740,0.0,0.0,12,8.7,61.9,92.8,3.7,12,False,90,70,0.1 +2491,-inf,0.0,5355,0.0,0.0,0.0,1914,0.0,0.0,21,74.2,54.1,84.7,38.5,1,True,90,55,0.1 +2492,-inf,0.0,2651,0.0,0.0,0.0,940,0.0,0.0,12,9.3,70.8,93.3,4.3,1,True,55,55,0.1 +2493,-inf,0.0,2073,0.0,0.0,0.0,743,0.0,0.0,10,7.4,54.1,87.7,2.4,12,False,120,70,0.1 +2494,-inf,0.0,2666,0.0,0.0,0.0,931,0.0,0.0,12,76.0,44.3,83.9,21.1,3,False,90,35,0.1 +2495,-inf,0.0,1215,0.0,0.0,0.0,431,0.0,0.0,18,5.9,69.4,87.4,0.9,4,False,150,70,0.1 +2496,-inf,0.0,2883,0.0,0.0,0.0,1049,0.0,0.0,18,75.8,51.9,91.0,35.6,4,False,71,35,0.1 +2497,-inf,0.0,2892,0.0,0.0,0.0,1030,0.0,0.0,18,77.7,43.2,83.4,52.5,2,False,40,70,0.1 +2498,-inf,0.0,3507,0.0,0.0,0.0,1247,0.0,0.0,14,4.7,61.6,95.8,-0.3,2,False,90,41,0.1 +2499,-inf,0.0,1204,0.0,0.0,0.0,413,0.0,0.0,21,14.5,68.8,90.4,9.5,2,False,40,35,0.1 +2500,-inf,0.0,2292,0.0,0.0,0.0,817,0.0,0.0,14,5.6,69.9,97.8,0.6,1,False,90,41,0.1 +2501,-inf,0.0,513,0.0,0.0,0.0,195,0.0,0.0,21,4.7,72.7,97.5,-0.3,4,False,120,70,0.1 +2502,-inf,0.0,668,0.0,0.0,0.0,250,0.0,0.0,18,10.1,73.5,95.3,5.1,3,False,55,35,0.1 +2503,-inf,0.0,1437,0.0,0.0,0.0,503,0.0,0.0,21,19.3,69.0,97.3,14.3,3,True,40,20,0.1 +2504,-inf,0.0,3933,0.0,0.0,0.0,1397,0.0,0.0,18,66.7,51.3,89.5,55.1,2,False,90,70,0.1 +2505,-inf,0.0,3259,0.0,0.0,0.0,1152,0.0,0.0,10,75.3,39.0,84.7,51.9,3,False,71,41,0.1 +2506,-inf,0.0,6385,0.0,0.0,0.0,2429,0.0,0.0,12,73.6,54.9,86.1,42.6,8,True,150,35,0.1 +2507,-inf,0.0,5163,0.0,0.0,0.0,1859,0.0,0.0,14,8.4,57.6,88.1,3.4,2,True,150,90,0.1 +2508,-inf,0.0,1896,0.0,0.0,0.0,668,0.0,0.0,21,19.3,62.7,88.2,14.3,4,False,40,55,0.1 +2509,-inf,0.0,3729,0.0,0.0,0.0,1344,0.0,0.0,14,69.4,55.9,90.1,53.8,3,False,40,90,0.1 +2510,-inf,0.0,3332,0.0,0.0,0.0,1179,0.0,0.0,10,63.7,52.6,72.3,29.0,8,False,150,35,0.1 +2511,-inf,0.0,2114,0.0,0.0,0.0,724,0.0,0.0,10,15.9,71.4,86.2,10.9,12,False,90,35,0.1 +2512,-inf,0.0,3998,0.0,0.0,0.0,1411,0.0,0.0,12,18.9,55.3,89.6,13.9,4,False,120,90,0.1 +2513,-inf,0.0,1939,0.0,0.0,0.0,704,0.0,0.0,14,7.9,58.4,95.3,2.9,12,False,71,70,0.1 +2514,-inf,0.0,4663,0.0,0.0,0.0,1684,0.0,0.0,21,74.4,44.4,81.8,49.5,1,True,150,41,0.1 +2515,-inf,0.0,4251,0.0,0.0,0.0,1491,0.0,0.0,12,66.6,43.3,74.3,34.1,3,False,150,70,0.1 +2516,-inf,0.0,2937,0.0,0.0,0.0,1047,0.0,0.0,10,11.9,59.1,92.7,6.9,8,False,120,41,0.1 +2517,-inf,0.0,4593,0.0,0.0,0.0,1652,0.0,0.0,16,76.0,45.9,81.8,40.5,8,True,40,55,0.1 +2518,-inf,0.0,2098,0.0,0.0,0.0,719,0.0,0.0,12,78.7,41.3,74.1,33.6,8,False,71,55,0.1 +2519,-inf,0.0,2250,0.0,0.0,0.0,800,0.0,0.0,18,10.3,58.6,91.5,5.3,6,False,40,41,0.1 +2520,-inf,0.0,779,0.0,0.0,0.0,267,0.0,0.0,18,21.6,73.1,88.4,16.6,8,False,71,35,0.1 +2521,-inf,0.0,2302,0.0,0.0,0.0,820,0.0,0.0,16,78.7,51.7,73.2,33.5,8,False,71,90,0.1 +2522,-inf,0.0,2330,0.0,0.0,0.0,835,0.0,0.0,12,8.7,63.1,94.7,3.7,8,False,150,70,0.1 +2523,-inf,0.0,5488,0.0,0.0,0.0,2009,0.0,0.0,16,5.1,54.6,85.5,0.1,2,True,40,41,0.1 +2524,-inf,0.0,895,0.0,0.0,0.0,316,0.0,0.0,21,5.8,69.9,93.6,0.8,3,False,71,55,0.1 +2525,-inf,0.0,1500,0.0,0.0,0.0,519,0.0,0.0,21,18.8,60.0,96.8,13.8,12,False,150,35,0.1 +2526,-inf,0.0,2079,0.0,0.0,0.0,720,0.0,0.0,12,14.2,68.4,98.9,9.2,6,False,71,55,0.1 +2527,-inf,0.0,185,0.0,0.0,0.0,75,0.0,0.0,21,10.3,76.9,85.9,9.3,8,False,90,20,0.1 +2528,-inf,0.0,2420,0.0,0.0,0.0,841,0.0,0.0,10,18.0,68.1,98.2,13.0,12,False,40,41,0.1 +2529,-inf,0.0,4635,0.0,0.0,0.0,1665,0.0,0.0,14,13.2,61.2,87.0,8.2,1,False,55,20,0.1 +2530,-inf,0.0,1441,0.0,0.0,0.0,500,0.0,0.0,21,9.3,60.4,98.1,4.3,12,False,150,20,0.1 +2531,-inf,0.0,2247,0.0,0.0,0.0,771,0.0,0.0,16,20.0,65.0,89.1,20.0,4,False,71,35,0.1 +2532,-inf,0.0,5432,0.0,0.0,0.0,1924,0.0,0.0,16,4.6,55.6,93.0,-0.4,1,False,40,20,0.1 +2533,-inf,0.0,2347,0.0,0.0,0.0,841,0.0,0.0,14,7.6,69.7,90.1,2.6,1,False,40,55,0.1 +2534,-inf,0.0,1298,0.0,0.0,0.0,429,0.0,0.0,16,64.3,44.8,82.4,21.0,8,False,150,41,0.1 +2535,-inf,0.0,4660,0.0,0.0,0.0,1688,0.0,0.0,21,11.4,54.0,92.1,6.4,2,True,55,41,0.1 +2536,-inf,0.0,1345,0.0,0.0,0.0,474,0.0,0.0,16,9.7,66.4,92.3,4.7,12,False,90,41,0.1 +2537,-inf,0.0,2905,0.0,0.0,0.0,1015,0.0,0.0,21,20.3,59.8,95.7,15.3,2,False,71,70,0.1 +2538,-inf,0.0,3507,0.0,0.0,0.0,1256,0.0,0.0,12,65.3,58.0,91.0,36.6,4,False,120,35,0.1 +2539,-inf,0.0,896,0.0,0.0,0.0,284,0.0,0.0,21,63.3,39.4,89.9,19.3,6,False,55,70,0.1 +2540,-inf,0.0,2534,0.0,0.0,0.0,899,0.0,0.0,14,18.0,62.4,86.6,13.0,6,False,90,35,0.1 +2541,-inf,0.0,2798,0.0,0.0,0.0,961,0.0,0.0,10,18.4,73.4,93.8,13.4,2,False,71,35,0.1 +2542,-inf,0.0,2031,0.0,0.0,0.0,718,0.0,0.0,18,16.0,68.4,86.0,10.1,1,True,150,55,0.1 +2543,-inf,0.0,3064,0.0,0.0,0.0,1058,0.0,0.0,16,18.3,62.7,88.4,13.3,2,False,120,55,0.1 +2544,-inf,0.0,430,0.0,0.0,0.0,161,0.0,0.0,18,13.8,75.7,93.1,8.8,3,False,90,90,0.1 +2545,-inf,0.0,2715,0.0,0.0,0.0,970,0.0,0.0,12,14.9,56.6,88.6,12.0,8,False,55,35,0.1 +2546,-inf,0.0,1337,0.0,0.0,0.0,468,0.0,0.0,14,79.2,43.1,87.5,39.3,8,False,55,90,0.1 +2547,-inf,0.0,758,0.0,0.0,0.0,264,0.0,0.0,18,18.4,72.7,97.6,10.3,6,False,90,35,0.1 +2548,-inf,0.0,2018,0.0,0.0,0.0,696,0.0,0.0,18,10.8,61.2,97.8,5.8,6,False,71,70,0.1 +2549,-inf,0.0,5985,0.0,0.0,0.0,2176,0.0,0.0,14,78.3,45.5,78.2,47.3,2,True,71,55,0.1 +2550,-inf,0.0,7072,0.0,0.0,0.0,2527,0.0,0.0,12,12.8,54.4,88.2,5.4,1,True,71,70,0.1 +2551,-inf,0.0,2388,0.0,0.0,0.0,842,0.0,0.0,10,14.3,55.4,86.2,6.6,12,False,120,41,0.1 +2552,-inf,0.0,4644,0.0,0.0,0.0,1665,0.0,0.0,10,75.1,49.1,75.1,60.7,8,False,150,41,0.1 +2553,-inf,0.0,2189,0.0,0.0,0.0,780,0.0,0.0,14,10.0,63.8,96.4,5.0,6,False,40,55,0.1 +2554,-inf,0.0,1352,0.0,0.0,0.0,474,0.0,0.0,10,8.0,75.8,91.7,3.0,8,False,150,41,0.1 +2555,-inf,0.0,1650,0.0,0.0,0.0,606,0.0,0.0,21,73.2,48.9,86.4,45.9,8,False,71,41,0.1 +2556,-inf,0.0,1987,0.0,0.0,0.0,703,0.0,0.0,14,6.0,65.4,91.1,1.0,6,False,55,90,0.1 +2557,-inf,0.0,7255,0.0,0.0,0.0,2688,0.0,0.0,10,75.2,51.6,78.7,38.4,8,True,55,55,0.1 +2558,-inf,0.0,4462,0.0,0.0,0.0,1588,0.0,0.0,21,75.4,56.3,89.9,41.8,1,False,71,20,0.1 +2559,-inf,0.0,3547,0.0,0.0,0.0,1256,0.0,0.0,12,75.9,44.3,76.4,26.0,2,False,55,70,0.1 +2560,-inf,0.0,5225,0.0,0.0,0.0,1829,0.0,0.0,12,18.9,56.4,86.4,15.2,2,False,150,90,0.1 +2561,-inf,0.0,1347,0.0,0.0,0.0,474,0.0,0.0,16,68.7,41.1,84.8,36.1,6,False,40,70,0.1 +2562,-inf,0.0,7373,0.0,0.0,0.0,2685,0.0,0.0,12,79.6,54.6,80.6,39.9,1,True,150,20,0.1 +2563,-inf,0.0,3246,0.0,0.0,0.0,1165,0.0,0.0,16,71.1,58.0,91.3,49.3,3,False,71,70,0.1 +2564,-inf,0.0,1571,0.0,0.0,0.0,574,0.0,0.0,21,74.7,54.5,87.9,30.6,12,False,150,41,0.1 +2565,-inf,0.0,4204,0.0,0.0,0.0,1522,0.0,0.0,16,76.4,51.3,73.6,60.3,3,False,55,90,0.1 +2566,-inf,0.0,1233,0.0,0.0,0.0,434,0.0,0.0,14,5.3,70.2,94.6,0.3,12,False,120,90,0.1 +2567,-inf,0.0,1794,0.0,0.0,0.0,613,0.0,0.0,10,71.9,54.6,81.3,22.3,12,False,55,35,0.1 +2568,-inf,0.0,5496,0.0,0.0,0.0,2033,0.0,0.0,12,80.3,44.7,75.7,45.8,4,True,150,55,0.1 +2569,-inf,0.0,479,0.0,0.0,0.0,172,0.0,0.0,21,21.6,74.9,96.2,16.6,2,False,90,70,0.1 +2570,-inf,0.0,3399,0.0,0.0,0.0,1229,0.0,0.0,18,19.3,52.1,92.4,14.5,3,False,90,55,0.1 +2571,-inf,0.0,1895,0.0,0.0,0.0,641,0.0,0.0,14,21.8,66.9,89.3,16.8,12,False,120,41,0.1 +2572,-inf,0.0,6313,0.0,0.0,0.0,2306,0.0,0.0,16,73.5,54.6,78.8,48.6,2,True,71,35,0.1 +2573,-inf,0.0,5450,0.0,0.0,0.0,1931,0.0,0.0,10,68.1,45.4,76.6,28.8,2,False,90,70,0.1 +2574,-inf,0.0,2582,0.0,0.0,0.0,888,0.0,0.0,10,78.0,49.0,72.0,26.1,8,False,40,70,0.1 +2575,-inf,0.0,4427,0.0,0.0,0.0,1615,0.0,0.0,21,12.4,54.1,85.5,7.4,4,True,71,41,0.1 +2576,-inf,0.0,1878,0.0,0.0,0.0,657,0.0,0.0,21,19.2,58.2,98.5,14.2,8,False,120,35,0.1 +2577,-inf,0.0,1789,0.0,0.0,0.0,636,0.0,0.0,21,65.3,47.5,88.4,43.7,6,False,71,20,0.1 +2578,-inf,0.0,8503,0.0,0.0,0.0,3095,0.0,0.0,18,63.3,46.4,84.0,49.9,1,True,40,90,0.1 +2579,-inf,0.0,1751,0.0,0.0,0.0,613,0.0,0.0,16,9.1,63.8,88.2,4.1,8,False,120,20,0.1 +2580,-inf,0.0,6583,0.0,0.0,0.0,2316,0.0,0.0,12,19.2,58.5,92.6,4.1,1,True,55,20,0.1 +2581,-inf,0.0,2816,0.0,0.0,0.0,1033,0.0,0.0,14,14.3,67.4,95.5,9.3,8,True,120,70,0.1 +2582,-inf,0.0,4649,0.0,0.0,0.0,1652,0.0,0.0,12,81.1,47.2,88.0,34.1,2,False,55,35,0.1 +2583,-inf,0.0,2205,0.0,0.0,0.0,817,0.0,0.0,21,80.0,53.0,90.5,53.0,6,False,40,20,0.1 +2584,-inf,0.0,2535,0.0,0.0,0.0,879,0.0,0.0,21,4.8,61.4,97.9,-0.2,2,False,150,55,0.1 +2585,-inf,0.0,4154,0.0,0.0,0.0,1495,0.0,0.0,14,74.2,57.4,76.1,57.2,4,False,120,90,0.1 +2586,-inf,0.0,1726,0.0,0.0,0.0,656,0.0,0.0,21,5.1,67.1,98.7,0.1,6,True,150,20,0.1 +2587,-inf,0.0,2867,0.0,0.0,0.0,1010,0.0,0.0,21,13.7,62.8,88.2,8.7,1,False,71,55,0.1 +2588,-inf,0.0,762,0.0,0.0,0.0,234,0.0,0.0,18,81.2,39.2,89.8,36.2,8,False,150,90,0.1 +2589,-inf,0.0,8089,0.0,0.0,0.0,2898,0.0,0.0,12,75.6,44.9,87.8,44.1,1,True,40,41,0.1 +2590,-inf,0.0,1945,0.0,0.0,0.0,702,0.0,0.0,16,6.8,66.8,86.6,1.8,3,False,120,90,0.1 +2591,-inf,0.0,3805,0.0,0.0,0.0,1381,0.0,0.0,14,77.3,52.4,87.1,58.8,3,False,55,41,0.1 +2592,-inf,0.0,2007,0.0,0.0,0.0,679,0.0,0.0,10,19.3,78.0,92.2,11.8,2,False,150,35,0.1 +2593,-inf,0.0,1429,0.0,0.0,0.0,483,0.0,0.0,12,73.3,40.2,90.0,41.0,6,False,71,70,0.1 +2594,-inf,0.0,2608,0.0,0.0,0.0,907,0.0,0.0,18,4.3,61.0,97.2,-0.7,3,False,150,55,0.1 +2595,-inf,0.0,6794,0.0,0.0,0.0,2417,0.0,0.0,12,69.4,48.0,86.6,37.5,1,False,40,55,0.1 +2596,-inf,0.0,5435,0.0,0.0,0.0,1919,0.0,0.0,14,74.0,40.7,81.7,55.0,2,True,90,41,0.1 +2597,-inf,0.0,3780,0.0,0.0,0.0,1334,0.0,0.0,18,21.9,61.7,93.5,9.5,2,True,90,20,0.1 +2598,-inf,0.0,3991,0.0,0.0,0.0,1453,0.0,0.0,10,5.5,53.6,93.2,0.5,4,False,40,90,0.1 +2599,-inf,0.0,6034,0.0,0.0,0.0,2166,0.0,0.0,18,72.0,44.5,81.1,46.8,1,True,71,41,0.1 +2600,-inf,0.0,5741,0.0,0.0,0.0,2029,0.0,0.0,16,10.9,53.7,89.7,5.4,1,False,150,90,0.1 +2601,-inf,0.0,2156,0.0,0.0,0.0,735,0.0,0.0,16,73.2,54.3,76.3,25.5,4,False,40,55,0.1 +2602,-inf,0.0,3881,0.0,0.0,0.0,1365,0.0,0.0,10,19.3,59.0,91.3,8.5,6,False,55,70,0.1 +2603,-inf,0.0,359,0.0,0.0,0.0,137,0.0,0.0,18,14.0,76.9,91.4,9.8,3,False,40,55,0.1 +2604,-inf,0.0,4897,0.0,0.0,0.0,1751,0.0,0.0,12,77.5,49.7,77.6,35.3,2,False,150,70,0.1 +2605,-inf,0.0,1692,0.0,0.0,0.0,549,0.0,0.0,12,21.2,74.6,94.1,16.2,8,False,71,41,0.1 +2606,-inf,0.0,3147,0.0,0.0,0.0,1089,0.0,0.0,10,21.0,66.3,94.2,10.0,8,False,40,41,0.1 +2607,-inf,0.0,2508,0.0,0.0,0.0,919,0.0,0.0,21,73.3,38.9,89.4,29.1,4,True,150,70,0.1 +2608,-inf,0.0,1572,0.0,0.0,0.0,546,0.0,0.0,14,73.1,45.8,90.9,25.0,8,False,55,90,0.1 +2609,-inf,0.0,1764,0.0,0.0,0.0,637,0.0,0.0,16,14.1,54.2,93.2,9.1,12,False,71,90,0.1 +2610,-inf,0.0,5008,0.0,0.0,0.0,1773,0.0,0.0,16,68.6,45.6,88.0,22.9,1,False,55,90,0.1 +2611,-inf,0.0,3535,0.0,0.0,0.0,1273,0.0,0.0,12,7.2,57.9,87.6,2.2,4,False,40,20,0.1 +2612,-inf,0.0,1213,0.0,0.0,0.0,404,0.0,0.0,16,20.4,71.7,85.1,19.8,8,False,55,70,0.1 +2613,-inf,0.0,1721,0.0,0.0,0.0,633,0.0,0.0,16,9.9,70.9,90.5,4.9,1,True,40,70,0.1 +2614,-inf,0.0,1469,0.0,0.0,0.0,505,0.0,0.0,16,20.1,68.9,90.6,15.1,8,False,120,55,0.1 +2615,-inf,0.0,3498,0.0,0.0,0.0,1220,0.0,0.0,21,66.8,54.5,89.7,45.9,2,False,55,20,0.1 +2616,-inf,0.0,5163,0.0,0.0,0.0,1930,0.0,0.0,16,9.9,54.0,95.5,4.9,3,True,120,70,0.1 +2617,-inf,0.0,3451,0.0,0.0,0.0,1231,0.0,0.0,10,5.6,70.3,93.1,0.6,1,True,120,35,0.1 +2618,-inf,0.0,5403,0.0,0.0,0.0,2030,0.0,0.0,10,73.7,42.6,85.3,19.4,8,True,55,70,0.1 +2619,-inf,0.0,3678,0.0,0.0,0.0,1299,0.0,0.0,12,75.5,46.0,73.6,46.2,6,False,40,90,0.1 +2620,-inf,0.0,779,0.0,0.0,0.0,258,0.0,0.0,16,69.4,42.3,91.6,60.4,12,False,55,70,0.1 +2621,-inf,0.0,4302,0.0,0.0,0.0,1516,0.0,0.0,10,73.5,41.9,86.0,28.9,2,False,120,41,0.1 +2622,-inf,0.0,4724,0.0,0.0,0.0,1728,0.0,0.0,12,79.0,47.5,73.2,27.8,12,True,150,41,0.1 +2623,-inf,0.0,2903,0.0,0.0,0.0,1029,0.0,0.0,21,18.8,56.3,96.0,16.7,3,False,120,41,0.1 +2624,-inf,0.0,7916,0.0,0.0,0.0,2786,0.0,0.0,14,65.1,39.8,85.6,23.0,1,True,90,55,0.1 +2250,-inf,0.0,3371,0.0,0.0,0.0,1232,0.0,0.0,14,80.8,47.0,86.8,47.5,3,False,90,70,0.1 +2626,-inf,0.0,2082,0.0,0.0,0.0,760,0.0,0.0,14,66.8,50.8,89.4,25.2,8,False,40,41,0.1 +2627,-inf,0.0,470,0.0,0.0,0.0,182,0.0,0.0,21,9.1,74.2,97.9,4.1,1,False,55,90,0.1 +2628,-inf,0.0,2328,0.0,0.0,0.0,872,0.0,0.0,21,79.9,50.6,74.2,56.2,6,False,120,70,0.1 +2629,-inf,0.0,4572,0.0,0.0,0.0,1662,0.0,0.0,14,9.4,60.6,88.3,4.4,4,True,55,35,0.1 +2630,-inf,0.0,4815,0.0,0.0,0.0,1698,0.0,0.0,14,19.7,53.0,85.6,14.7,2,False,90,70,0.1 +2631,-inf,0.0,4054,0.0,0.0,0.0,1434,0.0,0.0,16,9.3,61.6,89.9,4.3,1,False,55,20,0.1 +2632,-inf,0.0,3026,0.0,0.0,0.0,1112,0.0,0.0,18,70.4,51.4,81.5,54.4,4,False,71,90,0.1 +2633,-inf,0.0,2931,0.0,0.0,0.0,1012,0.0,0.0,21,21.9,63.1,93.4,16.9,1,False,71,35,0.1 +2634,-inf,0.0,2154,0.0,0.0,0.0,760,0.0,0.0,16,69.3,42.6,76.9,55.1,6,False,55,35,0.1 +2635,-inf,0.0,1291,0.0,0.0,0.0,461,0.0,0.0,21,8.5,64.8,85.8,3.5,8,False,120,35,0.1 +2636,-inf,0.0,5172,0.0,0.0,0.0,1881,0.0,0.0,10,65.4,54.6,76.3,33.2,3,False,120,90,0.1 +2637,-inf,0.0,2785,0.0,0.0,0.0,961,0.0,0.0,10,65.2,38.5,80.8,46.4,6,False,150,35,0.1 +2638,-inf,0.0,2080,0.0,0.0,0.0,739,0.0,0.0,10,76.9,44.6,86.5,59.8,8,False,120,41,0.1 +2639,-inf,0.0,4563,0.0,0.0,0.0,1627,0.0,0.0,16,4.3,59.6,97.0,-0.7,1,False,120,41,0.1 +2640,-inf,0.0,4570,0.0,0.0,0.0,1617,0.0,0.0,21,15.8,55.8,92.5,10.8,1,False,120,70,0.1 +2641,-inf,0.0,3500,0.0,0.0,0.0,1233,0.0,0.0,10,12.0,70.3,90.9,4.1,1,False,55,35,0.1 +2642,-inf,0.0,1752,0.0,0.0,0.0,617,0.0,0.0,12,16.5,75.1,94.9,11.5,4,True,71,70,0.1 +2643,-inf,0.0,3392,0.0,0.0,0.0,1240,0.0,0.0,14,69.9,52.9,83.1,37.3,4,False,40,90,0.1 +2644,-inf,0.0,1352,0.0,0.0,0.0,338,0.0,0.0,21,80.9,54.3,75.8,21.2,8,False,71,90,0.1 +2645,-inf,0.0,3642,0.0,0.0,0.0,1328,0.0,0.0,21,68.0,42.4,84.9,23.9,8,True,71,41,0.1 +2646,-inf,0.0,2157,0.0,0.0,0.0,799,0.0,0.0,21,19.5,66.3,86.5,14.5,1,True,71,55,0.1 +2647,-inf,0.0,1710,0.0,0.0,0.0,607,0.0,0.0,18,9.4,64.0,91.3,4.4,6,False,55,55,0.1 +2648,-inf,0.0,3025,0.0,0.0,0.0,1067,0.0,0.0,10,11.6,63.8,95.4,6.6,6,False,120,70,0.1 +2649,-inf,0.0,504,0.0,0.0,0.0,196,0.0,0.0,18,4.2,75.1,97.6,-0.8,2,False,120,90,0.1 +2650,-inf,0.0,2882,0.0,0.0,0.0,976,0.0,0.0,21,77.5,52.6,76.2,28.6,2,False,90,70,0.1 +2651,-inf,0.0,1661,0.0,0.0,0.0,488,0.0,0.0,21,78.1,51.3,78.1,24.8,4,False,90,55,0.1 +2652,-inf,0.0,5938,0.0,0.0,0.0,2125,0.0,0.0,10,10.4,62.5,93.4,5.4,1,True,55,55,0.1 +2653,-inf,0.0,7463,0.0,0.0,0.0,2813,0.0,0.0,10,68.2,47.1,80.1,42.7,8,True,120,70,0.1 +2654,-inf,0.0,2162,0.0,0.0,0.0,800,0.0,0.0,21,78.6,50.3,74.4,36.4,6,False,55,90,0.1 +2655,-inf,0.0,1724,0.0,0.0,0.0,627,0.0,0.0,16,78.9,53.8,91.3,53.3,12,False,71,20,0.1 +2656,-inf,0.0,1981,0.0,0.0,0.0,708,0.0,0.0,16,21.3,54.9,98.6,13.8,12,False,90,70,0.1 +2657,-inf,0.0,2580,0.0,0.0,0.0,926,0.0,0.0,16,64.3,40.7,75.9,61.7,6,False,40,55,0.1 +2658,-inf,0.0,1258,0.0,0.0,0.0,442,0.0,0.0,14,65.6,41.4,79.5,36.8,12,False,150,20,0.1 +2659,-inf,0.0,3284,0.0,0.0,0.0,1170,0.0,0.0,14,10.3,60.3,87.0,5.3,3,False,40,35,0.1 +2660,-inf,0.0,1195,0.0,0.0,0.0,409,0.0,0.0,18,16.3,70.2,96.4,11.3,3,False,40,20,0.1 +2661,-inf,0.0,973,0.0,0.0,0.0,324,0.0,0.0,21,72.1,39.8,77.8,44.5,8,False,55,90,0.1 +2662,-inf,0.0,4248,0.0,0.0,0.0,1526,0.0,0.0,10,68.7,49.0,89.7,25.1,3,False,40,55,0.1 +2663,-inf,0.0,2689,0.0,0.0,0.0,967,0.0,0.0,14,13.1,52.8,96.7,4.6,6,False,71,90,0.1 +2664,-inf,0.0,3170,0.0,0.0,0.0,1118,0.0,0.0,12,62.6,47.3,75.1,50.8,12,False,55,35,0.1 +2665,-inf,0.0,1976,0.0,0.0,0.0,736,0.0,0.0,21,78.6,39.3,83.7,55.2,12,True,150,35,0.1 +2666,-inf,0.0,3689,0.0,0.0,0.0,1319,0.0,0.0,18,73.0,55.9,81.3,39.6,2,False,71,35,0.1 +2667,-inf,0.0,3178,0.0,0.0,0.0,1124,0.0,0.0,12,16.4,53.7,86.4,13.1,6,False,90,41,0.1 +2668,-inf,0.0,1521,0.0,0.0,0.0,561,0.0,0.0,18,12.5,69.9,95.2,7.5,8,True,90,90,0.1 +2669,-inf,0.0,1966,0.0,0.0,0.0,681,0.0,0.0,12,81.7,51.5,82.4,20.7,6,False,40,70,0.1 +2670,-inf,0.0,6601,0.0,0.0,0.0,2385,0.0,0.0,14,66.8,52.9,85.6,51.0,1,False,40,20,0.1 +2671,-inf,0.0,3284,0.0,0.0,0.0,1173,0.0,0.0,10,73.7,48.4,81.0,54.3,8,False,55,55,0.1 +2672,-inf,0.0,1233,0.0,0.0,0.0,431,0.0,0.0,21,63.2,48.8,90.7,27.0,12,False,71,70,0.1 +2673,-inf,0.0,4257,0.0,0.0,0.0,1517,0.0,0.0,16,75.9,42.2,81.1,57.0,4,True,40,70,0.1 +2674,-inf,0.0,3800,0.0,0.0,0.0,1393,0.0,0.0,18,70.6,51.0,73.0,53.0,4,False,90,90,0.1 +2675,-inf,0.0,1975,0.0,0.0,0.0,683,0.0,0.0,10,68.6,39.3,85.3,33.0,6,False,90,41,0.1 +2676,-inf,0.0,3560,0.0,0.0,0.0,1266,0.0,0.0,10,8.0,62.3,94.1,3.0,4,False,71,90,0.1 +2677,-inf,0.0,1596,0.0,0.0,0.0,569,0.0,0.0,21,7.2,61.0,91.1,2.2,8,False,71,55,0.1 +2678,-inf,0.0,3122,0.0,0.0,0.0,1131,0.0,0.0,16,14.1,54.6,94.3,5.4,4,False,90,41,0.1 +2679,-inf,0.0,4847,0.0,0.0,0.0,1730,0.0,0.0,14,76.3,50.0,81.5,47.8,2,False,90,35,0.1 +2680,-inf,0.0,6370,0.0,0.0,0.0,2264,0.0,0.0,12,15.5,58.4,98.9,10.5,1,True,55,55,0.1 +2681,-inf,0.0,4660,0.0,0.0,0.0,1708,0.0,0.0,16,71.9,43.8,86.4,34.6,8,True,71,35,0.1 +2682,-inf,0.0,4662,0.0,0.0,0.0,1661,0.0,0.0,21,7.5,55.3,85.3,2.5,1,False,71,35,0.1 +2683,-inf,0.0,4738,0.0,0.0,0.0,1651,0.0,0.0,12,63.6,38.5,87.0,23.7,1,False,71,41,0.1 +2684,-inf,0.0,5293,0.0,0.0,0.0,1877,0.0,0.0,16,7.1,56.5,96.7,2.1,1,False,40,55,0.1 +2685,-inf,0.0,3996,0.0,0.0,0.0,1448,0.0,0.0,10,70.4,49.4,87.4,54.4,4,False,40,70,0.1 +2686,-inf,0.0,6034,0.0,0.0,0.0,2243,0.0,0.0,16,72.2,49.2,77.4,43.8,3,True,150,55,0.1 +2687,-inf,0.0,602,0.0,0.0,0.0,224,0.0,0.0,14,7.9,76.4,91.1,2.9,12,False,150,41,0.1 +2688,-inf,0.0,2270,0.0,0.0,0.0,782,0.0,0.0,14,75.8,43.8,90.6,35.0,4,False,40,70,0.1 +2689,-inf,0.0,5834,0.0,0.0,0.0,2102,0.0,0.0,12,79.9,55.1,73.5,57.7,2,False,150,90,0.1 +2690,-inf,0.0,3505,0.0,0.0,0.0,1278,0.0,0.0,12,11.0,66.7,91.1,6.0,4,True,150,41,0.1 +2691,-inf,0.0,1315,0.0,0.0,0.0,460,0.0,0.0,16,21.0,73.7,98.3,7.0,6,True,90,41,0.1 +2692,-inf,0.0,3078,0.0,0.0,0.0,1077,0.0,0.0,10,15.6,56.0,88.8,8.0,8,False,71,20,0.1 +2693,-inf,0.0,4095,0.0,0.0,0.0,1433,0.0,0.0,18,20.4,52.3,94.5,15.4,2,False,55,41,0.1 +2694,-inf,0.0,2433,0.0,0.0,0.0,858,0.0,0.0,10,77.3,44.9,79.6,31.8,8,False,150,55,0.1 +2695,-inf,0.0,3988,0.0,0.0,0.0,1414,0.0,0.0,14,18.6,53.1,88.8,13.6,3,False,90,70,0.1 +2696,-inf,0.0,9252,0.0,0.0,0.0,3335,0.0,0.0,10,65.9,44.7,79.6,40.0,4,True,90,35,0.1 +2697,-inf,0.0,2790,0.0,0.0,0.0,1004,0.0,0.0,10,4.9,57.0,91.1,-0.1,8,False,40,35,0.1 +2698,-inf,0.0,1964,0.0,0.0,0.0,684,0.0,0.0,12,7.4,70.8,98.2,2.4,3,False,90,35,0.1 +2699,-inf,0.0,2252,0.0,0.0,0.0,810,0.0,0.0,16,75.5,50.0,85.4,26.9,6,False,40,35,0.1 +2700,-inf,0.0,1796,0.0,0.0,0.0,642,0.0,0.0,18,70.3,42.7,76.5,40.2,6,False,55,70,0.1 +2701,-inf,0.0,967,0.0,0.0,0.0,371,0.0,0.0,18,12.9,72.7,97.4,7.9,12,True,90,90,0.1 +2702,-inf,0.0,1867,0.0,0.0,0.0,645,0.0,0.0,21,67.6,42.0,81.8,39.0,3,False,150,35,0.1 +2703,-inf,0.0,5840,0.0,0.0,0.0,2162,0.0,0.0,18,64.5,55.6,82.1,23.0,8,True,55,35,0.1 +2704,-inf,0.0,396,0.0,0.0,0.0,153,0.0,0.0,18,9.1,75.9,98.0,4.1,3,False,90,70,0.1 +2705,-inf,0.0,2662,0.0,0.0,0.0,941,0.0,0.0,21,21.7,64.0,98.0,16.7,1,False,71,41,0.1 +2706,-inf,0.0,2944,0.0,0.0,0.0,1023,0.0,0.0,16,19.2,59.3,94.1,14.2,4,False,90,20,0.1 +2707,-inf,0.0,2514,0.0,0.0,0.0,879,0.0,0.0,12,15.4,62.8,90.5,10.4,8,False,120,55,0.1 +2708,-inf,0.0,1836,0.0,0.0,0.0,638,0.0,0.0,14,13.3,67.2,91.9,8.3,6,False,150,35,0.1 +2709,-inf,0.0,2115,0.0,0.0,0.0,751,0.0,0.0,14,10.4,64.5,96.7,5.4,6,False,120,90,0.1 +2710,-inf,0.0,1014,0.0,0.0,0.0,390,0.0,0.0,18,4.0,72.4,92.5,-1.0,6,True,120,55,0.1 +2711,-inf,0.0,3991,0.0,0.0,0.0,1424,0.0,0.0,18,62.5,55.2,90.7,49.2,2,False,55,41,0.1 +2712,-inf,0.0,1454,0.0,0.0,0.0,515,0.0,0.0,16,11.1,67.2,90.8,4.2,8,False,71,41,0.1 +2713,-inf,0.0,2987,0.0,0.0,0.0,1076,0.0,0.0,10,74.1,51.9,85.9,60.5,8,False,71,20,0.1 +2714,-inf,0.0,4746,0.0,0.0,0.0,1617,0.0,0.0,10,65.1,45.4,82.4,20.0,2,False,55,35,0.1 +2715,-inf,0.0,2247,0.0,0.0,0.0,848,0.0,0.0,21,5.8,64.5,88.3,0.8,8,True,150,35,0.1 +2716,-inf,0.0,3173,0.0,0.0,0.0,1127,0.0,0.0,18,17.3,56.6,97.4,12.3,3,False,40,41,0.1 +2717,-inf,0.0,2475,0.0,0.0,0.0,854,0.0,0.0,16,19.5,64.3,88.6,14.5,3,False,150,41,0.1 +2718,-inf,0.0,810,0.0,0.0,0.0,271,0.0,0.0,16,21.0,76.6,93.4,16.0,12,True,90,70,0.1 +2719,-inf,0.0,570,0.0,0.0,0.0,234,0.0,0.0,21,9.8,73.5,87.8,8.8,1,True,40,70,0.1 +2720,-inf,0.0,1402,0.0,0.0,0.0,496,0.0,0.0,16,6.3,68.8,94.0,1.3,6,False,40,41,0.1 +2721,-inf,0.0,2099,0.0,0.0,0.0,763,0.0,0.0,12,63.3,49.4,90.0,25.4,8,False,120,20,0.1 +2722,-inf,0.0,2441,0.0,0.0,0.0,842,0.0,0.0,10,15.5,73.6,96.8,6.3,2,False,150,55,0.1 +2723,-inf,0.0,2837,0.0,0.0,0.0,999,0.0,0.0,16,17.2,59.6,88.8,12.2,4,False,40,90,0.1 +2724,-inf,0.0,861,0.0,0.0,0.0,341,0.0,0.0,21,9.2,71.4,91.6,4.2,6,True,120,90,0.1 +2725,-inf,0.0,1317,0.0,0.0,0.0,471,0.0,0.0,10,10.4,77.8,91.5,5.4,3,False,55,55,0.1 +2726,-inf,0.0,3846,0.0,0.0,0.0,1371,0.0,0.0,12,62.9,41.1,79.5,51.6,3,False,120,41,0.1 +2727,-inf,0.0,5101,0.0,0.0,0.0,1907,0.0,0.0,16,12.8,53.6,94.9,7.8,4,True,71,90,0.1 +2728,-inf,0.0,3611,0.0,0.0,0.0,1287,0.0,0.0,10,15.0,54.4,86.1,10.0,6,False,150,55,0.1 +2729,-inf,0.0,1459,0.0,0.0,0.0,512,0.0,0.0,16,8.9,69.5,85.3,3.9,4,False,150,70,0.1 +2730,-inf,0.0,1343,0.0,0.0,0.0,472,0.0,0.0,18,11.8,68.7,89.6,6.8,4,False,150,35,0.1 +2731,-inf,0.0,2889,0.0,0.0,0.0,1042,0.0,0.0,10,7.2,61.1,86.3,2.2,8,False,120,41,0.1 +2732,-inf,0.0,3772,0.0,0.0,0.0,1365,0.0,0.0,14,68.7,52.4,87.6,39.6,3,False,150,55,0.1 +2733,-inf,0.0,1967,0.0,0.0,0.0,717,0.0,0.0,18,15.1,68.2,94.1,10.1,8,True,71,41,0.1 +2734,-inf,0.0,1219,0.0,0.0,0.0,426,0.0,0.0,21,16.3,64.2,93.2,11.3,12,False,150,41,0.1 +2735,-inf,0.0,752,0.0,0.0,0.0,255,0.0,0.0,14,64.1,39.5,84.5,32.4,12,False,71,20,0.1 +2736,-inf,0.0,2148,0.0,0.0,0.0,770,0.0,0.0,18,6.1,60.0,90.1,1.1,6,False,55,90,0.1 +2737,-inf,0.0,3249,0.0,0.0,0.0,1145,0.0,0.0,10,79.9,38.7,79.4,53.2,4,False,71,70,0.1 +2738,-inf,0.0,3980,0.0,0.0,0.0,1433,0.0,0.0,10,64.4,55.8,80.1,39.1,6,False,55,41,0.1 +2739,-inf,0.0,8698,0.0,0.0,0.0,3169,0.0,0.0,18,62.5,49.8,85.6,19.5,1,True,71,90,0.1 +2740,-inf,0.0,1261,0.0,0.0,0.0,388,0.0,0.0,18,69.7,52.2,81.3,23.7,12,False,90,20,0.1 +2741,-inf,0.0,1262,0.0,0.0,0.0,427,0.0,0.0,18,78.9,42.0,87.1,31.0,6,False,55,41,0.1 +2742,-inf,0.0,3620,0.0,0.0,0.0,1252,0.0,0.0,18,20.1,62.2,97.4,14.0,1,False,40,35,0.1 +2743,-inf,0.0,3402,0.0,0.0,0.0,1191,0.0,0.0,21,16.9,60.9,85.3,11.9,1,False,150,90,0.1 +2744,-inf,0.0,3738,0.0,0.0,0.0,1331,0.0,0.0,10,66.5,40.9,84.0,44.6,3,False,90,70,0.1 +2745,-inf,0.0,5999,0.0,0.0,0.0,2148,0.0,0.0,16,64.2,42.5,74.2,57.0,1,False,150,41,0.1 +2746,-inf,0.0,7399,0.0,0.0,0.0,2621,0.0,0.0,10,63.7,49.7,77.0,23.3,1,False,40,20,0.1 +2747,-inf,0.0,1857,0.0,0.0,0.0,658,0.0,0.0,18,14.4,64.8,96.0,9.4,4,False,40,41,0.1 +2748,-inf,0.0,4133,0.0,0.0,0.0,1476,0.0,0.0,14,21.0,64.0,91.6,16.0,2,True,150,20,0.1 +2749,-inf,0.0,6571,0.0,0.0,0.0,2369,0.0,0.0,10,64.7,52.5,73.8,52.7,4,False,40,35,0.1 +2750,-inf,0.0,6495,0.0,0.0,0.0,2200,0.0,0.0,10,74.7,53.1,89.6,19.7,1,False,55,90,0.1 +2751,-inf,0.0,6099,0.0,0.0,0.0,2159,0.0,0.0,10,16.8,61.9,85.4,11.8,4,True,55,35,0.1 +2752,-inf,0.0,7719,0.0,0.0,0.0,2886,0.0,0.0,10,68.1,49.4,79.1,33.6,8,True,90,41,0.1 +2753,-inf,0.0,3244,0.0,0.0,0.0,1173,0.0,0.0,16,12.5,64.4,94.9,7.5,1,False,71,35,0.1 +2754,-inf,0.0,5512,0.0,0.0,0.0,2117,0.0,0.0,10,4.0,52.4,94.5,-1.0,12,True,150,70,0.1 +2755,-inf,0.0,5465,0.0,0.0,0.0,1914,0.0,0.0,16,20.9,57.0,94.1,15.9,1,False,120,35,0.1 +2756,-inf,0.0,5997,0.0,0.0,0.0,2189,0.0,0.0,10,72.3,41.1,79.2,49.8,8,True,120,70,0.1 +2757,-inf,0.0,2854,0.0,0.0,0.0,1001,0.0,0.0,12,18.2,56.0,92.6,13.2,8,False,71,55,0.1 +2758,-inf,0.0,3823,0.0,0.0,0.0,1356,0.0,0.0,21,15.7,58.5,92.1,10.7,2,True,55,90,0.1 +2759,-inf,0.0,1740,0.0,0.0,0.0,595,0.0,0.0,14,18.3,66.0,88.2,13.3,12,False,120,55,0.1 +2760,-inf,0.0,5280,0.0,0.0,0.0,1885,0.0,0.0,14,14.6,59.7,87.4,9.6,1,True,40,70,0.1 +2761,-inf,0.0,2562,0.0,0.0,0.0,919,0.0,0.0,16,76.0,55.8,87.5,50.3,6,False,55,55,0.1 +2762,-inf,0.0,1662,0.0,0.0,0.0,601,0.0,0.0,21,19.9,57.2,86.3,17.6,12,False,55,35,0.1 +2763,-inf,0.0,3886,0.0,0.0,0.0,1434,0.0,0.0,18,4.8,59.5,98.2,-0.2,3,True,120,70,0.1 +2764,-inf,0.0,5205,0.0,0.0,0.0,1898,0.0,0.0,14,76.9,51.6,77.5,28.4,12,True,71,35,0.1 +2765,-inf,0.0,2053,0.0,0.0,0.0,709,0.0,0.0,12,7.2,69.3,96.3,2.2,4,False,90,35,0.1 +2766,-inf,0.0,1415,0.0,0.0,0.0,492,0.0,0.0,14,16.0,69.2,88.5,11.0,12,False,71,20,0.1 +2767,-inf,0.0,653,0.0,0.0,0.0,192,0.0,0.0,18,72.6,54.6,76.4,20.6,12,False,71,55,0.1 +2768,-inf,0.0,5359,0.0,0.0,0.0,1944,0.0,0.0,16,21.8,55.0,90.8,16.8,8,True,71,20,0.1 +2769,-inf,0.0,3070,0.0,0.0,0.0,1072,0.0,0.0,10,19.2,66.8,87.2,14.2,8,False,55,35,0.1 +2770,-inf,0.0,1311,0.0,0.0,0.0,465,0.0,0.0,10,4.1,75.2,90.7,-0.9,12,False,71,41,0.1 +2771,-inf,0.0,8529,0.0,0.0,0.0,3158,0.0,0.0,10,72.0,47.7,85.9,21.3,3,True,90,55,0.1 +2772,-inf,0.0,3513,0.0,0.0,0.0,1254,0.0,0.0,16,11.5,54.6,93.8,6.5,3,False,90,90,0.1 +2773,-inf,0.0,1479,0.0,0.0,0.0,501,0.0,0.0,16,21.7,71.7,89.4,16.7,3,False,90,41,0.1 +2774,-inf,0.0,2365,0.0,0.0,0.0,841,0.0,0.0,14,8.2,67.6,92.2,3.2,2,False,71,70,0.1 +2775,-inf,0.0,2375,0.0,0.0,0.0,871,0.0,0.0,18,16.3,52.1,93.1,11.3,6,False,55,90,0.1 +2776,-inf,0.0,745,0.0,0.0,0.0,285,0.0,0.0,18,14.6,73.6,94.8,9.6,2,False,55,20,0.1 +2777,-inf,0.0,2942,0.0,0.0,0.0,1026,0.0,0.0,12,67.9,43.0,91.6,45.1,3,False,55,35,0.1 +2778,-inf,0.0,2718,0.0,0.0,0.0,968,0.0,0.0,18,12.5,57.5,94.8,7.5,4,False,90,20,0.1 +2779,-inf,0.0,2267,0.0,0.0,0.0,825,0.0,0.0,12,5.9,64.1,91.8,0.9,8,False,120,55,0.1 +2780,-inf,0.0,5612,0.0,0.0,0.0,1990,0.0,0.0,14,68.4,44.3,90.1,48.8,1,False,90,90,0.1 +2781,-inf,0.0,2829,0.0,0.0,0.0,1007,0.0,0.0,14,5.1,61.1,98.3,0.1,4,False,90,35,0.1 +2782,-inf,0.0,5262,0.0,0.0,0.0,1942,0.0,0.0,16,80.9,50.5,78.9,55.9,4,True,90,70,0.1 +2783,-inf,0.0,4873,0.0,0.0,0.0,1747,0.0,0.0,21,18.2,55.2,92.6,13.2,1,True,55,90,0.1 +2784,-inf,0.0,881,0.0,0.0,0.0,329,0.0,0.0,16,17.2,74.6,94.0,12.2,2,False,55,90,0.1 +2785,-inf,0.0,5733,0.0,0.0,0.0,2107,0.0,0.0,12,21.0,58.5,90.0,16.0,8,True,90,90,0.1 +2786,-inf,0.0,1298,0.0,0.0,0.0,450,0.0,0.0,21,64.0,43.3,91.2,18.6,6,False,55,41,0.1 +2787,-inf,0.0,5228,0.0,0.0,0.0,1928,0.0,0.0,18,81.2,52.4,91.1,41.2,2,True,90,70,0.1 +2788,-inf,0.0,3992,0.0,0.0,0.0,1402,0.0,0.0,12,21.2,67.7,92.4,16.2,6,True,90,20,0.1 +2789,-inf,0.0,2644,0.0,0.0,0.0,956,0.0,0.0,10,5.4,54.4,93.5,0.4,8,False,90,41,0.1 +2790,-inf,0.0,1781,0.0,0.0,0.0,629,0.0,0.0,12,6.2,69.0,88.2,1.2,8,False,150,55,0.1 +2791,-inf,0.0,3171,0.0,0.0,0.0,1134,0.0,0.0,12,63.1,56.7,74.8,43.2,12,False,90,70,0.1 +2792,-inf,0.0,4219,0.0,0.0,0.0,1488,0.0,0.0,14,13.4,57.8,93.5,8.4,2,False,90,35,0.1 +2793,-inf,0.0,2724,0.0,0.0,0.0,990,0.0,0.0,16,8.0,66.3,88.0,3.0,2,True,90,20,0.1 +2794,-inf,0.0,484,0.0,0.0,0.0,189,0.0,0.0,18,4.3,75.2,92.8,-0.7,2,False,120,35,0.1 +2795,-inf,0.0,1283,0.0,0.0,0.0,439,0.0,0.0,16,72.5,41.2,91.4,28.9,6,False,40,55,0.1 +2796,-inf,0.0,649,0.0,0.0,0.0,222,0.0,0.0,21,68.6,40.2,82.2,61.4,12,False,150,55,0.1 +2797,-inf,0.0,3388,0.0,0.0,0.0,1197,0.0,0.0,12,19.5,56.1,98.9,14.5,6,False,150,55,0.1 +2798,-inf,0.0,2694,0.0,0.0,0.0,991,0.0,0.0,21,80.1,52.2,83.3,57.3,4,False,90,20,0.1 +2799,-inf,0.0,4724,0.0,0.0,0.0,1671,0.0,0.0,10,16.9,59.7,97.2,11.9,3,False,55,20,0.1 +2800,-inf,0.0,7676,0.0,0.0,0.0,2745,0.0,0.0,10,9.0,52.4,85.5,4.0,1,False,55,20,0.1 +2801,-inf,0.0,2609,0.0,0.0,0.0,962,0.0,0.0,14,62.9,51.9,79.8,42.0,8,False,120,35,0.1 +2802,-inf,0.0,6228,0.0,0.0,0.0,2173,0.0,0.0,14,67.4,40.6,74.6,42.4,1,False,120,35,0.1 +2803,-inf,0.0,2977,0.0,0.0,0.0,1061,0.0,0.0,16,78.7,46.0,74.8,33.5,3,False,55,41,0.1 +2804,-inf,0.0,7106,0.0,0.0,0.0,2682,0.0,0.0,16,65.3,53.4,73.3,30.9,3,True,150,20,0.1 +2805,-inf,0.0,6425,0.0,0.0,0.0,2326,0.0,0.0,14,64.5,38.3,78.1,56.5,3,True,120,70,0.1 +2806,-inf,0.0,4797,0.0,0.0,0.0,1714,0.0,0.0,10,12.9,55.4,86.7,5.4,3,False,55,41,0.1 +2807,-inf,0.0,1236,0.0,0.0,0.0,414,0.0,0.0,12,19.4,77.6,94.4,14.4,4,False,71,70,0.1 +2808,-inf,0.0,2581,0.0,0.0,0.0,874,0.0,0.0,10,14.9,70.9,97.0,9.9,4,False,90,90,0.1 +2809,-inf,0.0,5790,0.0,0.0,0.0,2165,0.0,0.0,12,12.1,54.4,98.0,7.1,6,True,90,90,0.1 +2810,-inf,0.0,3634,0.0,0.0,0.0,1197,0.0,0.0,16,66.7,49.7,82.0,22.8,2,False,150,55,0.1 +2811,-inf,0.0,4661,0.0,0.0,0.0,1660,0.0,0.0,21,10.2,55.2,97.7,5.2,1,False,90,70,0.1 +2812,-inf,0.0,1870,0.0,0.0,0.0,652,0.0,0.0,14,14.1,67.1,91.9,9.6,6,False,90,35,0.1 +2813,-inf,0.0,5460,0.0,0.0,0.0,1956,0.0,0.0,10,76.6,45.4,84.6,25.4,12,True,55,35,0.1 +2814,-inf,0.0,4701,0.0,0.0,0.0,1733,0.0,0.0,18,5.4,55.6,90.8,0.4,4,True,55,55,0.1 +2815,-inf,0.0,6206,0.0,0.0,0.0,2202,0.0,0.0,10,13.7,61.1,87.9,8.7,3,True,40,20,0.1 +2816,-inf,0.0,2386,0.0,0.0,0.0,837,0.0,0.0,18,17.2,62.6,93.2,12.2,3,False,71,20,0.1 +2817,-inf,0.0,1009,0.0,0.0,0.0,350,0.0,0.0,12,69.8,43.7,89.0,32.1,12,False,90,70,0.1 +2818,-inf,0.0,1490,0.0,0.0,0.0,489,0.0,0.0,18,73.1,38.3,90.1,23.8,3,False,120,55,0.1 +2819,-inf,0.0,1217,0.0,0.0,0.0,421,0.0,0.0,14,10.8,72.2,91.9,5.8,6,False,71,90,0.1 +2820,-inf,0.0,4452,0.0,0.0,0.0,1530,0.0,0.0,12,73.0,52.5,84.9,24.5,2,False,71,20,0.1 +2821,-inf,0.0,1866,0.0,0.0,0.0,655,0.0,0.0,21,78.5,57.5,87.5,47.1,8,False,120,41,0.1 +2822,-inf,0.0,2328,0.0,0.0,0.0,862,0.0,0.0,18,70.9,51.9,89.7,32.5,6,False,55,70,0.1 +2823,-inf,0.0,2247,0.0,0.0,0.0,773,0.0,0.0,10,17.1,76.6,90.9,8.8,1,False,150,35,0.1 +2824,-inf,0.0,272,0.0,0.0,0.0,105,0.0,0.0,18,14.4,77.5,88.7,9.4,12,False,71,41,0.1 +2825,-inf,0.0,1926,0.0,0.0,0.0,706,0.0,0.0,21,4.8,54.0,86.6,-0.2,8,False,120,41,0.1 +2826,-inf,0.0,1245,0.0,0.0,0.0,447,0.0,0.0,10,73.6,39.1,84.6,47.2,12,False,55,35,0.1 +2827,-inf,0.0,2430,0.0,0.0,0.0,841,0.0,0.0,12,13.6,69.9,92.4,8.6,2,False,120,55,0.1 +2828,-inf,0.0,4091,0.0,0.0,0.0,1528,0.0,0.0,21,76.7,56.3,88.0,27.1,3,True,150,70,0.1 +2829,-inf,0.0,2889,0.0,0.0,0.0,979,0.0,0.0,10,19.3,69.7,98.0,14.3,6,False,150,70,0.1 +2830,-inf,0.0,1770,0.0,0.0,0.0,517,0.0,0.0,21,70.8,51.7,79.1,22.8,4,False,71,41,0.1 +2831,-inf,0.0,3463,0.0,0.0,0.0,1230,0.0,0.0,16,9.8,55.2,91.1,4.8,3,False,40,20,0.1 +2832,-inf,0.0,2598,0.0,0.0,0.0,960,0.0,0.0,21,64.9,50.0,84.7,47.5,4,False,40,35,0.1 +2833,-inf,0.0,2959,0.0,0.0,0.0,1068,0.0,0.0,10,6.8,58.9,86.5,1.8,8,False,40,70,0.1 +2834,-inf,0.0,7597,0.0,0.0,0.0,2713,0.0,0.0,12,78.4,48.4,75.4,60.2,1,False,71,35,0.1 +2835,-inf,0.0,1408,0.0,0.0,0.0,497,0.0,0.0,18,63.9,38.2,79.4,60.2,6,False,71,70,0.1 +2836,-inf,0.0,1905,0.0,0.0,0.0,666,0.0,0.0,12,6.0,68.9,91.3,1.0,6,False,40,20,0.1 +2837,-inf,0.0,1669,0.0,0.0,0.0,590,0.0,0.0,18,18.1,60.5,87.9,7.0,12,False,40,41,0.1 +2838,-inf,0.0,3784,0.0,0.0,0.0,1339,0.0,0.0,18,16.0,55.7,96.0,11.0,2,False,120,41,0.1 +2839,-inf,0.0,3632,0.0,0.0,0.0,1266,0.0,0.0,18,79.5,40.2,75.2,48.0,1,False,55,55,0.1 +2840,-inf,0.0,4211,0.0,0.0,0.0,1482,0.0,0.0,14,21.4,54.1,86.0,16.4,3,False,150,41,0.1 +2841,-inf,0.0,3095,0.0,0.0,0.0,1114,0.0,0.0,12,73.5,46.7,79.5,49.8,6,False,55,20,0.1 +2842,-inf,0.0,543,0.0,0.0,0.0,171,0.0,0.0,18,62.5,38.4,82.9,25.9,12,False,120,41,0.1 +2843,-inf,0.0,2602,0.0,0.0,0.0,892,0.0,0.0,14,66.1,43.1,78.6,31.0,4,False,150,20,0.1 +2844,-inf,0.0,2282,0.0,0.0,0.0,805,0.0,0.0,16,15.3,63.6,97.2,10.1,4,False,71,20,0.1 +2845,-inf,0.0,1876,0.0,0.0,0.0,637,0.0,0.0,14,21.2,71.6,86.0,16.2,3,False,150,41,0.1 +2846,-inf,0.0,1221,0.0,0.0,0.0,437,0.0,0.0,12,12.7,75.8,90.8,7.7,3,False,55,41,0.1 +2847,-inf,0.0,5016,0.0,0.0,0.0,1749,0.0,0.0,18,73.9,54.6,84.7,33.0,1,False,120,41,0.1 +2848,-inf,0.0,3204,0.0,0.0,0.0,1142,0.0,0.0,18,75.2,43.7,79.6,45.1,2,False,90,20,0.1 +2849,-inf,0.0,2626,0.0,0.0,0.0,942,0.0,0.0,21,77.9,39.3,82.0,42.6,3,True,55,55,0.1 +2850,-inf,0.0,5463,0.0,0.0,0.0,1903,0.0,0.0,10,21.2,56.6,97.1,16.2,3,False,90,90,0.1 +2851,-inf,0.0,3197,0.0,0.0,0.0,1143,0.0,0.0,12,15.1,68.7,86.1,10.1,4,True,71,70,0.1 +2852,-inf,0.0,3534,0.0,0.0,0.0,1243,0.0,0.0,10,81.1,50.4,73.2,37.1,8,False,150,55,0.1 +2853,-inf,0.0,5872,0.0,0.0,0.0,2110,0.0,0.0,10,15.5,61.8,93.4,10.6,4,True,90,55,0.1 +2854,-inf,0.0,1935,0.0,0.0,0.0,681,0.0,0.0,18,81.7,42.6,77.6,52.9,4,False,40,41,0.1 +2855,-inf,0.0,1678,0.0,0.0,0.0,617,0.0,0.0,16,14.2,70.5,87.2,9.2,12,True,150,70,0.1 +2856,-inf,0.0,3646,0.0,0.0,0.0,1331,0.0,0.0,12,64.1,55.0,88.7,38.6,4,False,40,20,0.1 +2857,-inf,0.0,7172,0.0,0.0,0.0,2590,0.0,0.0,14,71.2,44.7,72.7,40.6,2,True,40,41,0.1 +2858,-inf,0.0,2557,0.0,0.0,0.0,946,0.0,0.0,14,76.4,52.7,82.6,52.8,8,False,120,55,0.1 +2859,-inf,0.0,1043,0.0,0.0,0.0,364,0.0,0.0,21,12.3,69.1,95.0,5.3,3,False,90,90,0.1 +2860,-inf,0.0,3073,0.0,0.0,0.0,1086,0.0,0.0,16,17.5,65.2,88.4,12.5,8,True,40,35,0.1 +2861,-inf,0.0,5126,0.0,0.0,0.0,1895,0.0,0.0,16,71.6,51.2,84.5,27.5,8,True,90,70,0.1 +2862,-inf,0.0,1736,0.0,0.0,0.0,597,0.0,0.0,21,15.7,59.5,87.2,10.7,8,False,90,35,0.1 +2863,-inf,0.0,3889,0.0,0.0,0.0,1381,0.0,0.0,12,12.9,59.1,92.1,10.1,3,False,40,70,0.1 +2864,-inf,0.0,4927,0.0,0.0,0.0,1790,0.0,0.0,12,13.8,62.0,97.3,8.8,6,True,55,35,0.1 +2865,-inf,0.0,6418,0.0,0.0,0.0,2244,0.0,0.0,10,20.6,55.1,86.2,15.6,2,False,120,70,0.1 +2866,-inf,0.0,4969,0.0,0.0,0.0,1742,0.0,0.0,21,63.5,39.9,72.1,57.8,3,True,55,55,0.1 +2867,-inf,0.0,2653,0.0,0.0,0.0,971,0.0,0.0,21,9.9,53.8,89.2,4.9,4,False,40,41,0.1 +2868,-inf,0.0,3115,0.0,0.0,0.0,1113,0.0,0.0,12,79.1,45.9,82.9,36.4,4,False,55,35,0.1 +2869,-inf,0.0,2750,0.0,0.0,0.0,963,0.0,0.0,14,17.5,68.8,94.6,12.5,1,False,90,55,0.1 +2870,-inf,0.0,1230,0.0,0.0,0.0,459,0.0,0.0,12,6.9,76.5,86.2,1.9,8,True,120,41,0.1 +2871,-inf,0.0,2631,0.0,0.0,0.0,970,0.0,0.0,18,78.5,48.8,88.2,59.5,4,False,71,35,0.1 +2872,-inf,0.0,3342,0.0,0.0,0.0,1206,0.0,0.0,21,66.6,47.5,88.3,58.1,2,False,55,70,0.1 +2873,-inf,0.0,2854,0.0,0.0,0.0,987,0.0,0.0,21,80.8,39.4,79.9,38.7,1,False,40,70,0.1 +2874,-inf,0.0,3091,0.0,0.0,0.0,1123,0.0,0.0,16,9.3,53.0,91.4,4.3,4,False,71,90,0.1 +2875,-inf,0.0,7234,0.0,0.0,0.0,2605,0.0,0.0,10,77.3,54.3,75.3,61.0,2,False,90,20,0.1 +2876,-inf,0.0,2390,0.0,0.0,0.0,822,0.0,0.0,10,65.7,52.6,74.5,27.0,12,False,55,35,0.1 +2877,-inf,0.0,5680,0.0,0.0,0.0,2021,0.0,0.0,10,4.2,62.5,88.5,-0.8,1,False,150,90,0.1 +2878,-inf,0.0,7559,0.0,0.0,0.0,2802,0.0,0.0,12,69.5,53.5,85.3,57.9,12,True,90,35,0.1 +2879,-inf,0.0,1686,0.0,0.0,0.0,608,0.0,0.0,12,15.5,75.0,97.6,10.5,12,True,150,41,0.1 +2880,-inf,0.0,5118,0.0,0.0,0.0,1913,0.0,0.0,21,65.9,56.5,73.2,53.6,6,True,71,90,0.1 +2881,-inf,0.0,2013,0.0,0.0,0.0,700,0.0,0.0,21,72.5,57.3,74.6,32.4,4,False,55,20,0.1 +2882,-inf,0.0,1924,0.0,0.0,0.0,689,0.0,0.0,16,17.9,56.9,85.5,11.8,12,False,40,55,0.1 +2883,-inf,0.0,3095,0.0,0.0,0.0,1122,0.0,0.0,21,5.7,58.1,88.1,0.7,2,False,90,90,0.1 +2884,-inf,0.0,6278,0.0,0.0,0.0,2269,0.0,0.0,18,70.5,56.4,90.0,42.8,1,True,90,55,0.1 +2885,-inf,0.0,3372,0.0,0.0,0.0,1245,0.0,0.0,12,12.8,67.0,88.4,7.8,8,True,150,70,0.1 +2886,-inf,0.0,462,0.0,0.0,0.0,182,0.0,0.0,18,5.5,76.3,92.7,0.5,1,True,40,41,0.1 +2887,-inf,0.0,8904,0.0,0.0,0.0,3246,0.0,0.0,16,63.2,51.1,79.9,27.0,1,True,120,70,0.1 +2888,-inf,0.0,1973,0.0,0.0,0.0,708,0.0,0.0,10,11.8,68.6,94.2,6.8,12,False,150,55,0.1 +2889,-inf,0.0,7341,0.0,0.0,0.0,2766,0.0,0.0,10,76.3,49.2,79.9,49.4,6,True,120,70,0.1 +2890,-inf,0.0,4513,0.0,0.0,0.0,1579,0.0,0.0,10,17.7,56.1,95.8,12.7,4,False,55,70,0.1 +2891,-inf,0.0,385,0.0,0.0,0.0,142,0.0,0.0,18,19.6,76.9,97.2,6.3,12,False,150,35,0.1 +2892,-inf,0.0,5326,0.0,0.0,0.0,1878,0.0,0.0,18,74.6,53.5,90.5,42.2,1,False,90,90,0.1 +2893,-inf,0.0,5428,0.0,0.0,0.0,1915,0.0,0.0,12,19.6,54.8,85.8,14.6,2,False,150,55,0.1 +2894,-inf,0.0,3065,0.0,0.0,0.0,1093,0.0,0.0,16,10.1,65.1,98.5,5.1,1,False,71,55,0.1 +2895,-inf,0.0,546,0.0,0.0,0.0,197,0.0,0.0,21,17.6,71.6,85.9,12.6,12,False,55,55,0.1 +2896,-inf,0.0,1943,0.0,0.0,0.0,713,0.0,0.0,16,64.8,57.9,82.5,50.8,12,False,90,20,0.1 +2897,-inf,0.0,1896,0.0,0.0,0.0,632,0.0,0.0,12,18.9,69.5,86.0,13.9,12,False,150,90,0.1 +2898,-inf,0.0,2131,0.0,0.0,0.0,735,0.0,0.0,18,22.0,61.9,96.7,17.0,6,False,55,41,0.1 +2899,-inf,0.0,8629,0.0,0.0,0.0,3135,0.0,0.0,10,65.5,40.7,90.7,18.6,3,True,120,41,0.1 +2900,-inf,0.0,300,0.0,0.0,0.0,122,0.0,0.0,21,9.0,76.1,88.5,4.0,1,False,71,55,0.1 +2901,-inf,0.0,683,0.0,0.0,0.0,252,0.0,0.0,12,7.8,77.9,96.9,2.8,12,False,90,35,0.1 +2902,-inf,0.0,7644,0.0,0.0,0.0,2911,0.0,0.0,10,73.1,57.4,79.0,52.5,6,True,120,41,0.1 +2903,-inf,0.0,6847,0.0,0.0,0.0,2611,0.0,0.0,14,64.1,51.4,84.8,34.0,8,True,40,70,0.1 +2904,-inf,0.0,6648,0.0,0.0,0.0,2490,0.0,0.0,12,72.5,57.6,77.4,32.4,4,True,71,55,0.1 +2905,-inf,0.0,1742,0.0,0.0,0.0,579,0.0,0.0,12,19.8,73.4,92.2,16.6,8,False,120,20,0.1 +2906,-inf,0.0,1389,0.0,0.0,0.0,479,0.0,0.0,14,76.9,38.3,74.5,37.9,12,False,120,55,0.1 +2907,-inf,0.0,4272,0.0,0.0,0.0,1581,0.0,0.0,18,74.5,54.2,75.5,27.2,12,True,120,35,0.1 +2908,-inf,0.0,4597,0.0,0.0,0.0,1626,0.0,0.0,21,4.3,55.6,87.0,-0.7,1,False,71,55,0.1 +2909,-inf,0.0,5296,0.0,0.0,0.0,1882,0.0,0.0,10,73.0,44.6,78.5,53.7,3,False,90,20,0.1 +2910,-inf,0.0,7973,0.0,0.0,0.0,2884,0.0,0.0,14,70.0,50.0,72.0,45.7,2,True,40,55,0.1 +2911,-inf,0.0,5274,0.0,0.0,0.0,1975,0.0,0.0,12,81.0,48.8,85.0,29.6,8,True,120,70,0.1 +2912,-inf,0.0,3510,0.0,0.0,0.0,1255,0.0,0.0,18,12.9,61.9,93.4,7.9,2,True,71,35,0.1 +2913,-inf,0.0,3736,0.0,0.0,0.0,1330,0.0,0.0,12,14.3,63.6,90.4,12.5,2,False,150,41,0.1 +2914,-inf,0.0,4572,0.0,0.0,0.0,1650,0.0,0.0,14,65.8,54.5,86.3,39.2,2,False,71,90,0.1 +2915,-inf,0.0,10732,0.0,0.0,0.0,3803,0.0,0.0,10,66.2,40.4,78.5,35.1,1,True,40,35,0.1 +2916,-inf,0.0,1332,0.0,0.0,0.0,478,0.0,0.0,21,16.0,69.1,98.1,13.8,12,True,120,41,0.1 +2917,-inf,0.0,2703,0.0,0.0,0.0,966,0.0,0.0,14,75.2,55.3,84.9,31.1,6,False,55,90,0.1 +2918,-inf,0.0,10972,0.0,0.0,0.0,3868,0.0,0.0,10,70.0,45.5,73.0,40.1,1,True,40,35,0.1 +2919,-inf,0.0,3576,0.0,0.0,0.0,1313,0.0,0.0,12,5.7,52.2,88.9,0.7,4,False,71,35,0.1 +2920,-inf,0.0,1730,0.0,0.0,0.0,640,0.0,0.0,21,6.0,65.9,94.8,1.0,2,False,150,70,0.1 +2921,-inf,0.0,1811,0.0,0.0,0.0,656,0.0,0.0,12,6.6,72.7,95.9,1.6,2,False,150,20,0.1 +2922,-inf,0.0,1817,0.0,0.0,0.0,575,0.0,0.0,21,63.4,56.1,79.8,19.4,4,False,40,55,0.1 +2923,-inf,0.0,1025,0.0,0.0,0.0,363,0.0,0.0,12,13.0,76.8,89.0,5.4,4,False,90,20,0.1 +2924,-inf,0.0,2597,0.0,0.0,0.0,902,0.0,0.0,18,18.5,61.5,95.4,13.5,3,False,55,70,0.1 +2925,-inf,0.0,4920,0.0,0.0,0.0,1723,0.0,0.0,16,76.0,45.9,77.5,32.2,1,False,40,55,0.1 +2926,-inf,0.0,573,0.0,0.0,0.0,202,0.0,0.0,16,18.0,76.7,87.4,13.0,3,False,120,70,0.1 +2927,-inf,0.0,1559,0.0,0.0,0.0,521,0.0,0.0,12,21.7,77.9,93.2,16.7,2,False,90,35,0.1 +2928,-inf,0.0,1137,0.0,0.0,0.0,408,0.0,0.0,21,6.5,66.2,98.4,1.5,8,False,55,35,0.1 +2929,-inf,0.0,1275,0.0,0.0,0.0,384,0.0,0.0,18,70.8,49.1,82.6,20.4,8,False,40,70,0.1 +2930,-inf,0.0,6687,0.0,0.0,0.0,2375,0.0,0.0,12,71.4,47.8,91.0,36.4,1,False,90,55,0.1 +2931,-inf,0.0,1059,0.0,0.0,0.0,381,0.0,0.0,16,7.8,72.4,95.6,2.8,3,False,40,55,0.1 +2932,-inf,0.0,449,0.0,0.0,0.0,165,0.0,0.0,16,16.2,76.9,96.7,11.2,8,False,120,55,0.1 +2933,-inf,0.0,1610,0.0,0.0,0.0,558,0.0,0.0,12,15.8,72.1,92.2,10.8,8,False,40,90,0.1 +2934,-inf,0.0,6860,0.0,0.0,0.0,2571,0.0,0.0,16,67.8,48.2,78.8,27.9,3,True,90,55,0.1 +2935,-inf,0.0,287,0.0,0.0,0.0,113,0.0,0.0,21,13.5,75.0,89.1,8.5,8,False,40,90,0.1 +2936,-inf,0.0,1641,0.0,0.0,0.0,604,0.0,0.0,21,75.4,49.0,89.5,29.6,8,False,90,20,0.1 +2937,-inf,0.0,4059,0.0,0.0,0.0,1496,0.0,0.0,10,63.5,54.1,91.4,47.1,4,False,55,55,0.1 +2938,-inf,0.0,6690,0.0,0.0,0.0,2418,0.0,0.0,14,74.2,43.4,87.9,31.3,1,True,150,41,0.1 +2939,-inf,0.0,927,0.0,0.0,0.0,316,0.0,0.0,21,71.9,41.8,86.1,47.1,8,False,71,90,0.1 +2940,-inf,0.0,689,0.0,0.0,0.0,271,0.0,0.0,16,5.4,75.3,93.6,0.4,2,False,150,35,0.1 +2941,-inf,0.0,2814,0.0,0.0,0.0,978,0.0,0.0,14,78.4,44.0,91.1,36.4,3,False,90,70,0.1 +2942,-inf,0.0,480,0.0,0.0,0.0,174,0.0,0.0,16,15.9,76.3,96.4,10.9,12,False,120,41,0.1 +2943,-inf,0.0,2014,0.0,0.0,0.0,689,0.0,0.0,21,67.3,42.8,75.0,24.4,2,False,40,20,0.1 +2944,-inf,0.0,2539,0.0,0.0,0.0,864,0.0,0.0,14,20.7,68.7,88.5,15.7,2,False,90,70,0.1 +2945,-inf,0.0,1276,0.0,0.0,0.0,428,0.0,0.0,12,17.9,76.4,86.7,14.2,6,False,120,20,0.1 +2946,-inf,0.0,2770,0.0,0.0,0.0,981,0.0,0.0,10,76.3,39.4,87.2,24.6,3,False,55,70,0.1 +2947,-inf,0.0,2029,0.0,0.0,0.0,725,0.0,0.0,14,13.6,63.9,98.5,8.6,8,False,150,20,0.1 +2948,-inf,0.0,640,0.0,0.0,0.0,234,0.0,0.0,14,14.8,77.6,86.6,9.8,4,False,40,41,0.1 +2949,-inf,0.0,1650,0.0,0.0,0.0,588,0.0,0.0,16,66.1,42.8,82.4,42.7,6,False,55,35,0.1 +2950,-inf,0.0,826,0.0,0.0,0.0,323,0.0,0.0,16,14.0,75.1,96.7,9.0,6,True,71,90,0.1 +2951,-inf,0.0,4557,0.0,0.0,0.0,1625,0.0,0.0,10,9.4,57.4,96.5,4.4,3,False,150,70,0.1 +2952,-inf,0.0,1544,0.0,0.0,0.0,558,0.0,0.0,21,5.4,53.4,89.1,0.4,12,False,71,70,0.1 +2953,-inf,0.0,849,0.0,0.0,0.0,302,0.0,0.0,18,16.5,71.4,98.5,11.5,8,False,150,20,0.1 +2954,-inf,0.0,6996,0.0,0.0,0.0,2547,0.0,0.0,10,13.8,55.1,88.8,4.1,6,True,55,20,0.1 +2955,-inf,0.0,1979,0.0,0.0,0.0,736,0.0,0.0,21,75.9,53.6,78.9,41.6,8,False,120,55,0.1 +2956,-inf,0.0,3455,0.0,0.0,0.0,1234,0.0,0.0,18,10.7,58.0,94.3,8.1,2,False,150,41,0.1 +2957,-inf,0.0,174,0.0,0.0,0.0,75,0.0,0.0,21,10.8,77.1,90.0,5.8,6,False,90,55,0.1 +2958,-inf,0.0,1108,0.0,0.0,0.0,399,0.0,0.0,16,64.1,43.8,82.6,52.3,12,False,150,90,0.1 +2959,-inf,0.0,5252,0.0,0.0,0.0,1920,0.0,0.0,18,74.4,56.5,74.6,43.9,2,True,55,55,0.1 +2960,-inf,0.0,3729,0.0,0.0,0.0,1314,0.0,0.0,12,67.7,41.5,86.5,35.8,2,False,150,35,0.1 +2961,-inf,0.0,6237,0.0,0.0,0.0,2321,0.0,0.0,18,64.1,49.9,73.7,45.1,8,True,120,41,0.1 +2962,-inf,0.0,4009,0.0,0.0,0.0,1385,0.0,0.0,16,69.8,40.6,89.9,46.4,1,False,150,70,0.1 +2963,-inf,0.0,5638,0.0,0.0,0.0,2061,0.0,0.0,14,9.2,54.9,97.1,4.2,3,True,90,41,0.1 +2964,-inf,0.0,1071,0.0,0.0,0.0,378,0.0,0.0,16,14.4,71.1,92.3,9.4,8,False,71,41,0.1 +2965,-inf,0.0,1769,0.0,0.0,0.0,623,0.0,0.0,18,70.9,43.5,72.1,44.4,12,False,120,20,0.1 +2966,-inf,0.0,4661,0.0,0.0,0.0,1658,0.0,0.0,14,15.4,53.8,85.3,14.2,2,False,55,55,0.1 +2967,-inf,0.0,1662,0.0,0.0,0.0,593,0.0,0.0,18,17.2,52.7,86.1,12.2,12,False,55,20,0.1 +2968,-inf,0.0,4147,0.0,0.0,0.0,1475,0.0,0.0,10,71.6,47.1,88.2,33.0,3,False,120,90,0.1 +2969,-inf,0.0,3896,0.0,0.0,0.0,1404,0.0,0.0,14,80.8,54.8,81.6,44.5,3,False,40,35,0.1 +2986,-inf,0.0,2119,0.0,0.0,0.0,792,0.0,0.0,18,15.7,67.4,93.4,10.7,12,True,120,20,0.1 +2987,-inf,0.0,2215,0.0,0.0,0.0,762,0.0,0.0,14,78.2,39.6,84.4,51.3,3,False,120,55,0.1 +2988,-inf,0.0,1411,0.0,0.0,0.0,490,0.0,0.0,12,13.2,74.6,92.2,8.2,3,False,71,20,0.1 +2989,-inf,0.0,1351,0.0,0.0,0.0,476,0.0,0.0,21,77.0,46.2,91.0,54.2,8,False,40,20,0.1 +2990,-inf,0.0,1841,0.0,0.0,0.0,658,0.0,0.0,14,69.8,51.0,82.4,46.5,12,False,90,55,0.1 +2991,-inf,0.0,3994,0.0,0.0,0.0,1414,0.0,0.0,18,80.1,41.5,78.3,50.7,1,False,120,41,0.1 +2992,-inf,0.0,1165,0.0,0.0,0.0,406,0.0,0.0,21,18.7,70.2,97.6,12.5,1,False,55,55,0.1 +2993,-inf,0.0,1147,0.0,0.0,0.0,383,0.0,0.0,16,78.4,50.3,78.8,20.4,6,False,120,70,0.1 +2994,-inf,0.0,3658,0.0,0.0,0.0,1282,0.0,0.0,10,18.3,53.1,91.4,13.8,6,False,40,35,0.1 +2995,-inf,0.0,1765,0.0,0.0,0.0,611,0.0,0.0,16,17.5,66.2,95.8,14.1,6,False,71,90,0.1 +2996,-inf,0.0,4594,0.0,0.0,0.0,1638,0.0,0.0,12,65.1,46.5,90.1,36.3,2,False,71,90,0.1 +2997,-inf,0.0,3426,0.0,0.0,0.0,1267,0.0,0.0,12,12.5,66.6,87.3,7.5,8,True,150,90,0.1 +2998,-inf,0.0,2278,0.0,0.0,0.0,798,0.0,0.0,14,18.5,62.8,92.6,13.5,8,False,90,41,0.1 +2999,-inf,0.0,2392,0.0,0.0,0.0,899,0.0,0.0,18,74.2,52.0,77.8,58.7,8,False,71,55,0.1 +4,-inf,-2551.899999999727,1541,0.9040314392087552,48.91121463514124,1023.0999999999967,575,1.0757801331763066,23.44381428100665,14,9.6,73.2,87.5,4.6,1,False,120,90,0.1 +2985,-inf,0.0,5130,0.0,0.0,0.0,1799,0.0,0.0,10,13.9,65.3,89.2,8.1,1,False,150,20,0.1 +10,-inf,-5970.899999999339,3693,0.9121617745060412,70.90172097840151,-3280.400000000027,1312,0.9000822393469587,44.14943375196569,10,10.9,69.4,85.3,5.9,4,True,40,35,0.1 +11,-inf,-55918.79999999997,6570,0.630250300527262,576.4365353765822,-23981.2,2388,0.6612351162097528,258.79,16,64.6,43.0,79.8,56.3,4,True,120,41,0.1 +2984,-inf,0.0,2671,0.0,0.0,0.0,963,0.0,0.0,14,19.4,68.8,95.2,14.4,6,True,150,90,0.1 +9,-inf,27694.000000000262,1582,1.285065213788617,26.900911120055408,12792.600000000006,450,1.2902784427537028,49.30365386120024,21,80.9,47.5,85.3,20.7,6,False,150,55,0.1 +14,-inf,-1017.4999999999782,200,0.8709787859959677,23.89610167900092,-2296.0,82,0.5644999146450184,26.823355817875203,21,14.2,76.8,94.7,9.2,8,False,40,55,0.1 +3000,-inf,0.0,4406,0.0,0.0,0.0,1622,0.0,0.0,21,8.2,53.7,96.3,3.2,4,True,55,70,0.1 +16,-inf,-23406.899999999714,6242,0.8335596917922213,248.3948036434196,-7786.5999999999785,2329,0.8829554405141975,92.86985205917611,10,5.2,57.4,87.3,0.2,6,True,55,70,0.1 +17,-inf,-35763.49999999982,5736,0.6944473635421516,375.362318840578,-11847.300000000007,2142,0.77971216600658,137.28800000000007,14,10.5,52.7,97.2,5.5,3,True,120,41,0.1 +18,-inf,-1165.9999999993015,4191,0.984539950835453,70.84684859667357,2854.0000000000055,1527,1.0760823203241616,42.29919059944948,12,6.1,64.7,98.7,1.1,1,False,150,41,0.1 +2970,-inf,0.0,5924,0.0,0.0,0.0,2198,0.0,0.0,12,14.9,55.9,85.3,9.9,6,True,90,55,0.1 +2971,-inf,0.0,5314,0.0,0.0,0.0,1888,0.0,0.0,18,12.6,54.0,95.7,4.7,1,False,55,41,0.1 +21,-inf,13398.600000000333,1903,1.1003045384311325,33.15263595725361,3793.400000000027,666,1.056488324545037,59.09883484070711,12,72.7,53.6,78.6,27.8,12,False,55,55,0.1 +22,-inf,-55396.69999999983,7631,0.6857147720019826,587.8003219331865,-24341.29999999999,2803,0.7137439097388902,279.04589851504807,14,66.5,48.4,79.1,19.3,4,True,71,35,0.1 +2972,-inf,0.0,3160,0.0,0.0,0.0,1089,0.0,0.0,12,20.6,70.9,88.9,9.5,1,False,55,20,0.1 +2625,-inf,0.0,2025,0.0,0.0,0.0,741,0.0,0.0,18,6.6,68.0,96.8,1.6,2,True,55,20,0.1 diff --git a/lab/EAs/SimpleEMA/README.md b/lab/EAs/SimpleEMA/README.md new file mode 100644 index 0000000..9024ed8 --- /dev/null +++ b/lab/EAs/SimpleEMA/README.md @@ -0,0 +1,142 @@ +# SimpleEMA — 练手实验室 + +双 EMA 金叉/死叉策略,默认货币对 **EURUSD H1**(流动性好、点差低,适合入门优化)。 + +## 策略逻辑 + +| 项目 | 规则 | +|------|------| +| 入场 | 快 EMA 上穿/下穿慢 EMA(收盘 K 确认) | +| 出场 | 反向交叉 / ATR 或固定 SL·TP / 最大持仓 K 线数 / 可选 trailing | +| 过滤 | 最大点差、最小 EMA 间距 | + +## 文件 + +| 文件 | 用途 | +|------|------| +| `main.mq5` | MT5 EA(Strategy Tester / 实盘) | +| `SimpleEMA_EURUSD.set` | 默认参数 | +| `SimpleEMA_Genetic_Optimization.set` | 遗传优化范围 | +| `run_mt5_tester.py` | **调 MT5 原生 Strategy Tester**(你要的实时回测) | +| `run_backtest.py` | Python 快速回测(MT5 拉历史 K 线) | +| `run_optimize.py` | Python 随机搜索优化 | +| `trades.csv` | 逐单复盘(Python 回测产出) | + +## 1. MT5 原生回测(推荐) + +先确保 MT5 已登录,EURUSD H1 历史数据已下载。 + +```powershell +cd lab\EAs\SimpleEMA + +# 单次回测(自动编译 EA → 启动 Strategy Tester → 生成 HTML 报告) +python run_mt5_tester.py backtest + +# 可视化模式:看 K 线一根根跑(实时感最强) +python run_mt5_tester.py backtest --visual + +# 遗传优化(Optimization=2,用 SimpleEMA_Genetic_Optimization.set) +python run_mt5_tester.py optimize +``` + +回测完成后: + +- HTML 报告路径会打印在终端(通常在 `%APPDATA%\MetaQuotes\Terminal\...\SimpleEMA_EURUSD_backtest.htm`) +- 在 MT5 **结果 → 报告** 里可逐单查看开平仓、滑点、盈亏 +- 优化结果在 **Optimization Results** 标签页,右键可 **Set as Input** + +## 2. Python 快速迭代(改逻辑 → 立刻看 trades.csv) + +```powershell +python run_backtest.py +python run_backtest.py --start 2024-01-01 --fast 10 --slow 30 +``` + +产出:`trades.csv`(每单 side / 开平时间 / 价格 / profit / exit_reason)、`report.png`。 + +## 4. 多品种组合(20 品种) + +### 分品种调参 + 组合(推荐) + +```powershell +# 每个品种独立随机搜索,自动剔除 net<=0 / PF<1 的品种,再跑组合回测 +python run_optimize_portfolio.py --trials 350 + +# 仅用已有 portfolio_params.json 重跑组合 +python run_optimize_portfolio.py --skip-opt + +# 验证组合 +python run_portfolio_v5.py +``` + +产出:`portfolio_params.json`(每品种最优参数 + enabled 标记)、`portfolio_opt_trials/*.csv`、`best_run/portfolio_trades.csv` + +### 统一参数(对比用) + +```powershell +python run_portfolio_v5.py --shared-params best_params.json +``` + +| 文件 | 用途 | +|------|------| +| `portfolio_symbols.json` | 20 品种列表 + 各品种最大点差 | +| `portfolio_curated.json` | 全扫描后 net>0 的子集 | +| `run_portfolio_v5.py` | 组合回测,产出 `portfolio_report.json` | +| `main_portfolio.mq5` | MT5 多品种 EA(挂任意图表,监控 SymbolList 内全部品种) | + +MT5 组合 EA: + +```powershell +python run_mt5_tester.py backtest --ea main_portfolio.mq5 --period M15 --from 2020.01.01 --to 2026.01.01 +``` + +## 3. Python 随机搜索优化 + +```powershell +python run_optimize.py --trials 500 +``` + +产出:`optimize_trials.csv`、`best_params.json`、`best_run/trades.csv`。 + +把 `best_params.json` 里的值填回 `.set` 或 `main.mq5` input,再用 `run_mt5_tester.py optimize` 做 MT5 遗传精调。 + +## 5. MT5 回测(唯一准绳) + +**2598 笔是 Python 组合模拟;`SimpleEMA_report.pdf` 只是单品种 EURUSD(~115 笔)。** + +组合请以 MT5 为准: + +```powershell +# 12 个启用品种各跑一遍 MT5 Strategy Tester(每品种独立 .set) +python run_mt5_portfolio.py --from 2020.01.01 --to 2026.01.01 + +# 从 MT5 HTML 报告汇总生成正式报告 +python generate_mt5_portfolio_report.py +``` + +产出: +- `best_run/mt5_results.json` — MT5 汇总(交易数、净利) +- `best_run/mt5_reports/*.htm` — 各品种 MT5 原生报告(逐单复盘) +- `best_run/MT5_PORTFOLIO_REPORT.md` — 组合说明 +- `best_run/SimpleEMA_report.png` — 由 MT5 数据生成的组合图 + +Python `portfolio_trades.csv` / `run_portfolio_v5.py` 仅用于快速迭代参数,**不作最终成绩**。 + +``` +改 main.mq5 逻辑 + ↓ +python run_backtest.py ← 秒级验证 + trades.csv 逐单复盘 + ↓ +python run_optimize.py ← 粗搜参数空间 + ↓ +python run_mt5_tester.py optimize ← MT5 遗传优化确认 + ↓ +python run_mt5_tester.py backtest --visual ← 目视检查 +``` + +## 手动在 MT5 里操作 + +1. 把 `main.mq5` 复制到 `MQL5/Experts/` 或用 MetaEditor 打开编译 +2. Strategy Tester:Expert = `SimpleEMA`,Symbol = `EURUSD`,Period = `H1` +3. Inputs → Load → `SimpleEMA_EURUSD.set` +4. 优化时 Load → `SimpleEMA_Genetic_Optimization.set`,Optimization = **Genetic** diff --git a/lab/EAs/SimpleEMA/SimpleEMA_EURUSD.set b/lab/EAs/SimpleEMA/SimpleEMA_EURUSD.set new file mode 100644 index 0000000..f25d8e6 --- /dev/null +++ b/lab/EAs/SimpleEMA/SimpleEMA_EURUSD.set @@ -0,0 +1,21 @@ +; SimpleEMA — default inputs for EURUSD H1 practice +; Load in Strategy Tester → Inputs → Load + +Timeframe=16385 +MagicNumber=20260620 +FastEmaPeriod=12 +SlowEmaPeriod=26 +MinEmaGapPips=0.0 +LotSize=0.10 +UseAtrStops=true +AtrPeriod=14 +AtrSlMult=1.5 +AtrTpMult=2.5 +StopLossPips=30 +TakeProfitPips=60 +UseTrailing=false +TrailPips=20 +ExitOnCross=true +MaxBarsInTrade=48 +MaxSpreadPips=5 +OneTradeOnly=true diff --git a/lab/EAs/SimpleEMA/SimpleEMA_Genetic_Optimization.set b/lab/EAs/SimpleEMA/SimpleEMA_Genetic_Optimization.set new file mode 100644 index 0000000..93b4afb --- /dev/null +++ b/lab/EAs/SimpleEMA/SimpleEMA_Genetic_Optimization.set @@ -0,0 +1,29 @@ +; SimpleEMA — genetic optimization ranges (EURUSD H1) +; Format: Name=Default||Min||Step||Max||Y/N +; Load: Strategy Tester → Inputs → Load, then Optimization → Genetic + +; === fixed === +Timeframe=16385||16385||0||16385||N +MagicNumber=20260620||20260620||1||20260620||N +LotSize=0.10||0.10||0||0.10||N +UseAtrStops=true||false||0||true||N +OneTradeOnly=true||true||0||true||N +ExitOnCross=true||false||0||true||N +UseTrailing=false||false||0||true||N + +; === EMA === +FastEmaPeriod=12||8||2||20||Y +SlowEmaPeriod=26||20||2||60||Y +MinEmaGapPips=0.0||0.0||1.0||8.0||Y + +; === ATR stops === +AtrPeriod=14||10||2||20||Y +AtrSlMult=1.5||1.0||0.25||3.0||Y +AtrTpMult=2.5||1.5||0.25||4.0||Y +StopLossPips=30||15||5||60||Y +TakeProfitPips=60||30||10||120||Y +TrailPips=20||10||5||40||Y + +; === exits / filters === +MaxBarsInTrade=48||0||12||96||Y +MaxSpreadPips=5||0||1||8||Y diff --git a/lab/EAs/SimpleEMA/SimpleEMA_optimized.set b/lab/EAs/SimpleEMA/SimpleEMA_optimized.set new file mode 100644 index 0000000..ff68dad --- /dev/null +++ b/lab/EAs/SimpleEMA/SimpleEMA_optimized.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — trend-leg cross + pullback +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=34 +TrendLegBars=56 +MinEmaGapPips=1.5 +CrossCooldown=6 +PullbackCooldown=5 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=25.0 +PullbackMinGapPips=2.9 +MaxPullbacksPerLeg=1 +AtrPeriod=14 +AtrSlMult=2.54 +AtrTpMult=4.84 +MaxBarsInTrade=80 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6.0 +LotSize=0.1 diff --git a/lab/EAs/SimpleEMA/SimpleEMA_profit.set b/lab/EAs/SimpleEMA/SimpleEMA_profit.set new file mode 100644 index 0000000..353b7bf --- /dev/null +++ b/lab/EAs/SimpleEMA/SimpleEMA_profit.set @@ -0,0 +1,21 @@ +; SimpleEMA — profitable low-frequency preset (~82 trades / 6y) +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +EntryMode=0 +MinEmaGapPips=1.5 +CooldownBars=8 +UseAtrStops=true +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +ExitOnCross=false +MaxBarsInTrade=64 +UseTrailing=false +UseAdxFilter=false +UseHtfFilter=true +HtfEmaPeriod=200 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.10 diff --git a/lab/EAs/SimpleEMA/best_params.json b/lab/EAs/SimpleEMA/best_params.json new file mode 100644 index 0000000..3f2a7f7 --- /dev/null +++ b/lab/EAs/SimpleEMA/best_params.json @@ -0,0 +1,39 @@ +{ + "version": 5, + "target_met": false, + "params": { + "fast_ema": 11, + "slow_ema": 34, + "trend_leg_bars": 56, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 6, + "pullback_cooldown": 5, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 25.0, + "pullback_min_gap_pips": 2.9, + "max_pullbacks_per_leg": 1, + "atr_period": 14, + "atr_sl_mult": 2.54, + "atr_tp_mult": 4.84, + "max_bars_in_trade": 80, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6.0, + "lot_size": 0.1, + "initial_balance": 10000.0 + }, + "metrics": { + "net_profit": 315.0799999999963, + "total_trades": 115, + "win_rate": 40.869565217391305, + "profit_factor": 1.2081522098170046, + "max_drawdown_pct": 2.1473621754491634, + "sharpe": 0.4947439712557756 + } +} \ No newline at end of file diff --git a/lab/EAs/SimpleEMA/exploration-ideas.tex b/lab/EAs/SimpleEMA/exploration-ideas.tex deleted file mode 100644 index ea7c07d..0000000 --- a/lab/EAs/SimpleEMA/exploration-ideas.tex +++ /dev/null @@ -1,21 +0,0 @@ -\section{Simple EMA Price-Action: V1 Exploration Roadmap} -\label{sec:simple-ema-v1-roadmap} - -\textbf{Objective (V1).} -Establish a robust baseline for the BTCUSD EMA price-action cross strategy before adding complexity. V1 prioritizes stability, explainability, and out-of-sample consistency. - -\begin{enumerate} - \item \textbf{Baseline calibration}: optimize core parameters ($EMA$ period, minimum candle body, ATR stop/take-profit multipliers) with bounded search ranges and fixed transaction-cost assumptions. - \item \textbf{Regime segmentation}: split results by volatility/trend regime (e.g., ATR percentile and ADX bins) to identify where the strategy has structural edge. - \item \textbf{Session effects}: evaluate performance across Asia, London, and New York sessions; test session-specific body-size and risk multipliers. - \item \textbf{Exit policy comparison}: compare fixed ATR exits vs. trailing stop and partial take-profit exits; report trade duration, payoff skew, and drawdown impact. - \item \textbf{Execution stress test}: re-run with adverse spread/slippage scenarios to measure fragility and realistic live-trading degradation. - \item \textbf{Position-sizing study}: benchmark fixed lot, volatility targeting, and capped fractional sizing with drawdown constraints. - \item \textbf{Signal quality filters}: test wick/body ratio and momentum confirmation to reduce false crosses; quantify precision-recall tradeoff. - \item \textbf{Walk-forward validation}: use rolling train-test windows and report parameter drift, out-of-sample Sharpe, and failure periods. - \item \textbf{Statistical confidence}: include bootstrap confidence intervals for Sharpe, profit factor, win rate, and max drawdown. - \item \textbf{Portfolio contribution}: evaluate correlation-adjusted P\&L contribution when combined with other robots in the united\_dynamic stack. -\end{enumerate} - -\textbf{V1 deliverables.} -For each experiment, report: net P\&L, Sharpe, Sortino, max drawdown, profit factor, win rate, average trade duration, and out-of-sample performance delta. diff --git a/lab/EAs/SimpleEMA/generate_latex_report.py b/lab/EAs/SimpleEMA/generate_latex_report.py new file mode 100644 index 0000000..e63b98f --- /dev/null +++ b/lab/EAs/SimpleEMA/generate_latex_report.py @@ -0,0 +1,448 @@ +#!/usr/bin/env python3 +"""Generate SimpleEMA LaTeX report -> PDF + PNG. + +WARNING: Reads Python backtest (single-symbol). Portfolio official report: + best_run/MT5_PORTFOLIO_REPORT.md (from MT5 Strategy Tester) +""" + +from __future__ import annotations + +import json +import shutil +import subprocess +import textwrap +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import pandas as pd + +ROOT = Path(__file__).resolve().parent +OUT = ROOT / "best_run" +FIG = OUT / "figures" +TEX = OUT / "SimpleEMA_report.tex" +PDF = OUT / "SimpleEMA_report.pdf" +PNG = OUT / "SimpleEMA_report.png" + +plt.rcParams.update({"figure.dpi": 150, "savefig.dpi": 150, "font.size": 9}) + + +def latex_escape(s: str) -> str: + for a, b in (("\\", "\\textbackslash{}"), ("&", "\\&"), ("%", "\\%"), + ("$", "\\$"), ("#", "\\#"), ("_", "\\_"), ("{", "\\{"), ("}", "\\}")): + s = s.replace(a, b) + return s + + +def load_data() -> tuple[dict, dict, pd.DataFrame]: + with open(ROOT / "best_params.json", encoding="utf-8") as f: + bp = json.load(f) + summary_path = OUT / "report.json" + if summary_path.exists(): + summary = json.loads(summary_path.read_text(encoding="utf-8")) + else: + summary = bp.get("metrics", {}) + trades = pd.read_csv(OUT / "trades.csv") + trades["open_time"] = pd.to_datetime(trades["open_time"]) + trades["close_time"] = pd.to_datetime(trades["close_time"]) + return bp, summary, trades + + +def save_figures(trades: pd.DataFrame, summary: dict) -> None: + FIG.mkdir(parents=True, exist_ok=True) + bal0 = summary.get("initial_balance", 10_000.0) + eq = bal0 + trades.sort_values("close_time")["profit"].cumsum() + times = trades.sort_values("close_time")["close_time"] + dd = (eq - eq.cummax()) / eq.cummax() * 100 + + fig, ax = plt.subplots(figsize=(8, 3.2)) + ax.plot(times, eq, color="#2ca02c", lw=1.6) + ax.axhline(bal0, ls="--", color="#888", lw=0.8) + ax.set_title("Equity Curve") + ax.set_ylabel("Balance (USD)") + ax.grid(alpha=0.3) + fig.tight_layout() + fig.savefig(FIG / "equity.pdf", bbox_inches="tight") + fig.savefig(FIG / "equity.png", bbox_inches="tight") + plt.close(fig) + + fig, ax = plt.subplots(figsize=(8, 2.8)) + ax.fill_between(times, dd, 0, color="#d62728", alpha=0.35) + ax.plot(times, dd, color="#8b0000", lw=0.8) + ax.set_title("Drawdown") + ax.set_ylabel("Drawdown (%)") + ax.grid(alpha=0.3) + fig.tight_layout() + fig.savefig(FIG / "drawdown.pdf", bbox_inches="tight") + fig.savefig(FIG / "drawdown.png", bbox_inches="tight") + plt.close(fig) + + monthly = trades.copy() + monthly["month"] = monthly["close_time"].dt.to_period("M") + mp = monthly.groupby("month")["profit"].sum() + fig, ax = plt.subplots(figsize=(8, 3)) + colors = ["#2ca02c" if v >= 0 else "#d62728" for v in mp.values] + ax.bar(range(len(mp)), mp.values, color=colors, width=0.85) + ax.set_title("Monthly PnL") + ax.set_ylabel("USD") + ax.axhline(0, color="black", lw=0.6) + ax.set_xticks(range(0, len(mp), max(1, len(mp) // 8))) + ax.set_xticklabels([str(m) for m in mp.index[:: max(1, len(mp) // 8)]], rotation=45, ha="right") + fig.tight_layout() + fig.savefig(FIG / "monthly.pdf", bbox_inches="tight") + fig.savefig(FIG / "monthly.png", bbox_inches="tight") + plt.close(fig) + + rc = trades["exit_reason"].value_counts() + fig, ax = plt.subplots(figsize=(5, 3)) + ax.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax.set_title("Exit Reasons") + ax.set_ylabel("Count") + fig.tight_layout() + fig.savefig(FIG / "exits.pdf", bbox_inches="tight") + fig.savefig(FIG / "exits.png", bbox_inches="tight") + plt.close(fig) + + fig, ax = plt.subplots(figsize=(5, 3)) + ax.hist(trades["profit"], bins=20, color="#9467bd", alpha=0.85, edgecolor="white") + ax.axvline(0, color="black", lw=0.8) + ax.set_title("Per-Trade PnL Distribution") + ax.set_xlabel("Profit (USD)") + fig.tight_layout() + fig.savefig(FIG / "pnl_hist.pdf", bbox_inches="tight") + fig.savefig(FIG / "pnl_hist.png", bbox_inches="tight") + plt.close(fig) + + +def trade_table_rows(trades: pd.DataFrame, n: int = 12, best: bool = True) -> str: + col = "profit" + sub = trades.nlargest(n, col) if best else trades.nsmallest(n, col) + lines = [] + for _, r in sub.iterrows(): + lines.append( + f"{r['side']} & {r['open_time'].strftime('%Y-%m-%d %H:%M')} & " + f"{r['close_time'].strftime('%Y-%m-%d %H:%M')} & " + f"{r['profit']:.2f} & {latex_escape(str(r['exit_reason']))} \\\\" + ) + return "\n".join(lines) + + +def build_tex(bp: dict, summary: dict, trades: pd.DataFrame) -> str: + p = bp["params"] + version = int(bp.get("version", 2)) + net = summary.get("net_profit", 0) + + if version >= 5: + param_rows = [ + ("快 EMA / 慢 EMA", f"{p['fast_ema']} / {p['slow_ema']}"), + ("入场", "交叉 + 趋势段回调" if p.get("use_pullback") else "仅交叉"), + ("趋势段长度", f"{p.get('trend_leg_bars', '-')} bars"), + ("交叉冷却", f"{p.get('cross_cooldown', '-')} bars"), + ("回调冷却", f"{p.get('pullback_cooldown', '-')} bars"), + ("回调 ADX 下限", str(p.get("pullback_adx_min", "-"))), + ("回调最小间距", f"{p.get('pullback_min_gap_pips', '-')} pips"), + ("每段最多回调", str(p.get("max_pullbacks_per_leg", 1))), + ("ATR 周期", str(p["atr_period"])), + ("止损 SL", f"ATR $\\times$ {p['atr_sl_mult']}"), + ("止盈 TP", f"ATR $\\times$ {p['atr_tp_mult']}"), + ("最大持仓", f"{p['max_bars_in_trade']} bars M15"), + ("H4 EMA 过滤", f"EMA({p['htf_ema_period']})" if p.get("use_htf_filter") else "关"), + ("交易时段 (UTC)", f"{p['session_start']}:00 -- {p['session_end']}:00"), + ("最大点差", f"{p['max_spread_pips']} pips"), + ("手数", str(p["lot_size"])), + ] + logic_note = ( + "v5 逻辑:EMA 交叉为主入场;仅在活跃趋势段内允许一次高质量回调" + "(ADX/间距过滤),避免 v3 多层过滤导致样本过少。" + ) + else: + param_rows = [ + ("快 EMA / 慢 EMA", f"{p['fast_ema']} / {p['slow_ema']}"), + ("入场模式", "EMA 交叉 (mode=0)"), + ("最小 EMA 间距", f"{p['min_ema_gap_pips']} pips"), + ("冷却 K 线", str(p["cooldown_bars"])), + ("ATR 周期", str(p["atr_period"])), + ("止损 SL", f"ATR $\\times$ {p['atr_sl_mult']}"), + ("止盈 TP", f"ATR $\\times$ {p['atr_tp_mult']}"), + ("反向交叉平仓", "否" if not p.get("exit_on_cross") else "是"), + ("最大持仓", f"{p['max_bars_in_trade']} bars M15"), + ("H4 EMA 过滤", f"EMA({p['htf_ema_period']})" if p.get("use_htf_filter") else "关"), + ("交易时段 (UTC)", f"{p['session_start']}:00 -- {p['session_end']}:00"), + ("最大点差", f"{p['max_spread_pips']} pips"), + ("手数", str(p["lot_size"])), + ] + logic_note = "v2 逻辑:EMA 交叉 + H4 趋势过滤。" + param_tex = "\n".join(f"{k} & {v} \\\\" for k, v in param_rows) + + if version >= 5: + strategy_tex = textwrap.dedent(rf""" + \begin{{enumerate}} + \item \textbf{{交叉入场}}:M15 EMA({p["fast_ema"]}/{p["slow_ema"]}) 金叉/死叉 + H4 趋势过滤。 + \item \textbf{{回调入场}}:仅在趋势段({p.get("trend_leg_bars", 48)} bars)内,价格回踩 EMA 后收回;ADX $\ge$ {p.get("pullback_adx_min", 0)};每段最多 {p.get("max_pullbacks_per_leg", 1)} 次。 + \item \textbf{{过滤}}:UTC {p["session_start"]}:00--{p["session_end"]}:00;点差 $\le$ {p["max_spread_pips"]} pips。 + \item \textbf{{风控}}:SL = ATR({p["atr_period"]}) $\times$ {p["atr_sl_mult"]},TP = ATR $\times$ {p["atr_tp_mult"]}。 + \item \textbf{{冷却}}:交叉 {p.get("cross_cooldown", "-")} bars;回调 {p.get("pullback_cooldown", "-")} bars。 + \end{{enumerate}} + """) + summary_note = ( + f"未达到 2000--3000 笔目标(当前 {summary.get('total_trades', len(trades))} 笔)," + f"但 v5 在 v2 约 81 笔基础上提升到 {summary.get('total_trades', len(trades))} 笔且保持 PF>1。" + + logic_note + ) + else: + strategy_tex = textwrap.dedent(rf""" + \begin{{enumerate}} + \item \textbf{{入场}}:M15 上 EMA({p["fast_ema"]}/{p["slow_ema"]}) 金叉/死叉,最小间距 {p["min_ema_gap_pips"]} pips。 + \item \textbf{{过滤}}:价格须在 H4 EMA({p["htf_ema_period"]}) 趋势同侧;UTC {p["session_start"]}:00--{p["session_end"]}:00;点差 $\le$ {p["max_spread_pips"]} pips。 + \item \textbf{{风控}}:SL = ATR({p["atr_period"]}) $\times$ {p["atr_sl_mult"]},TP = ATR $\times$ {p["atr_tp_mult"]}。 + \item \textbf{{出场}}:触及 SL/TP,或持仓超过 {p["max_bars_in_trade"]} 根 M15 K 线。 + \item \textbf{{冷却}}:每笔交易后等待 {p.get("cooldown_bars", "-")} 根 K 线再入场。 + \end{{enumerate}} + """) + summary_note = ( + f"未达到 2000--3000 笔交易目标(当前 {summary.get('total_trades', len(trades))} 笔)。" + + logic_note + ) + + exit_counts = trades["exit_reason"].value_counts() + exit_tex = "\n".join( + f"{latex_escape(str(k))} & {v} & {v / len(trades) * 100:.1f}\\% \\\\" for k, v in exit_counts.items() + ) + + return textwrap.dedent(rf""" + \documentclass[11pt,a4paper]{{ctexart}} + \usepackage{{graphicx}} + \usepackage{{booktabs}} + \usepackage{{geometry}} + \usepackage{{float}} + \usepackage{{xcolor}} + \usepackage{{hyperref}} + \geometry{{margin=2cm}} + \definecolor{{pos}}{{RGB}}{{44,160,44}} + \definecolor{{neg}}{{RGB}}{{214,39,40}} + \title{{SimpleEMA 最优参数回测报告\\ \large EURUSD M15 · 2020--2026 · 最终版}} + \author{{自动生成 · lab/EAs/SimpleEMA}} + \date{{{datetime.now().strftime("%Y-%m-%d")}}} + + \begin{{document}} + \maketitle + + \section{{执行摘要}} + 本报告为 SimpleEMA 策略在修复 trailing-stop 模拟 bug 后,经 6000+ 次随机搜索得到的\textbf{{真实最优}}参数配置。 + 回测含点差与滑点,非 MT5 测试器 HTML 导出。 + + \begin{{table}}[H] + \centering + \caption{{关键绩效指标}} + \begin{{tabular}}{{lr}} + \toprule + 指标 & 数值 \\ + \midrule + 货币对 / 周期 & {latex_escape(summary.get("symbol", "EURUSD"))} / M15 \\ + 回测区间 & 2020-01-01 $\sim$ 2026-01-01 \\ + 初始资金 & \${summary.get("initial_balance", 10000):,.0f} \\ + \textbf{{净利润}} & \textbf{{\textcolor{{pos}}{{+\${net:,.2f}}}}} \\ + 收益率 & {summary.get("return_pct", 0):.2f}\% \\ + 总交易数 & {summary.get("total_trades", len(trades))} \\ + 胜率 & {summary.get("win_rate", 0):.1f}\% \\ + 盈利因子 PF & {summary.get("profit_factor", 0):.2f} \\ + 最大回撤 & {summary.get("max_drawdown_pct", 0):.2f}\% \\ + 平均盈利 / 亏损 & \${summary.get("avg_win", 0):.2f} / \${summary.get("avg_loss", 0):.2f} \\ + 最佳 / 最差单笔 & \${summary.get("best_trade", 0):.2f} / \${summary.get("worst_trade", 0):.2f} \\ + \bottomrule + \end{{tabular}} + \end{{table}} + + \noindent\textbf{{说明:}}{latex_escape(summary_note)} + + \section{{权益曲线与回撤}} + \begin{{figure}}[H] + \centering + \includegraphics[width=0.92\textwidth]{{figures/equity.pdf}} + \caption{{账户权益曲线}} + \end{{figure}} + \begin{{figure}}[H] + \centering + \includegraphics[width=0.92\textwidth]{{figures/drawdown.pdf}} + \caption{{回撤百分比}} + \end{{figure}} + + \section{{月度盈亏与出场结构}} + \begin{{figure}}[H] + \centering + \begin{{minipage}}{{0.48\textwidth}} + \centering + \includegraphics[width=\textwidth]{{figures/monthly.pdf}} + \caption{{逐月 PnL}} + \end{{minipage}}\hfill + \begin{{minipage}}{{0.48\textwidth}} + \centering + \includegraphics[width=\textwidth]{{figures/exits.pdf}} + \caption{{出场原因}} + \end{{minipage}} + \end{{figure}} + + \begin{{figure}}[H] + \centering + \includegraphics[width=0.55\textwidth]{{figures/pnl_hist.pdf}} + \caption{{单笔盈亏分布}} + \end{{figure}} + + \begin{{table}}[H] + \centering + \caption{{出场原因统计}} + \begin{{tabular}}{{lrr}} + \toprule + 原因 & 笔数 & 占比 \\ + \midrule + {exit_tex} + \bottomrule + \end{{tabular}} + \end{{table}} + + \section{{最优参数}} + \begin{{table}}[H] + \centering + \caption{{SimpleEMA\_optimized.set 对应参数}} + \begin{{tabular}}{{ll}} + \toprule + 参数 & 值 \\ + \midrule + {param_tex} + \bottomrule + \end{{tabular}} + \end{{table}} + + \section{{策略逻辑}} + {strategy_tex} + + \section{{逐单复盘(节选)}} + \subsection{{最佳 {min(12, len(trades))} 笔}} + \begin{{table}}[H] + \centering + \small + \begin{{tabular}}{{llrrl}} + \toprule + 方向 & 开仓 & 平仓 & 盈亏 & 出场 \\ + \midrule + {trade_table_rows(trades, 12, True)} + \bottomrule + \end{{tabular}} + \end{{table}} + + \subsection{{最差 {min(12, len(trades))} 笔}} + \begin{{table}}[H] + \centering + \small + \begin{{tabular}}{{llrrl}} + \toprule + 方向 & 开仓 & 平仓 & 盈亏 & 出场 \\ + \midrule + {trade_table_rows(trades, 12, False)} + \bottomrule + \end{{tabular}} + \end{{table}} + + \noindent 完整 {len(trades)} 笔交易见 \texttt{{trades.csv}}。 + + \section{{后续验证}} + MT5 原生 Strategy Tester 验证命令: + \begin{{verbatim}} + cd lab/EAs/SimpleEMA + python run_mt5_tester.py backtest --period M15 ^ + --from 2020.01.01 --to 2026.01.01 --set SimpleEMA_optimized.set + \end{{verbatim}} + + \end{{document}} + """).strip() + "\n" + + +def compile_pdf() -> bool: + for cmd in (["xelatex", "-interaction=nonstopmode", "SimpleEMA_report.tex"],): + for _ in range(2): + r = subprocess.run(cmd, cwd=OUT, capture_output=True, text=True) + if r.returncode != 0 and "xelatex" in cmd[0]: + print(r.stdout[-2000:] if r.stdout else "") + print(r.stderr[-2000:] if r.stderr else "") + return PDF.exists() + + +def pdf_to_png() -> bool: + try: + import fitz # PyMuPDF + + doc = fitz.open(PDF) + zoom = 200 / 72 + mat = fitz.Matrix(zoom, zoom) + images = [] + for page in doc: + pix = page.get_pixmap(matrix=mat, alpha=False) + images.append(pix) + if len(images) == 1: + images[0].save(PNG) + else: + # stack pages vertically into one PNG + w = max(p.width for p in images) + h = sum(p.height for p in images) + from PIL import Image + import io + + canvas = Image.new("RGB", (w, h), "white") + y = 0 + for pix in images: + img = Image.open(io.BytesIO(pix.tobytes("png"))) + canvas.paste(img, (0, y)) + y += pix.height + canvas.save(PNG, dpi=(200, 200)) + doc.close() + return PNG.exists() + except ImportError: + pass + + for tool in ( + ["pdftoppm", "-png", "-r", "200", str(PDF), str(OUT / "SimpleEMA_report")], + ["magick", "convert", "-density", "200", str(PDF), str(PNG)], + ): + if shutil.which(tool[0]): + subprocess.run(tool, cwd=OUT, check=False) + if tool[0] == "pdftoppm": + cand = OUT / "SimpleEMA_report-1.png" + if cand.exists(): + cand.replace(PNG) + return True + if PNG.exists(): + return True + # fallback: copy dashboard chart + src = FIG / "equity.png" + if src.exists(): + shutil.copy2(src, PNG) + return True + return False + + +def main() -> None: + if not (OUT / "trades.csv").exists(): + subprocess.run(["python", str(ROOT / "generate_report.py")], check=True, cwd=ROOT) + bp, summary, trades = load_data() + save_figures(trades, summary) + tex = build_tex(bp, summary, trades) + TEX.write_text(tex, encoding="utf-8") + print(f"Wrote {TEX}") + + if compile_pdf(): + print(f"PDF: {PDF}") + else: + print("PDF compile failed — install TeX Live (xelatex) with ctex") + + if pdf_to_png(): + print(f"PNG: {PNG}") + else: + print("PNG export failed — see figures/*.png") + + print(f"Figures: {FIG}") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/generate_mt5_portfolio_pdf.py b/lab/EAs/SimpleEMA/generate_mt5_portfolio_pdf.py new file mode 100644 index 0000000..c5fb175 --- /dev/null +++ b/lab/EAs/SimpleEMA/generate_mt5_portfolio_pdf.py @@ -0,0 +1,488 @@ +#!/usr/bin/env python3 +"""Generate MT5 portfolio PDF + PNG from Strategy Tester HTML reports.""" + +from __future__ import annotations + +import json +import re +import shutil +import subprocess +import textwrap +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import pandas as pd + +LAB = Path(__file__).resolve().parent +OUT = LAB / "best_run" +FIG = OUT / "figures" +RESULTS = OUT / "mt5_results.json" +REPORTS = OUT / "mt5_reports" +TEX = OUT / "SimpleEMA_report.tex" +PDF = OUT / "SimpleEMA_report.pdf" +PNG = OUT / "SimpleEMA_report.png" +REPORT_PNG = OUT / "report.png" +TRADES_CSV = OUT / "mt5_portfolio_trades.csv" + +plt.rcParams.update({"figure.dpi": 150, "savefig.dpi": 150, "font.size": 9}) + + +def read_html(path: Path) -> str: + text = path.read_text(encoding="utf-16", errors="ignore") + if not text.strip(): + text = path.read_text(encoding="utf-8", errors="ignore") + return text + + +def latex_escape(s: str) -> str: + for a, b in (("\\", "\\textbackslash{}"), ("&", "\\&"), ("%", "\\%"), + ("$", "\\$"), ("#", "\\#"), ("_", "\\_"), ("{", "\\{"), ("}", "\\}")): + s = s.replace(a, b) + return s + + +def parse_mt5_deals(html_path: Path, symbol: str) -> list[dict]: + text = read_html(html_path) + if "成交" not in text: + return [] + section = text.split("成交", 1)[1].split("", 1)[0] + rows: list[dict] = [] + for tr in re.findall(r'(.*?)', section, re.DOTALL | re.I): + cols = re.findall(r"]*>(.*?)", tr, re.DOTALL | re.I) + if len(cols) < 11: + continue + typ = re.sub(r"<[^>]+>", "", cols[3]).strip().lower() + direction = re.sub(r"<[^>]+>", "", cols[4]).strip().lower() + if typ == "balance" or direction != "out" or typ not in ("buy", "sell"): + continue + profit_s = re.sub(r"<[^>]+>", "", cols[10]).replace(" ", "").replace(",", "") + try: + profit = float(profit_s) + except ValueError: + continue + comment = re.sub(r"<[^>]+>", "", cols[12]).strip() if len(cols) > 12 else "" + cl = comment.lower() + if "sl " in cl or cl.startswith("sl"): + exit_reason = "sl" + elif "tp " in cl or cl.startswith("tp"): + exit_reason = "tp" + else: + exit_reason = "other" + close_time = pd.to_datetime(re.sub(r"<[^>]+>", "", cols[0]).strip()) + rows.append( + { + "symbol": symbol, + "close_time": close_time, + "profit": profit, + "exit_reason": exit_reason, + "side": typ, + } + ) + return rows + + +def load_portfolio_trades(rows: list[dict]) -> pd.DataFrame: + all_rows: list[dict] = [] + for r in rows: + if not r.get("ready"): + continue + rep = r.get("report") or r.get("report_local") + if not rep: + cand = REPORTS / f"SimpleEMA_pf_{r['symbol']}.htm" + rep = str(cand) if cand.exists() else None + if not rep or not Path(rep).exists(): + continue + all_rows.extend(parse_mt5_deals(Path(rep), r["symbol"])) + if not all_rows: + return pd.DataFrame() + return pd.DataFrame(all_rows).sort_values(["close_time", "symbol"]).reset_index(drop=True) + + +def portfolio_summary(trades: pd.DataFrame, pf: dict, deposit: float, n_syms: int) -> dict: + if trades.empty: + return { + "total_trades": pf.get("total_trades", 0), + "net_profit": pf.get("net_profit_sum", 0), + "win_rate": 0.0, + "profit_factor": pf.get("profit_factor_approx") or 0.0, + "max_drawdown_pct": 0.0, + "initial_balance": deposit * n_syms, + "return_pct": 0.0, + "avg_win": 0.0, + "avg_loss": 0.0, + "best_trade": 0.0, + "worst_trade": 0.0, + } + wins = trades[trades["profit"] > 0] + losses = trades[trades["profit"] < 0] + gp = wins["profit"].sum() + gl = abs(losses["profit"].sum()) + initial = deposit * n_syms + eq = initial + trades["profit"].cumsum() + dd = (eq - eq.cummax()) / eq.cummax() * 100 + net = trades["profit"].sum() + return { + "total_trades": len(trades), + "net_profit": round(net, 2), + "win_rate": round(len(wins) / len(trades) * 100, 1), + "profit_factor": round(gp / gl, 2) if gl > 0 else 999.0, + "max_drawdown_pct": round(abs(dd.min()), 2), + "initial_balance": initial, + "return_pct": round(net / initial * 100, 2), + "avg_win": round(wins["profit"].mean(), 2) if len(wins) else 0.0, + "avg_loss": round(losses["profit"].mean(), 2) if len(losses) else 0.0, + "best_trade": round(trades["profit"].max(), 2), + "worst_trade": round(trades["profit"].min(), 2), + } + + +def save_figures(trades: pd.DataFrame, sym_df: pd.DataFrame, summary: dict, pf: dict) -> None: + FIG.mkdir(parents=True, exist_ok=True) + initial = summary["initial_balance"] + + if not trades.empty: + eq = initial + trades.sort_values("close_time")["profit"].cumsum() + times = trades.sort_values("close_time")["close_time"] + dd = (eq - eq.cummax()) / eq.cummax() * 100 + + fig, ax = plt.subplots(figsize=(8, 3.2)) + ax.plot(times, eq, color="#2ca02c", lw=1.4) + ax.axhline(initial, ls="--", color="#888", lw=0.8) + ax.set_title("Portfolio Equity (MT5 deals, combined timeline)") + ax.set_ylabel("Balance (USD)") + ax.grid(alpha=0.3) + fig.tight_layout() + fig.savefig(FIG / "equity.pdf", bbox_inches="tight") + fig.savefig(FIG / "equity.png", bbox_inches="tight") + plt.close(fig) + + fig, ax = plt.subplots(figsize=(8, 2.8)) + ax.fill_between(times, dd, 0, color="#d62728", alpha=0.35) + ax.plot(times, dd, color="#8b0000", lw=0.8) + ax.set_title("Portfolio Drawdown") + ax.set_ylabel("Drawdown (%)") + ax.grid(alpha=0.3) + fig.tight_layout() + fig.savefig(FIG / "drawdown.pdf", bbox_inches="tight") + fig.savefig(FIG / "drawdown.png", bbox_inches="tight") + plt.close(fig) + + monthly = trades.copy() + monthly["month"] = monthly["close_time"].dt.to_period("M") + mp = monthly.groupby("month")["profit"].sum() + fig, ax = plt.subplots(figsize=(8, 3)) + colors = ["#2ca02c" if v >= 0 else "#d62728" for v in mp.values] + ax.bar(range(len(mp)), mp.values, color=colors, width=0.85) + ax.set_title("Monthly PnL (all symbols)") + ax.set_ylabel("USD") + ax.axhline(0, color="black", lw=0.6) + step = max(1, len(mp) // 8) + ax.set_xticks(range(0, len(mp), step)) + ax.set_xticklabels([str(m) for m in mp.index[::step]], rotation=45, ha="right") + fig.tight_layout() + fig.savefig(FIG / "monthly.pdf", bbox_inches="tight") + fig.savefig(FIG / "monthly.png", bbox_inches="tight") + plt.close(fig) + + rc = trades["exit_reason"].value_counts() + fig, ax = plt.subplots(figsize=(5, 3)) + ax.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax.set_title("Exit Reasons (from MT5 comments)") + ax.set_ylabel("Count") + fig.tight_layout() + fig.savefig(FIG / "exits.pdf", bbox_inches="tight") + fig.savefig(FIG / "exits.png", bbox_inches="tight") + plt.close(fig) + + fig, ax = plt.subplots(figsize=(5, 3)) + ax.hist(trades["profit"], bins=30, color="#9467bd", alpha=0.85, edgecolor="white") + ax.axvline(0, color="black", lw=0.8) + ax.set_title("Per-Trade PnL Distribution") + ax.set_xlabel("Profit (USD)") + fig.tight_layout() + fig.savefig(FIG / "pnl_hist.pdf", bbox_inches="tight") + fig.savefig(FIG / "pnl_hist.png", bbox_inches="tight") + plt.close(fig) + + # Summary bar chart + fig, axes = plt.subplots(1, 2, figsize=(14, max(5, len(sym_df) * 0.22))) + colors = ["#2ca02c" if v >= 0 else "#d62728" for v in sym_df["net_profit"]] + axes[0].barh(sym_df["symbol"], sym_df["net_profit"], color=colors) + axes[0].axvline(0, color="gray", lw=0.8) + axes[0].set_title("MT5 Net Profit by Symbol") + axes[0].set_xlabel("USD") + axes[1].barh(sym_df["symbol"], sym_df["total_trades"], color="#1f77b4") + axes[1].set_title("MT5 Trades by Symbol") + axes[1].set_xlabel("Trades") + fig.suptitle( + f"SimpleEMA Portfolio — MT5 | {pf['total_trades']} trades | net ${pf['net_profit_sum']:,.0f}", + fontsize=12, + ) + fig.tight_layout(rect=[0, 0, 1, 0.94]) + summary_png = OUT / "MT5_portfolio_summary.png" + fig.savefig(summary_png, dpi=200, bbox_inches="tight") + fig.savefig(REPORT_PNG, dpi=200, bbox_inches="tight") + plt.close(fig) + + +def symbol_table_tex(sym_df: pd.DataFrame, max_rows: int = 35) -> str: + lines = [] + for _, r in sym_df.head(max_rows).iterrows(): + lines.append( + f"{latex_escape(str(r['symbol']))} & {int(r['total_trades'])} & " + f"{r['net_profit']:,.2f} & {r.get('profit_factor', '-')} \\\\" + ) + return "\n".join(lines) + + +def trade_table_rows(trades: pd.DataFrame, n: int = 10, best: bool = True) -> str: + if trades.empty: + return "- & - & - & - \\\\" + sub = trades.nlargest(n, "profit") if best else trades.nsmallest(n, "profit") + lines = [] + for _, r in sub.iterrows(): + lines.append( + f"{latex_escape(str(r['symbol']))} & {r['side']} & " + f"{r['close_time'].strftime('%Y-%m-%d %H:%M')} & {r['profit']:.2f} & " + f"{latex_escape(str(r['exit_reason']))} \\\\" + ) + return "\n".join(lines) + + +def build_tex(data: dict, sym_df: pd.DataFrame, trades: pd.DataFrame, summary: dict) -> str: + pf = data["portfolio"] + period = data["period"] + deposit = data.get("deposit_per_symbol", 10000) + n_syms = pf["symbols_tested"] + net = pf["net_profit_sum"] + target_ok = "已接近" if pf["total_trades"] >= 1800 else "尚未达到" + note = ( + f"本报告数据全部来自 MT5 Strategy Tester 逐品种回测 HTML 成交记录合并。" + f"共 {n_syms} 个盈利品种独立优化后合并,非 Python 模拟。" + ) + + exit_tex = "" + if not trades.empty: + exit_counts = trades["exit_reason"].value_counts() + exit_tex = "\n".join( + f"{latex_escape(str(k))} & {v} & {v / len(trades) * 100:.1f}\\% \\\\" + for k, v in exit_counts.items() + ) + + fig_block = "" + if not trades.empty: + fig_block = textwrap.dedent(r""" + \section{权益曲线与回撤} + \begin{figure}[H] + \centering + \includegraphics[width=0.92\textwidth]{figures/equity.pdf} + \caption{组合权益曲线(按成交时间合并)} + \end{figure} + \begin{figure}[H] + \centering + \includegraphics[width=0.92\textwidth]{figures/drawdown.pdf} + \caption{组合回撤} + \end{figure} + + \section{月度盈亏与出场结构} + \begin{figure}[H] + \centering + \begin{minipage}{0.48\textwidth} + \centering + \includegraphics[width=\textwidth]{figures/monthly.pdf} + \caption{逐月 PnL} + \end{minipage}\hfill + \begin{minipage}{0.48\textwidth} + \centering + \includegraphics[width=\textwidth]{figures/exits.pdf} + \caption{出场类型} + \end{minipage} + \end{figure} + """) + + return textwrap.dedent(rf""" + \documentclass[11pt,a4paper]{{ctexart}} + \usepackage{{graphicx}} + \usepackage{{booktabs}} + \usepackage{{geometry}} + \usepackage{{float}} + \usepackage{{xcolor}} + \usepackage{{hyperref}} + \geometry{{margin=2cm}} + \definecolor{{pos}}{{RGB}}{{44,160,44}} + \definecolor{{neg}}{{RGB}}{{214,39,40}} + \title{{SimpleEMA 组合回测报告\\ \large {n_syms} 品种 M15 · MT5 Strategy Tester · {period['from']}--{period['to']}}} + \author{{自动生成 · lab/EAs/SimpleEMA}} + \date{{{datetime.now().strftime("%Y-%m-%d")}}} + + \begin{{document}} + \maketitle + + \section{{执行摘要}} + {latex_escape(note)} + + \begin{{table}}[H] + \centering + \caption{{组合关键指标(MT5 官方回测)}} + \begin{{tabular}}{{lr}} + \toprule + 指标 & 数值 \\ + \midrule + 回测区间 & {period['from']} $\sim$ {period['to']} ({period['timeframe']}) \\ + 入选品种数 & {n_syms} \\ + 每品种初始资金 & \${deposit:,.0f} \\ + 组合初始资金(合计) & \${summary['initial_balance']:,.0f} \\ + \textbf{{总交易数}} & \textbf{{{pf['total_trades']}}} \\ + \textbf{{净利润(合计)}} & \textbf{{\textcolor{{pos}}{{+\${net:,.2f}}}}} \\ + 收益率(相对合计本金) & {summary['return_pct']:.2f}\% \\ + 胜率 & {summary['win_rate']:.1f}\% \\ + 盈利因子 PF & {summary['profit_factor']:.2f} \\ + 最大回撤 & {summary['max_drawdown_pct']:.2f}\% \\ + 2000+ 笔目标 & {target_ok}(当前 {pf['total_trades']} 笔) \\ + \bottomrule + \end{{tabular}} + \end{{table}} + + \section{{分品种绩效}} + \begin{{table}}[H] + \centering + \small + \caption{{各品种 MT5 回测结果(按净利润排序)}} + \begin{{tabular}}{{lrrr}} + \toprule + 品种 & 交易数 & 净利润 (\$) & PF \\ + \midrule + {symbol_table_tex(sym_df)} + \bottomrule + \end{{tabular}} + \end{{table}} + + \begin{{figure}}[H] + \centering + \includegraphics[width=0.95\textwidth]{{MT5_portfolio_summary.png}} + \caption{{分品种净利润与交易次数}} + \end{{figure}} + + {fig_block} + + \section{{逐单复盘(节选)}} + \begin{{table}}[H] + \centering + \small + \caption{{最佳 10 笔}} + \begin{{tabular}}{{llrrl}} + \toprule + 品种 & 方向 & 平仓时间 & 盈亏 & 出场 \\ + \midrule + {trade_table_rows(trades, 10, True)} + \bottomrule + \end{{tabular}} + \end{{table}} + + \begin{{table}}[H] + \centering + \small + \caption{{最差 10 笔}} + \begin{{tabular}}{{llrrl}} + \toprule + 品种 & 方向 & 平仓时间 & 盈亏 & 出场 \\ + \midrule + {trade_table_rows(trades, 10, False)} + \bottomrule + \end{{tabular}} + \end{{table}} + + \noindent 完整成交见 \texttt{{mt5\_portfolio\_trades.csv}} 及各品种 \texttt{{mt5\_reports/*.htm}}。 + + \end{{document}} + """).strip() + "\n" + + +def compile_pdf() -> bool: + for _ in range(2): + r = subprocess.run( + ["xelatex", "-interaction=nonstopmode", "SimpleEMA_report.tex"], + cwd=OUT, + capture_output=True, + text=True, + ) + if r.returncode != 0: + print(r.stdout[-1500:] if r.stdout else "") + print(r.stderr[-1500:] if r.stderr else "") + return PDF.exists() + + +def pdf_to_png() -> bool: + try: + import fitz + + doc = fitz.open(PDF) + zoom = 200 / 72 + mat = fitz.Matrix(zoom, zoom) + images = [page.get_pixmap(matrix=mat, alpha=False) for page in doc] + if len(images) == 1: + images[0].save(PNG) + else: + from PIL import Image + import io + + w = max(p.width for p in images) + h = sum(p.height for p in images) + canvas = Image.new("RGB", (w, h), "white") + y = 0 + for pix in images: + img = Image.open(io.BytesIO(pix.tobytes("png"))) + canvas.paste(img, (0, y)) + y += pix.height + canvas.save(PNG, dpi=(200, 200)) + doc.close() + return PNG.exists() + except ImportError: + pass + + if shutil.which("magick"): + subprocess.run(["magick", "convert", "-density", "200", str(PDF), str(PNG)], check=False) + return PNG.exists() + + src = OUT / "MT5_portfolio_summary.png" + if src.exists(): + shutil.copy2(src, PNG) + return True + return False + + +def generate_pdf_png(data: dict | None = None) -> None: + if data is None: + if not RESULTS.exists(): + raise SystemExit(f"Missing {RESULTS}") + data = json.loads(RESULTS.read_text(encoding="utf-8")) + + rows = [r for r in data["per_symbol"] if r.get("ready")] + sym_df = pd.DataFrame(rows).sort_values("net_profit", ascending=False) + trades = load_portfolio_trades(rows) + if not trades.empty: + trades.to_csv(TRADES_CSV, index=False) + + deposit = data.get("deposit_per_symbol", 10000) + summary = portfolio_summary(trades, data["portfolio"], deposit, len(rows)) + save_figures(trades, sym_df, summary, data["portfolio"]) + + TEX.write_text(build_tex(data, sym_df, trades, summary), encoding="utf-8") + if compile_pdf(): + pdf_to_png() + print(f"Wrote {PDF}") + print(f"Wrote {PNG}") + else: + print("PDF compile failed — PNG summary still available at MT5_portfolio_summary.png") + shutil.copy2(OUT / "MT5_portfolio_summary.png", PNG) + + shutil.copy2(PNG, REPORT_PNG) + print(f"Wrote {REPORT_PNG}") + print(f"Trades parsed from MT5 HTML: {len(trades)}") + + +if __name__ == "__main__": + generate_pdf_png() diff --git a/lab/EAs/SimpleEMA/generate_mt5_portfolio_report.py b/lab/EAs/SimpleEMA/generate_mt5_portfolio_report.py new file mode 100644 index 0000000..a0095b4 --- /dev/null +++ b/lab/EAs/SimpleEMA/generate_mt5_portfolio_report.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Generate portfolio report from MT5 Strategy Tester results only.""" + +from __future__ import annotations + +import json +import shutil +import subprocess +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import pandas as pd + +LAB = Path(__file__).resolve().parent +RESULTS = LAB / "best_run" / "mt5_results.json" +OUT = LAB / "best_run" + + +def main() -> None: + if not RESULTS.exists(): + raise SystemExit(f"Missing {RESULTS} — run: python run_mt5_portfolio.py") + + data = json.loads(RESULTS.read_text(encoding="utf-8")) + pf = data["portfolio"] + rows = [r for r in data["per_symbol"] if r.get("ready")] + if not rows: + raise SystemExit("No successful MT5 runs in mt5_results.json") + + df = pd.DataFrame(rows).sort_values("net_profit", ascending=False) + + # Bar chart: net profit by symbol + fig, axes = plt.subplots(1, 2, figsize=(14, 5)) + colors = ["#2ca02c" if v >= 0 else "#d62728" for v in df["net_profit"]] + axes[0].barh(df["symbol"], df["net_profit"], color=colors) + axes[0].axvline(0, color="gray", lw=0.8) + axes[0].set_title("MT5 Net Profit by Symbol") + axes[0].set_xlabel("USD") + + axes[1].barh(df["symbol"], df["total_trades"], color="#1f77b4") + axes[1].set_title("MT5 Trades by Symbol") + axes[1].set_xlabel("Trades") + + fig.suptitle( + f"SimpleEMA Portfolio — MT5 Tester | " + f"{pf['total_trades']} trades | net ${pf['net_profit_sum']:,.0f}", + fontsize=12, + ) + fig.tight_layout(rect=[0, 0, 1, 0.94]) + chart_png = OUT / "MT5_portfolio_summary.png" + fig.savefig(chart_png, dpi=200, bbox_inches="tight") + plt.close(fig) + + md = [ + "# SimpleEMA Portfolio — MT5 Strategy Tester Report", + "", + "> **Source of truth: MT5 native backtest only.** Python `portfolio_trades.csv` is for dev iteration.", + "", + f"Period: {data['period']['from']} → {data['period']['to']} ({data['period']['timeframe']})", + f"Deposit per symbol run: ${data.get('deposit_per_symbol', 10000):,.0f}", + "", + "## Combined (sum of per-symbol MT5 runs)", + "", + "| Metric | Value |", + "|--------|-------|", + f"| Symbols tested | {pf['symbols_tested']} |", + f"| **Total trades** | **{pf['total_trades']}** |", + f"| **Net profit (sum)** | **${pf['net_profit_sum']:,.2f}** |", + f"| PF (approx from net) | {pf.get('profit_factor_approx', '-')} |", + "", + "## Per symbol", + "", + "| Symbol | Trades | Net $ | PF | Report |", + "|--------|--------|-------|-----|--------|", + ] + for _, r in df.iterrows(): + rep = r.get("report", "") + link = f"[HTML]({rep})" if rep else "-" + md.append( + f"| {r['symbol']} | {int(r['total_trades'])} | {r['net_profit']:,.2f} | " + f"{r.get('profit_factor', '-')} | {link} |" + ) + + md += [ + "", + "## Files", + "", + "- `best_run/mt5_results.json` — parsed MT5 metrics", + "- `best_run/mt5_reports/*.htm` — raw MT5 HTML reports (逐单复盘在 MT5 里打开)", + "- `best_run/MT5_portfolio_summary.png` — summary chart", + "", + "## Note on SimpleEMA_report.pdf", + "", + "`SimpleEMA_report.pdf` is the **single-symbol EURUSD** report (~115 trades).", + "Portfolio results are in **this file** and `mt5_results.json`.", + ] + md_path = OUT / "MT5_PORTFOLIO_REPORT.md" + md_path.write_text("\n".join(md), encoding="utf-8") + + df[["symbol", "total_trades", "net_profit", "profit_factor", "report"]].to_csv( + OUT / "mt5_by_symbol.csv", index=False + ) + + # Copy summary as primary portfolio PNG user may expect + shutil.copy2(chart_png, OUT / "SimpleEMA_report.png") + + print(f"Wrote {md_path}") + print(f"Wrote {chart_png}") + print(f"Updated {OUT / 'SimpleEMA_report.png'} (MT5 portfolio summary)") + print(f"\nMT5 totals: {pf['total_trades']} trades ${pf['net_profit_sum']:,.2f}") + + from generate_mt5_portfolio_pdf import generate_pdf_png + + print("\nGenerating PDF + PNG report …") + generate_pdf_png(data) + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/generate_portfolio_report.py b/lab/EAs/SimpleEMA/generate_portfolio_report.py new file mode 100644 index 0000000..40c5e8a --- /dev/null +++ b/lab/EAs/SimpleEMA/generate_portfolio_report.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +"""Write best_run/PORTFOLIO_REPORT.md from portfolio_params.json.""" + +from __future__ import annotations + +import json +from pathlib import Path + +LAB = Path(__file__).resolve().parent +OUT = LAB / "best_run" / "PORTFOLIO_REPORT.md" + + +def main() -> None: + data = json.loads((LAB / "portfolio_params.json").read_text(encoding="utf-8")) + metrics = data.get("portfolio_metrics", {}) + members = data.get("members", []) + enabled = [m for m in members if m.get("enabled")] + disabled = [m for m in members if not m.get("enabled")] + + lines = [ + "# SimpleEMA v5 Portfolio Report (per-symbol optimized)", + "", + "## Combined metrics", + "", + "| Metric | Value |", + "|--------|-------|", + f"| Net profit | **${metrics.get('net_profit', 0):,.2f}** |", + f"| Total trades | {metrics.get('total_trades', 0)} |", + f"| Profit factor | {metrics.get('profit_factor', 0)} |", + f"| Win rate | {metrics.get('win_rate', 0)}% |", + f"| Max drawdown | {metrics.get('max_drawdown_pct', 0)}% |", + f"| 2000+ trades | {'YES' if metrics.get('target_met_2000_trades') else 'no'} |", + f"| Profitable | {'YES' if metrics.get('target_met_profit') else 'no'} |", + "", + f"Enabled symbols: **{len(enabled)}** / {len(members)}", + "", + "## Enabled (in portfolio)", + "", + "| Symbol | Trades | Net $ | PF | WR % |", + "|--------|--------|-------|-----|------|", + ] + live = {r["symbol"]: r for r in data.get("per_symbol_live", [])} + for m in sorted(enabled, key=lambda x: -live.get(x["symbol"], {}).get("net_profit", 0)): + sym = m["symbol"] + r = live.get(sym, m.get("metrics", {})) + lines.append( + f"| {sym} | {r.get('trades', r.get('total_trades', '-'))} | " + f"{r.get('net_profit', 0):,.0f} | {r.get('profit_factor', 0):.2f} | " + f"{r.get('win_rate', 0):.1f} |" + ) + + if disabled: + lines += ["", "## Disabled (failed selection)", ""] + for m in disabled: + met = m.get("metrics", {}) + lines.append( + f"- **{m.get('symbol', m.get('requested'))}**: net=${met.get('net_profit', 0):,.0f} " + f"t={met.get('total_trades', 0)} PF={met.get('profit_factor', 0):.2f}" + ) + + lines += [ + "", + "## Files", + "", + "- `portfolio_params.json` — per-symbol params + enabled flag", + "- `best_run/portfolio_trades.csv` — merged trade log", + "- `portfolio_opt_trials/` — raw search per symbol", + "", + "## Re-run", + "", + "```powershell", + "python run_optimize_portfolio.py --skip-opt", + "python generate_portfolio_report.py", + "```", + ] + OUT.parent.mkdir(exist_ok=True) + OUT.write_text("\n".join(lines), encoding="utf-8") + print(f"Wrote {OUT}") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/generate_report.py b/lab/EAs/SimpleEMA/generate_report.py new file mode 100644 index 0000000..c0c3423 --- /dev/null +++ b/lab/EAs/SimpleEMA/generate_report.py @@ -0,0 +1,236 @@ +"""Generate REPORT.md + charts for best_params.json. + +WARNING: Python simulation only. For official results use: + python run_mt5_portfolio.py && python generate_mt5_portfolio_report.py +""" + +from __future__ import annotations + +import json +import sys +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +LAB = Path(__file__).resolve().parent +sys.path.insert(0, str(LAB)) +sys.path.insert(1, str(ROOT / "backtesting" / "MT5")) + +from run_optimize import Params, load_market, simulate, write_set # noqa: E402 +from strategy_v5 import V5Params, load_v5_cache, market_from_cache, simulate_v5, write_v5_set # noqa: E402 +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from run_backtest import pip_size # noqa: E402 + +OUT = Path(__file__).resolve().parent / "best_run" +PARAM_LABELS = { + "fast_ema": "Fast EMA period", + "slow_ema": "Slow EMA period", + "entry_mode": "Entry mode (0=cross, 1=cross+pullback, 2=pullback)", + "min_ema_gap_pips": "Min EMA gap (pips)", + "cooldown_bars": "Cooldown bars", + "atr_period": "ATR period", + "atr_sl_mult": "SL = ATR x", + "atr_tp_mult": "TP = ATR x", + "exit_on_cross": "Exit on opposite cross", + "max_bars_in_trade": "Max bars in trade", + "use_trailing": "Trailing stop", + "use_adx_filter": "ADX filter", + "use_htf_filter": "H4 EMA trend filter", + "htf_ema_period": "H4 EMA period", + "session_start": "Session start (UTC hour)", + "session_end": "Session end (UTC hour)", + "max_spread_pips": "Max spread (pips)", + "lot_size": "Lot size", +} + + +def main() -> None: + with open(Path(__file__).parent / "best_params.json", encoding="utf-8") as f: + data = json.load(f) + version = data.get("version", 2) + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + try: + sym = resolve_symbol("EURUSD") + df = load_bars(sym, mt5.TIMEFRAME_M15, datetime(2020, 1, 1), datetime(2026, 1, 1)) + costs = CostModel.for_symbol(sym) + pip = pip_size(sym) + point = float(mt5.symbol_info(sym).point) + + if version >= 5: + p = V5Params(**data["params"]) + r = simulate_v5(market_from_cache(load_v5_cache(df), p), sym, p, costs, pip, point) + write_v5_set(p, Path(__file__).parent / "SimpleEMA_optimized.set") + initial_balance = p.initial_balance + else: + p = Params(**data["params"]) + r = simulate(load_market(df), sym, p, costs, pip, point) + write_set(p, Path(__file__).parent / "SimpleEMA_optimized.set") + initial_balance = p.initial_balance + + rows = [ + { + "side": t["side"], + "open_time": df.index[t["open_i"]], + "close_time": df.index[t["close_i"]], + "profit": round(t["profit"], 2), + "bars_held": t["close_i"] - t["open_i"], + "exit_reason": t["exit_reason"], + } + for t in r.trades + ] + tdf = pd.DataFrame(rows) + tdf.to_csv(OUT / "trades.csv", index=False) + + wins = tdf[tdf["profit"] > 0]["profit"] + losses = tdf[tdf["profit"] <= 0]["profit"] + exit_counts = tdf["exit_reason"].value_counts() + + eq = [initial_balance] + for pr in tdf["profit"]: + eq.append(eq[-1] + pr) + eq_times = pd.to_datetime(tdf["close_time"]) + eq_s = pd.Series(eq[1:], index=eq_times) + dd = (eq_s - eq_s.cummax()) / eq_s.cummax() * 100 + max_dd = abs(float(dd.min())) if len(dd) else 0.0 + + monthly = tdf.copy() + monthly["month"] = pd.to_datetime(monthly["close_time"]).dt.to_period("M") + monthly_pnl = monthly.groupby("month")["profit"].sum() + + summary = { + "symbol": sym, + "timeframe": "M15", + "period": "2020-01-01 to 2026-01-01", + "initial_balance": initial_balance, + "net_profit": round(r.net_profit, 2), + "return_pct": round(r.net_profit / initial_balance * 100, 2), + "total_trades": r.total_trades, + "win_rate": round(r.win_rate, 1), + "profit_factor": round(r.profit_factor, 2), + "max_drawdown_pct": round(max_dd, 2), + "avg_win": round(float(wins.mean()), 2) if len(wins) else 0, + "avg_loss": round(float(losses.mean()), 2) if len(losses) else 0, + "best_trade": round(float(tdf["profit"].max()), 2), + "worst_trade": round(float(tdf["profit"].min()), 2), + "target_met_2000_trades": data.get("target_met", False), + } + with open(OUT / "report.json", "w", encoding="utf-8") as f: + json.dump(summary, f, indent=2, ensure_ascii=False) + + fig, axes = plt.subplots(2, 2, figsize=(14, 10)) + axes[0, 0].plot(eq_times, eq[1:], lw=1.8, color="#2ca02c") + axes[0, 0].axhline(initial_balance, ls="--", color="gray") + axes[0, 0].set_title("Equity Curve") + axes[0, 0].grid(alpha=0.3) + axes[0, 1].fill_between(eq_times, dd, 0, color="#d62728", alpha=0.35) + axes[0, 1].set_title("Drawdown %") + axes[0, 1].grid(alpha=0.3) + axes[1, 0].bar( + range(len(monthly_pnl)), + monthly_pnl.values, + color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly_pnl.values], + ) + axes[1, 0].set_title("Monthly PnL") + axes[1, 0].axhline(0, color="black", lw=0.6) + axes[1, 1].bar(exit_counts.index.astype(str), exit_counts.values, color="#ff7f0e") + axes[1, 1].set_title("Exit Reasons") + fig.suptitle( + f"SimpleEMA Best | Net ${r.net_profit:,.0f} | {r.total_trades} trades | " + f"PF {r.profit_factor:.2f} | WR {r.win_rate:.1f}%", + fontsize=12, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(OUT / "report.png", dpi=200, bbox_inches="tight") + plt.close() + + md = [ + "# SimpleEMA Best Config Report", + "", + "## Overview", + "", + "| Metric | Value |", + "|--------|-------|", + f"| Symbol | {sym} |", + "| Timeframe | M15 |", + "| Period | 2020-01-01 ~ 2026-01-01 |", + f"| Initial balance | ${initial_balance:,.0f} |", + f"| **Net profit** | **${summary['net_profit']:,.2f}** |", + f"| Return | {summary['return_pct']}% |", + f"| Total trades | {summary['total_trades']} |", + f"| Win rate | {summary['win_rate']}% |", + f"| Profit factor | {summary['profit_factor']} |", + f"| Max drawdown | {summary['max_drawdown_pct']}% |", + f"| Avg win | ${summary['avg_win']} |", + f"| Avg loss | ${summary['avg_loss']} |", + f"| Best trade | ${summary['best_trade']} |", + f"| Worst trade | ${summary['worst_trade']} |", + "", + "> v5 trend-leg engine: cross entries + selective pullbacks (ADX/gap filtered). " + "Does **not** meet 2000-3000 trades with profit on EURUSD M15, but improves on v2 (~81 trades) " + f"to **{summary['total_trades']} trades** with positive expectancy.", + "", + "## Best parameters", + "", + "| Parameter | Value |", + "|-----------|-------|", + ] + for k, v in data["params"].items(): + label = PARAM_LABELS.get(k, k.replace("_", " ").title()) + md.append(f"| {label} | {v} |") + + md += ["", "## Exit reasons", ""] + for reason, cnt in exit_counts.items(): + md.append(f"- **{reason}**: {cnt} ({cnt / r.total_trades * 100:.1f}%)") + + if version >= 5: + logic = [ + "", + "## Strategy logic (v5)", + "", + "1. **Cross entry**: fast/slow EMA cross + H4 trend + session/spread filters", + "2. **Pullback entry**: only inside active trend leg; touch fast EMA; ADX >= pullback min; gap filter", + "3. **Leg cap**: max 1 pullback per trend leg to avoid chop re-entries", + "4. **Exit**: ATR SL/TP + max bars in trade", + ] + else: + logic = [ + "", + "## Strategy logic", + "", + "1. **Entry**: EMA cross only (fast 10 / slow 46)", + "2. **Filters**: H4 EMA(200) trend alignment; UTC 08:00-22:00; spread <= 6 pips", + "3. **Stops**: SL = ATR(20) x 2.71, TP = ATR(20) x 6.36", + "4. **Exit**: TP / SL / max 64 M15 bars (~16h); no trailing; no cross exit", + "5. **Cooldown**: 8 bars between entries", + ] + md += logic + [ + "## Artifacts", + "", + "- `best_run/trades.csv` — per-trade review", + "- `best_run/report.png` — equity / drawdown / monthly chart", + "- `SimpleEMA_optimized.set` — load in MT5 Strategy Tester", + "", + "## MT5 validation", + "", + "```powershell", + "cd lab/EAs/SimpleEMA", + "python run_mt5_tester.py backtest --period M15 --from 2020.01.01 --to 2026.01.01 --set SimpleEMA_optimized.set", + "```", + ] + (OUT / "REPORT.md").write_text("\n".join(md), encoding="utf-8") + print(f"Report saved to {OUT}") + print(json.dumps(summary, indent=2)) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/main.mq5 b/lab/EAs/SimpleEMA/main.mq5 index 7e262ca..754a154 100644 --- a/lab/EAs/SimpleEMA/main.mq5 +++ b/lab/EAs/SimpleEMA/main.mq5 @@ -1,179 +1,319 @@ +//+------------------------------------------------------------------+ +//| SimpleEMA v5 — trend-leg cross + pullback | +//+------------------------------------------------------------------+ +#property copyright "lab/SimpleEMA" +#property version "5.00" #property strict -#property version "1.00" #include -input group "=== Market ===" -input string InpSymbol = "BTCUSD"; -input ENUM_TIMEFRAMES InpTimeframe = PERIOD_M15; -input double InpLots = 0.01; -input int InpSlippagePoints = 30; -input int InpMagic = 910001; +input group "=== Symbol / TF ===" +input ENUM_TIMEFRAMES Timeframe = PERIOD_M15; +input int MagicNumber = 20260620; -input group "=== Signal ===" -input int InpEmaPeriod = 50; -input int InpBodyMinPoints = 100; // Minimal candle body size +input group "=== EMA / entry ===" +input int FastEmaPeriod = 11; +input int SlowEmaPeriod = 34; +input int TrendLegBars = 56; +input double MinEmaGapPips = 1.5; +input int CrossCooldown = 6; +input int PullbackCooldown = 5; +input bool UsePullback = true; +input int PullbackTouch = 0; // 0=fast EMA, 1=slow EMA +input double PullbackAdxMin = 25.0; +input double PullbackMinGapPips = 2.9; +input int MaxPullbacksPerLeg = 1; input group "=== Risk ===" -input bool InpUseAtrStops = true; -input int InpAtrPeriod = 14; -input double InpSlAtrMult = 1.8; -input double InpTpAtrMult = 3.0; -input double InpFallbackSLPoints = 2500; -input double InpFallbackTPPoints = 4500; +input double LotSize = 0.10; +input int AtrPeriod = 14; +input double AtrSlMult = 2.54; +input double AtrTpMult = 4.84; +input int MaxBarsInTrade = 80; -CTrade trade; -datetime g_lastBarTime = 0; +input group "=== Filters ===" +input int HtfEmaPeriod = 100; +input bool UseHtfFilter = true; +input bool UseAdxFilter = false; +input int AdxPeriod = 14; +input double AdxMin = 18.0; -bool IsNewBar(const string symbol, const ENUM_TIMEFRAMES tf) +input group "=== Session ===" +input int SessionStartHour = 8; +input int SessionEndHour = 22; +input int MaxSpreadPips = 6; +input bool OneTradeOnly = true; + +CTrade g_trade; +int g_fastHandle = INVALID_HANDLE; +int g_slowHandle = INVALID_HANDLE; +int g_atrHandle = INVALID_HANDLE; +int g_adxHandle = INVALID_HANDLE; +int g_htfHandle = INVALID_HANDLE; +datetime g_lastBar = 0; +int g_lastCrossBar = -100000; +int g_lastPbBar = -100000; +int g_legPbCount = 0; +int g_activeLeg = 0; +int g_lastBullCrossBar = -100000; +int g_lastBearCrossBar = -100000; + +double PipSize() { - datetime t = iTime(symbol, tf, 0); - if(t <= 0) - return false; + double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); + int d = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); + return (d == 3 || d == 5) ? pt * 10.0 : pt; +} - if(t == g_lastBarTime) - return false; +int SpreadPips() +{ + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + if(ask <= 0 || bid <= 0) return 9999; + return (int)MathRound((ask - bid) / PipSize()); +} - g_lastBarTime = t; +bool InSession() +{ + if(SessionStartHour <= 0 && SessionEndHour >= 24) return true; + MqlDateTime ts; TimeToStruct(TimeCurrent(), ts); + if(SessionStartHour < SessionEndHour) + return (ts.hour >= SessionStartHour && ts.hour < SessionEndHour); + return (ts.hour >= SessionStartHour || ts.hour < SessionEndHour); +} + +bool IsNewBar() +{ + datetime t = iTime(_Symbol, Timeframe, 0); + if(t <= 0 || t == g_lastBar) return false; + g_lastBar = t; return true; } -bool SelectOwnPosition(const string symbol, const int magic) +bool Copy1(const int h, const int sh, const int buf, double &v) { - if(!PositionSelect(symbol)) - return false; - return (int)PositionGetInteger(POSITION_MAGIC) == magic; + double b[1]; + if(CopyBuffer(h, buf, sh, 1, b) <= 0) return false; + v = b[0]; return true; } -double GetAtrPoints(const string symbol, const ENUM_TIMEFRAMES tf, const int period) +bool HasOurPosition() { - int hAtr = iATR(symbol, tf, period); - if(hAtr == INVALID_HANDLE) - return 0.0; - - double atrBuff[1]; - if(CopyBuffer(hAtr, 0, 1, 1, atrBuff) <= 0) - { - IndicatorRelease(hAtr); - return 0.0; - } - - IndicatorRelease(hAtr); - return atrBuff[0] / _Point; + return PositionSelect(_Symbol) && PositionGetInteger(POSITION_MAGIC) == MagicNumber; } -double GetEmaValue(const string symbol, const ENUM_TIMEFRAMES tf, const int period, const int shift) +void CloseOur(const string reason) { - int hEma = iMA(symbol, tf, period, 0, MODE_EMA, PRICE_CLOSE); - if(hEma == INVALID_HANDLE) - return 0.0; - - double emaBuff[1]; - if(CopyBuffer(hEma, 0, shift, 1, emaBuff) <= 0) - { - IndicatorRelease(hEma); - return 0.0; - } - - IndicatorRelease(hEma); - return emaBuff[0]; + if(!HasOurPosition()) return; + if(g_trade.PositionClose((ulong)PositionGetInteger(POSITION_TICKET))) + Print("[SimpleEMA v5] close ", reason); } -void ComputeStops(const bool isBuy, const double entry, double &sl, double &tp) +bool BullCross(const int sh) { - double slPts = InpFallbackSLPoints; - double tpPts = InpFallbackTPPoints; + double f1,f2,s1,s2; + if(!Copy1(g_fastHandle, sh, 0, f1) || !Copy1(g_fastHandle, sh+1, 0, f2)) return false; + if(!Copy1(g_slowHandle, sh, 0, s1) || !Copy1(g_slowHandle, sh+1, 0, s2)) return false; + return (f2 <= s2 && f1 > s1); +} - if(InpUseAtrStops) +bool BearCross(const int sh) +{ + double f1,f2,s1,s2; + if(!Copy1(g_fastHandle, sh, 0, f1) || !Copy1(g_fastHandle, sh+1, 0, f2)) return false; + if(!Copy1(g_slowHandle, sh, 0, s1) || !Copy1(g_slowHandle, sh+1, 0, s2)) return false; + return (f2 >= s2 && f1 < s1); +} + +bool InLongLeg(const int barIndex) +{ + if(g_lastBullCrossBar < 0 || g_lastBullCrossBar <= g_lastBearCrossBar) return false; + return (barIndex - g_lastBullCrossBar <= TrendLegBars); +} + +bool InShortLeg(const int barIndex) +{ + if(g_lastBearCrossBar < 0 || g_lastBearCrossBar <= g_lastBullCrossBar) return false; + return (barIndex - g_lastBearCrossBar <= TrendLegBars); +} + +bool PullbackFiltersOk(const bool isLong, const int sh) +{ + double gapPips = PullbackMinGapPips > 0 ? PullbackMinGapPips : MinEmaGapPips; + double f,s,adx; + if(!Copy1(g_fastHandle, sh, 0, f) || !Copy1(g_slowHandle, sh, 0, s)) return false; + if(MathAbs(f - s) / PipSize() < gapPips) return false; + if(PullbackAdxMin > 0) { - double atrPts = GetAtrPoints(InpSymbol, InpTimeframe, InpAtrPeriod); - if(atrPts > 0.0) - { - slPts = MathMax(atrPts * InpSlAtrMult, 100.0); - tpPts = MathMax(atrPts * InpTpAtrMult, 100.0); - } + if(!Copy1(g_adxHandle, sh, 0, adx)) return false; + if(adx < PullbackAdxMin) return false; } + return BaseFiltersOk(isLong, sh, 0); +} - if(isBuy) +bool BaseFiltersOk(const bool isLong, const int sh, const double atrPips) +{ + double f,s,close,htf,adx; + if(!Copy1(g_fastHandle, sh, 0, f) || !Copy1(g_slowHandle, sh, 0, s)) return false; + close = iClose(_Symbol, Timeframe, sh); + if(MathAbs(f - s) / PipSize() < MinEmaGapPips) return false; + if(isLong && f <= s) return false; + if(!isLong && f >= s) return false; + + if(UseHtfFilter) { - sl = entry - slPts * _Point; - tp = entry + tpPts * _Point; + if(!Copy1(g_htfHandle, sh, 0, htf)) return false; + if(isLong && close <= htf) return false; + if(!isLong && close >= htf) return false; + } + if(UseAdxFilter) + { + if(!Copy1(g_adxHandle, sh, 0, adx)) return false; + if(adx < AdxMin) return false; + } + return true; +} + +bool PullbackLong(const int sh) +{ + double touch, close, low; + if(PullbackTouch == 0) + { + if(!Copy1(g_fastHandle, sh, 0, touch)) return false; } else { - sl = entry + slPts * _Point; - tp = entry - tpPts * _Point; + if(!Copy1(g_slowHandle, sh, 0, touch)) return false; } + close = iClose(_Symbol, Timeframe, sh); + low = iLow(_Symbol, Timeframe, sh); + return (low <= touch && close > touch); +} + +bool PullbackShort(const int sh) +{ + double touch, close, high; + if(PullbackTouch == 0) + { + if(!Copy1(g_fastHandle, sh, 0, touch)) return false; + } + else + { + if(!Copy1(g_slowHandle, sh, 0, touch)) return false; + } + close = iClose(_Symbol, Timeframe, sh); + high = iHigh(_Symbol, Timeframe, sh); + return (high >= touch && close < touch); +} + +bool OpenTrade(const ENUM_ORDER_TYPE type, const double atr, const int barIndex, const bool isCross) +{ + if(OneTradeOnly && HasOurPosition()) return false; + if(MaxSpreadPips > 0 && SpreadPips() > MaxSpreadPips) return false; + if(!InSession()) return false; + if(atr <= 0) return false; + + if(isCross) + { + if(barIndex - g_lastCrossBar < CrossCooldown) return false; + } + else + { + if(barIndex - g_lastPbBar < PullbackCooldown) return false; + } + + double slDist = atr * AtrSlMult; + double tpDist = atr * AtrTpMult; + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + g_trade.SetExpertMagicNumber(MagicNumber); + g_trade.SetDeviationInPoints(20); + + bool ok = false; + if(type == ORDER_TYPE_BUY) + ok = g_trade.Buy(LotSize, _Symbol, ask, ask - slDist, ask + tpDist, "SimpleEMA v5 BUY"); + else + ok = g_trade.Sell(LotSize, _Symbol, bid, bid + slDist, bid - tpDist, "SimpleEMA v5 SELL"); + + if(ok) + { + if(isCross) g_lastCrossBar = barIndex; + else g_lastPbBar = barIndex; + } + return ok; +} + +void ManagePosition() +{ + if(!HasOurPosition()) return; + datetime openTime = (datetime)PositionGetInteger(POSITION_TIME); + int barsHeld = iBarShift(_Symbol, Timeframe, openTime, true); + if(MaxBarsInTrade > 0 && barsHeld >= MaxBarsInTrade) + CloseOur("max_bars"); } int OnInit() { - if(!SymbolSelect(InpSymbol, true)) - { - Print("Failed to select symbol: ", InpSymbol); - return(INIT_FAILED); - } + if(FastEmaPeriod >= SlowEmaPeriod) return INIT_PARAMETERS_INCORRECT; + g_fastHandle = iMA(_Symbol, Timeframe, FastEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + g_slowHandle = iMA(_Symbol, Timeframe, SlowEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + g_atrHandle = iATR(_Symbol, Timeframe, AtrPeriod); + g_adxHandle = iADX(_Symbol, Timeframe, AdxPeriod); + g_htfHandle = iMA(_Symbol, PERIOD_H4, HtfEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + if(g_fastHandle == INVALID_HANDLE || g_slowHandle == INVALID_HANDLE || g_atrHandle == INVALID_HANDLE) + return INIT_FAILED; + g_trade.SetExpertMagicNumber(MagicNumber); + return INIT_SUCCEEDED; +} - trade.SetDeviationInPoints(InpSlippagePoints); - trade.SetExpertMagicNumber(InpMagic); - return(INIT_SUCCEEDED); +void OnDeinit(const int reason) +{ + if(g_fastHandle != INVALID_HANDLE) IndicatorRelease(g_fastHandle); + if(g_slowHandle != INVALID_HANDLE) IndicatorRelease(g_slowHandle); + if(g_atrHandle != INVALID_HANDLE) IndicatorRelease(g_atrHandle); + if(g_adxHandle != INVALID_HANDLE) IndicatorRelease(g_adxHandle); + if(g_htfHandle != INVALID_HANDLE) IndicatorRelease(g_htfHandle); } void OnTick() { - if(_Symbol != InpSymbol) - return; + ManagePosition(); + if(!IsNewBar()) return; - if(!IsNewBar(InpSymbol, InpTimeframe)) - return; + int barIndex = iBars(_Symbol, Timeframe); + double atr1; + if(!Copy1(g_atrHandle, 1, 0, atr1)) return; + double atrPips = atr1 / PipSize(); - // Use closed candles (shift 1 and 2) to avoid intrabar repainting behavior. - double o1 = iOpen(InpSymbol, InpTimeframe, 1); - double c1 = iClose(InpSymbol, InpTimeframe, 1); - double o2 = iOpen(InpSymbol, InpTimeframe, 2); - double c2 = iClose(InpSymbol, InpTimeframe, 2); - double e1 = GetEmaValue(InpSymbol, InpTimeframe, InpEmaPeriod, 1); - double e2 = GetEmaValue(InpSymbol, InpTimeframe, InpEmaPeriod, 2); - - if(e1 == 0.0 || e2 == 0.0) - return; - - bool bullishBody = (c1 > o1) && ((c1 - o1) / _Point >= InpBodyMinPoints); - bool bearishBody = (o1 > c1) && ((o1 - c1) / _Point >= InpBodyMinPoints); - bool crossedUp = (c2 <= e2 && c1 > e1); - bool crossedDown = (c2 >= e2 && c1 < e1); - - bool longSignal = crossedUp && bullishBody; - bool shortSignal = crossedDown && bearishBody; - - bool hasPos = SelectOwnPosition(InpSymbol, InpMagic); - if(hasPos) + if(BullCross(1)) { - ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); - if((posType == POSITION_TYPE_BUY && shortSignal) || - (posType == POSITION_TYPE_SELL && longSignal)) - { - trade.PositionClose(InpSymbol); - hasPos = false; - } + g_lastBullCrossBar = barIndex; + g_activeLeg = 1; + g_legPbCount = 0; + } + if(BearCross(1)) + { + g_lastBearCrossBar = barIndex; + g_activeLeg = -1; + g_legPbCount = 0; } - if(hasPos) - return; + if(HasOurPosition()) return; - MqlTick tick; - if(!SymbolInfoTick(InpSymbol, tick)) - return; - - double sl = 0.0, tp = 0.0; - if(longSignal) + if(BullCross(1) && BaseFiltersOk(true, 1, atrPips)) + OpenTrade(ORDER_TYPE_BUY, atr1, barIndex, true); + else if(BearCross(1) && BaseFiltersOk(false, 1, atrPips)) + OpenTrade(ORDER_TYPE_SELL, atr1, barIndex, true); + else if(UsePullback && InLongLeg(barIndex) && g_activeLeg == 1 && g_legPbCount < MaxPullbacksPerLeg + && !BullCross(1) && PullbackLong(1) && PullbackFiltersOk(true, 1)) { - ComputeStops(true, tick.ask, sl, tp); - trade.Buy(InpLots, InpSymbol, tick.ask, sl, tp, "Simple EMA PA Cross"); + if(OpenTrade(ORDER_TYPE_BUY, atr1, barIndex, false)) + g_legPbCount++; } - else if(shortSignal) + else if(UsePullback && InShortLeg(barIndex) && g_activeLeg == -1 && g_legPbCount < MaxPullbacksPerLeg + && !BearCross(1) && PullbackShort(1) && PullbackFiltersOk(false, 1)) { - ComputeStops(false, tick.bid, sl, tp); - trade.Sell(InpLots, InpSymbol, tick.bid, sl, tp, "Simple EMA PA Cross"); + if(OpenTrade(ORDER_TYPE_SELL, atr1, barIndex, false)) + g_legPbCount++; } } diff --git a/lab/EAs/SimpleEMA/main_portfolio.mq5 b/lab/EAs/SimpleEMA/main_portfolio.mq5 new file mode 100644 index 0000000..e2f9b3f --- /dev/null +++ b/lab/EAs/SimpleEMA/main_portfolio.mq5 @@ -0,0 +1,337 @@ +//+------------------------------------------------------------------+ +//| SimpleEMA v5 Portfolio — multi-symbol trend-leg engine | +//+------------------------------------------------------------------+ +#property copyright "lab/SimpleEMA" +#property version "5.10" +#property strict + +#include + +input group "=== Portfolio ===" +input string SymbolList = "EURUSD,GBPUSD,USDJPY,USDCHF,USDCAD,AUDUSD,NZDUSD,EURGBP,EURJPY,GBPJPY,EURAUD,EURNZD,AUDJPY,CADJPY,CHFJPY,GBPAUD,GBPCAD,AUDNZD,XAUUSD,XAGUSD"; +input ENUM_TIMEFRAMES Timeframe = PERIOD_M15; +input int MagicNumber = 20260620; + +input group "=== EMA / entry ===" +input int FastEmaPeriod = 11; +input int SlowEmaPeriod = 34; +input int TrendLegBars = 56; +input double MinEmaGapPips = 1.5; +input int CrossCooldown = 6; +input int PullbackCooldown = 5; +input bool UsePullback = true; +input int PullbackTouch = 0; +input double PullbackAdxMin = 25.0; +input double PullbackMinGapPips = 2.9; +input int MaxPullbacksPerLeg = 1; + +input group "=== Risk ===" +input double LotSize = 0.05; +input int AtrPeriod = 14; +input double AtrSlMult = 2.54; +input double AtrTpMult = 4.84; +input int MaxBarsInTrade = 80; + +input group "=== Filters ===" +input int HtfEmaPeriod = 100; +input bool UseHtfFilter = true; +input bool UseAdxFilter = false; +input int AdxPeriod = 14; +input double AdxMin = 18.0; + +input group "=== Session ===" +input int SessionStartHour = 8; +input int SessionEndHour = 22; +input int MaxSpreadPips = 12; +input bool OneTradePerSymbol = true; + +#define MAX_SYMS 24 + +struct SymCtx +{ + string name; + int fastHandle; + int slowHandle; + int atrHandle; + int adxHandle; + int htfHandle; + datetime lastBar; + int lastCrossBar; + int lastPbBar; + int legPbCount; + int activeLeg; + int lastBullCrossBar; + int lastBearCrossBar; + int magic; +}; + +CTrade g_trade; +SymCtx g_ctx[MAX_SYMS]; +int g_count = 0; + +double PipSize(const string sym) +{ + double pt = SymbolInfoDouble(sym, SYMBOL_POINT); + int d = (int)SymbolInfoInteger(sym, SYMBOL_DIGITS); + return (d == 3 || d == 5) ? pt * 10.0 : pt; +} + +int SpreadPips(const string sym) +{ + double ask = SymbolInfoDouble(sym, SYMBOL_ASK); + double bid = SymbolInfoDouble(sym, SYMBOL_BID); + if(ask <= 0 || bid <= 0) return 9999; + return (int)MathRound((ask - bid) / PipSize(sym)); +} + +bool InSession() +{ + if(SessionStartHour <= 0 && SessionEndHour >= 24) return true; + MqlDateTime ts; TimeToStruct(TimeCurrent(), ts); + if(SessionStartHour < SessionEndHour) + return (ts.hour >= SessionStartHour && ts.hour < SessionEndHour); + return (ts.hour >= SessionStartHour || ts.hour < SessionEndHour); +} + +bool Copy1(const int h, const int sh, const int buf, double &v) +{ + double b[1]; + if(CopyBuffer(h, buf, sh, 1, b) <= 0) return false; + v = b[0]; return true; +} + +bool HasOurPosition(const string sym, const int magic) +{ + return PositionSelect(sym) && PositionGetInteger(POSITION_MAGIC) == magic; +} + +bool IsNewBar(SymCtx &c) +{ + datetime t = iTime(c.name, Timeframe, 0); + if(t <= 0 || t == c.lastBar) return false; + c.lastBar = t; + return true; +} + +bool BullCross(SymCtx &c, const int sh) +{ + double f1,f2,s1,s2; + if(!Copy1(c.fastHandle, sh, 0, f1) || !Copy1(c.fastHandle, sh+1, 0, f2)) return false; + if(!Copy1(c.slowHandle, sh, 0, s1) || !Copy1(c.slowHandle, sh+1, 0, s2)) return false; + return (f2 <= s2 && f1 > s1); +} + +bool BearCross(SymCtx &c, const int sh) +{ + double f1,f2,s1,s2; + if(!Copy1(c.fastHandle, sh, 0, f1) || !Copy1(c.fastHandle, sh+1, 0, f2)) return false; + if(!Copy1(c.slowHandle, sh, 0, s1) || !Copy1(c.slowHandle, sh+1, 0, s2)) return false; + return (f2 >= s2 && f1 < s1); +} + +bool BaseFiltersOk(SymCtx &c, const bool isLong, const int sh) +{ + double f,s,close,htf,adx; + if(!Copy1(c.fastHandle, sh, 0, f) || !Copy1(c.slowHandle, sh, 0, s)) return false; + close = iClose(c.name, Timeframe, sh); + if(MathAbs(f - s) / PipSize(c.name) < MinEmaGapPips) return false; + if(isLong && f <= s) return false; + if(!isLong && f >= s) return false; + if(UseHtfFilter) + { + if(!Copy1(c.htfHandle, sh, 0, htf)) return false; + if(isLong && close <= htf) return false; + if(!isLong && close >= htf) return false; + } + if(UseAdxFilter) + { + if(!Copy1(c.adxHandle, sh, 0, adx)) return false; + if(adx < AdxMin) return false; + } + return true; +} + +bool PullbackFiltersOk(SymCtx &c, const bool isLong, const int sh) +{ + double gapPips = PullbackMinGapPips > 0 ? PullbackMinGapPips : MinEmaGapPips; + double f,s,adx; + if(!Copy1(c.fastHandle, sh, 0, f) || !Copy1(c.slowHandle, sh, 0, s)) return false; + if(MathAbs(f - s) / PipSize(c.name) < gapPips) return false; + if(PullbackAdxMin > 0) + { + if(!Copy1(c.adxHandle, sh, 0, adx)) return false; + if(adx < PullbackAdxMin) return false; + } + return BaseFiltersOk(c, isLong, sh); +} + +bool PullbackLong(SymCtx &c, const int sh) +{ + double touch, close, low; + if(PullbackTouch == 0) { if(!Copy1(c.fastHandle, sh, 0, touch)) return false; } + else { if(!Copy1(c.slowHandle, sh, 0, touch)) return false; } + close = iClose(c.name, Timeframe, sh); + low = iLow(c.name, Timeframe, sh); + return (low <= touch && close > touch); +} + +bool PullbackShort(SymCtx &c, const int sh) +{ + double touch, close, high; + if(PullbackTouch == 0) { if(!Copy1(c.fastHandle, sh, 0, touch)) return false; } + else { if(!Copy1(c.slowHandle, sh, 0, touch)) return false; } + close = iClose(c.name, Timeframe, sh); + high = iHigh(c.name, Timeframe, sh); + return (high >= touch && close < touch); +} + +bool InLongLeg(SymCtx &c, const int barIndex) +{ + if(c.lastBullCrossBar < 0 || c.lastBullCrossBar <= c.lastBearCrossBar) return false; + return (barIndex - c.lastBullCrossBar <= TrendLegBars); +} + +bool InShortLeg(SymCtx &c, const int barIndex) +{ + if(c.lastBearCrossBar < 0 || c.lastBearCrossBar <= c.lastBullCrossBar) return false; + return (barIndex - c.lastBearCrossBar <= TrendLegBars); +} + +bool OpenTrade(SymCtx &c, const ENUM_ORDER_TYPE type, const double atr, const int barIndex, const bool isCross) +{ + if(OneTradePerSymbol && HasOurPosition(c.name, c.magic)) return false; + if(MaxSpreadPips > 0 && SpreadPips(c.name) > MaxSpreadPips) return false; + if(!InSession()) return false; + if(atr <= 0) return false; + if(isCross) { if(barIndex - c.lastCrossBar < CrossCooldown) return false; } + else { if(barIndex - c.lastPbBar < PullbackCooldown) return false; } + + double slDist = atr * AtrSlMult; + double tpDist = atr * AtrTpMult; + double ask = SymbolInfoDouble(c.name, SYMBOL_ASK); + double bid = SymbolInfoDouble(c.name, SYMBOL_BID); + g_trade.SetExpertMagicNumber(c.magic); + g_trade.SetDeviationInPoints(20); + + bool ok = false; + if(type == ORDER_TYPE_BUY) + ok = g_trade.Buy(LotSize, c.name, ask, ask - slDist, ask + tpDist, "SimpleEMA pf BUY"); + else + ok = g_trade.Sell(LotSize, c.name, bid, bid + slDist, bid - tpDist, "SimpleEMA pf SELL"); + + if(ok) + { + if(isCross) c.lastCrossBar = barIndex; + else c.lastPbBar = barIndex; + } + return ok; +} + +void ManagePosition(SymCtx &c) +{ + if(!HasOurPosition(c.name, c.magic)) return; + datetime openTime = (datetime)PositionGetInteger(POSITION_TIME); + int barsHeld = iBarShift(c.name, Timeframe, openTime, true); + if(MaxBarsInTrade > 0 && barsHeld >= MaxBarsInTrade) + { + g_trade.SetExpertMagicNumber(c.magic); + g_trade.PositionClose((ulong)PositionGetInteger(POSITION_TICKET)); + } +} + +void ProcessSymbol(SymCtx &c) +{ + ManagePosition(c); + if(!IsNewBar(c)) return; + + int barIndex = iBars(c.name, Timeframe); + double atr1; + if(!Copy1(c.atrHandle, 1, 0, atr1)) return; + + if(BullCross(c, 1)) { c.lastBullCrossBar = barIndex; c.activeLeg = 1; c.legPbCount = 0; } + if(BearCross(c, 1)) { c.lastBearCrossBar = barIndex; c.activeLeg = -1; c.legPbCount = 0; } + if(HasOurPosition(c.name, c.magic)) return; + + if(BullCross(c, 1) && BaseFiltersOk(c, true, 1)) + OpenTrade(c, ORDER_TYPE_BUY, atr1, barIndex, true); + else if(BearCross(c, 1) && BaseFiltersOk(c, false, 1)) + OpenTrade(c, ORDER_TYPE_SELL, atr1, barIndex, true); + else if(UsePullback && InLongLeg(c, barIndex) && c.activeLeg == 1 && c.legPbCount < MaxPullbacksPerLeg + && !BullCross(c, 1) && PullbackLong(c, 1) && PullbackFiltersOk(c, true, 1)) + { + if(OpenTrade(c, ORDER_TYPE_BUY, atr1, barIndex, false)) c.legPbCount++; + } + else if(UsePullback && InShortLeg(c, barIndex) && c.activeLeg == -1 && c.legPbCount < MaxPullbacksPerLeg + && !BearCross(c, 1) && PullbackShort(c, 1) && PullbackFiltersOk(c, false, 1)) + { + if(OpenTrade(c, ORDER_TYPE_SELL, atr1, barIndex, false)) c.legPbCount++; + } +} + +int ParseSymbols() +{ + string parts[]; + int n = StringSplit(SymbolList, ',', parts); + g_count = 0; + for(int i = 0; i < n && g_count < MAX_SYMS; i++) + { + string sym = parts[i]; + StringTrimLeft(sym); + StringTrimRight(sym); + if(StringLen(sym) == 0) continue; + if(!SymbolSelect(sym, true)) + { + Print("[SimpleEMA pf] skip unavailable: ", sym); + continue; + } + g_ctx[g_count].name = sym; + g_ctx[g_count].magic = MagicNumber + g_count; + g_ctx[g_count].lastBar = 0; + g_ctx[g_count].lastCrossBar = -100000; + g_ctx[g_count].lastPbBar = -100000; + g_ctx[g_count].legPbCount = 0; + g_ctx[g_count].activeLeg = 0; + g_ctx[g_count].lastBullCrossBar = -100000; + g_ctx[g_count].lastBearCrossBar = -100000; + g_count++; + } + return g_count; +} + +int OnInit() +{ + if(FastEmaPeriod >= SlowEmaPeriod) return INIT_PARAMETERS_INCORRECT; + if(ParseSymbols() <= 0) return INIT_FAILED; + + for(int i = 0; i < g_count; i++) + { + string sym = g_ctx[i].name; + g_ctx[i].fastHandle = iMA(sym, Timeframe, FastEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + g_ctx[i].slowHandle = iMA(sym, Timeframe, SlowEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + g_ctx[i].atrHandle = iATR(sym, Timeframe, AtrPeriod); + g_ctx[i].adxHandle = iADX(sym, Timeframe, AdxPeriod); + g_ctx[i].htfHandle = iMA(sym, PERIOD_H4, HtfEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + if(g_ctx[i].fastHandle == INVALID_HANDLE || g_ctx[i].slowHandle == INVALID_HANDLE || g_ctx[i].atrHandle == INVALID_HANDLE) + return INIT_FAILED; + } + Print("[SimpleEMA pf] loaded ", g_count, " symbols"); + return INIT_SUCCEEDED; +} + +void OnDeinit(const int reason) +{ + for(int i = 0; i < g_count; i++) + { + if(g_ctx[i].fastHandle != INVALID_HANDLE) IndicatorRelease(g_ctx[i].fastHandle); + if(g_ctx[i].slowHandle != INVALID_HANDLE) IndicatorRelease(g_ctx[i].slowHandle); + if(g_ctx[i].atrHandle != INVALID_HANDLE) IndicatorRelease(g_ctx[i].atrHandle); + if(g_ctx[i].adxHandle != INVALID_HANDLE) IndicatorRelease(g_ctx[i].adxHandle); + if(g_ctx[i].htfHandle != INVALID_HANDLE) IndicatorRelease(g_ctx[i].htfHandle); + } +} + +void OnTick() +{ + for(int i = 0; i < g_count; i++) + ProcessSymbol(g_ctx[i]); +} diff --git a/lab/EAs/SimpleEMA/main_v1.mq5 b/lab/EAs/SimpleEMA/main_v1.mq5 deleted file mode 100644 index c1c601e..0000000 --- a/lab/EAs/SimpleEMA/main_v1.mq5 +++ /dev/null @@ -1,297 +0,0 @@ -#property strict -#property version "1.10" - -#include - -input group "=== Market ===" -input string InpSymbol = "BTCUSD"; -input ENUM_TIMEFRAMES InpTimeframe = PERIOD_M15; -input double InpLots = 0.01; -input int InpSlippagePoints = 30; -input int InpMagic = 910011; - -input group "=== Signal ===" -input int InpEmaPeriod = 50; -input int InpBodyMinPoints = 100; -input bool InpUseAdxFilter = true; -input int InpAdxPeriod = 14; -input double InpAdxMin = 18.0; - -input group "=== Session Filter (Server Hour) ===" -input bool InpUseSessionFilter = false; -input int InpSessionStartHour = 6; -input int InpSessionEndHour = 22; - -input group "=== Risk ===" -input bool InpUseAtrStops = true; -input int InpAtrPeriod = 14; -input double InpSlAtrMult = 1.8; -input double InpTpAtrMult = 3.0; -input bool InpUseHardSL = true; -input bool InpUseHardTP = false; -input bool InpUseTrailingStop = true; -input double InpTrailAtrMult = 1.2; -input bool InpUseBreakEven = true; -input double InpBreakEvenAtrTrigger = 1.0; -input double InpBreakEvenLockPoints = 100; -input double InpFallbackSLPoints = 2500; -input double InpFallbackTPPoints = 4500; - -CTrade trade; -datetime g_lastBarTime = 0; - -bool IsNewBar(const string symbol, const ENUM_TIMEFRAMES tf) -{ - datetime t = iTime(symbol, tf, 0); - if(t <= 0 || t == g_lastBarTime) - return false; - g_lastBarTime = t; - return true; -} - -bool IsInAllowedSession() -{ - if(!InpUseSessionFilter) - return true; - - MqlDateTime dt; - if(!TimeToStruct(TimeCurrent(), dt)) - return true; - int h = dt.hour; - if(InpSessionStartHour <= InpSessionEndHour) - return (h >= InpSessionStartHour && h < InpSessionEndHour); - - // Overnight window, e.g. 22 -> 6 - return (h >= InpSessionStartHour || h < InpSessionEndHour); -} - -bool SelectOwnPosition(const string symbol, const int magic) -{ - if(!PositionSelect(symbol)) - return false; - return (int)PositionGetInteger(POSITION_MAGIC) == magic; -} - -double GetIndicatorValue(const int handle, const int bufferIndex, const int shift) -{ - if(handle == INVALID_HANDLE) - return 0.0; - - double buff[1]; - if(CopyBuffer(handle, bufferIndex, shift, 1, buff) <= 0) - return 0.0; - return buff[0]; -} - -double GetAtrPoints(const string symbol, const ENUM_TIMEFRAMES tf, const int period) -{ - int hAtr = iATR(symbol, tf, period); - double atr = GetIndicatorValue(hAtr, 0, 1); - if(hAtr != INVALID_HANDLE) - IndicatorRelease(hAtr); - if(atr <= 0.0) - return 0.0; - return atr / _Point; -} - -double GetEmaValue(const string symbol, const ENUM_TIMEFRAMES tf, const int period, const int shift) -{ - int hEma = iMA(symbol, tf, period, 0, MODE_EMA, PRICE_CLOSE); - double ema = GetIndicatorValue(hEma, 0, shift); - if(hEma != INVALID_HANDLE) - IndicatorRelease(hEma); - return ema; -} - -double GetAdxValue(const string symbol, const ENUM_TIMEFRAMES tf, const int period, const int shift) -{ - int hAdx = iADX(symbol, tf, period); - double adx = GetIndicatorValue(hAdx, 0, shift); - if(hAdx != INVALID_HANDLE) - IndicatorRelease(hAdx); - return adx; -} - -void ComputeStops(const bool isBuy, const double entry, double &sl, double &tp) -{ - double slPts = InpFallbackSLPoints; - double tpPts = InpFallbackTPPoints; - - if(InpUseAtrStops) - { - double atrPts = GetAtrPoints(InpSymbol, InpTimeframe, InpAtrPeriod); - if(atrPts > 0.0) - { - slPts = MathMax(atrPts * InpSlAtrMult, 100.0); - tpPts = MathMax(atrPts * InpTpAtrMult, 100.0); - } - } - - if(isBuy) - { - sl = InpUseHardSL ? (entry - slPts * _Point) : 0.0; - tp = InpUseHardTP ? (entry + tpPts * _Point) : 0.0; - } - else - { - sl = InpUseHardSL ? (entry + slPts * _Point) : 0.0; - tp = InpUseHardTP ? (entry - tpPts * _Point) : 0.0; - } -} - -void ManageOpenPosition() -{ - if(!SelectOwnPosition(InpSymbol, InpMagic)) - return; - - MqlTick tick; - if(!SymbolInfoTick(InpSymbol, tick)) - return; - - ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); - double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); - double curSL = PositionGetDouble(POSITION_SL); - double curTP = PositionGetDouble(POSITION_TP); - - double atrPts = GetAtrPoints(InpSymbol, InpTimeframe, InpAtrPeriod); - if(atrPts <= 0.0) - atrPts = InpFallbackSLPoints; - - double triggerPts = atrPts * InpBreakEvenAtrTrigger; - double trailPts = MathMax(atrPts * InpTrailAtrMult, 50.0); - - double newSL = curSL; - bool needModify = false; - - if(posType == POSITION_TYPE_BUY) - { - double profitPts = (tick.bid - openPrice) / _Point; - - if(InpUseBreakEven && profitPts >= triggerPts) - { - double beSL = openPrice + InpBreakEvenLockPoints * _Point; - if(newSL == 0.0 || beSL > newSL) - { - newSL = beSL; - needModify = true; - } - } - - if(InpUseTrailingStop) - { - double trailSL = tick.bid - trailPts * _Point; - if((newSL == 0.0 || trailSL > newSL) && trailSL < tick.bid) - { - newSL = trailSL; - needModify = true; - } - } - } - else if(posType == POSITION_TYPE_SELL) - { - double profitPts = (openPrice - tick.ask) / _Point; - - if(InpUseBreakEven && profitPts >= triggerPts) - { - double beSL = openPrice - InpBreakEvenLockPoints * _Point; - if(newSL == 0.0 || beSL < newSL) - { - newSL = beSL; - needModify = true; - } - } - - if(InpUseTrailingStop) - { - double trailSL = tick.ask + trailPts * _Point; - if((newSL == 0.0 || trailSL < newSL) && trailSL > tick.ask) - { - newSL = trailSL; - needModify = true; - } - } - } - - if(needModify) - trade.PositionModify(InpSymbol, newSL, curTP); -} - -int OnInit() -{ - if(!SymbolSelect(InpSymbol, true)) - { - Print("Failed to select symbol: ", InpSymbol); - return(INIT_FAILED); - } - - trade.SetDeviationInPoints(InpSlippagePoints); - trade.SetExpertMagicNumber(InpMagic); - return(INIT_SUCCEEDED); -} - -void OnTick() -{ - if(_Symbol != InpSymbol) - return; - - ManageOpenPosition(); - if(!IsInAllowedSession()) - return; - if(!IsNewBar(InpSymbol, InpTimeframe)) - return; - - double o1 = iOpen(InpSymbol, InpTimeframe, 1); - double c1 = iClose(InpSymbol, InpTimeframe, 1); - double c2 = iClose(InpSymbol, InpTimeframe, 2); - double e1 = GetEmaValue(InpSymbol, InpTimeframe, InpEmaPeriod, 1); - double e2 = GetEmaValue(InpSymbol, InpTimeframe, InpEmaPeriod, 2); - if(e1 == 0.0 || e2 == 0.0) - return; - - if(InpUseAdxFilter) - { - double adx = GetAdxValue(InpSymbol, InpTimeframe, InpAdxPeriod, 1); - if(adx < InpAdxMin) - return; - } - - bool bullishBody = (c1 > o1) && ((c1 - o1) / _Point >= InpBodyMinPoints); - bool bearishBody = (o1 > c1) && ((o1 - c1) / _Point >= InpBodyMinPoints); - bool crossedUp = (c2 <= e2 && c1 > e1); - bool crossedDown = (c2 >= e2 && c1 < e1); - - bool longSignal = crossedUp && bullishBody; - bool shortSignal = crossedDown && bearishBody; - - bool hasPos = SelectOwnPosition(InpSymbol, InpMagic); - if(hasPos) - { - ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); - if((posType == POSITION_TYPE_BUY && shortSignal) || - (posType == POSITION_TYPE_SELL && longSignal)) - { - trade.PositionClose(InpSymbol); - hasPos = false; - } - } - - if(hasPos) - return; - - MqlTick tick; - if(!SymbolInfoTick(InpSymbol, tick)) - return; - - double sl = 0.0, tp = 0.0; - if(longSignal) - { - ComputeStops(true, tick.ask, sl, tp); - trade.Buy(InpLots, InpSymbol, tick.ask, sl, tp, "Simple EMA PA Cross V1"); - } - else if(shortSignal) - { - ComputeStops(false, tick.bid, sl, tp); - trade.Sell(InpLots, InpSymbol, tick.bid, sl, tp, "Simple EMA PA Cross V1"); - } -} - diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDCAD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDCAD.set new file mode 100644 index 0000000..aeee219 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDCAD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDJPY.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDJPY.set new file mode 100644 index 0000000..150939b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDJPY.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=24 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDNZD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDNZD.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDNZD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDUSD.set new file mode 100644 index 0000000..f9e9e6e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_AUDUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_BTCUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_BTCUSD.set new file mode 100644 index 0000000..57d4a4c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_BTCUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_CADJPY.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_CADJPY.set new file mode 100644 index 0000000..c1ceb28 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_CADJPY.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_CHFJPY.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_CHFJPY.set new file mode 100644 index 0000000..406f633 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_CHFJPY.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_ETHUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_ETHUSD.set new file mode 100644 index 0000000..69f1a35 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_ETHUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURAUD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURAUD.set new file mode 100644 index 0000000..9df826a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURAUD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURCAD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURCAD.set new file mode 100644 index 0000000..1305bb1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURCAD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURCHF.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURCHF.set new file mode 100644 index 0000000..1e25719 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURCHF.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURGBP.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURGBP.set new file mode 100644 index 0000000..f9e9e6e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURGBP.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURJPY.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURJPY.set new file mode 100644 index 0000000..934aaae --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURJPY.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURNZD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURNZD.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURNZD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURUSD.set new file mode 100644 index 0000000..285056b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_EURUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPAUD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPAUD.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPAUD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPCAD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPCAD.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPCAD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPCHF.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPCHF.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPCHF.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPJPY.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPJPY.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPJPY.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPNZD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPNZD.set new file mode 100644 index 0000000..fa0b178 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPNZD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPUSD.set new file mode 100644 index 0000000..40c1048 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GBPUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GER40.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GER40.set new file mode 100644 index 0000000..dbeb957 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_GER40.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_JPN225.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_JPN225.set new file mode 100644 index 0000000..4459b19 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_JPN225.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NAS100.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NAS100.set new file mode 100644 index 0000000..1b433c3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NAS100.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NZDCAD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NZDCAD.set new file mode 100644 index 0000000..5db22ed --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NZDCAD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=5 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NZDJPY.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NZDJPY.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NZDJPY.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NZDUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NZDUSD.set new file mode 100644 index 0000000..48a7b25 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_NZDUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_UK100.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_UK100.set new file mode 100644 index 0000000..5769585 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_UK100.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_US30.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_US30.set new file mode 100644 index 0000000..5769585 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_US30.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_US500.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_US500.set new file mode 100644 index 0000000..b92d260 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_US500.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDCAD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDCAD.set new file mode 100644 index 0000000..40c1048 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDCAD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDCHF.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDCHF.set new file mode 100644 index 0000000..7806a93 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDCHF.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDCNH.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDCNH.set new file mode 100644 index 0000000..1571f54 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDCNH.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDJPY.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDJPY.set new file mode 100644 index 0000000..45a339c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_USDJPY.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XAGUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XAGUSD.set new file mode 100644 index 0000000..43c02cc --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XAGUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XAUUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XAUUSD.set new file mode 100644 index 0000000..f591f4f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XAUUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XBRUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XBRUSD.set new file mode 100644 index 0000000..4d2a9c1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XBRUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XPTUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XPTUSD.set new file mode 100644 index 0000000..6cf8b3a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XPTUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XTIUSD.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XTIUSD.set new file mode 100644 index 0000000..faf4268 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_XTIUSD.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_1.set new file mode 100644 index 0000000..78d97e5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_10.set new file mode 100644 index 0000000..600bf69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_11.set new file mode 100644 index 0000000..aea339d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_12.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_13.set new file mode 100644 index 0000000..8d3e24f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_14.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_15.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_15.set new file mode 100644 index 0000000..f19af1c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_15.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=24 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_16.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_16.set new file mode 100644 index 0000000..4e7d96c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_16.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_17.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_17.set new file mode 100644 index 0000000..9d6ba57 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_17.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=22 +TrendLegBars=72 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_18.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_18.set new file mode 100644 index 0000000..2bfe3a2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_18.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_2.set new file mode 100644 index 0000000..94597cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_3.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_4.set new file mode 100644 index 0000000..beeb095 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_5.set new file mode 100644 index 0000000..f192d68 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_6.set new file mode 100644 index 0000000..b7d6ecb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_7.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_8.set new file mode 100644 index 0000000..3899e23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_9.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDCAD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_1.set new file mode 100644 index 0000000..06f1f78 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_10.set new file mode 100644 index 0000000..00707c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_11.set new file mode 100644 index 0000000..a6d8885 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_12.set new file mode 100644 index 0000000..ead7faf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_13.set new file mode 100644 index 0000000..c1ceb28 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_14.set new file mode 100644 index 0000000..aad0df3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_15.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_15.set new file mode 100644 index 0000000..150939b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_15.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=24 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_16.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_16.set new file mode 100644 index 0000000..ac143d2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_16.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_17.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_17.set new file mode 100644 index 0000000..1822620 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_17.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=22 +TrendLegBars=72 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_18.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_18.set new file mode 100644 index 0000000..3dc1111 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_18.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_2.set new file mode 100644 index 0000000..22b4f44 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_3.set new file mode 100644 index 0000000..934aaae --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_4.set new file mode 100644 index 0000000..d470a8e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_5.set new file mode 100644 index 0000000..406f633 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_6.set new file mode 100644 index 0000000..45a339c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_7.set new file mode 100644 index 0000000..eb1667c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_8.set new file mode 100644 index 0000000..f221c37 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_9.set new file mode 100644 index 0000000..f72bd63 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDJPY_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_1.set new file mode 100644 index 0000000..78d97e5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_10.set new file mode 100644 index 0000000..600bf69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_11.set new file mode 100644 index 0000000..aea339d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_12.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_13.set new file mode 100644 index 0000000..8d3e24f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_14.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_2.set new file mode 100644 index 0000000..94597cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_3.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_4.set new file mode 100644 index 0000000..beeb095 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_5.set new file mode 100644 index 0000000..f192d68 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_6.set new file mode 100644 index 0000000..b7d6ecb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_7.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_8.set new file mode 100644 index 0000000..3899e23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_9.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDNZD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_1.set new file mode 100644 index 0000000..6e8d045 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_10.set new file mode 100644 index 0000000..e969d7d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_11.set new file mode 100644 index 0000000..3d7897a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_12.set new file mode 100644 index 0000000..7806a93 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_13.set new file mode 100644 index 0000000..40c1048 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_14.set new file mode 100644 index 0000000..abc7f7f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_2.set new file mode 100644 index 0000000..7adcc32 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_3.set new file mode 100644 index 0000000..34b1a03 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_4.set new file mode 100644 index 0000000..a5faa2a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_5.set new file mode 100644 index 0000000..4524e0b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_6.set new file mode 100644 index 0000000..ec73653 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_7.set new file mode 100644 index 0000000..9d26c12 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_8.set new file mode 100644 index 0000000..1147c92 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_9.set new file mode 100644 index 0000000..f9e9e6e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_AUDUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_1.set new file mode 100644 index 0000000..59f160f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_10.set new file mode 100644 index 0000000..a75638c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_11.set new file mode 100644 index 0000000..1f23ee8 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_12.set new file mode 100644 index 0000000..c0c1ee8 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_13.set new file mode 100644 index 0000000..df6820f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_14.set new file mode 100644 index 0000000..1a7dd76 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_2.set new file mode 100644 index 0000000..fa96bb2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_3.set new file mode 100644 index 0000000..7d23307 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_4.set new file mode 100644 index 0000000..57d4a4c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_5.set new file mode 100644 index 0000000..c9ff059 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_6.set new file mode 100644 index 0000000..d7b5ebb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_7.set new file mode 100644 index 0000000..ac4e220 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_8.set new file mode 100644 index 0000000..43bdeae --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_9.set new file mode 100644 index 0000000..6d5cf05 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_BTCUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_1.set new file mode 100644 index 0000000..06f1f78 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_10.set new file mode 100644 index 0000000..00707c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_11.set new file mode 100644 index 0000000..a6d8885 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_12.set new file mode 100644 index 0000000..ead7faf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_13.set new file mode 100644 index 0000000..c1ceb28 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_14.set new file mode 100644 index 0000000..aad0df3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_2.set new file mode 100644 index 0000000..22b4f44 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_3.set new file mode 100644 index 0000000..934aaae --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_4.set new file mode 100644 index 0000000..d470a8e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_5.set new file mode 100644 index 0000000..406f633 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_6.set new file mode 100644 index 0000000..45a339c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_7.set new file mode 100644 index 0000000..eb1667c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_8.set new file mode 100644 index 0000000..f221c37 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_9.set new file mode 100644 index 0000000..f72bd63 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CADJPY_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_1.set new file mode 100644 index 0000000..06f1f78 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_10.set new file mode 100644 index 0000000..00707c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_11.set new file mode 100644 index 0000000..a6d8885 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_12.set new file mode 100644 index 0000000..ead7faf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_13.set new file mode 100644 index 0000000..c1ceb28 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_14.set new file mode 100644 index 0000000..aad0df3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_2.set new file mode 100644 index 0000000..22b4f44 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_3.set new file mode 100644 index 0000000..934aaae --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_4.set new file mode 100644 index 0000000..d470a8e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_5.set new file mode 100644 index 0000000..406f633 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_6.set new file mode 100644 index 0000000..45a339c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_7.set new file mode 100644 index 0000000..eb1667c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_8.set new file mode 100644 index 0000000..f221c37 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_9.set new file mode 100644 index 0000000..f72bd63 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_CHFJPY_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_1.set new file mode 100644 index 0000000..333c457 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_10.set new file mode 100644 index 0000000..d00e1e9 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_11.set new file mode 100644 index 0000000..5e38f77 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_12.set new file mode 100644 index 0000000..69f1a35 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_13.set new file mode 100644 index 0000000..c4ec5aa --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_14.set new file mode 100644 index 0000000..1beb576 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_2.set new file mode 100644 index 0000000..70c61e0 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_3.set new file mode 100644 index 0000000..3d14644 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_4.set new file mode 100644 index 0000000..0524361 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_5.set new file mode 100644 index 0000000..0e5f5f7 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_6.set new file mode 100644 index 0000000..232d5ec --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_7.set new file mode 100644 index 0000000..91e15be --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_8.set new file mode 100644 index 0000000..fd090f2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_9.set new file mode 100644 index 0000000..592be64 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_ETHUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_1.set new file mode 100644 index 0000000..8a5de85 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_10.set new file mode 100644 index 0000000..9ff4062 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_11.set new file mode 100644 index 0000000..92c8621 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_12.set new file mode 100644 index 0000000..faaafd6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_13.set new file mode 100644 index 0000000..9df826a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_14.set new file mode 100644 index 0000000..7ea1aed --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_2.set new file mode 100644 index 0000000..91f5b9f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_3.set new file mode 100644 index 0000000..5ff18a0 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_4.set new file mode 100644 index 0000000..d7d3c86 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_5.set new file mode 100644 index 0000000..fada0d9 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_6.set new file mode 100644 index 0000000..eeafb84 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_7.set new file mode 100644 index 0000000..455be79 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_8.set new file mode 100644 index 0000000..1e25719 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_9.set new file mode 100644 index 0000000..1305bb1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURAUD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_1.set new file mode 100644 index 0000000..8a5de85 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_10.set new file mode 100644 index 0000000..9ff4062 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_11.set new file mode 100644 index 0000000..92c8621 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_12.set new file mode 100644 index 0000000..faaafd6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_13.set new file mode 100644 index 0000000..9df826a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_14.set new file mode 100644 index 0000000..7ea1aed --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_2.set new file mode 100644 index 0000000..91f5b9f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_3.set new file mode 100644 index 0000000..5ff18a0 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_4.set new file mode 100644 index 0000000..d7d3c86 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_5.set new file mode 100644 index 0000000..fada0d9 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_6.set new file mode 100644 index 0000000..eeafb84 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_7.set new file mode 100644 index 0000000..455be79 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_8.set new file mode 100644 index 0000000..1e25719 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_9.set new file mode 100644 index 0000000..1305bb1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCAD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_1.set new file mode 100644 index 0000000..8a5de85 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_10.set new file mode 100644 index 0000000..9ff4062 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_11.set new file mode 100644 index 0000000..92c8621 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_12.set new file mode 100644 index 0000000..faaafd6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_13.set new file mode 100644 index 0000000..9df826a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_14.set new file mode 100644 index 0000000..7ea1aed --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_2.set new file mode 100644 index 0000000..91f5b9f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_3.set new file mode 100644 index 0000000..5ff18a0 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_4.set new file mode 100644 index 0000000..d7d3c86 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_5.set new file mode 100644 index 0000000..fada0d9 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_6.set new file mode 100644 index 0000000..eeafb84 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_7.set new file mode 100644 index 0000000..455be79 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_8.set new file mode 100644 index 0000000..1e25719 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_9.set new file mode 100644 index 0000000..1305bb1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURCHF_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_1.set new file mode 100644 index 0000000..6e8d045 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_10.set new file mode 100644 index 0000000..e969d7d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_11.set new file mode 100644 index 0000000..3d7897a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_12.set new file mode 100644 index 0000000..7806a93 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_13.set new file mode 100644 index 0000000..40c1048 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_14.set new file mode 100644 index 0000000..abc7f7f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_2.set new file mode 100644 index 0000000..7adcc32 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_3.set new file mode 100644 index 0000000..34b1a03 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_4.set new file mode 100644 index 0000000..a5faa2a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_5.set new file mode 100644 index 0000000..4524e0b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_6.set new file mode 100644 index 0000000..ec73653 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_7.set new file mode 100644 index 0000000..9d26c12 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_8.set new file mode 100644 index 0000000..1147c92 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_9.set new file mode 100644 index 0000000..f9e9e6e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURGBP_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_1.set new file mode 100644 index 0000000..06f1f78 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_10.set new file mode 100644 index 0000000..00707c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_11.set new file mode 100644 index 0000000..a6d8885 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_12.set new file mode 100644 index 0000000..ead7faf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_13.set new file mode 100644 index 0000000..c1ceb28 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_14.set new file mode 100644 index 0000000..aad0df3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_2.set new file mode 100644 index 0000000..22b4f44 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_3.set new file mode 100644 index 0000000..934aaae --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_4.set new file mode 100644 index 0000000..d470a8e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_5.set new file mode 100644 index 0000000..406f633 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_6.set new file mode 100644 index 0000000..45a339c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_7.set new file mode 100644 index 0000000..eb1667c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_8.set new file mode 100644 index 0000000..f221c37 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_9.set new file mode 100644 index 0000000..f72bd63 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURJPY_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_1.set new file mode 100644 index 0000000..78d97e5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_10.set new file mode 100644 index 0000000..600bf69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_11.set new file mode 100644 index 0000000..aea339d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_12.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_13.set new file mode 100644 index 0000000..8d3e24f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_14.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_2.set new file mode 100644 index 0000000..94597cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_3.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_4.set new file mode 100644 index 0000000..beeb095 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_5.set new file mode 100644 index 0000000..f192d68 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_6.set new file mode 100644 index 0000000..b7d6ecb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_7.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_8.set new file mode 100644 index 0000000..3899e23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_9.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURNZD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_1.set new file mode 100644 index 0000000..f2ec870 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_10.set new file mode 100644 index 0000000..dc795d8 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_11.set new file mode 100644 index 0000000..660ae45 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_12.set new file mode 100644 index 0000000..285056b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_13.set new file mode 100644 index 0000000..6fe42ef --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_14.set new file mode 100644 index 0000000..0ee5cdb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_2.set new file mode 100644 index 0000000..42d60b6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_3.set new file mode 100644 index 0000000..4eba7cf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_4.set new file mode 100644 index 0000000..13fb84e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_5.set new file mode 100644 index 0000000..e091e77 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_6.set new file mode 100644 index 0000000..d5e7e9e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_7.set new file mode 100644 index 0000000..bfb7023 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_8.set new file mode 100644 index 0000000..984a146 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_9.set new file mode 100644 index 0000000..11f92eb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_EURUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=6 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_1.set new file mode 100644 index 0000000..78d97e5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_10.set new file mode 100644 index 0000000..600bf69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_11.set new file mode 100644 index 0000000..aea339d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_12.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_13.set new file mode 100644 index 0000000..8d3e24f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_14.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_2.set new file mode 100644 index 0000000..94597cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_3.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_4.set new file mode 100644 index 0000000..beeb095 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_5.set new file mode 100644 index 0000000..f192d68 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_6.set new file mode 100644 index 0000000..b7d6ecb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_7.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_8.set new file mode 100644 index 0000000..3899e23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_9.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPAUD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_1.set new file mode 100644 index 0000000..78d97e5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_10.set new file mode 100644 index 0000000..600bf69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_11.set new file mode 100644 index 0000000..aea339d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_12.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_13.set new file mode 100644 index 0000000..8d3e24f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_14.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_2.set new file mode 100644 index 0000000..94597cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_3.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_4.set new file mode 100644 index 0000000..beeb095 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_5.set new file mode 100644 index 0000000..f192d68 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_6.set new file mode 100644 index 0000000..b7d6ecb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_7.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_8.set new file mode 100644 index 0000000..3899e23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_9.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCAD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_1.set new file mode 100644 index 0000000..78d97e5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_10.set new file mode 100644 index 0000000..600bf69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_11.set new file mode 100644 index 0000000..aea339d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_12.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_13.set new file mode 100644 index 0000000..8d3e24f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_14.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_2.set new file mode 100644 index 0000000..94597cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_3.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_4.set new file mode 100644 index 0000000..beeb095 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_5.set new file mode 100644 index 0000000..f192d68 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_6.set new file mode 100644 index 0000000..b7d6ecb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_7.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_8.set new file mode 100644 index 0000000..3899e23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_9.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPCHF_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_1.set new file mode 100644 index 0000000..78d97e5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_10.set new file mode 100644 index 0000000..600bf69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_11.set new file mode 100644 index 0000000..aea339d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_12.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_13.set new file mode 100644 index 0000000..8d3e24f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_14.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_2.set new file mode 100644 index 0000000..94597cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_3.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_4.set new file mode 100644 index 0000000..beeb095 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_5.set new file mode 100644 index 0000000..f192d68 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_6.set new file mode 100644 index 0000000..b7d6ecb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_7.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_8.set new file mode 100644 index 0000000..3899e23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_9.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPJPY_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_1.set new file mode 100644 index 0000000..cec82b8 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_10.set new file mode 100644 index 0000000..8cc801d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_11.set new file mode 100644 index 0000000..c9934b1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_12.set new file mode 100644 index 0000000..f24155a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_13.set new file mode 100644 index 0000000..af8fa98 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_14.set new file mode 100644 index 0000000..1dff113 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_15.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_15.set new file mode 100644 index 0000000..1ef41b7 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_15.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=24 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_16.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_16.set new file mode 100644 index 0000000..6d63714 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_16.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_17.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_17.set new file mode 100644 index 0000000..c07b2ba --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_17.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=22 +TrendLegBars=72 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_18.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_18.set new file mode 100644 index 0000000..02eda30 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_18.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_2.set new file mode 100644 index 0000000..85ab6f6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_3.set new file mode 100644 index 0000000..e04df5c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_4.set new file mode 100644 index 0000000..8b38b6c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_5.set new file mode 100644 index 0000000..50859b2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_6.set new file mode 100644 index 0000000..c51d179 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_7.set new file mode 100644 index 0000000..b89537d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_8.set new file mode 100644 index 0000000..a87cb55 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_9.set new file mode 100644 index 0000000..7f40b0b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPNZD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=14 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_1.set new file mode 100644 index 0000000..6e8d045 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_10.set new file mode 100644 index 0000000..e969d7d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_11.set new file mode 100644 index 0000000..3d7897a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_12.set new file mode 100644 index 0000000..7806a93 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_13.set new file mode 100644 index 0000000..40c1048 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_14.set new file mode 100644 index 0000000..abc7f7f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_2.set new file mode 100644 index 0000000..7adcc32 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_3.set new file mode 100644 index 0000000..34b1a03 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_4.set new file mode 100644 index 0000000..a5faa2a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_5.set new file mode 100644 index 0000000..4524e0b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_6.set new file mode 100644 index 0000000..ec73653 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_7.set new file mode 100644 index 0000000..9d26c12 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_8.set new file mode 100644 index 0000000..1147c92 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_9.set new file mode 100644 index 0000000..f9e9e6e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GBPUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_1.set new file mode 100644 index 0000000..ec937f5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_10.set new file mode 100644 index 0000000..ffd1c23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_11.set new file mode 100644 index 0000000..3c7b886 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_12.set new file mode 100644 index 0000000..1b433c3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_13.set new file mode 100644 index 0000000..6567124 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_14.set new file mode 100644 index 0000000..440d5df --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_2.set new file mode 100644 index 0000000..bb4bc74 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_3.set new file mode 100644 index 0000000..4ade7c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_4.set new file mode 100644 index 0000000..9934f47 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_5.set new file mode 100644 index 0000000..ade2244 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_6.set new file mode 100644 index 0000000..46811a3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_7.set new file mode 100644 index 0000000..deca615 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_8.set new file mode 100644 index 0000000..dbeb957 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_9.set new file mode 100644 index 0000000..5769585 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_GER40_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_1.set new file mode 100644 index 0000000..8bc2273 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_10.set new file mode 100644 index 0000000..134bf5c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_11.set new file mode 100644 index 0000000..6c3a9ff --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_12.set new file mode 100644 index 0000000..26fd7dd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_13.set new file mode 100644 index 0000000..e694dd2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_14.set new file mode 100644 index 0000000..0ba83d9 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_2.set new file mode 100644 index 0000000..dafb5fd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_3.set new file mode 100644 index 0000000..2c9503b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_4.set new file mode 100644 index 0000000..1c484e4 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_5.set new file mode 100644 index 0000000..4459b19 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_6.set new file mode 100644 index 0000000..35b807c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_7.set new file mode 100644 index 0000000..7658aa0 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_8.set new file mode 100644 index 0000000..6b9307f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_9.set new file mode 100644 index 0000000..8d351a6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_JPN225_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=25 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_1.set new file mode 100644 index 0000000..ec937f5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_10.set new file mode 100644 index 0000000..ffd1c23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_11.set new file mode 100644 index 0000000..3c7b886 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_12.set new file mode 100644 index 0000000..1b433c3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_13.set new file mode 100644 index 0000000..6567124 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_14.set new file mode 100644 index 0000000..440d5df --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_2.set new file mode 100644 index 0000000..bb4bc74 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_3.set new file mode 100644 index 0000000..4ade7c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_4.set new file mode 100644 index 0000000..9934f47 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_5.set new file mode 100644 index 0000000..ade2244 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_6.set new file mode 100644 index 0000000..46811a3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_7.set new file mode 100644 index 0000000..deca615 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_8.set new file mode 100644 index 0000000..dbeb957 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_9.set new file mode 100644 index 0000000..5769585 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NAS100_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_1.set new file mode 100644 index 0000000..78d97e5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_10.set new file mode 100644 index 0000000..600bf69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_11.set new file mode 100644 index 0000000..aea339d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_12.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_13.set new file mode 100644 index 0000000..8d3e24f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_14.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_15.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_15.set new file mode 100644 index 0000000..f19af1c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_15.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=24 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_16.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_16.set new file mode 100644 index 0000000..4e7d96c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_16.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_17.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_17.set new file mode 100644 index 0000000..9d6ba57 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_17.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=22 +TrendLegBars=72 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_18.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_18.set new file mode 100644 index 0000000..2bfe3a2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_18.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_2.set new file mode 100644 index 0000000..94597cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_3.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_4.set new file mode 100644 index 0000000..beeb095 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_5.set new file mode 100644 index 0000000..f192d68 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_6.set new file mode 100644 index 0000000..b7d6ecb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_7.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_8.set new file mode 100644 index 0000000..3899e23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_9.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDCAD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_1.set new file mode 100644 index 0000000..78d97e5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_10.set new file mode 100644 index 0000000..600bf69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_11.set new file mode 100644 index 0000000..aea339d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_12.set new file mode 100644 index 0000000..985efaf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_13.set new file mode 100644 index 0000000..8d3e24f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_14.set new file mode 100644 index 0000000..3005607 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_2.set new file mode 100644 index 0000000..94597cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_3.set new file mode 100644 index 0000000..cc8a229 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_4.set new file mode 100644 index 0000000..beeb095 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_5.set new file mode 100644 index 0000000..f192d68 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_6.set new file mode 100644 index 0000000..b7d6ecb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_7.set new file mode 100644 index 0000000..7e46d56 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_8.set new file mode 100644 index 0000000..3899e23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_9.set new file mode 100644 index 0000000..239698b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDJPY_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_1.set new file mode 100644 index 0000000..8a5de85 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_10.set new file mode 100644 index 0000000..9ff4062 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_11.set new file mode 100644 index 0000000..92c8621 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_12.set new file mode 100644 index 0000000..faaafd6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_13.set new file mode 100644 index 0000000..9df826a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_14.set new file mode 100644 index 0000000..7ea1aed --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_15.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_15.set new file mode 100644 index 0000000..21f6aba --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_15.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=24 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_16.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_16.set new file mode 100644 index 0000000..148228e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_16.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_17.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_17.set new file mode 100644 index 0000000..965f978 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_17.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=22 +TrendLegBars=72 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_18.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_18.set new file mode 100644 index 0000000..5ff637d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_18.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_2.set new file mode 100644 index 0000000..91f5b9f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_3.set new file mode 100644 index 0000000..5ff18a0 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_4.set new file mode 100644 index 0000000..d7d3c86 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_5.set new file mode 100644 index 0000000..fada0d9 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_6.set new file mode 100644 index 0000000..eeafb84 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_7.set new file mode 100644 index 0000000..455be79 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_8.set new file mode 100644 index 0000000..1e25719 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_9.set new file mode 100644 index 0000000..1305bb1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_NZDUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=10 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_1.set new file mode 100644 index 0000000..ec937f5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_10.set new file mode 100644 index 0000000..ffd1c23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_11.set new file mode 100644 index 0000000..3c7b886 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_12.set new file mode 100644 index 0000000..1b433c3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_13.set new file mode 100644 index 0000000..6567124 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_14.set new file mode 100644 index 0000000..440d5df --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_2.set new file mode 100644 index 0000000..bb4bc74 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_3.set new file mode 100644 index 0000000..4ade7c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_4.set new file mode 100644 index 0000000..9934f47 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_5.set new file mode 100644 index 0000000..ade2244 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_6.set new file mode 100644 index 0000000..46811a3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_7.set new file mode 100644 index 0000000..deca615 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_8.set new file mode 100644 index 0000000..dbeb957 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_9.set new file mode 100644 index 0000000..5769585 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_UK100_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_1.set new file mode 100644 index 0000000..ec937f5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_10.set new file mode 100644 index 0000000..ffd1c23 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_11.set new file mode 100644 index 0000000..3c7b886 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_12.set new file mode 100644 index 0000000..1b433c3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_13.set new file mode 100644 index 0000000..6567124 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_14.set new file mode 100644 index 0000000..440d5df --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_2.set new file mode 100644 index 0000000..bb4bc74 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_3.set new file mode 100644 index 0000000..4ade7c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_4.set new file mode 100644 index 0000000..9934f47 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_5.set new file mode 100644 index 0000000..ade2244 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_6.set new file mode 100644 index 0000000..46811a3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_7.set new file mode 100644 index 0000000..deca615 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_8.set new file mode 100644 index 0000000..dbeb957 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_9.set new file mode 100644 index 0000000..5769585 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US30_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=20 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_1.set new file mode 100644 index 0000000..c7e376f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_10.set new file mode 100644 index 0000000..b8da5c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_11.set new file mode 100644 index 0000000..193133a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_12.set new file mode 100644 index 0000000..cde1f38 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_13.set new file mode 100644 index 0000000..fcc440a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_14.set new file mode 100644 index 0000000..0f7f9b0 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_2.set new file mode 100644 index 0000000..7ce007b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_3.set new file mode 100644 index 0000000..b0ba725 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_4.set new file mode 100644 index 0000000..08f0db2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_5.set new file mode 100644 index 0000000..f8e4b14 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_6.set new file mode 100644 index 0000000..ff51a5c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_7.set new file mode 100644 index 0000000..d1fd8d0 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_8.set new file mode 100644 index 0000000..8fb8e40 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_9.set new file mode 100644 index 0000000..b92d260 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_US500_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=2.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.0 +AtrTpMult=4.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_1.set new file mode 100644 index 0000000..6e8d045 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_10.set new file mode 100644 index 0000000..e969d7d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_11.set new file mode 100644 index 0000000..3d7897a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_12.set new file mode 100644 index 0000000..7806a93 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_13.set new file mode 100644 index 0000000..40c1048 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_14.set new file mode 100644 index 0000000..abc7f7f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_2.set new file mode 100644 index 0000000..7adcc32 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_3.set new file mode 100644 index 0000000..34b1a03 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_4.set new file mode 100644 index 0000000..a5faa2a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_5.set new file mode 100644 index 0000000..4524e0b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_6.set new file mode 100644 index 0000000..ec73653 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_7.set new file mode 100644 index 0000000..9d26c12 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_8.set new file mode 100644 index 0000000..1147c92 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_9.set new file mode 100644 index 0000000..f9e9e6e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCAD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_1.set new file mode 100644 index 0000000..6e8d045 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_10.set new file mode 100644 index 0000000..e969d7d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_11.set new file mode 100644 index 0000000..3d7897a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_12.set new file mode 100644 index 0000000..7806a93 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_13.set new file mode 100644 index 0000000..40c1048 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_14.set new file mode 100644 index 0000000..abc7f7f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_2.set new file mode 100644 index 0000000..7adcc32 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_3.set new file mode 100644 index 0000000..34b1a03 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_4.set new file mode 100644 index 0000000..a5faa2a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_5.set new file mode 100644 index 0000000..4524e0b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_6.set new file mode 100644 index 0000000..ec73653 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_7.set new file mode 100644 index 0000000..9d26c12 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_8.set new file mode 100644 index 0000000..1147c92 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_9.set new file mode 100644 index 0000000..f9e9e6e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCHF_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=8 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_1.set new file mode 100644 index 0000000..b515458 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_10.set new file mode 100644 index 0000000..5a0b5e7 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_11.set new file mode 100644 index 0000000..9e21dbb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_12.set new file mode 100644 index 0000000..b301f67 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_13.set new file mode 100644 index 0000000..fdc68cc --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_14.set new file mode 100644 index 0000000..f906dd1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_2.set new file mode 100644 index 0000000..aebbb75 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_3.set new file mode 100644 index 0000000..d6fadbd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_4.set new file mode 100644 index 0000000..1fbfdf8 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_5.set new file mode 100644 index 0000000..6477d69 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_6.set new file mode 100644 index 0000000..1571f54 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_7.set new file mode 100644 index 0000000..2ff144f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_8.set new file mode 100644 index 0000000..4207149 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_9.set new file mode 100644 index 0000000..e10999f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDCNH_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=15 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_1.set new file mode 100644 index 0000000..06f1f78 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_10.set new file mode 100644 index 0000000..00707c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_11.set new file mode 100644 index 0000000..a6d8885 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_12.set new file mode 100644 index 0000000..ead7faf --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_13.set new file mode 100644 index 0000000..c1ceb28 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_14.set new file mode 100644 index 0000000..aad0df3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_2.set new file mode 100644 index 0000000..22b4f44 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_3.set new file mode 100644 index 0000000..934aaae --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_4.set new file mode 100644 index 0000000..d470a8e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_5.set new file mode 100644 index 0000000..406f633 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_6.set new file mode 100644 index 0000000..45a339c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_7.set new file mode 100644 index 0000000..eb1667c --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_8.set new file mode 100644 index 0000000..f221c37 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_9.set new file mode 100644 index 0000000..f72bd63 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_USDJPY_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.71 +AtrTpMult=6.36 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=12.0 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_1.set new file mode 100644 index 0000000..2339704 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_10.set new file mode 100644 index 0000000..c2ef0de --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_11.set new file mode 100644 index 0000000..35e982a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_12.set new file mode 100644 index 0000000..c9bb024 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_13.set new file mode 100644 index 0000000..9dbba9b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_14.set new file mode 100644 index 0000000..73c23c2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_2.set new file mode 100644 index 0000000..148e8b6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_3.set new file mode 100644 index 0000000..badb3d1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_4.set new file mode 100644 index 0000000..3f8e1a9 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_5.set new file mode 100644 index 0000000..84008d4 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_6.set new file mode 100644 index 0000000..bc02854 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_7.set new file mode 100644 index 0000000..32806af --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_8.set new file mode 100644 index 0000000..0d18ade --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_9.set new file mode 100644 index 0000000..43c02cc --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAGUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=40 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_1.set new file mode 100644 index 0000000..5e6988f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_10.set new file mode 100644 index 0000000..d4418d9 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_11.set new file mode 100644 index 0000000..f1c0d6b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_12.set new file mode 100644 index 0000000..f591f4f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_13.set new file mode 100644 index 0000000..3010318 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_14.set new file mode 100644 index 0000000..7a7de8e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_2.set new file mode 100644 index 0000000..26007c2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_3.set new file mode 100644 index 0000000..3efa253 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_4.set new file mode 100644 index 0000000..0c8c01e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_5.set new file mode 100644 index 0000000..ba9b856 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_6.set new file mode 100644 index 0000000..2089106 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_7.set new file mode 100644 index 0000000..5e49d90 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_8.set new file mode 100644 index 0000000..2514669 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_9.set new file mode 100644 index 0000000..0918045 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XAUUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=35 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_1.set new file mode 100644 index 0000000..c88788b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_10.set new file mode 100644 index 0000000..bf4269f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_11.set new file mode 100644 index 0000000..1ec32bc --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_12.set new file mode 100644 index 0000000..0e5bfaa --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_13.set new file mode 100644 index 0000000..1ee55bb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_14.set new file mode 100644 index 0000000..4431c19 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_2.set new file mode 100644 index 0000000..3734062 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_3.set new file mode 100644 index 0000000..faf4268 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_4.set new file mode 100644 index 0000000..95ee7e4 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_5.set new file mode 100644 index 0000000..0fc154e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_6.set new file mode 100644 index 0000000..2c4e008 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_7.set new file mode 100644 index 0000000..38be36d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_8.set new file mode 100644 index 0000000..4d2a9c1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_9.set new file mode 100644 index 0000000..1ea95cc --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XBRUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_1.set new file mode 100644 index 0000000..41c1346 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_10.set new file mode 100644 index 0000000..b167dd8 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_11.set new file mode 100644 index 0000000..3409b95 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_12.set new file mode 100644 index 0000000..a9a5b00 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_13.set new file mode 100644 index 0000000..c086392 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_14.set new file mode 100644 index 0000000..b5447c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_2.set new file mode 100644 index 0000000..720b64e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_3.set new file mode 100644 index 0000000..dfd5b19 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_4.set new file mode 100644 index 0000000..430ee73 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_5.set new file mode 100644 index 0000000..6c97ce5 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_6.set new file mode 100644 index 0000000..941db0f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_7.set new file mode 100644 index 0000000..a0f84e3 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_8.set new file mode 100644 index 0000000..7c77626 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_9.set new file mode 100644 index 0000000..fea7975 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPDUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=80 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_1.set new file mode 100644 index 0000000..0a6c232 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_10.set new file mode 100644 index 0000000..b6087ad --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_11.set new file mode 100644 index 0000000..581fe35 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_12.set new file mode 100644 index 0000000..6cf8b3a --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_13.set new file mode 100644 index 0000000..d17586d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_14.set new file mode 100644 index 0000000..4e30912 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_2.set new file mode 100644 index 0000000..ba280a1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_3.set new file mode 100644 index 0000000..71799c2 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_4.set new file mode 100644 index 0000000..e5520cb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_5.set new file mode 100644 index 0000000..4a021c6 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_6.set new file mode 100644 index 0000000..d93b0cd --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_7.set new file mode 100644 index 0000000..ca55324 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_8.set new file mode 100644 index 0000000..892f1ed --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_9.set new file mode 100644 index 0000000..f55ec4f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XPTUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.0 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.5 +AtrTpMult=5.0 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=50 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_1.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_1.set new file mode 100644 index 0000000..c88788b --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_1.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_10.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_10.set new file mode 100644 index 0000000..bf4269f --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_10.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=1 +PullbackAdxMin=20 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_11.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_11.set new file mode 100644 index 0000000..1ec32bc --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_11.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=true +AdxPeriod=14 +AdxMin=15 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_12.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_12.set new file mode 100644 index 0000000..0e5bfaa --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_12.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=36 +TrendLegBars=64 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_13.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_13.set new file mode 100644 index 0000000..1ee55bb --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_13.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=26 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_14.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_14.set new file mode 100644 index 0000000..4431c19 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_14.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_2.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_2.set new file mode 100644 index 0000000..3734062 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_2.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=9 +SlowEmaPeriod=34 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_3.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_3.set new file mode 100644 index 0000000..faf4268 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_3.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_4.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_4.set new file mode 100644 index 0000000..95ee7e4 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_4.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=7 +SlowEmaPeriod=28 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=100 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_5.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_5.set new file mode 100644 index 0000000..0fc154e --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_5.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=2 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_6.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_6.set new file mode 100644 index 0000000..2c4e008 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_6.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=36 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=3 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=2 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_7.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_7.set new file mode 100644 index 0000000..38be36d --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_7.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=11 +SlowEmaPeriod=40 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=true +PullbackTouch=0 +PullbackAdxMin=18 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_8.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_8.set new file mode 100644 index 0000000..4d2a9c1 --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_8.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=10 +SlowEmaPeriod=46 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=4 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=true +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=8 +SessionEndHour=22 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_9.set b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_9.set new file mode 100644 index 0000000..1ea95cc --- /dev/null +++ b/lab/EAs/SimpleEMA/mt5_sets/SimpleEMA_sweep_XTIUSD_9.set @@ -0,0 +1,26 @@ +; SimpleEMA v5 — per-symbol MT5 set +Timeframe=16388 +FastEmaPeriod=8 +SlowEmaPeriod=30 +TrendLegBars=48 +MinEmaGapPips=1.5 +CrossCooldown=2 +PullbackCooldown=3 +UsePullback=false +PullbackTouch=0 +PullbackAdxMin=0.0 +PullbackMinGapPips=0.0 +MaxPullbacksPerLeg=1 +AtrPeriod=20 +AtrSlMult=2.2 +AtrTpMult=4.5 +MaxBarsInTrade=64 +HtfEmaPeriod=200 +UseHtfFilter=false +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +SessionStartHour=0 +SessionEndHour=24 +MaxSpreadPips=30 +LotSize=0.05 diff --git a/lab/EAs/SimpleEMA/optimize_trials.csv b/lab/EAs/SimpleEMA/optimize_trials.csv new file mode 100644 index 0000000..23b09c2 --- /dev/null +++ b/lab/EAs/SimpleEMA/optimize_trials.csv @@ -0,0 +1,2001 @@ +trial,net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +1,-3117.4199999999983,737,0.6817202149349794,10,46,48,1.5,8,3,True,0,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6.0,0.1,10000.0 +2,178.10999999999513,78,1.1675588210391639,10,46,48,1.5,8,3,False,0,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6.0,0.1,10000.0 +3,-3117.4199999999983,737,0.6817202149349794,10,46,48,1.5,8,3,True,0,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6.0,0.1,10000.0 +4,-2075.7300000000223,514,0.6991599732165374,10,46,64,1.5,8,2,True,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6.0,0.1,10000.0 +5,-2699.9400000000005,766,0.7313396300763013,10,46,56,1.5,6,3,True,0,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6.0,0.1,10000.0 +6,-221.02000000000044,89,0.8285523682454968,8,38,72,1.1,7,3,False,0,14,2.71,4.6,48,100,True,True,14,20.8,7,22,6.0,0.1,10000.0 +7,-2286.7599999999893,636,0.6993795025503496,11,46,32,2.0,7,5,True,0,14,2.26,6.79,48,100,True,False,14,18.9,8,22,6.0,0.1,10000.0 +8,-1149.9000000000178,209,0.598209606071406,11,40,56,0.7,8,4,False,0,14,2.05,5.18,80,100,True,False,14,19.0,8,22,6.0,0.1,10000.0 +9,-164.45999999999913,61,0.8305776184442315,10,48,40,1.8,6,3,False,1,14,2.2,5.64,64,200,True,False,14,22.6,8,22,8.0,0.1,10000.0 +10,-249.66999999999462,63,0.7609715467391721,8,44,64,2.3,8,3,False,0,20,3.06,6.43,64,200,True,False,14,22.0,8,22,8.0,0.1,10000.0 +11,-1498.5100000000002,372,0.6994878191604564,10,44,40,1.5,6,2,True,0,14,2.95,5.77,48,200,True,True,14,24.0,8,21,6.0,0.1,10000.0 +12,-4801.090000000018,1076,0.6958667540006613,12,46,72,1.2,8,5,True,0,14,3.14,7.13,80,100,False,False,14,23.0,8,21,6.0,0.1,10000.0 +13,-99.16000000000531,38,0.8244116657517752,10,42,64,2.4,10,2,False,0,20,2.02,7.29,80,100,True,False,14,23.0,7,21,8.0,0.1,10000.0 +14,-1238.5700000000088,239,0.6659375337145323,8,42,40,1.8,10,3,True,1,20,3.16,7.29,64,200,True,True,14,21.2,8,22,6.0,0.1,10000.0 +15,-442.5999999999949,160,0.7905982097235101,9,44,32,1.2,10,3,False,0,14,2.09,6.39,64,100,True,False,14,16.6,7,22,8.0,0.1,10000.0 +16,-3776.7900000000027,901,0.6716180297551302,9,42,72,2.4,10,5,True,0,20,2.23,4.79,96,200,True,False,14,19.7,7,21,6.0,0.1,10000.0 +17,-5189.129999999993,1342,0.662650077622994,11,48,32,1.0,7,5,True,0,14,2.33,5.25,48,200,False,False,14,16.4,7,21,6.0,0.1,10000.0 +18,-1494.159999999998,429,0.7806328666041229,9,50,56,1.5,9,2,True,0,14,3.18,5.3,96,200,True,True,14,23.7,8,21,6.0,0.1,10000.0 +19,-721.4000000000015,121,0.6026482770776416,10,44,32,1.7,10,2,False,0,14,2.06,5.93,64,100,False,False,14,22.8,7,21,6.0,0.1,10000.0 +20,-401.99000000000524,55,0.5768615397570577,11,40,64,1.0,10,2,False,0,20,2.79,6.2,80,200,True,True,14,21.7,7,22,8.0,0.1,10000.0 +21,-2528.50999999999,660,0.6877634890331759,9,46,56,1.1,6,2,True,1,14,2.09,5.14,80,100,True,False,14,23.0,8,22,6.0,0.1,10000.0 +22,-152.28999999999724,28,0.7288138611393058,11,46,64,2.5,10,2,False,1,20,3.12,4.81,64,200,True,False,14,21.9,7,22,8.0,0.1,10000.0 +23,-2489.8199999999924,801,0.7506804212904273,12,44,72,1.2,8,5,True,0,14,2.76,6.99,48,100,True,False,14,21.1,8,21,8.0,0.1,10000.0 +24,-1326.809999999994,254,0.6240351593049747,12,50,64,0.5,6,3,False,0,20,2.7,4.94,64,100,True,False,14,23.2,7,22,6.0,0.1,10000.0 +25,-4393.580000000005,832,0.6472193182347397,9,40,48,2.1,9,3,True,0,14,3.06,4.57,80,200,False,True,14,22.5,8,21,6.0,0.1,10000.0 +26,-3422.9099999999844,939,0.6932455793670639,11,38,56,0.9,9,4,True,0,14,2.03,5.08,80,200,True,False,14,18.8,8,22,6.0,0.1,10000.0 +27,-2071.2899999999845,386,0.6406106854334972,8,46,40,1.7,8,2,True,1,20,2.41,6.86,96,100,True,True,14,17.5,7,22,6.0,0.1,10000.0 +28,-629.9699999999993,122,0.7058826275736496,12,44,48,1.4,8,4,False,0,20,2.61,6.5,80,200,False,False,14,20.4,7,22,8.0,0.1,10000.0 +29,-2879.1500000000106,714,0.7134472716704785,9,46,56,1.6,6,4,True,0,20,2.94,6.32,80,200,True,False,14,21.4,8,21,6.0,0.1,10000.0 +30,-2870.5200000000004,711,0.6843126300462338,10,48,32,2.1,7,4,True,0,14,2.03,5.23,96,100,True,False,14,23.1,7,22,8.0,0.1,10000.0 +31,-3407.269999999986,907,0.7571950302680477,11,44,40,1.8,6,2,True,0,14,2.96,6.59,96,100,False,False,14,23.3,7,22,6.0,0.1,10000.0 +32,-566.1600000000108,91,0.667647007026751,11,48,56,1.7,10,5,False,0,14,2.89,5.92,80,100,False,False,14,22.1,8,21,8.0,0.1,10000.0 +33,-3168.3799999999947,683,0.6343984279171634,11,40,72,1.1,8,4,True,1,14,2.17,5.19,64,100,True,False,14,19.3,8,22,6.0,0.1,10000.0 +34,-136.86999999999716,42,0.782147802696293,9,50,56,2.3,10,2,False,0,20,2.01,5.56,96,200,False,True,14,21.9,7,22,6.0,0.1,10000.0 +35,-526.2499999999927,185,0.7965247785454953,10,50,56,0.6,8,5,False,0,20,3.1,7.44,48,200,False,True,14,21.3,7,22,6.0,0.1,10000.0 +36,-3155.059999999986,653,0.6806590343434303,11,42,32,1.0,8,3,True,0,20,2.91,5.64,96,200,True,False,14,16.2,7,22,6.0,0.1,10000.0 +37,-499.40999999999985,97,0.6724084775892265,8,38,32,2.4,7,2,False,0,14,2.15,6.51,64,200,False,False,14,22.1,7,21,6.0,0.1,10000.0 +38,-5360.250000000001,1373,0.6611744939504137,10,40,64,0.6,8,5,True,1,14,2.09,6.57,64,100,False,False,14,22.8,7,21,8.0,0.1,10000.0 +39,-3469.0699999999806,853,0.6905724160998997,12,50,72,1.2,10,4,True,0,20,2.13,7.38,96,100,True,False,14,21.9,8,22,8.0,0.1,10000.0 +40,-2248.1299999999965,660,0.7558110990906445,11,46,48,2.2,6,4,True,0,20,2.68,6.5,80,100,True,False,14,17.5,7,22,8.0,0.1,10000.0 +41,-375.3599999999951,70,0.6701610706408555,10,46,64,1.9,8,2,False,0,14,2.29,5.72,64,200,False,True,14,19.9,7,21,8.0,0.1,10000.0 +42,-3414.900000000007,975,0.7337490556196187,9,50,72,1.0,10,4,True,1,20,2.51,6.74,80,200,False,False,14,18.2,8,21,6.0,0.1,10000.0 +43,-1383.7300000000014,408,0.7461348646491703,9,48,32,2.0,7,3,True,1,20,2.33,6.27,80,100,True,False,14,17.8,7,22,6.0,0.1,10000.0 +44,-880.9600000000082,204,0.6636671489819838,12,42,48,0.6,6,4,False,0,20,2.12,4.54,80,200,True,False,14,18.7,7,22,8.0,0.1,10000.0 +45,-6146.270000000006,1705,0.7075652858226303,8,40,56,1.5,10,2,True,0,20,2.1,5.24,96,100,False,False,14,19.6,8,22,8.0,0.1,10000.0 +46,75.78000000000065,43,1.1288885109278,10,38,64,2.4,6,3,False,0,20,2.79,4.97,64,100,True,False,14,19.3,8,22,6.0,0.1,10000.0 +47,-636.6499999999924,104,0.5972379500351108,9,46,72,1.1,9,2,False,0,20,2.95,6.38,64,200,True,True,14,17.8,7,22,6.0,0.1,10000.0 +48,-2820.7700000000077,714,0.7162086162507708,8,38,40,2.1,10,4,True,0,20,2.83,6.6,80,200,True,False,14,20.8,8,22,8.0,0.1,10000.0 +49,138.1500000000069,34,1.2361942212343993,8,40,40,2.4,10,2,False,0,14,2.92,5.03,96,200,True,True,14,19.5,8,21,8.0,0.1,10000.0 +50,-3466.489999999986,831,0.6482081550182113,10,50,48,1.1,6,3,True,0,20,2.35,7.34,48,200,True,False,14,18.0,7,22,6.0,0.1,10000.0 +51,-503.0500000000029,103,0.6577891156462584,12,52,56,0.6,10,4,False,0,20,2.91,5.11,64,200,True,True,14,19.9,7,21,6.0,0.1,10000.0 +52,-3230.1500000000033,820,0.7088648781164882,10,38,64,1.3,7,2,True,0,14,2.6,6.65,80,200,True,False,14,17.9,7,22,6.0,0.1,10000.0 +53,-350.21999999999207,74,0.7125598115576859,12,42,32,1.1,9,4,False,0,14,2.34,5.4,96,100,True,True,14,19.9,8,22,8.0,0.1,10000.0 +54,-3288.1800000000076,746,0.7118018062236183,10,44,72,1.0,9,3,True,0,20,2.89,6.62,96,200,False,True,14,23.8,8,21,6.0,0.1,10000.0 +55,-104.33999999999833,28,0.7920105250568114,12,48,32,2.2,9,2,False,0,14,2.87,5.73,64,100,True,False,14,18.7,8,21,8.0,0.1,10000.0 +56,-259.78999999998996,44,0.6927343907083466,12,50,48,1.8,9,2,False,0,14,2.76,7.26,64,100,True,False,14,22.1,7,22,6.0,0.1,10000.0 +57,-3669.129999999992,851,0.6385143456149374,10,38,32,1.1,6,4,True,0,20,2.17,6.09,64,100,True,False,14,20.9,8,21,8.0,0.1,10000.0 +58,-2220.9699999999975,427,0.6754628479579162,12,42,40,1.4,8,5,True,1,14,3.08,5.9,80,100,True,False,14,23.6,8,22,8.0,0.1,10000.0 +59,-3816.7700000000114,965,0.7169699949352597,11,46,40,2.5,9,2,True,0,20,2.69,7.48,80,100,False,False,14,18.2,7,22,8.0,0.1,10000.0 +60,-26.93999999999869,62,0.9655710050097126,9,48,40,1.8,10,4,False,1,14,2.75,7.21,48,200,True,False,14,20.6,7,21,8.0,0.1,10000.0 +61,-873.9199999999983,266,0.789602929457564,10,50,40,0.9,10,4,False,1,20,3.0,5.27,96,200,False,False,14,22.4,8,21,6.0,0.1,10000.0 +62,-2778.520000000016,919,0.7764448510273326,9,50,64,1.2,9,2,True,1,14,2.55,6.52,80,200,False,False,14,16.9,7,22,6.0,0.1,10000.0 +63,-823.3299999999999,125,0.5373458906034009,12,48,64,0.9,6,5,False,0,20,2.14,4.64,48,200,True,False,14,16.8,7,22,8.0,0.1,10000.0 +64,-644.3600000000097,81,0.5649772820869424,10,50,64,2.0,7,5,False,0,20,2.74,7.32,80,100,False,False,14,17.7,8,21,8.0,0.1,10000.0 +65,-3676.689999999996,1035,0.7761712127161543,8,48,64,2.3,8,2,True,0,14,3.16,7.35,96,100,False,False,14,21.1,7,21,8.0,0.1,10000.0 +66,-435.8199999999997,194,0.820969954895372,9,42,64,0.9,10,3,False,0,14,2.39,4.94,48,200,True,False,14,20.3,7,21,6.0,0.1,10000.0 +67,-3729.479999999993,978,0.6586469551273251,9,38,48,2.1,7,4,True,0,20,2.06,6.73,48,100,True,False,14,22.2,7,22,6.0,0.1,10000.0 +68,-2650.2699999999904,738,0.730857816006743,12,38,72,2.1,10,4,True,1,14,2.07,5.94,96,200,False,False,14,19.9,8,21,6.0,0.1,10000.0 +69,-1798.9200000000037,412,0.6544452533572549,10,42,32,0.8,10,4,True,1,20,2.54,6.32,48,100,False,True,14,23.0,7,22,8.0,0.1,10000.0 +70,-533.1000000000022,81,0.628167481568797,9,50,48,2.2,9,5,False,0,20,2.51,6.5,80,100,False,False,14,16.5,7,21,8.0,0.1,10000.0 +71,-225.22999999999774,78,0.8182471090452789,8,48,40,1.6,10,4,False,0,20,2.42,6.5,96,100,True,True,14,18.5,7,21,6.0,0.1,10000.0 +72,-2067.6900000000032,628,0.7461848365666476,11,44,32,1.2,10,4,True,0,14,2.97,7.04,48,200,True,False,14,18.2,8,22,8.0,0.1,10000.0 +73,-2237.099999999996,522,0.6849842639987045,8,42,40,1.6,9,2,True,1,14,2.11,6.09,96,200,True,False,14,17.3,8,22,6.0,0.1,10000.0 +74,-5110.980000000026,1363,0.7164103659602329,8,42,40,2.0,6,2,True,0,20,2.58,5.83,80,100,False,False,14,18.8,7,22,8.0,0.1,10000.0 +75,-2521.1900000000214,551,0.681798504401603,12,46,32,0.9,10,2,True,0,20,3.13,6.8,80,200,True,False,14,16.1,8,21,6.0,0.1,10000.0 +76,-3163.4699999999975,935,0.7230536091355093,11,44,64,1.6,8,2,True,1,14,2.52,5.88,48,200,False,False,14,20.6,8,22,6.0,0.1,10000.0 +77,-1430.4200000000092,300,0.6936306742001397,11,38,48,0.8,10,5,False,0,14,2.52,4.82,96,200,False,False,14,19.2,8,22,6.0,0.1,10000.0 +78,-5914.169999999964,1339,0.633160835803565,10,42,32,1.5,6,3,True,0,14,2.28,4.94,64,100,False,False,14,22.1,7,21,8.0,0.1,10000.0 +79,-710.6500000000051,61,0.49296869983376024,11,52,72,2.3,10,4,False,0,14,2.53,5.91,80,200,False,False,14,18.8,7,22,8.0,0.1,10000.0 +80,-545.54000000001,143,0.7450890604265181,11,38,32,1.2,8,2,False,0,20,2.56,6.16,48,200,False,True,14,17.5,8,21,6.0,0.1,10000.0 +81,-2430.789999999989,555,0.6951945418682891,11,40,48,2.5,6,3,True,0,20,3.19,6.07,64,200,True,False,14,19.1,8,21,8.0,0.1,10000.0 +82,-1419.6900000000078,199,0.5018439308183825,8,48,32,1.6,9,4,True,1,14,2.4,6.25,64,200,True,True,14,21.6,8,21,6.0,0.1,10000.0 +83,-172.02000000000044,45,0.7592812862960217,10,50,72,2.1,7,2,False,1,20,2.61,4.55,80,100,True,False,14,23.6,8,21,6.0,0.1,10000.0 +84,-1626.949999999999,283,0.6246441277033605,9,42,32,1.1,6,2,False,0,14,2.72,4.96,64,100,False,False,14,16.3,8,21,8.0,0.1,10000.0 +85,-2056.6699999999946,602,0.7602233300378668,12,46,72,2.1,7,3,True,0,14,2.44,7.34,96,200,True,False,14,20.0,8,21,6.0,0.1,10000.0 +86,-2432.5099999999975,332,0.5279246235056668,12,42,48,0.6,9,4,False,0,14,2.34,6.79,80,200,False,False,14,22.6,7,21,8.0,0.1,10000.0 +87,-3282.9600000000028,1029,0.7194463719863405,10,38,56,0.6,10,4,True,0,14,2.45,4.58,48,200,True,False,14,16.3,8,21,8.0,0.1,10000.0 +88,-1091.219999999992,260,0.6605858146630958,11,38,32,0.5,7,3,False,1,20,2.13,5.36,80,100,True,False,14,19.4,8,21,6.0,0.1,10000.0 +89,-4433.269999999996,1059,0.7152607841701574,11,38,72,1.5,7,3,True,0,14,2.74,5.22,96,100,False,True,14,16.7,8,21,6.0,0.1,10000.0 +90,-487.43999999999687,50,0.4925460148246856,11,52,32,1.8,8,4,False,0,20,2.95,5.53,48,200,True,False,14,18.8,8,21,8.0,0.1,10000.0 +91,-5110.930000000017,1147,0.6906456400472604,11,42,40,0.6,9,2,True,0,14,2.95,7.16,80,200,False,False,14,23.9,8,22,6.0,0.1,10000.0 +92,-3181.98999999999,725,0.6925093614862416,9,46,48,2.2,6,4,True,0,20,2.52,5.7,96,200,True,False,14,20.0,8,22,8.0,0.1,10000.0 +93,-2639.2100000000028,516,0.6389115396823659,8,50,32,1.4,7,4,True,0,14,2.39,5.39,96,200,True,True,14,19.6,8,21,8.0,0.1,10000.0 +94,-244.23999999999796,24,0.4955907560769088,12,50,48,1.8,6,2,False,1,20,2.44,6.9,64,100,True,True,14,21.4,8,21,6.0,0.1,10000.0 +95,-1622.7600000000002,292,0.636346523603996,8,44,72,1.2,9,2,False,0,20,3.14,5.62,48,100,False,False,14,19.2,8,21,6.0,0.1,10000.0 +96,-4115.85999999999,959,0.6802122667163923,8,42,56,1.5,10,2,True,0,20,2.26,6.34,96,100,True,False,14,22.8,8,21,8.0,0.1,10000.0 +97,-4836.439999999997,1092,0.6565579672580963,8,48,72,1.2,6,4,True,0,14,2.95,6.03,48,100,True,False,14,22.3,7,22,8.0,0.1,10000.0 +98,-1563.3199999999906,357,0.6778041582166824,11,42,64,2.3,6,4,True,1,20,2.63,6.81,48,100,True,True,14,16.6,8,22,6.0,0.1,10000.0 +99,-929.3499999999931,115,0.5297049744446132,12,42,40,1.4,6,2,False,0,20,2.2,5.47,64,200,False,False,14,22.8,8,21,8.0,0.1,10000.0 +100,-80.89000000000124,85,0.9312212500743992,9,46,64,1.6,10,3,False,1,14,2.21,6.37,80,100,True,False,14,16.4,8,21,8.0,0.1,10000.0 +101,-115.1399999999976,27,0.785809956097924,12,38,56,2.3,10,4,False,0,20,2.29,6.92,96,200,True,False,14,21.5,7,22,8.0,0.1,10000.0 +102,-612.2800000000079,103,0.6547111502109134,11,52,40,1.2,7,4,False,0,20,3.17,4.89,80,100,True,False,14,19.7,8,22,6.0,0.1,10000.0 +103,-2899.1699999999955,575,0.6470405617801067,9,40,32,1.1,9,5,True,0,20,3.12,6.66,64,100,True,True,14,19.7,8,22,6.0,0.1,10000.0 +104,-1423.390000000003,214,0.577888359375695,8,50,64,1.4,7,3,False,0,14,2.06,5.98,96,200,False,False,14,22.8,8,21,8.0,0.1,10000.0 +105,-2318.320000000008,694,0.7206671735251202,10,50,48,0.6,6,3,True,1,20,2.09,6.01,80,100,True,False,14,19.2,8,22,6.0,0.1,10000.0 +106,-2959.8600000000124,488,0.569576332558728,9,50,64,0.6,6,3,False,0,20,2.62,4.95,64,200,False,False,14,17.3,8,22,8.0,0.1,10000.0 +107,-142.79999999999745,15,0.4998248686514887,12,46,56,2.1,8,4,False,0,20,2.7,6.89,48,200,True,True,14,22.3,7,21,8.0,0.1,10000.0 +108,-304.4899999999998,39,0.567958341019056,9,50,40,2.1,7,2,False,1,14,2.23,5.82,96,100,True,True,14,17.6,8,21,6.0,0.1,10000.0 +109,-4796.459999999982,1209,0.7194191199052341,12,44,64,1.2,9,5,True,0,20,3.09,5.53,80,200,False,False,14,17.5,7,22,8.0,0.1,10000.0 +110,-3720.799999999991,758,0.6469517708868051,9,46,48,1.9,9,4,True,0,20,2.35,6.22,96,200,True,False,14,18.3,8,21,8.0,0.1,10000.0 +111,-281.01000000000204,35,0.5059077961810318,11,46,72,1.5,7,4,False,1,20,2.16,6.35,64,100,True,True,14,23.2,7,21,6.0,0.1,10000.0 +112,-2121.5899999999983,709,0.7932562393234022,8,50,48,1.9,6,3,True,1,14,2.49,7.31,96,200,False,False,14,22.0,8,22,8.0,0.1,10000.0 +113,-2379.040000000012,545,0.7226618419886874,8,40,72,1.6,10,2,True,0,14,3.12,4.61,96,200,True,True,14,23.7,8,21,6.0,0.1,10000.0 +114,-3353.3699999999917,1000,0.7359083302159831,10,40,48,1.1,10,5,True,1,20,2.33,6.93,80,100,False,False,14,21.2,7,21,8.0,0.1,10000.0 +115,-91.13000000000648,61,0.8957656585990759,10,44,40,1.7,9,5,False,0,14,2.48,4.79,64,200,True,False,14,16.1,8,21,8.0,0.1,10000.0 +116,-1703.989999999998,436,0.6892842555177897,10,48,48,1.7,10,2,True,1,20,2.83,4.69,48,200,True,False,14,19.2,8,21,8.0,0.1,10000.0 +117,-1021.0000000000109,205,0.6728109417661159,10,44,40,2.4,9,3,True,1,20,2.5,6.15,96,100,True,True,14,22.0,7,22,8.0,0.1,10000.0 +118,-295.62000000000444,119,0.8528807249961431,8,40,32,2.2,10,3,False,1,14,2.2,7.06,96,100,False,False,14,21.7,8,21,8.0,0.1,10000.0 +119,-1067.3199999999906,204,0.6543272251478466,8,52,40,1.5,9,2,False,0,20,2.87,5.69,48,100,False,False,14,16.4,8,21,6.0,0.1,10000.0 +120,-1189.529999999997,167,0.5598229715178047,8,52,32,1.1,7,3,False,1,20,2.45,7.17,96,200,True,False,14,21.5,7,22,6.0,0.1,10000.0 +121,-3773.560000000002,866,0.7028830944074252,9,50,64,0.8,7,2,True,0,20,2.81,6.13,96,100,True,False,14,18.8,8,21,6.0,0.1,10000.0 +122,-5916.120000000004,1587,0.6893803957641922,8,50,64,2.0,6,3,True,0,14,2.71,5.84,48,100,False,False,14,19.2,7,21,6.0,0.1,10000.0 +123,-59.60000000000218,53,0.9152783305850912,9,46,40,2.1,10,4,False,1,20,2.28,7.13,64,200,True,False,14,16.5,7,22,8.0,0.1,10000.0 +124,-503.7900000000045,91,0.6504686643586133,8,48,72,1.8,10,4,False,0,20,2.18,5.63,96,100,True,False,14,22.9,7,22,6.0,0.1,10000.0 +125,-1558.9599999999864,425,0.7317235184184532,12,50,56,1.6,7,5,True,0,14,2.4,4.74,96,200,True,True,14,21.8,7,21,8.0,0.1,10000.0 +126,-6253.87000000003,1327,0.6200020173001719,11,38,32,0.9,10,3,True,0,20,2.36,7.23,64,100,False,False,14,22.0,8,21,6.0,0.1,10000.0 +127,-1636.25,326,0.6483859599358768,11,44,64,1.1,8,5,True,1,20,2.37,5.58,96,200,True,True,14,19.8,8,21,8.0,0.1,10000.0 +128,-4860.2199999999775,1271,0.6799893071226151,10,50,32,1.6,7,3,True,0,20,2.35,5.09,64,200,False,False,14,20.0,8,22,8.0,0.1,10000.0 +129,-1333.6899999999987,303,0.6444972224887779,11,52,40,2.0,8,3,True,1,20,2.22,7.17,48,100,True,True,14,16.4,7,22,6.0,0.1,10000.0 +130,-3038.9799999999923,672,0.6879221268673194,9,40,72,0.8,7,5,True,0,20,2.79,4.55,96,100,True,True,14,21.8,8,21,8.0,0.1,10000.0 +131,-169.19000000000233,105,0.8989813952377541,9,40,32,1.5,7,3,False,1,20,2.98,5.3,96,100,True,False,14,19.7,7,21,8.0,0.1,10000.0 +132,-3090.9300000000276,857,0.746739950690602,8,38,32,1.3,9,5,True,1,14,2.84,4.75,96,200,False,False,14,23.2,7,21,6.0,0.1,10000.0 +133,-1522.9599999999973,363,0.6620788355503289,12,52,48,0.6,6,4,False,1,14,2.22,7.05,48,100,False,False,14,22.0,8,21,8.0,0.1,10000.0 +134,-1429.560000000005,441,0.7486505589411239,9,44,64,2.2,9,4,True,1,14,2.95,6.57,48,200,True,False,14,19.5,7,22,8.0,0.1,10000.0 +135,-4817.930000000019,1327,0.7364412708988752,10,38,72,1.0,9,5,True,0,20,2.52,6.54,96,100,False,False,14,22.4,7,21,8.0,0.1,10000.0 +136,-3016.809999999993,812,0.7193584187078883,9,50,72,2.1,7,5,True,0,14,2.11,7.33,96,200,True,False,14,17.1,7,22,8.0,0.1,10000.0 +137,-36.1299999999992,63,0.9591039775428429,12,50,32,0.6,8,2,False,1,20,3.04,4.54,96,200,True,True,14,23.2,7,21,8.0,0.1,10000.0 +138,-3886.629999999991,945,0.6491976900984362,9,42,48,1.1,9,3,True,0,20,2.33,5.4,48,200,True,False,14,21.8,8,21,8.0,0.1,10000.0 +139,-132.58999999999833,92,0.8983906812782587,8,42,48,0.5,9,4,False,0,20,2.53,5.79,64,200,True,True,14,23.6,7,22,8.0,0.1,10000.0 +140,-5459.679999999984,1257,0.6581030873347323,9,50,48,1.1,9,3,True,0,20,2.98,5.68,48,100,False,True,14,17.4,7,22,6.0,0.1,10000.0 +141,-3127.9200000000083,645,0.641687639396581,11,46,72,0.6,9,5,True,1,20,2.29,6.48,96,200,True,False,14,23.9,8,22,8.0,0.1,10000.0 +142,-2843.610000000008,624,0.6620732108755096,12,38,48,1.9,10,2,True,0,20,2.2,6.34,96,200,True,False,14,16.1,8,21,6.0,0.1,10000.0 +143,-5495.389999999983,1566,0.6817058429331259,11,48,56,1.4,10,3,True,0,20,2.13,5.75,48,100,False,False,14,18.8,8,22,6.0,0.1,10000.0 +144,-5397.509999999996,1314,0.6308463468731598,12,52,48,1.5,9,5,True,0,20,2.05,6.63,48,200,False,False,14,21.4,7,21,6.0,0.1,10000.0 +145,-1731.7299999999832,356,0.6687193201948204,12,42,48,1.6,9,3,True,1,14,2.22,6.47,96,100,False,True,14,23.1,8,22,8.0,0.1,10000.0 +146,-1137.2800000000007,228,0.677166807179496,8,44,40,1.1,6,2,False,0,20,2.39,5.87,80,200,False,True,14,18.5,8,22,6.0,0.1,10000.0 +147,-694.9499999999989,111,0.6020557162080913,10,48,56,1.7,8,2,False,0,20,2.14,5.42,64,200,False,False,14,20.1,8,21,8.0,0.1,10000.0 +148,-2637.9299999999903,771,0.7077976239926892,11,42,56,1.8,7,3,True,0,14,2.22,7.03,48,200,True,False,14,17.1,8,22,8.0,0.1,10000.0 +149,-1469.4099999999908,270,0.6093926940396506,11,50,72,2.2,9,3,True,1,14,2.96,5.16,48,200,True,True,14,18.3,8,22,6.0,0.1,10000.0 +150,141.59000000000196,28,1.3099538101179922,12,40,48,2.1,8,2,False,0,14,3.19,4.81,64,200,True,False,14,18.1,7,22,6.0,0.1,10000.0 +151,-3149.8400000000347,958,0.747135664191949,9,44,72,1.7,8,5,True,1,14,2.94,6.94,48,200,False,False,14,20.8,7,22,8.0,0.1,10000.0 +152,-2402.5500000000075,673,0.7379120231788946,10,46,64,2.5,6,3,True,0,20,3.04,4.88,64,100,True,True,14,18.6,7,22,8.0,0.1,10000.0 +153,-351.95000000000255,112,0.7817973278774916,9,46,72,1.3,9,2,False,0,20,2.62,5.33,80,200,True,False,14,20.7,7,22,8.0,0.1,10000.0 +154,-4752.36000000001,1149,0.7026928283831768,8,50,40,2.4,7,5,True,0,20,2.41,6.23,96,200,False,False,14,16.4,8,21,6.0,0.1,10000.0 +155,-3006.3800000000174,482,0.5401921588660119,9,52,56,0.5,9,3,False,0,20,2.19,7.3,80,100,False,False,14,18.0,8,21,6.0,0.1,10000.0 +156,-575.8499999999931,51,0.3923838264466298,11,46,72,1.9,7,5,False,0,14,2.0,5.93,64,100,False,True,14,19.6,7,22,6.0,0.1,10000.0 +157,-363.78999999999905,57,0.5942198723954848,11,42,56,0.6,9,2,False,0,14,2.38,7.14,64,200,True,True,14,23.9,7,21,6.0,0.1,10000.0 +158,-1324.0299999999897,274,0.656782538818467,12,42,56,1.2,7,3,True,1,20,3.03,4.76,48,100,True,True,14,21.8,8,22,8.0,0.1,10000.0 +159,-228.94000000000233,54,0.7021918699186993,9,44,48,1.8,7,4,False,0,20,2.25,6.32,64,200,True,True,14,16.4,7,22,8.0,0.1,10000.0 +160,-4984.9199999999955,1105,0.6897100345090306,8,44,56,1.8,6,2,True,0,14,2.46,7.02,96,200,False,True,14,17.4,8,21,6.0,0.1,10000.0 +161,-3057.75999999998,789,0.7316932990889315,12,40,32,1.0,6,2,True,1,20,2.75,6.0,96,200,False,False,14,16.7,7,22,6.0,0.1,10000.0 +162,-2251.359999999985,471,0.6516939109555768,10,40,64,2.3,7,4,True,1,14,2.37,5.81,64,100,True,False,14,23.4,7,22,6.0,0.1,10000.0 +163,-3260.910000000009,806,0.6961782246666115,10,42,32,0.5,7,2,True,0,20,2.63,6.85,80,100,True,False,14,22.0,8,21,6.0,0.1,10000.0 +164,-4121.870000000005,816,0.578736455673951,10,50,48,1.5,8,2,True,0,20,2.07,7.08,64,200,True,False,14,22.2,7,21,6.0,0.1,10000.0 +165,-3221.1500000000015,885,0.7510495466391321,8,38,40,0.6,8,5,True,0,14,2.66,7.24,96,100,True,False,14,19.3,8,22,6.0,0.1,10000.0 +166,-1630.2399999999943,325,0.6823958246069983,12,48,32,1.5,6,3,True,1,14,3.14,4.71,96,200,True,False,14,16.7,8,21,8.0,0.1,10000.0 +167,-2790.7099999999964,752,0.7329492225440688,9,46,64,2.1,10,3,True,0,20,3.2,6.83,64,100,True,False,14,16.2,8,21,8.0,0.1,10000.0 +168,-382.0399999999954,65,0.633306138119691,8,50,72,2.0,6,3,False,0,20,2.59,4.68,64,200,True,False,14,23.4,8,22,8.0,0.1,10000.0 +169,-1227.9199999999964,255,0.6692729726162805,8,40,64,0.8,9,2,False,1,14,2.52,7.39,64,200,True,False,14,23.4,8,22,8.0,0.1,10000.0 +170,-628.8700000000081,139,0.6799252834951851,11,46,40,0.6,7,3,False,0,14,2.13,5.85,80,200,True,True,14,18.9,7,22,8.0,0.1,10000.0 +171,-5665.46999999999,1377,0.6590779440224142,11,46,32,0.7,8,2,True,0,14,2.11,5.24,80,200,False,False,14,21.4,8,21,6.0,0.1,10000.0 +172,-3559.5699999999915,886,0.6647206814150873,11,52,64,2.0,7,2,True,0,14,2.15,4.69,64,100,True,False,14,19.0,7,22,6.0,0.1,10000.0 +173,-6671.11999999999,1533,0.6268167950119321,8,40,40,2.3,9,3,True,0,14,2.05,5.88,64,200,False,False,14,20.0,8,22,6.0,0.1,10000.0 +174,-2615.8899999999812,492,0.6552555314968153,10,44,40,1.0,9,3,True,1,14,2.78,6.0,96,100,True,False,14,19.1,8,21,6.0,0.1,10000.0 +175,46.11000000000422,24,1.1045530814929028,12,38,56,2.1,8,5,False,0,20,3.1,6.01,96,200,True,False,14,18.6,7,21,8.0,0.1,10000.0 +176,-6218.1600000000235,1734,0.6995981056519804,8,52,64,1.2,10,3,True,0,14,2.79,5.3,48,100,False,False,14,18.8,7,21,6.0,0.1,10000.0 +177,-500.40999999999076,57,0.5690727153732218,12,48,72,1.9,10,2,False,1,20,3.14,6.19,64,200,False,False,14,17.4,7,21,6.0,0.1,10000.0 +178,-120.31000000000313,91,0.9036749399519616,9,44,32,1.6,6,4,False,0,14,2.41,5.03,80,100,True,False,14,20.7,7,21,8.0,0.1,10000.0 +179,-5774.899999999999,1554,0.7023756759152557,8,48,72,2.4,9,2,True,0,20,2.16,4.97,96,200,False,False,14,17.4,8,21,6.0,0.1,10000.0 +180,-635.8299999999981,70,0.5268101003936861,11,46,72,1.9,7,3,False,0,20,3.02,6.81,48,100,False,False,14,23.4,7,21,8.0,0.1,10000.0 +181,-2954.75,612,0.6717148710746887,9,48,72,0.7,8,4,True,1,14,2.99,6.51,80,200,True,False,14,17.7,7,22,8.0,0.1,10000.0 +182,-4183.219999999991,922,0.6686083311746079,8,38,32,1.3,9,3,True,0,20,2.42,5.63,96,100,True,False,14,16.6,7,22,6.0,0.1,10000.0 +183,-1176.3899999999976,400,0.7651719305810069,10,46,32,0.6,7,5,True,1,14,2.66,7.19,48,200,False,True,14,23.1,7,22,6.0,0.1,10000.0 +184,-2388.1600000000026,499,0.6298935472822709,12,50,40,0.6,8,3,True,0,20,2.79,5.39,48,100,True,True,14,20.4,8,21,6.0,0.1,10000.0 +185,-3347.5699999999997,992,0.7048175241696265,10,38,56,0.7,10,5,True,0,14,2.25,6.41,48,200,True,False,14,22.3,8,22,8.0,0.1,10000.0 +186,-6734.939999999977,1546,0.6400352752538749,8,50,40,1.2,9,4,True,0,14,2.32,5.9,64,200,False,False,14,17.2,7,21,8.0,0.1,10000.0 +187,-651.6100000000024,88,0.5636471998446404,12,50,64,1.0,6,5,False,0,20,2.69,5.21,80,100,True,True,14,16.3,7,21,8.0,0.1,10000.0 +188,-2149.980000000013,461,0.6234737409895552,9,42,40,2.1,7,2,True,0,20,2.24,6.97,64,200,True,True,14,23.3,7,21,8.0,0.1,10000.0 +189,-3468.479999999994,1007,0.6904798237371264,12,50,64,1.2,8,5,True,1,20,2.14,4.95,48,100,False,False,14,22.3,8,22,8.0,0.1,10000.0 +190,-2279.2400000000334,693,0.7790007892690438,11,52,64,1.7,6,3,True,0,14,2.74,6.54,96,100,True,False,14,21.5,7,22,8.0,0.1,10000.0 +191,-2417.8499999999894,666,0.7473186208885781,10,38,48,2.1,8,4,True,0,14,3.17,5.18,80,200,True,False,14,21.8,7,21,8.0,0.1,10000.0 +192,-2048.3999999999696,745,0.7877593818870184,9,50,72,1.5,10,4,True,1,14,2.08,6.63,96,100,False,True,14,16.2,7,21,6.0,0.1,10000.0 +193,-4835.550000000008,1103,0.643435197754819,9,38,56,0.6,8,3,True,0,20,2.61,6.41,48,100,True,False,14,19.9,8,21,8.0,0.1,10000.0 +194,-6486.449999999988,1522,0.6278774249252048,12,48,48,0.8,8,2,True,0,20,2.06,7.06,64,100,False,False,14,21.4,8,22,6.0,0.1,10000.0 +195,-2725.4000000000133,698,0.7192607288466966,8,52,40,1.8,10,2,True,0,20,2.86,6.63,80,200,True,False,14,19.7,7,22,8.0,0.1,10000.0 +196,-638.310000000005,108,0.5829701883562762,12,50,64,0.7,10,4,False,1,20,2.36,4.82,48,200,True,True,14,18.6,8,22,8.0,0.1,10000.0 +197,-239.920000000011,54,0.7357272677204383,9,42,64,2.0,6,5,False,0,14,2.87,6.47,80,200,True,False,14,19.1,7,21,8.0,0.1,10000.0 +198,-1589.71000000001,241,0.5904128824476651,9,52,72,1.2,8,3,False,1,14,2.35,5.91,80,100,False,False,14,21.2,7,22,6.0,0.1,10000.0 +199,-3052.4199999999873,732,0.6319853778925019,10,50,48,1.2,10,4,True,0,20,2.06,6.4,48,200,True,True,14,17.0,8,22,8.0,0.1,10000.0 +200,-17.309999999994034,23,0.9566751764529209,8,42,40,2.5,8,5,False,0,14,2.38,6.65,48,200,True,True,14,23.9,8,21,6.0,0.1,10000.0 +201,-2344.350000000013,569,0.7278849580223067,11,46,40,2.0,7,3,True,0,14,2.74,6.4,96,200,True,False,14,16.0,7,22,6.0,0.1,10000.0 +202,35.93000000000211,64,1.0398867673179397,10,44,32,1.9,7,3,False,0,20,2.15,5.65,80,100,True,False,14,18.4,8,22,8.0,0.1,10000.0 +203,-5592.499999999981,1297,0.6309316558679392,11,42,48,2.5,9,4,True,0,20,2.02,5.17,64,100,False,False,14,20.7,7,21,8.0,0.1,10000.0 +204,-1033.4699999999975,203,0.655916019097465,8,50,72,1.0,10,2,False,0,14,2.78,4.56,48,200,True,False,14,17.0,8,22,6.0,0.1,10000.0 +205,-267.8600000000042,118,0.8483848509376184,9,38,48,1.3,6,4,False,1,14,2.5,7.2,48,200,True,False,14,20.0,7,22,6.0,0.1,10000.0 +206,-2573.9200000000274,608,0.6443594540595958,10,50,48,0.8,10,5,True,1,20,2.4,4.51,48,100,False,True,14,20.0,7,21,6.0,0.1,10000.0 +207,-3695.1000000000167,1041,0.7521904896033479,10,44,56,2.5,8,4,True,0,14,2.98,7.12,80,200,False,False,14,19.4,7,21,6.0,0.1,10000.0 +208,-2956.7999999999874,549,0.6494713855885889,8,42,72,1.8,8,4,True,1,20,3.05,4.78,80,100,True,False,14,19.2,8,22,8.0,0.1,10000.0 +209,-1410.8399999999892,677,0.8428521941368643,11,50,72,2.3,7,2,True,1,14,3.18,7.03,48,200,False,False,14,22.4,8,21,8.0,0.1,10000.0 +210,-4346.540000000009,1110,0.7030055845232246,10,38,72,2.3,7,5,True,0,20,2.53,4.69,80,100,False,True,14,20.2,7,22,6.0,0.1,10000.0 +211,-179.11999999999534,89,0.8666090764212628,11,44,56,1.2,9,3,False,1,14,2.01,7.3,96,200,True,False,14,22.0,8,21,8.0,0.1,10000.0 +212,-3166.8600000000297,932,0.7119910510472275,10,38,64,0.9,9,5,True,0,20,2.53,6.22,48,200,True,False,14,16.9,8,21,6.0,0.1,10000.0 +213,-37.569999999988795,55,0.9587405829251685,11,50,32,1.6,6,2,False,1,20,3.07,6.19,96,200,True,False,14,22.5,8,22,8.0,0.1,10000.0 +214,-3509.960000000012,793,0.6447110435390827,10,52,32,0.7,7,2,True,0,20,2.66,5.62,48,100,True,False,14,17.1,8,21,8.0,0.1,10000.0 +215,-2670.6900000000023,540,0.5759698968777537,12,44,40,0.7,9,3,True,0,20,2.13,5.74,48,200,True,True,14,20.7,7,22,6.0,0.1,10000.0 +216,91.38000000000466,36,1.1284383037935541,12,38,64,2.4,10,5,False,0,14,2.88,4.89,96,200,False,False,14,19.3,7,22,8.0,0.1,10000.0 +217,317.44999999999345,57,1.3491415813380554,10,46,56,2.1,7,5,False,1,20,3.01,6.14,80,100,True,False,14,21.0,8,22,6.0,0.1,10000.0 +218,-984.9300000000112,172,0.6111698893828018,9,48,72,0.7,8,5,False,1,20,2.81,7.18,80,200,True,True,14,16.9,8,21,6.0,0.1,10000.0 +219,-998.4200000000001,138,0.6266332597883401,8,44,48,2.0,7,4,False,0,14,3.01,6.57,80,100,False,False,14,18.9,8,21,6.0,0.1,10000.0 +220,-1684.3000000000065,454,0.7460554387075861,12,50,40,1.5,8,2,True,0,20,3.15,7.43,80,100,True,True,14,18.0,8,21,8.0,0.1,10000.0 +221,-1436.3099999999922,389,0.6965719609346779,12,44,72,2.4,8,5,True,1,14,2.22,5.02,48,200,True,False,14,18.2,8,21,6.0,0.1,10000.0 +222,-3821.4500000000053,740,0.6492100122638115,12,46,32,1.2,7,2,True,0,14,2.93,6.38,80,200,False,True,14,18.9,8,21,6.0,0.1,10000.0 +223,-3395.0899999999974,693,0.6647073056316816,12,40,64,0.8,10,5,True,0,14,3.06,6.49,80,200,True,False,14,23.6,8,21,6.0,0.1,10000.0 +224,-527.8400000000074,164,0.7437620147964037,10,52,40,2.3,10,3,True,1,20,2.46,6.89,48,200,True,True,14,21.8,7,22,8.0,0.1,10000.0 +225,-160.3299999999981,18,0.5595692662692636,11,38,48,2.3,7,4,False,0,14,2.2,7.37,48,100,True,True,14,21.0,7,22,6.0,0.1,10000.0 +226,-6515.539999999971,1787,0.6717707996441413,9,50,72,2.1,6,3,True,0,20,2.05,4.72,64,200,False,False,14,20.6,7,22,8.0,0.1,10000.0 +227,-2835.099999999993,988,0.7636199309310961,11,52,72,1.3,8,2,True,1,14,2.64,6.42,48,100,False,False,14,18.9,7,22,8.0,0.1,10000.0 +228,-2234.25000000002,708,0.7601892082192017,12,40,48,2.0,9,5,True,1,14,2.57,6.1,64,200,False,False,14,23.7,7,22,8.0,0.1,10000.0 +229,-289.09999999999854,98,0.8057750188111362,8,42,32,0.6,10,5,False,1,14,2.37,6.74,80,100,True,True,14,22.8,7,21,6.0,0.1,10000.0 +230,-778.5299999999988,227,0.7329255616580275,9,46,40,0.7,10,2,False,0,14,2.35,4.7,48,100,False,True,14,19.9,8,22,6.0,0.1,10000.0 +231,-3233.7799999999843,801,0.6905230841080352,9,40,48,1.7,7,4,True,0,20,2.74,5.42,64,200,True,False,14,17.3,8,21,6.0,0.1,10000.0 +232,-4554.130000000001,1149,0.6805607772939487,11,46,48,0.8,8,5,True,0,20,2.93,5.96,48,100,False,True,14,16.7,8,21,6.0,0.1,10000.0 +233,-1140.149999999987,211,0.6204320512948556,10,40,72,0.7,6,2,False,1,20,2.92,5.14,48,200,False,True,14,19.8,7,22,8.0,0.1,10000.0 +234,-3766.269999999973,812,0.6603218323628939,9,46,40,1.4,10,2,True,0,14,2.8,7.04,64,100,True,False,14,17.4,7,22,8.0,0.1,10000.0 +235,-3559.21,798,0.6950859388854288,8,44,56,1.0,8,4,True,0,14,2.62,6.87,96,200,True,False,14,16.3,8,21,8.0,0.1,10000.0 +236,-0.4500000000007276,57,0.9994923743344463,10,42,56,1.8,8,2,False,0,20,3.17,5.17,96,200,True,False,14,22.3,7,21,8.0,0.1,10000.0 +237,-3299.910000000018,788,0.6563749904979886,9,44,32,1.5,8,3,True,0,14,2.43,6.65,48,100,True,False,14,21.8,8,22,8.0,0.1,10000.0 +238,-4469.5499999999765,978,0.6255952754916128,9,42,72,2.2,6,3,True,0,14,2.16,6.04,64,100,True,False,14,23.4,8,21,8.0,0.1,10000.0 +239,-2619.740000000009,554,0.654756335256962,8,44,56,1.7,9,5,True,0,20,2.72,6.88,64,200,True,True,14,21.5,8,21,6.0,0.1,10000.0 +240,-2008.5899999999847,653,0.7341387128839991,11,50,40,0.7,7,5,True,1,14,2.21,7.2,48,100,True,False,14,21.3,7,22,8.0,0.1,10000.0 +241,-2685.2300000000123,594,0.6596916829941526,10,38,72,1.6,7,5,True,0,14,2.51,5.26,64,100,True,True,14,23.0,8,22,6.0,0.1,10000.0 +242,-2571.0500000000047,611,0.7104141863878166,8,38,64,1.5,10,2,True,1,14,2.83,5.45,80,100,True,False,14,21.2,8,22,8.0,0.1,10000.0 +243,-2176.270000000004,331,0.5324384306833586,12,48,64,1.1,9,3,True,1,20,2.21,6.18,96,200,True,True,14,18.8,8,21,6.0,0.1,10000.0 +244,-188.75999999999658,37,0.6828948694688035,9,52,72,2.4,6,3,False,0,20,2.96,6.34,48,100,True,True,14,16.0,7,21,8.0,0.1,10000.0 +245,-1857.779999999978,631,0.8069431786652146,12,50,32,0.6,7,4,True,1,14,2.87,7.29,96,200,False,True,14,16.5,7,22,8.0,0.1,10000.0 +246,-5071.509999999997,1293,0.7201996528639826,8,44,72,2.4,10,4,True,0,14,2.74,6.52,80,100,False,False,14,23.8,7,22,8.0,0.1,10000.0 +247,85.18999999999687,70,1.073223771294975,10,50,56,1.7,10,2,False,1,14,3.1,6.15,80,200,True,False,14,20.9,7,22,8.0,0.1,10000.0 +248,-1047.869999999999,203,0.6696042326173871,12,38,48,0.9,10,2,False,0,20,2.41,4.85,80,200,False,False,14,23.7,8,21,8.0,0.1,10000.0 +249,-2677.0599999999886,650,0.6992888458544464,11,52,64,2.2,9,2,True,0,20,2.76,7.48,64,200,True,False,14,20.1,7,22,6.0,0.1,10000.0 +250,-241.84000000000378,43,0.6512107532774709,10,40,56,1.8,8,2,False,0,20,2.38,5.16,80,100,False,True,14,23.4,7,22,6.0,0.1,10000.0 +251,-1403.1900000000041,361,0.7205107010188126,9,44,48,0.9,7,3,False,0,14,2.93,4.86,48,200,False,False,14,22.1,7,22,8.0,0.1,10000.0 +252,-4426.529999999996,1119,0.6827510632228805,12,48,56,2.3,10,4,True,0,20,2.48,6.75,64,100,False,False,14,19.8,7,22,8.0,0.1,10000.0 +253,-0.9699999999975262,26,0.9975744542522067,9,52,32,1.9,9,4,False,0,14,2.81,5.64,48,200,True,True,14,22.9,7,22,6.0,0.1,10000.0 +254,-3096.6399999999785,748,0.7140860168392168,10,52,64,1.2,7,5,True,0,20,2.84,5.62,96,200,True,False,14,20.6,7,21,8.0,0.1,10000.0 +255,-3595.2099999999837,832,0.6857160840151162,9,50,56,0.9,7,5,True,0,20,2.6,7.49,80,200,True,False,14,20.5,7,22,6.0,0.1,10000.0 +256,-1911.6900000000169,444,0.676803692338904,9,38,40,2.1,9,2,True,1,20,2.31,5.58,80,200,True,False,14,17.0,7,21,8.0,0.1,10000.0 +257,-1387.8600000000006,278,0.6395290548630825,10,48,72,1.5,9,2,True,1,20,2.56,7.37,64,200,True,True,14,20.9,8,21,6.0,0.1,10000.0 +258,-769.8300000000017,135,0.595137420718816,9,48,40,1.1,8,4,False,1,20,2.33,5.83,80,200,True,False,14,17.5,7,21,6.0,0.1,10000.0 +259,-3963.6199999999826,850,0.5948768058022801,10,40,40,0.8,6,2,True,0,14,2.03,5.69,48,100,True,True,14,17.2,8,22,6.0,0.1,10000.0 +260,-4158.29999999999,1156,0.7554738044190304,9,46,56,1.8,7,3,True,0,20,3.03,5.48,96,200,False,False,14,20.4,7,21,8.0,0.1,10000.0 +261,-2730.770000000003,610,0.6902280322435006,12,50,64,1.8,10,4,True,0,14,2.97,5.83,80,200,True,False,14,18.4,7,21,8.0,0.1,10000.0 +262,-3133.2799999999943,880,0.7155354772639374,10,52,64,0.5,9,5,True,0,20,2.96,6.29,48,200,True,False,14,23.1,8,22,6.0,0.1,10000.0 +263,-1151.329999999998,173,0.5487634724671762,9,50,56,0.9,6,5,False,0,20,2.34,6.73,80,200,True,False,14,17.5,8,21,8.0,0.1,10000.0 +264,-3205.670000000001,701,0.6239740625656149,12,52,48,1.9,9,3,True,0,14,2.06,6.1,64,100,True,False,14,17.0,8,21,6.0,0.1,10000.0 +265,-3447.889999999985,779,0.6740739690417109,8,42,32,1.5,8,5,True,0,20,2.56,6.87,80,100,True,False,14,18.1,8,21,8.0,0.1,10000.0 +266,199.62000000000444,28,1.678541078894592,9,44,48,2.1,6,2,False,0,20,2.93,5.83,48,100,True,True,14,22.2,7,22,8.0,0.1,10000.0 +267,-2847.419999999991,576,0.6105543755222957,10,48,40,1.8,6,2,True,0,20,2.24,7.16,64,100,True,True,14,19.5,7,21,8.0,0.1,10000.0 +268,126.81999999999971,29,1.2890681983953318,12,40,56,2.1,6,2,False,1,20,2.83,4.96,48,100,True,False,14,16.7,8,21,6.0,0.1,10000.0 +269,-4227.479999999986,1155,0.7461726070463178,10,42,72,1.6,6,3,True,0,20,3.18,6.87,80,200,False,False,14,16.2,8,22,6.0,0.1,10000.0 +270,-573.4100000000035,88,0.6030556017057097,10,38,56,1.9,10,4,False,1,20,2.23,5.06,80,200,False,False,14,18.2,7,21,6.0,0.1,10000.0 +271,-247.25000000000546,58,0.7582687250080659,11,46,48,1.6,9,2,False,1,20,2.88,7.15,80,100,True,True,14,16.5,8,21,8.0,0.1,10000.0 +272,-3609.449999999987,915,0.6667306838232646,12,42,64,1.1,9,4,True,0,14,2.05,7.31,64,100,True,False,14,19.9,7,21,8.0,0.1,10000.0 +273,-1446.6799999999985,388,0.7660316695319438,11,46,32,1.2,10,2,True,0,20,3.11,7.0,96,100,True,True,14,21.9,8,22,6.0,0.1,10000.0 +274,-2869.3599999999933,615,0.6494898756938473,12,46,64,0.6,6,4,True,0,14,2.12,5.19,96,100,True,True,14,21.3,7,22,6.0,0.1,10000.0 +275,-1590.5299999999934,417,0.7374084744223672,12,48,72,1.4,9,2,True,0,20,2.61,6.47,96,200,True,True,14,23.9,8,22,8.0,0.1,10000.0 +276,-3715.0700000000215,939,0.7066809941550479,11,48,64,1.0,10,3,True,1,20,2.43,5.86,96,100,False,False,14,23.9,7,21,8.0,0.1,10000.0 +277,-816.060000000005,213,0.7106919130863287,8,46,40,0.9,8,2,False,0,14,2.11,5.88,64,100,True,False,14,23.1,7,21,8.0,0.1,10000.0 +278,-117.85000000000218,39,0.7576200074040558,10,40,64,1.3,7,2,False,0,20,2.21,6.98,48,200,True,True,14,22.5,8,21,6.0,0.1,10000.0 +279,-1153.9399999999969,196,0.6152083951621778,10,48,56,1.3,6,3,False,1,14,2.76,6.4,48,200,False,False,14,18.6,7,22,6.0,0.1,10000.0 +280,173.4000000000051,63,1.1823420543450827,9,38,72,2.0,9,5,False,1,14,2.27,5.37,96,100,True,False,14,16.7,7,22,8.0,0.1,10000.0 +281,-2221.480000000025,555,0.7050031073551362,8,50,64,1.4,7,3,True,1,14,2.59,6.46,64,100,True,False,14,18.1,8,22,6.0,0.1,10000.0 +282,-3723.909999999989,896,0.7050571564573371,8,50,56,1.2,7,4,True,1,14,2.92,5.01,80,200,False,False,14,19.5,7,21,8.0,0.1,10000.0 +283,-2840.61999999999,669,0.7062282563281583,9,40,32,2.0,7,3,True,0,20,2.83,4.83,96,200,True,False,14,17.7,7,21,8.0,0.1,10000.0 +284,-2069.3200000000015,384,0.5816809016020619,12,52,64,2.0,7,2,True,1,14,2.31,4.68,64,200,True,False,14,21.2,7,21,8.0,0.1,10000.0 +285,-1224.4199999999964,190,0.5729904478923635,10,48,32,0.5,9,3,True,1,14,3.08,5.95,48,100,True,True,14,23.7,7,21,6.0,0.1,10000.0 +286,-3805.320000000007,814,0.6585726936752883,12,46,48,1.5,7,2,True,1,20,2.43,5.41,80,100,False,False,14,23.0,7,22,6.0,0.1,10000.0 +287,-475.15000000000146,127,0.7816315932184695,9,48,56,1.8,6,5,False,1,14,2.5,6.22,96,200,False,False,14,19.6,7,21,6.0,0.1,10000.0 +288,-2813.0999999999913,782,0.6987041418407205,12,44,40,1.1,10,3,True,0,14,2.38,6.17,48,100,True,False,14,21.8,8,22,8.0,0.1,10000.0 +289,-4597.659999999992,1273,0.7171182567584695,10,52,72,2.4,8,3,True,0,14,2.22,6.79,80,100,False,False,14,17.8,7,22,6.0,0.1,10000.0 +290,-2761.2399999999943,754,0.7141688896618046,11,42,64,2.2,9,4,True,0,20,2.57,4.99,64,100,True,False,14,23.4,8,21,6.0,0.1,10000.0 +291,-353.27000000000044,65,0.7094030452343152,9,40,40,2.4,9,5,False,0,20,3.07,5.78,48,200,False,False,14,19.2,7,21,8.0,0.1,10000.0 +292,-108.65000000000327,69,0.8962520888040105,11,38,40,1.5,9,2,False,0,14,2.23,5.82,80,200,True,False,14,19.4,7,21,8.0,0.1,10000.0 +293,-3595.329999999978,863,0.6732528127669629,11,40,72,1.5,7,3,True,0,20,2.54,5.04,64,200,True,False,14,18.6,7,21,6.0,0.1,10000.0 +294,-864.970000000003,94,0.4377214251818531,8,52,72,1.2,10,5,False,1,14,2.45,5.64,64,200,False,True,14,22.9,7,21,6.0,0.1,10000.0 +295,-1152.880000000001,164,0.5621071183041565,8,50,48,1.1,9,4,False,0,14,3.08,7.38,48,200,True,False,14,20.0,8,21,8.0,0.1,10000.0 +296,-3651.0,910,0.6764863815918891,9,44,64,1.8,9,5,True,0,14,2.29,6.14,64,100,True,False,14,16.4,8,21,6.0,0.1,10000.0 +297,-5196.88,1063,0.6348677392542754,8,46,48,2.3,6,2,True,0,14,2.81,6.33,64,200,False,True,14,18.9,7,21,8.0,0.1,10000.0 +298,-4981.6300000000065,1269,0.6868969002250713,10,48,56,2.1,9,2,True,0,14,2.15,7.08,80,200,False,False,14,21.6,7,21,6.0,0.1,10000.0 +299,-196.46999999999753,53,0.8091171412748841,11,46,56,1.7,8,4,False,1,20,3.11,6.34,96,200,True,False,14,23.1,7,22,6.0,0.1,10000.0 +300,-1235.6599999999908,255,0.6568116360646904,8,40,32,1.4,6,3,False,0,20,2.05,5.55,64,100,False,False,14,21.5,8,21,8.0,0.1,10000.0 +301,-2292.650000000014,475,0.6598225109317064,10,48,32,0.7,8,4,True,1,14,3.0,5.08,80,200,True,False,14,21.2,8,21,8.0,0.1,10000.0 +302,-311.40999999999985,32,0.5272713472485768,12,48,56,2.1,9,2,False,0,20,2.67,4.56,80,200,True,False,14,18.2,7,22,8.0,0.1,10000.0 +303,-1700.0099999999893,430,0.6888816091680561,12,42,64,1.7,7,2,True,1,20,2.85,5.31,48,200,True,False,14,19.6,8,21,8.0,0.1,10000.0 +304,-1452.5900000000092,435,0.7677457625221648,9,40,48,2.1,7,2,True,1,14,2.96,7.21,64,100,True,False,14,21.9,8,22,6.0,0.1,10000.0 +305,-159.7699999999968,76,0.8467375247011876,8,42,40,1.9,9,5,False,1,14,2.0,7.3,48,200,True,False,14,16.8,8,21,8.0,0.1,10000.0 +306,-2608.660000000006,639,0.6607666969662687,9,48,40,0.9,8,4,True,1,14,2.33,4.97,48,100,False,True,14,20.1,7,22,8.0,0.1,10000.0 +307,-3167.2499999999845,802,0.7288020796764034,10,42,72,2.1,10,3,True,0,20,2.74,5.52,96,100,True,False,14,19.8,7,21,8.0,0.1,10000.0 +308,-1509.6700000000055,277,0.6260712551890858,8,40,56,1.3,10,5,False,0,20,2.4,5.09,48,200,False,False,14,16.7,8,21,8.0,0.1,10000.0 +309,-819.4699999999993,147,0.6263604488398283,10,52,56,1.0,7,3,False,0,20,2.47,6.6,80,200,True,False,14,16.2,8,21,8.0,0.1,10000.0 +310,-487.96000000000276,72,0.5938641830424397,11,52,40,1.1,8,3,False,0,20,2.98,6.89,80,100,True,True,14,19.7,8,21,6.0,0.1,10000.0 +311,-26.810000000008586,46,0.9643853449879115,12,42,56,1.3,8,3,False,1,20,2.94,5.81,80,100,True,True,14,21.4,8,21,8.0,0.1,10000.0 +312,-383.9500000000007,177,0.8255858851533364,10,40,56,0.9,9,2,False,0,20,2.39,6.43,48,100,True,False,14,23.1,7,21,6.0,0.1,10000.0 +313,-2990.0899999999983,821,0.7271126005386398,11,46,56,1.7,9,3,True,1,20,2.36,6.88,80,200,False,False,14,23.9,7,22,6.0,0.1,10000.0 +314,47.61000000000058,26,1.1290978605710567,10,38,48,2.3,6,2,False,1,20,2.13,5.35,48,100,True,True,14,20.7,8,22,8.0,0.1,10000.0 +315,-2512.059999999992,653,0.7396556530787161,11,50,64,0.9,7,5,True,0,20,3.01,5.58,96,100,True,True,14,17.0,7,21,6.0,0.1,10000.0 +316,-1228.419999999991,313,0.754520239161018,9,52,72,1.4,7,2,True,1,20,3.03,7.18,96,100,True,True,14,19.4,8,22,8.0,0.1,10000.0 +317,40.56000000000131,56,1.055260361317747,9,42,56,1.7,10,5,False,0,20,2.49,6.14,80,100,True,True,14,19.9,8,21,8.0,0.1,10000.0 +318,-604.4599999999991,147,0.7256034173600804,8,42,72,2.0,8,5,False,0,14,2.29,6.39,48,200,False,False,14,23.2,7,22,8.0,0.1,10000.0 +319,-2360.3800000000037,508,0.6354974504371782,12,52,64,2.0,9,4,True,0,14,2.04,7.27,80,200,True,True,14,19.8,7,21,8.0,0.1,10000.0 +320,-4774.400000000008,1150,0.7003961542974865,12,38,48,1.5,7,2,True,0,14,2.74,5.33,80,100,False,False,14,20.8,7,22,8.0,0.1,10000.0 +321,-3095.399999999995,816,0.737971748624212,9,46,72,1.0,7,2,True,0,14,2.71,6.97,96,200,True,False,14,21.3,7,21,8.0,0.1,10000.0 +322,-5118.230000000012,1038,0.6325124949470944,8,46,32,0.6,9,5,True,0,20,2.9,6.76,64,200,False,True,14,19.1,8,21,8.0,0.1,10000.0 +323,-2414.7099999999928,520,0.6983158631201509,8,46,56,1.3,8,2,True,1,20,3.15,5.8,80,200,True,False,14,22.4,8,22,8.0,0.1,10000.0 +324,-621.8099999999868,269,0.8306732929402955,9,44,64,1.2,7,4,False,0,14,3.0,4.54,48,100,False,False,14,18.8,8,22,6.0,0.1,10000.0 +325,-822.390000000003,228,0.7359361152853233,8,38,64,0.7,10,3,False,1,14,2.85,4.86,64,200,False,True,14,20.5,7,21,6.0,0.1,10000.0 +326,-2834.3999999999996,838,0.7372682535253828,10,46,56,1.8,6,5,True,0,20,2.31,6.84,80,100,True,False,14,18.7,7,22,8.0,0.1,10000.0 +327,-1918.16999999999,622,0.7614406315915151,9,52,32,1.5,7,5,True,1,20,2.13,6.12,96,100,False,True,14,16.8,8,22,6.0,0.1,10000.0 +328,-3195.7900000000063,813,0.6834096132509114,8,40,32,1.6,8,5,True,0,14,2.78,4.5,48,200,True,False,14,21.6,8,21,8.0,0.1,10000.0 +329,-5014.999999999987,1266,0.678488131307627,11,50,56,2.2,6,3,True,0,20,2.15,6.11,80,200,False,False,14,19.2,7,22,8.0,0.1,10000.0 +330,-2077.219999999984,445,0.6231308216220531,8,52,48,1.8,7,2,True,1,14,2.36,5.67,48,200,True,False,14,23.1,8,21,6.0,0.1,10000.0 +331,-3086.300000000012,605,0.677273635107877,8,44,32,1.9,10,3,True,0,14,2.95,6.43,96,200,True,False,14,18.7,8,21,8.0,0.1,10000.0 +332,-828.7499999999945,170,0.7048579578841655,8,44,72,1.8,9,3,False,1,14,3.11,4.61,64,200,False,False,14,19.8,7,21,6.0,0.1,10000.0 +333,-1877.6600000000053,342,0.6178724789873212,8,42,72,0.6,8,2,True,1,14,3.0,4.69,48,100,True,True,14,22.4,7,21,6.0,0.1,10000.0 +334,-1036.8699999999935,83,0.36719112369699486,11,48,72,1.9,8,2,False,1,14,2.39,7.39,64,100,False,False,14,18.7,7,22,6.0,0.1,10000.0 +335,-2167.7900000000045,586,0.7268007002040371,11,42,72,1.2,7,5,True,1,14,2.16,6.87,96,100,True,False,14,16.6,7,21,6.0,0.1,10000.0 +336,-5007.170000000013,1210,0.6789495653110595,12,46,56,1.9,9,3,True,0,20,2.63,5.74,64,100,False,False,14,21.7,7,22,8.0,0.1,10000.0 +337,-407.5600000000013,128,0.7847038066158837,11,38,64,1.0,6,2,False,0,14,2.56,6.38,64,200,True,False,14,16.9,7,22,8.0,0.1,10000.0 +338,-4058.310000000013,799,0.6345780860845935,9,42,72,2.3,6,4,True,0,20,2.3,6.35,96,100,True,True,14,16.4,7,21,6.0,0.1,10000.0 +339,-2614.359999999997,526,0.6089267309789397,11,40,32,2.3,9,4,True,0,20,2.28,4.83,64,100,True,True,14,19.3,7,22,6.0,0.1,10000.0 +340,-3203.969999999985,952,0.7379658632731675,8,52,64,1.5,9,3,True,1,20,2.21,5.62,96,100,False,False,14,23.8,7,22,6.0,0.1,10000.0 +341,-4759.040000000007,1087,0.6414946661574261,8,38,48,0.8,9,5,True,0,20,2.26,5.39,64,100,False,True,14,22.8,7,22,8.0,0.1,10000.0 +342,-3330.7299999999777,840,0.698488609350417,9,52,56,1.1,9,3,True,0,20,2.7,7.18,64,100,True,False,14,16.3,8,21,8.0,0.1,10000.0 +343,-1912.3500000000004,644,0.7838920562094237,12,50,56,2.1,6,5,True,0,14,2.67,4.54,96,100,True,False,14,18.4,7,21,8.0,0.1,10000.0 +344,-4420.469999999999,1172,0.740519246787506,10,42,72,1.4,10,2,True,0,14,3.05,5.72,80,200,False,True,14,16.0,7,22,8.0,0.1,10000.0 +345,-128.4200000000019,72,0.8918568421052631,12,38,48,1.4,8,3,False,0,20,2.88,4.66,80,100,True,False,14,18.9,7,22,8.0,0.1,10000.0 +346,-3352.340000000003,843,0.7014718297065958,9,40,64,1.9,7,3,True,0,14,2.78,6.71,64,100,True,False,14,23.2,8,22,6.0,0.1,10000.0 +347,-1856.8999999999878,577,0.735416111561528,8,48,48,1.4,10,2,True,1,20,2.54,5.6,48,100,True,False,14,16.6,7,22,6.0,0.1,10000.0 +348,-4316.699999999998,1002,0.6556499430829649,8,42,48,0.7,7,5,True,0,14,2.35,7.41,64,200,True,False,14,19.6,7,22,6.0,0.1,10000.0 +349,-1865.4299999999876,405,0.705235796509469,8,38,40,2.2,10,4,True,1,20,2.79,6.86,96,200,True,False,14,20.5,8,21,8.0,0.1,10000.0 +350,-2494.6799999999957,637,0.7208730911759967,9,52,48,2.4,6,3,True,0,20,3.15,6.36,64,200,True,False,14,22.7,7,21,6.0,0.1,10000.0 +351,-3506.2800000000043,933,0.7187467663674948,8,38,48,1.6,9,4,True,0,14,2.67,4.6,80,200,True,False,14,19.6,7,22,6.0,0.1,10000.0 +352,-3869.349999999996,850,0.6791831144032839,8,50,56,2.0,9,4,True,0,20,2.78,5.39,80,100,False,True,14,23.3,8,22,6.0,0.1,10000.0 +353,-4132.850000000016,1001,0.6640273470366592,11,38,40,1.9,6,4,True,0,14,2.54,4.78,48,100,False,True,14,17.8,8,21,6.0,0.1,10000.0 +354,-3517.0599999999886,921,0.6966754750307027,8,52,72,1.8,6,5,True,0,20,2.72,6.03,48,200,True,False,14,21.7,8,22,8.0,0.1,10000.0 +355,214.99000000000524,111,1.1292271257348256,10,38,48,1.2,8,5,False,0,14,2.87,5.83,96,200,True,False,14,22.4,8,22,6.0,0.1,10000.0 +356,-1613.939999999995,328,0.6188602695471259,12,40,40,0.9,9,4,True,1,20,2.11,5.73,80,200,True,True,14,19.7,7,21,6.0,0.1,10000.0 +357,-1193.0300000000097,228,0.6137799086432782,11,46,64,1.5,8,4,True,1,20,2.27,6.87,64,200,True,True,14,22.7,8,21,8.0,0.1,10000.0 +358,-4067.010000000022,1073,0.7310857971068155,11,42,56,2.3,7,2,True,0,20,3.19,4.7,80,200,False,False,14,22.9,8,21,8.0,0.1,10000.0 +359,-6024.71000000002,1371,0.6619469761454938,12,38,48,0.8,6,3,True,0,14,2.43,4.66,80,200,False,False,14,16.4,8,21,6.0,0.1,10000.0 +360,-2220.2800000000016,599,0.7173475778978404,9,40,64,2.0,10,4,True,1,20,2.33,6.59,80,100,False,True,14,18.8,7,21,6.0,0.1,10000.0 +361,-2953.439999999967,698,0.6576979823067927,12,46,48,2.1,9,4,True,0,14,2.19,5.16,64,100,True,False,14,23.3,7,21,6.0,0.1,10000.0 +362,-552.6200000000008,41,0.28362349463968584,11,48,48,1.9,7,5,False,1,20,2.21,5.41,48,100,True,True,14,17.1,7,22,6.0,0.1,10000.0 +363,-3689.3199999999906,900,0.6268653848293327,9,42,32,1.3,6,2,True,0,20,2.05,4.82,48,200,True,False,14,16.3,8,21,6.0,0.1,10000.0 +364,-2810.320000000015,522,0.6607970723240721,8,44,64,2.3,7,4,True,0,14,3.02,7.33,80,200,True,True,14,22.2,7,21,6.0,0.1,10000.0 +365,-1821.7600000000011,322,0.6250843774181334,12,38,64,0.9,7,4,True,1,14,3.17,4.8,64,200,True,True,14,20.7,8,21,6.0,0.1,10000.0 +366,-4644.549999999984,1251,0.7339264855587426,10,50,56,0.9,7,5,True,0,14,2.56,6.06,96,200,False,False,14,20.5,7,21,8.0,0.1,10000.0 +367,-582.1299999999901,118,0.7153816066102773,11,40,56,1.1,10,4,False,0,14,2.66,5.37,96,100,True,False,14,23.5,8,21,6.0,0.1,10000.0 +368,-2765.8299999999826,749,0.7267538815979261,11,40,56,1.4,6,2,True,0,20,2.83,7.43,64,100,True,False,14,18.7,8,21,6.0,0.1,10000.0 +369,-890.5300000000007,75,0.4578732056542437,11,52,48,2.0,10,4,False,0,20,2.57,6.31,96,200,False,False,14,17.2,8,21,6.0,0.1,10000.0 +370,-1437.9299999999948,276,0.6340157905185623,10,52,56,1.0,7,2,True,1,14,3.0,5.99,48,100,True,True,14,21.4,7,22,6.0,0.1,10000.0 +371,-1428.130000000012,230,0.5814022334906351,8,52,56,0.9,9,5,False,0,20,2.97,6.12,48,100,True,False,14,19.1,8,22,8.0,0.1,10000.0 +372,-3554.1999999999935,828,0.6497490041960744,11,38,32,0.9,8,3,True,0,14,2.37,5.67,48,200,False,True,14,21.5,8,22,6.0,0.1,10000.0 +373,-999.7099999999955,190,0.6640951289744873,12,38,56,1.0,10,5,False,1,20,2.92,5.35,48,100,False,False,14,17.0,8,22,6.0,0.1,10000.0 +374,-2839.659999999996,759,0.6872755465348955,10,50,32,1.4,8,5,True,0,14,2.3,6.44,48,100,True,False,14,18.7,7,22,6.0,0.1,10000.0 +375,-1527.2099999999973,311,0.6718161735632381,11,50,64,1.5,9,4,True,1,20,2.71,7.46,96,200,True,True,14,16.8,8,21,6.0,0.1,10000.0 +376,-25.479999999999563,43,0.9554054290564783,10,52,64,2.1,8,3,False,0,20,3.16,5.11,48,100,True,False,14,16.4,8,21,6.0,0.1,10000.0 +377,-2511.8099999999977,515,0.6679761802475828,12,40,64,1.2,6,5,True,0,20,2.95,6.45,80,200,True,True,14,20.3,7,22,8.0,0.1,10000.0 +378,-49.340000000000146,44,0.9357058156656808,10,52,72,2.0,7,2,False,1,14,2.69,5.14,96,200,False,True,14,22.5,8,21,6.0,0.1,10000.0 +379,-4743.750000000006,1161,0.7061698296574753,10,52,40,1.0,8,5,True,0,14,2.76,7.04,80,200,False,False,14,18.1,7,22,6.0,0.1,10000.0 +380,-3461.960000000018,719,0.6311413228775997,8,42,40,0.6,8,5,True,1,20,2.51,7.22,64,100,True,False,14,16.2,8,21,6.0,0.1,10000.0 +381,35.04999999999745,17,1.1118771745028566,11,38,32,2.2,6,4,False,0,14,3.08,5.72,80,100,True,True,14,22.7,7,21,6.0,0.1,10000.0 +382,-1467.659999999998,579,0.8327020209216516,12,46,56,2.3,7,2,True,0,20,2.97,6.73,96,100,True,False,14,17.4,8,22,8.0,0.1,10000.0 +383,-84.8499999999949,42,0.8605106117148072,10,38,56,1.6,6,4,False,0,20,2.82,7.39,64,200,True,True,14,18.9,8,21,6.0,0.1,10000.0 +384,-236.1700000000019,112,0.8867567165825144,8,44,48,1.6,8,4,False,0,14,3.03,5.67,96,200,True,False,14,23.5,7,22,6.0,0.1,10000.0 +385,-3682.520000000004,916,0.6979027633646024,9,52,72,1.1,9,2,True,0,20,2.57,5.74,80,200,True,False,14,21.6,7,22,8.0,0.1,10000.0 +386,-809.8299999999999,57,0.30425182779624904,12,48,56,1.9,6,3,False,0,14,2.0,5.1,80,200,False,False,14,16.9,7,21,8.0,0.1,10000.0 +387,-1542.5100000000057,348,0.7055992090833269,10,52,56,2.2,7,4,True,1,20,2.96,5.1,96,200,True,False,14,23.0,7,21,6.0,0.1,10000.0 +388,-8.55000000000291,25,0.9798686162322527,12,44,32,2.4,7,4,False,0,14,2.48,5.79,80,100,True,False,14,17.4,7,21,8.0,0.1,10000.0 +389,-2430.7799999999925,439,0.5868627107726248,11,52,32,0.9,7,3,True,0,20,2.46,5.79,64,100,True,True,14,21.4,8,21,8.0,0.1,10000.0 +390,-5730.199999999989,1363,0.6598027993749614,9,38,48,2.5,7,5,True,0,20,2.1,5.91,80,200,False,False,14,21.7,8,22,6.0,0.1,10000.0 +391,-2012.6199999999963,346,0.5759137591713058,8,38,32,1.2,7,5,True,1,14,2.01,6.01,96,200,True,True,14,19.0,7,21,8.0,0.1,10000.0 +392,-785.989999999987,429,0.8347448183641631,9,52,48,2.3,7,2,True,1,20,2.17,4.85,48,100,True,False,14,22.0,8,22,8.0,0.1,10000.0 +393,4.200000000000728,97,1.0027189921602393,12,46,64,1.1,7,4,False,0,14,2.67,7.27,96,100,True,False,14,16.4,7,21,8.0,0.1,10000.0 +394,-1942.5799999999936,491,0.7521552356565351,10,42,72,1.4,6,5,True,0,20,3.19,6.18,96,200,True,True,14,22.9,7,22,6.0,0.1,10000.0 +395,142.9300000000003,49,1.2456179543579875,9,46,40,2.2,10,4,False,1,14,2.7,7.41,64,200,True,False,14,22.1,7,22,6.0,0.1,10000.0 +396,-4358.029999999985,1209,0.7453930956317514,10,40,56,1.2,6,4,True,0,14,2.55,6.62,96,200,False,False,14,20.8,7,22,6.0,0.1,10000.0 +397,-2708.2700000000023,644,0.6507179686915611,12,52,48,2.4,10,3,True,0,20,2.39,4.67,48,200,True,False,14,18.0,7,22,6.0,0.1,10000.0 +398,-1033.6099999999933,222,0.7054352596510627,8,44,40,1.3,9,4,False,1,14,2.14,5.97,96,200,False,True,14,17.1,7,22,6.0,0.1,10000.0 +399,-2457.3899999999985,554,0.7019513810305242,11,52,56,1.5,10,5,True,0,20,2.74,5.8,96,100,True,True,14,18.7,8,21,6.0,0.1,10000.0 +400,-3644.529999999999,621,0.5783580103798622,11,40,48,1.4,6,5,True,0,14,2.82,5.4,64,200,True,True,14,16.4,7,21,6.0,0.1,10000.0 +401,-3225.7,776,0.7178546562684776,12,50,56,0.7,10,4,True,0,14,2.92,4.55,96,100,True,False,14,16.4,8,22,8.0,0.1,10000.0 +402,-3427.2799999999907,717,0.6266827585530809,12,52,72,1.4,8,4,True,0,14,2.09,7.45,80,100,True,True,14,16.1,8,21,6.0,0.1,10000.0 +403,-1383.1299999999865,377,0.7577430005166963,9,52,56,1.9,10,5,True,1,20,2.83,7.39,96,200,True,False,14,17.1,7,21,6.0,0.1,10000.0 +404,-2694.7000000000126,561,0.6177388901419559,9,38,40,1.5,7,3,True,1,14,2.1,6.81,64,200,True,False,14,16.9,7,22,8.0,0.1,10000.0 +405,41.849999999998545,32,1.081741474276339,11,38,56,1.7,7,4,False,0,14,2.4,4.81,96,200,True,True,14,20.6,8,21,8.0,0.1,10000.0 +406,-1421.6100000000133,267,0.6445628448773755,11,52,64,1.7,10,5,True,1,14,2.63,5.77,80,100,True,True,14,19.3,8,21,8.0,0.1,10000.0 +407,-1958.58,404,0.6443310482589549,12,48,56,1.9,6,3,True,1,14,2.56,5.81,64,200,False,True,14,21.3,7,22,8.0,0.1,10000.0 +408,-2434.029999999976,689,0.7403141796952517,11,48,56,2.1,7,3,True,1,14,2.8,4.89,64,100,False,False,14,16.8,8,22,8.0,0.1,10000.0 +409,-4977.160000000018,1188,0.6371057470627436,9,44,64,0.6,6,4,True,0,14,2.21,7.08,48,100,True,False,14,16.9,7,21,6.0,0.1,10000.0 +410,-1243.6399999999976,324,0.7541839370813346,11,46,48,2.1,6,4,True,1,14,2.85,7.28,96,200,True,False,14,22.3,7,21,6.0,0.1,10000.0 +411,-323.6500000000069,35,0.5125973224101321,9,40,40,2.3,7,4,False,0,20,2.88,4.8,80,200,True,False,14,22.8,8,22,6.0,0.1,10000.0 +412,-3614.0600000000013,851,0.6640274574440295,9,52,48,1.1,7,2,True,0,20,2.43,6.49,64,200,True,False,14,22.4,8,22,8.0,0.1,10000.0 +413,-2896.899999999995,622,0.6738966474472554,12,48,32,1.4,6,2,True,0,20,2.48,6.82,96,100,True,False,14,21.3,7,21,8.0,0.1,10000.0 +414,-2896.6400000000012,586,0.6530749855978883,11,50,72,1.9,8,4,True,0,20,3.08,6.33,64,200,True,True,14,17.6,8,22,8.0,0.1,10000.0 +415,-1412.3399999999983,284,0.6408626376001566,9,46,32,0.6,8,5,False,1,14,2.62,6.12,64,100,False,True,14,18.5,8,21,6.0,0.1,10000.0 +416,-181.92000000000553,30,0.6835898773806417,8,46,40,2.2,8,5,False,0,14,3.01,5.28,80,100,True,True,14,23.5,8,22,6.0,0.1,10000.0 +417,-3727.1100000000024,836,0.6659816819615716,11,48,40,2.1,10,3,True,0,20,2.8,6.95,64,200,False,True,14,18.0,8,21,8.0,0.1,10000.0 +418,-2084.0999999999894,474,0.7223258491038643,11,40,40,1.9,9,2,True,0,20,3.07,5.93,96,100,True,True,14,20.2,8,22,8.0,0.1,10000.0 +419,-2325.560000000006,772,0.7449887273779968,11,52,72,2.4,9,5,True,0,14,2.58,5.87,48,100,True,False,14,16.3,7,22,6.0,0.1,10000.0 +420,-2799.9600000000073,524,0.5761149471574316,12,50,32,0.7,10,4,True,1,14,2.14,5.41,80,200,True,False,14,16.2,7,21,8.0,0.1,10000.0 +421,-4863.359999999998,1228,0.670986662517378,8,46,48,0.9,9,2,True,1,20,2.08,4.63,96,200,False,False,14,23.2,8,22,6.0,0.1,10000.0 +422,-3118.5200000000277,784,0.7048870988652635,9,52,56,1.8,7,4,True,1,20,2.46,7.2,80,100,False,False,14,21.9,7,21,6.0,0.1,10000.0 +423,-1087.340000000002,187,0.6726516259942319,12,46,64,1.8,10,2,True,1,14,3.15,6.07,96,100,True,True,14,23.5,7,21,8.0,0.1,10000.0 +424,-1639.7599999999838,483,0.7161109822266389,9,44,72,2.2,10,5,True,1,20,2.48,4.63,48,200,True,False,14,19.3,8,22,8.0,0.1,10000.0 +425,-6750.789999999997,1496,0.6286038403920604,8,40,32,1.6,8,3,True,0,14,2.19,7.36,64,100,False,False,14,17.5,7,22,8.0,0.1,10000.0 +426,-5898.590000000009,1187,0.6025607940981667,8,48,40,1.3,8,4,True,0,14,2.24,6.76,64,200,False,True,14,19.1,7,22,6.0,0.1,10000.0 +427,-1735.8399999999892,434,0.6953373186510764,10,52,64,1.3,9,2,True,1,14,3.1,4.56,48,100,False,True,14,22.3,8,22,8.0,0.1,10000.0 +428,-177.48999999999614,168,0.9204629986466746,8,44,40,1.2,7,3,False,0,20,2.05,6.94,80,100,True,False,14,23.5,8,22,8.0,0.1,10000.0 +429,-3584.3599999999997,798,0.6313384341479621,11,48,72,0.9,10,4,True,0,14,2.36,5.69,48,100,False,True,14,24.0,8,21,8.0,0.1,10000.0 +430,-5527.219999999974,1382,0.6963809967447537,10,46,72,1.4,7,4,True,0,20,3.15,5.49,64,100,False,False,14,16.0,7,21,8.0,0.1,10000.0 +431,-30.06000000000131,25,0.9294548356058295,12,52,56,1.6,6,2,False,0,14,2.42,6.94,80,200,True,True,14,23.9,7,22,8.0,0.1,10000.0 +432,-939.419999999991,195,0.6612090044214277,9,52,32,0.9,6,4,False,1,20,2.23,6.95,80,100,True,False,14,23.7,7,22,8.0,0.1,10000.0 +433,-4229.790000000005,1045,0.6617940199335549,12,44,32,0.9,9,2,True,1,20,2.2,5.08,64,100,False,False,14,22.0,7,22,6.0,0.1,10000.0 +434,-126.08000000000175,27,0.7227243737766929,12,46,40,2.2,6,4,False,1,20,2.0,5.78,48,200,True,False,14,18.2,8,22,8.0,0.1,10000.0 +435,-1131.3300000000054,216,0.6174928237430138,12,38,72,0.9,8,5,False,0,20,2.01,5.08,48,100,False,False,14,23.8,8,21,6.0,0.1,10000.0 +436,-3987.430000000014,790,0.6403190685205331,9,42,48,1.1,6,2,True,0,14,2.71,6.38,80,200,True,False,14,19.8,8,21,8.0,0.1,10000.0 +437,-1430.5400000000009,315,0.6532621051891675,12,44,32,2.1,10,5,True,1,20,2.69,4.76,48,100,True,False,14,23.1,7,21,6.0,0.1,10000.0 +438,-919.6099999999988,226,0.7292334055683799,11,38,48,1.7,9,2,True,1,14,2.67,5.38,96,200,True,True,14,22.0,7,21,8.0,0.1,10000.0 +439,-1030.6699999999819,343,0.7718444237835924,11,52,56,2.3,10,2,True,1,14,2.54,5.48,64,100,True,False,14,20.8,7,21,6.0,0.1,10000.0 +440,-3408.329999999997,703,0.667709523568111,12,46,48,1.3,10,5,True,0,14,2.96,4.68,80,200,False,True,14,22.0,8,21,6.0,0.1,10000.0 +441,-472.6600000000017,101,0.6646064983998808,11,46,64,1.2,8,2,False,1,14,2.07,6.02,48,200,True,False,14,23.8,7,21,8.0,0.1,10000.0 +442,-245.1600000000035,57,0.723283218203982,9,52,72,1.9,9,4,False,1,20,2.74,5.76,64,100,True,False,14,20.0,7,21,6.0,0.1,10000.0 +443,-2718.0599999999977,772,0.718828747936261,11,44,40,1.5,8,5,True,0,14,2.99,4.52,48,100,True,False,14,20.4,7,22,8.0,0.1,10000.0 +444,-2133.1200000000235,571,0.7438521366669508,9,48,32,2.5,7,3,True,0,14,3.06,6.66,80,100,True,False,14,16.2,8,21,6.0,0.1,10000.0 +445,-5833.970000000002,1472,0.6694722576792572,9,50,72,2.1,6,4,True,0,20,2.29,6.93,64,200,False,False,14,16.9,7,21,6.0,0.1,10000.0 +446,-401.11999999999716,82,0.7264500289835306,12,50,72,1.2,10,5,False,0,14,2.92,6.26,80,100,True,False,14,16.4,8,21,8.0,0.1,10000.0 +447,-2380.220000000011,751,0.7800855369713187,9,40,56,2.1,10,2,True,1,20,2.9,6.44,80,200,False,False,14,17.4,8,22,8.0,0.1,10000.0 +448,-2642.259999999991,812,0.7396223812057786,11,46,64,1.3,10,2,True,0,14,2.54,5.2,64,200,True,False,14,20.6,8,22,6.0,0.1,10000.0 +449,-268.0799999999981,114,0.8484995761514552,9,40,48,1.4,8,3,False,0,20,2.61,5.51,96,200,True,False,14,18.9,8,22,8.0,0.1,10000.0 +450,-2387.3600000000006,651,0.7093968611803256,11,38,40,1.4,8,2,True,0,20,3.01,6.04,48,200,True,False,14,16.9,8,21,6.0,0.1,10000.0 +451,-1901.0099999999984,533,0.7718225770829933,10,44,72,1.2,8,4,True,1,14,3.2,6.76,80,100,True,False,14,22.6,8,22,6.0,0.1,10000.0 +452,-2507.75999999999,524,0.6390964458823123,11,42,56,1.0,7,5,True,1,20,2.87,5.88,48,200,True,False,14,22.2,8,21,8.0,0.1,10000.0 +453,-197.0000000000109,167,0.9195241713440689,11,38,48,0.8,7,4,False,0,20,2.97,7.0,80,100,True,False,14,21.5,8,22,8.0,0.1,10000.0 +454,-2211.639999999983,671,0.7858398921665839,12,38,64,2.1,7,3,True,1,20,3.18,5.11,96,100,False,False,14,17.5,7,22,8.0,0.1,10000.0 +455,-2943.289999999988,679,0.6423288743279896,10,40,40,0.7,10,3,True,1,20,2.03,5.1,96,200,True,False,14,18.3,7,22,6.0,0.1,10000.0 +456,-2212.9100000000117,772,0.7596403038669832,10,38,40,1.2,9,5,True,0,14,2.64,5.93,48,200,True,False,14,23.0,8,22,8.0,0.1,10000.0 +457,-6916.02999999997,1579,0.6507947968852404,9,46,64,0.9,9,4,True,0,14,2.53,6.97,64,200,False,False,14,19.7,7,21,8.0,0.1,10000.0 +458,-438.1800000000003,28,0.2907068973889959,11,48,72,2.2,8,5,False,0,20,2.3,7.2,96,200,True,True,14,17.5,7,22,6.0,0.1,10000.0 +459,-149.36999999999716,42,0.7764524529318447,9,42,48,2.3,10,4,False,0,14,3.09,5.73,48,200,True,False,14,20.0,8,22,8.0,0.1,10000.0 +460,-2636.659999999998,498,0.6037969471751302,9,46,40,1.5,9,2,True,1,20,2.46,6.74,64,200,True,False,14,18.0,7,22,8.0,0.1,10000.0 +461,-3697.699999999988,728,0.612187406919524,11,52,32,0.7,7,5,True,0,20,3.01,5.01,48,100,True,False,14,17.0,8,21,6.0,0.1,10000.0 +462,-1199.1500000000015,244,0.6690109938640825,8,46,40,1.4,7,3,False,0,14,2.53,4.64,48,200,False,False,14,19.6,7,21,8.0,0.1,10000.0 +463,-3126.1899999999832,745,0.6946722272141267,9,44,48,2.3,7,2,True,0,14,3.19,5.51,64,100,True,False,14,22.4,7,21,6.0,0.1,10000.0 +464,-551.8600000000079,105,0.6328056902941626,11,40,48,1.1,7,3,False,0,20,2.14,5.14,80,200,True,False,14,19.2,8,21,8.0,0.1,10000.0 +465,-3050.799999999983,796,0.7342420742150001,9,52,40,0.6,8,4,True,0,14,2.49,6.8,96,100,False,True,14,22.3,7,22,6.0,0.1,10000.0 +466,-1005.6200000000008,185,0.6282970607368856,12,48,72,1.9,7,4,True,1,20,3.17,6.5,48,200,True,True,14,23.3,8,22,6.0,0.1,10000.0 +467,-3745.4300000000167,684,0.591525425577279,12,38,40,0.5,6,4,True,1,20,2.91,6.36,48,100,True,False,14,18.4,7,22,6.0,0.1,10000.0 +468,-3858.0199999999995,804,0.683795030083575,8,44,72,1.7,9,4,True,0,20,2.77,6.78,96,200,True,False,14,22.8,8,22,6.0,0.1,10000.0 +469,60.57000000000153,36,1.1025480402945909,9,38,72,2.5,7,5,False,0,14,2.53,4.52,96,100,True,False,14,21.1,7,21,6.0,0.1,10000.0 +470,-169.98999999998887,114,0.9015401189697015,8,42,64,1.6,7,3,False,0,20,2.87,5.43,64,100,True,False,14,20.8,8,22,8.0,0.1,10000.0 +471,-4072.4300000000267,925,0.6864141252748014,9,46,56,0.7,8,5,True,0,20,2.53,6.02,96,100,True,False,14,22.1,8,21,8.0,0.1,10000.0 +472,-2846.020000000007,728,0.7092702899002271,12,42,64,2.0,8,5,True,0,20,2.34,6.19,96,100,True,False,14,21.7,7,21,6.0,0.1,10000.0 +473,-4065.8399999999965,1108,0.7552690551244139,8,38,64,2.0,8,5,True,0,20,3.16,5.62,96,200,False,True,14,16.6,7,21,8.0,0.1,10000.0 +474,-51.220000000001164,26,0.8765307106354258,12,42,40,2.0,8,4,False,1,20,2.76,5.6,48,200,True,True,14,18.0,8,21,8.0,0.1,10000.0 +475,-1671.6899999999878,353,0.6673074971192481,8,42,48,1.7,7,4,True,1,14,2.01,6.81,96,200,False,True,14,23.8,7,21,8.0,0.1,10000.0 +476,-160.38000000000284,49,0.7940519300408352,9,50,48,1.9,10,5,False,0,20,2.9,7.27,48,100,False,True,14,22.2,8,21,8.0,0.1,10000.0 +477,-4429.71,1200,0.7542116891922634,9,50,72,1.1,7,5,True,0,14,2.93,5.75,96,200,False,False,14,17.4,8,21,6.0,0.1,10000.0 +478,-424.0399999999954,80,0.6488572374958596,9,52,40,1.5,6,5,False,0,14,2.24,6.75,64,200,True,False,14,21.0,7,21,6.0,0.1,10000.0 +479,-2480.5799999999927,696,0.7065784399773835,10,40,56,0.7,6,4,True,1,14,2.57,6.52,48,100,True,False,14,22.0,7,21,6.0,0.1,10000.0 +480,-3594.480000000007,823,0.6711167635769739,9,38,56,1.7,8,5,True,0,20,2.4,6.55,80,200,True,False,14,21.3,8,21,8.0,0.1,10000.0 +481,-1102.7100000000137,212,0.6439793111464104,10,40,32,1.4,9,3,True,1,14,3.04,5.34,64,200,True,True,14,21.5,8,22,6.0,0.1,10000.0 +482,-571.6300000000083,79,0.551978995219061,8,48,32,1.8,6,4,False,0,14,2.73,5.7,48,200,True,False,14,23.9,7,22,8.0,0.1,10000.0 +483,-3684.7999999999947,882,0.6959793667281892,12,44,72,0.8,10,2,True,0,14,2.36,6.52,96,100,True,False,14,19.9,7,21,6.0,0.1,10000.0 +484,-5247.590000000021,1310,0.6880814380283875,9,40,32,1.4,6,3,True,0,20,2.26,5.27,96,100,False,False,14,23.4,8,21,8.0,0.1,10000.0 +485,-4418.860000000008,1118,0.6470294095563085,9,40,72,1.2,9,5,True,0,20,2.14,4.76,48,200,False,True,14,23.5,7,22,6.0,0.1,10000.0 +486,-457.73000000000866,81,0.7003757331378299,10,50,64,2.0,8,2,False,1,14,3.02,7.44,80,200,False,False,14,20.2,7,21,8.0,0.1,10000.0 +487,-366.45999999999367,216,0.8468879130612809,8,52,48,0.8,8,3,True,1,20,2.18,5.35,48,200,True,True,14,23.9,7,22,8.0,0.1,10000.0 +488,-2523.020000000003,690,0.7381838634125486,9,52,48,1.9,9,2,True,0,14,3.02,7.3,64,100,True,False,14,21.8,8,21,6.0,0.1,10000.0 +489,-2810.939999999997,690,0.6836219364641661,12,50,48,1.3,9,4,True,0,14,2.63,5.35,64,200,True,False,14,18.6,7,22,8.0,0.1,10000.0 +490,-3689.0899999999674,935,0.6855748963803215,9,42,56,1.9,8,3,True,0,14,2.88,4.53,48,100,True,False,14,21.4,7,21,6.0,0.1,10000.0 +491,11.670000000007349,35,1.0215293792085602,10,52,40,2.4,6,4,False,0,14,2.75,5.71,48,100,True,False,14,19.9,7,22,6.0,0.1,10000.0 +492,-3196.9200000000055,696,0.6258251481755447,11,50,48,1.8,9,4,True,0,14,2.1,5.97,64,100,False,True,14,23.9,8,22,6.0,0.1,10000.0 +493,-774.8500000000004,103,0.5784528673474384,12,42,56,1.5,9,4,False,0,14,2.39,6.64,64,200,False,False,14,19.2,8,21,6.0,0.1,10000.0 +494,-104.91000000000167,34,0.7799706375838926,9,40,40,2.2,7,2,False,0,20,2.15,4.89,64,100,True,True,14,18.1,7,21,6.0,0.1,10000.0 +495,-205.85999999999876,16,0.43485422500411797,12,46,48,2.4,7,5,False,0,14,2.36,7.34,80,200,True,True,14,19.9,8,22,6.0,0.1,10000.0 +496,-5183.2400000000125,1380,0.7333451315232373,8,38,40,0.6,7,4,True,0,14,2.71,5.33,96,100,False,False,14,18.1,7,22,8.0,0.1,10000.0 +497,-2028.6099999999788,548,0.7415124872579002,8,46,72,1.4,7,3,True,1,20,3.19,6.59,64,200,False,True,14,21.2,7,22,6.0,0.1,10000.0 +498,-3040.2700000000104,702,0.7130006702349598,10,50,56,0.6,10,3,True,0,14,2.64,6.55,96,100,True,True,14,16.7,8,22,6.0,0.1,10000.0 +499,-4056.370000000008,1116,0.7463651171297353,9,46,32,0.7,7,5,True,0,14,2.63,7.13,96,100,False,False,14,21.6,8,22,6.0,0.1,10000.0 +500,-2156.9500000000053,797,0.7767971248899224,8,42,48,2.4,9,3,True,1,20,2.57,4.88,48,100,False,False,14,17.1,8,21,8.0,0.1,10000.0 +501,-3443.6000000000186,1040,0.7271442935710613,9,50,72,1.4,9,4,True,1,20,2.33,5.78,64,200,False,False,14,23.6,8,22,6.0,0.1,10000.0 +502,-347.16999999999825,111,0.8284512832676134,8,40,72,1.0,6,3,False,0,14,2.89,6.16,96,100,True,True,14,20.1,7,22,8.0,0.1,10000.0 +503,-385.46999999999935,63,0.580043142894496,12,40,56,0.5,7,2,False,0,20,2.29,6.72,48,200,True,True,14,23.4,7,21,6.0,0.1,10000.0 +504,-3506.0399999999963,936,0.693269234975307,10,42,64,1.2,6,5,True,0,14,2.45,4.84,64,100,True,False,14,19.9,8,21,6.0,0.1,10000.0 +505,-1747.5300000000025,314,0.5779718362921085,12,50,40,2.3,10,2,True,1,20,2.07,4.52,96,200,True,False,14,16.9,8,21,8.0,0.1,10000.0 +506,-573.3299999999927,173,0.768125730509304,10,38,32,1.4,7,2,False,1,14,2.49,7.24,48,100,False,False,14,17.8,8,22,8.0,0.1,10000.0 +507,-1488.4699999999884,344,0.6810676574445473,10,50,40,1.6,8,2,True,1,20,2.19,5.56,96,100,True,True,14,17.6,7,22,6.0,0.1,10000.0 +508,105.85000000000582,31,1.2368379835768464,9,50,56,2.0,6,3,False,0,20,3.15,7.45,48,200,True,True,14,20.0,7,22,8.0,0.1,10000.0 +509,-6149.799999999997,1326,0.6402807422273253,12,50,40,0.7,6,2,True,0,20,2.6,6.8,64,100,False,False,14,19.4,7,22,8.0,0.1,10000.0 +510,-1998.0400000000227,372,0.6303006753631233,10,46,56,0.7,9,3,False,0,14,2.3,6.8,80,100,False,False,14,17.6,7,21,6.0,0.1,10000.0 +511,-3601.949999999989,828,0.6445874315214474,12,42,40,0.7,9,2,True,0,14,2.51,6.35,48,100,True,False,14,20.2,7,21,8.0,0.1,10000.0 +512,-2810.110000000007,660,0.6794581800553227,11,52,32,1.5,6,4,True,0,20,2.34,5.55,96,100,True,False,14,17.5,7,21,8.0,0.1,10000.0 +513,-3092.4800000000087,802,0.7345640599558648,9,46,56,1.1,10,2,True,0,20,3.14,5.59,80,100,True,True,14,16.1,7,22,8.0,0.1,10000.0 +514,-2294.3899999999985,528,0.6653022343915708,10,48,40,1.8,7,5,True,0,14,2.76,6.31,48,100,True,True,14,19.6,7,21,8.0,0.1,10000.0 +515,-1795.760000000013,424,0.6880687730049627,10,52,40,1.6,7,2,True,0,20,2.66,5.26,80,200,True,True,14,21.7,8,21,8.0,0.1,10000.0 +516,-1697.0799999999927,328,0.6907895336189037,11,38,40,1.7,7,4,True,1,14,2.95,6.58,96,200,False,True,14,23.0,7,21,8.0,0.1,10000.0 +517,-3912.6899999999996,868,0.6184416597591301,12,50,64,2.1,9,4,True,0,14,2.19,5.15,48,200,False,True,14,21.8,8,22,6.0,0.1,10000.0 +518,-1222.730000000005,216,0.5724137207521306,10,46,64,0.7,7,2,False,0,20,2.05,4.94,80,100,True,False,14,21.1,7,21,6.0,0.1,10000.0 +519,-1552.7299999999923,220,0.5584532655400006,8,48,72,1.7,8,4,True,1,20,2.87,5.73,80,200,True,True,14,22.5,8,21,8.0,0.1,10000.0 +520,-20.36000000000604,72,0.9769735353992309,9,46,32,1.6,10,2,False,1,20,3.13,5.27,64,200,True,False,14,18.2,8,21,8.0,0.1,10000.0 +521,-7075.499999999988,1686,0.6455110592733765,9,50,48,0.8,9,2,True,0,20,2.22,7.09,64,200,False,False,14,21.2,7,22,6.0,0.1,10000.0 +522,-4559.489999999998,1085,0.7083733085678761,9,50,72,1.7,6,3,True,0,14,2.55,6.44,96,100,False,True,14,17.1,7,21,8.0,0.1,10000.0 +523,-1859.0599999999977,414,0.6234166894554,11,38,32,2.2,6,3,True,0,20,2.17,6.38,48,100,True,True,14,21.9,8,21,6.0,0.1,10000.0 +524,-3568.650000000005,821,0.6754025802977602,9,52,64,2.3,7,4,True,0,14,2.29,6.13,80,100,True,False,14,16.8,8,21,8.0,0.1,10000.0 +525,-4320.930000000008,1002,0.671640645482421,9,38,40,0.5,9,5,True,0,20,2.27,7.14,96,100,True,False,14,23.9,7,21,8.0,0.1,10000.0 +526,-1320.4700000000048,305,0.6641290302888481,10,40,64,1.2,8,2,True,1,14,2.21,6.09,64,200,True,True,14,21.5,8,22,6.0,0.1,10000.0 +527,-2903.2399999999825,670,0.6944977307572106,10,52,72,1.2,8,2,True,0,14,2.38,5.67,96,100,True,True,14,19.4,8,21,6.0,0.1,10000.0 +528,-3722.9699999999993,1097,0.7516029511648669,10,42,40,2.0,8,4,True,0,20,2.83,5.74,80,100,False,False,14,19.1,8,22,6.0,0.1,10000.0 +529,-450.70999999999367,73,0.6675150120243734,11,40,64,1.9,10,3,False,0,14,2.43,5.11,48,200,False,False,14,23.7,7,21,8.0,0.1,10000.0 +530,-6035.179999999959,1577,0.6649741008000968,10,42,48,1.4,10,5,True,0,14,2.07,4.91,64,200,False,False,14,21.6,8,22,6.0,0.1,10000.0 +531,-4269.180000000009,1049,0.6805266411138666,8,40,56,2.2,7,2,True,0,14,2.09,4.73,96,100,True,False,14,21.9,8,22,8.0,0.1,10000.0 +532,-2826.8100000000013,842,0.7426565239635926,10,52,72,1.9,8,2,True,0,14,2.73,5.02,64,100,True,False,14,21.4,8,22,8.0,0.1,10000.0 +533,-1993.3599999999988,491,0.7134021063225622,9,50,40,1.0,6,5,True,1,14,2.48,4.67,96,100,False,True,14,20.8,7,22,8.0,0.1,10000.0 +534,-3991.060000000016,972,0.6648083448113683,10,50,56,0.8,8,5,True,0,14,2.13,5.59,80,100,True,False,14,17.3,7,21,6.0,0.1,10000.0 +535,-3188.920000000003,648,0.6950491337992342,12,38,48,0.9,7,2,True,0,14,3.17,6.19,96,100,True,False,14,16.7,8,21,8.0,0.1,10000.0 +536,-967.2800000000025,240,0.6909717674045628,10,50,64,0.9,9,4,True,1,14,2.4,7.19,48,100,True,True,14,22.4,8,21,8.0,0.1,10000.0 +537,-2496.600000000005,521,0.6682964419525416,9,42,72,1.4,6,3,True,1,14,2.92,4.98,80,200,True,False,14,18.3,8,21,8.0,0.1,10000.0 +538,-2766.2500000000073,815,0.7272155325176834,9,44,64,1.7,7,5,True,0,14,2.92,5.43,48,200,True,False,14,18.5,8,21,6.0,0.1,10000.0 +539,-5672.329999999992,1405,0.6875238254730389,10,48,48,0.7,7,5,True,0,20,2.92,5.83,64,100,False,False,14,16.3,8,22,8.0,0.1,10000.0 +540,-5300.689999999988,1428,0.6862059901990616,12,42,56,1.2,10,4,True,0,20,2.61,5.29,48,100,False,False,14,21.6,7,21,6.0,0.1,10000.0 +541,-2567.189999999987,713,0.7447459032611841,10,50,40,1.6,6,3,True,0,14,2.42,5.91,96,100,True,False,14,21.9,8,22,6.0,0.1,10000.0 +542,-1924.4100000000017,342,0.5606109038436071,11,48,32,1.1,10,5,True,1,20,2.14,5.86,64,200,True,True,14,17.7,7,22,6.0,0.1,10000.0 +543,-735.0900000000074,177,0.6919037180782176,10,50,56,0.9,7,2,False,0,20,2.3,5.03,64,100,True,False,14,16.7,8,22,6.0,0.1,10000.0 +544,-3960.0700000000015,1158,0.7459431820952132,10,42,32,0.7,9,4,True,0,14,2.42,5.76,96,100,False,False,14,18.8,8,21,6.0,0.1,10000.0 +545,-4424.289999999999,1151,0.7308449478941701,8,42,48,1.8,8,2,True,0,14,2.6,5.45,96,200,False,True,14,16.0,8,21,8.0,0.1,10000.0 +546,-409.36999999999716,79,0.6775725593667545,12,40,32,0.9,7,5,False,1,14,2.72,5.15,64,100,False,True,14,23.6,8,22,6.0,0.1,10000.0 +547,40.68000000000393,41,1.0590489461766244,10,46,64,2.1,6,5,False,0,20,2.49,5.56,96,200,True,False,14,19.7,8,21,6.0,0.1,10000.0 +548,-1311.92,158,0.5148798958703112,12,50,56,1.1,9,4,False,1,14,3.19,6.92,48,100,False,False,14,20.9,8,21,8.0,0.1,10000.0 +549,-71.54999999999927,69,0.937833423115019,12,40,72,1.4,10,2,False,0,20,2.25,6.83,96,100,True,False,14,23.6,8,22,8.0,0.1,10000.0 +550,-1785.049999999992,412,0.7028467647827512,11,38,48,2.1,10,4,True,1,20,2.37,7.21,96,100,True,False,14,16.3,7,21,8.0,0.1,10000.0 +551,-1825.66999999999,345,0.5644985460782279,12,48,48,0.8,10,5,True,1,20,2.23,6.43,48,200,True,True,14,19.1,7,22,8.0,0.1,10000.0 +552,-149.9800000000123,131,0.9279361525266552,12,42,56,1.0,7,2,False,1,20,3.01,6.38,80,100,True,False,14,16.7,7,22,6.0,0.1,10000.0 +553,51.5099999999984,46,1.0643609511076682,12,42,32,1.7,10,2,False,0,14,2.89,4.89,96,200,True,False,14,21.2,7,22,6.0,0.1,10000.0 +554,-266.7999999999993,35,0.5773063578320314,12,44,72,2.1,9,4,False,0,20,2.1,4.93,48,100,True,False,14,23.4,7,21,6.0,0.1,10000.0 +555,-5328.440000000008,1601,0.7100141878863641,10,46,40,0.7,9,4,True,0,14,2.59,4.57,48,200,False,False,14,17.7,8,22,8.0,0.1,10000.0 +556,-4901.370000000005,1078,0.6313334627066399,11,42,40,1.1,7,2,True,0,20,2.58,6.34,48,100,False,True,14,18.0,7,21,6.0,0.1,10000.0 +557,-3540.11999999999,988,0.6746909898891138,12,38,64,1.5,7,3,True,0,14,2.04,4.92,48,100,True,False,14,19.9,7,22,8.0,0.1,10000.0 +558,-1652.7199999999957,400,0.724468599436507,11,52,56,1.5,9,3,True,0,14,2.82,7.16,80,200,True,True,14,22.3,8,21,6.0,0.1,10000.0 +559,-457.1099999999951,92,0.6750040881330385,11,50,56,1.3,8,4,False,0,20,2.52,6.2,80,100,True,False,14,23.1,8,22,8.0,0.1,10000.0 +560,-3790.990000000007,856,0.6420849198489029,12,48,56,0.6,7,4,True,0,20,2.29,5.15,80,200,True,False,14,17.0,8,21,8.0,0.1,10000.0 +561,-3927.7600000000193,1072,0.7297375032081872,9,52,64,2.1,7,2,True,0,14,2.63,4.81,80,100,False,True,14,19.4,8,22,8.0,0.1,10000.0 +562,-3186.7900000000036,669,0.6225300562629553,9,44,32,2.1,9,2,True,0,14,2.15,5.01,80,200,True,True,14,16.2,7,21,8.0,0.1,10000.0 +563,-3263.28999999999,701,0.6226529201038855,10,42,56,0.6,10,2,True,1,14,2.08,4.79,96,200,True,False,14,22.0,8,21,8.0,0.1,10000.0 +564,-380.7099999999991,118,0.7870130015440732,11,38,56,1.1,9,5,False,0,20,3.13,4.81,64,100,True,False,14,16.8,8,22,6.0,0.1,10000.0 +565,-88.28999999999905,59,0.9017723039951937,9,40,40,1.9,8,2,False,0,20,3.06,4.63,48,200,True,False,14,18.6,8,22,6.0,0.1,10000.0 +566,-922.8799999999937,185,0.677817110380316,9,52,32,0.8,7,5,False,0,14,2.63,5.22,96,200,True,False,14,22.2,8,21,6.0,0.1,10000.0 +567,-893.9299999999894,215,0.7347530398969788,10,46,72,0.7,10,3,False,1,14,2.83,4.73,96,100,True,False,14,21.4,8,22,6.0,0.1,10000.0 +568,-2717.3299999999936,565,0.6426921200629585,11,40,48,0.9,10,4,True,1,20,2.79,7.04,48,100,True,False,14,19.1,8,21,8.0,0.1,10000.0 +569,-3537.8500000000013,820,0.7111699826106833,9,40,48,1.3,8,2,True,0,14,2.89,5.22,96,100,True,False,14,19.8,8,22,8.0,0.1,10000.0 +570,-1137.320000000007,253,0.668711513477929,8,40,48,1.4,7,5,False,0,20,2.06,5.32,48,100,False,False,14,21.9,8,21,8.0,0.1,10000.0 +571,9.440000000004147,75,1.0099886780873373,9,50,40,1.7,10,5,False,0,14,2.82,6.44,48,100,True,False,14,23.2,8,21,6.0,0.1,10000.0 +572,-3668.8099999999904,756,0.6339411681363657,12,40,48,1.0,10,5,True,0,14,2.26,6.97,80,200,True,False,14,22.3,8,22,8.0,0.1,10000.0 +573,-288.54000000000815,131,0.8484320008404685,8,40,40,1.5,10,5,False,0,14,2.2,6.54,64,100,True,False,14,17.1,7,22,8.0,0.1,10000.0 +574,273.5000000000018,43,1.393298820822548,10,38,40,2.4,6,3,False,0,20,3.16,6.25,96,100,True,False,14,16.4,7,22,6.0,0.1,10000.0 +575,-31.359999999996944,29,0.9408402346771303,12,42,40,2.1,6,4,False,0,20,2.59,5.55,80,200,True,False,14,19.7,8,22,8.0,0.1,10000.0 +576,-1676.8200000000088,385,0.7086664106872006,12,52,32,1.0,10,2,True,0,14,2.79,4.92,96,100,True,True,14,21.9,8,22,6.0,0.1,10000.0 +577,-825.2199999999903,177,0.742466420332551,8,44,56,1.8,8,5,False,0,20,3.09,5.55,80,200,False,False,14,23.6,8,22,6.0,0.1,10000.0 +578,-4889.029999999988,1338,0.743583597842528,8,48,64,0.7,9,4,True,0,14,2.6,6.56,96,100,False,False,14,21.0,7,22,8.0,0.1,10000.0 +579,-3956.400000000026,1252,0.7411786563323045,10,40,48,0.5,6,3,True,1,14,2.06,5.42,96,200,False,False,14,16.4,7,22,8.0,0.1,10000.0 +580,-1936.7600000000139,426,0.6721978498117909,12,42,32,1.9,7,3,True,1,14,2.35,4.6,80,100,False,True,14,19.1,8,21,8.0,0.1,10000.0 +581,-46.450000000008004,66,0.948372827101765,10,46,40,1.6,8,3,False,0,20,2.16,6.16,80,200,True,False,14,20.5,8,21,8.0,0.1,10000.0 +582,-3391.580000000008,970,0.754806872041341,11,40,40,1.6,8,4,True,0,20,2.56,7.38,96,100,False,False,14,23.7,8,21,6.0,0.1,10000.0 +583,-888.419999999991,74,0.3551519902447522,12,46,40,1.7,8,3,False,1,20,2.06,7.04,64,200,False,False,14,19.7,8,21,6.0,0.1,10000.0 +584,-4787.889999999995,1228,0.6874861705537065,8,46,72,0.7,10,2,True,1,20,2.83,7.09,48,100,False,False,14,20.1,8,21,6.0,0.1,10000.0 +585,-465.1899999999987,156,0.7561616119259034,9,46,72,1.1,6,5,False,1,14,2.14,4.5,48,100,True,False,14,16.8,7,22,8.0,0.1,10000.0 +586,-1376.4799999999977,257,0.7002915477286931,8,40,48,1.3,7,3,False,0,20,3.03,6.35,96,100,False,False,14,17.5,7,21,6.0,0.1,10000.0 +587,-1764.4100000000035,488,0.7014837749128683,11,52,48,1.1,6,5,True,1,20,2.47,6.59,48,200,True,False,14,17.2,8,22,6.0,0.1,10000.0 +588,-2322.9500000000044,569,0.7033470275958332,12,50,32,1.7,6,5,True,0,14,2.56,6.67,80,100,True,False,14,20.0,7,22,8.0,0.1,10000.0 +589,-1095.7599999999966,232,0.6710456794274462,12,40,40,1.8,8,4,True,1,14,2.33,6.79,80,200,True,True,14,19.9,8,21,8.0,0.1,10000.0 +590,-2798.0400000000145,668,0.6821185733031134,9,48,64,2.4,8,5,True,0,14,3.02,4.98,48,100,True,True,14,19.8,7,21,6.0,0.1,10000.0 +591,-2394.359999999984,804,0.7557595460299552,9,50,56,2.3,6,4,True,0,14,2.53,5.62,48,100,True,False,14,21.6,8,21,6.0,0.1,10000.0 +592,-4116.979999999988,983,0.671946988543189,9,46,56,1.4,8,3,True,1,14,2.52,6.09,64,100,False,False,14,21.0,7,21,6.0,0.1,10000.0 +593,-2078.1700000000046,534,0.703712838820423,9,38,48,2.0,10,2,True,0,20,2.23,5.12,96,200,True,True,14,23.2,7,21,8.0,0.1,10000.0 +594,-2505.4099999999853,665,0.704290217916018,11,50,32,1.6,7,4,True,0,20,2.28,6.3,80,100,True,False,14,23.4,8,22,8.0,0.1,10000.0 +595,-1134.850000000015,248,0.6499979953182972,8,42,48,0.6,10,3,False,1,20,2.48,4.67,48,200,True,True,14,16.2,8,22,8.0,0.1,10000.0 +596,-1244.5800000000036,221,0.5977466209009639,9,48,32,0.8,10,4,False,0,14,2.59,6.92,48,200,True,False,14,20.8,7,22,6.0,0.1,10000.0 +597,-738.9799999999941,272,0.7983012080419676,10,38,32,0.6,10,3,False,0,20,2.57,6.84,64,100,True,False,14,22.2,7,22,6.0,0.1,10000.0 +598,-1425.4399999999823,384,0.6984082989342817,12,52,32,1.3,9,3,True,1,20,2.66,4.85,48,200,True,False,14,18.7,7,21,6.0,0.1,10000.0 +599,-2688.2699999999923,547,0.6456041131105398,8,38,40,1.3,10,2,True,1,14,2.98,4.73,64,200,True,False,14,16.3,8,21,8.0,0.1,10000.0 +600,-1023.4600000000282,314,0.7764702542026763,9,50,56,1.8,6,2,True,1,14,2.59,6.71,80,100,True,True,14,18.4,8,22,6.0,0.1,10000.0 +601,-2332.140000000003,627,0.7381797851451769,12,46,48,1.9,10,2,True,0,20,2.85,6.37,80,100,True,False,14,22.7,7,22,6.0,0.1,10000.0 +602,-1930.9399999999841,508,0.7056251581685078,8,48,72,2.1,7,2,True,1,20,2.78,5.86,48,100,True,False,14,18.2,8,22,6.0,0.1,10000.0 +603,-5922.139999999996,1430,0.6901210498170177,8,46,64,1.3,6,5,True,0,14,2.27,5.64,96,100,False,False,14,16.3,8,21,8.0,0.1,10000.0 +604,-1296.349999999995,201,0.6062574793918077,10,44,32,1.2,10,5,True,1,14,2.97,6.16,80,200,True,True,14,21.8,8,21,8.0,0.1,10000.0 +605,-2347.8900000000012,497,0.6496345463390466,11,44,40,2.3,8,4,True,0,20,2.41,5.68,80,200,True,True,14,18.0,7,21,8.0,0.1,10000.0 +606,-1621.0400000000081,586,0.8076996534883086,12,48,48,2.2,9,5,True,0,14,2.56,7.4,96,100,True,False,14,20.6,7,22,8.0,0.1,10000.0 +607,-3769.869999999998,828,0.6461624667737915,8,52,40,1.0,8,4,True,0,14,2.76,4.94,48,100,True,True,14,16.3,8,22,6.0,0.1,10000.0 +608,-1617.8399999999965,276,0.5790941564269937,12,44,32,2.4,8,4,True,1,20,2.65,4.63,64,200,True,False,14,20.1,7,21,6.0,0.1,10000.0 +609,-265.99999999999636,70,0.7189052097643454,9,48,64,1.2,9,2,False,0,20,2.17,5.48,80,200,True,True,14,19.0,8,21,6.0,0.1,10000.0 +610,-1508.4400000000041,352,0.726900097765869,10,38,48,2.4,10,2,True,1,14,2.97,6.03,80,100,True,True,14,16.3,7,22,6.0,0.1,10000.0 +611,-660.4500000000062,138,0.708977223154917,8,44,64,1.5,10,5,False,1,14,3.02,6.08,48,200,False,True,14,20.2,8,22,6.0,0.1,10000.0 +612,-2720.529999999985,615,0.7007687205845312,12,46,40,1.2,8,3,True,0,14,2.83,5.84,96,200,True,False,14,20.5,7,22,8.0,0.1,10000.0 +613,-53.79000000000269,34,0.9150934461421897,12,44,56,2.1,7,3,False,0,20,2.81,6.5,80,200,True,False,14,16.9,8,22,6.0,0.1,10000.0 +614,-3200.5700000000043,765,0.6765836746283649,12,52,72,2.3,7,3,True,0,14,2.14,5.29,96,100,True,False,14,22.7,7,21,6.0,0.1,10000.0 +615,-1311.500000000009,219,0.6315483397902509,9,50,56,1.2,9,3,False,0,14,2.4,6.97,80,100,False,False,14,16.6,8,22,8.0,0.1,10000.0 +616,-296.12000000000444,36,0.5358038625532983,11,50,48,2.0,7,3,False,1,14,2.18,4.52,80,200,True,False,14,19.5,8,21,6.0,0.1,10000.0 +617,-6253.299999999981,1297,0.6094211615743327,10,52,48,0.6,10,5,True,0,20,2.38,5.04,64,100,False,True,14,17.7,8,22,6.0,0.1,10000.0 +618,-6479.820000000007,1514,0.6328955150822949,10,46,40,0.7,8,5,True,0,14,2.35,7.25,48,100,False,False,14,17.1,7,21,6.0,0.1,10000.0 +619,-4480.289999999991,1156,0.7066392793746059,12,38,64,1.6,7,2,True,0,20,2.24,7.33,96,200,False,False,14,22.6,8,21,6.0,0.1,10000.0 +620,-527.590000000002,153,0.7861098498362145,11,50,56,1.0,7,4,False,1,14,3.16,6.91,64,100,True,False,14,20.1,8,22,6.0,0.1,10000.0 +621,-3981.7299999999823,1055,0.7169451318299082,10,38,56,0.7,10,4,True,1,14,3.14,6.38,64,100,False,False,14,23.0,7,21,8.0,0.1,10000.0 +622,-2209.0200000000023,655,0.7583441087474483,11,42,56,2.1,9,4,True,0,14,3.14,7.07,64,100,True,False,14,19.9,7,21,6.0,0.1,10000.0 +623,-171.41000000000167,67,0.8395533215392248,11,46,64,1.3,10,3,False,0,20,2.64,7.36,80,100,True,True,14,19.9,8,22,8.0,0.1,10000.0 +624,-3388.580000000001,1177,0.7903290676190582,10,40,40,0.7,8,5,True,0,14,2.79,4.85,96,200,False,False,14,18.8,8,21,8.0,0.1,10000.0 +625,-536.7900000000081,137,0.7141297517228158,11,50,72,1.0,8,4,False,0,20,2.07,6.82,80,200,True,False,14,22.5,8,22,8.0,0.1,10000.0 +626,-5972.17000000002,1261,0.6151600210844034,8,46,56,2.0,8,2,True,0,20,2.27,7.13,64,100,False,True,14,18.6,7,21,8.0,0.1,10000.0 +627,-908.6299999999901,136,0.5771867045755954,8,48,48,2.0,10,2,False,0,14,2.43,5.1,64,200,False,False,14,18.3,7,22,8.0,0.1,10000.0 +628,-1185.2399999999961,442,0.789879377956162,11,44,64,2.0,6,2,True,1,14,2.6,6.87,48,100,True,False,14,16.2,7,21,8.0,0.1,10000.0 +629,-5811.610000000006,1182,0.5894419016360554,8,50,72,1.3,8,2,True,0,20,2.02,6.73,64,100,False,True,14,22.3,7,22,8.0,0.1,10000.0 +630,-5034.61,1129,0.6530857774822482,11,38,48,1.0,7,2,True,1,20,2.45,5.79,64,200,False,False,14,19.9,7,22,6.0,0.1,10000.0 +631,-1680.979999999994,640,0.8012144863266815,11,50,48,2.0,6,5,True,1,14,2.48,5.2,80,200,False,False,14,21.1,8,21,6.0,0.1,10000.0 +632,-3061.3200000000097,802,0.7066717769367126,8,42,40,2.2,9,3,True,0,20,2.74,5.92,64,100,True,False,14,19.3,8,21,6.0,0.1,10000.0 +633,-305.29999999999563,90,0.795955194353847,10,50,32,1.0,7,5,False,0,20,3.15,5.21,96,200,False,True,14,22.9,7,21,8.0,0.1,10000.0 +634,-1935.929999999992,451,0.7156790464329353,8,50,40,2.0,7,2,True,0,20,3.04,4.84,96,200,True,True,14,22.4,8,21,8.0,0.1,10000.0 +635,-1040.550000000001,233,0.6967140009093771,11,38,48,0.7,8,4,False,0,20,2.68,5.0,80,100,False,True,14,19.0,8,22,8.0,0.1,10000.0 +636,-140.04000000000633,56,0.8068067377598742,9,48,72,1.9,7,3,False,1,20,2.01,5.75,64,200,True,False,14,18.5,7,21,6.0,0.1,10000.0 +637,-1524.8399999999965,313,0.6547456510368906,12,52,48,0.7,10,5,False,0,14,2.42,6.18,64,200,False,False,14,23.4,8,22,8.0,0.1,10000.0 +638,-406.0399999999918,43,0.4808734785721592,12,46,48,1.7,9,4,False,1,14,2.09,4.96,64,200,True,False,14,20.5,7,22,8.0,0.1,10000.0 +639,-2269.420000000021,668,0.7482966865381949,12,46,72,2.2,9,3,True,0,14,3.19,4.77,64,100,True,False,14,23.0,8,21,6.0,0.1,10000.0 +640,187.3000000000011,57,1.2126403505784318,9,52,56,1.8,8,4,False,0,14,2.67,5.63,96,200,True,False,14,22.7,8,21,6.0,0.1,10000.0 +641,-2947.519999999985,585,0.6601263779345972,9,46,72,0.8,9,5,True,1,20,2.82,6.17,96,200,True,False,14,22.9,8,22,8.0,0.1,10000.0 +642,-1922.9199999999728,546,0.6929209178581182,9,44,56,1.2,6,3,True,0,14,2.01,5.43,48,200,True,True,14,23.4,8,21,8.0,0.1,10000.0 +643,45.220000000001164,25,1.0917557778544325,11,50,32,2.5,8,4,False,0,14,3.04,7.28,96,200,True,False,14,22.0,7,21,8.0,0.1,10000.0 +644,-5487.059999999975,1394,0.7052778693869395,8,42,72,2.0,7,2,True,0,14,2.53,6.63,80,100,False,False,14,23.9,7,21,8.0,0.1,10000.0 +645,-547.760000000002,94,0.6477540915083116,10,42,64,1.9,8,2,False,0,20,3.01,6.51,48,100,False,False,14,21.8,7,21,8.0,0.1,10000.0 +646,-996.3699999999953,274,0.7135806089038753,8,46,64,0.9,10,5,True,1,14,2.37,6.18,48,200,True,True,14,22.7,7,22,6.0,0.1,10000.0 +647,-82.54999999999382,73,0.9295077067588916,8,40,40,2.0,7,4,False,1,14,2.92,6.87,64,200,True,False,14,23.0,7,22,6.0,0.1,10000.0 +648,-3238.600000000002,773,0.6915007925379504,9,46,32,1.3,8,3,True,0,20,2.5,7.01,80,100,True,False,14,18.1,8,22,6.0,0.1,10000.0 +649,-684.4800000000014,140,0.6944994911895452,11,48,64,1.2,10,5,False,1,14,2.04,7.0,96,100,False,True,14,17.7,8,22,8.0,0.1,10000.0 +650,-1938.4400000000078,477,0.6816724006273145,9,48,72,2.4,10,4,True,1,14,2.31,5.9,48,100,False,True,14,21.0,8,21,8.0,0.1,10000.0 +651,-1248.0699999999742,409,0.7617327623894878,12,48,48,1.6,10,2,True,1,14,2.76,7.11,48,100,True,False,14,18.7,7,21,8.0,0.1,10000.0 +652,-416.46000000000095,134,0.8056839973684333,10,42,56,1.6,6,5,False,0,20,2.88,5.92,64,200,False,False,14,20.8,8,22,8.0,0.1,10000.0 +653,-2740.679999999991,487,0.5865252752922647,8,44,64,0.7,9,4,False,0,14,2.2,5.0,80,100,False,False,14,17.0,8,21,6.0,0.1,10000.0 +654,-2201.8800000000074,527,0.6798750834158406,10,42,48,1.4,7,5,True,1,14,2.24,5.02,80,100,True,False,14,22.9,8,21,6.0,0.1,10000.0 +655,-2208.7999999999947,701,0.7869311056662743,9,48,32,1.5,8,2,True,1,20,2.84,7.24,96,200,False,False,14,22.1,7,22,6.0,0.1,10000.0 +656,-429.11999999998807,92,0.7220455355118698,10,42,56,2.0,8,5,False,0,14,2.42,6.51,48,100,False,False,14,22.1,8,22,8.0,0.1,10000.0 +657,229.47000000000116,41,1.404744686480289,12,38,64,1.7,9,2,False,0,14,2.6,4.63,80,200,True,False,14,19.1,7,22,6.0,0.1,10000.0 +658,-2708.480000000015,839,0.7205986876242408,10,46,56,1.9,9,2,True,0,14,2.2,6.55,48,200,True,False,14,21.5,7,22,6.0,0.1,10000.0 +659,-4750.800000000005,1164,0.6963425344161746,9,48,40,1.6,9,5,True,0,20,2.51,4.66,96,200,False,True,14,16.9,8,22,8.0,0.1,10000.0 +660,-290.82000000000335,45,0.6216040387217654,10,48,32,2.1,9,5,False,0,14,2.01,7.34,80,100,False,True,14,21.8,8,22,6.0,0.1,10000.0 +661,-5480.689999999978,1345,0.6742173730841131,11,46,32,0.7,9,5,True,0,20,2.3,5.51,80,100,False,False,14,17.4,8,22,6.0,0.1,10000.0 +662,-2628.680000000013,746,0.7317963567205996,11,48,48,1.8,10,2,True,1,14,2.64,5.69,64,100,False,False,14,17.0,7,22,8.0,0.1,10000.0 +663,-4674.8999999999805,1298,0.6911674648038987,10,48,56,1.9,7,5,True,0,20,2.45,4.94,48,200,False,True,14,16.6,8,22,8.0,0.1,10000.0 +664,-3342.310000000015,757,0.6863088679447159,8,42,72,1.0,6,5,True,0,20,3.19,6.35,64,100,True,True,14,19.8,8,22,6.0,0.1,10000.0 +665,-3326.440000000015,875,0.6817370305381052,10,38,64,1.3,7,4,True,0,20,2.25,6.85,64,200,True,False,14,20.8,8,21,6.0,0.1,10000.0 +666,-193.92999999999665,122,0.8990016300979621,9,38,72,1.1,6,4,False,1,20,2.71,6.4,80,200,True,True,14,16.1,8,22,8.0,0.1,10000.0 +667,-356.4099999999944,52,0.6362532276007061,11,42,56,2.2,9,3,False,1,14,2.81,5.27,48,100,False,False,14,20.5,8,21,6.0,0.1,10000.0 +668,-700.7100000000046,85,0.5136356379840495,12,48,48,1.1,8,5,False,0,14,2.19,6.25,80,200,True,False,14,22.0,8,22,6.0,0.1,10000.0 +669,-4469.00999999998,1120,0.7053814408522758,11,42,56,1.7,6,2,True,0,14,3.19,6.21,64,100,False,False,14,20.4,8,21,8.0,0.1,10000.0 +670,-350.40000000000146,33,0.4915254237288136,12,46,48,2.0,6,4,False,1,20,2.27,5.71,96,200,True,False,14,23.4,7,22,8.0,0.1,10000.0 +671,-258.22000000000116,52,0.6900603747314344,8,48,56,1.8,6,5,False,1,20,3.17,5.73,48,100,True,True,14,21.0,7,22,6.0,0.1,10000.0 +672,-1945.4500000000053,440,0.6754061490050037,10,44,40,1.6,9,2,True,0,20,2.66,7.09,64,200,True,True,14,23.0,7,22,6.0,0.1,10000.0 +673,-518.3999999999978,108,0.6288287772256669,10,42,48,0.6,6,3,False,0,20,2.29,6.31,64,100,True,True,14,21.1,8,21,6.0,0.1,10000.0 +674,-2477.680000000002,612,0.6986373681976357,11,40,32,2.0,9,5,True,0,20,3.15,7.15,48,100,True,False,14,22.6,7,22,8.0,0.1,10000.0 +675,-3933.659999999989,1024,0.6645377956334976,8,48,56,1.9,10,5,True,0,14,2.18,5.29,48,100,True,False,14,21.3,7,21,8.0,0.1,10000.0 +676,-264.3700000000008,81,0.8074297993225772,9,46,32,1.2,6,5,False,0,14,2.91,5.53,96,200,True,True,14,18.1,8,21,6.0,0.1,10000.0 +677,-1276.6300000000083,329,0.7368223582356009,9,46,32,0.9,8,4,False,0,20,3.13,4.97,80,200,False,False,14,21.4,7,21,6.0,0.1,10000.0 +678,-1381.3599999999951,232,0.5560754571456117,12,46,56,1.0,7,2,True,1,20,2.18,4.54,80,200,True,True,14,23.2,8,21,8.0,0.1,10000.0 +679,-186.45999999999913,30,0.6453649815512191,12,48,56,2.2,9,3,False,0,14,2.58,5.64,48,200,True,False,14,17.7,7,22,6.0,0.1,10000.0 +680,-1286.0300000000043,189,0.5599043173542858,9,48,56,1.4,6,3,False,0,20,2.8,5.7,48,200,False,False,14,18.2,7,21,8.0,0.1,10000.0 +681,-1930.049999999993,368,0.6089002275614852,12,44,40,1.0,7,3,True,1,20,2.21,7.44,80,200,True,True,14,17.5,7,21,8.0,0.1,10000.0 +682,-4256.649999999998,907,0.6256435467671834,8,44,40,1.0,10,5,True,0,14,2.38,6.4,64,200,True,False,14,16.7,7,21,6.0,0.1,10000.0 +683,-1537.9099999999871,373,0.7274513973806865,12,52,48,1.6,10,5,True,1,20,2.93,5.08,96,100,True,False,14,20.8,8,21,8.0,0.1,10000.0 +684,-819.8900000000085,103,0.5268518732254565,12,52,64,1.1,8,4,False,0,20,2.33,6.18,80,200,True,False,14,19.9,8,22,8.0,0.1,10000.0 +685,-2794.099999999996,641,0.6451661652521655,9,42,32,2.0,8,2,True,0,14,2.23,4.83,64,100,True,True,14,18.4,8,21,8.0,0.1,10000.0 +686,-4251.860000000002,1128,0.7207091278967036,12,44,64,1.8,8,3,True,0,14,3.02,6.33,64,200,False,False,14,21.2,8,22,6.0,0.1,10000.0 +687,-118.19000000000779,118,0.9316144859948272,10,52,48,1.2,8,4,False,0,20,2.54,5.78,96,200,True,False,14,16.4,8,22,6.0,0.1,10000.0 +688,-445.1600000000035,32,0.33035485957549227,11,46,32,2.1,7,3,False,1,20,2.35,5.62,80,200,True,False,14,20.5,7,21,8.0,0.1,10000.0 +689,-593.3199999999997,130,0.719175683223052,10,40,32,1.0,8,5,False,1,20,3.14,7.34,96,200,True,False,14,23.9,8,21,6.0,0.1,10000.0 +690,-2646.12,684,0.7458395846019967,8,48,48,1.6,9,4,True,0,14,3.06,4.72,96,100,True,True,14,18.4,7,21,8.0,0.1,10000.0 +691,-153.6100000000024,29,0.6927431291755011,9,48,64,1.6,8,4,False,0,14,2.93,4.7,80,200,True,True,14,23.1,7,22,8.0,0.1,10000.0 +692,-431.69999999999163,124,0.7734631228189857,9,52,48,1.2,8,4,False,1,14,2.17,6.43,96,200,True,False,14,22.7,7,22,6.0,0.1,10000.0 +693,-741.620000000019,517,0.8842067297558508,12,50,32,2.4,8,5,True,1,20,2.76,6.7,48,100,False,False,14,22.4,7,22,6.0,0.1,10000.0 +694,-3309.110000000007,672,0.665279546518932,8,50,48,1.4,7,4,True,0,20,2.54,6.84,96,100,True,True,14,18.4,8,21,6.0,0.1,10000.0 +695,-1399.4399999999987,217,0.599184300067593,9,48,56,0.8,7,4,False,0,14,2.92,6.22,80,100,True,False,14,17.6,7,21,6.0,0.1,10000.0 +696,-2870.999999999998,693,0.673616850510606,12,38,40,1.6,6,4,True,0,14,2.24,4.99,80,100,True,False,14,16.2,8,21,8.0,0.1,10000.0 +697,-3817.360000000005,927,0.6974436118829961,8,52,72,2.2,7,5,True,0,20,2.48,5.12,96,100,True,False,14,20.1,7,21,6.0,0.1,10000.0 +698,-3483.88,859,0.7192604142743753,8,52,72,1.7,8,5,True,0,14,2.96,5.58,80,100,True,False,14,16.1,8,22,6.0,0.1,10000.0 +699,-746.7699999999932,204,0.7779532101144175,10,48,48,2.2,9,4,True,1,14,2.78,6.93,96,100,True,True,14,21.2,8,21,6.0,0.1,10000.0 +700,-2853.6600000000235,451,0.5589008614360153,9,42,64,0.5,10,3,True,1,20,2.91,4.68,64,200,True,True,14,19.3,7,22,6.0,0.1,10000.0 +701,-5306.279999999992,1370,0.7111433134784327,9,42,72,2.1,7,4,True,0,14,2.6,5.42,80,200,False,False,14,16.2,7,22,6.0,0.1,10000.0 +702,11.310000000003129,34,1.0202321962040035,11,38,72,2.2,9,2,False,0,14,2.19,4.54,64,100,True,False,14,16.9,8,22,8.0,0.1,10000.0 +703,-2685.649999999995,614,0.6526079144833259,12,52,40,2.2,6,4,True,0,20,2.15,6.47,80,100,True,False,14,22.0,7,21,6.0,0.1,10000.0 +704,-155.48000000000138,57,0.8081346562021817,12,42,40,1.0,6,2,False,0,20,3.06,4.82,64,200,True,True,14,21.3,8,22,8.0,0.1,10000.0 +705,-1453.1299999999974,238,0.5915822313410813,9,48,56,1.2,7,2,False,0,14,2.95,7.44,48,100,False,False,14,22.7,7,21,8.0,0.1,10000.0 +706,-283.9800000000014,57,0.6700439197824924,10,38,64,1.5,8,3,False,1,20,2.54,5.14,80,200,True,True,14,18.2,8,22,6.0,0.1,10000.0 +707,-203.2199999999957,49,0.7220733041575492,10,48,56,2.0,9,2,False,0,20,2.08,5.6,48,100,True,False,14,23.8,7,21,8.0,0.1,10000.0 +708,-1278.190000000015,193,0.5897951848214686,9,48,48,1.4,10,2,False,0,20,2.98,7.16,64,100,False,False,14,22.2,7,22,6.0,0.1,10000.0 +709,-4726.57999999999,1010,0.6526478857920581,12,38,64,1.2,7,3,True,0,14,2.82,6.4,64,100,False,True,14,19.4,7,22,6.0,0.1,10000.0 +710,-3490.4799999999914,815,0.666618910901113,11,46,56,2.3,9,5,True,0,14,2.87,5.4,48,200,False,True,14,21.3,7,21,6.0,0.1,10000.0 +711,-3112.159999999976,737,0.6774993808347901,11,42,40,1.5,7,3,True,0,20,2.47,5.08,80,100,True,False,14,17.1,8,21,6.0,0.1,10000.0 +712,-482.8299999999981,126,0.7744080213803801,9,52,40,1.8,8,2,False,0,20,2.63,6.81,96,100,False,False,14,18.4,7,22,6.0,0.1,10000.0 +713,-3034.3600000000024,655,0.6702012033945465,8,48,48,2.4,6,5,True,0,20,2.51,5.01,96,200,True,True,14,16.8,8,21,8.0,0.1,10000.0 +714,-1184.5800000000181,348,0.7486936985673646,11,50,32,1.8,8,4,True,1,20,2.5,7.01,80,100,True,False,14,21.7,8,21,8.0,0.1,10000.0 +715,-809.9099999999962,167,0.6178407964894069,9,50,72,1.0,9,5,False,1,20,2.05,4.82,48,100,True,False,14,18.9,8,22,6.0,0.1,10000.0 +716,-2817.4800000000096,821,0.728881994749848,10,52,56,1.6,10,2,True,1,20,2.8,4.58,64,100,False,False,14,16.8,8,21,8.0,0.1,10000.0 +717,-2015.469999999993,569,0.7504578000586876,10,48,72,1.2,7,4,True,0,20,2.55,7.47,80,100,True,True,14,22.2,8,22,8.0,0.1,10000.0 +718,-4152.269999999994,1034,0.732472343742953,9,52,32,1.2,10,3,True,0,14,3.1,4.77,96,200,False,False,14,21.1,8,21,8.0,0.1,10000.0 +719,-1800.7700000000004,479,0.7117356657819669,11,48,48,2.1,8,3,True,0,14,2.13,6.25,80,100,True,True,14,21.6,7,21,6.0,0.1,10000.0 +720,-3624.0200000000123,856,0.6565414559946169,12,50,48,0.8,8,4,True,0,20,2.12,7.37,80,100,True,False,14,19.5,7,21,6.0,0.1,10000.0 +721,-3447.630000000011,1070,0.7065227384162784,10,38,56,0.9,7,3,True,0,14,2.17,5.39,48,200,True,False,14,20.5,7,22,6.0,0.1,10000.0 +722,-1128.2799999999916,85,0.3625212581430694,12,50,72,1.7,9,4,False,0,20,2.52,5.59,64,200,False,False,14,16.6,7,22,6.0,0.1,10000.0 +723,214.9599999999973,25,1.501715486054382,12,42,32,2.5,10,5,False,0,14,2.97,6.31,80,100,True,False,14,20.6,7,22,8.0,0.1,10000.0 +724,-497.12999999999374,53,0.5380905923344947,11,50,32,2.4,7,2,False,0,14,3.08,5.93,64,100,False,False,14,16.5,8,22,6.0,0.1,10000.0 +725,-1171.8200000000033,164,0.524475808251531,12,52,56,1.9,7,5,True,1,20,2.37,6.59,80,200,True,True,14,22.4,8,21,8.0,0.1,10000.0 +726,-3108.140000000005,980,0.7577520905411441,8,38,72,2.0,10,2,True,1,14,2.64,6.69,64,100,False,False,14,22.7,7,22,6.0,0.1,10000.0 +727,-2647.3800000000037,662,0.6535903924714158,10,40,32,2.4,10,5,True,0,20,2.17,5.53,48,200,True,False,14,21.7,8,22,6.0,0.1,10000.0 +728,-6057.259999999999,1820,0.7089646755842558,9,46,56,0.9,8,2,True,0,14,2.63,4.56,48,100,False,False,14,16.8,7,21,6.0,0.1,10000.0 +729,-2083.7999999999956,430,0.6507096270246622,10,50,48,0.6,10,4,True,0,14,2.76,5.99,64,200,True,True,14,23.3,8,21,8.0,0.1,10000.0 +730,-4300.099999999995,1120,0.6854992181546108,9,42,56,0.6,6,2,True,0,14,2.42,5.04,64,100,True,False,14,20.8,8,22,8.0,0.1,10000.0 +731,-2752.909999999979,686,0.7479857886069009,11,40,72,1.6,8,3,True,0,14,3.15,5.97,96,100,True,False,14,23.3,8,21,6.0,0.1,10000.0 +732,-3237.769999999996,716,0.6828582399047136,10,50,64,1.8,8,4,True,0,14,2.35,6.38,96,200,True,False,14,19.9,8,21,8.0,0.1,10000.0 +733,-278.0899999999983,63,0.7193646372599477,12,52,64,1.3,9,4,False,1,14,2.63,4.62,48,200,False,True,14,23.2,7,22,6.0,0.1,10000.0 +734,-1089.8499999999894,462,0.8516177255448693,12,38,32,2.4,9,3,True,1,14,2.99,6.55,96,100,False,False,14,21.4,7,21,6.0,0.1,10000.0 +735,-2493.0500000000065,690,0.6769807047458136,11,42,40,1.9,6,3,True,0,14,2.05,5.64,48,200,True,False,14,21.3,8,21,8.0,0.1,10000.0 +736,-1235.300000000001,141,0.4698761055870501,9,48,56,0.6,7,3,False,1,20,3.06,5.77,80,100,False,True,14,23.3,8,21,8.0,0.1,10000.0 +737,-1435.2899999999954,442,0.7882419072377128,11,50,48,2.2,7,5,True,1,14,2.75,5.69,96,100,False,True,14,17.8,7,21,6.0,0.1,10000.0 +738,-277.67000000000553,69,0.7550006617549742,11,40,40,1.6,7,4,False,1,20,2.34,5.36,80,100,True,False,14,22.6,7,21,8.0,0.1,10000.0 +739,-3638.610000000007,937,0.659380172097447,9,42,64,2.5,9,5,True,0,14,2.05,5.66,48,100,True,False,14,20.9,8,21,8.0,0.1,10000.0 +740,139.9499999999989,23,1.3506991429860171,12,38,72,2.4,7,3,False,0,14,2.68,7.35,80,200,True,False,14,19.7,7,22,8.0,0.1,10000.0 +741,-5714.690000000027,1417,0.6407477629598709,9,46,64,0.6,7,3,True,1,20,2.03,5.82,64,200,False,False,14,17.1,8,21,6.0,0.1,10000.0 +742,-595.1500000000033,99,0.5629777578699251,8,50,64,1.6,10,3,False,0,20,2.05,7.2,64,100,True,False,14,20.5,8,21,6.0,0.1,10000.0 +743,-1100.100000000004,265,0.7194259466600695,8,40,32,1.8,9,5,True,1,20,2.54,6.74,96,200,True,True,14,19.6,7,22,8.0,0.1,10000.0 +744,-3483.74,823,0.7039322834779503,9,42,48,1.8,7,5,True,0,20,2.89,5.8,80,100,True,False,14,19.3,7,22,6.0,0.1,10000.0 +745,-472.81000000000313,166,0.8269166706324657,10,44,56,1.3,9,5,False,0,20,3.14,5.89,80,200,False,False,14,17.1,7,21,6.0,0.1,10000.0 +746,-1704.0199999999768,529,0.7676617281728664,9,44,72,1.8,10,4,True,1,20,2.45,5.42,96,100,True,False,14,20.3,8,22,8.0,0.1,10000.0 +747,-1601.729999999994,237,0.5971270973924548,8,44,40,1.2,7,5,False,0,14,3.13,4.57,64,200,False,True,14,17.4,7,22,6.0,0.1,10000.0 +748,-1524.4299999999857,510,0.7644729482944556,9,50,48,1.4,7,5,True,1,14,2.81,6.86,48,100,True,False,14,18.7,7,22,8.0,0.1,10000.0 +749,-620.2399999999961,113,0.6517716281237192,9,42,40,1.1,6,4,False,0,20,2.57,6.61,80,200,True,True,14,17.3,7,21,8.0,0.1,10000.0 +750,-438.52000000000226,107,0.765714072008249,8,50,40,1.6,9,4,False,0,14,2.8,4.94,96,100,True,False,14,23.0,8,22,8.0,0.1,10000.0 +751,82.35999999999876,57,1.097497454838175,9,38,64,1.9,8,5,False,1,14,2.54,4.56,96,200,True,False,14,23.1,7,21,6.0,0.1,10000.0 +752,-935.480000000005,121,0.5200082095487314,12,46,72,1.3,7,2,False,0,20,2.35,6.88,48,200,False,False,14,16.1,8,21,8.0,0.1,10000.0 +753,-3746.7200000000093,981,0.6825488815514665,10,44,64,1.1,10,2,True,0,14,2.06,5.22,80,200,True,False,14,18.7,8,22,6.0,0.1,10000.0 +754,-130.52000000000044,40,0.8131210446436242,10,38,40,2.2,10,2,False,1,14,2.36,5.1,96,200,True,False,14,21.6,8,22,8.0,0.1,10000.0 +755,-207.02000000000226,89,0.8677948783447219,10,50,56,1.9,7,4,False,0,14,2.59,5.3,96,100,False,False,14,22.9,7,21,6.0,0.1,10000.0 +756,-2157.2200000000057,440,0.6593705392670818,8,44,32,0.9,6,3,False,0,14,3.04,4.53,48,200,False,False,14,17.2,8,22,6.0,0.1,10000.0 +757,-3490.249999999989,549,0.49453221510820433,12,40,32,1.9,7,2,True,0,14,2.0,6.87,64,100,True,True,14,16.6,8,21,8.0,0.1,10000.0 +758,-287.15999999999985,58,0.677482394959399,9,52,64,1.9,9,4,False,1,14,2.53,6.02,48,100,True,False,14,17.2,7,21,6.0,0.1,10000.0 +759,-1924.9900000000125,441,0.6987298069669682,9,42,48,2.0,7,3,True,1,20,2.72,6.02,80,100,True,False,14,22.6,7,21,8.0,0.1,10000.0 +760,-1858.8999999999942,306,0.5677881373665977,10,42,32,0.6,9,4,False,0,20,2.1,6.79,96,100,False,True,14,16.7,8,21,8.0,0.1,10000.0 +761,-4515.279999999997,1224,0.7005568038029248,10,52,48,2.0,9,4,True,0,20,2.38,7.5,64,100,False,False,14,16.3,8,22,8.0,0.1,10000.0 +762,-2553.5099999999857,652,0.6853144009227948,11,48,56,1.4,9,5,True,0,20,2.5,4.57,64,200,True,True,14,17.2,8,21,8.0,0.1,10000.0 +763,-3620.0,906,0.6527687852566777,9,42,64,2.4,7,2,True,0,20,2.18,5.51,48,200,True,False,14,18.4,8,21,6.0,0.1,10000.0 +764,-1282.8600000000097,139,0.520417204059889,11,52,56,1.4,7,5,False,0,20,3.15,4.7,80,200,False,False,14,17.1,8,21,8.0,0.1,10000.0 +765,-237.56000000000313,88,0.8461976718590167,11,38,48,1.8,8,4,False,1,20,2.73,6.3,80,200,False,False,14,22.5,7,22,8.0,0.1,10000.0 +766,-3419.6699999999964,802,0.7314284906473905,8,38,56,1.2,7,3,True,1,14,3.09,7.21,96,200,False,False,14,20.6,8,21,6.0,0.1,10000.0 +767,-1386.3399999999838,357,0.7151123961473571,10,44,72,1.7,7,3,True,1,20,3.07,5.44,48,200,True,True,14,18.6,8,22,8.0,0.1,10000.0 +768,-5572.6400000000085,1424,0.6912343224668276,8,52,56,2.1,8,3,True,0,20,2.3,6.4,80,200,False,False,14,20.5,8,22,8.0,0.1,10000.0 +769,-3152.6800000000103,641,0.6653252131340014,10,44,72,0.9,10,2,True,1,14,2.88,5.08,80,100,True,False,14,21.6,7,22,8.0,0.1,10000.0 +770,-3976.540000000009,969,0.6729603921310612,9,42,48,0.6,9,2,True,0,14,2.54,5.65,64,200,True,False,14,23.5,8,22,6.0,0.1,10000.0 +771,-2376.660000000019,538,0.703507150155129,12,52,48,0.8,7,4,True,0,14,3.04,6.16,80,100,True,True,14,19.0,7,22,8.0,0.1,10000.0 +772,-2022.9599999999882,413,0.6523645861974154,11,42,48,1.7,6,4,True,1,14,3.06,4.67,64,200,True,False,14,17.1,7,21,6.0,0.1,10000.0 +773,-5336.69000000003,1285,0.7052080180122452,8,48,48,1.2,9,4,True,0,20,2.65,6.07,96,100,False,False,14,22.5,8,21,6.0,0.1,10000.0 +774,-2771.299999999994,441,0.5444907593080822,10,44,40,0.6,10,2,True,1,14,2.57,4.63,64,100,True,True,14,18.6,8,22,6.0,0.1,10000.0 +775,-6406.960000000014,1641,0.655142642763871,12,46,56,0.5,9,2,True,0,14,2.25,6.25,48,200,False,False,14,20.7,8,21,8.0,0.1,10000.0 +776,-3511.6900000000087,758,0.6384821912054471,9,42,64,0.5,10,4,True,1,20,2.61,4.98,64,200,True,False,14,18.6,8,22,6.0,0.1,10000.0 +777,-3525.6500000000115,774,0.6219831237200725,10,52,32,1.4,10,5,True,0,14,2.05,6.91,64,100,False,True,14,22.0,7,22,8.0,0.1,10000.0 +778,-2514.509999999992,517,0.6328469615268366,11,38,72,1.8,10,4,True,1,14,2.37,5.15,64,200,True,False,14,23.6,8,22,8.0,0.1,10000.0 +779,-88.21999999999935,86,0.933061695234193,11,42,56,1.5,10,4,False,0,14,2.74,7.15,48,100,True,False,14,23.4,8,22,8.0,0.1,10000.0 +780,-2475.469999999983,643,0.6590383815455645,12,42,32,0.6,7,3,True,1,20,2.09,5.75,48,200,True,False,14,18.4,8,22,6.0,0.1,10000.0 +781,-788.0000000000055,113,0.562931244869434,8,38,56,0.8,6,2,False,0,20,3.04,6.24,80,200,True,True,14,20.5,7,21,6.0,0.1,10000.0 +782,-4219.030000000004,959,0.6159770261414113,8,50,72,1.3,6,5,True,0,20,2.21,4.54,48,100,True,True,14,18.3,8,21,8.0,0.1,10000.0 +783,-757.7000000000098,198,0.7423227342288727,8,46,40,1.0,9,2,False,0,20,2.67,6.61,64,100,True,False,14,16.7,8,22,8.0,0.1,10000.0 +784,-1614.9800000000232,390,0.7044488772578372,12,42,48,1.8,8,3,True,1,20,2.49,6.24,80,200,True,False,14,17.2,8,22,8.0,0.1,10000.0 +785,-1355.0400000000063,261,0.6280295481310066,11,40,64,1.0,7,4,True,1,20,2.54,6.12,64,100,True,True,14,23.3,7,22,6.0,0.1,10000.0 +786,-3619.2600000000048,949,0.7221739040321423,12,42,40,2.1,9,2,True,0,14,2.62,6.23,80,100,False,False,14,21.5,8,22,6.0,0.1,10000.0 +787,-1586.2900000000045,480,0.7481839540273677,10,48,64,2.4,10,5,True,1,20,2.9,6.56,48,100,False,True,14,19.6,7,21,6.0,0.1,10000.0 +788,-2606.4500000000007,640,0.6902341976596873,11,42,32,1.9,8,3,True,0,14,2.65,4.79,64,100,True,False,14,18.4,7,21,6.0,0.1,10000.0 +789,-71.33999999999833,45,0.9149316734635472,8,46,56,2.4,9,4,False,0,14,2.84,5.4,96,200,True,False,14,19.4,8,21,8.0,0.1,10000.0 +790,-2464.789999999998,490,0.6354028143679802,8,52,48,1.2,8,5,True,1,14,2.51,6.26,80,200,True,False,14,16.3,8,21,8.0,0.1,10000.0 +791,-737.3500000000095,217,0.7204837089406547,10,40,32,1.0,6,5,True,1,20,2.29,7.45,48,200,True,True,14,22.2,8,21,8.0,0.1,10000.0 +792,-2820.909999999999,564,0.671871601273472,8,38,72,0.8,6,5,True,1,14,2.56,6.59,96,100,True,True,14,16.9,8,21,8.0,0.1,10000.0 +793,-2411.4399999999923,443,0.6542812699368473,10,42,32,1.1,8,5,True,1,14,3.16,4.73,96,200,True,False,14,19.1,7,22,6.0,0.1,10000.0 +794,-2467.9499999999907,523,0.6522368332055732,10,42,40,1.2,10,5,True,1,20,2.97,7.34,48,100,True,False,14,17.1,7,22,8.0,0.1,10000.0 +795,-2633.940000000006,660,0.717334426532106,10,50,32,1.9,8,2,True,0,14,2.33,6.17,96,100,True,False,14,18.1,8,22,8.0,0.1,10000.0 +796,-640.3699999999935,193,0.782912177692198,12,44,40,0.7,7,2,False,0,14,2.54,7.49,80,200,True,False,14,23.8,7,22,6.0,0.1,10000.0 +797,-736.539999999999,171,0.679339994340321,12,38,40,0.9,8,3,False,1,20,2.01,4.68,48,100,False,True,14,18.1,7,22,6.0,0.1,10000.0 +798,-4938.810000000006,1477,0.6960244076125458,10,44,56,2.1,7,5,True,0,14,2.12,5.66,48,100,False,False,14,22.9,7,21,8.0,0.1,10000.0 +799,-3645.320000000017,921,0.6671083524268822,12,40,64,0.8,9,4,True,0,20,2.07,5.8,80,200,True,False,14,21.4,8,22,8.0,0.1,10000.0 +800,-190.100000000004,24,0.6071502376524076,12,44,72,2.3,9,5,False,1,14,2.29,6.06,96,100,True,True,14,16.2,7,21,6.0,0.1,10000.0 +801,-1733.9699999999975,274,0.6329235582897413,8,48,48,1.3,9,4,True,1,20,3.1,7.07,96,200,True,True,14,20.7,7,22,8.0,0.1,10000.0 +802,-2078.0999999999913,447,0.6833791177398197,8,52,48,1.6,10,2,True,1,20,3.12,7.12,64,200,True,False,14,20.5,8,22,6.0,0.1,10000.0 +803,-284.0699999999997,85,0.7560185861153816,10,50,48,1.0,9,3,False,0,20,2.23,6.56,80,100,True,True,14,20.2,7,22,6.0,0.1,10000.0 +804,-1927.9500000000016,575,0.7763567712411478,9,48,40,2.3,9,4,True,0,20,2.86,7.3,96,200,True,False,14,20.8,8,21,8.0,0.1,10000.0 +805,-724.1099999999988,177,0.7090396955828167,12,50,32,0.6,8,5,True,1,20,2.61,5.76,80,100,True,True,14,23.9,7,22,8.0,0.1,10000.0 +806,-2464.1199999999862,456,0.6114423396844069,11,48,32,0.8,6,4,True,0,14,2.33,6.15,80,100,True,True,14,21.5,7,21,6.0,0.1,10000.0 +807,-3525.640000000016,772,0.6578546675193677,8,40,48,2.5,8,4,True,0,14,2.26,6.31,80,200,True,False,14,16.2,8,21,6.0,0.1,10000.0 +808,-221.64999999999782,50,0.7532396686854294,11,44,64,1.7,7,2,False,1,20,2.97,4.87,64,200,True,False,14,19.7,7,21,6.0,0.1,10000.0 +809,-1271.8699999999917,285,0.665233939062138,10,40,32,1.0,8,5,False,1,20,2.54,5.2,48,200,False,False,14,19.5,8,22,6.0,0.1,10000.0 +810,-278.17000000000735,43,0.6485666999355678,12,46,40,2.3,9,5,False,0,20,2.02,6.02,96,200,False,False,14,19.0,7,22,6.0,0.1,10000.0 +811,-2436.82999999999,606,0.745374999869387,11,44,40,1.1,9,4,True,1,20,3.08,5.64,96,100,False,True,14,18.0,7,22,6.0,0.1,10000.0 +812,-500.429999999993,86,0.6006049626088413,11,48,48,1.3,9,5,False,0,20,2.11,5.26,64,200,True,False,14,19.8,7,21,6.0,0.1,10000.0 +813,-2472.25,480,0.6587420560644458,8,50,48,0.6,7,2,False,0,14,2.74,6.16,80,100,False,False,14,19.6,8,21,8.0,0.1,10000.0 +814,-5704.4299999999985,1283,0.657272202929549,10,42,40,1.3,7,2,True,0,14,2.69,6.85,64,200,False,False,14,23.5,7,21,6.0,0.1,10000.0 +815,-467.9699999999975,105,0.7288466552713156,9,40,32,2.0,8,3,False,0,20,2.66,5.61,64,100,False,False,14,18.0,7,22,6.0,0.1,10000.0 +816,-5538.809999999976,1369,0.6820481645530382,10,38,64,1.5,6,5,True,0,14,2.56,7.04,64,200,False,False,14,19.7,8,21,6.0,0.1,10000.0 +817,-4151.440000000003,952,0.6929367402820451,9,42,72,1.7,6,2,True,0,14,2.34,6.09,96,200,False,True,14,21.8,8,22,8.0,0.1,10000.0 +818,-3857.790000000002,1126,0.743672526152407,10,50,40,1.5,9,3,True,0,14,2.72,5.6,80,100,False,False,14,19.1,8,22,6.0,0.1,10000.0 +819,111.47999999999956,48,1.1609865988909427,10,52,40,2.0,7,5,False,0,20,3.04,6.87,64,200,True,False,14,17.1,7,22,8.0,0.1,10000.0 +820,-2341.1599999999953,684,0.7489289188166041,11,50,56,1.9,8,3,True,0,20,3.15,5.24,64,100,True,False,14,16.4,8,22,8.0,0.1,10000.0 +821,-3904.2799999999797,876,0.6474318280125305,8,46,48,2.1,10,5,True,0,14,2.42,5.08,64,100,True,False,14,22.0,8,21,6.0,0.1,10000.0 +822,-5176.169999999993,1158,0.6631915457087288,12,44,72,1.5,6,5,True,0,20,2.42,5.48,80,100,False,True,14,17.0,8,22,8.0,0.1,10000.0 +823,-3046.5700000000097,714,0.6992675583633582,12,38,72,2.1,10,2,True,0,20,2.79,5.82,80,100,True,False,14,16.7,8,22,8.0,0.1,10000.0 +824,-3227.4200000000073,703,0.6557833562461272,9,38,32,1.1,7,3,True,1,14,2.5,6.98,64,200,False,True,14,18.0,7,21,6.0,0.1,10000.0 +825,-3965.4600000000046,846,0.6310987238333746,9,38,48,2.0,6,3,True,0,20,2.14,6.51,80,200,True,False,14,20.6,8,22,6.0,0.1,10000.0 +826,-5137.410000000023,1159,0.6614936053292217,12,46,64,2.1,7,3,True,0,20,2.33,7.32,80,200,False,False,14,16.4,8,22,6.0,0.1,10000.0 +827,-3022.4100000000135,672,0.6626718081217877,9,44,40,2.3,7,5,True,0,20,2.5,5.7,80,200,True,False,14,17.3,8,21,8.0,0.1,10000.0 +828,-3214.219999999985,811,0.7079351867669348,8,50,56,2.1,7,5,True,0,20,3.13,4.85,64,200,True,False,14,20.7,8,22,6.0,0.1,10000.0 +829,-105.21999999999935,39,0.8406578429293999,10,44,64,2.1,8,3,False,0,20,3.02,4.8,48,100,True,True,14,19.4,7,21,6.0,0.1,10000.0 +830,-1281.9800000000032,284,0.656829126613825,8,52,40,0.6,8,4,False,1,20,2.8,4.76,64,200,True,False,14,16.3,7,21,6.0,0.1,10000.0 +831,-1709.2500000000055,439,0.7315977412911574,9,42,56,2.1,9,2,True,1,20,2.74,6.08,80,100,True,False,14,20.8,8,21,6.0,0.1,10000.0 +832,-377.3200000000088,84,0.7182581165437113,11,44,72,1.1,9,4,False,0,20,2.97,5.58,80,200,False,True,14,22.5,8,21,8.0,0.1,10000.0 +833,-6280.049999999979,1398,0.6279487639762482,10,44,40,1.4,7,2,True,0,14,2.18,7.49,64,100,False,False,14,18.3,8,22,6.0,0.1,10000.0 +834,-800.2299999999886,212,0.7500413874962907,11,50,56,0.7,10,4,False,0,20,2.79,5.59,96,100,True,False,14,16.4,8,22,6.0,0.1,10000.0 +835,-2250.8599999999815,683,0.7557284216969195,11,52,72,2.4,8,5,True,0,20,2.79,7.37,64,100,True,False,14,19.3,8,22,6.0,0.1,10000.0 +836,-3537.0500000000166,899,0.7160460228540785,8,42,40,1.5,9,4,True,1,14,2.5,6.81,80,200,False,False,14,18.7,7,22,6.0,0.1,10000.0 +837,-440.7999999999993,70,0.6207095347496493,9,42,48,1.9,10,4,False,0,14,2.52,7.35,48,200,False,True,14,20.4,8,21,8.0,0.1,10000.0 +838,-2493.5499999999975,701,0.7419347827886837,10,38,56,1.7,6,5,True,0,14,3.11,7.0,64,200,True,False,14,23.1,7,21,8.0,0.1,10000.0 +839,-3384.8299999999854,727,0.5870526891113074,11,46,32,1.6,6,3,True,0,20,2.0,4.64,48,200,False,True,14,23.5,7,22,6.0,0.1,10000.0 +840,-3035.0399999999927,795,0.6726279592532348,11,44,64,1.8,8,2,True,0,20,2.21,6.47,48,200,True,False,14,21.2,8,21,6.0,0.1,10000.0 +841,-3991.2799999999943,864,0.6768364418067067,9,46,40,1.8,8,5,True,0,14,2.87,5.58,80,200,False,True,14,20.4,7,21,6.0,0.1,10000.0 +842,-2916.8999999999915,729,0.6932039774412524,8,38,40,0.6,8,3,True,0,20,2.15,6.8,96,100,True,True,14,20.9,7,22,6.0,0.1,10000.0 +843,-69.83000000000175,48,0.9187909940921989,10,42,56,2.1,10,4,False,0,14,3.19,4.99,80,100,False,True,14,20.3,8,22,6.0,0.1,10000.0 +844,-5496.690000000023,1530,0.7021855406907822,10,50,56,0.7,10,5,True,0,14,2.75,5.95,48,100,False,False,14,20.5,8,22,8.0,0.1,10000.0 +845,-2757.8699999999963,397,0.586638408467867,10,44,32,0.6,7,2,False,0,14,3.19,7.3,80,200,False,False,14,23.8,8,21,6.0,0.1,10000.0 +846,-5063.830000000002,1170,0.6767172419428772,8,40,64,0.8,9,4,True,1,14,2.94,6.41,64,200,False,False,14,18.3,7,21,8.0,0.1,10000.0 +847,-3296.780000000006,826,0.6748821036147001,9,46,56,2.5,8,4,True,0,20,2.09,5.43,80,200,True,False,14,23.9,8,21,6.0,0.1,10000.0 +848,-4472.409999999994,1061,0.6628702848002509,9,40,48,0.7,8,4,True,0,14,2.69,6.25,48,100,True,False,14,18.5,7,22,8.0,0.1,10000.0 +849,-1134.1099999999951,189,0.5927806363352376,8,50,32,1.1,9,2,False,0,20,2.89,4.91,48,100,True,False,14,16.3,8,22,6.0,0.1,10000.0 +850,-2641.969999999985,793,0.731361055045172,10,42,64,2.4,7,2,True,0,14,2.78,6.21,48,100,True,False,14,21.8,7,21,6.0,0.1,10000.0 +851,-2876.819999999995,991,0.7722025362562704,11,38,72,1.5,8,3,True,1,14,2.07,5.13,96,100,False,False,14,18.8,8,22,8.0,0.1,10000.0 +852,-2708.219999999973,857,0.7226852292729679,10,44,64,2.2,6,5,True,1,20,2.0,4.84,64,200,False,False,14,20.6,7,21,6.0,0.1,10000.0 +853,-5321.989999999981,1245,0.6842916718572962,8,44,40,2.0,6,5,True,0,20,3.15,6.22,64,100,False,False,14,19.3,8,21,8.0,0.1,10000.0 +854,-4906.039999999995,1191,0.7202595760136801,9,42,72,1.8,6,4,True,0,20,2.79,6.54,96,100,False,False,14,17.7,8,21,6.0,0.1,10000.0 +855,-5508.009999999975,1446,0.656236659535109,11,52,48,1.4,8,2,True,0,14,2.07,7.17,48,200,False,False,14,17.6,7,22,6.0,0.1,10000.0 +856,-483.6400000000049,159,0.8133543273052848,10,46,40,1.4,6,5,False,0,20,2.42,6.43,96,100,False,False,14,22.7,8,22,6.0,0.1,10000.0 +857,-226.42999999999665,24,0.5452573654931416,11,44,56,2.3,6,3,False,0,20,2.26,7.35,64,100,True,True,14,19.0,8,21,8.0,0.1,10000.0 +858,-5228.029999999991,1292,0.6948491794303377,12,46,72,1.3,6,2,True,0,20,2.97,6.77,64,200,False,False,14,17.2,7,22,8.0,0.1,10000.0 +859,-776.2099999999973,60,0.30432171793217183,12,48,32,1.5,7,2,False,0,20,2.3,6.91,64,200,False,True,14,20.5,8,21,8.0,0.1,10000.0 +860,-1847.0300000000016,453,0.6727213126373237,11,44,40,1.1,8,4,True,0,20,2.59,5.79,48,100,True,True,14,23.2,7,22,6.0,0.1,10000.0 +861,-297.8499999999967,86,0.7678831661718062,9,52,56,1.6,6,2,False,1,20,2.86,5.16,64,100,True,False,14,16.3,7,22,6.0,0.1,10000.0 +862,-4347.740000000001,924,0.6033811317449993,10,52,40,0.7,7,2,True,0,14,2.05,6.57,64,100,True,False,14,22.4,8,21,6.0,0.1,10000.0 +863,-3558.5600000000086,943,0.654580839921764,12,44,64,1.1,9,4,True,0,14,2.03,4.79,48,200,True,False,14,22.6,7,21,6.0,0.1,10000.0 +864,-1785.930000000004,368,0.662103817279167,9,44,40,0.8,9,2,False,0,14,2.74,4.59,64,200,False,False,14,22.7,8,21,6.0,0.1,10000.0 +865,-1876.4299999999848,296,0.5061519471735257,9,52,56,0.5,8,2,False,0,20,2.13,6.79,64,100,True,False,14,16.9,7,21,8.0,0.1,10000.0 +866,-2661.0499999999965,560,0.663983806874502,12,48,56,0.8,10,3,True,0,14,2.73,6.88,80,200,True,True,14,17.7,7,21,8.0,0.1,10000.0 +867,-211.97999999999593,49,0.7212733225513787,10,50,64,1.4,6,2,False,0,14,2.28,6.6,48,200,True,True,14,20.6,7,21,6.0,0.1,10000.0 +868,-1709.5799999999945,374,0.6708801786539351,12,44,40,1.0,6,2,True,1,14,2.41,6.11,80,200,True,True,14,17.1,7,21,8.0,0.1,10000.0 +869,-178.09000000000196,34,0.6968629253263885,11,44,40,2.1,7,2,False,0,20,2.09,6.66,48,200,True,False,14,21.5,8,21,6.0,0.1,10000.0 +870,-6405.45000000002,1560,0.6324920737465733,8,38,72,1.9,6,2,True,0,14,2.1,5.07,48,200,False,True,14,19.0,7,21,8.0,0.1,10000.0 +871,-1988.1800000000048,513,0.7116076129857659,10,50,72,0.7,10,4,True,0,14,2.1,6.94,96,200,True,True,14,23.3,7,21,6.0,0.1,10000.0 +872,-3196.6800000000103,887,0.7294530460525982,10,38,48,1.3,6,5,True,0,14,2.72,4.51,80,100,True,False,14,21.1,7,22,8.0,0.1,10000.0 +873,-2401.5399999999754,721,0.755891937605331,12,42,56,1.3,6,3,True,0,20,2.61,7.47,80,100,True,False,14,22.6,8,21,6.0,0.1,10000.0 +874,-392.8400000000056,146,0.8149216041007086,11,38,56,0.9,9,5,False,0,14,2.93,6.84,64,100,True,False,14,18.1,7,21,8.0,0.1,10000.0 +875,197.89000000000487,26,1.5586641070521143,10,40,64,2.3,6,4,False,1,20,3.15,6.43,96,200,True,True,14,17.6,7,21,8.0,0.1,10000.0 +876,-81.06000000000313,51,0.8945149326566464,10,44,40,1.8,7,5,False,1,20,2.87,6.07,80,200,True,False,14,16.2,8,21,8.0,0.1,10000.0 +877,-3748.9000000000033,776,0.6474815273136229,12,50,40,0.7,8,2,True,0,20,2.35,7.45,96,100,True,False,14,22.1,7,21,8.0,0.1,10000.0 +878,-2074.930000000001,436,0.6710965772283364,9,48,48,1.6,7,4,True,1,14,2.8,5.91,80,200,True,False,14,20.1,7,21,6.0,0.1,10000.0 +879,-2719.040000000001,815,0.7273880267053537,10,44,64,1.9,10,3,True,0,14,2.56,7.0,48,200,True,False,14,21.5,7,22,6.0,0.1,10000.0 +880,167.76000000000386,45,1.3093205494606803,9,44,40,2.4,8,3,False,0,20,3.06,4.87,64,100,True,False,14,16.8,8,22,6.0,0.1,10000.0 +881,62.06999999999425,20,1.1725316877918612,12,38,64,2.5,7,2,False,1,14,2.59,4.9,80,100,True,False,14,22.8,7,21,8.0,0.1,10000.0 +882,-823.1199999999935,162,0.6400685650318337,10,50,32,1.4,10,5,False,1,14,2.01,5.05,48,100,False,False,14,18.7,8,21,6.0,0.1,10000.0 +883,-131.26000000000022,23,0.6766995073891626,12,38,40,1.9,8,5,False,1,20,2.32,5.35,48,200,True,True,14,21.4,8,22,8.0,0.1,10000.0 +884,-1745.739999999998,284,0.5757164800124436,9,38,32,1.1,6,2,False,1,20,2.13,5.38,64,200,False,False,14,18.7,7,21,8.0,0.1,10000.0 +885,-4752.379999999997,1183,0.6533930414297853,9,42,72,0.8,7,3,True,0,20,2.33,5.51,48,100,True,False,14,21.6,8,21,8.0,0.1,10000.0 +886,-4180.599999999975,999,0.6589751307822135,8,48,72,0.5,8,3,True,0,20,2.52,6.87,48,100,True,True,14,17.0,7,21,6.0,0.1,10000.0 +887,-4019.8300000000036,995,0.6961777238970105,8,44,48,1.3,10,2,True,0,14,2.82,4.72,64,100,True,False,14,18.0,8,22,6.0,0.1,10000.0 +888,-2642.4800000000196,745,0.7544788780552164,11,42,56,1.6,9,5,True,1,14,2.75,7.45,80,200,False,False,14,16.9,8,21,8.0,0.1,10000.0 +889,-3349.720000000012,739,0.6217326544278482,9,48,48,1.0,10,3,True,0,14,2.28,5.62,48,100,True,True,14,19.0,7,21,8.0,0.1,10000.0 +890,-447.38999999999396,151,0.815903283282377,12,40,48,1.1,7,2,False,0,20,2.7,5.0,96,200,False,False,14,22.6,8,21,8.0,0.1,10000.0 +891,-3831.019999999993,926,0.6899616399333149,9,48,64,1.3,10,3,True,0,14,2.35,6.82,80,100,True,False,14,16.9,7,22,6.0,0.1,10000.0 +892,-158.78000000000247,64,0.8690862919050839,11,50,64,1.6,6,5,False,1,14,3.19,5.92,96,100,True,False,14,23.8,7,22,6.0,0.1,10000.0 +893,-1074.9799999999996,415,0.8072939261500732,9,46,64,2.4,7,3,True,1,20,2.78,7.2,64,100,True,False,14,23.2,8,21,6.0,0.1,10000.0 +894,-1399.0600000000013,194,0.5458437886495031,12,50,48,0.6,7,5,False,0,14,2.52,5.3,96,200,True,False,14,21.0,7,21,8.0,0.1,10000.0 +895,166.0699999999979,37,1.2644510971686995,11,40,72,2.2,7,3,False,0,20,3.18,6.75,80,100,True,False,14,20.3,7,22,8.0,0.1,10000.0 +896,-2659.9299999999776,523,0.6687105026516312,8,38,40,1.5,7,2,True,1,20,2.72,7.22,96,100,True,False,14,22.7,8,21,6.0,0.1,10000.0 +897,-6057.500000000032,1485,0.698537352503521,8,44,64,1.2,6,2,True,0,14,2.73,5.34,80,100,False,False,14,16.4,8,21,6.0,0.1,10000.0 +898,-232.3699999999917,54,0.7661120673168866,12,52,72,1.3,7,2,False,0,14,2.77,5.31,96,200,True,True,14,18.3,7,21,8.0,0.1,10000.0 +899,-2902.04999999999,715,0.7328879087379676,9,50,56,1.8,10,3,True,0,14,2.9,5.98,96,200,True,False,14,20.5,7,22,6.0,0.1,10000.0 +900,-3416.4700000000166,796,0.7170027624881444,11,46,32,2.4,7,3,True,0,14,3.12,7.36,80,200,False,False,14,17.6,8,21,8.0,0.1,10000.0 +901,-3483.319999999989,867,0.6841491535013787,12,40,56,0.5,7,2,True,1,14,2.0,4.84,96,100,False,True,14,18.5,8,22,8.0,0.1,10000.0 +902,-3626.959999999999,770,0.6669320587168432,11,40,40,0.9,6,4,True,0,14,2.87,5.01,80,100,True,False,14,18.4,7,21,8.0,0.1,10000.0 +903,-4368.639999999982,906,0.6716633960573812,10,46,32,1.0,7,4,True,0,20,2.64,7.28,96,200,False,True,14,17.4,7,21,6.0,0.1,10000.0 +904,-1454.1000000000022,522,0.803101413401724,9,40,56,2.3,10,3,True,1,14,2.31,7.29,96,100,False,True,14,18.7,8,22,6.0,0.1,10000.0 +905,-260.7500000000073,76,0.7855409795616236,11,44,64,1.0,6,3,False,1,20,2.49,5.52,96,100,True,True,14,20.7,8,22,6.0,0.1,10000.0 +906,-4220.980000000012,1151,0.6990150379103088,11,52,72,0.6,9,3,True,1,14,3.03,4.55,48,200,False,False,14,16.7,7,21,6.0,0.1,10000.0 +907,-3844.330000000011,1152,0.7774921746941649,10,48,72,0.8,9,4,True,0,20,3.12,6.56,96,100,False,False,14,20.2,7,21,6.0,0.1,10000.0 +908,-2227.229999999993,726,0.7735850782865403,10,50,56,2.0,6,4,True,0,20,2.94,7.1,64,100,True,False,14,22.4,7,22,8.0,0.1,10000.0 +909,12.79000000000633,72,1.0122139883112418,12,46,72,0.8,10,4,False,1,14,2.78,5.35,96,200,True,True,14,21.2,7,22,6.0,0.1,10000.0 +910,-1124.289999999999,271,0.6620932790738214,9,50,56,1.3,7,3,True,1,20,2.33,6.84,48,200,True,True,14,20.3,8,21,8.0,0.1,10000.0 +911,-233.80000000000473,27,0.5796324930777806,12,52,72,2.2,7,4,False,1,14,2.59,6.75,80,100,True,True,14,17.5,7,22,6.0,0.1,10000.0 +912,-1746.1499999999887,495,0.7325744163394328,10,38,72,2.3,8,5,True,1,20,2.82,6.21,48,100,True,False,14,23.2,7,22,8.0,0.1,10000.0 +913,-192.51000000000204,68,0.8438888708683383,10,46,40,2.4,9,5,False,0,14,2.17,6.98,80,100,False,False,14,21.1,7,22,8.0,0.1,10000.0 +914,-5678.2300000000005,1300,0.6693439906083055,9,44,64,2.4,10,2,True,0,14,2.31,6.55,80,100,False,False,14,21.8,8,21,8.0,0.1,10000.0 +915,-594.5299999999952,138,0.7281539636307104,11,42,64,0.8,10,3,False,0,20,2.64,6.85,80,100,True,True,14,16.8,8,22,8.0,0.1,10000.0 +916,-2842.050000000014,544,0.6385199675411396,8,52,64,1.0,9,4,True,1,20,2.91,6.82,80,200,True,False,14,17.6,7,21,6.0,0.1,10000.0 +917,-1601.2600000000093,242,0.5798541141897565,11,52,40,0.6,10,4,False,0,20,2.95,4.76,80,100,True,False,14,16.7,8,22,6.0,0.1,10000.0 +918,-1358.0599999999904,208,0.5394580223342818,10,48,40,0.7,7,4,False,0,20,2.57,7.04,48,100,True,False,14,22.8,7,21,8.0,0.1,10000.0 +919,-5650.109999999999,1472,0.673871371601041,9,40,48,2.4,6,2,True,0,20,2.46,6.09,48,200,False,False,14,20.8,7,22,6.0,0.1,10000.0 +920,-2692.830000000021,630,0.7271428441150632,10,48,40,1.0,10,4,True,0,14,3.12,6.17,96,200,True,False,14,22.9,8,22,8.0,0.1,10000.0 +921,-368.5799999999999,60,0.6268488990129081,10,46,40,0.8,8,4,False,1,20,2.65,5.52,96,200,True,True,14,22.7,8,21,6.0,0.1,10000.0 +922,-4771.160000000006,1039,0.680336496361613,10,40,32,2.1,9,4,True,0,14,3.06,4.63,80,200,False,False,14,20.7,7,21,6.0,0.1,10000.0 +923,-4891.4599999999955,1182,0.7099808549631537,9,40,48,2.2,6,3,True,0,20,2.58,6.07,96,100,False,False,14,18.3,8,22,8.0,0.1,10000.0 +924,-2628.3899999999885,650,0.7322411998052211,12,52,40,1.5,7,5,True,1,20,2.86,5.38,96,100,False,False,14,17.0,7,22,8.0,0.1,10000.0 +925,-1823.4599999999828,362,0.6613778426500574,9,40,64,0.9,7,2,False,0,14,3.0,4.88,64,100,False,False,14,21.0,7,22,6.0,0.1,10000.0 +926,-1423.0700000000015,292,0.6808687656978831,8,44,56,1.0,7,3,False,1,20,2.41,6.1,96,200,False,True,14,16.7,8,21,6.0,0.1,10000.0 +927,-2795.669999999999,766,0.6825007268366252,10,52,56,1.1,8,4,True,0,20,2.19,6.21,48,200,True,True,14,16.7,8,22,6.0,0.1,10000.0 +928,-1013.1100000000079,202,0.6048820820024414,8,50,32,1.6,7,5,True,1,20,2.21,5.87,64,100,True,True,14,21.8,7,21,8.0,0.1,10000.0 +929,-1002.7200000000084,139,0.6142538941229424,9,42,40,1.7,10,3,False,0,14,3.15,6.7,80,100,False,False,14,17.9,7,21,6.0,0.1,10000.0 +930,-1891.270000000006,397,0.6524799758920582,10,48,72,2.4,10,3,True,1,20,2.32,4.87,96,200,True,False,14,22.5,8,21,6.0,0.1,10000.0 +931,-215.41999999999643,22,0.5146449170872387,12,48,48,2.2,10,5,False,1,14,2.22,5.84,96,100,True,True,14,17.4,7,21,6.0,0.1,10000.0 +932,-120.63000000001011,31,0.7821068603012897,10,44,72,2.3,9,5,False,0,14,2.59,7.19,80,100,False,True,14,23.6,7,21,6.0,0.1,10000.0 +933,-344.6700000000001,81,0.7401991452282782,8,40,40,2.1,9,2,False,0,14,2.05,4.63,96,200,False,True,14,20.0,8,22,6.0,0.1,10000.0 +934,-6315.969999999985,1420,0.615961274897879,10,48,40,1.0,10,5,True,0,14,2.02,7.43,64,200,False,False,14,22.5,8,21,8.0,0.1,10000.0 +935,-2727.109999999987,681,0.7244711666210333,8,48,40,2.4,10,2,True,0,14,2.94,6.69,80,100,True,False,14,17.6,8,21,6.0,0.1,10000.0 +936,-1872.6399999999894,285,0.4999011894651947,12,44,32,1.7,9,2,True,1,20,2.11,7.4,64,200,True,True,14,17.2,7,21,6.0,0.1,10000.0 +937,-1472.4999999999836,506,0.7528325639949643,9,40,72,2.3,9,5,True,1,14,2.06,6.32,48,100,True,False,14,19.2,7,21,6.0,0.1,10000.0 +938,-4115.019999999991,1055,0.6874792571535764,8,38,56,0.8,8,5,True,0,14,2.04,6.22,96,200,True,False,14,20.3,7,22,8.0,0.1,10000.0 +939,-2890.459999999999,670,0.6596022808905931,12,40,40,2.0,8,3,True,0,20,2.03,6.18,96,100,True,False,14,20.6,8,21,6.0,0.1,10000.0 +940,-273.929999999993,76,0.7325659725273116,12,46,56,0.8,10,3,False,0,20,2.87,7.02,48,100,True,True,14,21.3,8,21,8.0,0.1,10000.0 +941,-2684.160000000008,704,0.7339106849706168,8,40,40,2.4,6,3,True,0,20,3.12,6.15,80,200,True,False,14,17.7,7,22,6.0,0.1,10000.0 +942,-2223.2699999999977,514,0.6966413557379397,9,38,40,2.5,6,5,True,0,14,2.58,6.17,80,100,True,True,14,21.0,8,21,8.0,0.1,10000.0 +943,-263.6500000000051,61,0.6971211285727416,11,38,56,1.0,7,4,False,1,14,2.41,5.28,64,100,True,True,14,21.7,8,21,6.0,0.1,10000.0 +944,-90.38999999999578,104,0.9431698867673041,8,40,32,1.7,9,5,False,1,20,2.44,7.18,80,100,True,False,14,20.7,8,22,8.0,0.1,10000.0 +945,-7416.049999999974,1776,0.6096729506652252,11,42,40,1.0,6,3,True,0,20,2.0,4.63,48,100,False,False,14,16.3,7,22,6.0,0.1,10000.0 +946,-3982.140000000002,870,0.665878238631072,8,52,56,1.1,6,5,True,0,14,2.65,6.05,80,200,True,False,14,20.7,7,22,6.0,0.1,10000.0 +947,-3103.5299999999734,762,0.6685250870734044,11,40,40,1.5,9,5,True,0,14,2.55,5.19,48,100,True,False,14,23.8,8,22,8.0,0.1,10000.0 +948,-1970.820000000008,343,0.5708621211494368,9,50,40,0.7,7,2,True,1,20,2.22,6.1,80,200,True,True,14,19.4,8,22,6.0,0.1,10000.0 +949,-1350.189999999995,303,0.7268602247118275,9,40,64,0.5,7,3,False,0,14,2.99,7.26,96,200,True,False,14,19.5,7,21,8.0,0.1,10000.0 +950,-2421.500000000022,702,0.7719127211758999,12,40,64,1.0,7,5,True,0,14,3.18,5.71,96,100,True,False,14,21.0,7,21,6.0,0.1,10000.0 +951,-4862.919999999996,964,0.6318003163404454,8,52,64,1.5,9,2,True,0,14,2.9,5.29,64,100,False,True,14,22.1,8,21,8.0,0.1,10000.0 +952,-104.92999999999847,34,0.840957317812538,9,40,48,2.1,6,4,False,1,14,2.97,5.39,96,200,False,True,14,23.9,7,21,6.0,0.1,10000.0 +953,-1134.1000000000004,232,0.613768254141238,11,52,72,0.7,9,5,False,1,20,2.12,7.22,48,100,True,False,14,18.3,7,22,8.0,0.1,10000.0 +954,-5181.39000000001,1054,0.662927115508219,12,46,40,1.0,7,4,True,0,14,2.88,7.4,80,100,False,False,14,22.5,7,22,6.0,0.1,10000.0 +955,-492.32999999999083,124,0.7030990875813368,11,42,32,0.9,6,5,False,0,14,2.11,4.66,64,100,False,True,14,21.0,7,21,6.0,0.1,10000.0 +956,-1127.1800000000076,308,0.724663701228434,10,52,40,2.3,6,5,True,1,20,3.11,6.02,48,200,True,False,14,20.3,7,21,8.0,0.1,10000.0 +957,-3131.940000000007,868,0.6779357051924094,10,44,64,2.5,10,4,True,0,14,2.07,4.58,48,200,True,False,14,19.8,7,21,6.0,0.1,10000.0 +958,-2926.9699999999866,649,0.6780924666046381,11,40,48,1.7,6,2,True,1,20,2.81,6.27,64,200,False,True,14,17.2,8,22,6.0,0.1,10000.0 +959,-2894.840000000012,672,0.664587651740475,10,38,64,1.2,6,4,True,1,20,2.13,5.78,96,100,True,False,14,18.3,7,22,8.0,0.1,10000.0 +960,-1513.8000000000084,320,0.6995003583048311,10,40,56,1.7,9,3,True,1,14,3.06,7.28,80,200,True,True,14,18.0,8,22,6.0,0.1,10000.0 +961,-7001.379999999997,1641,0.6401356729498586,10,52,64,1.1,6,5,True,0,20,2.12,4.93,80,100,False,False,14,18.2,7,21,6.0,0.1,10000.0 +962,-3700.1799999999794,849,0.6831351311542655,10,50,64,1.9,7,2,True,0,20,2.47,4.95,96,100,True,False,14,21.0,7,21,8.0,0.1,10000.0 +963,-222.8199999999979,102,0.8828422403095884,8,44,32,1.7,7,4,False,1,14,3.2,7.12,96,100,True,False,14,19.8,8,21,8.0,0.1,10000.0 +964,-2852.459999999999,608,0.6819556794425087,9,44,32,2.3,8,2,True,0,14,3.09,5.58,80,200,True,False,14,18.1,7,22,8.0,0.1,10000.0 +965,-6850.37000000001,1768,0.6877208913468714,8,44,72,1.1,6,5,True,0,20,2.91,5.95,48,100,False,False,14,20.8,7,21,8.0,0.1,10000.0 +966,-3386.9200000000083,821,0.7017127920412592,11,42,32,1.0,9,4,True,1,14,2.94,7.02,64,200,False,False,14,23.6,8,21,8.0,0.1,10000.0 +967,-315.9000000000033,27,0.4287315996961915,12,52,48,2.4,9,4,False,0,20,2.41,5.28,80,100,True,False,14,20.9,7,21,8.0,0.1,10000.0 +968,-4044.940000000004,969,0.635463567445197,10,44,72,2.4,6,4,True,0,20,2.09,6.55,48,100,False,True,14,22.0,8,21,8.0,0.1,10000.0 +969,-182.87999999999374,30,0.6740920269451474,10,44,56,2.5,7,2,False,1,20,2.39,6.3,96,200,True,False,14,16.2,8,21,8.0,0.1,10000.0 +970,-917.0800000000017,193,0.6681646801704986,12,46,40,0.6,9,5,False,0,20,2.52,5.73,80,200,True,False,14,16.1,8,22,8.0,0.1,10000.0 +971,-2782.34000000001,854,0.7161604527819916,10,52,56,1.2,6,5,True,0,14,2.23,6.02,48,200,True,False,14,22.9,8,22,8.0,0.1,10000.0 +972,-727.4900000000089,141,0.6508159738888356,11,42,72,0.9,9,4,False,0,14,2.13,6.4,80,100,True,False,14,21.6,8,21,6.0,0.1,10000.0 +973,-3054.7099999999928,648,0.6454986236381445,8,42,40,1.1,9,5,True,1,20,2.37,4.9,80,100,True,False,14,16.8,7,22,6.0,0.1,10000.0 +974,-5563.269999999974,1388,0.6941591240940116,8,48,64,2.1,8,5,True,0,14,2.13,6.27,96,200,False,False,14,23.9,7,21,6.0,0.1,10000.0 +975,-2486.8599999999924,623,0.742368519742499,9,48,56,2.4,6,4,True,0,20,2.95,7.06,96,100,True,True,14,16.9,7,21,6.0,0.1,10000.0 +976,-3637.899999999997,1049,0.7163362233317141,12,46,40,2.0,9,4,True,0,20,2.84,6.69,48,200,False,False,14,23.8,7,22,8.0,0.1,10000.0 +977,-215.41000000000713,59,0.76669049475782,12,42,48,0.8,10,3,False,0,20,2.43,6.76,80,100,True,True,14,23.6,8,22,8.0,0.1,10000.0 +978,-2958.399999999984,752,0.7122254571134804,10,52,48,2.0,7,2,True,0,14,2.18,6.64,96,200,False,True,14,22.1,8,21,8.0,0.1,10000.0 +979,-3211.9000000000106,783,0.6893503428665384,11,50,40,1.0,8,3,True,0,14,2.23,7.0,96,100,True,False,14,18.8,7,21,6.0,0.1,10000.0 +980,-408.2899999999954,38,0.45622960644602784,12,50,40,2.2,8,4,False,1,14,2.04,6.33,64,200,False,True,14,20.0,7,22,6.0,0.1,10000.0 +981,-1154.6399999999976,287,0.6791258385624802,10,44,48,0.5,6,2,False,0,20,2.57,5.36,48,200,True,False,14,18.2,8,22,8.0,0.1,10000.0 +982,-331.8299999999999,40,0.5581785500299581,10,50,32,2.2,7,4,False,0,20,2.72,5.15,48,100,False,True,14,21.2,8,21,6.0,0.1,10000.0 +983,-183.90999999999076,91,0.8687294789436116,9,52,64,1.5,8,5,False,1,20,3.19,6.08,64,100,True,False,14,19.8,7,22,6.0,0.1,10000.0 +984,-6155.749999999981,1257,0.6313301819048596,10,52,72,0.8,9,3,True,0,20,2.85,5.03,64,100,False,True,14,17.8,8,21,6.0,0.1,10000.0 +985,-4703.719999999982,867,0.6181341854383885,9,40,40,2.5,10,5,True,0,14,3.13,6.2,64,100,False,True,14,20.5,7,21,6.0,0.1,10000.0 +986,-3395.32999999998,821,0.7177137954284888,8,38,32,0.5,7,3,True,0,14,2.83,5.66,96,200,True,False,14,23.3,8,22,6.0,0.1,10000.0 +987,-5355.669999999999,1398,0.7286699448491228,8,40,48,0.9,9,2,True,0,14,3.08,5.37,80,100,False,False,14,20.7,7,22,8.0,0.1,10000.0 +988,-435.3700000000008,111,0.71928998813638,11,42,40,1.1,9,4,False,0,14,2.0,6.7,48,200,True,False,14,16.0,8,22,8.0,0.1,10000.0 +989,-3309.760000000011,716,0.6123494963691731,11,40,48,0.5,6,5,True,1,20,2.51,4.78,48,200,True,False,14,22.9,7,21,8.0,0.1,10000.0 +990,-754.4499999999953,122,0.5909132808814519,8,52,64,1.1,9,4,False,0,14,2.63,4.55,64,200,True,True,14,17.6,7,22,8.0,0.1,10000.0 +991,-107.73999999999432,98,0.9299247474780323,9,50,64,1.4,6,3,False,0,14,2.57,7.49,96,100,True,False,14,19.0,8,21,8.0,0.1,10000.0 +992,-884.8000000000029,146,0.6248717492135365,11,40,64,1.4,9,2,False,1,14,2.15,7.33,64,200,False,False,14,19.6,7,22,6.0,0.1,10000.0 +993,-2627.7200000000103,812,0.7215545860968029,10,40,64,2.2,10,4,True,0,20,2.43,6.03,48,200,True,False,14,18.3,7,21,8.0,0.1,10000.0 +994,-474.3899999999958,178,0.825078078620654,10,50,64,0.9,6,2,False,1,14,2.34,6.33,96,100,True,False,14,17.4,7,22,8.0,0.1,10000.0 +995,-3391.579999999997,744,0.6757729785641426,12,40,56,0.6,8,4,True,0,14,2.99,5.54,80,200,True,False,14,18.6,7,21,6.0,0.1,10000.0 +996,238.72999999999774,40,1.4779092346805998,9,48,56,2.2,10,2,False,0,14,2.76,5.16,80,200,True,False,14,19.7,7,21,8.0,0.1,10000.0 +997,-1717.2500000000055,279,0.551436265943636,11,42,64,0.8,10,4,False,0,14,2.07,5.96,64,100,False,False,14,21.7,7,21,6.0,0.1,10000.0 +998,-2664.300000000011,624,0.6306544471045543,11,40,56,2.4,10,4,True,0,14,2.07,5.55,48,100,True,True,14,19.0,7,21,8.0,0.1,10000.0 +999,-1288.2499999999836,380,0.798080570280344,8,40,48,0.9,6,2,False,0,14,3.14,7.09,96,100,False,False,14,17.6,7,22,6.0,0.1,10000.0 +1000,-1894.090000000011,440,0.7257624787345712,11,48,72,0.5,9,4,False,1,14,3.05,6.22,80,200,False,False,14,17.8,7,22,8.0,0.1,10000.0 +1001,-2355.1199999999844,718,0.7380807804461408,12,44,56,1.2,10,4,True,0,14,2.5,6.7,64,200,True,False,14,22.5,7,21,6.0,0.1,10000.0 +1002,-2612.2699999999977,746,0.6996966237755452,8,46,48,0.6,8,5,True,1,14,2.08,7.18,64,200,True,False,14,20.2,7,22,6.0,0.1,10000.0 +1003,-1321.2200000000175,265,0.6349676471075797,11,38,56,2.2,10,5,True,1,20,2.54,6.26,64,200,True,True,14,20.0,8,21,8.0,0.1,10000.0 +1004,-2392.089999999991,722,0.7589620036839537,9,50,72,2.4,8,5,True,1,14,2.4,4.66,96,200,False,False,14,19.1,8,22,8.0,0.1,10000.0 +1005,-1025.6199999999972,222,0.6829084298460949,8,48,56,0.8,10,3,False,0,14,2.65,5.5,80,100,True,False,14,21.0,8,21,6.0,0.1,10000.0 +1006,-755.5000000000018,168,0.6906895718783392,9,40,32,2.5,9,5,True,1,14,2.17,6.92,96,200,True,True,14,21.6,7,21,8.0,0.1,10000.0 +1007,-424.4499999999989,56,0.5664187794961897,12,48,40,1.1,8,2,False,0,14,3.07,6.5,64,200,True,True,14,18.9,7,21,6.0,0.1,10000.0 +1008,-947.2100000000082,143,0.6440144166625952,11,38,32,1.1,8,3,False,0,20,3.16,6.46,80,200,False,True,14,18.7,8,22,6.0,0.1,10000.0 +1009,-122.39999999999964,29,0.7964647388463009,11,40,56,1.9,7,5,False,1,14,3.12,6.62,80,100,True,True,14,22.0,7,21,6.0,0.1,10000.0 +1010,-1744.609999999986,543,0.7200763744594822,11,46,72,1.7,8,2,True,1,14,2.0,5.54,48,100,True,False,14,20.1,8,21,6.0,0.1,10000.0 +1011,-600.5299999999934,63,0.5455556732704735,12,46,72,1.7,6,3,False,0,14,3.15,5.58,64,200,False,True,14,18.7,7,22,8.0,0.1,10000.0 +1012,-1195.9699999999975,277,0.698504332218242,8,38,32,1.3,9,2,False,0,20,2.69,7.33,48,100,False,False,14,21.7,8,22,6.0,0.1,10000.0 +1013,-865.2000000000098,173,0.6636956935790443,9,52,64,1.0,7,3,False,0,20,2.37,6.6,80,100,True,False,14,19.1,8,22,6.0,0.1,10000.0 +1014,-3439.3600000000124,653,0.6258734868987843,10,48,32,0.9,8,2,True,0,14,3.18,5.44,64,200,True,False,14,16.8,8,21,6.0,0.1,10000.0 +1015,-5263.57999999999,1420,0.698636772224735,9,42,40,2.1,8,4,True,0,14,2.88,4.6,48,200,False,False,14,18.8,7,22,8.0,0.1,10000.0 +1016,-5814.3600000000215,1538,0.6667318182625845,9,38,40,2.3,6,2,True,0,20,2.26,4.91,48,200,False,False,14,23.7,8,22,8.0,0.1,10000.0 +1017,-7013.0399999999645,1557,0.6091313267778349,10,42,32,0.8,10,5,True,0,20,2.06,7.36,64,200,False,False,14,22.4,7,22,8.0,0.1,10000.0 +1018,-578.5699999999997,142,0.6646184880964112,10,42,32,1.0,9,2,False,1,14,2.0,5.83,48,200,True,False,14,21.7,7,21,6.0,0.1,10000.0 +1019,-4351.33000000002,1131,0.6865550903742037,11,42,32,1.8,10,3,True,0,14,2.63,7.23,48,200,False,False,14,19.5,7,22,6.0,0.1,10000.0 +1020,-825.2300000000087,77,0.43010552194690754,12,48,48,1.6,6,4,False,1,20,2.83,5.91,48,200,False,True,14,16.4,7,22,6.0,0.1,10000.0 +1021,-160.62000000000444,55,0.8456408087952642,11,44,32,1.6,9,3,False,1,20,3.08,6.91,80,200,True,False,14,21.3,7,21,8.0,0.1,10000.0 +1022,-852.6300000000065,176,0.6490729117362583,9,38,32,0.9,7,4,False,0,14,2.16,7.34,48,200,True,False,14,18.2,8,21,6.0,0.1,10000.0 +1023,-678.5700000000033,115,0.6579684869502102,12,40,32,1.3,8,3,False,0,14,2.88,6.7,64,100,False,False,14,23.8,8,21,6.0,0.1,10000.0 +1024,-370.60000000000036,118,0.7788360546166332,9,42,72,1.4,8,3,False,0,14,2.45,5.08,64,100,True,False,14,23.1,8,22,8.0,0.1,10000.0 +1025,76.55000000000291,26,1.1581252194749125,9,38,72,2.5,6,4,False,1,14,3.12,5.82,96,200,True,True,14,16.8,7,21,6.0,0.1,10000.0 +1026,-4951.959999999991,1068,0.6564374103274973,8,42,64,0.7,6,5,True,0,14,3.03,4.98,64,100,True,False,14,18.0,8,21,8.0,0.1,10000.0 +1027,-3075.1400000000085,668,0.6633293080664815,11,42,40,1.6,7,2,True,0,14,2.6,5.6,80,200,True,False,14,23.6,7,22,6.0,0.1,10000.0 +1028,-3800.3,1005,0.7246899565406691,11,42,32,1.6,9,4,True,0,20,2.7,6.84,80,200,False,False,14,19.5,8,22,6.0,0.1,10000.0 +1029,-4427.689999999977,1040,0.6371587574357752,10,44,72,0.9,9,4,True,0,20,2.2,5.07,64,200,True,False,14,23.1,7,21,8.0,0.1,10000.0 +1030,-6.760000000000218,48,0.9887595610242768,9,46,40,2.1,7,4,False,1,20,2.32,4.95,48,200,False,True,14,20.9,8,21,6.0,0.1,10000.0 +1031,-3108.0900000000065,704,0.6952894764189512,10,40,72,1.7,9,4,True,0,20,2.97,7.16,80,200,True,False,14,21.3,8,21,6.0,0.1,10000.0 +1032,-2791.3599999999933,553,0.6804750932065929,9,46,40,2.4,6,3,True,0,20,3.02,6.09,96,100,True,True,14,18.1,8,22,8.0,0.1,10000.0 +1033,-2111.610000000016,477,0.6810044776389971,11,48,56,1.3,8,4,True,0,14,2.52,6.19,80,200,True,True,14,20.8,8,21,8.0,0.1,10000.0 +1034,-4029.260000000014,874,0.6730552954483859,9,46,40,0.7,8,4,True,0,14,2.69,7.28,80,100,True,False,14,22.1,7,22,8.0,0.1,10000.0 +1035,-1582.8500000000004,524,0.7642340604589158,12,50,56,1.1,9,3,True,0,14,2.54,7.44,64,100,True,True,14,20.7,7,22,6.0,0.1,10000.0 +1036,-2391.340000000013,473,0.6621575610989691,11,40,48,0.6,8,3,True,0,20,2.98,5.4,80,200,True,True,14,22.5,8,22,6.0,0.1,10000.0 +1037,253.9199999999928,32,1.519571934275951,11,44,32,2.4,6,2,False,1,14,2.59,6.09,80,100,True,False,14,16.6,8,21,8.0,0.1,10000.0 +1038,-2503.110000000015,530,0.6573916923531763,10,42,40,1.2,8,3,True,1,20,2.31,7.03,96,100,True,False,14,17.6,7,21,8.0,0.1,10000.0 +1039,-1734.6799999999894,378,0.6585477235596323,10,42,40,2.3,9,5,True,1,20,2.48,5.47,64,100,True,False,14,16.9,7,21,8.0,0.1,10000.0 +1040,-2359.739999999998,443,0.6139086727957238,9,52,64,0.6,8,4,False,1,14,2.04,7.26,96,100,False,False,14,16.5,7,22,8.0,0.1,10000.0 +1041,-1490.4899999999961,291,0.678723161186997,9,40,56,0.6,8,3,False,1,14,2.92,5.15,96,100,True,False,14,23.3,7,21,6.0,0.1,10000.0 +1042,-1025.0899999999892,358,0.8011055619584242,11,48,48,1.9,10,5,True,1,14,2.72,5.06,96,100,True,False,14,21.8,8,21,6.0,0.1,10000.0 +1043,-208.97000000000116,83,0.8379876573838617,9,42,40,1.8,9,3,False,1,14,3.07,6.31,64,100,True,False,14,22.8,7,22,6.0,0.1,10000.0 +1044,-6534.6799999999885,1620,0.6686034157580073,9,44,56,1.4,10,4,True,0,20,2.11,4.65,96,100,False,False,14,19.1,8,21,6.0,0.1,10000.0 +1045,-6022.130000000001,1399,0.6543134119138179,9,50,32,0.7,9,2,True,0,14,2.43,7.04,64,100,False,False,14,23.7,8,22,8.0,0.1,10000.0 +1046,-2418.92,740,0.7328698064429208,12,46,56,1.5,8,5,True,0,14,2.25,7.41,64,100,True,False,14,23.4,7,21,8.0,0.1,10000.0 +1047,-68.549999999992,73,0.9388426950253371,10,42,48,1.6,10,3,False,1,14,2.21,7.38,96,100,True,False,14,22.6,8,21,8.0,0.1,10000.0 +1048,-1792.2900000000009,350,0.665406543678663,8,50,40,2.2,9,3,True,1,14,2.64,5.31,96,200,True,False,14,16.1,8,21,8.0,0.1,10000.0 +1049,-1886.4899999999989,507,0.7371606512152813,8,48,40,0.5,6,3,True,0,20,2.79,6.03,80,200,True,True,14,22.6,8,22,8.0,0.1,10000.0 +1050,-4061.060000000016,991,0.6712613308336288,8,48,72,1.1,9,2,True,0,20,2.68,6.9,48,200,True,False,14,23.8,8,21,6.0,0.1,10000.0 +1051,-889.9200000000001,109,0.5471628986215213,12,48,48,1.4,6,2,False,1,20,2.71,5.13,80,200,False,False,14,18.9,7,21,8.0,0.1,10000.0 +1052,-1952.87999999999,286,0.5459516768037498,8,42,32,1.0,9,3,False,0,14,2.75,6.46,48,100,False,True,14,16.7,8,21,6.0,0.1,10000.0 +1053,-1801.7300000000178,501,0.7471958669731079,12,44,72,1.4,10,5,True,1,20,2.49,6.2,96,100,True,False,14,19.4,8,21,6.0,0.1,10000.0 +1054,-3629.920000000013,778,0.6473248074088683,12,42,40,1.4,9,2,True,0,20,2.78,5.76,64,100,False,True,14,20.6,8,21,6.0,0.1,10000.0 +1055,-3607.4999999999964,800,0.614720403958848,12,40,72,2.0,8,4,True,0,20,2.22,4.87,48,100,True,True,14,16.6,7,22,8.0,0.1,10000.0 +1056,-2956.759999999991,757,0.6929678000193145,11,46,48,1.6,9,4,True,0,14,2.0,5.76,96,200,True,False,14,20.4,8,22,8.0,0.1,10000.0 +1057,-2547.0499999999984,822,0.7497917427984268,10,52,64,1.4,8,2,True,0,20,3.07,5.78,48,200,True,False,14,16.2,7,22,8.0,0.1,10000.0 +1058,-532.4500000000025,102,0.6567164179104478,9,52,40,0.6,9,4,False,0,14,3.16,5.82,48,200,True,True,14,21.6,7,22,6.0,0.1,10000.0 +1059,-4599.249999999982,1076,0.671292666558509,8,48,64,1.4,6,3,True,0,14,2.19,4.98,96,100,True,False,14,17.9,7,22,8.0,0.1,10000.0 +1060,-1338.409999999989,129,0.4268321406700326,12,48,64,1.3,8,5,False,0,14,2.36,5.49,80,200,False,False,14,18.5,8,21,8.0,0.1,10000.0 +1061,-52.87000000000444,42,0.9196186943169034,12,40,56,1.6,10,3,False,0,20,2.33,5.85,64,200,True,False,14,16.1,7,21,6.0,0.1,10000.0 +1062,-683.8700000000026,143,0.6505465081222501,8,48,64,1.3,10,5,False,0,20,2.12,4.97,48,200,True,False,14,21.5,7,22,6.0,0.1,10000.0 +1063,-2458.3700000000117,693,0.7230249059800941,11,48,48,2.3,10,4,True,0,20,2.44,5.92,64,100,True,False,14,16.1,8,22,8.0,0.1,10000.0 +1064,-546.5000000000091,198,0.8016060291437658,10,50,32,0.8,10,3,False,0,14,2.17,6.71,80,100,True,False,14,17.6,8,22,8.0,0.1,10000.0 +1065,-1447.1599999999962,303,0.6611414080628658,10,50,40,1.2,8,5,True,1,20,3.17,4.74,64,100,True,True,14,18.9,8,21,8.0,0.1,10000.0 +1066,-795.9599999999991,171,0.6351451700143932,10,50,56,0.9,6,3,False,1,20,2.06,5.11,64,100,True,False,14,23.5,7,21,6.0,0.1,10000.0 +1067,-2250.979999999976,521,0.673658923427322,9,46,56,1.1,8,5,True,1,14,2.02,5.2,96,200,False,True,14,21.5,8,21,6.0,0.1,10000.0 +1068,-1801.5600000000068,424,0.6569169448628761,12,48,72,1.9,7,4,True,1,14,2.18,6.91,48,200,True,False,14,16.5,8,21,6.0,0.1,10000.0 +1069,-3744.4800000000114,752,0.6521503253705415,10,44,48,0.6,7,4,True,0,14,2.98,6.33,80,200,True,False,14,17.4,8,21,6.0,0.1,10000.0 +1070,-3874.2599999999966,990,0.6595969385110255,9,42,64,2.5,10,3,True,0,14,2.16,5.7,48,100,True,False,14,17.8,7,21,8.0,0.1,10000.0 +1071,-3802.9699999999884,800,0.660123797062903,11,52,56,0.6,6,5,True,0,14,2.53,5.78,96,200,True,False,14,23.2,7,21,8.0,0.1,10000.0 +1072,-302.09000000000924,76,0.7162301796047194,10,44,32,0.7,7,3,False,1,20,2.98,5.01,48,100,True,True,14,23.3,7,21,6.0,0.1,10000.0 +1073,-2711.529999999985,730,0.7290572515727795,12,46,56,0.6,10,2,True,0,14,3.15,6.49,64,200,True,False,14,16.5,8,22,8.0,0.1,10000.0 +1074,-3551.9999999999964,853,0.6851708559683257,8,52,72,1.8,9,4,True,0,14,2.75,7.0,64,200,True,False,14,18.9,7,22,6.0,0.1,10000.0 +1075,-2417.729999999995,505,0.6770102612127227,11,42,48,1.5,6,3,True,0,14,2.96,6.25,80,200,True,True,14,18.3,8,21,6.0,0.1,10000.0 +1076,-6881.8199999999915,1784,0.6505326190782087,11,44,72,0.9,10,2,True,0,14,2.1,7.44,48,200,False,False,14,17.9,8,22,6.0,0.1,10000.0 +1077,-90.59000000000196,36,0.8558631662688941,8,52,32,2.2,9,4,False,0,14,2.72,5.56,80,200,True,True,14,18.5,7,22,6.0,0.1,10000.0 +1078,-3096.189999999976,870,0.7055501717994098,9,42,40,2.3,9,4,True,0,20,2.22,4.56,80,100,True,False,14,19.0,8,22,8.0,0.1,10000.0 +1079,-3526.070000000009,750,0.6163595573099135,12,50,40,2.3,6,3,True,0,20,2.36,7.13,48,200,False,True,14,20.0,8,21,8.0,0.1,10000.0 +1080,-2694.569999999989,467,0.569953205995761,11,38,40,0.5,8,5,False,1,20,2.09,6.8,80,100,False,False,14,20.0,7,22,8.0,0.1,10000.0 +1081,-3409.839999999992,718,0.6602421859509032,9,42,64,2.0,9,3,True,0,20,3.11,5.92,64,100,True,True,14,17.2,8,21,8.0,0.1,10000.0 +1082,40.67999999999665,46,1.063288579118503,10,40,40,2.1,7,2,False,0,14,2.18,5.36,48,200,True,False,14,16.3,8,22,8.0,0.1,10000.0 +1083,-1621.7400000000016,438,0.7095389310680186,9,50,40,1.4,7,5,True,1,20,2.8,7.36,48,200,True,False,14,18.7,8,21,8.0,0.1,10000.0 +1084,-4250.269999999989,902,0.6402822716127957,8,44,40,1.9,7,2,True,0,14,2.85,4.97,48,100,True,False,14,23.6,7,21,8.0,0.1,10000.0 +1085,-847.6400000000012,194,0.6962146896704966,10,40,72,1.2,7,5,False,0,20,3.19,5.39,48,100,False,False,14,20.2,8,21,8.0,0.1,10000.0 +1086,-4380.9600000000255,1190,0.7051558159067904,10,46,40,2.2,6,2,True,0,20,2.53,6.07,64,200,False,False,14,22.2,8,22,8.0,0.1,10000.0 +1087,-4364.07999999998,1074,0.6757970276986395,11,46,72,0.7,9,3,True,0,14,2.13,4.92,96,100,True,False,14,17.5,7,22,6.0,0.1,10000.0 +1088,-2617.9699999999975,612,0.6816306824953242,8,46,40,1.7,10,3,True,0,20,3.13,7.25,48,100,True,True,14,19.6,8,22,6.0,0.1,10000.0 +1089,-3533.11999999998,736,0.6292135774794517,9,44,32,2.0,6,2,True,0,20,2.49,6.71,64,100,True,False,14,18.8,7,21,8.0,0.1,10000.0 +1090,48.710000000004584,26,1.1381138709311556,9,50,40,2.2,6,4,False,0,20,2.97,5.31,64,100,True,True,14,21.5,8,21,6.0,0.1,10000.0 +1091,-5131.4200000000055,1441,0.7271067063183109,8,52,56,1.6,9,3,True,0,14,3.03,5.03,64,200,False,False,14,17.7,8,22,6.0,0.1,10000.0 +1092,-4373.489999999996,999,0.6353924032059864,12,48,72,0.7,10,5,True,0,20,2.13,5.8,80,100,True,False,14,17.5,7,21,6.0,0.1,10000.0 +1093,-1311.6300000000065,328,0.690550395296549,12,42,32,1.8,10,3,True,0,20,2.88,6.68,48,200,True,True,14,23.5,7,22,8.0,0.1,10000.0 +1094,-103.29999999999563,46,0.839621176835895,11,50,32,1.8,9,4,False,0,14,2.76,7.3,48,200,True,False,14,21.0,8,22,8.0,0.1,10000.0 +1095,-707.2000000000025,128,0.6912545403744064,8,52,64,1.9,8,5,False,1,14,2.65,5.4,96,100,False,True,14,16.1,7,22,8.0,0.1,10000.0 +1096,-413.4300000000003,96,0.6963199647421772,10,50,64,1.3,7,4,False,0,14,2.39,5.11,64,200,True,False,14,20.8,8,21,8.0,0.1,10000.0 +1097,-1847.6100000000097,424,0.6813894215514505,10,42,64,2.2,6,5,True,1,20,2.17,6.35,96,200,True,False,14,20.6,8,22,6.0,0.1,10000.0 +1098,-141.34999999999854,28,0.7177234148776834,12,38,64,2.1,9,4,False,1,20,2.31,5.56,80,200,True,False,14,23.6,7,22,6.0,0.1,10000.0 +1099,-3114.9299999999903,671,0.6438480368897117,11,52,40,1.1,9,4,True,0,14,3.2,5.38,48,200,True,False,14,16.1,7,22,6.0,0.1,10000.0 +1100,-5078.119999999993,1313,0.652031265738909,10,42,32,2.2,6,3,True,0,20,2.05,5.7,48,100,False,False,14,18.2,8,22,6.0,0.1,10000.0 +1101,88.18000000000029,19,1.284158288218613,9,38,64,2.3,10,3,False,0,20,2.58,6.5,64,200,True,True,14,24.0,8,22,6.0,0.1,10000.0 +1102,-4210.4700000000075,987,0.7199749934324507,8,42,56,2.1,6,2,True,0,14,2.82,6.66,96,100,False,True,14,18.8,7,21,8.0,0.1,10000.0 +1103,-2600.2699999999895,692,0.7375707223927835,11,46,32,1.6,10,3,True,1,20,2.52,6.21,96,100,False,False,14,20.2,7,22,6.0,0.1,10000.0 +1104,-3.2599999999965803,41,0.9949436198098429,8,40,72,2.0,9,4,False,0,14,2.28,7.26,80,200,True,True,14,20.8,7,22,8.0,0.1,10000.0 +1105,-2557.8399999999947,795,0.7465254070166711,10,48,56,1.6,9,4,True,0,14,2.45,6.86,64,100,True,False,14,20.9,8,22,6.0,0.1,10000.0 +1106,-369.97000000001026,167,0.8369033816638086,10,50,40,0.9,7,2,False,0,20,2.28,7.3,80,200,True,False,14,20.0,8,22,8.0,0.1,10000.0 +1107,-147.9499999999971,30,0.7072905331882481,12,46,72,2.1,8,3,False,0,20,2.2,7.04,64,100,True,False,14,19.9,7,21,8.0,0.1,10000.0 +1108,-3634.1800000000167,1147,0.7308730493150339,10,48,40,0.7,10,2,True,1,14,2.47,6.48,48,100,False,False,14,17.9,7,22,8.0,0.1,10000.0 +1109,-35.31999999999971,39,0.9384132519616389,9,50,48,1.6,10,3,False,0,20,2.85,5.46,80,100,True,True,14,21.3,7,22,6.0,0.1,10000.0 +1110,-3712.5199999999904,1085,0.7089160208622782,10,40,56,0.7,10,4,True,0,14,2.54,4.66,48,100,True,False,14,20.8,8,22,8.0,0.1,10000.0 +1111,-2908.130000000002,886,0.7523963184647213,10,46,56,1.0,8,3,True,0,20,2.53,6.09,80,100,True,False,14,18.9,8,22,6.0,0.1,10000.0 +1112,-3113.039999999992,642,0.6070416028154293,10,46,64,0.9,8,3,True,1,14,2.27,4.87,64,200,True,False,14,21.5,7,21,8.0,0.1,10000.0 +1113,-3572.6899999999823,856,0.6876792634430644,8,52,64,1.6,7,2,True,0,20,2.65,5.09,80,200,True,False,14,21.5,8,21,6.0,0.1,10000.0 +1114,-381.5899999999983,83,0.7036033027038363,11,46,56,1.2,7,4,False,0,20,2.97,6.85,48,100,False,True,14,22.9,8,22,8.0,0.1,10000.0 +1115,72.98999999999796,50,1.101499054399822,9,46,48,2.2,9,2,False,0,20,2.89,7.3,96,100,True,False,14,17.7,8,21,8.0,0.1,10000.0 +1116,-260.9600000000046,26,0.5597692229832316,11,50,48,2.4,8,2,False,1,14,2.83,4.84,80,200,True,True,14,16.1,7,22,6.0,0.1,10000.0 +1117,-6016.120000000006,1480,0.6930297300082966,8,40,64,1.7,10,4,True,0,20,2.47,6.71,80,200,False,False,14,19.5,8,22,8.0,0.1,10000.0 +1118,-925.5100000000002,159,0.6259779832530471,12,48,64,0.8,10,2,False,0,14,2.17,5.82,96,100,True,False,14,20.2,7,22,6.0,0.1,10000.0 +1119,-2823.1900000000123,604,0.6677137940693905,11,38,48,2.0,10,4,True,0,14,2.95,6.88,64,200,True,False,14,20.2,8,21,6.0,0.1,10000.0 +1120,-2696.1099999999924,650,0.7261965211315666,9,44,72,0.6,10,4,True,1,14,2.93,6.23,96,100,True,False,14,20.6,7,21,6.0,0.1,10000.0 +1121,-1826.5400000000081,272,0.5697034517202062,11,52,64,0.6,8,3,False,0,20,2.7,5.16,80,100,False,True,14,18.5,7,22,6.0,0.1,10000.0 +1122,-2303.2000000000116,778,0.7754033952781275,10,44,40,1.8,6,2,True,1,14,2.94,4.74,64,100,False,False,14,18.5,8,22,6.0,0.1,10000.0 +1123,-99.53999999999724,43,0.8217247246350855,9,50,32,1.6,10,4,False,0,14,2.05,5.48,64,200,True,True,14,19.7,8,21,8.0,0.1,10000.0 +1124,-2727.5699999999733,611,0.6993415998033508,12,52,40,1.3,9,3,True,0,14,2.83,6.03,96,100,True,False,14,17.9,7,21,8.0,0.1,10000.0 +1125,-1043.7400000000107,291,0.7797668407448436,12,48,56,0.7,8,5,False,0,14,2.78,7.08,96,100,False,False,14,20.5,8,22,6.0,0.1,10000.0 +1126,-1167.460000000001,212,0.6229560611687955,8,50,48,1.0,10,2,False,0,14,2.57,5.05,48,100,False,True,14,19.4,8,22,6.0,0.1,10000.0 +1127,-2309.4799999999987,463,0.6406686623640925,10,44,48,0.9,6,5,True,0,14,2.98,6.55,48,100,True,True,14,24.0,8,22,6.0,0.1,10000.0 +1128,-2425.399999999997,677,0.7342382717050433,10,46,56,2.2,6,4,True,0,14,2.8,6.14,64,200,True,False,14,18.1,8,22,6.0,0.1,10000.0 +1129,-189.83999999999833,37,0.705802132407637,11,42,64,2.2,8,4,False,0,20,2.14,6.76,64,200,True,False,14,20.6,7,22,8.0,0.1,10000.0 +1130,61.929999999994834,37,1.1049358659369335,11,46,72,2.0,10,2,False,0,14,2.61,6.79,80,200,True,False,14,22.0,8,21,6.0,0.1,10000.0 +1131,-2070.1800000000057,655,0.7418300042276337,10,52,40,2.2,6,5,True,0,14,2.77,5.77,48,100,True,False,14,22.2,7,21,8.0,0.1,10000.0 +1132,-2835.169999999982,555,0.6444696080496786,9,40,64,1.5,10,5,True,1,20,3.15,5.17,64,100,True,False,14,22.1,8,21,8.0,0.1,10000.0 +1133,-5293.979999999986,1069,0.6410763681726962,8,44,72,0.5,6,2,True,0,20,3.16,5.06,64,200,True,False,14,18.1,7,21,8.0,0.1,10000.0 +1134,3.460000000006403,59,1.0037089443443958,8,42,40,2.3,10,2,False,1,20,2.54,4.9,80,200,True,False,14,16.5,8,22,6.0,0.1,10000.0 +1135,-1280.8299999999927,203,0.5646559781925217,12,44,40,1.0,7,2,True,1,20,2.86,5.43,64,100,True,True,14,23.6,7,22,6.0,0.1,10000.0 +1136,-2265.9100000000017,719,0.7640303877615843,11,46,64,1.3,7,3,True,0,20,3.01,6.88,64,200,True,False,14,22.7,7,21,8.0,0.1,10000.0 +1137,-3812.7799999999916,958,0.7156653352702715,8,40,64,2.2,6,2,True,0,20,2.63,4.8,96,100,True,False,14,16.1,8,22,6.0,0.1,10000.0 +1138,-5071.650000000004,995,0.6038055107019735,8,42,32,0.6,8,3,True,0,14,2.08,5.58,96,100,True,False,14,19.7,8,21,6.0,0.1,10000.0 +1139,-3975.2499999999936,962,0.6661426065106075,8,52,40,0.8,10,2,True,0,14,2.74,4.77,48,200,True,False,14,16.7,7,22,6.0,0.1,10000.0 +1140,-2592.4500000000126,488,0.6383043436405214,12,52,32,1.8,9,3,True,0,14,2.97,5.26,80,200,True,False,14,16.9,7,21,8.0,0.1,10000.0 +1141,-4266.530000000004,959,0.6422629049406193,8,52,48,1.1,9,2,True,0,20,2.35,6.86,64,100,True,False,14,16.7,8,21,6.0,0.1,10000.0 +1142,-1318.8900000000012,324,0.7272208330489491,10,42,40,2.3,8,2,True,1,14,2.7,5.42,96,200,True,False,14,20.9,7,21,8.0,0.1,10000.0 +1143,-3414.869999999999,795,0.6571522372295642,10,48,32,0.9,7,5,True,0,20,2.72,5.4,48,100,True,False,14,22.6,8,22,6.0,0.1,10000.0 +1144,-1974.800000000001,485,0.7061978448359227,11,38,40,0.7,10,2,True,1,14,2.2,5.79,96,200,False,True,14,22.4,8,22,8.0,0.1,10000.0 +1145,-2850.070000000008,624,0.6911434023890826,12,50,64,1.8,7,3,True,0,14,3.09,6.0,80,200,True,False,14,16.2,7,22,6.0,0.1,10000.0 +1146,-4667.070000000006,1140,0.6433119899483816,12,40,64,0.6,8,3,True,0,20,2.05,5.71,64,200,False,True,14,21.0,7,22,6.0,0.1,10000.0 +1147,-100.65999999998894,75,0.9146167678892545,10,46,64,1.4,9,2,False,0,14,2.27,7.4,96,200,True,False,14,17.5,7,21,6.0,0.1,10000.0 +1148,-3159.7900000000072,852,0.714929485467655,9,44,72,2.0,7,2,True,0,14,3.05,6.78,48,100,True,False,14,20.4,8,21,8.0,0.1,10000.0 +1149,-2523.139999999993,806,0.7266029895382414,11,52,40,1.7,10,2,True,1,14,2.15,4.86,48,100,False,False,14,19.1,7,21,6.0,0.1,10000.0 +1150,-351.50000000000546,71,0.7386267307148913,11,44,56,2.0,10,5,False,1,14,2.47,6.13,80,200,False,False,14,23.5,8,22,8.0,0.1,10000.0 +1151,-1143.8799999999974,214,0.6314641493628881,11,44,32,0.6,10,4,False,0,14,2.52,7.17,64,200,True,False,14,20.2,7,22,6.0,0.1,10000.0 +1152,-802.6600000000053,119,0.6438320908768194,12,48,72,1.0,10,3,False,0,14,3.17,5.07,80,100,True,False,14,17.6,7,22,8.0,0.1,10000.0 +1153,-2793.7400000000125,556,0.6468907951763372,11,38,56,1.1,10,4,True,1,20,3.04,5.8,64,100,True,False,14,20.4,8,21,6.0,0.1,10000.0 +1154,59.900000000001455,46,1.0722670623861401,12,40,72,1.5,7,3,False,0,20,3.16,4.95,96,100,True,True,14,18.8,7,22,8.0,0.1,10000.0 +1155,-2647.399999999994,774,0.77097050750008,10,42,56,1.0,8,3,True,0,14,3.14,5.17,96,100,True,False,14,16.7,7,21,8.0,0.1,10000.0 +1156,-755.0600000000031,152,0.7013022976137729,8,40,72,1.3,6,3,False,0,20,2.68,5.36,96,100,True,False,14,19.7,7,21,6.0,0.1,10000.0 +1157,-513.7799999999952,97,0.6188434289105679,10,50,56,0.5,6,3,False,0,14,2.55,4.59,64,100,True,True,14,21.9,8,21,8.0,0.1,10000.0 +1158,-3452.0499999999975,663,0.6190172951723392,8,42,32,1.8,8,4,True,0,20,2.52,5.48,80,200,True,True,14,16.4,8,21,6.0,0.1,10000.0 +1159,-4011.760000000003,1044,0.714133020181478,11,50,40,2.2,8,5,True,0,14,2.4,4.52,96,100,False,False,14,19.9,7,22,6.0,0.1,10000.0 +1160,-2530.749999999988,647,0.7360497205876524,10,50,32,1.5,9,3,True,0,14,2.9,4.88,96,100,True,False,14,23.9,8,22,8.0,0.1,10000.0 +1161,49.39000000000124,37,1.091140595301803,10,50,40,2.2,8,2,False,0,20,3.02,5.83,80,200,True,False,14,22.6,7,21,6.0,0.1,10000.0 +1162,-5.629999999995562,102,0.9959334912747023,10,38,32,1.3,6,4,False,1,20,3.19,7.42,64,100,True,False,14,22.5,8,21,8.0,0.1,10000.0 +1163,-3386.309999999995,797,0.6974561302409854,11,50,64,0.8,6,3,True,0,20,3.01,6.31,80,100,True,False,14,20.6,7,21,8.0,0.1,10000.0 +1164,118.76000000000386,52,1.1488668271159246,10,46,72,2.1,6,2,False,1,20,2.93,6.14,48,100,True,False,14,16.0,8,21,8.0,0.1,10000.0 +1165,-191.01999999999862,73,0.8155679141080601,9,48,72,1.7,8,3,False,0,20,2.7,5.76,48,200,True,False,14,22.9,7,22,6.0,0.1,10000.0 +1166,-2602.8500000000013,498,0.582141332023336,8,38,40,0.7,8,4,True,1,20,2.1,6.68,64,100,True,True,14,19.2,8,22,6.0,0.1,10000.0 +1167,-7631.8099999999895,1546,0.5930052976756142,9,52,40,0.7,10,5,True,0,14,2.2,7.5,64,100,False,False,14,20.4,7,21,6.0,0.1,10000.0 +1168,-2618.4400000000132,569,0.694033129545497,10,38,32,0.9,9,2,True,0,20,2.9,6.27,96,200,True,True,14,16.8,8,21,8.0,0.1,10000.0 +1169,32.56999999999971,54,1.0419489451585482,12,38,72,1.5,6,4,False,0,20,3.04,7.26,48,100,True,False,14,18.7,8,21,6.0,0.1,10000.0 +1170,-3022.8800000000047,826,0.7097712930043752,8,52,40,1.6,9,2,True,0,20,2.72,4.67,64,200,True,False,14,16.8,7,21,8.0,0.1,10000.0 +1171,-3199.759999999994,625,0.6673368944817447,9,42,40,1.9,10,5,True,0,20,2.93,6.11,96,200,True,False,14,19.6,8,21,6.0,0.1,10000.0 +1172,-4797.300000000009,1137,0.6484173172774822,9,46,64,0.5,10,4,True,0,14,2.02,6.45,80,100,True,False,14,23.0,7,21,6.0,0.1,10000.0 +1173,-3001.8899999999894,729,0.7099656815573153,11,38,56,1.7,9,4,True,0,20,2.8,4.56,96,200,True,False,14,21.0,7,21,8.0,0.1,10000.0 +1174,-5062.469999999986,1159,0.612687403027827,9,40,48,0.6,6,5,True,0,20,2.09,5.94,48,100,True,False,14,16.4,8,21,8.0,0.1,10000.0 +1175,-1440.879999999992,348,0.6735503954651217,9,40,64,1.6,7,3,True,1,20,2.6,5.16,48,200,True,True,14,19.4,7,21,8.0,0.1,10000.0 +1176,-1048.0399999999936,259,0.739460744099558,9,38,40,0.7,6,5,True,1,20,2.92,6.64,96,200,True,True,14,22.4,7,22,6.0,0.1,10000.0 +1177,-3514.399999999997,796,0.6724358251412774,10,40,32,0.5,6,2,True,0,20,2.31,7.48,96,200,True,False,14,19.8,8,22,6.0,0.1,10000.0 +1178,-2767.6799999999957,817,0.7327547499934822,9,40,56,2.3,8,2,True,0,20,2.92,5.99,48,200,True,False,14,17.2,7,22,6.0,0.1,10000.0 +1179,-1107.5599999999922,222,0.6438427526328483,9,50,32,0.8,8,5,False,0,20,2.51,5.89,64,100,True,False,14,19.5,7,22,6.0,0.1,10000.0 +1180,-1012.5400000000045,154,0.558509849746671,8,52,32,1.2,8,5,False,1,14,2.58,6.67,64,100,True,False,14,18.5,7,21,6.0,0.1,10000.0 +1181,-181.28999999999542,29,0.6715582368606989,11,46,32,2.2,10,4,False,0,14,2.46,4.99,64,200,True,False,14,21.5,8,21,8.0,0.1,10000.0 +1182,-3688.469999999991,796,0.6541155751940195,9,46,32,1.4,9,4,True,0,20,2.78,5.63,64,100,True,False,14,22.9,7,22,6.0,0.1,10000.0 +1183,-159.44999999999345,43,0.7994163008063603,12,50,56,1.3,7,4,False,0,14,3.07,5.79,96,100,True,True,14,21.6,8,22,6.0,0.1,10000.0 +1184,-3250.6899999999932,722,0.6717144582620516,9,38,72,1.2,8,3,True,0,20,2.95,6.56,64,200,True,True,14,19.3,7,22,8.0,0.1,10000.0 +1185,-2912.3099999999977,613,0.6724082852084239,11,46,32,1.1,8,5,True,0,20,2.6,7.15,96,200,True,False,14,17.3,7,21,6.0,0.1,10000.0 +1186,-1099.3100000000086,260,0.6767296263295487,12,46,40,2.2,9,3,True,1,14,2.55,5.12,48,100,True,True,14,17.2,7,21,6.0,0.1,10000.0 +1187,-3125.689999999987,735,0.6554042731462086,11,48,72,2.3,9,2,True,0,20,2.2,6.84,64,200,True,False,14,18.1,8,21,6.0,0.1,10000.0 +1188,-1504.9399999999932,365,0.7148919482655078,10,42,32,2.2,10,2,True,1,14,2.22,7.2,96,100,True,False,14,17.5,8,22,8.0,0.1,10000.0 +1189,-3805.860000000014,967,0.7054055351119052,8,38,56,1.6,6,5,True,0,14,2.97,4.74,64,200,True,False,14,21.5,7,22,6.0,0.1,10000.0 +1190,-3829.8700000000017,1007,0.7574683906626595,9,42,56,2.2,7,4,True,0,14,3.02,7.09,96,100,False,False,14,22.3,8,21,6.0,0.1,10000.0 +1191,-5640.250000000005,1030,0.6346436994701921,12,44,64,0.6,9,4,True,0,14,3.06,6.35,80,100,False,True,14,17.8,7,21,8.0,0.1,10000.0 +1192,-281.06000000000495,78,0.764882047850092,9,52,40,1.6,6,3,False,0,20,2.27,6.46,80,200,True,False,14,22.6,8,22,8.0,0.1,10000.0 +1193,-3174.149999999997,734,0.6761884261705735,10,42,56,2.2,10,4,True,0,20,2.32,6.75,80,100,True,True,14,16.0,8,22,6.0,0.1,10000.0 +1194,-941.5999999999767,373,0.819263001508701,11,52,48,2.0,6,3,True,1,14,2.8,7.27,64,100,True,False,14,22.2,8,22,6.0,0.1,10000.0 +1195,-566.8499999999967,114,0.705295172736489,12,38,48,1.0,10,2,False,0,14,3.08,5.55,64,100,True,False,14,16.1,7,21,8.0,0.1,10000.0 +1196,-2622.7099999999828,614,0.6828139437008084,8,38,40,2.1,8,4,True,0,14,3.19,5.35,48,100,True,True,14,20.0,8,21,6.0,0.1,10000.0 +1197,-1724.5399999999827,483,0.694267899849132,9,44,40,1.1,7,5,True,1,20,2.16,6.94,48,200,False,True,14,21.9,7,21,6.0,0.1,10000.0 +1198,-3596.579999999987,832,0.6589432359132892,10,46,32,0.8,10,2,True,0,20,2.38,7.12,64,100,True,False,14,17.9,8,22,6.0,0.1,10000.0 +1199,-6234.719999999998,1453,0.6735526501803787,8,52,56,1.1,8,4,True,0,14,2.46,6.29,80,100,False,False,14,23.2,8,21,6.0,0.1,10000.0 +1200,-3677.3399999999956,853,0.708180275064457,9,50,56,0.7,7,2,True,0,14,2.87,4.88,96,200,True,False,14,17.2,8,22,8.0,0.1,10000.0 +1201,-5162.140000000009,1220,0.6312095954346101,8,42,72,0.6,10,5,True,0,14,2.03,6.21,64,200,True,False,14,18.2,7,21,6.0,0.1,10000.0 +1202,-7103.1,1515,0.6236764224385933,8,48,72,1.0,8,4,True,0,14,2.33,6.66,64,100,False,True,14,16.8,7,21,8.0,0.1,10000.0 +1203,-3752.459999999972,1056,0.7161890802159179,11,52,72,0.8,9,3,True,1,20,3.03,4.96,48,100,False,False,14,21.0,8,21,6.0,0.1,10000.0 +1204,-1527.2899999999936,322,0.6768932638584777,8,46,64,1.5,6,5,True,1,20,3.0,5.09,64,100,True,True,14,20.7,8,22,6.0,0.1,10000.0 +1205,-3697.289999999989,995,0.7431120949486612,10,38,40,1.2,10,4,True,0,14,3.06,5.5,80,100,False,True,14,17.4,8,22,8.0,0.1,10000.0 +1206,-1946.9200000000174,432,0.6892549953474119,9,50,40,0.5,10,4,True,0,14,2.79,6.84,80,200,True,True,14,23.0,8,21,8.0,0.1,10000.0 +1207,-2553.0900000000056,569,0.6848040928344533,9,42,40,0.9,8,2,True,1,14,2.42,6.89,96,100,True,False,14,17.4,8,21,8.0,0.1,10000.0 +1208,-3770.520000000006,852,0.6353927738431845,9,38,32,2.2,7,3,True,0,14,2.34,6.22,48,100,False,True,14,21.2,8,21,8.0,0.1,10000.0 +1209,-4016.2499999999773,991,0.701369184645859,8,42,56,1.3,8,4,True,1,20,2.52,5.06,96,200,False,False,14,16.2,7,21,6.0,0.1,10000.0 +1210,-3342.9400000000023,771,0.67775288610582,8,44,40,1.2,7,3,True,0,20,3.0,4.78,64,200,True,True,14,16.4,7,21,8.0,0.1,10000.0 +1211,-48.94999999999527,87,0.9652353626317434,11,38,48,1.3,9,2,False,1,20,3.0,4.66,96,100,True,False,14,17.7,8,21,6.0,0.1,10000.0 +1212,-2429.9099999999835,627,0.7146911329060195,12,48,40,1.4,7,4,True,0,20,2.99,6.48,64,100,True,False,14,22.3,7,21,8.0,0.1,10000.0 +1213,-2705.7299999999886,823,0.7494007616902411,10,40,56,1.1,7,2,True,0,20,3.08,5.36,64,200,True,False,14,19.8,8,22,8.0,0.1,10000.0 +1214,221.46999999999935,26,1.6153824779793826,11,38,56,2.2,7,4,False,0,14,2.75,4.64,80,200,True,False,14,18.6,8,21,8.0,0.1,10000.0 +1215,-3678.629999999999,1092,0.7017422953153669,8,40,56,1.7,10,3,True,0,14,2.05,5.01,64,200,True,False,14,22.2,7,22,6.0,0.1,10000.0 +1216,-178.3399999999947,109,0.8723032529231916,9,46,48,1.4,8,3,False,0,20,2.54,6.78,48,100,True,False,14,22.2,8,21,8.0,0.1,10000.0 +1217,-5163.259999999989,1516,0.7183236436381608,9,50,64,1.6,8,5,True,0,20,2.88,5.3,48,100,False,False,14,17.8,8,22,8.0,0.1,10000.0 +1218,-3184.8800000000247,812,0.7051211780042664,10,42,32,1.3,8,3,True,1,14,3.0,4.6,64,200,False,False,14,18.1,8,21,8.0,0.1,10000.0 +1219,-521.5300000000025,82,0.5890876142451937,11,50,72,0.7,7,5,False,1,20,2.33,5.87,96,200,True,True,14,22.0,8,22,8.0,0.1,10000.0 +1220,-1650.6499999999924,377,0.664197626303519,11,52,40,1.9,9,3,True,1,14,2.44,5.39,48,200,False,True,14,20.9,7,21,6.0,0.1,10000.0 +1221,-1266.0499999999956,174,0.49859008784228,11,52,72,0.8,6,2,False,0,20,2.05,5.86,96,100,True,False,14,18.9,8,21,8.0,0.1,10000.0 +1222,-667.6800000000094,203,0.7807960130403523,8,44,72,1.0,8,5,False,1,14,2.25,5.69,96,100,True,False,14,19.8,7,21,6.0,0.1,10000.0 +1223,-1011.3999999999905,190,0.6865363099056881,9,50,56,2.3,9,4,True,1,14,2.93,5.86,96,200,True,True,14,22.1,7,22,8.0,0.1,10000.0 +1224,-5448.850000000003,1392,0.6862931250877988,9,50,40,1.1,7,5,True,0,20,2.96,6.41,48,200,False,False,14,17.1,7,22,6.0,0.1,10000.0 +1225,-175.02000000000044,58,0.7902922393031309,10,50,72,2.0,10,5,False,1,20,2.04,5.67,64,100,True,False,14,22.1,7,22,6.0,0.1,10000.0 +1226,-2597.7199999999766,741,0.723119557455154,12,42,64,2.2,6,3,True,0,14,2.5,5.47,64,100,True,False,14,19.7,7,22,8.0,0.1,10000.0 +1227,-1288.9399999999969,330,0.7146803673688942,12,46,40,1.3,8,3,True,0,14,3.17,4.76,64,200,True,True,14,23.9,7,21,8.0,0.1,10000.0 +1228,-1306.9899999999998,306,0.6759743157477192,10,50,56,0.6,9,3,True,1,20,2.98,5.82,48,200,True,True,14,20.2,8,21,8.0,0.1,10000.0 +1229,-2559.4899999999907,387,0.5493189133604266,9,38,72,0.8,6,5,False,1,14,2.5,6.01,48,200,False,False,14,23.6,8,21,6.0,0.1,10000.0 +1230,-7.280000000000655,109,0.9953875298575077,10,38,32,1.3,8,3,False,1,14,2.39,5.1,96,100,True,False,14,16.4,7,22,8.0,0.1,10000.0 +1231,-2376.290000000001,383,0.5755146881503381,8,52,32,0.9,10,2,False,1,14,2.55,5.71,64,200,False,False,14,21.2,8,22,8.0,0.1,10000.0 +1232,-306.9400000000005,101,0.7902570024805078,8,38,56,0.8,10,4,False,0,20,2.76,4.77,96,100,True,True,14,21.5,8,21,6.0,0.1,10000.0 +1233,-988.8400000000147,198,0.6250459762705567,11,50,56,0.8,10,2,False,0,14,2.29,4.86,48,100,True,False,14,21.4,8,22,8.0,0.1,10000.0 +1234,-3192.8900000000185,802,0.6931220643514349,9,48,64,1.3,7,4,True,1,20,3.08,4.74,48,200,False,True,14,17.1,7,22,6.0,0.1,10000.0 +1235,-3352.1899999999996,840,0.6705561506786041,11,38,64,0.7,7,3,True,0,14,2.01,6.15,80,200,True,True,14,16.5,8,22,6.0,0.1,10000.0 +1236,-3701.239999999996,864,0.671455302710207,9,46,40,1.3,7,4,True,0,20,2.27,6.79,80,100,False,True,14,22.5,8,22,6.0,0.1,10000.0 +1237,-5796.849999999994,1379,0.7066640150876867,9,50,72,1.0,10,3,True,0,20,3.2,5.25,80,200,False,False,14,19.3,7,21,6.0,0.1,10000.0 +1238,-2314.83000000001,455,0.6419958149871713,11,38,56,1.3,9,5,True,1,14,2.16,6.24,96,100,True,True,14,16.4,8,21,8.0,0.1,10000.0 +1239,-4653.1799999999785,987,0.6299969942891495,9,42,56,1.6,7,2,True,0,20,2.09,5.86,96,100,True,False,14,19.0,7,21,6.0,0.1,10000.0 +1240,-1470.8099999999977,445,0.7248508090917595,10,52,56,1.6,9,5,True,1,14,2.45,6.84,48,200,True,False,14,18.0,7,21,8.0,0.1,10000.0 +1241,-123.51999999999498,99,0.9172350946784418,12,44,32,1.2,10,3,False,0,14,3.19,5.71,48,100,True,False,14,18.4,8,22,6.0,0.1,10000.0 +1242,-1921.3400000000047,385,0.6217767637615628,12,40,48,2.0,7,2,True,1,14,2.26,4.85,64,200,True,False,14,23.2,8,21,6.0,0.1,10000.0 +1243,-4078.829999999989,993,0.6636133016423349,12,50,72,1.2,9,4,True,1,14,2.36,4.53,64,100,False,False,14,17.9,7,21,8.0,0.1,10000.0 +1244,-347.91999999999825,23,0.27925091150149156,11,50,64,2.4,6,4,False,1,20,2.15,7.31,48,200,True,True,14,17.1,7,21,8.0,0.1,10000.0 +1245,-2717.959999999979,721,0.7232312967079517,10,44,72,2.4,9,5,True,0,20,2.69,7.43,64,200,True,False,14,18.0,8,22,8.0,0.1,10000.0 +1246,-3026.2699999999822,614,0.6256756656466229,8,42,48,1.0,6,3,True,1,20,3.02,4.79,48,200,True,False,14,17.6,7,21,8.0,0.1,10000.0 +1247,-4339.04,1280,0.7276352568170591,10,38,40,1.3,10,3,True,0,20,3.0,6.73,48,100,False,False,14,17.5,8,21,6.0,0.1,10000.0 +1248,-4294.650000000002,944,0.6449443645722327,10,42,48,2.2,8,4,True,0,14,2.94,5.98,48,200,False,True,14,19.3,7,21,8.0,0.1,10000.0 +1249,-1933.1900000000087,414,0.698175334620867,8,38,72,2.2,9,4,True,1,14,2.94,6.39,80,100,True,True,14,17.9,7,22,6.0,0.1,10000.0 +1250,-789.7500000000018,167,0.6652523694070973,10,48,56,0.9,8,2,False,0,20,2.61,5.53,48,100,True,False,14,18.1,8,22,6.0,0.1,10000.0 +1251,-3767.2899999999972,948,0.63530308075958,12,40,56,0.6,9,5,True,0,20,2.01,5.24,48,200,True,False,14,16.9,8,21,6.0,0.1,10000.0 +1252,-1958.349999999994,323,0.5582057968922016,12,42,40,0.7,10,2,False,0,20,2.47,4.98,48,100,False,False,14,23.3,8,22,6.0,0.1,10000.0 +1253,-4760.4399999999905,1159,0.6844084332061802,11,38,40,1.3,7,4,True,0,20,2.83,6.63,64,100,False,False,14,18.7,8,21,6.0,0.1,10000.0 +1254,-1667.810000000005,335,0.7055331816103237,8,44,64,2.5,8,4,True,1,14,2.91,7.02,96,100,False,True,14,23.7,8,21,6.0,0.1,10000.0 +1255,-3890.6699999999964,926,0.661634086799827,8,40,64,1.9,6,4,True,0,14,2.24,7.07,64,200,True,False,14,16.8,8,22,6.0,0.1,10000.0 +1256,-541.0099999999948,147,0.7017207253400376,10,42,56,1.0,6,2,False,1,20,2.04,7.48,64,100,True,False,14,17.8,8,21,8.0,0.1,10000.0 +1257,-174.24999999999818,50,0.8167274945570432,11,46,48,1.9,8,5,False,1,14,3.04,6.54,64,100,True,False,14,22.0,8,22,6.0,0.1,10000.0 +1258,-5630.669999999987,1223,0.6171237515503623,12,48,72,1.0,8,5,True,0,20,2.16,5.72,64,200,False,True,14,19.0,7,22,6.0,0.1,10000.0 +1259,-4165.159999999994,1004,0.7111361242129369,8,42,72,1.3,10,4,True,0,20,2.58,6.17,96,100,True,False,14,20.1,7,22,6.0,0.1,10000.0 +1260,-3186.38,718,0.6157724332113421,11,44,32,1.3,7,5,True,0,14,2.16,6.09,48,200,True,False,14,21.0,7,21,6.0,0.1,10000.0 +1261,-432.5899999999983,117,0.7469109077718753,12,38,64,0.7,7,2,False,0,14,2.17,4.91,80,200,True,True,14,17.6,8,22,8.0,0.1,10000.0 +1262,-1568.509999999993,576,0.7736791299868552,12,48,40,2.2,10,3,True,0,14,2.75,6.1,48,100,True,False,14,23.3,8,22,8.0,0.1,10000.0 +1263,-3117.209999999992,772,0.7085793616663238,10,46,72,1.7,7,2,True,0,20,2.83,7.28,64,100,True,True,14,16.1,7,22,8.0,0.1,10000.0 +1264,-2499.2100000000037,677,0.7473383794013665,10,44,48,2.3,8,4,True,0,14,3.04,6.29,80,100,True,False,14,20.9,7,22,8.0,0.1,10000.0 +1265,-2248.029999999988,567,0.6745188430515479,11,38,40,2.4,9,2,True,0,20,2.65,4.59,48,200,True,True,14,17.2,8,22,6.0,0.1,10000.0 +1266,147.29000000000633,59,1.2001739579511017,9,44,48,2.1,6,4,False,0,14,2.09,7.36,48,100,True,False,14,21.4,7,22,8.0,0.1,10000.0 +1267,-564.8600000000188,180,0.7373135161278321,8,48,56,0.6,10,5,False,0,20,2.15,5.27,48,100,True,True,14,18.6,8,22,6.0,0.1,10000.0 +1268,-356.1599999999944,61,0.7063905559585835,11,46,72,2.0,7,2,False,0,20,2.7,5.46,96,100,False,True,14,16.6,8,22,8.0,0.1,10000.0 +1269,-4125.1499999999705,1245,0.7472487882168912,11,44,56,1.2,6,3,True,0,20,2.32,6.51,96,200,False,False,14,19.0,8,21,6.0,0.1,10000.0 +1270,-2369.969999999994,769,0.7721263762731517,9,52,56,2.1,6,4,True,0,14,2.68,4.99,80,200,True,False,14,17.7,7,22,6.0,0.1,10000.0 +1271,-2740.3599999999997,717,0.7433278696201939,9,44,64,2.5,9,4,True,0,14,3.04,7.26,80,100,True,False,14,23.5,8,22,6.0,0.1,10000.0 +1272,-2203.9599999999864,425,0.6231786924542045,10,42,56,1.4,7,3,True,1,20,2.78,4.64,64,100,True,True,14,16.8,7,21,8.0,0.1,10000.0 +1273,-3347.4799999999805,1004,0.7372683277529499,12,44,40,2.0,7,4,True,0,14,3.15,5.98,48,100,False,False,14,22.4,8,22,8.0,0.1,10000.0 +1274,-6503.569999999998,1527,0.6442402106254708,8,48,48,1.9,7,5,True,0,20,2.52,6.57,48,100,False,False,14,17.0,7,22,8.0,0.1,10000.0 +1275,-5092.14,1222,0.65259956446516,9,44,72,0.8,9,3,True,0,20,2.56,5.16,48,200,False,True,14,21.6,7,22,8.0,0.1,10000.0 +1276,-1718.889999999994,634,0.762211148985148,10,52,32,2.4,9,2,True,1,20,2.06,5.64,48,200,False,False,14,17.4,8,21,8.0,0.1,10000.0 +1277,-4021.7800000000007,918,0.6536346239637322,8,38,72,1.4,8,2,True,0,20,2.02,6.44,96,200,True,True,14,17.3,8,22,6.0,0.1,10000.0 +1278,-2094.4600000000137,455,0.6579652586008398,10,38,56,2.2,6,2,True,1,20,2.23,6.03,80,200,True,False,14,21.8,8,22,8.0,0.1,10000.0 +1279,-172.83000000000538,34,0.6979869290182784,10,52,72,1.7,6,3,False,1,20,2.9,7.02,80,100,True,True,14,23.3,8,21,8.0,0.1,10000.0 +1280,-3395.940000000004,853,0.6654127634083573,10,38,48,1.7,7,3,True,0,20,2.26,4.9,64,200,True,False,14,17.0,7,21,6.0,0.1,10000.0 +1281,-2118.9599999999955,522,0.6858361157402191,10,46,64,2.4,7,4,True,0,14,2.22,5.85,64,100,True,True,14,23.8,8,22,8.0,0.1,10000.0 +1282,-2565.7899999999936,457,0.6478968140699104,9,42,48,1.3,9,5,True,1,14,3.09,4.89,96,200,True,False,14,21.3,8,21,8.0,0.1,10000.0 +1283,-167.55999999999767,29,0.6920815186430712,12,38,56,1.9,7,4,False,1,20,2.48,5.9,80,200,True,True,14,18.6,8,22,8.0,0.1,10000.0 +1284,-2065.7499999999854,651,0.7345886010895262,12,50,40,2.3,10,3,True,1,20,2.18,5.68,48,100,False,False,14,20.6,7,22,6.0,0.1,10000.0 +1285,-1951.719999999994,390,0.6557066171321115,11,50,40,0.5,9,4,True,0,20,2.82,5.72,80,200,True,True,14,23.4,8,22,8.0,0.1,10000.0 +1286,-6461.080000000009,1701,0.6763854996854552,10,52,48,0.7,7,4,True,0,20,2.01,4.66,96,200,False,False,14,22.5,7,22,6.0,0.1,10000.0 +1287,-3600.469999999995,840,0.7156348058631608,10,40,56,1.3,8,4,True,0,14,3.07,7.08,80,100,False,True,14,20.9,8,21,6.0,0.1,10000.0 +1288,-2004.2499999999945,559,0.7288685189869821,9,44,64,1.3,10,5,True,1,14,3.0,6.96,48,100,True,False,14,23.7,8,21,6.0,0.1,10000.0 +1289,-2315.859999999985,443,0.6174042048432021,12,46,48,0.8,7,5,True,0,14,2.96,5.5,48,100,True,True,14,22.2,8,21,6.0,0.1,10000.0 +1290,-153.5500000000011,41,0.7389315832426552,10,38,64,2.0,6,5,False,0,20,2.16,5.32,64,200,True,False,14,18.9,8,21,8.0,0.1,10000.0 +1291,-4287.909999999985,1107,0.6959769992697056,10,38,56,0.9,9,5,True,1,14,2.69,5.99,64,200,False,False,14,23.1,7,21,8.0,0.1,10000.0 +1292,-328.74999999999636,186,0.8871601073652271,8,42,72,1.7,8,3,False,0,14,3.16,5.56,64,200,False,False,14,20.9,7,22,6.0,0.1,10000.0 +1293,-376.2899999999954,96,0.7154750022683968,10,42,32,1.0,10,5,False,0,20,2.34,5.81,80,200,True,True,14,18.5,8,22,6.0,0.1,10000.0 +1294,-1170.920000000002,167,0.6146882578836351,9,38,64,1.5,7,4,False,1,20,2.84,6.92,80,100,False,False,14,17.3,7,21,8.0,0.1,10000.0 +1295,-4157.54999999999,985,0.6876263191665527,8,48,72,1.6,10,4,True,0,20,3.01,5.38,64,100,True,False,14,21.6,8,22,6.0,0.1,10000.0 +1296,-1099.9399999999987,397,0.8068131922173084,12,44,72,2.4,6,4,True,1,14,2.56,6.0,80,100,True,False,14,22.6,8,22,6.0,0.1,10000.0 +1297,-936.2399999999889,166,0.6133923557199961,11,42,40,0.8,7,3,False,0,14,2.54,6.01,48,100,True,False,14,19.8,7,21,8.0,0.1,10000.0 +1298,159.9799999999941,36,1.311190647551985,10,46,72,1.6,9,2,False,1,20,2.97,7.45,80,200,True,True,14,22.3,8,22,8.0,0.1,10000.0 +1299,-1744.2999999999793,445,0.6934936591863164,10,44,64,1.5,10,2,True,1,14,2.56,4.7,48,200,True,True,14,16.5,8,22,8.0,0.1,10000.0 +1300,-3113.4000000000015,717,0.7232046173459862,9,50,64,0.9,8,5,True,0,14,3.03,7.38,96,200,True,False,14,17.9,8,21,6.0,0.1,10000.0 +1301,-853.9199999999928,292,0.7884792113052848,8,38,72,2.2,6,2,True,1,20,3.02,6.85,48,100,True,True,14,22.6,7,22,8.0,0.1,10000.0 +1302,-2142.850000000006,529,0.6951823201904995,12,38,32,0.6,10,3,True,0,14,2.71,4.93,64,100,True,True,14,20.1,8,22,8.0,0.1,10000.0 +1303,-4474.839999999989,1015,0.680894184293585,8,44,72,1.1,9,5,True,0,20,3.03,6.85,64,100,True,False,14,21.5,7,22,8.0,0.1,10000.0 +1304,-5188.39000000002,1187,0.6896868093912327,9,40,40,2.2,7,2,True,0,20,2.76,6.54,80,200,False,False,14,18.9,7,22,6.0,0.1,10000.0 +1305,-2949.5999999999876,815,0.6794627284137774,12,46,72,2.1,8,2,True,0,14,2.13,4.73,48,200,True,False,14,21.2,7,21,6.0,0.1,10000.0 +1306,-1427.5899999999965,605,0.8125545723953292,10,38,40,1.3,9,2,True,1,20,2.98,6.83,48,100,False,True,14,19.5,8,22,6.0,0.1,10000.0 +1307,-1370.4400000000132,454,0.777489490971734,9,44,72,2.4,8,4,True,1,20,2.32,7.43,80,100,True,False,14,21.8,8,22,6.0,0.1,10000.0 +1308,-5100.390000000021,1394,0.6955685330270948,8,50,40,2.4,10,4,True,0,20,2.61,5.12,48,200,False,False,14,18.9,7,21,8.0,0.1,10000.0 +1309,-780.539999999999,226,0.7752082205352102,9,40,64,1.3,10,3,False,0,14,2.68,4.77,80,200,False,False,14,24.0,7,21,6.0,0.1,10000.0 +1310,185.83000000000175,45,1.2762326639216328,10,40,56,2.2,8,2,False,0,20,2.65,6.25,96,100,True,False,14,18.4,8,22,8.0,0.1,10000.0 +1311,-1110.8499999999985,175,0.5882706142675528,11,42,72,0.7,10,4,False,0,14,3.11,5.96,48,200,True,False,14,16.0,7,21,6.0,0.1,10000.0 +1312,-4596.679999999997,1065,0.7206597919600084,8,40,56,1.6,6,4,True,0,20,3.01,6.5,96,100,False,True,14,18.0,7,22,8.0,0.1,10000.0 +1313,-13.999999999996362,35,0.9715447154471545,10,38,72,2.5,10,3,False,0,20,2.8,7.49,64,100,True,False,14,23.7,8,21,8.0,0.1,10000.0 +1314,-3157.919999999992,733,0.7118807057368031,9,40,64,2.3,9,5,True,0,14,2.72,5.63,96,200,True,False,14,16.0,8,22,6.0,0.1,10000.0 +1315,-545.1999999999935,118,0.6427143746518562,10,42,32,0.8,7,3,False,1,14,2.32,6.27,48,100,True,True,14,19.5,8,21,8.0,0.1,10000.0 +1316,-1928.4000000000015,396,0.653430381453026,11,48,64,2.0,6,5,True,1,14,2.39,6.41,80,200,True,False,14,18.4,7,21,6.0,0.1,10000.0 +1317,-5531.420000000003,1537,0.708657498142049,10,40,56,1.1,9,4,True,0,14,3.04,5.63,48,100,False,False,14,18.0,7,22,6.0,0.1,10000.0 +1318,-1817.6299999999983,412,0.7114731042321131,8,48,72,2.3,9,4,True,1,14,2.77,5.96,96,200,True,False,14,18.4,7,21,6.0,0.1,10000.0 +1319,-1439.4800000000123,470,0.7974229647726376,12,48,32,2.4,8,4,True,1,14,3.0,6.85,80,200,False,False,14,23.0,8,22,6.0,0.1,10000.0 +1320,-5979.670000000044,1768,0.7191418228889502,9,44,64,0.5,9,3,True,0,20,3.11,5.33,48,200,False,False,14,18.3,7,21,8.0,0.1,10000.0 +1321,-333.20999999999185,161,0.8629616986975174,8,40,48,1.9,10,5,False,1,20,2.71,5.45,48,100,False,False,14,18.3,8,22,6.0,0.1,10000.0 +1322,-2373.540000000001,519,0.6705411722901132,11,52,72,1.4,6,3,True,1,20,2.6,4.68,96,100,True,False,14,17.6,7,22,6.0,0.1,10000.0 +1323,-2267.5600000000177,506,0.6706157832963406,8,46,40,1.4,10,5,True,1,14,3.13,4.54,48,200,True,False,14,20.9,8,22,8.0,0.1,10000.0 +1324,-633.2299999999977,86,0.5745965845728028,10,42,48,2.0,6,5,False,1,14,2.17,5.78,64,100,False,False,14,19.0,8,21,6.0,0.1,10000.0 +1325,-3390.7200000000266,916,0.7389669597724952,8,50,32,0.6,7,2,True,1,20,3.05,7.43,80,100,False,False,14,23.3,7,21,8.0,0.1,10000.0 +1326,-3785.929999999981,1008,0.6937824391577486,8,40,48,2.1,6,5,True,0,14,2.12,4.73,80,100,True,False,14,23.9,8,22,6.0,0.1,10000.0 +1327,-6833.679999999996,1566,0.6353988098953791,9,42,40,0.8,7,4,True,0,20,2.28,7.43,64,100,False,False,14,16.4,8,21,6.0,0.1,10000.0 +1328,-1505.0599999999922,306,0.6173427099700497,8,38,32,0.7,7,4,False,0,14,2.27,4.8,64,100,True,False,14,20.1,7,21,6.0,0.1,10000.0 +1329,-5393.269999999993,1270,0.6775869912594759,9,46,48,2.2,9,4,True,0,14,2.37,6.0,80,200,False,False,14,19.4,7,21,8.0,0.1,10000.0 +1330,-358.96000000000276,65,0.6522480454937368,12,50,56,0.9,7,2,False,1,20,2.3,6.75,96,100,True,True,14,20.6,8,21,8.0,0.1,10000.0 +1331,163.4200000000019,50,1.2317915549692922,9,48,56,2.2,6,4,False,0,20,3.18,5.71,80,100,True,False,14,22.1,8,21,8.0,0.1,10000.0 +1332,-5215.980000000009,1140,0.6560566506409728,9,38,64,2.3,9,4,True,0,20,2.94,5.61,64,200,False,True,14,19.0,8,22,8.0,0.1,10000.0 +1333,-1434.8200000000033,588,0.8010717132855014,11,50,72,1.1,7,4,True,1,20,2.15,6.4,80,100,True,False,14,17.6,8,22,6.0,0.1,10000.0 +1334,-70.09999999999673,80,0.9330109705286495,10,40,48,1.4,7,5,False,1,20,3.14,6.73,64,200,True,False,14,23.5,8,22,8.0,0.1,10000.0 +1335,-2744.9899999999816,628,0.6584784131443366,12,50,40,1.8,6,5,True,0,14,2.36,5.91,64,100,True,False,14,18.8,7,21,6.0,0.1,10000.0 +1336,-2706.5500000000093,809,0.7649811441338416,11,44,72,1.4,6,3,True,0,14,2.57,5.64,96,100,True,False,14,18.2,8,22,6.0,0.1,10000.0 +1337,-1758.0899999999856,574,0.7721474200709961,12,42,56,2.0,10,3,True,0,14,3.17,5.69,64,200,True,False,14,17.5,8,21,6.0,0.1,10000.0 +1338,-231.39000000000487,44,0.6871543880048132,11,46,48,2.0,7,3,False,0,20,2.17,7.29,80,100,True,False,14,22.6,8,21,6.0,0.1,10000.0 +1339,-793.8599999999842,411,0.8600992166641701,9,50,72,2.3,8,5,True,1,20,2.54,6.52,96,100,True,False,14,17.8,7,21,6.0,0.1,10000.0 +1340,-3248.399999999964,768,0.6594151006897884,11,40,40,1.2,10,2,True,0,14,2.68,5.32,48,100,True,False,14,17.9,8,21,8.0,0.1,10000.0 +1341,-3755.1099999999915,776,0.5829291400150829,11,52,72,2.1,8,2,True,0,20,2.11,4.69,48,200,True,True,14,17.7,7,22,6.0,0.1,10000.0 +1342,-3216.2899999999963,741,0.6644587903661618,8,50,32,2.5,10,2,True,0,20,2.79,7.27,48,100,False,True,14,22.6,8,22,6.0,0.1,10000.0 +1343,-3819.2099999999928,841,0.6375673652055333,11,38,72,2.4,10,2,True,0,14,2.15,7.04,64,200,False,True,14,23.5,8,22,6.0,0.1,10000.0 +1344,-1997.9300000000012,437,0.6708300382232766,8,44,48,0.9,9,2,False,0,14,2.58,7.32,48,100,False,False,14,16.5,8,22,6.0,0.1,10000.0 +1345,-380.17000000000735,66,0.6164315838327583,8,52,32,0.9,7,2,False,1,20,3.11,6.95,64,200,True,True,14,22.9,7,21,8.0,0.1,10000.0 +1346,-2550.960000000002,634,0.7050698490179053,8,40,40,2.2,9,4,True,0,20,3.12,4.73,64,200,True,True,14,18.9,8,22,8.0,0.1,10000.0 +1347,-645.460000000001,160,0.7548501283745803,9,40,40,1.6,6,2,False,0,20,2.74,4.83,96,100,False,False,14,17.4,7,21,8.0,0.1,10000.0 +1348,-2791.049999999994,644,0.6666941331575478,10,38,32,1.9,6,4,True,0,14,2.49,6.49,64,200,True,False,14,20.4,8,22,6.0,0.1,10000.0 +1349,-4724.299999999996,1142,0.6500515926308094,10,42,72,1.5,8,2,True,0,20,2.34,6.66,48,200,False,True,14,20.8,8,22,8.0,0.1,10000.0 +1350,-3131.069999999995,769,0.6773912031050532,11,46,64,1.6,10,3,True,0,20,2.13,7.47,80,200,True,False,14,23.5,8,21,8.0,0.1,10000.0 +1351,62.17000000000371,37,1.108240332886467,10,46,40,2.2,7,5,False,1,14,2.55,5.67,64,200,True,False,14,16.2,8,21,8.0,0.1,10000.0 +1352,-3619.2100000000064,811,0.6912832454748622,8,38,32,1.1,8,2,True,0,20,2.61,7.37,96,100,True,False,14,22.3,8,21,6.0,0.1,10000.0 +1353,-2651.0300000000134,647,0.717989632433272,8,50,56,1.6,6,4,True,0,14,2.64,4.52,96,100,True,True,14,21.8,7,22,6.0,0.1,10000.0 +1354,-753.7200000000084,155,0.6760325463243542,9,44,40,1.6,7,3,False,0,20,2.02,5.33,80,100,False,False,14,18.9,8,21,6.0,0.1,10000.0 +1355,-1479.5399999999881,391,0.7005919195394158,10,40,32,2.0,10,4,True,1,14,2.27,7.17,48,100,True,False,14,21.3,8,21,8.0,0.1,10000.0 +1356,-4425.789999999993,1141,0.6887802998286311,11,42,40,2.0,10,3,True,0,20,2.14,6.6,80,200,False,False,14,20.8,8,21,6.0,0.1,10000.0 +1357,-2618.4400000000187,549,0.6361139947496932,9,38,32,0.5,8,2,False,0,20,2.29,4.73,80,100,False,False,14,23.4,8,22,8.0,0.1,10000.0 +1358,-3859.8399999999965,896,0.6511966889422055,12,50,56,1.1,7,2,True,0,14,2.03,5.17,80,200,False,True,14,21.7,7,21,8.0,0.1,10000.0 +1359,-3989.050000000004,846,0.6480925869237467,12,40,72,0.8,7,5,True,0,20,2.72,4.54,80,200,True,False,14,22.3,8,21,8.0,0.1,10000.0 +1360,44.17000000001826,84,1.0311567572143023,9,38,56,1.7,9,2,False,0,20,3.07,6.06,96,100,True,False,14,21.8,8,22,8.0,0.1,10000.0 +1361,-3026.169999999989,757,0.7108183781510999,11,44,40,1.4,8,4,True,0,14,2.48,4.93,96,100,True,False,14,21.3,7,22,6.0,0.1,10000.0 +1362,-3245.359999999997,694,0.6769217291580389,9,48,40,1.8,10,4,True,0,20,2.74,4.98,96,200,True,False,14,19.7,8,21,8.0,0.1,10000.0 +1363,-3988.060000000012,900,0.6841228163971692,8,46,72,0.9,7,4,True,0,20,2.61,6.8,80,100,True,True,14,17.0,7,22,8.0,0.1,10000.0 +1364,-3723.219999999993,902,0.6792462257876655,9,50,64,0.7,10,4,True,0,20,3.02,6.25,48,200,True,False,14,20.5,8,21,6.0,0.1,10000.0 +1365,-2292.930000000013,446,0.6371624700922867,10,42,48,1.4,7,3,True,1,14,2.74,5.51,80,200,True,False,14,22.8,8,21,8.0,0.1,10000.0 +1366,-6406.779999999984,1656,0.6987773428776285,9,38,48,0.5,7,5,True,0,14,2.53,4.8,80,100,False,False,14,22.6,7,22,6.0,0.1,10000.0 +1367,-634.9899999999834,347,0.8800008315033959,11,52,64,2.4,7,2,True,1,14,2.71,7.2,96,100,True,False,14,19.2,7,22,6.0,0.1,10000.0 +1368,-3007.860000000008,787,0.6887558865437567,9,40,40,1.7,10,2,True,1,20,2.01,4.95,96,100,False,True,14,16.4,7,21,6.0,0.1,10000.0 +1369,-3212.6499999999933,812,0.6932105532552063,10,44,56,1.7,6,2,True,0,14,2.22,6.25,80,200,True,False,14,17.2,8,22,8.0,0.1,10000.0 +1370,-2107.3999999999915,440,0.6616015556629633,11,40,64,2.0,8,4,True,1,20,2.7,6.36,64,100,True,False,14,22.4,8,21,6.0,0.1,10000.0 +1371,-88.1100000000024,78,0.9211712920715015,9,40,56,1.8,9,5,False,0,20,2.4,5.37,80,100,True,False,14,22.3,7,22,8.0,0.1,10000.0 +1372,-2098.1900000000023,413,0.6410153316030174,9,40,32,1.8,9,5,True,1,20,2.41,5.53,96,200,True,False,14,16.2,7,21,8.0,0.1,10000.0 +1373,-3069.6199999999935,814,0.7022336213068033,11,38,56,1.8,10,2,True,0,14,2.08,4.84,96,200,True,False,14,21.0,8,22,6.0,0.1,10000.0 +1374,-845.4500000000025,179,0.635905187635117,10,44,40,0.8,9,2,False,0,14,2.09,4.91,80,200,True,False,14,23.3,7,21,8.0,0.1,10000.0 +1375,-6210.809999999967,1348,0.6447114386280443,9,46,40,0.5,6,3,True,0,14,2.68,6.11,64,100,False,True,14,16.6,7,22,8.0,0.1,10000.0 +1376,-226.60999999999876,60,0.7359627148266822,10,50,56,1.7,7,5,False,1,20,2.12,6.48,64,200,True,False,14,20.6,8,21,6.0,0.1,10000.0 +1377,-3637.6899999999787,785,0.6658724567447988,8,40,32,2.1,6,5,True,0,20,2.47,5.05,96,100,True,False,14,22.4,8,21,8.0,0.1,10000.0 +1378,-1103.8900000000067,208,0.6428453566887431,10,48,40,2.4,7,5,True,1,20,2.38,6.75,96,200,True,True,14,19.5,8,22,6.0,0.1,10000.0 +1379,-5176.319999999989,1344,0.7253858604742955,9,46,64,1.1,8,2,True,0,20,2.75,5.44,96,100,False,False,14,18.6,8,21,6.0,0.1,10000.0 +1380,-1106.670000000002,168,0.6211253911412079,8,50,40,2.0,9,5,True,1,14,2.89,6.61,96,100,True,True,14,23.0,7,21,6.0,0.1,10000.0 +1381,-2820.819999999997,704,0.6678117157718837,12,40,48,1.4,8,2,True,0,14,2.35,5.98,48,200,True,False,14,21.8,8,21,8.0,0.1,10000.0 +1382,-5039.90999999999,1132,0.6250998635755698,8,46,72,1.8,9,2,True,0,14,2.11,5.86,64,100,True,False,14,21.2,7,21,8.0,0.1,10000.0 +1383,-314.0899999999947,62,0.711356785766799,10,40,72,2.3,9,5,False,0,14,2.47,5.72,64,100,False,False,14,17.6,7,21,6.0,0.1,10000.0 +1384,188.26000000000022,37,1.3681339095406637,9,38,32,2.3,10,4,False,0,14,2.47,5.26,64,100,True,False,14,22.8,8,21,6.0,0.1,10000.0 +1385,-4396.229999999998,1096,0.7088273163442916,12,50,56,1.9,6,3,True,0,20,2.77,5.26,80,200,False,False,14,16.2,8,22,8.0,0.1,10000.0 +1386,-107.08000000000175,45,0.8855628346389373,12,38,32,2.2,7,4,False,0,14,3.09,7.29,80,100,False,False,14,16.6,8,22,8.0,0.1,10000.0 +1387,-366.0899999999983,43,0.5157667786566493,8,52,48,2.1,10,2,False,0,14,3.14,6.7,48,200,True,True,14,16.5,8,21,8.0,0.1,10000.0 +1388,-2160.890000000004,743,0.7671693091763235,9,40,48,1.3,10,4,True,1,14,3.0,5.07,48,200,False,True,14,17.7,8,22,8.0,0.1,10000.0 +1389,-4750.180000000005,1094,0.6818866420891554,10,38,40,0.6,6,2,True,1,20,2.46,5.84,96,200,False,False,14,16.3,7,21,8.0,0.1,10000.0 +1390,-3226.169999999992,848,0.7275180448549571,8,50,64,1.6,10,3,True,1,14,2.52,4.82,96,200,False,False,14,16.9,8,22,8.0,0.1,10000.0 +1391,-3789.049999999974,927,0.6954871779210624,10,44,72,0.9,9,2,True,0,20,3.04,5.5,64,200,True,False,14,18.9,7,22,8.0,0.1,10000.0 +1392,-3998.459999999971,893,0.6551892446598425,10,52,72,0.8,8,3,True,0,14,2.69,6.28,64,200,True,False,14,19.2,7,21,8.0,0.1,10000.0 +1393,-3413.350000000005,750,0.658166606912879,11,48,64,0.6,8,4,True,0,20,2.73,5.12,64,100,True,True,14,18.7,7,22,6.0,0.1,10000.0 +1394,-2109.149999999998,512,0.7016258747936357,11,50,56,1.7,7,4,True,0,20,2.97,6.63,64,200,True,True,14,19.0,8,22,6.0,0.1,10000.0 +1395,219.27999999999884,43,1.4129800177034484,9,38,64,1.4,7,2,False,1,20,2.15,6.67,48,200,True,True,14,22.9,7,22,8.0,0.1,10000.0 +1396,-285.0199999999986,31,0.5804148449115989,11,52,72,2.4,6,2,False,0,14,2.38,6.58,96,200,True,False,14,22.2,7,21,8.0,0.1,10000.0 +1397,-4621.010000000018,1106,0.6629848638887714,8,42,32,0.6,7,4,True,0,20,2.81,5.97,48,200,False,True,14,19.9,8,22,6.0,0.1,10000.0 +1398,-2300.45999999999,469,0.6792952598164821,12,50,32,1.9,10,5,True,0,20,2.85,5.8,96,200,True,False,14,18.4,8,21,6.0,0.1,10000.0 +1399,-3166.7200000000093,606,0.6520454984968619,10,46,32,0.5,8,3,True,0,14,3.18,5.64,80,100,True,True,14,17.6,7,21,6.0,0.1,10000.0 +1400,-3460.849999999986,724,0.6427059717456031,12,40,48,1.0,10,2,True,0,20,2.83,5.93,64,200,True,False,14,18.7,7,21,8.0,0.1,10000.0 +1401,-4536.75,1009,0.6139619539689996,8,40,32,0.6,7,5,True,0,14,2.16,5.55,64,200,True,False,14,20.8,7,21,8.0,0.1,10000.0 +1402,-2403.489999999997,601,0.7030591153879892,10,44,48,1.5,6,3,True,0,20,2.57,4.77,80,200,True,True,14,20.0,8,22,8.0,0.1,10000.0 +1403,-363.0300000000025,30,0.3593512864857234,9,42,32,2.3,6,5,False,0,20,2.51,4.94,64,200,True,True,14,18.7,7,22,6.0,0.1,10000.0 +1404,14.819999999999709,51,1.0186654575682006,10,38,32,2.1,7,2,False,0,14,2.1,6.5,96,100,True,False,14,20.7,8,22,6.0,0.1,10000.0 +1405,-35.109999999996944,49,0.9593012472759308,9,52,32,1.3,7,2,False,1,14,3.19,5.46,96,100,True,True,14,21.7,7,21,6.0,0.1,10000.0 +1406,-1839.739999999988,448,0.7067648080791337,8,38,72,0.6,6,3,True,1,20,2.63,6.68,80,100,True,True,14,21.1,7,22,8.0,0.1,10000.0 +1407,-549.4000000000015,97,0.6723462371106352,8,48,64,2.3,10,3,False,1,14,2.75,5.19,80,100,False,False,14,19.3,7,21,8.0,0.1,10000.0 +1408,-4224.6899999999805,1221,0.7395934524367211,11,42,64,2.3,6,2,True,0,20,2.62,5.55,80,200,False,False,14,22.2,7,22,6.0,0.1,10000.0 +1409,-186.65999999999985,92,0.8733941967253145,8,40,32,2.5,10,3,False,1,14,2.01,6.34,96,100,False,False,14,20.9,8,21,6.0,0.1,10000.0 +1410,-3246.5299999999943,870,0.7023288097021665,12,40,72,1.1,9,3,True,0,20,2.78,6.77,48,200,True,False,14,19.8,7,22,8.0,0.1,10000.0 +1411,-3665.680000000014,886,0.6706762148355977,11,42,72,1.6,7,5,True,0,20,2.03,6.69,96,100,True,False,14,17.4,7,21,8.0,0.1,10000.0 +1412,-205.2699999999968,64,0.80135097209991,11,50,56,1.5,10,2,False,1,14,2.54,5.69,96,200,True,False,14,20.4,7,22,8.0,0.1,10000.0 +1413,-2834.2300000000178,702,0.6979666085169915,12,44,48,1.6,6,3,True,0,20,2.58,4.96,80,200,True,False,14,16.2,7,22,6.0,0.1,10000.0 +1414,-1674.7900000000154,410,0.678803965302643,10,38,32,2.3,8,2,True,0,20,2.4,6.15,64,100,True,True,14,23.7,8,22,8.0,0.1,10000.0 +1415,-1909.5300000000034,488,0.7001356788180868,8,52,32,1.8,8,5,True,0,20,2.93,4.51,64,200,True,True,14,21.6,7,22,8.0,0.1,10000.0 +1416,-798.5999999999949,99,0.4933416232608599,10,52,32,1.8,6,3,False,0,14,2.15,6.69,64,200,False,False,14,16.5,8,21,8.0,0.1,10000.0 +1417,-258.33000000000357,43,0.6074966573477574,10,42,64,2.0,6,5,False,1,20,2.18,5.04,64,100,True,True,14,17.7,7,21,8.0,0.1,10000.0 +1418,-2099.71,434,0.6973220836919121,9,38,32,2.1,9,3,True,0,20,2.94,7.21,96,100,True,True,14,22.4,8,22,6.0,0.1,10000.0 +1419,-669.7399999999961,76,0.5314472008842995,11,46,32,1.9,8,5,False,0,20,2.37,7.34,80,200,False,False,14,18.0,8,22,6.0,0.1,10000.0 +1420,-1953.8599999999842,611,0.7785407122115099,10,46,48,2.4,7,4,True,1,14,2.34,6.47,96,200,False,False,14,21.3,8,21,8.0,0.1,10000.0 +1421,32.49000000000342,44,1.039129492243954,12,44,72,2.4,8,5,False,0,20,3.0,5.15,96,200,False,False,14,17.9,7,22,8.0,0.1,10000.0 +1422,-2177.269999999985,536,0.7004343644616398,10,52,32,2.3,10,4,True,0,20,2.93,6.33,64,200,True,False,14,23.0,8,22,6.0,0.1,10000.0 +1423,-476.1499999999887,249,0.8708283371946026,10,38,72,2.1,8,2,True,1,14,2.72,6.1,96,200,True,True,14,22.6,7,22,6.0,0.1,10000.0 +1424,-117.91999999999825,24,0.6645807259073843,10,42,64,2.0,10,2,False,0,20,2.27,6.71,64,200,True,True,14,22.3,8,21,6.0,0.1,10000.0 +1425,-2465.0399999999872,627,0.6895583740427156,12,38,32,1.3,8,4,True,0,14,2.81,6.57,48,200,True,False,14,21.3,7,22,6.0,0.1,10000.0 +1426,-527.8700000000008,87,0.6267913829794755,10,44,32,0.8,9,4,False,1,14,2.99,6.75,80,100,True,True,14,21.8,7,21,6.0,0.1,10000.0 +1427,-3671.7700000000023,730,0.669915280140097,9,48,64,0.6,7,5,True,0,20,2.98,4.95,96,200,True,True,14,18.8,7,22,8.0,0.1,10000.0 +1428,-6471.09,1627,0.6518107633153224,9,44,64,1.9,8,4,True,0,14,2.31,6.77,48,100,False,False,14,18.6,7,22,8.0,0.1,10000.0 +1429,-54.67000000000189,49,0.9244722590627762,10,48,48,2.0,7,5,False,0,20,2.16,5.06,48,200,True,False,14,18.0,8,22,6.0,0.1,10000.0 +1430,-2789.2600000000093,692,0.6860779723585287,9,40,72,1.1,9,4,True,1,14,2.91,5.27,48,100,True,False,14,20.1,7,22,8.0,0.1,10000.0 +1431,-325.97999999999774,111,0.8125312706673951,9,38,64,1.7,6,5,False,0,14,2.72,5.79,48,100,False,True,14,18.7,7,22,8.0,0.1,10000.0 +1432,-3029.7900000000245,767,0.6766081852619175,8,46,48,0.6,8,3,True,1,20,2.53,6.53,48,100,True,False,14,22.3,7,22,8.0,0.1,10000.0 +1433,-2074.0199999999904,453,0.6455835937887158,8,46,72,0.8,7,4,False,0,20,2.36,4.64,64,100,False,False,14,16.9,8,21,8.0,0.1,10000.0 +1434,-2440.1800000000076,551,0.6535877288246276,10,48,56,1.3,7,2,True,1,20,2.35,4.57,80,200,True,False,14,20.2,7,22,6.0,0.1,10000.0 +1435,-291.2699999999968,47,0.7199623116785726,11,48,40,2.3,6,2,False,1,14,2.8,6.26,96,100,False,True,14,16.9,7,22,6.0,0.1,10000.0 +1436,-2345.0800000000017,687,0.7462729360900099,12,40,72,2.4,10,3,True,0,14,3.09,5.14,64,100,True,False,14,21.5,7,21,8.0,0.1,10000.0 +1437,-3084.609999999998,540,0.6353087085340275,9,42,40,0.7,10,3,True,1,14,2.94,5.83,96,200,True,False,14,22.2,8,21,8.0,0.1,10000.0 +1438,-3074.9499999999907,817,0.6805797649444356,11,38,56,1.8,8,2,True,0,14,2.31,5.45,48,100,True,False,14,22.2,8,21,8.0,0.1,10000.0 +1439,-1654.0499999999902,392,0.7115339338501383,12,38,40,2.0,8,4,True,0,20,2.6,5.86,96,100,True,True,14,22.2,8,21,6.0,0.1,10000.0 +1440,-143.94000000000415,66,0.8582528287394015,10,50,72,1.9,8,4,False,0,14,2.29,5.77,48,100,True,False,14,22.6,7,22,6.0,0.1,10000.0 +1441,-2969.8600000000088,754,0.6838829098193577,8,38,48,0.7,7,4,True,0,14,2.65,4.98,48,100,True,True,14,21.3,7,22,6.0,0.1,10000.0 +1442,-360.6600000000017,70,0.6954142386622753,9,38,64,2.0,6,5,False,0,20,2.27,7.02,64,100,False,True,14,19.8,7,22,6.0,0.1,10000.0 +1443,-3370.5599999999877,914,0.689239611770791,11,46,72,1.5,9,3,True,0,14,2.42,4.74,48,100,True,False,14,19.7,8,21,8.0,0.1,10000.0 +1444,-3688.2899999999827,963,0.6824130234865001,12,48,32,2.1,10,4,True,0,14,2.55,6.09,48,100,False,False,14,21.0,8,22,8.0,0.1,10000.0 +1445,-2587.3899999999867,668,0.7429010343021862,10,50,64,1.4,10,5,True,0,20,2.99,6.3,96,200,True,False,14,17.9,8,21,8.0,0.1,10000.0 +1446,-1536.5800000000036,417,0.7556523813310011,9,50,40,1.7,9,2,True,1,20,2.92,5.65,96,100,True,False,14,18.9,7,22,6.0,0.1,10000.0 +1447,-472.8600000000042,137,0.7863494243733171,9,52,72,1.1,6,3,False,0,14,2.82,7.28,80,200,True,False,14,18.4,8,22,6.0,0.1,10000.0 +1448,-96.17999999999665,22,0.7673102046741181,11,50,40,2.0,6,4,False,0,14,2.97,5.75,48,200,True,True,14,21.4,8,21,8.0,0.1,10000.0 +1449,-1424.760000000013,306,0.6856534545334202,12,44,32,1.7,10,5,True,0,20,2.58,7.03,96,200,True,True,14,23.8,8,22,6.0,0.1,10000.0 +1450,-5750.429999999985,1450,0.6838793839902104,9,50,64,1.6,7,2,True,0,14,2.58,6.31,64,200,False,False,14,21.5,7,22,6.0,0.1,10000.0 +1451,-2516.4100000000117,636,0.6988265003859802,9,40,72,1.8,9,2,True,0,14,2.34,4.63,80,100,True,True,14,23.5,7,21,6.0,0.1,10000.0 +1452,-5750.259999999987,1277,0.6500022520575894,12,52,40,0.8,7,4,True,0,14,2.02,6.11,96,200,False,False,14,22.8,8,22,8.0,0.1,10000.0 +1453,-410.4099999999944,59,0.5832004630993125,12,46,64,1.5,8,5,False,1,14,2.38,7.29,64,100,True,False,14,16.9,8,22,8.0,0.1,10000.0 +1454,-3454.989999999997,837,0.675877221373215,10,40,64,1.7,6,2,True,0,20,2.25,6.9,80,200,True,False,14,23.9,7,21,6.0,0.1,10000.0 +1455,-62.61999999999534,20,0.8237992065055291,12,52,48,2.2,9,3,False,0,14,2.5,5.42,96,100,True,True,14,20.1,7,21,6.0,0.1,10000.0 +1456,-4541.309999999995,962,0.6591055979882523,11,42,72,0.6,7,2,True,0,20,3.19,5.54,64,100,True,False,14,22.4,7,22,6.0,0.1,10000.0 +1457,-1516.4300000000057,416,0.7234875905567519,9,40,56,1.7,10,4,True,1,14,2.91,4.64,48,100,True,True,14,17.3,8,22,8.0,0.1,10000.0 +1458,-791.1100000000042,126,0.5731228922163767,12,48,64,0.9,9,3,False,1,14,2.18,7.05,64,100,True,False,14,22.2,8,21,8.0,0.1,10000.0 +1459,-787.3799999999937,87,0.49190800681431,10,40,64,1.9,7,4,False,0,20,3.0,7.1,64,100,False,False,14,21.7,8,21,6.0,0.1,10000.0 +1460,-2404.1100000000088,586,0.7098447909626339,12,50,40,1.6,8,4,True,0,14,2.87,6.16,80,100,True,False,14,19.1,7,21,6.0,0.1,10000.0 +1461,-543.1599999999999,82,0.647968475562728,11,50,64,1.8,8,2,False,1,20,2.83,5.42,96,100,False,False,14,23.3,7,21,6.0,0.1,10000.0 +1462,-1057.2099999999882,76,0.35199328217324144,11,52,72,2.1,7,4,False,0,20,2.48,4.69,64,100,False,False,14,17.5,8,22,6.0,0.1,10000.0 +1463,-1641.7500000000055,218,0.4966751588841778,11,42,32,1.5,7,4,True,1,14,2.37,6.45,64,200,True,True,14,20.9,7,21,8.0,0.1,10000.0 +1464,-2966.0000000000036,591,0.6555520457839386,9,42,72,1.0,8,4,True,0,14,2.78,5.43,80,100,True,True,14,23.0,8,21,6.0,0.1,10000.0 +1465,-106.31999999999789,57,0.8621744597555127,9,46,40,2.1,8,2,False,1,20,2.53,5.55,48,100,False,True,14,20.1,7,22,8.0,0.1,10000.0 +1466,-3770.0000000000027,995,0.6707092852120519,10,38,64,2.1,8,2,True,0,20,2.23,6.12,48,100,True,False,14,18.6,7,22,8.0,0.1,10000.0 +1467,-2696.4300000000194,857,0.7528931451612902,8,38,64,2.3,7,5,True,1,14,2.03,5.1,96,200,False,False,14,17.4,7,21,6.0,0.1,10000.0 +1468,-329.74999999999454,107,0.8200368931191059,9,52,56,1.9,9,5,False,0,14,2.68,5.2,96,100,False,False,14,16.7,7,21,6.0,0.1,10000.0 +1469,-3108.499999999988,720,0.6716575563125512,12,44,48,0.8,7,4,True,0,20,2.81,6.04,64,200,True,False,14,17.6,8,21,6.0,0.1,10000.0 +1470,-2170.730000000015,519,0.7099075357248336,10,44,56,1.2,10,5,True,1,20,2.88,6.02,80,200,True,False,14,18.0,7,22,6.0,0.1,10000.0 +1471,-1618.2599999999857,460,0.7198182054278665,12,48,48,0.5,8,3,True,0,20,2.2,6.78,80,200,True,True,14,22.9,7,22,8.0,0.1,10000.0 +1472,-2056.4799999999796,510,0.6787528020557521,10,48,40,1.1,6,5,True,0,14,2.31,4.87,64,100,True,True,14,22.4,8,22,6.0,0.1,10000.0 +1473,-261.5,25,0.48691284385668876,12,52,40,2.4,8,5,False,0,20,2.52,6.27,80,200,True,False,14,21.6,8,21,8.0,0.1,10000.0 +1474,-2545.5399999999927,478,0.6510927594832608,12,38,32,2.2,10,5,True,0,14,3.16,5.14,80,200,True,False,14,19.1,8,22,8.0,0.1,10000.0 +1475,-2331.689999999994,620,0.7238426973212022,10,38,72,1.2,10,5,True,1,14,2.46,6.49,80,100,True,False,14,21.6,8,22,8.0,0.1,10000.0 +1476,-2457.9399999999823,600,0.6829982034406755,8,46,48,2.0,6,4,True,0,14,2.58,5.43,64,200,True,True,14,19.5,8,21,8.0,0.1,10000.0 +1477,-1525.099999999995,549,0.8184318300871469,11,40,48,2.4,7,4,True,1,14,2.65,7.11,96,200,False,False,14,22.0,8,21,8.0,0.1,10000.0 +1478,-459.6499999999942,179,0.7945505499957538,9,46,64,1.0,9,2,False,0,14,2.39,5.55,48,100,True,False,14,22.8,7,22,8.0,0.1,10000.0 +1479,-2168.869999999998,378,0.590475579061455,12,48,32,2.4,10,3,True,0,20,2.18,7.1,96,200,True,True,14,19.0,8,21,6.0,0.1,10000.0 +1480,-4599.919999999999,1030,0.6767260493760353,11,48,56,0.8,7,5,True,0,20,2.82,5.13,80,200,False,True,14,19.0,7,21,6.0,0.1,10000.0 +1481,-2411.2300000000023,749,0.7118063274648307,12,40,72,2.4,7,3,True,0,20,2.11,6.64,48,200,True,False,14,23.1,8,22,8.0,0.1,10000.0 +1482,-3381.42000000001,856,0.6733322062552831,11,52,56,0.8,9,3,True,0,20,2.53,5.44,48,200,True,False,14,22.3,8,22,8.0,0.1,10000.0 +1483,-2903.1600000000117,858,0.7351812763504281,9,46,64,1.9,7,4,True,0,20,2.94,7.13,48,100,True,False,14,19.7,8,22,6.0,0.1,10000.0 +1484,-2814.930000000005,575,0.6267215658193102,10,42,32,2.4,9,5,True,0,14,2.37,5.84,64,200,True,False,14,18.5,8,21,6.0,0.1,10000.0 +1485,-682.6600000000035,169,0.7372697078508119,8,38,32,1.8,6,4,False,0,20,2.45,5.57,64,100,False,False,14,21.8,8,21,8.0,0.1,10000.0 +1486,-566.9999999999982,114,0.6515829318651066,11,48,40,1.2,7,3,False,0,20,2.52,4.6,48,100,True,False,14,16.2,7,21,6.0,0.1,10000.0 +1487,-4404.13999999997,1290,0.7286054002357681,9,46,64,2.5,8,5,True,0,20,3.0,7.48,48,100,False,False,14,20.0,8,22,8.0,0.1,10000.0 +1488,-3944.680000000003,830,0.6581128726395308,11,40,48,2.0,9,5,True,0,20,2.61,6.51,80,200,False,True,14,19.3,8,21,6.0,0.1,10000.0 +1489,-2301.08,426,0.6036106182494703,10,42,48,1.3,10,4,True,1,14,2.33,4.99,64,100,True,True,14,17.4,7,22,8.0,0.1,10000.0 +1490,-243.1800000000094,142,0.8693325309232373,10,38,48,1.1,9,3,False,1,20,2.21,4.97,80,100,True,False,14,17.7,7,22,8.0,0.1,10000.0 +1491,-647.5199999999913,169,0.7383768146391327,8,46,56,1.1,7,3,False,1,14,2.3,6.7,80,100,True,False,14,18.4,8,21,6.0,0.1,10000.0 +1492,-699.7799999999934,159,0.7387525619631077,9,48,64,1.0,6,2,False,1,14,3.1,5.18,96,100,True,False,14,20.3,8,22,8.0,0.1,10000.0 +1493,-4186.879999999986,1003,0.6513948767649317,11,52,48,0.7,6,3,True,0,14,2.01,5.57,80,100,True,False,14,22.2,7,22,6.0,0.1,10000.0 +1494,-788.5200000000041,109,0.4808030393815886,12,48,72,0.8,6,5,False,1,20,2.41,6.37,48,200,False,True,14,22.3,7,21,8.0,0.1,10000.0 +1495,-2715.1399999999912,575,0.6248998402970807,10,48,64,2.2,6,5,True,0,14,2.26,5.12,48,100,True,True,14,22.1,7,21,6.0,0.1,10000.0 +1496,-2274.579999999971,761,0.7718150025982782,9,40,48,2.2,7,4,True,1,14,2.37,4.97,80,200,False,False,14,23.8,7,21,6.0,0.1,10000.0 +1497,-3074.0099999999948,718,0.6772889419856848,8,48,40,1.4,7,4,True,0,20,2.87,4.76,64,100,True,True,14,18.9,7,21,6.0,0.1,10000.0 +1498,-4169.630000000003,992,0.6509020002494974,10,44,32,0.9,8,4,True,0,20,2.64,6.52,48,100,False,True,14,19.3,8,22,8.0,0.1,10000.0 +1499,-107.6299999999901,34,0.8207003398414073,11,50,72,2.2,9,3,False,0,20,3.19,5.41,64,100,True,False,14,23.5,8,22,6.0,0.1,10000.0 +1500,-2676.219999999984,703,0.7560363727523417,8,50,48,1.9,10,2,True,0,14,3.1,6.74,96,100,True,False,14,23.2,7,21,8.0,0.1,10000.0 +1501,-2519.3699999999753,777,0.7788885846383924,9,40,56,1.6,9,3,True,1,14,2.76,6.0,96,100,False,False,14,22.7,8,21,6.0,0.1,10000.0 +1502,-306.7800000000061,113,0.8121762768315232,12,44,72,1.0,10,2,False,0,14,2.41,5.19,80,200,True,False,14,20.4,8,21,6.0,0.1,10000.0 +1503,-1357.5799999999872,287,0.6640376948528411,9,42,32,0.6,9,4,False,0,20,2.88,5.26,64,200,True,False,14,20.9,7,22,8.0,0.1,10000.0 +1504,203.03999999999542,66,1.2435729795223072,9,38,48,1.9,10,2,False,0,20,2.02,5.64,80,100,True,False,14,18.1,8,22,8.0,0.1,10000.0 +1505,-1899.3200000000052,267,0.5254713257081752,11,46,56,2.4,9,4,True,1,14,2.31,4.75,80,200,True,True,14,18.1,7,21,8.0,0.1,10000.0 +1506,-2.6899999999986903,52,0.997091388780762,10,48,56,2.1,7,5,False,1,20,2.87,5.64,96,100,True,False,14,19.1,7,22,6.0,0.1,10000.0 +1507,-4158.9999999999745,939,0.7092673733540996,9,38,32,2.5,7,5,True,0,20,3.0,5.33,96,100,False,True,14,16.1,7,21,8.0,0.1,10000.0 +1508,18.580000000001746,46,1.0298896431903737,8,46,64,1.7,8,3,False,0,20,2.37,6.27,48,200,True,True,14,21.8,8,21,8.0,0.1,10000.0 +1509,-280.4200000000001,63,0.6909631915362575,11,42,64,1.0,8,2,False,0,20,2.26,4.67,80,100,True,True,14,21.8,8,21,8.0,0.1,10000.0 +1510,-2605.3900000000003,828,0.7550687538015066,12,50,72,1.6,9,4,True,1,14,2.71,5.0,64,100,False,False,14,21.7,7,21,6.0,0.1,10000.0 +1511,-2695.7199999999875,867,0.7855064991279329,9,44,48,0.9,9,4,True,1,20,2.82,7.0,96,200,False,False,14,20.0,8,22,8.0,0.1,10000.0 +1512,-191.600000000004,25,0.5797139598139861,12,44,56,2.4,8,4,False,0,20,2.18,5.19,64,100,True,False,14,23.2,8,21,8.0,0.1,10000.0 +1513,-1313.119999999999,213,0.5553794843144226,10,52,48,0.7,6,4,False,0,14,2.51,5.47,48,100,False,True,14,19.9,8,22,6.0,0.1,10000.0 +1514,-42.88999999999578,34,0.930790208323248,10,50,48,2.1,6,4,False,0,20,3.06,6.33,96,200,True,True,14,16.1,7,21,8.0,0.1,10000.0 +1515,-2319.590000000001,530,0.6783221535146049,12,42,32,2.2,9,3,True,0,20,2.69,6.46,64,100,True,False,14,17.0,8,21,8.0,0.1,10000.0 +1516,-228.9300000000021,91,0.8362340923235401,12,42,56,1.3,10,2,False,1,20,2.52,6.58,48,100,True,False,14,22.3,7,22,6.0,0.1,10000.0 +1517,-864.2299999999941,127,0.6313986914723921,8,48,40,1.4,7,4,False,0,20,3.18,5.96,80,200,True,False,14,19.3,7,22,6.0,0.1,10000.0 +1518,-4055.520000000015,1134,0.7146102237365998,12,42,56,0.6,9,5,True,1,20,2.76,4.91,64,100,False,False,14,22.0,8,22,6.0,0.1,10000.0 +1519,-2323.280000000009,594,0.7044079010146633,8,42,72,1.6,8,5,True,1,14,2.96,5.59,48,100,True,False,14,23.8,7,21,6.0,0.1,10000.0 +1520,-2560.6099999999897,505,0.6215821192855517,11,52,48,2.2,10,3,True,0,20,2.22,5.28,80,200,True,True,14,20.1,8,22,6.0,0.1,10000.0 +1521,-252.89999999999782,32,0.5914971974995558,11,38,56,2.2,6,2,False,1,14,2.55,5.62,48,100,False,True,14,21.5,8,21,8.0,0.1,10000.0 +1522,-2438.900000000007,603,0.6998528123184766,12,42,48,0.9,6,5,True,1,14,2.62,6.52,64,200,False,True,14,19.8,8,22,8.0,0.1,10000.0 +1523,-3343.1899999999923,707,0.6261358985312437,10,50,48,1.7,6,5,True,0,20,2.36,6.34,64,200,True,False,14,20.3,8,21,8.0,0.1,10000.0 +1524,-145.19000000000233,43,0.8158095044782179,11,42,40,2.0,10,4,False,0,20,2.49,7.35,64,200,True,False,14,17.7,8,22,6.0,0.1,10000.0 +1525,-4893.200000000011,1275,0.7261523600694636,8,38,32,0.7,8,4,True,0,14,2.92,6.34,80,100,False,False,14,22.5,8,22,6.0,0.1,10000.0 +1526,-4094.8500000000004,837,0.6441890776382674,9,48,48,1.4,10,4,True,0,14,2.27,5.31,96,200,True,False,14,20.3,8,22,6.0,0.1,10000.0 +1527,-4206.450000000023,835,0.6630869816992343,12,48,40,1.0,7,4,True,0,14,3.0,6.52,80,200,False,True,14,18.4,8,22,6.0,0.1,10000.0 +1528,-876.4900000000016,148,0.6050868458401857,11,50,32,0.8,10,4,False,1,14,2.93,5.73,64,100,False,True,14,21.2,8,22,6.0,0.1,10000.0 +1529,-218.26999999999134,224,0.930862453437397,10,38,56,0.7,9,5,False,1,14,2.31,7.44,96,100,True,False,14,20.4,8,22,6.0,0.1,10000.0 +1530,-2728.7600000000084,686,0.6862109252819635,12,44,56,2.4,8,5,True,0,20,2.03,6.33,96,100,True,False,14,19.7,7,21,6.0,0.1,10000.0 +1531,-3387.359999999987,893,0.726173702373475,11,38,56,1.4,8,2,True,1,20,2.84,5.03,80,200,False,False,14,19.2,7,21,8.0,0.1,10000.0 +1532,-2890.130000000009,738,0.7144538162173056,12,44,72,1.6,10,5,True,0,14,2.42,5.09,96,200,True,False,14,23.0,8,22,6.0,0.1,10000.0 +1533,-6650.529999999985,1748,0.6573237728273741,11,38,56,0.8,10,3,True,0,14,2.28,5.54,48,100,False,False,14,16.6,7,21,8.0,0.1,10000.0 +1534,-2298.659999999968,593,0.7240033715231168,10,42,56,1.8,10,3,True,0,14,2.38,6.64,96,200,True,True,14,18.1,7,21,6.0,0.1,10000.0 +1535,-1671.0700000000088,307,0.6053808588215291,8,52,72,1.9,8,5,True,1,14,2.47,4.58,64,200,True,True,14,19.3,8,22,6.0,0.1,10000.0 +1536,-819.9099999999999,199,0.732851762068606,9,50,56,2.4,6,2,True,1,14,3.15,6.89,64,100,True,True,14,21.3,8,21,8.0,0.1,10000.0 +1537,-1405.3500000000022,313,0.6843307569458015,8,40,64,1.5,10,3,True,1,20,2.47,6.77,80,200,True,True,14,21.0,8,22,6.0,0.1,10000.0 +1538,-3176.3299999999863,766,0.7154937676678287,9,48,72,2.1,8,4,True,0,14,2.96,6.56,80,100,True,False,14,23.4,7,21,8.0,0.1,10000.0 +1539,92.54999999999927,40,1.13985644125425,9,38,40,1.6,10,2,False,1,14,2.53,7.35,96,200,True,True,14,22.2,8,22,6.0,0.1,10000.0 +1540,-2643.8100000000004,741,0.6889909713848777,10,50,72,0.8,6,2,True,1,14,2.24,5.47,48,100,True,False,14,19.5,7,22,6.0,0.1,10000.0 +1541,-3592.859999999976,885,0.7178924259055982,9,38,64,1.5,9,4,True,0,14,2.88,4.53,96,200,True,False,14,23.8,7,22,8.0,0.1,10000.0 +1542,-526.8099999999977,62,0.4863146604261128,9,48,32,1.5,9,2,False,0,14,3.15,6.0,48,200,False,True,14,22.8,8,21,8.0,0.1,10000.0 +1543,-3721.070000000017,908,0.7211307146143943,8,50,64,0.9,7,3,True,0,20,2.96,5.27,96,200,True,False,14,20.7,7,22,6.0,0.1,10000.0 +1544,-304.3799999999974,90,0.789962530275951,10,44,64,1.9,9,4,False,0,20,2.77,5.19,64,200,False,False,14,21.6,8,21,6.0,0.1,10000.0 +1545,-2108.7999999999893,659,0.7355395116861488,12,40,72,2.2,10,2,True,0,14,2.7,5.89,48,200,True,False,14,16.9,8,21,6.0,0.1,10000.0 +1546,-2850.8199999999997,772,0.6775528208840429,12,44,72,2.3,7,4,True,0,14,2.17,4.84,48,200,True,False,14,20.1,7,21,6.0,0.1,10000.0 +1547,-2645.7599999999957,769,0.7516863117567394,10,44,64,2.2,7,2,True,0,20,2.54,7.16,80,100,True,False,14,18.7,8,22,6.0,0.1,10000.0 +1548,-1551.0899999999747,347,0.6687446342307248,10,40,32,2.3,6,4,True,0,14,3.09,5.23,48,200,True,True,14,23.6,8,21,6.0,0.1,10000.0 +1549,-2512.070000000008,732,0.7414818481474582,10,52,32,1.5,9,2,True,1,14,2.23,5.54,96,100,False,False,14,16.6,8,22,6.0,0.1,10000.0 +1550,-3366.4799999999786,839,0.7013040133657599,10,40,56,1.0,7,4,True,0,20,2.46,5.28,96,200,True,False,14,22.9,8,21,6.0,0.1,10000.0 +1551,-23.47999999999047,123,0.9889467390997335,11,46,40,1.1,10,5,False,1,14,3.01,6.42,96,100,True,False,14,17.8,8,22,8.0,0.1,10000.0 +1552,-3874.589999999993,997,0.7329219091314528,10,52,48,2.5,8,2,True,0,20,3.08,7.08,80,200,False,False,14,22.7,7,22,8.0,0.1,10000.0 +1553,-1476.270000000006,236,0.6174465339376365,8,48,48,0.8,6,5,False,1,20,2.98,6.65,80,200,True,False,14,16.8,7,22,8.0,0.1,10000.0 +1554,-2018.74999999998,553,0.7223192719709933,11,46,56,1.2,8,5,True,0,14,2.61,6.87,64,100,True,True,14,20.6,8,22,8.0,0.1,10000.0 +1555,-1053.7499999999927,222,0.6908718075088448,8,44,64,0.5,10,4,False,0,20,2.89,4.53,96,200,False,True,14,21.8,7,22,6.0,0.1,10000.0 +1556,-284.9299999999985,35,0.5386944273548555,9,42,56,2.1,9,2,False,0,20,3.07,5.82,80,200,True,True,14,17.6,8,21,8.0,0.1,10000.0 +1557,84.62999999999738,41,1.1354340033286392,9,52,56,1.7,9,2,False,0,14,3.14,6.78,80,100,True,True,14,20.8,7,21,6.0,0.1,10000.0 +1558,-778.8099999999922,126,0.6004299376128713,11,42,48,0.9,7,3,False,0,14,2.95,5.15,64,200,True,False,14,16.2,8,21,8.0,0.1,10000.0 +1559,-490.3299999999981,75,0.60568239390747,12,46,72,1.0,6,5,False,0,14,2.23,5.81,96,200,True,True,14,18.4,7,22,6.0,0.1,10000.0 +1560,125.6299999999992,40,1.2006067864271457,11,38,32,2.1,8,4,False,1,20,2.34,5.94,80,100,True,False,14,23.7,7,22,6.0,0.1,10000.0 +1561,-2253.3799999999937,663,0.7372552997734457,10,48,48,2.3,10,2,True,0,20,2.49,7.48,64,200,True,False,14,19.8,8,22,8.0,0.1,10000.0 +1562,-3917.1999999999916,766,0.6271754917282298,8,42,32,1.0,10,3,True,0,14,3.07,7.25,48,100,False,True,14,23.2,8,22,6.0,0.1,10000.0 +1563,-1511.2499999999964,389,0.6862152734520992,12,42,64,2.1,10,5,True,1,20,2.24,6.89,48,200,True,False,14,20.5,8,21,6.0,0.1,10000.0 +1564,-2658.2100000000073,711,0.7354035523596794,11,50,48,1.1,9,2,True,0,14,2.65,6.02,96,100,True,False,14,16.6,7,21,8.0,0.1,10000.0 +1565,-951.3300000000127,205,0.6654357848981358,10,48,72,0.7,6,3,False,0,14,2.1,7.16,80,200,True,False,14,16.5,8,22,6.0,0.1,10000.0 +1566,-2957.7699999999923,533,0.647755786936416,8,38,48,1.3,7,5,True,1,14,2.94,5.57,96,200,True,False,14,17.4,7,21,8.0,0.1,10000.0 +1567,-250.89999999999236,48,0.6940094638762866,8,52,64,2.3,8,4,False,1,14,2.24,6.22,80,200,True,False,14,21.5,7,22,6.0,0.1,10000.0 +1568,-407.73000000000866,43,0.5259559823743475,11,38,32,2.2,8,5,False,0,14,2.16,5.96,80,200,False,True,14,16.8,8,21,6.0,0.1,10000.0 +1569,-567.0300000000134,241,0.7962778665996013,10,38,72,0.7,9,5,False,0,14,2.03,4.89,48,100,True,False,14,22.8,7,22,6.0,0.1,10000.0 +1570,-2622.7900000000036,568,0.674943082599325,9,44,72,0.8,10,5,True,0,14,2.9,6.26,64,100,True,True,14,23.7,8,22,6.0,0.1,10000.0 +1571,-1617.9699999999903,356,0.7334033066512001,8,50,40,2.1,9,2,True,1,14,3.17,7.21,96,200,True,False,14,21.6,7,22,6.0,0.1,10000.0 +1572,-1983.1899999999887,499,0.6869070867782622,10,52,40,1.7,7,5,True,0,14,2.62,6.14,48,100,True,True,14,20.6,8,22,6.0,0.1,10000.0 +1573,-3774.050000000003,1018,0.7057360438941818,11,52,56,0.8,8,4,True,1,20,2.24,7.15,80,200,False,False,14,17.3,8,22,8.0,0.1,10000.0 +1574,-202.03999999999905,42,0.7025236314379104,8,48,56,2.0,8,3,False,1,14,3.0,6.34,48,100,True,True,14,21.2,8,21,8.0,0.1,10000.0 +1575,-1469.0499999999993,340,0.6643935759486441,11,50,32,1.8,6,4,True,1,14,2.5,5.56,64,200,True,False,14,18.3,7,22,8.0,0.1,10000.0 +1576,-3702.470000000005,757,0.6144774395888282,9,42,48,1.0,7,2,True,0,14,2.06,6.78,80,100,True,True,14,18.7,8,21,6.0,0.1,10000.0 +1577,-4649.689999999991,1296,0.7170871295876011,8,52,40,2.1,9,4,True,0,20,3.15,5.48,48,100,False,False,14,20.2,7,21,6.0,0.1,10000.0 +1578,26.299999999990177,86,1.0162563433735312,10,46,56,2.1,7,3,False,1,14,3.0,7.39,80,200,False,False,14,23.3,8,22,6.0,0.1,10000.0 +1579,-3770.800000000003,880,0.6950029927042723,10,44,64,0.5,7,3,True,0,20,2.56,6.84,96,200,True,False,14,21.8,7,21,6.0,0.1,10000.0 +1580,-371.40999999999985,56,0.5701273148148148,8,50,48,2.2,9,2,False,0,20,2.17,6.01,64,200,True,False,14,21.3,7,22,6.0,0.1,10000.0 +1581,-157.39999999999964,140,0.9301589837111581,9,40,56,1.7,10,3,False,1,14,2.88,5.83,80,200,False,False,14,21.0,8,21,8.0,0.1,10000.0 +1582,-212.87999999999738,91,0.8378724182050814,12,38,48,1.1,7,3,False,0,14,2.62,6.17,64,200,True,False,14,18.0,7,21,6.0,0.1,10000.0 +1583,-4075.320000000009,999,0.6780098382985716,8,52,40,1.1,7,3,True,0,14,2.51,4.8,64,100,True,False,14,23.5,7,22,6.0,0.1,10000.0 +1584,-3909.0099999999793,835,0.5962346315973224,11,42,32,1.0,8,2,True,0,20,2.06,5.25,64,200,True,False,14,19.9,7,22,8.0,0.1,10000.0 +1585,-1954.7600000000093,527,0.7451554025865667,10,52,32,2.1,8,2,True,0,14,3.07,6.95,80,200,True,False,14,16.6,7,22,8.0,0.1,10000.0 +1586,-402.3099999999977,83,0.7328778492653162,8,42,48,1.0,6,5,False,0,14,3.01,6.97,80,100,True,True,14,21.9,8,22,6.0,0.1,10000.0 +1587,-3786.24,665,0.5969666906526895,12,52,32,1.2,9,4,True,0,14,3.07,5.68,64,100,False,True,14,21.2,8,22,6.0,0.1,10000.0 +1588,-359.44999999999163,64,0.6398404857569412,8,50,32,2.0,7,2,False,1,20,3.07,6.65,64,200,True,False,14,23.0,7,22,8.0,0.1,10000.0 +1589,-1101.2200000000103,177,0.623482348918711,8,48,32,1.1,6,4,False,1,20,2.6,5.58,96,200,True,False,14,18.4,7,22,6.0,0.1,10000.0 +1590,-4058.9899999999934,1209,0.7275328132793007,12,38,72,2.0,6,2,True,0,20,2.92,5.75,48,100,False,False,14,20.8,8,21,6.0,0.1,10000.0 +1591,-495.3999999999978,119,0.7411229848718417,8,46,56,1.8,9,3,False,1,14,2.49,6.02,80,100,False,True,14,18.8,8,21,8.0,0.1,10000.0 +1592,-2955.540000000019,830,0.7216253356603904,8,50,48,2.5,10,3,True,0,14,2.63,4.54,64,200,True,False,14,21.8,7,22,8.0,0.1,10000.0 +1593,-3492.959999999998,919,0.7002564111365501,9,44,56,0.9,9,4,True,0,14,2.87,6.64,48,100,True,False,14,20.8,8,21,8.0,0.1,10000.0 +1594,-2944.2700000000186,853,0.7600210940371851,10,46,64,1.6,9,5,True,0,20,2.58,6.19,96,200,False,True,14,21.8,8,22,6.0,0.1,10000.0 +1595,-2470.2700000000086,635,0.6798795856772788,12,48,56,2.3,6,5,True,0,20,2.05,6.51,80,200,True,False,14,18.0,7,21,8.0,0.1,10000.0 +1596,-1043.3800000000047,121,0.499556335765093,9,42,32,1.9,7,4,False,0,20,2.4,6.87,64,200,False,False,14,19.9,7,21,6.0,0.1,10000.0 +1597,-286.6299999999992,74,0.7397514005284327,8,50,56,1.9,9,2,False,0,20,2.13,5.35,96,100,True,False,14,17.1,7,21,8.0,0.1,10000.0 +1598,-3947.1800000000167,1141,0.708575407012329,10,48,48,0.5,6,4,True,1,14,2.61,6.73,48,100,False,False,14,19.2,8,21,8.0,0.1,10000.0 +1599,-3780.300000000002,883,0.6613438565215249,9,46,56,0.7,7,2,True,0,14,2.63,6.82,48,100,True,True,14,16.6,7,22,6.0,0.1,10000.0 +1600,-155.3100000000013,22,0.6442087418674974,12,46,64,2.4,6,5,False,1,20,2.13,7.47,96,200,True,False,14,22.0,7,22,6.0,0.1,10000.0 +1601,-2911.499999999989,802,0.7389154521878554,10,40,64,1.7,9,3,True,0,14,2.54,5.48,96,100,True,False,14,17.0,7,21,6.0,0.1,10000.0 +1602,-1730.0200000000114,522,0.7040976021920469,10,38,48,1.3,9,5,True,0,20,2.09,5.61,48,200,True,True,14,22.8,7,21,8.0,0.1,10000.0 +1603,-4987.440000000004,1232,0.7016772668463902,8,50,56,1.4,10,2,True,0,14,2.59,6.16,80,200,False,True,14,16.3,8,21,8.0,0.1,10000.0 +1604,-916.8199999999997,176,0.6397846927549898,8,48,40,1.4,10,4,False,0,20,2.36,4.54,64,200,False,True,14,17.2,8,21,6.0,0.1,10000.0 +1605,-2580.300000000004,589,0.6642905188710545,9,52,40,1.4,8,4,True,0,14,3.01,7.11,48,100,True,True,14,19.0,7,22,6.0,0.1,10000.0 +1606,-2204.899999999997,539,0.6751518973168246,12,44,72,1.6,6,5,True,0,20,2.55,6.85,48,100,True,True,14,22.4,7,22,8.0,0.1,10000.0 +1607,-2845.899999999978,677,0.6473993237659471,12,42,48,2.0,9,3,True,0,14,2.26,4.74,48,100,True,True,14,16.8,7,22,6.0,0.1,10000.0 +1608,16.309999999990396,44,1.0251135576256831,10,40,72,1.9,7,4,False,0,20,3.05,6.51,80,200,True,False,14,20.0,8,21,8.0,0.1,10000.0 +1609,-1303.7500000000055,282,0.6455120396754617,8,50,56,0.7,10,5,False,0,14,2.03,4.81,80,200,True,False,14,19.8,7,22,8.0,0.1,10000.0 +1610,-3481.7499999999727,1088,0.7553904724703191,11,46,32,1.4,8,2,True,0,20,2.32,6.35,96,100,False,False,14,18.0,7,21,8.0,0.1,10000.0 +1611,-3386.759999999991,761,0.6322891864513881,12,46,32,0.9,9,4,True,0,20,2.02,5.0,96,200,True,False,14,21.6,7,22,8.0,0.1,10000.0 +1612,-1602.6699999999946,377,0.6773299240975257,11,44,32,1.9,6,2,True,1,20,2.77,5.39,48,100,True,False,14,19.2,8,22,6.0,0.1,10000.0 +1613,-4186.850000000008,938,0.696323181155841,8,46,56,1.1,10,5,True,1,20,3.05,5.64,80,200,False,False,14,19.7,7,22,6.0,0.1,10000.0 +1614,-3667.100000000004,886,0.7015208429140604,8,38,56,2.1,6,2,True,0,14,2.78,5.44,80,100,True,False,14,19.6,7,21,6.0,0.1,10000.0 +1615,-3201.790000000008,810,0.6880976409984647,11,40,64,1.9,9,2,True,0,14,2.2,4.78,80,200,True,False,14,18.7,8,22,8.0,0.1,10000.0 +1616,119.03999999999724,27,1.316267701054757,9,44,40,1.8,10,4,False,1,20,3.18,7.28,80,100,True,True,14,23.9,8,21,6.0,0.1,10000.0 +1617,-246.6899999999987,85,0.8249817312399345,9,48,40,2.3,6,4,False,1,14,2.46,5.71,80,100,False,False,14,21.7,8,22,6.0,0.1,10000.0 +1618,-322.75999999999476,40,0.5126606169502785,8,52,40,2.4,8,5,False,0,20,2.61,6.65,64,100,False,True,14,22.6,8,22,6.0,0.1,10000.0 +1619,-196.31999999999607,68,0.8365471076031572,12,42,56,1.8,9,5,False,0,20,2.84,7.47,64,200,False,False,14,22.3,8,22,8.0,0.1,10000.0 +1620,-3958.199999999989,894,0.6426285248924012,8,50,32,1.2,10,2,True,0,20,2.56,4.88,48,200,True,False,14,16.2,7,22,8.0,0.1,10000.0 +1621,-3213.3399999999983,741,0.6855136263009237,11,46,56,0.9,10,5,True,0,20,2.8,6.39,80,200,True,False,14,22.8,7,21,8.0,0.1,10000.0 +1622,-634.8399999999874,170,0.6964158477392821,9,52,72,2.2,6,5,True,1,14,2.43,4.88,48,200,True,True,14,23.4,8,21,6.0,0.1,10000.0 +1623,-4779.379999999992,1096,0.697539181034892,8,40,32,1.8,6,2,True,0,14,2.5,7.04,96,100,False,False,14,22.3,7,21,6.0,0.1,10000.0 +1624,22.090000000005602,65,1.0223526435618517,9,38,32,1.8,10,3,False,0,20,2.8,5.63,48,200,True,False,14,17.6,7,21,6.0,0.1,10000.0 +1625,-940.340000000002,219,0.6984852760106711,10,46,64,0.7,9,3,False,0,20,3.16,6.67,48,100,True,False,14,22.2,7,21,6.0,0.1,10000.0 +1626,-3288.6299999999965,763,0.6379612137865438,11,44,32,1.6,9,4,True,0,20,2.08,6.39,64,100,True,False,14,19.3,7,22,6.0,0.1,10000.0 +1627,-4465.960000000015,1053,0.6595753114425948,11,44,48,2.3,10,2,True,0,20,2.33,7.01,64,100,False,True,14,16.5,7,21,8.0,0.1,10000.0 +1628,-3575.8800000000083,898,0.7064701855308585,9,42,72,2.1,9,2,True,0,14,2.55,5.28,80,100,True,False,14,17.5,8,22,8.0,0.1,10000.0 +1629,92.61000000000786,58,1.1019608274890178,10,46,40,2.1,9,5,False,0,14,2.09,6.85,64,100,True,False,14,18.1,7,22,8.0,0.1,10000.0 +1630,-801.7399999999961,101,0.5217746601530578,11,40,48,1.1,8,2,False,0,14,2.94,6.09,48,100,True,True,14,16.8,7,21,8.0,0.1,10000.0 +1631,-1514.469999999994,288,0.6432873330930863,11,44,56,0.8,9,3,False,0,20,2.87,5.15,64,200,False,False,14,16.6,7,21,8.0,0.1,10000.0 +1632,-95.93000000000575,47,0.8790137470046665,10,52,56,2.0,9,3,False,0,20,3.02,5.45,80,100,False,True,14,22.5,8,22,8.0,0.1,10000.0 +1633,-4763.340000000015,1214,0.7140438682906711,8,40,32,1.5,7,5,True,0,14,2.85,5.78,80,200,False,False,14,22.9,7,21,6.0,0.1,10000.0 +1634,-4841.470000000002,1444,0.7134383819156391,10,46,72,2.2,7,3,True,0,14,2.43,7.37,48,100,False,False,14,21.0,7,22,6.0,0.1,10000.0 +1635,-5657.969999999988,1264,0.6544550676222437,9,40,32,2.3,10,3,True,0,20,2.28,5.78,80,200,False,False,14,17.2,7,22,6.0,0.1,10000.0 +1636,-1490.5700000000015,316,0.6769980540615507,8,40,64,1.4,6,4,True,1,20,2.3,6.52,96,100,True,True,14,21.6,7,22,8.0,0.1,10000.0 +1637,-7296.21999999999,1814,0.6345106517696845,8,42,64,2.0,8,4,True,0,14,2.02,5.59,48,100,False,False,14,20.9,8,21,6.0,0.1,10000.0 +1638,-4288.0599999999795,932,0.602707996316206,11,42,40,1.9,6,3,True,0,20,2.16,5.22,48,100,False,True,14,20.2,7,21,8.0,0.1,10000.0 +1639,-71.10000000000036,26,0.8176549035699631,9,46,40,2.5,8,3,False,0,20,2.92,4.92,48,100,True,True,14,19.2,7,22,8.0,0.1,10000.0 +1640,-3261.5199999999904,819,0.6932952293900643,12,50,64,1.4,8,2,True,0,14,2.31,5.34,80,100,True,False,14,16.8,8,22,8.0,0.1,10000.0 +1641,-348.22999999999956,96,0.7763972363486927,8,38,72,1.6,8,4,False,0,14,2.4,6.47,96,200,True,False,14,20.6,8,21,6.0,0.1,10000.0 +1642,-3342.9599999999864,730,0.6993297572663594,12,42,48,0.7,8,2,True,0,20,2.74,7.43,96,100,False,True,14,22.2,7,22,6.0,0.1,10000.0 +1643,-201.99999999999636,100,0.8687936813115436,10,48,40,1.9,7,3,False,1,14,2.39,7.01,64,200,False,False,14,21.1,7,22,8.0,0.1,10000.0 +1644,-81.1200000000099,51,0.8993598332588953,8,46,56,2.5,7,4,False,1,14,2.71,4.64,48,100,True,False,14,22.2,8,22,8.0,0.1,10000.0 +1645,-3385.6599999999953,924,0.6791415368635731,9,52,56,1.9,10,3,True,0,14,2.1,5.84,48,100,True,False,14,23.3,8,21,8.0,0.1,10000.0 +1646,-2109.659999999997,682,0.7752393128246104,8,50,32,2.1,8,3,True,1,14,2.44,6.61,80,200,False,False,14,16.4,8,22,8.0,0.1,10000.0 +1647,-732.9199999999928,120,0.6332667837538967,10,52,56,1.7,6,2,False,0,20,3.19,6.89,64,100,False,False,14,22.1,8,22,6.0,0.1,10000.0 +1648,-1682.3299999999908,403,0.6873445857292065,11,46,48,2.0,6,2,True,0,20,3.16,6.21,48,100,True,True,14,23.4,7,21,6.0,0.1,10000.0 +1649,-4192.819999999997,1037,0.6595352493181075,9,44,56,1.9,10,5,True,0,14,2.33,5.8,48,100,False,True,14,21.1,7,21,8.0,0.1,10000.0 +1650,242.6299999999901,48,1.3623236018815799,10,50,32,2.0,7,5,False,1,14,2.56,6.4,80,200,True,False,14,17.7,8,22,6.0,0.1,10000.0 +1651,-319.3999999999978,30,0.4851625590354455,12,48,72,1.8,10,5,False,1,14,2.66,6.8,64,200,True,True,14,17.9,7,21,8.0,0.1,10000.0 +1652,-3335.199999999986,817,0.7069182478365098,9,52,64,1.1,10,4,True,0,20,2.82,6.43,80,200,True,False,14,22.8,7,22,8.0,0.1,10000.0 +1653,-3697.5499999999984,905,0.696541066322628,12,42,72,1.4,9,4,True,1,14,2.36,5.86,80,100,False,False,14,16.2,8,21,8.0,0.1,10000.0 +1654,-3314.0800000000027,827,0.7174470929469199,12,44,64,1.5,10,2,True,1,20,2.44,7.07,96,100,False,False,14,18.6,7,22,8.0,0.1,10000.0 +1655,-166.8299999999981,19,0.5410832668555553,12,46,40,2.5,6,5,False,0,14,3.2,6.46,48,200,True,False,14,16.8,7,22,6.0,0.1,10000.0 +1656,-3484.6399999999976,831,0.704672254036916,8,52,64,1.6,9,3,True,0,14,2.86,6.0,80,100,True,False,14,19.3,8,21,8.0,0.1,10000.0 +1657,-3092.8800000000138,690,0.6716311424239721,8,42,40,0.7,7,5,True,0,14,2.55,5.44,80,100,True,True,14,19.6,8,21,6.0,0.1,10000.0 +1658,-3339.8599999999906,757,0.6928101689614893,9,42,40,1.0,9,2,True,0,20,3.06,6.26,80,200,True,False,14,21.6,7,21,6.0,0.1,10000.0 +1659,-3318.2499999999854,654,0.6567449500931519,8,50,32,1.4,6,3,True,0,20,3.12,6.88,80,200,True,False,14,22.1,7,21,6.0,0.1,10000.0 +1660,-2994.069999999995,657,0.6670269897563704,9,52,72,2.0,6,5,True,0,20,2.88,4.81,64,100,True,True,14,21.2,7,22,8.0,0.1,10000.0 +1661,72.06999999999425,74,1.067038742384075,10,46,56,1.6,8,3,False,0,20,2.45,5.47,80,200,True,False,14,23.8,7,22,8.0,0.1,10000.0 +1662,-2729.3299999999826,560,0.6471235448353615,8,52,56,1.5,10,4,True,0,14,2.59,7.07,64,100,True,True,14,22.6,7,21,6.0,0.1,10000.0 +1663,-339.7999999999902,103,0.7577269972549998,9,50,64,1.3,7,5,False,0,14,3.14,5.05,48,200,True,False,14,21.4,8,21,8.0,0.1,10000.0 +1664,-250.04999999999745,69,0.7970587519174113,12,38,56,1.8,9,2,False,0,20,2.81,5.02,48,100,False,False,14,18.0,7,22,8.0,0.1,10000.0 +1665,-240.0999999999949,41,0.6467819051121736,12,52,40,2.3,9,3,False,0,14,2.82,6.76,64,100,False,True,14,17.3,8,21,6.0,0.1,10000.0 +1666,-6196.229999999994,1405,0.674560573289957,8,48,40,0.5,6,3,True,0,14,3.04,7.19,64,100,False,False,14,21.2,8,22,6.0,0.1,10000.0 +1667,-2586.8699999999853,549,0.6678760847208902,11,38,48,1.1,10,4,True,1,20,2.95,7.17,64,100,True,False,14,17.2,7,21,6.0,0.1,10000.0 +1668,-77.11999999999898,76,0.9307409070498429,11,38,48,1.0,9,4,False,1,20,2.16,7.14,96,200,True,True,14,19.3,7,22,8.0,0.1,10000.0 +1669,-2167.350000000012,448,0.6609696235915773,11,42,72,1.8,8,3,True,0,14,2.54,5.9,80,200,True,True,14,23.2,8,21,8.0,0.1,10000.0 +1670,-5608.189999999997,1465,0.7055119077749994,8,46,56,1.1,9,5,True,0,14,2.17,6.34,96,100,False,False,14,17.2,7,21,6.0,0.1,10000.0 +1671,-3942.4700000000057,884,0.6502564657581398,11,40,72,1.8,9,4,True,0,14,2.0,5.09,96,100,False,True,14,23.5,7,22,8.0,0.1,10000.0 +1672,-3231.8299999999754,869,0.6989650447617441,11,38,40,0.6,9,5,True,0,20,2.76,4.93,64,100,True,False,14,17.1,8,21,8.0,0.1,10000.0 +1673,170.95000000000073,52,1.2415127926196967,10,40,56,2.1,6,2,False,1,20,2.67,6.07,48,100,True,False,14,21.5,8,22,6.0,0.1,10000.0 +1674,-5448.569999999998,1248,0.66606051468371,10,42,32,1.5,6,2,True,0,14,2.34,5.17,80,200,False,False,14,19.6,7,22,8.0,0.1,10000.0 +1675,-187.1999999999971,67,0.8126557449235912,8,38,48,2.4,6,2,False,0,14,2.81,4.65,48,200,False,True,14,18.9,7,21,8.0,0.1,10000.0 +1676,-1874.8899999999858,389,0.658084541049587,8,42,48,1.8,10,5,True,1,14,2.84,6.35,48,100,True,True,14,17.4,8,22,8.0,0.1,10000.0 +1677,188.87999999999738,50,1.2520719061536614,10,52,72,1.9,8,3,False,0,20,2.71,6.75,96,200,True,False,14,18.8,8,22,6.0,0.1,10000.0 +1678,-219.57999999999447,154,0.9003155146975372,8,46,32,1.3,6,4,False,0,20,2.35,7.32,80,100,True,False,14,19.7,7,22,8.0,0.1,10000.0 +1679,-1171.579999999998,100,0.42529040106742017,11,52,56,1.6,9,2,False,0,20,2.6,4.77,96,200,False,True,14,16.4,8,22,8.0,0.1,10000.0 +1680,112.39000000000851,100,1.0636911272179121,12,40,48,1.0,10,2,False,0,14,3.15,6.89,96,100,True,True,14,16.4,8,22,8.0,0.1,10000.0 +1681,-5220.859999999992,1062,0.6119150694869798,10,48,32,1.6,10,5,True,0,20,2.45,5.23,64,200,False,True,14,16.9,7,21,6.0,0.1,10000.0 +1682,-995.8299999999999,351,0.8106502687666018,12,48,72,2.2,10,4,True,1,20,3.08,6.33,80,100,True,False,14,17.9,8,21,6.0,0.1,10000.0 +1683,-6384.079999999996,1511,0.6735556270297054,8,52,72,1.9,8,2,True,0,14,2.79,5.76,64,200,False,False,14,21.3,7,21,8.0,0.1,10000.0 +1684,7.019999999991342,79,1.00451290227188,10,46,64,2.2,10,5,False,0,14,3.16,7.06,80,200,False,False,14,20.9,8,22,8.0,0.1,10000.0 +1685,-3253.679999999985,853,0.7108125331633945,11,38,48,0.8,7,5,True,0,20,2.82,7.46,64,100,True,False,14,16.6,7,22,8.0,0.1,10000.0 +1686,-3259.0400000000136,681,0.6803386661880142,12,38,48,1.2,7,3,True,0,20,2.74,6.01,96,200,True,False,14,18.3,8,22,8.0,0.1,10000.0 +1687,-1283.110000000006,240,0.6233834467293231,10,40,40,1.1,6,3,False,1,14,2.5,7.17,48,200,False,False,14,17.5,8,22,6.0,0.1,10000.0 +1688,-4982.870000000025,1083,0.6816389091743161,12,44,48,1.3,7,2,True,0,20,3.01,6.08,80,200,False,False,14,19.4,8,22,6.0,0.1,10000.0 +1689,-994.9500000000025,180,0.6814875757905587,8,48,56,1.6,9,3,False,0,14,3.04,4.69,96,100,False,False,14,18.7,8,21,8.0,0.1,10000.0 +1690,-1329.6100000000042,185,0.5310348476297968,9,40,56,0.6,7,5,False,0,14,2.3,5.14,96,100,False,True,14,22.0,8,21,8.0,0.1,10000.0 +1691,-6347.149999999992,1666,0.658142974403609,9,46,48,1.4,8,5,True,0,14,2.16,4.73,48,200,False,False,14,20.5,8,21,8.0,0.1,10000.0 +1692,-278.2999999999993,22,0.4142902241397453,11,40,48,1.9,8,4,False,1,20,2.62,5.63,80,200,True,True,14,22.7,7,21,6.0,0.1,10000.0 +1693,-2221.7299999999977,490,0.711148525664361,12,42,48,0.8,7,5,True,1,14,3.09,5.45,80,200,False,True,14,20.8,8,21,6.0,0.1,10000.0 +1694,-1073.3900000000085,385,0.7906254571698867,12,46,56,2.3,8,3,True,0,14,2.8,7.02,64,200,True,True,14,22.0,7,21,6.0,0.1,10000.0 +1695,-2391.5200000000086,523,0.7199628571863499,8,44,56,2.4,10,5,True,0,20,3.12,6.75,96,100,True,True,14,21.6,8,21,8.0,0.1,10000.0 +1696,-3554.0599999999995,810,0.6737044568794959,9,52,72,1.3,6,3,True,0,20,2.54,5.18,80,200,True,True,14,16.1,7,21,6.0,0.1,10000.0 +1697,-3001.009999999993,887,0.7519250338301705,10,48,72,1.9,9,3,True,0,14,2.23,6.45,96,200,False,True,14,22.1,7,22,8.0,0.1,10000.0 +1698,-5986.749999999982,1458,0.6860858987064332,9,48,64,1.2,10,5,True,0,14,2.93,5.16,64,100,False,False,14,22.5,8,21,8.0,0.1,10000.0 +1699,-3038.7900000000036,564,0.6151384280250259,9,46,32,2.0,7,4,True,0,20,3.09,6.06,64,200,True,True,14,16.3,7,21,8.0,0.1,10000.0 +1700,-2283.3600000000115,739,0.7634946315634652,11,40,48,2.1,9,4,True,1,20,2.28,5.67,80,200,False,False,14,18.4,8,22,8.0,0.1,10000.0 +1701,-690.4099999999926,131,0.6736730160230657,11,44,40,0.9,7,2,False,0,20,2.65,5.49,96,200,True,False,14,21.3,8,21,6.0,0.1,10000.0 +1702,-3238.7300000000123,769,0.650286305391698,12,46,48,1.7,10,4,True,0,20,2.04,5.74,80,100,True,False,14,17.0,7,21,6.0,0.1,10000.0 +1703,-2807.369999999981,556,0.6625684209514148,12,38,72,0.7,10,5,True,0,14,2.65,5.24,96,100,True,True,14,22.2,7,21,6.0,0.1,10000.0 +1704,-1961.1000000000085,575,0.7258130814465593,8,48,40,0.9,8,3,True,0,20,2.03,6.41,96,200,True,True,14,22.1,7,22,8.0,0.1,10000.0 +1705,-2415.8799999999774,773,0.768311804888902,10,50,72,1.7,9,4,True,0,20,2.68,6.33,80,200,True,False,14,18.6,7,22,6.0,0.1,10000.0 +1706,-2678.970000000025,712,0.7320740639989118,12,40,56,0.7,10,4,True,0,14,2.75,7.33,80,100,False,True,14,23.2,7,21,8.0,0.1,10000.0 +1707,-1732.6699999999928,290,0.5681119682939292,12,42,32,1.3,8,2,True,1,14,2.11,7.0,80,200,True,True,14,18.4,7,21,6.0,0.1,10000.0 +1708,-3353.5199999999923,826,0.689630279539321,8,42,56,1.8,10,4,True,0,14,2.62,6.82,64,200,True,False,14,22.6,8,21,6.0,0.1,10000.0 +1709,92.42999999999665,29,1.1790931989924431,8,42,72,2.5,8,2,False,1,14,2.7,7.5,96,100,True,True,14,22.7,7,22,6.0,0.1,10000.0 +1710,-2132.1999999999935,572,0.7039754094946673,9,40,64,2.3,8,3,True,0,20,2.7,4.68,48,200,True,True,14,23.3,7,21,6.0,0.1,10000.0 +1711,-5698.899999999993,1094,0.6144995102522336,9,48,48,1.3,6,2,True,0,20,2.89,6.69,64,200,False,True,14,18.9,7,21,6.0,0.1,10000.0 +1712,-863.3100000000068,125,0.5299898191954443,12,50,72,0.9,9,5,False,0,14,2.22,5.22,64,100,True,False,14,16.2,7,21,6.0,0.1,10000.0 +1713,-1508.3499999999913,349,0.6883136473719449,12,40,40,0.6,8,4,False,0,14,2.74,7.35,48,100,False,False,14,21.4,8,22,6.0,0.1,10000.0 +1714,-1281.8999999999942,266,0.6977399464755191,9,40,64,0.7,10,2,False,0,14,2.8,5.08,96,100,True,False,14,23.7,7,22,8.0,0.1,10000.0 +1715,-3398.5599999999986,1046,0.7396535465401767,11,38,48,2.4,6,5,True,0,14,2.83,7.21,48,100,False,False,14,18.3,8,21,6.0,0.1,10000.0 +1716,-5078.340000000015,1244,0.6582431049206872,9,44,40,0.5,7,4,True,1,20,2.52,7.37,48,200,False,False,14,22.2,8,21,8.0,0.1,10000.0 +1717,-2845.1500000000115,634,0.699147506175346,11,48,72,0.8,9,3,True,0,20,2.91,5.13,96,100,True,True,14,20.0,7,21,6.0,0.1,10000.0 +1718,-3530.089999999994,910,0.6711058481106771,10,52,32,2.4,10,5,True,0,20,2.48,5.88,48,200,False,True,14,18.2,8,22,6.0,0.1,10000.0 +1719,-2666.45000000002,778,0.7094088350525013,9,44,40,1.9,6,2,True,0,20,2.63,4.53,48,200,True,False,14,21.2,8,21,6.0,0.1,10000.0 +1720,-2747.2599999999966,664,0.667760723286717,9,44,48,0.9,6,5,True,1,20,2.35,7.15,64,100,True,False,14,18.7,7,22,6.0,0.1,10000.0 +1721,-501.1300000000101,86,0.6365515440739182,9,48,64,2.2,7,4,False,0,20,2.43,7.5,48,100,False,False,14,23.2,8,21,6.0,0.1,10000.0 +1722,-270.99999999999454,77,0.7426791750541227,10,42,40,1.4,10,3,False,1,20,2.23,7.13,64,100,True,True,14,16.1,8,21,8.0,0.1,10000.0 +1723,-1196.5600000000086,436,0.8083403410137512,10,52,48,1.5,9,5,True,1,20,2.89,7.33,80,100,True,False,14,19.9,7,21,6.0,0.1,10000.0 +1724,-324.72999999999956,73,0.728404871031414,11,44,32,1.4,8,3,False,0,20,2.48,4.87,80,200,True,True,14,16.8,8,22,6.0,0.1,10000.0 +1725,-232.36999999999898,89,0.8089313906064991,10,52,40,1.6,8,3,False,0,14,2.09,6.12,48,100,True,False,14,23.3,7,22,6.0,0.1,10000.0 +1726,-6001.590000000009,1513,0.695296162205715,8,42,56,2.0,6,4,True,0,20,2.45,5.55,80,100,False,False,14,20.0,7,22,8.0,0.1,10000.0 +1727,-6278.029999999988,1485,0.6890113749564701,9,52,56,0.7,8,2,True,0,20,2.76,5.44,80,200,False,False,14,22.3,7,21,6.0,0.1,10000.0 +1728,-2809.7799999999897,567,0.7006381913295475,8,40,32,1.7,9,3,True,0,14,3.15,7.41,96,200,True,True,14,17.0,7,22,6.0,0.1,10000.0 +1729,-233.51999999999498,55,0.6884613845271289,11,44,64,1.2,6,4,False,1,20,2.03,6.87,64,200,True,True,14,20.8,7,22,8.0,0.1,10000.0 +1730,-3819.799999999994,880,0.6920732936178446,8,40,32,0.9,8,2,True,0,20,2.67,5.07,96,200,True,False,14,21.5,7,22,8.0,0.1,10000.0 +1731,-5036.899999999995,1108,0.6443244006637715,12,48,72,0.7,7,4,True,0,20,2.51,5.49,64,100,False,True,14,19.8,8,22,6.0,0.1,10000.0 +1732,-1429.070000000007,208,0.5691393459921972,11,48,40,1.5,6,2,True,1,14,2.78,5.84,80,200,True,True,14,21.3,8,22,6.0,0.1,10000.0 +1733,-1061.029999999997,137,0.5268455178687691,9,48,72,0.7,9,3,False,0,14,2.51,7.23,96,100,False,True,14,22.8,7,21,8.0,0.1,10000.0 +1734,-645.6600000000035,75,0.5696173843487534,8,52,64,2.4,6,3,False,1,20,2.76,5.51,96,100,False,True,14,17.9,8,22,8.0,0.1,10000.0 +1735,-43.37999999999556,97,0.9689894772961225,8,46,40,1.8,7,4,False,0,14,2.94,7.16,64,100,True,False,14,21.4,8,22,8.0,0.1,10000.0 +1736,-3363.599999999983,808,0.7210246678687365,11,40,72,0.9,7,5,True,0,20,2.76,7.35,96,100,True,False,14,20.1,7,21,8.0,0.1,10000.0 +1737,-193.16000000000167,48,0.7429605578325438,8,46,32,2.4,6,5,False,1,14,2.14,5.75,48,200,True,False,14,18.0,7,21,6.0,0.1,10000.0 +1738,-2000.6900000000032,506,0.7466589508713192,8,52,48,2.1,7,4,True,0,20,3.16,5.05,96,200,True,True,14,21.4,8,22,6.0,0.1,10000.0 +1739,-6491.190000000006,1792,0.6841064088850562,8,52,64,1.6,6,3,True,0,14,2.4,4.78,48,100,False,False,14,22.0,8,22,6.0,0.1,10000.0 +1740,-449.6700000000001,69,0.6295444996416302,12,50,72,1.3,6,3,False,0,20,3.09,7.03,64,200,True,False,14,19.3,8,21,6.0,0.1,10000.0 +1741,-254.46000000000095,91,0.8352572527337353,8,38,40,1.9,9,2,False,1,14,2.54,6.93,96,100,False,True,14,20.1,8,22,6.0,0.1,10000.0 +1742,-2226.2199999999993,722,0.7891433778052241,9,38,56,2.1,6,3,True,1,20,2.71,6.52,96,200,False,False,14,20.3,8,21,8.0,0.1,10000.0 +1743,-2196.680000000002,622,0.7130165996462156,10,38,56,2.1,8,4,True,0,20,2.16,5.91,80,200,True,True,14,20.1,7,22,8.0,0.1,10000.0 +1744,-1292.5899999999874,451,0.8052862055823609,11,52,64,1.2,6,3,True,0,14,2.91,4.68,96,100,True,True,14,23.9,7,21,6.0,0.1,10000.0 +1745,-3651.9699999999966,997,0.6796882811609203,9,50,72,2.4,8,4,True,0,20,2.27,4.53,48,200,True,False,14,21.9,7,22,6.0,0.1,10000.0 +1746,-2629.0200000000086,416,0.5464352566701458,11,48,40,1.8,8,5,True,1,20,2.44,4.88,64,200,False,True,14,20.7,7,21,8.0,0.1,10000.0 +1747,-2656.390000000004,554,0.6565233525950273,9,50,72,2.3,9,3,True,0,20,2.52,5.15,80,100,True,True,14,23.5,8,21,6.0,0.1,10000.0 +1748,-2075.6800000000076,441,0.6316594560638271,11,42,40,1.5,7,3,True,1,14,2.12,5.2,64,200,False,True,14,21.7,7,21,8.0,0.1,10000.0 +1749,-133.48999999999614,42,0.7819752723471671,9,44,48,2.4,6,3,False,0,14,2.32,5.07,64,100,False,True,14,20.3,7,22,8.0,0.1,10000.0 +1750,-3610.2399999999907,730,0.6422398458859822,11,40,40,1.2,9,2,True,0,14,2.53,6.28,80,100,True,False,14,20.6,8,21,8.0,0.1,10000.0 +1751,-5441.97999999997,1217,0.6616597261684347,10,48,72,1.2,8,3,True,0,20,2.8,6.12,64,200,False,True,14,17.3,8,21,8.0,0.1,10000.0 +1752,-758.1299999999992,90,0.5250079882713381,9,42,72,2.1,7,5,False,1,20,2.74,5.29,64,100,False,True,14,16.3,8,22,6.0,0.1,10000.0 +1753,-2273.719999999993,546,0.7274674484863232,9,40,72,1.2,7,3,True,1,20,2.91,6.97,96,200,True,False,14,21.4,7,21,8.0,0.1,10000.0 +1754,-941.890000000003,120,0.5367678158658339,8,50,56,1.4,10,5,False,1,14,2.48,5.87,80,200,True,False,14,16.7,8,22,6.0,0.1,10000.0 +1755,-244.6399999999976,74,0.8022344020306866,9,48,72,1.7,6,3,False,0,14,2.37,7.07,96,100,True,False,14,18.6,8,21,8.0,0.1,10000.0 +1756,78.92999999999483,39,1.1337479242213713,10,44,64,1.9,9,3,False,1,20,2.74,7.25,80,100,True,True,14,20.5,8,22,8.0,0.1,10000.0 +1757,-5907.3600000000315,1659,0.6758041838303812,10,50,72,1.8,7,2,True,0,20,2.26,4.66,48,100,False,False,14,21.9,8,21,8.0,0.1,10000.0 +1758,-487.18000000000575,71,0.6244893554702554,11,44,72,2.0,7,4,False,0,20,2.25,6.61,64,100,False,False,14,18.3,8,22,6.0,0.1,10000.0 +1759,31.56000000000313,55,1.0299493252861127,12,40,56,1.8,6,2,False,0,14,2.72,5.41,96,200,False,True,14,16.2,8,21,6.0,0.1,10000.0 +1760,-111.53000000000247,32,0.8144259567387687,11,46,48,2.3,9,3,False,0,20,2.74,6.39,80,100,True,False,14,22.4,7,21,8.0,0.1,10000.0 +1761,-1756.930000000004,469,0.7462741099744098,8,50,48,2.3,8,2,True,0,20,2.9,6.94,80,200,True,True,14,22.7,8,22,6.0,0.1,10000.0 +1762,36.129999999991924,76,1.0279784721415575,9,52,64,2.3,8,3,False,1,14,2.79,5.67,80,100,False,False,14,19.5,8,22,8.0,0.1,10000.0 +1763,-2059.1400000000103,410,0.6139124565235733,8,44,56,1.0,8,4,True,1,20,2.61,6.36,48,200,True,True,14,18.6,7,21,6.0,0.1,10000.0 +1764,-4662.769999999989,1108,0.6973748258991909,12,50,48,1.3,10,3,True,0,20,2.93,5.2,80,200,False,False,14,17.4,7,21,6.0,0.1,10000.0 +1765,-2590.8200000000024,551,0.6692011373836345,10,50,32,2.1,10,5,True,0,14,2.25,7.1,96,200,True,False,14,16.0,8,21,6.0,0.1,10000.0 +1766,80.71000000000276,76,1.067965743446371,11,50,48,1.4,9,5,False,1,14,2.79,7.14,96,100,True,False,14,16.9,8,21,6.0,0.1,10000.0 +1767,-515.9399999999987,92,0.6362187735762584,12,50,72,1.1,8,5,False,1,14,2.77,7.21,48,100,True,False,14,18.5,7,21,6.0,0.1,10000.0 +1768,-6387.579999999993,1748,0.6723224009656557,10,42,64,1.3,9,2,True,0,20,2.38,4.5,48,100,False,False,14,22.3,8,21,6.0,0.1,10000.0 +1769,-3370.059999999993,1070,0.7882183637174871,8,38,32,0.9,8,4,True,0,14,3.09,6.18,96,100,False,False,14,20.9,7,21,8.0,0.1,10000.0 +1770,-517.1599999999908,188,0.8404688825480066,10,38,48,1.2,10,2,False,1,14,3.0,6.23,96,100,False,False,14,22.4,8,21,8.0,0.1,10000.0 +1771,-707.5500000000029,169,0.669404690150124,8,38,72,1.1,7,3,False,0,20,2.02,7.26,48,200,True,False,14,23.7,7,21,6.0,0.1,10000.0 +1772,-3735.3000000000147,1078,0.699436337521575,8,44,48,1.7,7,3,True,1,20,2.05,4.66,64,200,False,False,14,23.5,8,22,8.0,0.1,10000.0 +1773,-1734.3299999999963,258,0.5436862295237244,12,48,56,0.8,9,4,False,0,20,2.48,4.7,64,200,False,False,14,21.8,7,21,8.0,0.1,10000.0 +1774,-1850.1000000000004,394,0.6483622167568205,12,48,32,1.4,9,2,True,0,14,2.67,4.64,48,100,True,True,14,21.8,7,21,6.0,0.1,10000.0 +1775,-447.9200000000001,107,0.7101741853663587,8,42,48,1.2,10,5,False,1,14,2.07,6.86,64,100,True,True,14,18.7,8,21,6.0,0.1,10000.0 +1776,-4476.699999999982,1025,0.6438734086788703,12,50,72,0.7,9,2,True,0,14,2.41,4.77,64,100,True,False,14,16.0,7,22,8.0,0.1,10000.0 +1777,-92.01000000000204,66,0.8996093920481822,8,38,48,1.0,9,2,False,1,14,2.83,6.0,48,200,True,True,14,22.7,8,22,8.0,0.1,10000.0 +1778,-514.5599999999995,189,0.802317361772751,10,46,64,2.3,6,5,True,1,20,2.99,7.24,48,200,True,True,14,23.6,8,22,8.0,0.1,10000.0 +1779,-111.58000000000357,68,0.9064075357115895,11,44,72,1.7,10,4,False,1,14,2.58,4.92,80,100,True,False,14,21.3,7,22,8.0,0.1,10000.0 +1780,-3314.320000000016,773,0.6973107644311471,11,52,56,0.9,7,4,True,0,20,2.73,7.13,80,100,True,False,14,19.1,8,22,6.0,0.1,10000.0 +1781,-1087.4500000000044,106,0.4643736701079675,12,50,32,1.4,8,5,False,0,14,2.16,6.85,96,100,False,False,14,23.7,7,21,8.0,0.1,10000.0 +1782,-3560.789999999979,1159,0.7750896283738545,11,42,72,1.6,9,2,True,0,14,2.32,7.32,96,200,False,False,14,17.0,8,22,6.0,0.1,10000.0 +1783,-4003.149999999986,909,0.6400546686388139,11,52,72,1.1,7,2,True,0,14,2.25,6.65,64,200,True,False,14,17.4,7,22,6.0,0.1,10000.0 +1784,-1106.299999999992,301,0.7117569201267301,10,50,32,0.5,8,4,False,0,14,2.54,4.82,48,200,True,False,14,21.0,7,22,6.0,0.1,10000.0 +1785,-7482.259999999995,1703,0.6558101750053822,8,44,72,0.7,8,4,True,0,20,2.74,6.99,64,200,False,False,14,17.9,7,21,6.0,0.1,10000.0 +1786,-1199.1799999999985,320,0.7602028471387635,12,40,40,2.3,10,4,True,1,14,2.87,6.88,80,100,True,False,14,22.5,8,21,8.0,0.1,10000.0 +1787,-507.2199999999957,149,0.7716552093603266,9,52,56,1.7,10,3,False,0,14,2.91,4.79,48,200,False,False,14,17.8,7,22,6.0,0.1,10000.0 +1788,-3147.010000000001,608,0.6806012836803709,12,40,72,0.5,6,5,True,0,14,3.17,5.53,96,200,True,True,14,18.7,8,22,8.0,0.1,10000.0 +1789,-3666.7800000000016,964,0.7226995423927618,10,42,56,0.9,8,3,True,1,20,2.99,4.95,80,200,False,False,14,17.0,8,21,8.0,0.1,10000.0 +1790,100.40999999999985,29,1.261361861627362,8,40,56,2.4,10,3,False,0,20,2.06,5.25,80,200,True,True,14,21.9,7,22,6.0,0.1,10000.0 +1791,-1070.9199999999946,255,0.7334693877551021,8,46,56,1.3,9,5,True,1,14,2.64,6.12,96,200,True,True,14,21.6,8,21,6.0,0.1,10000.0 +1792,-1414.479999999985,222,0.538987028225018,8,52,48,0.9,7,5,False,0,14,2.12,6.83,64,200,True,False,14,21.3,7,22,8.0,0.1,10000.0 +1793,-2781.239999999996,583,0.6981109956918587,8,46,48,0.9,6,2,True,0,20,3.11,5.57,96,200,True,True,14,19.7,8,21,6.0,0.1,10000.0 +1794,-4815.899999999999,1133,0.6793606787894283,8,52,32,2.1,8,3,True,0,20,2.94,7.3,64,200,False,False,14,16.2,7,21,6.0,0.1,10000.0 +1795,-1544.4300000000112,336,0.6629920332026263,10,44,48,1.1,10,5,True,1,20,2.98,6.65,48,100,True,True,14,19.2,7,21,8.0,0.1,10000.0 +1796,-2247.5799999999954,736,0.7416322284361115,12,42,56,1.7,7,5,True,0,14,2.59,5.37,48,100,True,False,14,17.3,7,21,8.0,0.1,10000.0 +1797,-2917.2200000000003,509,0.5997739037142625,10,38,56,0.5,9,3,False,0,20,2.88,7.14,64,200,False,False,14,18.5,8,22,8.0,0.1,10000.0 +1798,-2023.1199999999963,495,0.6835052336650359,8,52,32,0.9,9,5,True,0,14,2.0,7.4,96,100,True,True,14,22.8,7,21,6.0,0.1,10000.0 +1799,-4217.43,1009,0.7024094124155372,8,44,64,1.3,10,3,True,1,20,2.92,4.9,80,100,False,False,14,17.6,7,22,8.0,0.1,10000.0 +1800,-2433.059999999995,596,0.6598855129898723,12,50,64,0.8,6,5,True,1,20,2.04,5.32,80,100,True,False,14,17.6,8,21,8.0,0.1,10000.0 +1801,-1158.730000000016,363,0.7964630061286112,12,46,64,2.3,10,2,True,1,20,3.18,6.9,80,100,True,False,14,17.5,7,22,6.0,0.1,10000.0 +1802,-243.5599999999995,67,0.7984342155353626,11,40,56,2.0,6,4,False,1,14,2.95,5.26,48,100,False,False,14,21.8,8,22,8.0,0.1,10000.0 +1803,-306.77999999999884,102,0.7701747025860778,12,46,40,0.6,7,5,False,0,14,2.25,7.06,64,200,True,True,14,20.0,8,22,8.0,0.1,10000.0 +1804,-1657.579999999998,505,0.7349322450754947,11,52,56,1.5,10,3,True,1,20,2.09,7.0,80,100,True,False,14,24.0,7,22,6.0,0.1,10000.0 +1805,-2611.359999999998,755,0.6967072124022796,12,38,64,1.8,8,3,True,0,14,2.23,6.32,48,200,True,False,14,18.9,7,21,6.0,0.1,10000.0 +1806,-146.01999999999498,79,0.8860669616035828,8,40,40,1.7,8,4,False,0,20,2.34,6.75,96,200,True,True,14,17.3,7,22,6.0,0.1,10000.0 +1807,-4372.440000000003,1150,0.6894995068140614,8,38,72,1.5,9,2,True,0,20,2.84,4.56,48,200,True,False,14,20.2,7,22,8.0,0.1,10000.0 +1808,-2839.0600000000177,669,0.6466316832373281,12,50,56,1.8,9,5,True,0,20,2.14,6.9,64,200,True,False,14,18.4,7,21,8.0,0.1,10000.0 +1809,-2767.420000000019,833,0.7336535037486888,12,50,64,1.6,7,4,True,1,20,2.12,7.03,80,200,False,False,14,20.9,7,22,8.0,0.1,10000.0 +1810,-2609.090000000002,790,0.7561639149995607,8,40,32,1.9,8,2,True,1,20,2.25,6.93,96,100,False,False,14,20.1,8,22,6.0,0.1,10000.0 +1811,-1406.9900000000034,176,0.5499662552256422,8,48,72,1.7,7,4,False,0,20,3.03,6.95,80,100,False,False,14,23.9,8,22,8.0,0.1,10000.0 +1812,-2793.010000000002,508,0.6387492724568324,11,38,40,1.3,7,5,True,0,20,3.06,6.8,80,200,True,True,14,18.7,8,22,8.0,0.1,10000.0 +1813,-5039.0899999999865,1256,0.6916745036684511,12,46,64,1.8,9,2,True,0,14,2.33,5.83,80,200,False,False,14,21.7,7,22,6.0,0.1,10000.0 +1814,-246.2099999999955,39,0.6466104979116131,10,44,56,1.5,10,2,False,1,20,2.82,6.74,96,200,True,True,14,21.0,8,21,6.0,0.1,10000.0 +1815,-1124.1600000000053,107,0.4135500732958073,11,48,48,1.6,6,5,False,0,20,2.28,5.15,80,200,False,False,14,17.5,7,21,8.0,0.1,10000.0 +1816,-227.8199999999997,17,0.39380554520781225,12,50,48,2.5,10,2,False,0,14,2.57,5.88,48,200,True,False,14,16.0,8,21,6.0,0.1,10000.0 +1817,-2475.5800000000036,584,0.7293241139218362,10,38,48,0.7,7,5,True,1,14,3.04,5.86,96,100,True,False,14,23.4,8,22,8.0,0.1,10000.0 +1818,-2189.229999999995,636,0.774355966827937,10,50,56,2.0,7,3,True,0,14,2.99,6.21,96,200,True,False,14,20.8,7,22,6.0,0.1,10000.0 +1819,-2813.8900000000094,672,0.6761869581328123,8,40,32,0.9,9,5,True,0,14,2.82,6.29,48,200,True,True,14,18.1,8,22,8.0,0.1,10000.0 +1820,-5599.890000000016,1342,0.668482745963994,9,44,40,2.2,6,5,True,0,20,2.26,5.46,80,200,False,False,14,20.2,7,22,6.0,0.1,10000.0 +1821,13.279999999997017,83,1.0135659706615454,10,42,56,0.6,9,2,False,0,20,2.4,6.77,48,200,True,True,14,22.8,7,21,6.0,0.1,10000.0 +1822,-2581.6099999999824,677,0.7186412526388178,9,50,32,2.2,10,2,True,0,20,2.55,5.59,80,100,False,True,14,23.7,7,22,8.0,0.1,10000.0 +1823,-1705.910000000009,346,0.6848255641014744,12,52,32,1.2,10,2,True,1,14,2.91,6.38,96,200,True,False,14,22.5,8,21,8.0,0.1,10000.0 +1824,-1003.9300000000039,259,0.696122261807109,8,52,64,0.9,10,4,True,1,20,2.61,5.09,48,100,True,True,14,22.7,8,22,6.0,0.1,10000.0 +1825,-2088.210000000008,627,0.7271469338476253,11,48,72,1.1,6,4,True,1,14,2.58,6.04,48,100,True,False,14,20.4,7,22,8.0,0.1,10000.0 +1826,-454.3599999999951,145,0.7838254465177797,9,40,56,1.5,10,4,False,1,20,3.14,7.48,48,200,False,True,14,17.7,7,21,6.0,0.1,10000.0 +1827,-1050.0000000000073,245,0.6673952294972917,11,48,56,0.5,8,3,True,1,14,2.15,5.58,64,100,True,True,14,23.6,8,22,6.0,0.1,10000.0 +1828,-3452.289999999988,757,0.6335315903838784,9,38,64,2.1,7,3,True,0,20,2.32,4.51,64,100,True,True,14,21.1,7,22,8.0,0.1,10000.0 +1829,-4745.259999999962,1098,0.6581133646934393,8,42,72,1.4,7,2,True,0,20,2.26,6.18,80,100,True,False,14,17.0,7,21,6.0,0.1,10000.0 +1830,-347.85999999999876,74,0.7384393280899889,11,42,32,1.1,6,2,False,0,14,3.09,5.54,80,200,True,True,14,18.9,8,22,6.0,0.1,10000.0 +1831,-1893.0499999999965,285,0.5310309120006342,12,42,48,2.2,8,4,True,1,14,2.45,4.75,64,200,True,True,14,17.5,7,22,8.0,0.1,10000.0 +1832,-1607.4900000000089,334,0.6435499321465634,9,48,32,1.5,7,4,True,1,20,2.82,6.82,48,200,True,True,14,16.3,7,21,8.0,0.1,10000.0 +1833,-4801.379999999986,1126,0.6443643506626253,12,48,48,1.0,10,5,True,0,20,2.02,6.63,80,200,False,True,14,16.9,8,21,6.0,0.1,10000.0 +1834,-1894.820000000016,494,0.7427899690775668,10,46,56,1.9,6,3,True,0,20,3.12,5.74,80,200,True,True,14,21.6,7,22,8.0,0.1,10000.0 +1835,-2608.349999999992,605,0.6889040228329074,12,40,32,1.5,7,3,True,0,20,2.36,6.8,96,200,True,False,14,19.0,7,22,8.0,0.1,10000.0 +1836,-253.99999999999818,128,0.8668002160563425,8,42,40,1.5,7,4,False,1,14,2.58,5.91,48,100,True,False,14,21.7,8,22,8.0,0.1,10000.0 +1837,-2606.309999999982,731,0.7413915764803471,12,46,64,1.9,9,5,True,1,14,2.52,4.9,80,200,False,False,14,16.9,8,22,6.0,0.1,10000.0 +1838,-2075.8499999999885,433,0.6451859916964788,10,38,40,2.1,9,5,True,1,14,2.45,4.87,64,100,True,False,14,21.4,8,22,6.0,0.1,10000.0 +1839,-5740.050000000011,1457,0.6820348484554728,8,46,48,2.4,7,4,True,0,14,2.07,5.35,80,200,False,False,14,22.3,8,22,8.0,0.1,10000.0 +1840,-3403.0299999999925,894,0.7471351399549707,10,50,40,2.4,9,3,True,0,20,2.84,7.08,96,200,False,False,14,20.5,8,21,8.0,0.1,10000.0 +1841,-2847.2100000000073,582,0.6288432809554723,12,40,32,1.5,6,4,True,0,20,2.11,7.23,96,200,True,False,14,21.0,8,21,6.0,0.1,10000.0 +1842,-1254.579999999989,335,0.7060909900201471,11,50,32,2.1,10,3,True,1,20,2.04,6.23,80,100,True,False,14,18.9,7,21,6.0,0.1,10000.0 +1843,-6393.89999999998,1578,0.6791655564738167,8,48,40,0.8,7,5,True,0,14,2.73,5.07,64,100,False,False,14,17.9,7,21,6.0,0.1,10000.0 +1844,-1251.4099999999908,197,0.5684688940767536,9,52,64,0.8,6,3,False,0,20,3.14,5.85,48,200,True,False,14,19.2,8,21,6.0,0.1,10000.0 +1845,-2711.359999999988,688,0.6908506919304614,12,44,48,1.5,6,3,True,0,20,2.52,5.94,64,200,True,False,14,22.8,8,22,6.0,0.1,10000.0 +1846,-1562.5299999999934,400,0.7307649230907077,9,52,64,2.1,9,3,True,1,20,2.62,6.55,96,200,True,False,14,20.9,7,22,8.0,0.1,10000.0 +1847,-772.2200000000139,169,0.6828925755584757,12,52,72,0.7,8,5,False,0,20,2.3,6.93,80,200,True,False,14,21.2,7,22,6.0,0.1,10000.0 +1848,-2388.049999999983,648,0.7044298697810624,9,50,64,2.0,10,5,True,1,20,2.47,6.5,48,100,False,True,14,17.5,7,21,6.0,0.1,10000.0 +1849,-2510.690000000025,644,0.6968651674269114,9,46,56,1.6,7,3,True,0,20,2.25,5.96,80,100,True,True,14,21.7,7,22,8.0,0.1,10000.0 +1850,-3926.370000000007,1184,0.7583239876846714,10,48,56,1.5,6,4,True,0,20,2.82,7.24,80,200,False,False,14,21.2,8,22,8.0,0.1,10000.0 +1851,2.9399999999968713,38,1.0040942513368982,12,38,32,2.3,8,2,False,0,20,2.76,5.94,96,200,False,False,14,23.5,8,21,8.0,0.1,10000.0 +1852,-4267.209999999996,1183,0.6996005665562839,9,42,56,0.6,9,2,True,0,20,2.23,5.25,80,100,True,False,14,18.3,7,22,8.0,0.1,10000.0 +1853,-4424.189999999989,1073,0.6570296977510208,10,52,72,0.7,8,3,True,0,20,2.1,6.22,80,100,True,False,14,19.0,7,21,6.0,0.1,10000.0 +1854,-2242.45,487,0.6741032370953631,10,48,32,1.6,8,3,True,0,20,3.08,5.73,64,100,True,True,14,20.7,7,22,6.0,0.1,10000.0 +1855,-1072.960000000001,251,0.6883023318643585,9,44,64,0.7,9,2,False,1,14,2.88,5.97,48,200,True,False,14,20.8,8,22,8.0,0.1,10000.0 +1856,-2607.1899999999932,681,0.7397099579892338,10,50,48,1.7,6,4,True,0,14,2.84,5.55,96,100,True,False,14,17.7,7,21,8.0,0.1,10000.0 +1857,-4408.389999999977,1006,0.631820182453374,8,52,56,2.0,8,2,True,0,20,2.09,6.29,64,100,True,False,14,20.4,8,22,8.0,0.1,10000.0 +1858,-3482.8500000000104,750,0.6543920789564037,9,52,32,1.1,9,3,True,0,20,2.29,6.33,96,200,True,False,14,17.4,8,22,8.0,0.1,10000.0 +1859,-3419.6400000000094,810,0.6698803624747677,11,38,40,0.9,9,2,True,0,20,2.61,5.76,64,200,True,False,14,18.7,7,22,8.0,0.1,10000.0 +1860,-8843.129999999963,2030,0.6337268685536587,9,38,72,1.0,9,2,True,0,20,2.14,4.52,80,200,False,False,14,16.3,7,22,8.0,0.1,10000.0 +1861,-6118.760000000002,1297,0.6726146589205438,8,40,40,0.7,10,2,True,0,14,2.97,7.42,80,100,False,False,14,22.1,7,21,8.0,0.1,10000.0 +1862,-2518.5300000000043,759,0.769456799638971,10,46,72,1.7,8,2,True,0,20,2.98,7.19,80,100,True,False,14,21.7,7,21,6.0,0.1,10000.0 +1863,-78.56000000000131,65,0.9244564537997749,10,42,56,1.9,9,4,False,1,20,2.89,6.22,64,100,True,False,14,22.8,7,22,8.0,0.1,10000.0 +1864,-3219.510000000014,746,0.6812691378997984,12,38,48,0.7,10,3,True,0,20,2.93,6.67,64,200,True,False,14,16.1,8,22,8.0,0.1,10000.0 +1865,-3328.7000000000116,951,0.7028015421070581,9,52,72,2.2,6,4,True,0,20,2.28,7.29,48,100,True,False,14,16.1,8,22,6.0,0.1,10000.0 +1866,-88.32999999999811,36,0.8812465548997729,8,42,48,1.9,10,3,False,1,14,3.04,7.26,96,100,True,True,14,22.7,8,22,6.0,0.1,10000.0 +1867,-741.7499999999909,137,0.6551940535791485,11,50,64,1.4,6,4,False,0,20,3.14,5.21,64,100,False,False,14,23.8,8,22,6.0,0.1,10000.0 +1868,-312.92000000000553,46,0.6394058470367255,11,44,40,1.9,6,5,False,0,20,2.35,6.0,80,200,True,False,14,18.8,8,22,6.0,0.1,10000.0 +1869,-3298.319999999986,746,0.6891723154604337,10,44,48,1.4,9,5,True,0,20,2.47,7.11,96,200,True,False,14,21.2,7,22,6.0,0.1,10000.0 +1870,-221.48999999999978,75,0.7920789290877345,12,42,56,0.6,7,5,False,0,14,2.67,6.04,48,100,True,True,14,23.1,7,22,6.0,0.1,10000.0 +1871,-1039.2099999999919,172,0.5846067752573199,12,40,64,1.1,10,2,False,0,20,2.06,7.12,64,200,False,False,14,21.3,7,22,8.0,0.1,10000.0 +1872,-512.5999999999985,34,0.24266824259437098,11,52,56,2.1,6,4,False,1,20,2.16,5.66,64,100,True,True,14,18.7,8,22,8.0,0.1,10000.0 +1873,-2756.369999999998,583,0.676650141593211,8,52,56,0.9,8,4,True,1,14,3.19,6.95,64,100,True,False,14,23.8,8,22,6.0,0.1,10000.0 +1874,-3441.440000000007,764,0.6904664894789151,12,52,48,2.0,10,3,True,0,14,2.6,4.82,96,200,False,True,14,19.3,8,21,8.0,0.1,10000.0 +1875,-277.2999999999993,103,0.8274628388678377,12,40,64,0.8,6,5,False,0,20,2.61,7.33,80,200,True,True,14,17.9,8,22,6.0,0.1,10000.0 +1876,-3238.759999999993,644,0.5729409918682677,12,44,48,1.3,10,5,True,0,20,2.17,4.61,48,100,True,True,14,19.0,8,22,6.0,0.1,10000.0 +1877,-2461.129999999992,435,0.559423647013333,9,50,56,0.7,6,5,False,1,14,2.25,5.22,48,100,False,False,14,18.0,8,21,6.0,0.1,10000.0 +1878,-2798.999999999981,610,0.6724657048540372,10,50,64,0.8,9,4,True,0,20,3.01,5.03,64,100,True,True,14,21.4,8,22,8.0,0.1,10000.0 +1879,-1325.2899999999918,199,0.6048239689653424,12,40,32,0.9,7,5,False,1,14,2.35,5.61,96,100,False,False,14,22.4,7,21,6.0,0.1,10000.0 +1880,-1143.5899999999947,123,0.5371149168005763,11,52,64,1.4,6,3,False,1,20,2.82,6.93,96,200,False,True,14,16.4,8,22,8.0,0.1,10000.0 +1881,-1078.039999999999,167,0.6286577405454188,11,40,56,1.1,6,3,False,0,14,2.36,5.46,80,100,False,True,14,16.6,8,22,8.0,0.1,10000.0 +1882,-2801.479999999995,444,0.588945542048464,8,42,56,0.8,10,4,False,0,14,2.46,6.61,80,200,False,False,14,23.9,7,22,6.0,0.1,10000.0 +1883,-3.0800000000017462,63,0.9963961434054104,9,40,56,1.6,9,2,False,1,20,2.39,5.7,80,100,False,True,14,23.3,8,21,6.0,0.1,10000.0 +1884,-2895.6300000000037,771,0.7072717292079252,8,38,48,0.8,9,5,True,1,14,2.42,7.02,64,100,True,False,14,22.8,7,22,6.0,0.1,10000.0 +1885,-3683.810000000005,937,0.6996238581407845,9,42,72,1.7,8,5,True,0,20,2.96,7.16,48,100,True,False,14,21.7,7,21,8.0,0.1,10000.0 +1886,-2607.999999999988,601,0.6614780739556183,11,48,56,0.6,6,5,True,1,14,2.46,5.41,80,200,True,False,14,23.9,7,21,6.0,0.1,10000.0 +1887,-1872.1800000000012,423,0.6489436507475169,9,48,72,1.0,9,3,True,1,14,2.68,4.51,48,200,True,True,14,18.4,8,22,8.0,0.1,10000.0 +1888,-1936.6499999999933,477,0.7040607694282467,8,48,48,1.4,6,2,True,0,14,3.11,6.08,48,100,True,True,14,24.0,8,21,8.0,0.1,10000.0 +1889,-4071.8199999999906,929,0.6602042536430351,9,48,40,0.6,6,3,True,0,14,2.35,4.82,80,200,True,False,14,20.1,8,22,8.0,0.1,10000.0 +1890,-4187.650000000007,984,0.6821016145243424,8,48,48,0.7,7,3,True,0,20,2.88,4.54,80,100,True,False,14,21.6,8,21,8.0,0.1,10000.0 +1891,-261.2399999999998,41,0.5871942355097655,12,40,72,1.2,9,3,False,0,20,2.21,6.91,64,100,True,True,14,22.9,7,22,6.0,0.1,10000.0 +1892,-4379.500000000004,1093,0.7424705189164651,12,46,64,0.7,6,4,True,0,14,2.98,7.38,96,100,False,False,14,18.3,7,22,8.0,0.1,10000.0 +1893,-1878.3499999999904,415,0.6661340262990441,9,38,32,2.2,6,2,True,0,14,2.18,6.36,80,200,True,True,14,23.8,8,22,8.0,0.1,10000.0 +1894,-3838.5600000000095,973,0.6916829182878127,12,46,64,0.6,10,3,True,0,14,2.3,5.66,80,100,True,False,14,23.7,7,22,6.0,0.1,10000.0 +1895,-5084.969999999987,1374,0.7339046698043599,9,40,64,1.8,6,2,True,0,20,3.06,5.15,80,200,False,False,14,23.1,7,22,6.0,0.1,10000.0 +1896,-301.15999999999804,38,0.6209201334256403,12,46,72,2.4,7,3,False,1,20,2.47,7.33,96,100,False,False,14,24.0,7,21,6.0,0.1,10000.0 +1897,-3778.4899999999952,875,0.6585619533000795,10,44,48,0.8,10,5,True,0,20,2.57,4.59,64,100,False,True,14,23.5,8,22,8.0,0.1,10000.0 +1898,-2257.8200000000006,571,0.7174991804570922,11,46,32,2.4,9,5,True,0,14,2.54,5.51,80,100,True,False,14,22.7,7,22,6.0,0.1,10000.0 +1899,-2997.3700000000035,791,0.6922605431644484,8,52,40,1.1,9,3,True,0,14,2.52,5.37,48,200,False,True,14,23.9,7,21,8.0,0.1,10000.0 +1900,-464.6599999999962,114,0.763189546214376,11,44,64,1.6,7,3,False,1,14,2.97,5.01,64,200,False,False,14,23.8,7,22,8.0,0.1,10000.0 +1901,-1357.3600000000133,438,0.7608062410017745,12,38,56,2.3,6,4,True,1,14,2.42,7.24,64,100,False,True,14,20.8,7,21,6.0,0.1,10000.0 +1902,-3748.459999999998,871,0.7090314918456534,11,42,72,0.7,7,4,True,0,20,2.86,5.54,96,100,True,False,14,19.0,8,22,8.0,0.1,10000.0 +1903,-2192.0099999999984,556,0.714945030937166,9,48,56,1.3,9,5,True,0,14,2.66,4.53,80,200,True,True,14,22.2,8,22,8.0,0.1,10000.0 +1904,-3868.8499999999913,1155,0.7351238441599698,10,42,40,2.3,10,4,True,0,14,2.98,6.97,48,200,False,False,14,18.8,7,22,6.0,0.1,10000.0 +1905,-206.09999999999854,52,0.736137961054424,10,40,72,1.9,6,2,False,0,20,2.37,4.82,64,200,True,False,14,22.1,7,22,6.0,0.1,10000.0 +1906,-4459.959999999994,1231,0.7389291197910477,10,40,56,1.0,7,3,True,0,14,2.5,6.61,96,100,False,False,14,23.1,7,21,6.0,0.1,10000.0 +1907,-4070.110000000005,945,0.6977736095919757,9,40,56,0.6,10,3,True,0,20,2.89,7.05,80,100,True,False,14,23.2,8,22,8.0,0.1,10000.0 +1908,-3883.289999999988,827,0.6630094832792984,9,52,40,0.6,8,3,True,0,14,3.2,6.01,64,100,True,False,14,21.9,8,22,6.0,0.1,10000.0 +1909,-1484.8400000000038,318,0.6623291565278694,8,44,64,0.7,6,3,False,0,20,2.66,5.62,48,100,True,False,14,16.5,7,22,6.0,0.1,10000.0 +1910,-1231.4899999999943,289,0.7010765216335944,10,38,64,0.7,6,3,False,0,20,2.08,6.4,96,200,False,True,14,17.5,7,22,8.0,0.1,10000.0 +1911,-3447.879999999979,705,0.6380410283435916,8,44,72,0.8,6,4,True,1,20,2.8,5.27,64,200,True,False,14,16.8,8,22,6.0,0.1,10000.0 +1912,-1284.5200000000004,316,0.6790818060080347,8,38,48,2.2,6,2,True,1,20,2.13,4.87,80,200,True,True,14,19.6,8,21,6.0,0.1,10000.0 +1913,-2379.589999999994,454,0.6184585635536287,11,42,72,1.9,7,4,True,1,20,2.16,4.76,96,100,False,True,14,22.4,8,22,8.0,0.1,10000.0 +1914,-3206.630000000012,688,0.644942588553143,11,52,72,1.4,8,2,True,1,20,2.56,4.73,64,100,False,True,14,17.8,8,21,6.0,0.1,10000.0 +1915,-2610.4400000000105,472,0.5810425627527765,10,52,40,0.6,8,2,False,0,20,2.41,6.0,48,200,False,False,14,18.2,7,22,8.0,0.1,10000.0 +1916,-1761.3099999999922,529,0.7311284967370147,10,38,40,1.8,6,4,True,0,20,2.74,7.22,48,200,True,True,14,19.1,7,21,8.0,0.1,10000.0 +1917,-4174.299999999993,929,0.6370808232648033,10,46,64,0.9,7,3,True,0,20,2.3,7.33,64,200,True,False,14,16.1,7,22,6.0,0.1,10000.0 +1918,-2892.950000000019,897,0.7574046121593291,10,44,56,1.6,8,3,True,1,20,2.43,6.45,80,100,False,False,14,18.1,7,22,8.0,0.1,10000.0 +1919,-398.769999999995,36,0.5039618862808026,11,52,72,2.4,10,3,False,1,14,3.17,6.9,48,100,True,False,14,21.4,7,22,6.0,0.1,10000.0 +1920,-3152.1799999999994,783,0.6931112670996485,12,46,56,2.0,6,2,True,0,20,2.13,5.83,96,100,True,False,14,23.5,7,22,8.0,0.1,10000.0 +1921,-3664.8000000000065,893,0.729746471395071,11,52,32,1.5,8,4,True,0,14,2.92,5.4,96,100,False,False,14,20.5,8,22,6.0,0.1,10000.0 +1922,-3491.3799999999883,804,0.671717152721884,8,38,32,1.5,9,2,True,0,14,2.39,6.83,80,200,True,False,14,19.7,7,22,8.0,0.1,10000.0 +1923,-957.2099999999973,215,0.6655953158679864,11,52,72,2.3,10,2,True,1,14,2.31,7.38,48,200,True,True,14,20.8,7,22,8.0,0.1,10000.0 +1924,-2149.770000000005,526,0.6871810542398777,12,42,48,1.4,8,2,True,1,14,2.07,6.03,80,100,True,False,14,16.7,8,22,8.0,0.1,10000.0 +1925,-1390.2199999999812,456,0.7707364133347625,10,40,64,2.1,7,5,True,1,14,3.08,5.92,48,100,True,False,14,23.2,8,22,6.0,0.1,10000.0 +1926,-1012.539999999999,464,0.8080885809161347,9,48,56,2.1,9,4,True,1,20,2.25,4.91,48,100,True,False,14,16.6,8,22,6.0,0.1,10000.0 +1927,-3454.6199999999617,890,0.7230081655430759,8,40,64,2.2,6,3,True,0,14,2.59,5.24,96,100,True,False,14,18.9,7,21,6.0,0.1,10000.0 +1928,136.80999999999585,54,1.1779433952447842,10,46,40,1.8,9,5,False,0,20,2.98,6.18,64,200,True,False,14,17.0,8,21,8.0,0.1,10000.0 +1929,-289.2099999999955,26,0.4632430726972403,12,46,48,2.0,9,2,False,0,20,2.38,5.82,80,100,True,True,14,17.0,8,21,6.0,0.1,10000.0 +1930,-3145.8599999999888,667,0.63297963564666,10,46,32,0.9,7,3,True,0,20,2.71,6.98,48,100,False,True,14,23.5,8,21,6.0,0.1,10000.0 +1931,-23.360000000009677,138,0.9882357088539384,10,38,56,1.1,9,2,False,1,20,2.97,5.58,80,100,True,False,14,18.2,8,22,8.0,0.1,10000.0 +1932,-1181.2299999999777,417,0.7574750284875424,11,46,48,2.1,8,5,True,1,14,2.04,5.78,48,100,True,False,14,19.1,7,22,8.0,0.1,10000.0 +1933,-4155.690000000011,961,0.6814679627605513,12,50,40,2.4,9,4,True,0,20,2.56,5.18,80,200,False,False,14,16.2,7,21,6.0,0.1,10000.0 +1934,-1632.619999999999,345,0.6906041540327471,8,46,32,1.4,8,4,True,1,14,2.72,4.63,96,100,False,True,14,22.8,7,21,8.0,0.1,10000.0 +1935,-2190.5700000000033,480,0.6469464787642796,11,38,56,1.6,9,3,True,1,14,2.85,5.39,48,200,True,False,14,17.1,7,21,8.0,0.1,10000.0 +1936,-1317.8599999999878,621,0.8507852721420023,9,46,48,2.4,9,4,True,1,14,2.51,6.86,96,200,False,False,14,21.8,8,22,8.0,0.1,10000.0 +1937,-1225.3700000000117,279,0.7210287629255588,12,48,56,2.0,6,3,True,1,14,2.87,5.98,80,100,True,True,14,16.9,7,21,6.0,0.1,10000.0 +1938,-936.7199999999921,321,0.798465990382857,10,38,40,0.9,7,5,False,0,20,2.46,5.89,80,100,False,False,14,23.8,8,22,8.0,0.1,10000.0 +1939,-1353.0899999999929,170,0.5233702142049478,10,40,32,0.8,9,3,False,0,14,3.16,5.55,64,100,False,True,14,20.8,7,22,8.0,0.1,10000.0 +1940,-2125.240000000019,612,0.7274896618047765,10,48,40,2.1,10,3,True,0,20,2.58,5.32,64,100,True,True,14,18.1,7,22,6.0,0.1,10000.0 +1941,-102.80000000000473,45,0.850778766457157,9,52,64,2.4,10,5,False,1,14,2.1,7.38,48,100,True,False,14,19.0,8,22,6.0,0.1,10000.0 +1942,-112.32000000000335,64,0.9030236051872702,8,46,40,2.3,8,5,False,1,20,3.17,7.28,80,100,True,False,14,18.9,8,22,6.0,0.1,10000.0 +1943,-2689.2600000000084,550,0.6377452122737136,8,38,48,0.9,10,3,True,1,20,2.27,6.5,80,100,True,True,14,17.7,7,22,8.0,0.1,10000.0 +1944,-3095.330000000021,885,0.7188624543824624,9,40,40,1.7,7,4,True,1,20,2.62,4.66,64,200,False,False,14,20.9,7,21,8.0,0.1,10000.0 +1945,-2544.9899999999934,648,0.6472180713772826,12,38,32,1.7,9,3,True,0,20,2.1,4.97,48,200,True,False,14,18.0,8,22,6.0,0.1,10000.0 +1946,-4726.660000000002,1029,0.6197631212075139,9,44,40,0.7,8,5,True,0,20,2.43,6.87,48,100,True,False,14,16.1,7,22,6.0,0.1,10000.0 +1947,-416.0399999999936,64,0.6246752309468823,12,46,32,1.4,6,3,False,0,14,3.14,7.3,48,200,False,True,14,20.4,8,22,8.0,0.1,10000.0 +1948,-227.149999999996,80,0.8252167958079732,10,48,72,1.6,6,4,False,0,20,2.4,5.39,96,100,True,False,14,19.3,8,22,6.0,0.1,10000.0 +1949,-577.7500000000073,104,0.681093582681077,11,42,64,1.4,8,2,False,0,20,2.92,4.9,80,100,False,True,14,18.2,8,21,8.0,0.1,10000.0 +1950,-136.71000000000095,43,0.8088399798646457,11,42,32,1.5,9,4,False,0,20,2.73,5.1,80,100,True,True,14,22.0,8,22,8.0,0.1,10000.0 +1951,-268.9899999999998,55,0.6991499832233531,8,52,64,2.3,10,5,False,1,20,2.64,5.84,48,100,True,False,14,21.2,8,22,6.0,0.1,10000.0 +1952,-13.639999999992142,77,0.9889375506893756,11,46,32,1.5,10,3,False,1,20,2.65,7.18,64,200,True,False,14,16.6,7,22,6.0,0.1,10000.0 +1953,-4725.320000000009,1125,0.6599456813507409,8,50,72,1.0,10,3,True,0,20,2.66,5.31,48,200,True,False,14,21.0,7,22,8.0,0.1,10000.0 +1954,-2047.2200000000103,497,0.7071609826432498,8,52,48,1.3,10,3,True,1,14,2.91,7.0,64,100,True,False,14,23.7,8,21,6.0,0.1,10000.0 +1955,-2162.460000000018,673,0.7638119329333626,10,50,56,2.5,6,3,True,0,14,2.66,5.52,80,100,True,False,14,17.1,8,21,8.0,0.1,10000.0 +1956,-3422.079999999977,821,0.6738596313994736,11,50,32,0.5,10,2,True,0,14,2.49,6.32,64,100,True,False,14,16.6,7,22,8.0,0.1,10000.0 +1957,-380.0500000000011,106,0.7552690720122607,9,42,64,1.5,9,4,False,1,20,3.04,6.91,48,200,True,False,14,16.4,8,22,8.0,0.1,10000.0 +1958,-3909.04999999999,805,0.6651189288054861,8,46,40,1.0,9,2,True,0,14,2.88,6.48,80,200,True,False,14,20.5,7,22,6.0,0.1,10000.0 +1959,-1683.370000000008,278,0.6121651541437139,12,52,56,0.9,6,4,True,1,20,2.96,7.0,80,200,True,True,14,19.5,7,21,8.0,0.1,10000.0 +1960,-750.7199999999939,193,0.7445757389141611,12,52,48,0.6,7,5,False,0,14,2.75,5.25,96,100,True,False,14,21.7,7,21,6.0,0.1,10000.0 +1961,-3533.979999999983,762,0.6038569796782188,9,44,72,0.9,10,3,True,0,14,2.02,6.6,48,100,True,True,14,21.6,8,22,8.0,0.1,10000.0 +1962,-1518.6999999999698,374,0.6989710665744306,10,50,56,2.3,9,2,True,1,20,2.13,7.35,96,200,True,False,14,18.5,7,21,6.0,0.1,10000.0 +1963,45.340000000000146,70,1.0380653340161698,11,46,48,1.4,9,5,False,0,20,3.12,6.95,96,200,True,False,14,19.8,8,21,8.0,0.1,10000.0 +1964,84.40999999999804,68,1.0880913369720624,9,38,64,1.8,8,3,False,0,20,2.4,5.46,64,100,True,False,14,16.5,8,21,8.0,0.1,10000.0 +1965,-3831.3899999999967,779,0.6129568962120914,9,52,48,1.1,8,3,True,0,20,2.09,6.6,80,100,True,True,14,17.4,8,21,8.0,0.1,10000.0 +1966,-3459.629999999981,875,0.6594443427261935,10,38,32,1.3,9,3,True,0,20,2.24,4.61,64,100,True,False,14,16.4,7,21,6.0,0.1,10000.0 +1967,-2832.250000000001,451,0.5839417452338211,9,38,32,0.7,6,4,False,0,20,2.42,6.01,80,200,False,False,14,18.6,7,22,8.0,0.1,10000.0 +1968,-1832.8499999999785,442,0.698902951091135,9,50,32,1.2,8,3,True,1,20,3.12,5.54,64,200,True,False,14,23.7,7,22,6.0,0.1,10000.0 +1969,-1854.3700000000235,638,0.8028983258203756,9,48,48,2.4,9,5,True,1,14,2.97,6.13,80,200,False,False,14,16.5,7,22,8.0,0.1,10000.0 +1970,-12.929999999994834,36,0.9760409138918229,8,40,64,1.7,10,2,False,0,14,2.32,5.77,80,200,True,True,14,23.6,7,22,8.0,0.1,10000.0 +1971,-40.109999999996944,47,0.9426163838736444,9,50,64,2.2,6,5,False,0,14,2.52,6.19,48,100,True,False,14,21.2,8,21,6.0,0.1,10000.0 +1972,-2742.479999999995,851,0.7248495063809294,12,48,72,2.0,7,2,True,1,20,2.19,7.25,48,200,False,False,14,20.6,8,22,8.0,0.1,10000.0 +1973,-7343.600000000008,1808,0.6647959521358783,9,46,72,1.0,7,3,True,0,20,2.4,5.72,64,100,False,False,14,16.3,7,22,6.0,0.1,10000.0 +1974,-3388.2600000000066,681,0.60704390495089,9,50,40,1.1,10,2,True,0,14,2.06,5.98,80,200,True,True,14,18.2,7,21,6.0,0.1,10000.0 +1975,-3617.649999999988,696,0.5739053620329202,10,46,40,2.0,8,2,True,0,20,2.02,7.36,64,100,True,True,14,16.4,8,21,6.0,0.1,10000.0 +1976,-3579.019999999994,931,0.6942163729599586,10,46,32,1.1,7,2,True,1,14,2.56,4.79,64,100,False,False,14,21.6,7,21,8.0,0.1,10000.0 +1977,-2596.569999999985,783,0.7644787469681933,11,44,56,1.4,8,4,True,0,14,2.53,5.83,96,100,True,False,14,18.5,7,22,8.0,0.1,10000.0 +1978,-962.6999999999935,144,0.6040406200772422,8,42,56,1.3,6,4,False,0,14,2.96,6.23,64,200,True,False,14,21.7,7,21,8.0,0.1,10000.0 +1979,61.76000000000204,62,1.0697183496077214,8,40,40,2.3,7,3,False,0,20,2.19,6.36,80,100,True,False,14,19.8,7,21,6.0,0.1,10000.0 +1980,-1612.2600000000039,351,0.6775163966068675,12,38,40,1.4,6,2,True,0,20,2.72,6.2,80,200,True,True,14,23.4,8,21,6.0,0.1,10000.0 +1981,-1390.5399999999954,226,0.5942410439420953,8,50,72,0.9,7,2,False,0,20,2.72,4.64,80,200,True,False,14,18.0,7,22,8.0,0.1,10000.0 +1982,38.30999999999767,47,1.055679093089165,10,46,40,2.1,10,5,False,0,20,2.18,6.57,48,100,True,True,14,17.2,8,22,6.0,0.1,10000.0 +1983,-830.6899999999969,141,0.6130926874708896,10,42,56,1.5,10,5,False,0,20,2.13,6.3,64,100,False,False,14,17.7,7,21,6.0,0.1,10000.0 +1984,-208.39000000000306,70,0.8189644687690036,8,50,40,1.8,7,4,False,1,20,2.77,5.93,96,200,True,False,14,19.0,8,21,8.0,0.1,10000.0 +1985,-4565.030000000007,1002,0.673308748755683,9,46,56,1.8,7,4,True,0,14,2.26,6.64,96,200,False,True,14,19.3,8,21,8.0,0.1,10000.0 +1986,-2078.599999999994,539,0.6913110888018961,10,50,72,0.9,6,5,True,0,14,2.38,7.46,48,200,True,True,14,22.7,8,22,8.0,0.1,10000.0 +1987,-992.2800000000207,233,0.7207079406897017,10,48,64,1.3,9,2,True,1,14,2.85,5.84,80,100,True,True,14,22.7,8,22,6.0,0.1,10000.0 +1988,-2991.4400000000032,621,0.6489946013430348,8,38,64,0.8,7,4,True,1,20,2.41,5.94,80,100,True,True,14,17.0,8,22,8.0,0.1,10000.0 +1989,-4125.930000000018,883,0.6366628066204929,8,46,32,1.1,9,4,True,0,14,2.74,5.92,48,100,True,False,14,17.4,7,21,6.0,0.1,10000.0 +1990,-478.0500000000011,39,0.4056248368125925,12,44,48,1.8,7,4,False,0,14,2.2,6.41,48,100,False,True,14,21.3,8,22,6.0,0.1,10000.0 +1991,-1755.8300000000017,360,0.6556520886448324,12,46,32,1.4,9,4,True,1,14,3.11,5.9,64,200,True,False,14,19.7,7,21,8.0,0.1,10000.0 +1992,-1481.1599999999999,322,0.6516302928952958,12,42,48,1.1,9,5,True,1,20,2.83,5.17,48,200,True,True,14,19.3,7,22,6.0,0.1,10000.0 +1993,-1918.4999999999936,399,0.6594582217275773,12,48,48,1.7,8,5,True,1,20,2.95,5.63,64,100,True,False,14,19.6,7,22,6.0,0.1,10000.0 +1994,-4736.3099999999795,1356,0.716150325003386,10,50,64,2.1,10,3,True,0,20,2.56,5.08,64,200,False,False,14,23.0,8,22,8.0,0.1,10000.0 +1995,-2192.6600000000035,613,0.7744520381670281,8,38,48,0.7,8,5,True,1,14,3.18,7.11,96,100,False,True,14,19.1,8,21,8.0,0.1,10000.0 +1996,-1841.5499999999865,686,0.7818825928913303,10,46,32,2.0,10,4,True,1,20,2.75,5.47,48,100,False,False,14,18.2,7,21,6.0,0.1,10000.0 +1997,-1470.400000000005,436,0.7452096856361613,12,44,64,0.6,9,3,True,0,20,2.7,6.91,64,200,True,True,14,23.8,7,21,6.0,0.1,10000.0 +1998,-663.2399999999889,250,0.787538841016113,9,42,32,0.7,7,2,False,0,14,2.04,6.38,64,100,True,False,14,17.7,7,21,8.0,0.1,10000.0 +1999,-3512.0799999999963,903,0.6847644718264665,9,40,48,2.0,10,3,True,0,20,2.05,5.23,96,200,True,False,14,22.7,7,22,6.0,0.1,10000.0 +2000,-1950.71,579,0.7021830434364422,9,40,72,2.0,9,4,True,1,14,2.01,4.52,48,100,True,False,14,23.0,7,21,8.0,0.1,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_curated.json b/lab/EAs/SimpleEMA/portfolio_curated.json new file mode 100644 index 0000000..4468f5e --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_curated.json @@ -0,0 +1,13 @@ +{ + "timeframe": "M15", + "period": ["2020-01-01", "2026-01-01"], + "lot_per_symbol": 0.05, + "initial_balance": 10000, + "comment": "Symbols with net>0 under v5 best params in full 20-symbol scan", + "symbols": [ + {"name": "EURUSD", "max_spread_pips": 6}, + {"name": "USDCAD", "max_spread_pips": 8}, + {"name": "CHFJPY", "max_spread_pips": 10}, + {"name": "XAUUSD", "max_spread_pips": 35} + ] +} diff --git a/lab/EAs/SimpleEMA/portfolio_enabled.json b/lab/EAs/SimpleEMA/portfolio_enabled.json new file mode 100644 index 0000000..8f82597 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_enabled.json @@ -0,0 +1,17 @@ +{ + "symbols": [ + "EURUSD", + "USDJPY", + "USDCHF", + "USDCAD", + "AUDUSD", + "NZDUSD", + "EURAUD", + "EURNZD", + "CADJPY", + "CHFJPY", + "XAUUSD", + "XAGUSD" + ], + "symbol_list": "EURUSD,USDJPY,USDCHF,USDCAD,AUDUSD,NZDUSD,EURAUD,EURNZD,CADJPY,CHFJPY,XAUUSD,XAGUSD" +} \ No newline at end of file diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDCAD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDCAD.csv new file mode 100644 index 0000000..47b865b --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDCAD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-110.28000000000065,39,0.5792927173539847,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-311.3500000000022,54,0.19310112476027574,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-362.1099999999951,96,0.3993663747346072,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-447.9700000000048,89,0.24922906750687138,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-449.369999999999,127,0.4409847485880626,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-421.34999999999854,90,0.3752965247301625,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-110.28000000000065,39,0.5792927173539847,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-134.1600000000053,61,0.6397035127296165,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDJPY.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDJPY.csv new file mode 100644 index 0000000..62943f1 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDJPY.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDNZD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDNZD.csv new file mode 100644 index 0000000..eeefd98 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDNZD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDUSD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDUSD.csv new file mode 100644 index 0000000..dc4b8af --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/AUDUSD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +31.3600000000024,45,1.0801226366888095,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-225.25,53,0.5714584680948214,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-221.25,93,0.6614228656250477,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-343.88000000000466,82,0.5463025265518834,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-382.10999999998967,103,0.550543427119601,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-486.17999999999483,110,0.4846130198339923,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +31.3600000000024,45,1.0801226366888095,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-185.2300000000032,69,0.6750977881461472,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/BTCUSD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/BTCUSD.csv new file mode 100644 index 0000000..0a46aac --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/BTCUSD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/CADJPY.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/CADJPY.csv new file mode 100644 index 0000000..d7067de --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/CADJPY.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-195.99999999999454,106,0.7380484610347086,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-114.0999999999949,101,0.8240527995805641,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-22.36999999999898,176,0.978853734390804,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-138.34999999999854,144,0.8424259681093393,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-109.89999999999782,236,0.9298507653224056,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-485.0399999999845,215,0.6665383346166538,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-195.99999999999454,106,0.7380484610347086,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-244.75000000000364,112,0.6918321350776243,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/CHFJPY.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/CHFJPY.csv new file mode 100644 index 0000000..2679e20 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/CHFJPY.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-37.310000000008586,167,0.9715190839694657,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-132.1500000000069,158,0.8920889745390408,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-126.82999999999447,264,0.9343727038466714,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-60.76000000001477,219,0.9613996747306364,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-419.0399999999936,397,0.8611544616852714,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-495.47999999999774,298,0.7873394251280094,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-37.310000000008586,167,0.9715190839694657,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +118.78999999998814,202,1.0795374654337768,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/ETHUSD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/ETHUSD.csv new file mode 100644 index 0000000..da71cba --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/ETHUSD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-37.52999999997155,581,0.9406621553250696,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,40,0.05,10000.0 +12.130000000026484,520,1.0225012985085702,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 +-25.779999999987922,609,0.9600055849454691,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 +8.300000000024738,623,1.0127064803049555,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 +-47.239999999992506,967,0.9550489095268906,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 +-11.299999999988358,879,0.9879732217929478,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,40,0.05,10000.0 +-37.52999999997155,581,0.9406621553250696,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,40,0.05,10000.0 +2.5900000000165164,651,1.0037679852190233,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/EURAUD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURAUD.csv new file mode 100644 index 0000000..0424d40 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURAUD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +27.510000000003856,121,1.0273595226255594,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +100.38000000000466,140,1.0877547273728658,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-115.15000000000146,209,0.9341458114105322,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-47.6200000000008,199,0.9709089576218897,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-769.7800000000152,308,0.711436743476419,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-362.87000000000444,267,0.8307651409862978,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +27.510000000003856,121,1.0273595226255594,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-93.68000000000029,159,0.9319186046511627,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/EURCAD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURCAD.csv new file mode 100644 index 0000000..a130fd9 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURCAD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-760.1799999999967,118,0.31101302420853233,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-557.9200000000092,121,0.45817228318927844,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-1046.2100000000046,217,0.40275954194115565,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-634.0300000000043,182,0.5551291046870614,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-1294.480000000005,307,0.45653241753397517,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-1074.949999999988,271,0.4769074302064731,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-760.1799999999967,118,0.31101302420853233,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-754.6500000000015,173,0.47672241637543683,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/EURCHF.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURCHF.csv new file mode 100644 index 0000000..3fbf3ee --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURCHF.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-172.94999999999527,33,0.4750978785395611,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-28.830000000003565,40,0.914145324597975,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-315.2799999999952,88,0.6059886525531756,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-131.36000000000604,64,0.7497237358533704,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-551.079999999989,112,0.4351489309362252,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-105.76999999999498,82,0.8378780214895541,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-172.94999999999527,33,0.4750978785395611,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-61.55999999999585,47,0.8444511825348696,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/EURGBP.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURGBP.csv new file mode 100644 index 0000000..cc26259 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURGBP.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-237.6600000000053,21,0.12299346839366765,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-198.5900000000056,20,0.040257104194857916,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-433.27000000000226,62,0.18429475111077642,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-344.62000000000444,39,0.14079134358872075,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-487.76000000000386,68,0.23462214411247806,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-334.0000000000109,74,0.46306566996222176,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-237.6600000000053,21,0.12299346839366765,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-165.7300000000032,24,0.2984379630021589,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/EURJPY.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURJPY.csv new file mode 100644 index 0000000..62943f1 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURJPY.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/EURNZD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURNZD.csv new file mode 100644 index 0000000..06924af --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURNZD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-258.3199999999888,132,0.7675054901537244,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-269.8600000000006,151,0.7808581822906516,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-389.85000000000036,227,0.7649509523149182,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-377.3600000000006,214,0.7693539514699591,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-792.2199999999957,343,0.7002550151722676,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-548.2499999999891,274,0.7448089034113918,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-258.3199999999888,132,0.7675054901537244,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-98.97999999999956,188,0.9275142620705816,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/EURUSD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURUSD.csv new file mode 100644 index 0000000..39d2faa --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/EURUSD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +119.62999999999374,79,1.2306831986733258,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,6,0.05,10000.0 +89.0599999999904,78,1.1675761110902043,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6,0.05,10000.0 +-270.96000000001004,147,0.7672364917103343,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6,0.05,10000.0 +-133.68000000001302,129,0.8581704755235853,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6,0.05,10000.0 +-733.6100000000006,228,0.5994813419594355,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6,0.05,10000.0 +-215.0100000000166,192,0.8485151653926093,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,6,0.05,10000.0 +119.62999999999374,79,1.2306831986733258,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,6,0.05,10000.0 +-305.86000000000604,127,0.7057255837670897,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,6,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPAUD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPAUD.csv new file mode 100644 index 0000000..eeefd98 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPAUD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPCAD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPCAD.csv new file mode 100644 index 0000000..eeefd98 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPCAD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPCHF.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPCHF.csv new file mode 100644 index 0000000..09b52d1 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPCHF.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-488.74999999999454,59,0.39164042370455193,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-559.4299999999967,90,0.46937246272337524,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-682.5800000000036,147,0.5511645339891372,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-854.119999999999,143,0.4567357842513675,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-1456.2400000000107,196,0.38183330927861314,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-680.0999999999931,153,0.605937874810965,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-488.74999999999454,59,0.39164042370455193,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-681.9100000000017,106,0.44951321504109015,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPJPY.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPJPY.csv new file mode 100644 index 0000000..eeefd98 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPJPY.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPNZD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPNZD.csv new file mode 100644 index 0000000..3805e2d --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPNZD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,14,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,14,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,14,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,14,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,14,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,14,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,14,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,14,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPUSD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPUSD.csv new file mode 100644 index 0000000..8522e73 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/GBPUSD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/GER40.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/GER40.csv new file mode 100644 index 0000000..50ac457 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/GER40.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/JPN225.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/JPN225.csv new file mode 100644 index 0000000..bb82946 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/JPN225.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,25,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,25,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,25,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,25,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,25,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,25,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,25,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,25,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/NAS100.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/NAS100.csv new file mode 100644 index 0000000..50ac457 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/NAS100.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/NZDCAD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/NZDCAD.csv new file mode 100644 index 0000000..114c42b --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/NZDCAD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-147.52000000000044,37,0.42019415949377037,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-143.32999999999447,41,0.5063714010194241,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-110.46999999999389,92,0.7793821021308889,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-259.5099999999911,71,0.4239895234501587,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-233.81999999999425,101,0.5873643342451248,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-410.3399999999983,116,0.43947217441193354,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-147.52000000000044,37,0.42019415949377037,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-132.0,48,0.5711640297586174,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/NZDJPY.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/NZDJPY.csv new file mode 100644 index 0000000..f9cca42 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/NZDJPY.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-251.67999999999847,77,0.5514125300775332,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-205.79999999999927,69,0.5928702842786208,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-455.22000000000116,142,0.5254417513682564,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-316.83000000000175,109,0.5833048373096246,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-555.4400000000096,180,0.5657877250447548,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 +-581.0600000000122,150,0.5128319066343597,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-251.67999999999847,77,0.5514125300775332,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,12,0.05,10000.0 +-212.73000000000502,85,0.6383250025502397,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,12,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/NZDUSD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/NZDUSD.csv new file mode 100644 index 0000000..31aacc6 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/NZDUSD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-40.8799999999992,39,0.8587422252937112,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-140.14999999999964,45,0.5754831283697825,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-141.51000000000386,78,0.7217875117961623,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-212.96000000000095,71,0.5653700151026572,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-129.14999999999236,104,0.81636570453576,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 +-143.25999999999476,94,0.773948717948718,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-40.8799999999992,39,0.8587422252937112,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,10,0.05,10000.0 +-157.84000000000196,55,0.63109428317674,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,10,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/UK100.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/UK100.csv new file mode 100644 index 0000000..50ac457 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/UK100.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/US30.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/US30.csv new file mode 100644 index 0000000..50ac457 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/US30.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,20,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,20,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/US500.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/US500.csv new file mode 100644 index 0000000..c18f1e3 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/US500.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,15,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,15,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,15,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,15,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,15,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,15,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,15,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,15,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/USDCAD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/USDCAD.csv new file mode 100644 index 0000000..f771ca3 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/USDCAD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +26.32999999999629,96,1.051585979898513,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-176.65000000001055,95,0.7097293655618909,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-255.6600000000053,151,0.7102149075081611,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-255.65000000000327,148,0.7142362120229818,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-348.20000000001346,198,0.6955122599601246,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-165.95000000001528,185,0.8287480392966236,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +26.32999999999629,96,1.051585979898513,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-39.36000000000786,108,0.9352109430297444,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/USDCHF.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/USDCHF.csv new file mode 100644 index 0000000..9a89c97 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/USDCHF.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-467.61999999999716,64,0.36450858882365733,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-167.1200000000008,70,0.7559543801749441,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-558.049999999992,124,0.5365764538818625,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-411.78000000000065,112,0.6198591250242331,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-518.3000000000047,169,0.6779405094045349,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-420.1699999999946,131,0.6876593593660563,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-467.61999999999716,64,0.36450858882365733,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-400.53999999999905,102,0.5986211181369061,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/USDJPY.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/USDJPY.csv new file mode 100644 index 0000000..64dca91 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/USDJPY.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-217.90000000000146,141,0.8350741749924311,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-333.6500000000033,135,0.7602451801125298,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-275.03999999999905,207,0.8479139594680528,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-738.6500000000015,192,0.6217811845548062,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-562.4100000000035,313,0.810253036437247,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 +-1048.5599999999977,265,0.60381764185804,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-217.90000000000146,141,0.8350741749924311,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,8,0.05,10000.0 +-277.0500000000011,174,0.836323677976215,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,8,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/XAGUSD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/XAGUSD.csv new file mode 100644 index 0000000..a8daed0 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/XAGUSD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +72.83000000000538,82,1.0980769748713943,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,40,0.05,10000.0 +-91.79999999999927,80,0.8897522427852571,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 +-260.2499999999982,143,0.8008143459592674,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 +68.93000000000575,131,1.057337980485289,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 +288.44000000000415,216,1.1515441276913216,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 +402.97000000000116,191,1.2250575251882136,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,40,0.05,10000.0 +72.83000000000538,82,1.0980769748713943,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,40,0.05,10000.0 +29.57999999999447,98,1.0319224709158015,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,40,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/XAUUSD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/XAUUSD.csv new file mode 100644 index 0000000..dc3c41c --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/XAUUSD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +-1280.2799999999788,475,0.9164232809482838,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,35,0.05,10000.0 +37.57000000000153,414,1.0028611921964161,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,35,0.05,10000.0 +-704.1400000000103,479,0.9551623703692383,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,35,0.05,10000.0 +-167.0600000000013,485,0.988970345506931,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,35,0.05,10000.0 +3259.9800000000014,760,1.144396538359663,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,35,0.05,10000.0 +787.6299999999901,705,1.0369065296672495,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,35,0.05,10000.0 +-1280.2799999999788,475,0.9164232809482838,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,35,0.05,10000.0 +-703.3600000000079,529,0.9582755441868964,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,35,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_opt_trials/XPTUSD.csv b/lab/EAs/SimpleEMA/portfolio_opt_trials/XPTUSD.csv new file mode 100644 index 0000000..0a46aac --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_opt_trials/XPTUSD.csv @@ -0,0 +1,9 @@ +net,trades,pf,fast_ema,slow_ema,trend_leg_bars,min_ema_gap_pips,cross_cooldown,pullback_cooldown,use_pullback,pullback_touch,pullback_adx_min,pullback_min_gap_pips,max_pullbacks_per_leg,atr_period,atr_sl_mult,atr_tp_mult,max_bars_in_trade,htf_ema_period,use_htf_filter,use_adx_filter,adx_period,adx_min,session_start,session_end,max_spread_pips,lot_size,initial_balance +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,10,46,48,1.5,8,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,7,46,48,1.5,5,3,False,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,10,46,56,1.5,8,6,True,1,22.0,2.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,8,30,48,1.5,2,2,True,0,0.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,9,34,48,1.5,3,2,True,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,10,36,48,1.5,2,3,False,0,0.0,0.0,1,20,2.71,6.36,64,100,True,False,14,18.0,8,22,50,0.05,10000.0 +0.0,0,0.0,11,40,48,1.5,4,3,True,1,20.0,0.0,1,20,2.71,6.36,64,200,True,False,14,18.0,8,22,50,0.05,10000.0 diff --git a/lab/EAs/SimpleEMA/portfolio_params.json b/lab/EAs/SimpleEMA/portfolio_params.json new file mode 100644 index 0000000..6aff03f --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_params.json @@ -0,0 +1,19518 @@ +{ + "version": 5, + "mode": "mt5_preset_sweep", + "optimized_at": "2026-06-22T05:17:55", + "config": { + "timeframe": "M15", + "period": [ + "2020-01-01", + "2026-01-01" + ], + "lot_per_symbol": 0.05, + "initial_balance": 10000, + "categories": { + "majors": [ + "EURUSD", + "GBPUSD", + "USDJPY", + "USDCHF", + "USDCAD", + "AUDUSD", + "NZDUSD" + ], + "crosses": [ + "EURGBP", + "EURJPY", + "GBPJPY", + "EURCHF", + "GBPCHF", + "EURAUD", + "EURNZD", + "EURCAD", + "GBPAUD", + "GBPNZD", + "GBPCAD", + "AUDNZD", + "AUDCAD", + "NZDCAD" + ], + "jpy_cross": [ + "AUDJPY", + "NZDJPY", + "CADJPY", + "CHFJPY" + ], + "metals": [ + "XAUUSD", + "XAGUSD", + "XPTUSD", + "XPDUSD" + ], + "indices": [ + "US500", + "NAS100", + "US30", + "GER40", + "UK100", + "JPN225" + ], + "crypto": [ + "BTCUSD", + "ETHUSD" + ], + "commodities": [ + "XTIUSD", + "XBRUSD" + ], + "cnh": [ + "USDCNH" + ] + }, + "symbols": [ + { + "name": "EURUSD", + "max_spread_pips": 6, + "category": "majors" + }, + { + "name": "GBPUSD", + "max_spread_pips": 8, + "category": "majors" + }, + { + "name": "USDJPY", + "max_spread_pips": 8, + "category": "majors" + }, + { + "name": "USDCHF", + "max_spread_pips": 8, + "category": "majors" + }, + { + "name": "USDCAD", + "max_spread_pips": 8, + "category": "majors" + }, + { + "name": "AUDUSD", + "max_spread_pips": 8, + "category": "majors" + }, + { + "name": "NZDUSD", + "max_spread_pips": 10, + "category": "majors" + }, + { + "name": "EURGBP", + "max_spread_pips": 8, + "category": "crosses" + }, + { + "name": "EURJPY", + "max_spread_pips": 10, + "category": "crosses" + }, + { + "name": "GBPJPY", + "max_spread_pips": 12, + "category": "crosses" + }, + { + "name": "EURCHF", + "max_spread_pips": 10, + "category": "crosses" + }, + { + "name": "GBPCHF", + "max_spread_pips": 12, + "category": "crosses" + }, + { + "name": "EURAUD", + "max_spread_pips": 10, + "category": "crosses" + }, + { + "name": "EURNZD", + "max_spread_pips": 12, + "category": "crosses" + }, + { + "name": "EURCAD", + "max_spread_pips": 10, + "category": "crosses" + }, + { + "name": "GBPAUD", + "max_spread_pips": 12, + "category": "crosses" + }, + { + "name": "GBPNZD", + "max_spread_pips": 14, + "category": "crosses" + }, + { + "name": "GBPCAD", + "max_spread_pips": 12, + "category": "crosses" + }, + { + "name": "AUDNZD", + "max_spread_pips": 12, + "category": "crosses" + }, + { + "name": "AUDCAD", + "max_spread_pips": 12, + "category": "crosses" + }, + { + "name": "NZDCAD", + "max_spread_pips": 12, + "category": "crosses" + }, + { + "name": "AUDJPY", + "max_spread_pips": 10, + "category": "jpy_cross" + }, + { + "name": "NZDJPY", + "max_spread_pips": 12, + "category": "jpy_cross" + }, + { + "name": "CADJPY", + "max_spread_pips": 10, + "category": "jpy_cross" + }, + { + "name": "CHFJPY", + "max_spread_pips": 10, + "category": "jpy_cross" + }, + { + "name": "XAUUSD", + "max_spread_pips": 35, + "category": "metals" + }, + { + "name": "XAGUSD", + "max_spread_pips": 40, + "category": "metals" + }, + { + "name": "XPTUSD", + "max_spread_pips": 50, + "category": "metals" + }, + { + "name": "XPDUSD", + "max_spread_pips": 80, + "category": "metals" + }, + { + "name": "US500", + "max_spread_pips": 15, + "category": "indices" + }, + { + "name": "NAS100", + "max_spread_pips": 20, + "category": "indices" + }, + { + "name": "US30", + "max_spread_pips": 20, + "category": "indices" + }, + { + "name": "GER40", + "max_spread_pips": 20, + "category": "indices" + }, + { + "name": "UK100", + "max_spread_pips": 20, + "category": "indices" + }, + { + "name": "JPN225", + "max_spread_pips": 25, + "category": "indices" + }, + { + "name": "BTCUSD", + "max_spread_pips": 50, + "category": "crypto" + }, + { + "name": "ETHUSD", + "max_spread_pips": 40, + "category": "crypto" + }, + { + "name": "XTIUSD", + "max_spread_pips": 30, + "category": "commodities" + }, + { + "name": "XBRUSD", + "max_spread_pips": 30, + "category": "commodities" + }, + { + "name": "USDCNH", + "max_spread_pips": 15, + "category": "cnh" + } + ] + }, + "selection_source": "mt5_strategy_tester", + "members": [ + { + "requested": "AUDCAD", + "symbol": "AUDCAD", + "enabled": false, + "max_spread_pips": 12, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": -48.94, + "total_trades": 23, + "profit_factor": 0.84, + "preset_id": 8, + "score": -45.489999999999995 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -886.82, + "total_trades": 77, + "profit_factor": 0.37, + "score": -875.27, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "ready": false + }, + { + "preset": 3, + "ready": false + }, + { + "preset": 4, + "ready": false + }, + { + "preset": 5, + "ready": false + }, + { + "preset": 6, + "ready": false + }, + { + "preset": 7, + "ready": false + }, + { + "preset": 8, + "net_profit": -48.94, + "total_trades": 23, + "profit_factor": 0.84, + "score": -45.49, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "ready": false + }, + { + "preset": 10, + "ready": false + }, + { + "preset": 11, + "ready": false + }, + { + "preset": 12, + "ready": false + }, + { + "preset": 13, + "ready": false + }, + { + "preset": 14, + "net_profit": -886.82, + "total_trades": 77, + "profit_factor": 0.37, + "score": -875.27, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 15, + "net_profit": -368.55, + "total_trades": 39, + "profit_factor": 0.43, + "score": -362.7, + "params": { + "fast_ema": 7, + "slow_ema": 24, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 16, + "ready": false + }, + { + "preset": 17, + "ready": false + }, + { + "preset": 18, + "ready": false + } + ], + "mt5_status": "no_mt5_run" + }, + { + "requested": "AUDJPY", + "symbol": "AUDJPY", + "enabled": true, + "max_spread_pips": 10, + "params": { + "fast_ema": 7, + "slow_ema": 24, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 23.3, + "total_trades": 56, + "profit_factor": 1.02 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -421.37, + "total_trades": 41, + "profit_factor": 0.58, + "score": -415.22, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -320.95, + "total_trades": 42, + "profit_factor": 0.67, + "score": -314.65, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -718.49, + "total_trades": 46, + "profit_factor": 0.43, + "score": -711.59, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "ready": false + }, + { + "preset": 5, + "net_profit": -593.72, + "total_trades": 93, + "profit_factor": 0.73, + "score": -579.77, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -863.79, + "total_trades": 91, + "profit_factor": 0.62, + "score": -850.14, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -764.79, + "total_trades": 83, + "profit_factor": 0.64, + "score": -752.34, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -243.62, + "total_trades": 34, + "profit_factor": 0.67, + "score": -238.52, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -397.79, + "total_trades": 58, + "profit_factor": 0.7, + "score": -389.09, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -828.27, + "total_trades": 68, + "profit_factor": 0.53, + "score": -818.07, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -280.58, + "total_trades": 31, + "profit_factor": 0.6, + "score": -275.93, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -705.97, + "total_trades": 101, + "profit_factor": 0.71, + "score": -690.82, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -148.12, + "total_trades": 47, + "profit_factor": 0.86, + "score": -141.07, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -787.94, + "total_trades": 99, + "profit_factor": 0.68, + "score": -773.09, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 15, + "net_profit": 23.3, + "total_trades": 56, + "profit_factor": 1.02, + "score": 583.3, + "params": { + "fast_ema": 7, + "slow_ema": 24, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 16, + "net_profit": -222.57, + "total_trades": 58, + "profit_factor": 0.83, + "score": -213.87, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 17, + "net_profit": -842.06, + "total_trades": 103, + "profit_factor": 0.67, + "score": -826.61, + "params": { + "fast_ema": 7, + "slow_ema": 22, + "trend_leg_bars": 72, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 18, + "net_profit": -744.61, + "total_trades": 107, + "profit_factor": 0.7, + "score": -728.56, + "params": { + "fast_ema": 9, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "AUDNZD", + "symbol": "AUDNZD", + "enabled": true, + "max_spread_pips": 12, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 98.68, + "total_trades": 66, + "profit_factor": 1.16 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 17.99, + "total_trades": 19, + "profit_factor": 1.1, + "score": 207.99, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -62.98, + "total_trades": 25, + "profit_factor": 0.78, + "score": -59.23, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 93.73, + "total_trades": 21, + "profit_factor": 1.5, + "score": 303.73, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -33.16, + "total_trades": 21, + "profit_factor": 0.86, + "score": -30.01, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 53.12, + "total_trades": 61, + "profit_factor": 1.09, + "score": 663.12, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 0.45, + "total_trades": 61, + "profit_factor": 1.0, + "score": 610.45, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": 47.92, + "total_trades": 54, + "profit_factor": 1.09, + "score": 587.92, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 58.84, + "total_trades": 16, + "profit_factor": 1.49, + "score": 218.84, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 129.62, + "total_trades": 35, + "profit_factor": 1.41, + "score": 479.62, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -142.55, + "total_trades": 43, + "profit_factor": 0.71, + "score": -136.1, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 20.86, + "total_trades": 15, + "profit_factor": 1.14, + "score": 170.86, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 98.68, + "total_trades": 66, + "profit_factor": 1.16, + "score": 758.68, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -53.34, + "total_trades": 28, + "profit_factor": 0.83, + "score": -49.14, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 25.44, + "total_trades": 68, + "profit_factor": 1.04, + "score": 705.44, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "AUDUSD", + "symbol": "AUDUSD", + "enabled": true, + "max_spread_pips": 8, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 5.02, + "total_trades": 57, + "profit_factor": 1.0 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -229.42, + "total_trades": 39, + "profit_factor": 0.72, + "score": -223.57, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -165.21, + "total_trades": 34, + "profit_factor": 0.77, + "score": -160.11, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 22.2, + "total_trades": 46, + "profit_factor": 1.02, + "score": 482.2, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -545.11, + "total_trades": 44, + "profit_factor": 0.47, + "score": -538.51, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -488.9, + "total_trades": 86, + "profit_factor": 0.73, + "score": -476.0, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -616.56, + "total_trades": 86, + "profit_factor": 0.68, + "score": -603.66, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -234.62, + "total_trades": 75, + "profit_factor": 0.85, + "score": -223.37, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -103.48, + "total_trades": 26, + "profit_factor": 0.82, + "score": -99.58, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 5.02, + "total_trades": 57, + "profit_factor": 1.0, + "score": 575.02, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -87.99, + "total_trades": 54, + "profit_factor": 0.91, + "score": -79.89, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -98.13, + "total_trades": 29, + "profit_factor": 0.85, + "score": -93.78, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -504.51, + "total_trades": 96, + "profit_factor": 0.76, + "score": -490.11, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -186.03, + "total_trades": 51, + "profit_factor": 0.83, + "score": -178.38, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -389.62, + "total_trades": 87, + "profit_factor": 0.79, + "score": -376.57, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "BTCUSD", + "symbol": "BTCUSD", + "enabled": true, + "max_spread_pips": 50, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 178.3, + "total_trades": 15, + "profit_factor": 1.92 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 95.48, + "total_trades": 13, + "profit_factor": 1.63, + "score": 225.48, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -62.67, + "total_trades": 11, + "profit_factor": 0.64, + "score": -61.02, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 11.75, + "total_trades": 15, + "profit_factor": 1.05, + "score": 161.75, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 178.3, + "total_trades": 15, + "profit_factor": 1.92, + "score": 328.3, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -133.93, + "total_trades": 19, + "profit_factor": 0.62, + "score": -131.08, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -98.85, + "total_trades": 18, + "profit_factor": 0.66, + "score": -96.15, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -62.69, + "total_trades": 15, + "profit_factor": 0.78, + "score": -60.44, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 137.45, + "total_trades": 9, + "profit_factor": 2.61, + "score": 227.45, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 56.45, + "total_trades": 16, + "profit_factor": 1.25, + "score": 216.45, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -49.16, + "total_trades": 11, + "profit_factor": 0.69, + "score": -47.51, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 57.79, + "total_trades": 10, + "profit_factor": 1.41, + "score": 157.79, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -256.38, + "total_trades": 25, + "profit_factor": 0.44, + "score": -252.63, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 16.37, + "total_trades": 17, + "profit_factor": 1.06, + "score": 186.37, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -153.45, + "total_trades": 22, + "profit_factor": 0.62, + "score": -150.15, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "CADJPY", + "symbol": "CADJPY", + "enabled": true, + "max_spread_pips": 10, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 64.94, + "total_trades": 58, + "profit_factor": 1.05 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -234.43, + "total_trades": 47, + "profit_factor": 0.8, + "score": -227.38, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -315.41, + "total_trades": 41, + "profit_factor": 0.69, + "score": -309.26, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 76.46, + "total_trades": 47, + "profit_factor": 1.09, + "score": 546.46, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 122.13, + "total_trades": 44, + "profit_factor": 1.14, + "score": 562.13, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -970.34, + "total_trades": 96, + "profit_factor": 0.6, + "score": -955.94, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -432.43, + "total_trades": 92, + "profit_factor": 0.79, + "score": -418.63, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -563.86, + "total_trades": 80, + "profit_factor": 0.71, + "score": -551.86, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -344.64, + "total_trades": 35, + "profit_factor": 0.61, + "score": -339.39, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -349.51, + "total_trades": 60, + "profit_factor": 0.75, + "score": -340.51, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -550.62, + "total_trades": 66, + "profit_factor": 0.63, + "score": -540.72, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -9.65, + "total_trades": 36, + "profit_factor": 0.99, + "score": -4.25, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -698.88, + "total_trades": 103, + "profit_factor": 0.72, + "score": -683.43, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 64.94, + "total_trades": 58, + "profit_factor": 1.05, + "score": 644.94, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -680.15, + "total_trades": 97, + "profit_factor": 0.71, + "score": -665.6, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "CHFJPY", + "symbol": "CHFJPY", + "enabled": true, + "max_spread_pips": 10, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 823.44, + "total_trades": 85, + "profit_factor": 1.36 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 868.35, + "total_trades": 45, + "profit_factor": 1.79, + "score": 1318.35, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 996.91, + "total_trades": 39, + "profit_factor": 2.14, + "score": 1386.91, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 675.45, + "total_trades": 45, + "profit_factor": 1.59, + "score": 1125.45, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 523.12, + "total_trades": 51, + "profit_factor": 1.4, + "score": 1033.12, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 823.44, + "total_trades": 85, + "profit_factor": 1.36, + "score": 1673.44, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -129.42, + "total_trades": 82, + "profit_factor": 0.95, + "score": -117.12, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": 168.72, + "total_trades": 69, + "profit_factor": 1.08, + "score": 858.72, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 615.63, + "total_trades": 31, + "profit_factor": 1.87, + "score": 925.63, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -21.37, + "total_trades": 61, + "profit_factor": 0.99, + "score": -12.22, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 639.86, + "total_trades": 56, + "profit_factor": 1.43, + "score": 1199.86, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 938.83, + "total_trades": 29, + "profit_factor": 2.57, + "score": 1228.83, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 146.01, + "total_trades": 87, + "profit_factor": 1.06, + "score": 1016.01, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 375.84, + "total_trades": 59, + "profit_factor": 1.24, + "score": 965.84, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -240.75, + "total_trades": 89, + "profit_factor": 0.92, + "score": -227.4, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "ETHUSD", + "symbol": "ETHUSD", + "enabled": true, + "max_spread_pips": 40, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 56.91, + "total_trades": 144, + "profit_factor": 1.13 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 53.23, + "total_trades": 59, + "profit_factor": 1.32, + "score": 643.23, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 50.61, + "total_trades": 61, + "profit_factor": 1.29, + "score": 660.61, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -71.02, + "total_trades": 72, + "profit_factor": 0.71, + "score": -60.22, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 42.04, + "total_trades": 63, + "profit_factor": 1.23, + "score": 672.04, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 114.34, + "total_trades": 124, + "profit_factor": 1.33, + "score": 1354.34, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 60.23, + "total_trades": 122, + "profit_factor": 1.16, + "score": 1280.23, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": 74.06, + "total_trades": 90, + "profit_factor": 1.29, + "score": 974.06, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 13.31, + "total_trades": 39, + "profit_factor": 1.11, + "score": 403.31, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 56.51, + "total_trades": 105, + "profit_factor": 1.18, + "score": 1106.51, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 74.04, + "total_trades": 77, + "profit_factor": 1.35, + "score": 844.04, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -18.44, + "total_trades": 38, + "profit_factor": 0.84, + "score": -12.74, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 56.91, + "total_trades": 144, + "profit_factor": 1.13, + "score": 1496.91, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -49.95, + "total_trades": 92, + "profit_factor": 0.84, + "score": -36.15, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 43.4, + "total_trades": 142, + "profit_factor": 1.1, + "score": 1463.4, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "EURAUD", + "symbol": "EURAUD", + "enabled": true, + "max_spread_pips": 10, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 156.0, + "total_trades": 47, + "profit_factor": 1.15 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -217.08, + "total_trades": 38, + "profit_factor": 0.78, + "score": -211.38, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -333.91, + "total_trades": 31, + "profit_factor": 0.59, + "score": -329.26, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 98.09, + "total_trades": 32, + "profit_factor": 1.15, + "score": 418.09, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -274.12, + "total_trades": 38, + "profit_factor": 0.74, + "score": -268.42, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -1186.84, + "total_trades": 77, + "profit_factor": 0.48, + "score": -1175.29, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -578.74, + "total_trades": 67, + "profit_factor": 0.7, + "score": -568.69, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -849.77, + "total_trades": 64, + "profit_factor": 0.54, + "score": -840.17, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -202.46, + "total_trades": 20, + "profit_factor": 0.63, + "score": -199.46, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -292.45, + "total_trades": 53, + "profit_factor": 0.77, + "score": -284.5, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -615.35, + "total_trades": 49, + "profit_factor": 0.54, + "score": -608.0, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -71.4, + "total_trades": 25, + "profit_factor": 0.89, + "score": -67.65, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -1235.12, + "total_trades": 79, + "profit_factor": 0.47, + "score": -1223.27, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 156.0, + "total_trades": 47, + "profit_factor": 1.15, + "score": 626.0, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -912.9, + "total_trades": 73, + "profit_factor": 0.58, + "score": -901.95, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "EURCAD", + "symbol": "EURCAD", + "enabled": true, + "max_spread_pips": 10, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 96.34, + "total_trades": 51, + "profit_factor": 1.09 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -745.5, + "total_trades": 41, + "profit_factor": 0.36, + "score": -739.35, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -477.95, + "total_trades": 29, + "profit_factor": 0.38, + "score": -473.6, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -447.45, + "total_trades": 35, + "profit_factor": 0.46, + "score": -442.2, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -806.33, + "total_trades": 39, + "profit_factor": 0.24, + "score": -800.48, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -715.39, + "total_trades": 79, + "profit_factor": 0.58, + "score": -703.54, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -725.03, + "total_trades": 77, + "profit_factor": 0.58, + "score": -713.48, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -734.7, + "total_trades": 68, + "profit_factor": 0.54, + "score": -724.5, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -183.9, + "total_trades": 21, + "profit_factor": 0.62, + "score": -180.75, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 96.34, + "total_trades": 51, + "profit_factor": 1.09, + "score": 606.34, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -577.06, + "total_trades": 51, + "profit_factor": 0.53, + "score": -569.41, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -526.87, + "total_trades": 19, + "profit_factor": 0.1, + "score": -524.02, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -901.13, + "total_trades": 83, + "profit_factor": 0.53, + "score": -888.68, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -737.6, + "total_trades": 45, + "profit_factor": 0.39, + "score": -730.85, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -541.44, + "total_trades": 78, + "profit_factor": 0.68, + "score": -529.74, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "EURCHF", + "symbol": "EURCHF", + "enabled": true, + "max_spread_pips": 10, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 296.02, + "total_trades": 22, + "profit_factor": 2.29 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -282.58, + "total_trades": 29, + "profit_factor": 0.54, + "score": -278.23, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 82.74, + "total_trades": 24, + "profit_factor": 1.2, + "score": 322.74, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 91.46, + "total_trades": 24, + "profit_factor": 1.25, + "score": 331.46, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -244.61, + "total_trades": 31, + "profit_factor": 0.61, + "score": -239.96, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -487.28, + "total_trades": 83, + "profit_factor": 0.71, + "score": -474.83, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -452.7, + "total_trades": 81, + "profit_factor": 0.74, + "score": -440.55, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -250.92, + "total_trades": 65, + "profit_factor": 0.81, + "score": -241.17, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 296.02, + "total_trades": 22, + "profit_factor": 2.29, + "score": 516.02, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 12.65, + "total_trades": 39, + "profit_factor": 1.02, + "score": 402.65, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -152.13, + "total_trades": 55, + "profit_factor": 0.86, + "score": -143.88, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -42.59, + "total_trades": 18, + "profit_factor": 0.86, + "score": -39.89, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -527.11, + "total_trades": 89, + "profit_factor": 0.72, + "score": -513.76, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 0.4, + "total_trades": 35, + "profit_factor": 1.0, + "score": 350.4, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -425.81, + "total_trades": 84, + "profit_factor": 0.75, + "score": -413.21, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "EURGBP", + "symbol": "EURGBP", + "enabled": true, + "max_spread_pips": 8, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 23.17, + "total_trades": 42, + "profit_factor": 1.03 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -71.44, + "total_trades": 33, + "profit_factor": 0.88, + "score": -66.49, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -276.75, + "total_trades": 32, + "profit_factor": 0.58, + "score": -271.95, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -350.63, + "total_trades": 29, + "profit_factor": 0.44, + "score": -346.28, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -164.55, + "total_trades": 39, + "profit_factor": 0.75, + "score": -158.7, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -579.16, + "total_trades": 96, + "profit_factor": 0.67, + "score": -564.76, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -603.67, + "total_trades": 96, + "profit_factor": 0.65, + "score": -589.27, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -716.46, + "total_trades": 83, + "profit_factor": 0.55, + "score": -704.01, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 113.21, + "total_trades": 15, + "profit_factor": 1.41, + "score": 263.21, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 23.17, + "total_trades": 42, + "profit_factor": 1.03, + "score": 443.17, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -575.66, + "total_trades": 64, + "profit_factor": 0.55, + "score": -566.06, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -307.41, + "total_trades": 23, + "profit_factor": 0.41, + "score": -303.96, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -601.86, + "total_trades": 104, + "profit_factor": 0.67, + "score": -586.26, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -139.66, + "total_trades": 37, + "profit_factor": 0.79, + "score": -134.11, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -656.91, + "total_trades": 103, + "profit_factor": 0.66, + "score": -641.46, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "EURJPY", + "symbol": "EURJPY", + "enabled": true, + "max_spread_pips": 10, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 475.04, + "total_trades": 48, + "profit_factor": 1.39 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -41.49, + "total_trades": 43, + "profit_factor": 0.97, + "score": -35.04, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -197.07, + "total_trades": 38, + "profit_factor": 0.82, + "score": -191.37, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 475.04, + "total_trades": 48, + "profit_factor": 1.39, + "score": 955.04, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -1.33, + "total_trades": 45, + "profit_factor": 1.0, + "score": 5.42, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -377.82, + "total_trades": 87, + "profit_factor": 0.86, + "score": -364.77, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -313.11, + "total_trades": 84, + "profit_factor": 0.88, + "score": -300.51, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -80.7, + "total_trades": 72, + "profit_factor": 0.96, + "score": -69.9, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -145.87, + "total_trades": 36, + "profit_factor": 0.85, + "score": -140.47, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -653.49, + "total_trades": 58, + "profit_factor": 0.64, + "score": -644.79, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 151.6, + "total_trades": 60, + "profit_factor": 1.09, + "score": 751.6, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -36.28, + "total_trades": 29, + "profit_factor": 0.95, + "score": -31.93, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -414.04, + "total_trades": 101, + "profit_factor": 0.87, + "score": -398.89, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -317.53, + "total_trades": 48, + "profit_factor": 0.78, + "score": -310.33, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -300.13, + "total_trades": 93, + "profit_factor": 0.9, + "score": -286.18, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "EURNZD", + "symbol": "EURNZD", + "enabled": true, + "max_spread_pips": 12, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 213.03, + "total_trades": 43, + "profit_factor": 1.22 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -89.49, + "total_trades": 28, + "profit_factor": 0.87, + "score": -85.29, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -171.87, + "total_trades": 32, + "profit_factor": 0.81, + "score": -167.07, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -394.5, + "total_trades": 40, + "profit_factor": 0.64, + "score": -388.5, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 20.47, + "total_trades": 34, + "profit_factor": 1.02, + "score": 360.47, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -173.78, + "total_trades": 67, + "profit_factor": 0.9, + "score": -163.73, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -647.29, + "total_trades": 63, + "profit_factor": 0.65, + "score": -637.84, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -527.61, + "total_trades": 61, + "profit_factor": 0.69, + "score": -518.46, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -0.12, + "total_trades": 23, + "profit_factor": 1.0, + "score": 3.33, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 213.03, + "total_trades": 43, + "profit_factor": 1.22, + "score": 643.03, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -652.07, + "total_trades": 45, + "profit_factor": 0.53, + "score": -645.32, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -316.92, + "total_trades": 29, + "profit_factor": 0.62, + "score": -312.57, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -511.92, + "total_trades": 71, + "profit_factor": 0.74, + "score": -501.27, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -165.06, + "total_trades": 49, + "profit_factor": 0.87, + "score": -157.71, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -593.41, + "total_trades": 69, + "profit_factor": 0.69, + "score": -583.06, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "EURUSD", + "symbol": "EURUSD", + "enabled": true, + "max_spread_pips": 6, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 109.78, + "total_trades": 100, + "profit_factor": 1.05 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 286.98, + "total_trades": 31, + "profit_factor": 1.46, + "score": 596.98, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 319.7, + "total_trades": 31, + "profit_factor": 1.62, + "score": 629.7, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 509.56, + "total_trades": 44, + "profit_factor": 1.6, + "score": 949.56, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 310.69, + "total_trades": 38, + "profit_factor": 1.43, + "score": 690.69, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 153.53, + "total_trades": 91, + "profit_factor": 1.07, + "score": 1063.53, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -190.57, + "total_trades": 90, + "profit_factor": 0.91, + "score": -177.07, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": 88.23, + "total_trades": 73, + "profit_factor": 1.05, + "score": 818.23, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 155.81, + "total_trades": 23, + "profit_factor": 1.3, + "score": 385.81, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -88.69, + "total_trades": 52, + "profit_factor": 0.92, + "score": -80.89, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 454.18, + "total_trades": 58, + "profit_factor": 1.38, + "score": 1034.18, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 499.88, + "total_trades": 24, + "profit_factor": 2.39, + "score": 739.88, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 109.78, + "total_trades": 100, + "profit_factor": 1.05, + "score": 1109.78, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 407.09, + "total_trades": 55, + "profit_factor": 1.38, + "score": 957.09, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 109.72, + "total_trades": 97, + "profit_factor": 1.05, + "score": 1079.72, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 6, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "GBPAUD", + "symbol": "GBPAUD", + "enabled": true, + "max_spread_pips": 12, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 155.1, + "total_trades": 45, + "profit_factor": 1.16 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -3.35, + "total_trades": 33, + "profit_factor": 1.0, + "score": 1.6, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -267.81, + "total_trades": 37, + "profit_factor": 0.75, + "score": -262.26, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -270.33, + "total_trades": 40, + "profit_factor": 0.75, + "score": -264.33, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -375.43, + "total_trades": 37, + "profit_factor": 0.66, + "score": -369.88, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -570.11, + "total_trades": 74, + "profit_factor": 0.73, + "score": -559.01, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -489.04, + "total_trades": 75, + "profit_factor": 0.79, + "score": -477.79, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -857.79, + "total_trades": 67, + "profit_factor": 0.58, + "score": -847.74, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -375.2, + "total_trades": 30, + "profit_factor": 0.59, + "score": -370.7, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 155.1, + "total_trades": 45, + "profit_factor": 1.16, + "score": 605.1, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -1039.62, + "total_trades": 53, + "profit_factor": 0.42, + "score": -1031.67, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -69.94, + "total_trades": 27, + "profit_factor": 0.91, + "score": -65.89, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -923.73, + "total_trades": 85, + "profit_factor": 0.65, + "score": -910.98, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -805.51, + "total_trades": 44, + "profit_factor": 0.39, + "score": -798.91, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -904.64, + "total_trades": 81, + "profit_factor": 0.65, + "score": -892.49, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "GBPCAD", + "symbol": "GBPCAD", + "enabled": true, + "max_spread_pips": 12, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 484.36, + "total_trades": 27, + "profit_factor": 2.07 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -109.32, + "total_trades": 32, + "profit_factor": 0.87, + "score": -104.52, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 38.44, + "total_trades": 24, + "profit_factor": 1.07, + "score": 278.44, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 484.36, + "total_trades": 27, + "profit_factor": 2.07, + "score": 754.36, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -362.05, + "total_trades": 38, + "profit_factor": 0.67, + "score": -356.35, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -548.52, + "total_trades": 71, + "profit_factor": 0.71, + "score": -537.87, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -561.6, + "total_trades": 70, + "profit_factor": 0.7, + "score": -551.1, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -554.36, + "total_trades": 65, + "profit_factor": 0.69, + "score": -544.61, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -63.68, + "total_trades": 23, + "profit_factor": 0.89, + "score": -60.23, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -203.21, + "total_trades": 46, + "profit_factor": 0.84, + "score": -196.31, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -623.47, + "total_trades": 43, + "profit_factor": 0.53, + "score": -617.02, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -317.92, + "total_trades": 18, + "profit_factor": 0.41, + "score": -315.22, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -540.68, + "total_trades": 77, + "profit_factor": 0.73, + "score": -529.13, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 128.76, + "total_trades": 40, + "profit_factor": 1.14, + "score": 528.76, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -623.75, + "total_trades": 73, + "profit_factor": 0.67, + "score": -612.8, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "GBPCHF", + "symbol": "GBPCHF", + "enabled": true, + "max_spread_pips": 12, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 40.07, + "total_trades": 68, + "profit_factor": 1.02 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 163.72, + "total_trades": 31, + "profit_factor": 1.2, + "score": 473.72, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -130.27, + "total_trades": 27, + "profit_factor": 0.81, + "score": -126.22, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -145.7, + "total_trades": 34, + "profit_factor": 0.85, + "score": -140.6, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 115.98, + "total_trades": 32, + "profit_factor": 1.13, + "score": 435.98, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -58.76, + "total_trades": 65, + "profit_factor": 0.96, + "score": -49.01, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -273.82, + "total_trades": 63, + "profit_factor": 0.84, + "score": -264.37, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -630.69, + "total_trades": 63, + "profit_factor": 0.67, + "score": -621.24, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -255.2, + "total_trades": 27, + "profit_factor": 0.68, + "score": -251.15, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 151.59, + "total_trades": 47, + "profit_factor": 1.12, + "score": 621.59, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -467.41, + "total_trades": 46, + "profit_factor": 0.63, + "score": -460.51, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -307.61, + "total_trades": 21, + "profit_factor": 0.5, + "score": -304.46, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -56.92, + "total_trades": 68, + "profit_factor": 0.97, + "score": -46.72, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 32.92, + "total_trades": 34, + "profit_factor": 1.03, + "score": 372.92, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 40.07, + "total_trades": 68, + "profit_factor": 1.02, + "score": 720.07, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "GBPJPY", + "symbol": "GBPJPY", + "enabled": true, + "max_spread_pips": 12, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 572.39, + "total_trades": 60, + "profit_factor": 1.27 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -722.53, + "total_trades": 36, + "profit_factor": 0.53, + "score": -717.13, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -636.94, + "total_trades": 33, + "profit_factor": 0.57, + "score": -631.99, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 239.04, + "total_trades": 36, + "profit_factor": 1.19, + "score": 599.04, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -902.86, + "total_trades": 42, + "profit_factor": 0.51, + "score": -896.56, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -23.9, + "total_trades": 69, + "profit_factor": 0.99, + "score": -13.55, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 354.17, + "total_trades": 67, + "profit_factor": 1.16, + "score": 1024.17, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": 572.39, + "total_trades": 60, + "profit_factor": 1.27, + "score": 1172.39, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 187.86, + "total_trades": 26, + "profit_factor": 1.2, + "score": 447.86, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -278.63, + "total_trades": 45, + "profit_factor": 0.84, + "score": -271.88, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -128.04, + "total_trades": 46, + "profit_factor": 0.92, + "score": -121.14, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 241.79, + "total_trades": 23, + "profit_factor": 1.31, + "score": 471.79, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 265.7, + "total_trades": 72, + "profit_factor": 1.1, + "score": 985.7, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -1140.4, + "total_trades": 45, + "profit_factor": 0.45, + "score": -1133.65, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 279.71, + "total_trades": 68, + "profit_factor": 1.12, + "score": 959.71, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "GBPNZD", + "symbol": "GBPNZD", + "enabled": false, + "max_spread_pips": 14, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 14, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": -247.77, + "total_trades": 57, + "profit_factor": 0.86, + "preset_id": 3, + "score": -239.22 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -938.83, + "total_trades": 83, + "profit_factor": 0.65, + "score": -926.38, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 14, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -771.84, + "total_trades": 46, + "profit_factor": 0.51, + "score": -764.94, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 14, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -247.77, + "total_trades": 57, + "profit_factor": 0.86, + "score": -239.22, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 14, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -396.68, + "total_trades": 43, + "profit_factor": 0.72, + "score": -390.23, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 14, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "ready": false + }, + { + "preset": 6, + "ready": false + }, + { + "preset": 7, + "ready": false + }, + { + "preset": 8, + "ready": false + }, + { + "preset": 9, + "ready": false + }, + { + "preset": 10, + "ready": false + }, + { + "preset": 11, + "ready": false + }, + { + "preset": 12, + "ready": false + }, + { + "preset": 13, + "net_profit": -500.84, + "total_trades": 56, + "profit_factor": 0.71, + "score": -492.44, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 14, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "ready": false + }, + { + "preset": 15, + "ready": false + }, + { + "preset": 16, + "ready": false + }, + { + "preset": 17, + "ready": false + }, + { + "preset": 18, + "ready": false + } + ], + "mt5_status": "no_mt5_run" + }, + { + "requested": "GBPUSD", + "symbol": "GBPUSD", + "enabled": true, + "max_spread_pips": 8, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 1164.06, + "total_trades": 53, + "profit_factor": 2.02 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 810.87, + "total_trades": 36, + "profit_factor": 2.1, + "score": 1170.87, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 799.78, + "total_trades": 31, + "profit_factor": 2.31, + "score": 1109.78, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 601.98, + "total_trades": 37, + "profit_factor": 1.73, + "score": 971.98, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 758.14, + "total_trades": 34, + "profit_factor": 2.11, + "score": 1098.14, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 689.34, + "total_trades": 77, + "profit_factor": 1.37, + "score": 1459.34, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 642.88, + "total_trades": 80, + "profit_factor": 1.33, + "score": 1442.88, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": 413.95, + "total_trades": 69, + "profit_factor": 1.24, + "score": 1103.95, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 4.27, + "total_trades": 23, + "profit_factor": 1.01, + "score": 234.27, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 609.72, + "total_trades": 61, + "profit_factor": 1.42, + "score": 1219.72, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 1046.09, + "total_trades": 48, + "profit_factor": 2.13, + "score": 1526.09, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 220.9, + "total_trades": 28, + "profit_factor": 1.4, + "score": 500.9, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 666.94, + "total_trades": 86, + "profit_factor": 1.32, + "score": 1526.94, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 1164.06, + "total_trades": 53, + "profit_factor": 2.02, + "score": 1694.06, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 619.41, + "total_trades": 80, + "profit_factor": 1.33, + "score": 1419.41, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "GER40", + "symbol": "GER40", + "enabled": true, + "max_spread_pips": 20, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 431.0, + "total_trades": 13, + "profit_factor": 1.86 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -187.01, + "total_trades": 18, + "profit_factor": 0.82, + "score": -184.31, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 331.57, + "total_trades": 20, + "profit_factor": 1.33, + "score": 531.57, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -31.34, + "total_trades": 22, + "profit_factor": 0.97, + "score": -28.04, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 169.16, + "total_trades": 17, + "profit_factor": 1.19, + "score": 339.16, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -616.61, + "total_trades": 31, + "profit_factor": 0.67, + "score": -611.96, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -332.97, + "total_trades": 29, + "profit_factor": 0.81, + "score": -328.62, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -93.86, + "total_trades": 24, + "profit_factor": 0.93, + "score": -90.26, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 431.0, + "total_trades": 13, + "profit_factor": 1.86, + "score": 561.0, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -162.27, + "total_trades": 32, + "profit_factor": 0.91, + "score": -157.47, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -450.96, + "total_trades": 20, + "profit_factor": 0.66, + "score": -447.96, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 265.69, + "total_trades": 13, + "profit_factor": 1.45, + "score": 395.69, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -598.67, + "total_trades": 33, + "profit_factor": 0.7, + "score": -593.72, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -437.05, + "total_trades": 22, + "profit_factor": 0.68, + "score": -433.75, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -597.37, + "total_trades": 35, + "profit_factor": 0.72, + "score": -592.12, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "JPN225", + "symbol": "JPN225", + "enabled": true, + "max_spread_pips": 25, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 68.6, + "total_trades": 20, + "profit_factor": 1.38 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -41.67, + "total_trades": 14, + "profit_factor": 0.71, + "score": -39.57, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 35.83, + "total_trades": 11, + "profit_factor": 1.41, + "score": 145.83, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 52.37, + "total_trades": 13, + "profit_factor": 1.55, + "score": 182.37, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 1.17, + "total_trades": 15, + "profit_factor": 1.01, + "score": 151.17, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 68.6, + "total_trades": 20, + "profit_factor": 1.38, + "score": 268.6, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 19.4, + "total_trades": 21, + "profit_factor": 1.11, + "score": 229.4, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -42.75, + "total_trades": 19, + "profit_factor": 0.78, + "score": -39.9, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -3.34, + "total_trades": 11, + "profit_factor": 0.97, + "score": -1.69, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -34.64, + "total_trades": 23, + "profit_factor": 0.84, + "score": -31.19, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -6.07, + "total_trades": 14, + "profit_factor": 0.96, + "score": -3.97, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 17.52, + "total_trades": 7, + "profit_factor": 1.35, + "score": 87.52, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -97.64, + "total_trades": 29, + "profit_factor": 0.69, + "score": -93.29, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -100.15, + "total_trades": 18, + "profit_factor": 0.52, + "score": -97.45, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -52.12, + "total_trades": 26, + "profit_factor": 0.81, + "score": -48.22, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 25, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "NAS100", + "symbol": "NAS100", + "enabled": true, + "max_spread_pips": 20, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 705.75, + "total_trades": 26, + "profit_factor": 1.62 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -192.89, + "total_trades": 5, + "profit_factor": 0.43, + "score": -192.14, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -175.03, + "total_trades": 6, + "profit_factor": 0.53, + "score": -174.13, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -145.31, + "total_trades": 14, + "profit_factor": 0.81, + "score": -143.21, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 42.3, + "total_trades": 8, + "profit_factor": 1.1, + "score": 122.3, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 546.03, + "total_trades": 17, + "profit_factor": 1.71, + "score": 716.03, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -70.22, + "total_trades": 21, + "profit_factor": 0.94, + "score": -67.07, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -293.49, + "total_trades": 15, + "profit_factor": 0.66, + "score": -291.24, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -408.05, + "total_trades": 5, + "profit_factor": 0.0, + "score": -407.3, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 101.68, + "total_trades": 21, + "profit_factor": 1.09, + "score": 311.68, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -325.64, + "total_trades": 14, + "profit_factor": 0.62, + "score": -323.54, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -168.6, + "total_trades": 5, + "profit_factor": 0.49, + "score": -167.85, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 705.75, + "total_trades": 26, + "profit_factor": 1.62, + "score": 965.75, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -365.89, + "total_trades": 15, + "profit_factor": 0.61, + "score": -363.64, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 539.23, + "total_trades": 24, + "profit_factor": 1.48, + "score": 779.23, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "NZDCAD", + "symbol": "NZDCAD", + "enabled": false, + "max_spread_pips": 12, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": -111.47, + "total_trades": 58, + "profit_factor": 0.88, + "preset_id": 16, + "score": -102.77 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -867.81, + "total_trades": 97, + "profit_factor": 0.49, + "score": -853.26, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -261.74, + "total_trades": 45, + "profit_factor": 0.66, + "score": -254.99, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "ready": false + }, + { + "preset": 4, + "ready": false + }, + { + "preset": 5, + "ready": false + }, + { + "preset": 6, + "ready": false + }, + { + "preset": 7, + "ready": false + }, + { + "preset": 8, + "ready": false + }, + { + "preset": 9, + "ready": false + }, + { + "preset": 10, + "ready": false + }, + { + "preset": 11, + "ready": false + }, + { + "preset": 12, + "ready": false + }, + { + "preset": 13, + "ready": false + }, + { + "preset": 14, + "net_profit": -867.81, + "total_trades": 97, + "profit_factor": 0.49, + "score": -853.26, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 15, + "net_profit": -232.57, + "total_trades": 58, + "profit_factor": 0.76, + "score": -223.87, + "params": { + "fast_ema": 7, + "slow_ema": 24, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 16, + "net_profit": -111.47, + "total_trades": 58, + "profit_factor": 0.88, + "score": -102.77, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 17, + "net_profit": -734.71, + "total_trades": 105, + "profit_factor": 0.6, + "score": -718.96, + "params": { + "fast_ema": 7, + "slow_ema": 22, + "trend_leg_bars": 72, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 18, + "net_profit": -469.87, + "total_trades": 96, + "profit_factor": 0.7, + "score": -455.47, + "params": { + "fast_ema": 9, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "no_mt5_run" + }, + { + "requested": "NZDJPY", + "symbol": "NZDJPY", + "enabled": true, + "max_spread_pips": 12, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 88.97, + "total_trades": 44, + "profit_factor": 1.11 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -136.23, + "total_trades": 29, + "profit_factor": 0.76, + "score": -131.88, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -126.74, + "total_trades": 24, + "profit_factor": 0.72, + "score": -123.14, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -209.24, + "total_trades": 39, + "profit_factor": 0.75, + "score": -203.39, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -229.16, + "total_trades": 34, + "profit_factor": 0.66, + "score": -224.06, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -315.82, + "total_trades": 70, + "profit_factor": 0.78, + "score": -305.32, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -158.88, + "total_trades": 66, + "profit_factor": 0.88, + "score": -148.98, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -61.84, + "total_trades": 57, + "profit_factor": 0.94, + "score": -53.29, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 149.51, + "total_trades": 23, + "profit_factor": 1.39, + "score": 379.51, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 88.97, + "total_trades": 44, + "profit_factor": 1.11, + "score": 528.97, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -360.91, + "total_trades": 46, + "profit_factor": 0.61, + "score": -354.01, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -28.67, + "total_trades": 23, + "profit_factor": 0.94, + "score": -25.22, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -231.33, + "total_trades": 71, + "profit_factor": 0.84, + "score": -220.68, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 99.8, + "total_trades": 42, + "profit_factor": 1.14, + "score": 519.8, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -515.67, + "total_trades": 73, + "profit_factor": 0.68, + "score": -504.72, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "NZDUSD", + "symbol": "NZDUSD", + "enabled": false, + "max_spread_pips": 10, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": -178.78, + "total_trades": 44, + "profit_factor": 0.82, + "preset_id": 13, + "score": -172.18 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -606.42, + "total_trades": 87, + "profit_factor": 0.67, + "score": -593.37, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "ready": false + }, + { + "preset": 3, + "ready": false + }, + { + "preset": 4, + "ready": false + }, + { + "preset": 5, + "ready": false + }, + { + "preset": 6, + "ready": false + }, + { + "preset": 7, + "ready": false + }, + { + "preset": 8, + "ready": false + }, + { + "preset": 9, + "ready": false + }, + { + "preset": 10, + "ready": false + }, + { + "preset": 11, + "ready": false + }, + { + "preset": 12, + "ready": false + }, + { + "preset": 13, + "net_profit": -178.78, + "total_trades": 44, + "profit_factor": 0.82, + "score": -172.18, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "ready": false + }, + { + "preset": 15, + "ready": false + }, + { + "preset": 16, + "net_profit": -379.48, + "total_trades": 49, + "profit_factor": 0.68, + "score": -372.13, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 10, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 17, + "ready": false + }, + { + "preset": 18, + "ready": false + } + ], + "mt5_status": "no_mt5_run" + }, + { + "requested": "UK100", + "symbol": "UK100", + "enabled": true, + "max_spread_pips": 20, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 247.14, + "total_trades": 22, + "profit_factor": 1.51 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 55.17, + "total_trades": 7, + "profit_factor": 1.37, + "score": 125.17, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 140.21, + "total_trades": 5, + "profit_factor": 3.14, + "score": 190.21, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 95.77, + "total_trades": 16, + "profit_factor": 1.26, + "score": 255.77, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 84.02, + "total_trades": 9, + "profit_factor": 1.44, + "score": 174.02, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -40.84, + "total_trades": 23, + "profit_factor": 0.93, + "score": -37.39, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -168.16, + "total_trades": 29, + "profit_factor": 0.79, + "score": -163.81, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -65.04, + "total_trades": 21, + "profit_factor": 0.88, + "score": -61.89, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -119.39, + "total_trades": 9, + "profit_factor": 0.51, + "score": -118.04, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 247.14, + "total_trades": 22, + "profit_factor": 1.51, + "score": 467.14, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 71.88, + "total_trades": 11, + "profit_factor": 1.31, + "score": 181.88, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 26.82, + "total_trades": 8, + "profit_factor": 1.15, + "score": 106.82, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -212.9, + "total_trades": 29, + "profit_factor": 0.75, + "score": -208.55, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 155.17, + "total_trades": 12, + "profit_factor": 1.59, + "score": 275.17, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -250.13, + "total_trades": 30, + "profit_factor": 0.72, + "score": -245.63, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "US30", + "symbol": "US30", + "enabled": true, + "max_spread_pips": 20, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 1458.54, + "total_trades": 16, + "profit_factor": 2.64 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 995.46, + "total_trades": 9, + "profit_factor": 3.38, + "score": 1085.46, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 567.88, + "total_trades": 9, + "profit_factor": 2.0, + "score": 657.88, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 645.94, + "total_trades": 11, + "profit_factor": 1.91, + "score": 755.94, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -38.25, + "total_trades": 8, + "profit_factor": 0.95, + "score": -37.05, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 6.85, + "total_trades": 21, + "profit_factor": 1.0, + "score": 216.85, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -671.37, + "total_trades": 22, + "profit_factor": 0.71, + "score": -668.07, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -364.77, + "total_trades": 19, + "profit_factor": 0.8, + "score": -361.92, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -798.81, + "total_trades": 6, + "profit_factor": 0.0, + "score": -797.91, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 1458.54, + "total_trades": 16, + "profit_factor": 2.64, + "score": 1618.54, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -481.26, + "total_trades": 11, + "profit_factor": 0.61, + "score": -479.61, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -598.02, + "total_trades": 7, + "profit_factor": 0.22, + "score": -596.97, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -847.83, + "total_trades": 27, + "profit_factor": 0.69, + "score": -843.78, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 1015.74, + "total_trades": 13, + "profit_factor": 2.31, + "score": 1145.74, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -568.15, + "total_trades": 25, + "profit_factor": 0.77, + "score": -564.4, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 20, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "US500", + "symbol": "US500", + "enabled": true, + "max_spread_pips": 15, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 196.89, + "total_trades": 18, + "profit_factor": 2.46 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 100.58, + "total_trades": 7, + "profit_factor": 3.09, + "score": 170.58, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 88.33, + "total_trades": 8, + "profit_factor": 2.37, + "score": 168.33, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 156.35, + "total_trades": 14, + "profit_factor": 2.53, + "score": 296.35, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 150.52, + "total_trades": 10, + "profit_factor": 2.97, + "score": 250.52, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -29.39, + "total_trades": 17, + "profit_factor": 0.86, + "score": -26.84, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 2.47, + "total_trades": 19, + "profit_factor": 1.01, + "score": 192.47, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -125.5, + "total_trades": 18, + "profit_factor": 0.56, + "score": -122.8, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 57.24, + "total_trades": 11, + "profit_factor": 1.54, + "score": 167.24, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 196.89, + "total_trades": 18, + "profit_factor": 2.46, + "score": 376.89, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 27.45, + "total_trades": 11, + "profit_factor": 1.25, + "score": 137.45, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 40.02, + "total_trades": 9, + "profit_factor": 1.47, + "score": 130.02, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 70.53, + "total_trades": 21, + "profit_factor": 1.33, + "score": 280.53, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 150.52, + "total_trades": 16, + "profit_factor": 2.13, + "score": 310.52, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 40.54, + "total_trades": 20, + "profit_factor": 1.16, + "score": 240.54, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 2.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.0, + "atr_tp_mult": 4.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "USDCAD", + "symbol": "USDCAD", + "enabled": true, + "max_spread_pips": 8, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 225.13, + "total_trades": 49, + "profit_factor": 1.28 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -128.28, + "total_trades": 37, + "profit_factor": 0.81, + "score": -122.73, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -266.37, + "total_trades": 31, + "profit_factor": 0.58, + "score": -261.72, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -477.99, + "total_trades": 40, + "profit_factor": 0.44, + "score": -471.99, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -43.1, + "total_trades": 40, + "profit_factor": 0.94, + "score": -37.1, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -315.38, + "total_trades": 93, + "profit_factor": 0.82, + "score": -301.43, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -341.88, + "total_trades": 93, + "profit_factor": 0.82, + "score": -327.93, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -513.84, + "total_trades": 78, + "profit_factor": 0.67, + "score": -502.14, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": -163.68, + "total_trades": 26, + "profit_factor": 0.67, + "score": -159.78, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -68.24, + "total_trades": 51, + "profit_factor": 0.92, + "score": -60.59, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -205.39, + "total_trades": 56, + "profit_factor": 0.81, + "score": -196.99, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -327.73, + "total_trades": 26, + "profit_factor": 0.42, + "score": -323.83, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -215.75, + "total_trades": 102, + "profit_factor": 0.89, + "score": -200.45, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 225.13, + "total_trades": 49, + "profit_factor": 1.28, + "score": 715.13, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -253.06, + "total_trades": 96, + "profit_factor": 0.87, + "score": -238.66, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "USDCHF", + "symbol": "USDCHF", + "enabled": true, + "max_spread_pips": 8, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 208.95, + "total_trades": 90, + "profit_factor": 1.1 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -318.24, + "total_trades": 29, + "profit_factor": 0.6, + "score": -313.89, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -235.79, + "total_trades": 29, + "profit_factor": 0.69, + "score": -231.44, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -107.56, + "total_trades": 42, + "profit_factor": 0.89, + "score": -101.26, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -291.34, + "total_trades": 40, + "profit_factor": 0.72, + "score": -285.34, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -256.81, + "total_trades": 85, + "profit_factor": 0.88, + "score": -244.06, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 11.11, + "total_trades": 81, + "profit_factor": 1.01, + "score": 821.11, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": 167.08, + "total_trades": 67, + "profit_factor": 1.11, + "score": 837.08, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 288.85, + "total_trades": 22, + "profit_factor": 1.69, + "score": 508.85, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -179.86, + "total_trades": 49, + "profit_factor": 0.84, + "score": -172.51, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 366.7, + "total_trades": 49, + "profit_factor": 1.39, + "score": 856.7, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 136.98, + "total_trades": 23, + "profit_factor": 1.27, + "score": 366.98, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 208.95, + "total_trades": 90, + "profit_factor": 1.1, + "score": 1108.95, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -390.35, + "total_trades": 43, + "profit_factor": 0.67, + "score": -383.9, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -117.8, + "total_trades": 86, + "profit_factor": 0.94, + "score": -104.9, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 8, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "USDCNH", + "symbol": "USDCNH", + "enabled": true, + "max_spread_pips": 15, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 40.67, + "total_trades": 81, + "profit_factor": 1.04 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 310.54, + "total_trades": 45, + "profit_factor": 1.75, + "score": 760.54, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 60.9, + "total_trades": 39, + "profit_factor": 1.13, + "score": 450.9, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -173.68, + "total_trades": 49, + "profit_factor": 0.74, + "score": -166.33, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 254.66, + "total_trades": 48, + "profit_factor": 1.57, + "score": 734.66, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -123.08, + "total_trades": 94, + "profit_factor": 0.89, + "score": -108.98, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 40.67, + "total_trades": 81, + "profit_factor": 1.04, + "score": 850.67, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -40.17, + "total_trades": 76, + "profit_factor": 0.95, + "score": -28.77, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 100.32, + "total_trades": 35, + "profit_factor": 1.29, + "score": 450.32, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 112.94, + "total_trades": 59, + "profit_factor": 1.16, + "score": 702.94, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 177.59, + "total_trades": 57, + "profit_factor": 1.26, + "score": 747.59, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 63.79, + "total_trades": 34, + "profit_factor": 1.17, + "score": 403.79, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -245.37, + "total_trades": 97, + "profit_factor": 0.81, + "score": -230.82, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -23.46, + "total_trades": 61, + "profit_factor": 0.97, + "score": -14.31, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -90.96, + "total_trades": 95, + "profit_factor": 0.92, + "score": -76.71, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 15, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "USDJPY", + "symbol": "USDJPY", + "enabled": true, + "max_spread_pips": 8, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 810.8, + "total_trades": 78, + "profit_factor": 1.41 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -127.99, + "total_trades": 39, + "profit_factor": 0.89, + "score": -122.14, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 132.4, + "total_trades": 41, + "profit_factor": 1.11, + "score": 542.4, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -277.64, + "total_trades": 53, + "profit_factor": 0.82, + "score": -269.69, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -251.02, + "total_trades": 42, + "profit_factor": 0.81, + "score": -244.72, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -104.85, + "total_trades": 86, + "profit_factor": 0.96, + "score": -91.95, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 810.8, + "total_trades": 78, + "profit_factor": 1.41, + "score": 1590.8, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": 174.57, + "total_trades": 70, + "profit_factor": 1.09, + "score": 874.57, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 162.29, + "total_trades": 29, + "profit_factor": 1.22, + "score": 452.29, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -387.89, + "total_trades": 63, + "profit_factor": 0.81, + "score": -378.44, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 759.5, + "total_trades": 57, + "profit_factor": 1.55, + "score": 1329.5, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 123.25, + "total_trades": 34, + "profit_factor": 1.15, + "score": 463.25, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 6.74, + "total_trades": 99, + "profit_factor": 1.0, + "score": 996.74, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -275.26, + "total_trades": 51, + "profit_factor": 0.82, + "score": -267.61, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 329.61, + "total_trades": 82, + "profit_factor": 1.14, + "score": 1149.61, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.71, + "atr_tp_mult": 6.36, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 12.0, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "XAGUSD", + "symbol": "XAGUSD", + "enabled": true, + "max_spread_pips": 40, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 557.34, + "total_trades": 61, + "profit_factor": 1.41 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -256.9, + "total_trades": 40, + "profit_factor": 0.77, + "score": -250.9, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -453.01, + "total_trades": 38, + "profit_factor": 0.61, + "score": -447.31, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 333.44, + "total_trades": 47, + "profit_factor": 1.3, + "score": 803.44, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -278.58, + "total_trades": 41, + "profit_factor": 0.77, + "score": -272.43, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -541.47, + "total_trades": 94, + "profit_factor": 0.79, + "score": -527.37, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -479.71, + "total_trades": 103, + "profit_factor": 0.83, + "score": -464.26, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -706.34, + "total_trades": 85, + "profit_factor": 0.72, + "score": -693.59, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 11.55, + "total_trades": 28, + "profit_factor": 1.02, + "score": 291.55, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 557.34, + "total_trades": 61, + "profit_factor": 1.41, + "score": 1167.34, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 471.18, + "total_trades": 56, + "profit_factor": 1.36, + "score": 1031.18, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -91.1, + "total_trades": 31, + "profit_factor": 0.89, + "score": -86.45, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -679.28, + "total_trades": 114, + "profit_factor": 0.78, + "score": -662.18, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 68.29, + "total_trades": 53, + "profit_factor": 1.05, + "score": 598.29, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -492.24, + "total_trades": 106, + "profit_factor": 0.83, + "score": -476.34, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 40, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "XAUUSD", + "symbol": "XAUUSD", + "enabled": true, + "max_spread_pips": 35, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 2756.73, + "total_trades": 96, + "profit_factor": 1.29 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -330.34, + "total_trades": 37, + "profit_factor": 0.91, + "score": -324.79, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 54.23, + "total_trades": 30, + "profit_factor": 1.02, + "score": 354.23, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -353.28, + "total_trades": 43, + "profit_factor": 0.92, + "score": -346.83, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 512.75, + "total_trades": 43, + "profit_factor": 1.12, + "score": 942.75, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 350.33, + "total_trades": 82, + "profit_factor": 1.04, + "score": 1170.33, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": 2620.32, + "total_trades": 81, + "profit_factor": 1.33, + "score": 3430.32, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": 606.91, + "total_trades": 68, + "profit_factor": 1.09, + "score": 1286.91, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 1246.01, + "total_trades": 30, + "profit_factor": 1.45, + "score": 1546.01, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 1692.66, + "total_trades": 63, + "profit_factor": 1.28, + "score": 2322.66, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 2276.01, + "total_trades": 48, + "profit_factor": 1.51, + "score": 2756.01, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 2034.56, + "total_trades": 23, + "profit_factor": 2.25, + "score": 2264.56, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 2756.73, + "total_trades": 96, + "profit_factor": 1.29, + "score": 3716.73, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -392.12, + "total_trades": 55, + "profit_factor": 0.93, + "score": -383.87, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 1827.49, + "total_trades": 93, + "profit_factor": 1.19, + "score": 2757.49, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 35, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "XBRUSD", + "symbol": "XBRUSD", + "enabled": true, + "max_spread_pips": 30, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 39.06, + "total_trades": 38, + "profit_factor": 1.2 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -111.22, + "total_trades": 52, + "profit_factor": 0.67, + "score": -103.42, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -50.96, + "total_trades": 48, + "profit_factor": 0.82, + "score": -43.76, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -132.08, + "total_trades": 61, + "profit_factor": 0.66, + "score": -122.93, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -95.2, + "total_trades": 56, + "profit_factor": 0.71, + "score": -86.8, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -306.15, + "total_trades": 118, + "profit_factor": 0.62, + "score": -288.45, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -200.74, + "total_trades": 123, + "profit_factor": 0.75, + "score": -182.29, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -165.42, + "total_trades": 98, + "profit_factor": 0.74, + "score": -150.72, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 39.06, + "total_trades": 38, + "profit_factor": 1.2, + "score": 419.06, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -165.95, + "total_trades": 91, + "profit_factor": 0.71, + "score": -152.3, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -91.54, + "total_trades": 83, + "profit_factor": 0.82, + "score": -79.09, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -14.57, + "total_trades": 43, + "profit_factor": 0.94, + "score": -8.12, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -365.55, + "total_trades": 135, + "profit_factor": 0.61, + "score": -345.3, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -107.14, + "total_trades": 71, + "profit_factor": 0.75, + "score": -96.49, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -377.5, + "total_trades": 136, + "profit_factor": 0.6, + "score": -357.1, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "XPDUSD", + "symbol": "XPDUSD", + "enabled": false, + "error": "no MT5 results for XPDUSD", + "mt5_status": "no_mt5_run" + }, + { + "requested": "XPTUSD", + "symbol": "XPTUSD", + "enabled": true, + "max_spread_pips": 50, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 720.57, + "total_trades": 27, + "profit_factor": 1.45 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": 588.61, + "total_trades": 12, + "profit_factor": 1.89, + "score": 708.61, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": 166.51, + "total_trades": 8, + "profit_factor": 1.3, + "score": 246.51, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": -359.41, + "total_trades": 7, + "profit_factor": 0.42, + "score": -358.36, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": 330.98, + "total_trades": 11, + "profit_factor": 1.5, + "score": 440.98, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": 150.19, + "total_trades": 26, + "profit_factor": 1.09, + "score": 410.19, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -67.4, + "total_trades": 22, + "profit_factor": 0.95, + "score": -64.1, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -21.54, + "total_trades": 17, + "profit_factor": 0.98, + "score": -18.99, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 52.17, + "total_trades": 6, + "profit_factor": 1.12, + "score": 112.17, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": 757.68, + "total_trades": 13, + "profit_factor": 2.08, + "score": 887.68, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": 596.83, + "total_trades": 16, + "profit_factor": 1.65, + "score": 756.83, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": 136.82, + "total_trades": 5, + "profit_factor": 1.42, + "score": 186.82, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": 720.57, + "total_trades": 27, + "profit_factor": 1.45, + "score": 990.57, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": 808.6, + "total_trades": 15, + "profit_factor": 2.11, + "score": 958.6, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": 45.38, + "total_trades": 27, + "profit_factor": 1.02, + "score": 315.38, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.0, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.5, + "atr_tp_mult": 5.0, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 50, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + }, + { + "requested": "XTIUSD", + "symbol": "XTIUSD", + "enabled": true, + "max_spread_pips": 30, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + }, + "mt5_metrics": { + "net_profit": 45.66, + "total_trades": 59, + "profit_factor": 1.15 + }, + "sweep_trials": [ + { + "preset": 1, + "net_profit": -52.03, + "total_trades": 43, + "profit_factor": 0.81, + "score": -45.58, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 2, + "net_profit": -9.46, + "total_trades": 43, + "profit_factor": 0.96, + "score": -3.01, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 3, + "net_profit": 45.66, + "total_trades": 59, + "profit_factor": 1.15, + "score": 635.66, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 4, + "net_profit": -122.94, + "total_trades": 49, + "profit_factor": 0.63, + "score": -115.59, + "params": { + "fast_ema": 7, + "slow_ema": 28, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 100, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 5, + "net_profit": -342.09, + "total_trades": 113, + "profit_factor": 0.59, + "score": -325.14, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 2, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 6, + "net_profit": -452.6, + "total_trades": 118, + "profit_factor": 0.51, + "score": -434.9, + "params": { + "fast_ema": 10, + "slow_ema": 36, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 7, + "net_profit": -253.56, + "total_trades": 97, + "profit_factor": 0.64, + "score": -239.01, + "params": { + "fast_ema": 11, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 18, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 8, + "net_profit": 44.41, + "total_trades": 39, + "profit_factor": 1.22, + "score": 434.41, + "params": { + "fast_ema": 10, + "slow_ema": 46, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 4, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 9, + "net_profit": -155.58, + "total_trades": 88, + "profit_factor": 0.73, + "score": -142.38, + "params": { + "fast_ema": 8, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 0, + "session_end": 24, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 10, + "net_profit": -233.48, + "total_trades": 77, + "profit_factor": 0.59, + "score": -221.93, + "params": { + "fast_ema": 9, + "slow_ema": 34, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 1, + "pullback_adx_min": 20, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 11, + "net_profit": -12.19, + "total_trades": 35, + "profit_factor": 0.94, + "score": -6.94, + "params": { + "fast_ema": 10, + "slow_ema": 40, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 3, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": true, + "adx_period": 14, + "adx_min": 15, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 12, + "net_profit": -444.14, + "total_trades": 133, + "profit_factor": 0.56, + "score": -424.19, + "params": { + "fast_ema": 8, + "slow_ema": 36, + "trend_leg_bars": 64, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 13, + "net_profit": -101.22, + "total_trades": 69, + "profit_factor": 0.76, + "score": -90.87, + "params": { + "fast_ema": 8, + "slow_ema": 26, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": false, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 1, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": false, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + }, + { + "preset": 14, + "net_profit": -391.94, + "total_trades": 123, + "profit_factor": 0.58, + "score": -373.49, + "params": { + "fast_ema": 9, + "slow_ema": 30, + "trend_leg_bars": 48, + "min_ema_gap_pips": 1.5, + "cross_cooldown": 2, + "pullback_cooldown": 3, + "use_pullback": true, + "pullback_touch": 0, + "pullback_adx_min": 0.0, + "pullback_min_gap_pips": 0.0, + "max_pullbacks_per_leg": 2, + "atr_period": 20, + "atr_sl_mult": 2.2, + "atr_tp_mult": 4.5, + "max_bars_in_trade": 64, + "htf_ema_period": 200, + "use_htf_filter": true, + "use_adx_filter": false, + "adx_period": 14, + "adx_min": 18.0, + "session_start": 8, + "session_end": 22, + "max_spread_pips": 30, + "lot_size": 0.05, + "initial_balance": 10000.0 + } + } + ], + "mt5_status": "ok" + } + ], + "mt5_enabled_count": 35, + "mt5_enabled_trades": 1825, + "mt5_enabled_net": 13637.75 +} \ No newline at end of file diff --git a/lab/EAs/SimpleEMA/portfolio_report.json b/lab/EAs/SimpleEMA/portfolio_report.json new file mode 100644 index 0000000..0aee9b5 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_report.json @@ -0,0 +1,304 @@ +{ + "metrics": { + "net_profit": 1847.0, + "total_trades": 3222, + "profit_factor": 1.05, + "win_rate": 36.8, + "max_drawdown_pct": 28.41, + "profitable_symbols": 8, + "symbol_count": 20, + "target_met_2000_trades": true, + "target_met_profit": true + }, + "per_symbol": [ + { + "symbol": "EURUSD", + "enabled": true, + "trades": 79, + "net_profit": 119.63, + "profit_factor": 1.23, + "win_rate": 41.8 + }, + { + "symbol": "GBPUSD", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "USDJPY", + "enabled": true, + "trades": 141, + "net_profit": -217.9, + "profit_factor": 0.84, + "win_rate": 35.5 + }, + { + "symbol": "USDCHF", + "enabled": true, + "trades": 70, + "net_profit": -167.12, + "profit_factor": 0.76, + "win_rate": 32.9 + }, + { + "symbol": "USDCAD", + "enabled": true, + "trades": 96, + "net_profit": 26.33, + "profit_factor": 1.05, + "win_rate": 36.5 + }, + { + "symbol": "AUDUSD", + "enabled": true, + "trades": 45, + "net_profit": 31.36, + "profit_factor": 1.08, + "win_rate": 35.6 + }, + { + "symbol": "NZDUSD", + "enabled": true, + "trades": 39, + "net_profit": -40.88, + "profit_factor": 0.86, + "win_rate": 38.5 + }, + { + "symbol": "EURGBP", + "enabled": true, + "trades": 24, + "net_profit": -165.73, + "profit_factor": 0.3, + "win_rate": 20.8 + }, + { + "symbol": "EURJPY", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "GBPJPY", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "EURCHF", + "enabled": true, + "trades": 40, + "net_profit": -28.83, + "profit_factor": 0.91, + "win_rate": 35.0 + }, + { + "symbol": "GBPCHF", + "enabled": true, + "trades": 59, + "net_profit": -488.75, + "profit_factor": 0.39, + "win_rate": 20.3 + }, + { + "symbol": "EURAUD", + "enabled": true, + "trades": 140, + "net_profit": 100.38, + "profit_factor": 1.09, + "win_rate": 40.0 + }, + { + "symbol": "EURNZD", + "enabled": true, + "trades": 188, + "net_profit": -98.98, + "profit_factor": 0.93, + "win_rate": 36.7 + }, + { + "symbol": "EURCAD", + "enabled": true, + "trades": 121, + "net_profit": -557.92, + "profit_factor": 0.46, + "win_rate": 25.6 + }, + { + "symbol": "GBPAUD", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "GBPNZD", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "GBPCAD", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "AUDNZD", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "AUDCAD", + "enabled": true, + "trades": 39, + "net_profit": -110.28, + "profit_factor": 0.58, + "win_rate": 23.1 + }, + { + "symbol": "NZDCAD", + "enabled": true, + "trades": 92, + "net_profit": -110.47, + "profit_factor": 0.78, + "win_rate": 28.3 + }, + { + "symbol": "AUDJPY", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "NZDJPY", + "enabled": true, + "trades": 69, + "net_profit": -205.8, + "profit_factor": 0.59, + "win_rate": 30.4 + }, + { + "symbol": "CADJPY", + "enabled": true, + "trades": 176, + "net_profit": -22.37, + "profit_factor": 0.98, + "win_rate": 39.2 + }, + { + "symbol": "CHFJPY", + "enabled": true, + "trades": 202, + "net_profit": 118.79, + "profit_factor": 1.08, + "win_rate": 41.1 + }, + { + "symbol": "XAUUSD", + "enabled": true, + "trades": 760, + "net_profit": 3259.98, + "profit_factor": 1.14, + "win_rate": 40.0 + }, + { + "symbol": "XAGUSD", + "enabled": true, + "trades": 191, + "net_profit": 402.97, + "profit_factor": 1.23, + "win_rate": 37.2 + }, + { + "symbol": "XPTUSD", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "US500", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "NAS100", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "US30", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "GER40", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "UK100", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "JPN225", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "BTCUSD", + "enabled": true, + "trades": 0, + "net_profit": 0.0, + "profit_factor": 0.0, + "win_rate": 0.0 + }, + { + "symbol": "ETHUSD", + "enabled": true, + "trades": 651, + "net_profit": 2.59, + "profit_factor": 1.0, + "win_rate": 37.3 + } + ], + "enabled_count": 36 +} \ No newline at end of file diff --git a/lab/EAs/SimpleEMA/portfolio_symbols.json b/lab/EAs/SimpleEMA/portfolio_symbols.json new file mode 100644 index 0000000..f89f5c9 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_symbols.json @@ -0,0 +1,28 @@ +{ + "timeframe": "M15", + "period": ["2020-01-01", "2026-01-01"], + "lot_per_symbol": 0.05, + "initial_balance": 10000, + "symbols": [ + {"name": "EURUSD", "max_spread_pips": 6}, + {"name": "GBPUSD", "max_spread_pips": 8}, + {"name": "USDJPY", "max_spread_pips": 8}, + {"name": "USDCHF", "max_spread_pips": 8}, + {"name": "USDCAD", "max_spread_pips": 8}, + {"name": "AUDUSD", "max_spread_pips": 8}, + {"name": "NZDUSD", "max_spread_pips": 10}, + {"name": "EURGBP", "max_spread_pips": 8}, + {"name": "EURJPY", "max_spread_pips": 10}, + {"name": "GBPJPY", "max_spread_pips": 12}, + {"name": "EURAUD", "max_spread_pips": 10}, + {"name": "EURNZD", "max_spread_pips": 12}, + {"name": "AUDJPY", "max_spread_pips": 10}, + {"name": "CADJPY", "max_spread_pips": 10}, + {"name": "CHFJPY", "max_spread_pips": 10}, + {"name": "GBPAUD", "max_spread_pips": 12}, + {"name": "GBPCAD", "max_spread_pips": 12}, + {"name": "AUDNZD", "max_spread_pips": 12}, + {"name": "XAUUSD", "max_spread_pips": 35}, + {"name": "XAGUSD", "max_spread_pips": 40} + ] +} diff --git a/lab/EAs/SimpleEMA/portfolio_symbols_expanded.json b/lab/EAs/SimpleEMA/portfolio_symbols_expanded.json new file mode 100644 index 0000000..cf91c37 --- /dev/null +++ b/lab/EAs/SimpleEMA/portfolio_symbols_expanded.json @@ -0,0 +1,58 @@ +{ + "timeframe": "M15", + "period": ["2020-01-01", "2026-01-01"], + "lot_per_symbol": 0.05, + "initial_balance": 10000, + "categories": { + "majors": ["EURUSD", "GBPUSD", "USDJPY", "USDCHF", "USDCAD", "AUDUSD", "NZDUSD"], + "crosses": ["EURGBP", "EURJPY", "GBPJPY", "EURCHF", "GBPCHF", "EURAUD", "EURNZD", "EURCAD", "GBPAUD", "GBPNZD", "GBPCAD", "AUDNZD", "AUDCAD", "NZDCAD"], + "jpy_cross": ["AUDJPY", "NZDJPY", "CADJPY", "CHFJPY"], + "metals": ["XAUUSD", "XAGUSD", "XPTUSD", "XPDUSD"], + "indices": ["US500", "NAS100", "US30", "GER40", "UK100", "JPN225"], + "crypto": ["BTCUSD", "ETHUSD"], + "commodities": ["XTIUSD", "XBRUSD"], + "cnh": ["USDCNH"] + }, + "symbols": [ + {"name": "EURUSD", "max_spread_pips": 6, "category": "majors"}, + {"name": "GBPUSD", "max_spread_pips": 8, "category": "majors"}, + {"name": "USDJPY", "max_spread_pips": 8, "category": "majors"}, + {"name": "USDCHF", "max_spread_pips": 8, "category": "majors"}, + {"name": "USDCAD", "max_spread_pips": 8, "category": "majors"}, + {"name": "AUDUSD", "max_spread_pips": 8, "category": "majors"}, + {"name": "NZDUSD", "max_spread_pips": 10, "category": "majors"}, + {"name": "EURGBP", "max_spread_pips": 8, "category": "crosses"}, + {"name": "EURJPY", "max_spread_pips": 10, "category": "crosses"}, + {"name": "GBPJPY", "max_spread_pips": 12, "category": "crosses"}, + {"name": "EURCHF", "max_spread_pips": 10, "category": "crosses"}, + {"name": "GBPCHF", "max_spread_pips": 12, "category": "crosses"}, + {"name": "EURAUD", "max_spread_pips": 10, "category": "crosses"}, + {"name": "EURNZD", "max_spread_pips": 12, "category": "crosses"}, + {"name": "EURCAD", "max_spread_pips": 10, "category": "crosses"}, + {"name": "GBPAUD", "max_spread_pips": 12, "category": "crosses"}, + {"name": "GBPNZD", "max_spread_pips": 14, "category": "crosses"}, + {"name": "GBPCAD", "max_spread_pips": 12, "category": "crosses"}, + {"name": "AUDNZD", "max_spread_pips": 12, "category": "crosses"}, + {"name": "AUDCAD", "max_spread_pips": 12, "category": "crosses"}, + {"name": "NZDCAD", "max_spread_pips": 12, "category": "crosses"}, + {"name": "AUDJPY", "max_spread_pips": 10, "category": "jpy_cross"}, + {"name": "NZDJPY", "max_spread_pips": 12, "category": "jpy_cross"}, + {"name": "CADJPY", "max_spread_pips": 10, "category": "jpy_cross"}, + {"name": "CHFJPY", "max_spread_pips": 10, "category": "jpy_cross"}, + {"name": "XAUUSD", "max_spread_pips": 35, "category": "metals"}, + {"name": "XAGUSD", "max_spread_pips": 40, "category": "metals"}, + {"name": "XPTUSD", "max_spread_pips": 50, "category": "metals"}, + {"name": "XPDUSD", "max_spread_pips": 80, "category": "metals"}, + {"name": "US500", "max_spread_pips": 15, "category": "indices"}, + {"name": "NAS100", "max_spread_pips": 20, "category": "indices"}, + {"name": "US30", "max_spread_pips": 20, "category": "indices"}, + {"name": "GER40", "max_spread_pips": 20, "category": "indices"}, + {"name": "UK100", "max_spread_pips": 20, "category": "indices"}, + {"name": "JPN225", "max_spread_pips": 25, "category": "indices"}, + {"name": "BTCUSD", "max_spread_pips": 50, "category": "crypto"}, + {"name": "ETHUSD", "max_spread_pips": 40, "category": "crypto"}, + {"name": "XTIUSD", "max_spread_pips": 30, "category": "commodities"}, + {"name": "XBRUSD", "max_spread_pips": 30, "category": "commodities"}, + {"name": "USDCNH", "max_spread_pips": 15, "category": "cnh"} + ] +} diff --git a/lab/EAs/SimpleEMA/run_backtest.py b/lab/EAs/SimpleEMA/run_backtest.py new file mode 100644 index 0000000..967bc6f --- /dev/null +++ b/lab/EAs/SimpleEMA/run_backtest.py @@ -0,0 +1,285 @@ +""" +SimpleEMA — Python bar backtest mirroring main.mq5 (MT5 live data). + +Outputs in this folder: + backtest_report.json, trades.csv, report.png, equity_curve.png, ... + +Usage: + python run_backtest.py + python run_backtest.py --start 2023-01-01 --end 2026-01-01 + python run_backtest.py --fast 12 --slow 26 --atr-sl 1.5 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) + +from cluster_audit.backtest_core import ( # noqa: E402 + BacktestReport, + CostModel, + load_bars, + resolve_symbol, + run_single_position, +) +from indicator_utils import calculate_atr, calculate_ema # noqa: E402 + +STRATEGY_ID = "SimpleEMA" +DEFAULT_SYMBOL = "EURUSD" +DEFAULT_TF = mt5.TIMEFRAME_H1 + + +def pip_size(symbol: str) -> float: + info = mt5.symbol_info(symbol) + if not info: + return 0.0001 + pt = float(info.point) + return pt * 10.0 if info.digits in (3, 5) else pt + + +@dataclass +class StrategyParams: + fast_ema: int = 12 + slow_ema: int = 26 + min_ema_gap_pips: float = 0.0 + lot_size: float = 0.10 + use_atr_stops: bool = True + atr_period: int = 14 + atr_sl_mult: float = 1.5 + atr_tp_mult: float = 2.5 + stop_loss_pips: int = 30 + take_profit_pips: int = 60 + use_trailing: bool = False + trail_pips: int = 20 + exit_on_cross: bool = True + max_bars_in_trade: int = 48 + max_spread_pips: int = 5 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict: + return asdict(self) + + +def save_reports(report: BacktestReport, out_dir: Path) -> None: + rows = [ + { + "side": t.side, + "open_time": t.open_time, + "close_time": t.close_time, + "open_price": t.open_price, + "close_price": t.close_price, + "volume": t.volume, + "profit": t.profit, + "bars_held": t.bars_held, + "exit_reason": t.exit_reason, + } + for t in report.trades_list + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report.to_dict(), f, indent=2, ensure_ascii=False) + + if not report.trades_list: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades in backtest window", ha="center", va="center", fontsize=14) + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + df = pd.DataFrame(rows) + df["close_time"] = pd.to_datetime(df["close_time"]) + df = df.sort_values("close_time") + bal0 = report.params.get("initial_balance", 10_000.0) + eq = report.equity_curve if report.equity_curve is not None and len(report.equity_curve) > 1 else None + if eq is None: + eq = pd.Series(bal0 + df["profit"].cumsum().values, index=df["close_time"]) + equity_times, equity = eq.index, eq + dd = (equity - equity.cummax()) / equity.cummax() * 100 + + fig = plt.figure(figsize=(14, 10)) + gs = fig.add_gridspec(3, 2, height_ratios=[2, 1.2, 1.2]) + ax1 = fig.add_subplot(gs[0, :]) + ax1.plot(equity_times, equity, lw=1.8) + ax1.axhline(bal0, color="gray", ls="--") + ax1.set_title("Equity Curve") + ax1.grid(alpha=0.3) + ax2 = fig.add_subplot(gs[1, 0]) + ax2.fill_between(equity_times, dd, 0, color="#d62728", alpha=0.35) + ax2.set_title("Drawdown %") + ax2.grid(alpha=0.3) + ax3 = fig.add_subplot(gs[1, 1]) + df["month"] = df["close_time"].dt.to_period("M") + monthly = df.groupby("month")["profit"].sum() + ax3.bar(range(len(monthly)), monthly.values, color=["#2ca02c" if v >= 0 else "#d62728" for v in monthly]) + ax3.set_title("Monthly PnL") + ax4 = fig.add_subplot(gs[2, 0]) + ax4.hist(df["profit"], bins=30, color="#9467bd", alpha=0.85) + ax4.axvline(0, color="black") + ax4.set_title("Trade PnL Distribution") + ax5 = fig.add_subplot(gs[2, 1]) + rc = df["exit_reason"].value_counts() + ax5.bar(rc.index.astype(str), rc.values, color="#ff7f0e") + ax5.set_title("Exit Reasons") + fig.suptitle( + f"{STRATEGY_ID} — Net ${report.net_profit:,.2f} | Trades {report.total_trades} | " + f"WR {report.win_rate:.1f}% | PF {report.profit_factor:.2f} | MaxDD {report.max_drawdown_pct:.2f}%", + fontsize=11, + ) + fig.tight_layout(rect=[0, 0, 1, 0.96]) + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + +def run_backtest(df, symbol, params: StrategyParams, costs, period_label) -> BacktestReport: + info = mt5.symbol_info(symbol) + point = float(info.point) if info else 0.00001 + pip = pip_size(symbol) + fast = calculate_ema(df["close"], params.fast_ema).to_numpy() + slow = calculate_ema(df["close"], params.slow_ema).to_numpy() + atr = calculate_atr(df, params.atr_period).to_numpy() + p = params.to_dict() + + def on_bar(i, st, open_pos, close): + if i < 3 or np.isnan(fast[i - 1]) or np.isnan(slow[i - 1]): + return + + fast1, fast2 = fast[i - 1], fast[i - 2] + slow1, slow2 = slow[i - 1], slow[i - 2] + bull = fast2 <= slow2 and fast1 > slow1 + bear = fast2 >= slow2 and fast1 < slow1 + gap_pips = abs(fast1 - slow1) / pip if pip > 0 else 0.0 + mid = float(df["open"].iloc[i]) + hi, lo = float(df["high"].iloc[i]), float(df["low"].iloc[i]) + atr1 = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + + bars_held = i - st.entry_i if st.side else 0 + if st.side and params.max_bars_in_trade > 0 and bars_held >= params.max_bars_in_trade: + close(i, mid, "max_bars") + return + + if st.side and params.exit_on_cross: + if st.side == "BUY" and bear: + close(i, mid, "bear_cross") + return + if st.side == "SELL" and bull: + close(i, mid, "bull_cross") + return + + if st.side and params.use_trailing: + trail = params.trail_pips * pip + if st.side == "BUY" and hi - st.entry > trail: + new_sl = hi - trail + if st.sl is None or new_sl > st.sl: + st.sl = new_sl + elif st.side == "SELL" and st.entry - lo > trail: + new_sl = lo + trail + if st.sl is None or new_sl < st.sl: + st.sl = new_sl + + if st.side == "BUY": + if params.use_atr_stops and atr1 > 0: + sl_px = st.entry - atr1 * params.atr_sl_mult + tp_px = st.entry + atr1 * params.atr_tp_mult + else: + sl_px = st.entry - params.stop_loss_pips * pip + tp_px = st.entry + params.take_profit_pips * pip + if lo <= sl_px: + close(i, sl_px, "sl") + return + if hi >= tp_px: + close(i, tp_px, "tp") + return + elif st.side == "SELL": + if params.use_atr_stops and atr1 > 0: + sl_px = st.entry + atr1 * params.atr_sl_mult + tp_px = st.entry - atr1 * params.atr_tp_mult + else: + sl_px = st.entry + params.stop_loss_pips * pip + tp_px = st.entry - params.take_profit_pips * pip + if hi >= sl_px: + close(i, sl_px, "sl") + return + if lo <= tp_px: + close(i, tp_px, "tp") + return + else: + spread_pips = costs.spread_points * point / pip if pip > 0 else 0 + if params.max_spread_pips > 0 and spread_pips > params.max_spread_pips: + return + if bull and gap_pips >= params.min_ema_gap_pips: + open_pos(i, "BUY", mid) + elif bear and gap_pips >= params.min_ema_gap_pips: + open_pos(i, "SELL", mid) + + return run_single_position( + df, symbol, point, costs, params.lot_size, + STRATEGY_ID, "H1", period_label, p, params.initial_balance, on_bar, + ) + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} Python backtest (MT5 data)") + p.add_argument("--symbol", default=DEFAULT_SYMBOL) + p.add_argument("--start", default="2023-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + p.add_argument("--fast", type=int, default=12) + p.add_argument("--slow", type=int, default=26) + p.add_argument("--lot", type=float, default=0.10) + p.add_argument("--atr-sl", type=float, default=1.5) + p.add_argument("--atr-tp", type=float, default=2.5) + p.add_argument("--no-atr", action="store_true") + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = StrategyParams( + fast_ema=args.fast, + slow_ema=args.slow, + lot_size=args.lot, + atr_sl_mult=args.atr_sl, + atr_tp_mult=args.atr_tp, + use_atr_stops=not args.no_atr, + initial_balance=args.balance, + ) + if not mt5.initialize(): + raise SystemExit("MetaTrader5 initialize() failed — open MT5 and log in first") + try: + symbol = resolve_symbol(args.symbol) + start = datetime.fromisoformat(args.start) + end = datetime.fromisoformat(args.end) + period_label = f"{args.start}_{args.end}" + print(f"Loading {symbol} H1 bars {args.start} → {args.end} ...") + df = load_bars(symbol, DEFAULT_TF, start, end) + costs = CostModel.for_symbol(symbol) + report = run_backtest(df, symbol, params, costs, period_label) + save_reports(report, out_dir) + print( + f"Net: ${report.net_profit:,.2f} | Trades: {report.total_trades} | " + f"WR: {report.win_rate:.1f}% | PF: {report.profit_factor:.2f} | " + f"MaxDD: {report.max_drawdown_pct:.2f}%" + ) + print(f"Saved trades.csv + charts → {out_dir}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_full_pipeline.py b/lab/EAs/SimpleEMA/run_full_pipeline.py new file mode 100644 index 0000000..684bdf0 --- /dev/null +++ b/lab/EAs/SimpleEMA/run_full_pipeline.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +""" +Full pipeline: per-symbol param search -> MT5 validate -> sync enabled -> MT5 re-run enabled set. + +Usage: + python run_full_pipeline.py + python run_full_pipeline.py --skip-python-opt # MT5 only on existing params + python run_full_pipeline.py --mt5-only-enabled # second pass after sync +""" + +from __future__ import annotations + +import argparse +import json +import subprocess +import sys +from pathlib import Path + +LAB = Path(__file__).resolve().parent + + +def run(cmd: list[str]) -> None: + print(f"\n>>> {' '.join(cmd)}\n") + subprocess.run(cmd, cwd=LAB, check=True) + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--config", default="portfolio_symbols_expanded.json") + ap.add_argument("--trials", type=int, default=280) + ap.add_argument("--from", dest="from_date", default="2020.01.01") + ap.add_argument("--to", dest="to_date", default="2026.01.01") + ap.add_argument("--skip-python-opt", action="store_true") + ap.add_argument("--mt5-only-enabled", action="store_true", help="after sync, re-test enabled symbols only") + args = ap.parse_args() + + py = sys.executable + cfg = LAB / args.config + + if not args.skip_python_opt: + run([py, "run_optimize_portfolio.py", "--config", str(cfg), "--trials", str(args.trials), "--min-trades", "8"]) + + run([py, "run_mt5_portfolio.py", "--params", "portfolio_params.json", "--from", args.from_date, "--to", args.to_date]) + + run([py, "sync_portfolio_from_mt5.py", "--min-pf", "1.0", "--min-trades", "8"]) + + run([py, "run_mt5_portfolio.py", "--params", "portfolio_params.json", "--enabled-only", "--from", args.from_date, "--to", args.to_date]) + + run([py, "generate_mt5_portfolio_report.py"]) + + mt5 = json.loads((LAB / "best_run" / "mt5_results.json").read_text(encoding="utf-8")) + params = json.loads((LAB / "portfolio_params.json").read_text(encoding="utf-8")) + en = [m for m in params["members"] if m.get("enabled")] + trades = sum(m.get("mt5_metrics", {}).get("total_trades", 0) for m in en) + net = sum(m.get("mt5_metrics", {}).get("net_profit", 0) for m in en) + total = mt5["portfolio"]["total_trades"] + + print("\n=== PIPELINE DONE ===") + print(f" MT5 tested (all): {total} trades") + print(f" MT5 enabled ({len(en)} syms): {trades} trades net=${net:,.2f}") + print(f" Target 2000+: {'YES' if trades >= 2000 else 'NO — add symbols or run MT5 genetic optimize'}") + print(f" Report: best_run/MT5_PORTFOLIO_REPORT.md") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_mt5_portfolio.py b/lab/EAs/SimpleEMA/run_mt5_portfolio.py new file mode 100644 index 0000000..70e34c8 --- /dev/null +++ b/lab/EAs/SimpleEMA/run_mt5_portfolio.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python3 +""" +Run MT5 Strategy Tester for each enabled portfolio symbol (source of truth). + +Each symbol: main.mq5 + per-symbol .set from portfolio_params.json. +Aggregates HTML report metrics into best_run/mt5_results.json. + +Usage: + python run_mt5_portfolio.py + python run_mt5_portfolio.py --only EURUSD,XAUUSD + python run_mt5_portfolio.py --from 2020.01.01 --to 2026.01.01 +""" + +from __future__ import annotations + +import argparse +import json +import shutil +import sys +import time +from datetime import datetime +from pathlib import Path + +LAB = Path(__file__).resolve().parent +ROOT = LAB.parents[2] # repo root: .../profitable-expert-advisor +sys.path.insert(0, str(LAB)) + +from run_mt5_tester import mt5_context, run_tester # noqa: E402 + + +def write_member_set(params: dict, path: Path) -> None: + """Write MT5 .set from portfolio_params member dict (no Python backtest imports).""" + p = params + lines = [ + "; SimpleEMA v5 — per-symbol MT5 set", + "Timeframe=16388", + f"FastEmaPeriod={p['fast_ema']}", + f"SlowEmaPeriod={p['slow_ema']}", + f"TrendLegBars={p['trend_leg_bars']}", + f"MinEmaGapPips={p['min_ema_gap_pips']}", + f"CrossCooldown={p['cross_cooldown']}", + f"PullbackCooldown={p['pullback_cooldown']}", + f"UsePullback={'true' if p['use_pullback'] else 'false'}", + f"PullbackTouch={p['pullback_touch']}", + f"PullbackAdxMin={p['pullback_adx_min']}", + f"PullbackMinGapPips={p['pullback_min_gap_pips']}", + f"MaxPullbacksPerLeg={p['max_pullbacks_per_leg']}", + f"AtrPeriod={p['atr_period']}", + f"AtrSlMult={p['atr_sl_mult']}", + f"AtrTpMult={p['atr_tp_mult']}", + f"MaxBarsInTrade={p['max_bars_in_trade']}", + f"HtfEmaPeriod={p['htf_ema_period']}", + f"UseHtfFilter={'true' if p['use_htf_filter'] else 'false'}", + f"UseAdxFilter={'true' if p['use_adx_filter'] else 'false'}", + f"AdxPeriod={p['adx_period']}", + f"AdxMin={p['adx_min']}", + f"SessionStartHour={p['session_start']}", + f"SessionEndHour={p['session_end']}", + f"MaxSpreadPips={p['max_spread_pips']}", + f"LotSize={p['lot_size']}", + ] + path.write_text("\n".join(lines) + "\n", encoding="utf-8") + +SETS_DIR = LAB / "mt5_sets" +OUT_DIR = LAB / "best_run" / "mt5_reports" +RESULTS_JSON = LAB / "best_run" / "mt5_results.json" + + +def load_members(params_path: Path, only: set[str] | None, enabled_only: bool = False) -> tuple[list[dict], dict]: + data = json.loads(params_path.read_text(encoding="utf-8")) + members = [m for m in data.get("members", []) if "params" in m] + if enabled_only: + members = [m for m in members if m.get("enabled")] + if only: + only_up = {s.upper() for s in only} + members = [m for m in members if m["symbol"].upper() in only_up or m.get("requested", "").upper() in only_up] + return members, data.get("config", {}) + + +def tester_symbol(sym: str) -> str: + """Use broker symbol as stored in portfolio_params.""" + return sym.split(".")[0] if "." not in sym else sym + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--params", type=Path, default=LAB / "portfolio_params.json") + ap.add_argument("--only", default="", help="comma-separated symbols, e.g. EURUSD,XAUUSD") + ap.add_argument("--enabled-only", action="store_true", help="test only MT5-enabled symbols") + ap.add_argument("--from", dest="from_date", default="2020.01.01") + ap.add_argument("--to", dest="to_date", default="2026.01.01") + ap.add_argument("--period", default="M15", choices=["M15", "M30", "H1", "H4"]) + ap.add_argument("--deposit", type=float, default=10000) + ap.add_argument("--leverage", type=int, default=100) + args = ap.parse_args() + + only = {s.strip() for s in args.only.split(",") if s.strip()} or None + members, cfg = load_members(args.params, only, enabled_only=args.enabled_only) + if not members: + raise SystemExit("No enabled members in portfolio_params.json") + + SETS_DIR.mkdir(exist_ok=True) + OUT_DIR.mkdir(parents=True, exist_ok=True) + (LAB / "best_run").mkdir(exist_ok=True) + + ctx = mt5_context() + rows: list[dict] = [] + t0 = time.time() + + print(f"MT5 portfolio backtest: {len(members)} symbols {args.from_date} -> {args.to_date} {args.period}") + print("(Each symbol = separate MT5 Strategy Tester run with its own .set)\n") + + for i, m in enumerate(members, 1): + sym = m["symbol"] + test_sym = tester_symbol(sym) + set_name = f"SimpleEMA_{test_sym}.set" + set_path = SETS_DIR / set_name + write_member_set(m["params"], set_path) + + report = f"SimpleEMA_pf_{test_sym}" + print(f"[{i}/{len(members)}] {test_sym} ...") + try: + metrics = run_tester( + ctx, + mode="backtest", + set_path=set_path, + set_name=set_name, + report=report, + symbol=test_sym, + period=args.period, + from_date=args.from_date, + to_date=args.to_date, + deposit=args.deposit, + leverage=args.leverage, + visual=False, + timeout_sec=7200, + ) + except Exception as exc: # noqa: BLE001 + print(f" FAIL {test_sym}: {exc}") + rows.append({"symbol": sym, "ready": False, "error": str(exc)}) + continue + + if metrics.get("ready") and metrics.get("report"): + src = Path(metrics["report"]) + dst = OUT_DIR / src.name + shutil.copy2(src, dst) + metrics["report_local"] = str(dst) + + row = { + "symbol": sym, + "test_symbol": test_sym, + "ready": metrics.get("ready", False), + "net_profit": metrics.get("net_profit"), + "total_trades": metrics.get("total_trades"), + "profit_factor": metrics.get("profit_factor"), + "sharpe": metrics.get("sharpe"), + "max_drawdown": metrics.get("max_drawdown"), + "elapsed_sec": metrics.get("elapsed_sec"), + "report": metrics.get("report_local") or metrics.get("report"), + "set_file": str(set_path), + } + rows.append(row) + if row["ready"]: + print( + f" OK net={row['net_profit']} trades={row['total_trades']} " + f"PF={row['profit_factor']} ({row['elapsed_sec']}s)" + ) + else: + print(f" NO REPORT for {test_sym}") + + ok = [r for r in rows if r.get("ready")] + total_trades = sum(r.get("total_trades") or 0 for r in ok) + total_net = sum(r.get("net_profit") or 0 for r in ok) + gp = sum(r.get("net_profit") or 0 for r in ok if (r.get("net_profit") or 0) > 0) + gl = abs(sum(r.get("net_profit") or 0 for r in ok if (r.get("net_profit") or 0) < 0)) + + payload = { + "source": "mt5_strategy_tester", + "generated_at": datetime.now().isoformat(timespec="seconds"), + "period": {"from": args.from_date, "to": args.to_date, "timeframe": args.period}, + "deposit_per_symbol": args.deposit, + "note": "Sum of independent MT5 single-symbol runs. NOT Python simulation.", + "portfolio": { + "symbols_tested": len(ok), + "symbols_failed": len(rows) - len(ok), + "total_trades": total_trades, + "net_profit_sum": round(total_net, 2), + "profit_factor_approx": round(gp / gl, 2) if gl > 0 else None, + }, + "per_symbol": rows, + } + RESULTS_JSON.write_text(json.dumps(payload, indent=2), encoding="utf-8") + + print(f"\n=== MT5 Portfolio (aggregated) ===") + print(f" symbols OK: {len(ok)}/{len(rows)}") + print(f" total_trades: {total_trades}") + print(f" net_profit (sum): ${total_net:,.2f}") + print(f" saved: {RESULTS_JSON}") + print(f" HTML reports: {OUT_DIR}") + print(f" elapsed: {time.time() - t0:.0f}s") + print("\nNext: python generate_mt5_portfolio_report.py") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_mt5_preset_sweep.py b/lab/EAs/SimpleEMA/run_mt5_preset_sweep.py new file mode 100644 index 0000000..5698e2b --- /dev/null +++ b/lab/EAs/SimpleEMA/run_mt5_preset_sweep.py @@ -0,0 +1,305 @@ +#!/usr/bin/env python3 +""" +Per-symbol MT5 preset sweep (Strategy Tester = source of truth). + +Tests curated high-frequency v5 presets per symbol, picks best by +profit + trade-count score, writes portfolio_params.json + mt5_sets/. + +Usage: + python run_mt5_preset_sweep.py + python run_mt5_preset_sweep.py --only EURUSD,XAGUSD,XAUUSD + python run_mt5_preset_sweep.py --config portfolio_symbols_expanded.json +""" + +from __future__ import annotations + +import argparse +import json +import sys +import time +from dataclasses import asdict, replace +from datetime import datetime +from pathlib import Path + +LAB = Path(__file__).resolve().parent +sys.path.insert(0, str(LAB)) + +from run_mt5_portfolio import write_member_set # noqa: E402 +from run_mt5_tester import mt5_context, run_tester # noqa: E402 +from run_portfolio_v5 import load_portfolio_config # noqa: E402 +from strategy_v5 import V5Params # noqa: E402 + +OUT_PATH = LAB / "portfolio_params.json" +SETS_DIR = LAB / "mt5_sets" +SWEEP_LOG = LAB / "best_run" / "mt5_preset_sweep.json" + + +def is_metal(name: str) -> bool: + b = name.upper().split(".")[0] + return b.startswith("XAU") or b.startswith("XAG") or b.startswith("XPT") or b.startswith("XPD") + + +def is_oil(name: str) -> bool: + b = name.upper() + return "XTI" in b or "XBR" in b or "OIL" in b + + +def is_index(name: str) -> bool: + b = name.upper().split(".")[0] + return b in {"US500", "NAS100", "US30", "GER40", "UK100", "JPN225", "SPX500", "USTEC"} + + +def is_crypto(name: str) -> bool: + b = name.upper().split(".")[0] + return b.startswith("BTC") or b.startswith("ETH") + + +def presets_for_symbol(name: str, lot: float, spread_cap: float) -> list[V5Params]: + base = [ + V5Params(fast_ema=8, slow_ema=30, cross_cooldown=2, htf_ema_period=100, use_pullback=False), + V5Params(fast_ema=9, slow_ema=34, cross_cooldown=2, htf_ema_period=100, use_pullback=False), + V5Params(fast_ema=10, slow_ema=36, cross_cooldown=2, use_htf_filter=False, use_pullback=False), + V5Params(fast_ema=7, slow_ema=28, cross_cooldown=2, htf_ema_period=100, use_pullback=False), + V5Params( + fast_ema=8, slow_ema=30, cross_cooldown=2, use_pullback=True, + pullback_cooldown=2, trend_leg_bars=48, + ), + V5Params( + fast_ema=10, slow_ema=36, cross_cooldown=3, use_pullback=True, + max_pullbacks_per_leg=2, + ), + V5Params( + fast_ema=11, slow_ema=40, cross_cooldown=4, use_pullback=True, + pullback_adx_min=18, + ), + V5Params(fast_ema=10, slow_ema=46, cross_cooldown=4, htf_ema_period=200, use_pullback=False), + V5Params( + fast_ema=8, slow_ema=30, cross_cooldown=2, session_start=0, session_end=24, + use_htf_filter=False, use_pullback=False, + ), + V5Params( + fast_ema=9, slow_ema=34, cross_cooldown=3, use_pullback=True, + pullback_touch=1, pullback_adx_min=20, + ), + V5Params( + fast_ema=10, slow_ema=40, cross_cooldown=3, use_adx_filter=True, + adx_min=15, use_pullback=False, + ), + V5Params( + fast_ema=8, slow_ema=36, cross_cooldown=2, use_pullback=True, + max_pullbacks_per_leg=2, trend_leg_bars=64, + ), + V5Params(fast_ema=8, slow_ema=26, cross_cooldown=2, use_htf_filter=False, use_pullback=False), + V5Params(fast_ema=9, slow_ema=30, cross_cooldown=2, use_pullback=True, max_pullbacks_per_leg=2), + # ultra high-frequency (more trades) + V5Params(fast_ema=7, slow_ema=24, cross_cooldown=2, use_htf_filter=False, use_pullback=False), + V5Params(fast_ema=8, slow_ema=26, cross_cooldown=2, session_start=0, session_end=24, use_htf_filter=False, use_pullback=False), + V5Params(fast_ema=7, slow_ema=22, cross_cooldown=2, use_pullback=True, max_pullbacks_per_leg=2, trend_leg_bars=72), + V5Params(fast_ema=9, slow_ema=28, cross_cooldown=2, use_htf_filter=False, use_pullback=True, pullback_cooldown=2), + ] + out: list[V5Params] = [] + for p0 in base: + p = replace(p0, lot_size=lot, max_spread_pips=spread_cap) + if is_metal(name): + p = replace(p, atr_sl_mult=2.5, atr_tp_mult=5.0, min_ema_gap_pips=1.0) + elif is_oil(name): + p = replace(p, atr_sl_mult=2.2, atr_tp_mult=4.5, max_spread_pips=max(spread_cap, 25.0)) + elif is_index(name) or is_crypto(name): + p = replace(p, atr_sl_mult=2.0, atr_tp_mult=4.0, min_ema_gap_pips=2.0) + elif "JPY" in name.upper() or "CNH" in name.upper(): + p = replace(p, max_spread_pips=max(spread_cap, 12.0)) + out.append(p) + return out + + +def score_mt5(net: float | None, trades: int | None, pf: float | None) -> float: + net = net or 0.0 + trades = trades or 0 + pf = pf or 0.0 + if net > 0 and pf >= 1.0: + return net + trades * 10.0 + if net > 0 and pf >= 0.95: + return net + trades * 4.0 + return net + trades * 0.15 + + +def sweep_symbol( + ctx: dict, + sym: str, + spread_cap: float, + lot: float, + from_date: str, + to_date: str, + period: str, + deposit: float, + leverage: int, +) -> dict: + test_sym = sym.split(".")[0] + presets = presets_for_symbol(sym, lot, spread_cap) + trials: list[dict] = [] + best: dict | None = None + best_score = -1e18 + + for i, p in enumerate(presets, 1): + set_name = f"SimpleEMA_sweep_{test_sym}_{i}.set" + set_path = SETS_DIR / set_name + write_member_set(asdict(p), set_path) + report = f"SimpleEMA_sweep_{test_sym}_{i}" + try: + m = run_tester( + ctx, + mode="backtest", + set_path=set_path, + set_name=set_name, + report=report, + symbol=test_sym, + period=period, + from_date=from_date, + to_date=to_date, + deposit=deposit, + leverage=leverage, + visual=False, + timeout_sec=7200, + ) + except Exception as exc: # noqa: BLE001 + trials.append({"preset": i, "error": str(exc)}) + continue + + if not m.get("ready"): + trials.append({"preset": i, "ready": False}) + continue + + sc = score_mt5(m.get("net_profit"), m.get("total_trades"), m.get("profit_factor")) + row = { + "preset": i, + "net_profit": m.get("net_profit"), + "total_trades": m.get("total_trades"), + "profit_factor": m.get("profit_factor"), + "score": round(sc, 2), + "params": asdict(p), + } + trials.append(row) + if sc > best_score: + best_score = sc + best = row + + if not best: + raise RuntimeError(f"no MT5 results for {sym}") + + pf = best.get("profit_factor") or 0 + net = best.get("net_profit") or 0 + trades = best.get("total_trades") or 0 + enabled = net > 0 and pf >= 1.0 and trades >= 8 + flag = "OK" if enabled else "--" + print( + f" [{flag}] {test_sym}: preset #{best['preset']} " + f"net=${net:,.0f} t={trades} PF={pf:.2f} score={best_score:,.0f}" + ) + return { + "requested": sym, + "symbol": sym, + "enabled": enabled, + "max_spread_pips": spread_cap, + "params": best["params"], + "mt5_metrics": { + "net_profit": net, + "total_trades": trades, + "profit_factor": pf, + "preset_id": best["preset"], + "score": best_score, + }, + "sweep_trials": trials, + } + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--config", type=Path, default=LAB / "portfolio_symbols_expanded.json") + ap.add_argument("--only", default="", help="comma-separated symbols") + ap.add_argument("--from", dest="from_date", default="2020.01.01") + ap.add_argument("--to", dest="to_date", default="2026.01.01") + ap.add_argument("--period", default="M15", choices=["M15", "M30", "H1"]) + ap.add_argument("--deposit", type=float, default=10000) + ap.add_argument("--leverage", type=int, default=100) + args = ap.parse_args() + + cfg = load_portfolio_config(args.config) + only = {s.strip().upper() for s in args.only.split(",") if s.strip()} or None + lot = cfg.get("lot_per_symbol", 0.05) + + SETS_DIR.mkdir(exist_ok=True) + (LAB / "best_run").mkdir(exist_ok=True) + + entries = cfg["symbols"] + if only: + entries = [e for e in entries if e["name"].upper() in only] + + ctx = mt5_context() + members: list[dict] = [] + existing_by_sym: dict[str, dict] = {} + if args.only and OUT_PATH.exists(): + prev = json.loads(OUT_PATH.read_text(encoding="utf-8")) + existing_by_sym = {m["symbol"]: m for m in prev.get("members", []) if "symbol" in m} + + t0 = time.time() + print(f"MT5 preset sweep: {len(entries)} symbols x ~14 presets {args.from_date} -> {args.to_date}\n") + + for i, entry in enumerate(entries, 1): + sym = entry["name"] + print(f"[{i}/{len(entries)}] {sym}") + try: + members.append( + sweep_symbol( + ctx, + sym, + entry.get("max_spread_pips", 8.0), + lot, + args.from_date, + args.to_date, + args.period, + args.deposit, + args.leverage, + ) + ) + except Exception as exc: # noqa: BLE001 + print(f" FAIL {sym}: {exc}") + members.append({"requested": sym, "symbol": sym, "enabled": False, "error": str(exc)}) + + if args.only and existing_by_sym: + for m in members: + existing_by_sym[m["symbol"]] = m + members = list(existing_by_sym.values()) + members.sort(key=lambda x: x.get("symbol", "")) + + enabled = [m for m in members if m.get("enabled")] + en_trades = sum(m["mt5_metrics"]["total_trades"] for m in enabled) + en_net = sum(m["mt5_metrics"]["net_profit"] for m in enabled) + + payload = { + "version": 5, + "mode": "mt5_preset_sweep", + "optimized_at": datetime.now().isoformat(timespec="seconds"), + "config": cfg, + "selection_source": "mt5_strategy_tester", + "members": members, + "mt5_enabled_count": len(enabled), + "mt5_enabled_trades": en_trades, + "mt5_enabled_net": round(en_net, 2), + } + OUT_PATH.write_text(json.dumps(payload, indent=2), encoding="utf-8") + SWEEP_LOG.write_text(json.dumps(payload, indent=2), encoding="utf-8") + + print(f"\n=== MT5 Preset Sweep Done ({time.time() - t0:.0f}s) ===") + print(f" enabled: {len(enabled)}/{len(members)}") + print(f" MT5 trades (enabled): {en_trades}") + print(f" MT5 net (enabled): ${en_net:,.2f}") + print(f" 2000+ target: {'YES' if en_trades >= 2000 else 'NO'}") + print(f" saved: {OUT_PATH}") + print("\nNext:") + print(" python sync_portfolio_from_mt5.py --min-pf 1.0 --min-trades 8") + print(" python run_mt5_portfolio.py --enabled-only --from 2020.01.01 --to 2026.01.01") + print(" python generate_mt5_portfolio_report.py") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_mt5_tester.py b/lab/EAs/SimpleEMA/run_mt5_tester.py new file mode 100644 index 0000000..7f02ae4 --- /dev/null +++ b/lab/EAs/SimpleEMA/run_mt5_tester.py @@ -0,0 +1,285 @@ +""" +Launch MT5 Strategy Tester for SimpleEMA (native backtest / genetic optimize). + +Requires MT5 running and logged in. Compiles main.mq5 into your terminal data folder, +then runs terminal64.exe /config:... (same flow as cluster united_mt5_runner). + +Examples: + python run_mt5_tester.py backtest + python run_mt5_tester.py backtest --visual + python run_mt5_tester.py optimize + python run_mt5_tester.py backtest --symbol EURUSD --from 2023.01.01 --to 2026.01.01 +""" + +from __future__ import annotations + +import argparse +import re +import shutil +import subprocess +import time +from pathlib import Path + +import MetaTrader5 as mt5 + +LAB = Path(__file__).resolve().parent +EA_SRC = LAB / "main.mq5" +DEFAULT_SET = LAB / "SimpleEMA_EURUSD.set" +OPT_SET = LAB / "SimpleEMA_Genetic_Optimization.set" + +LABELS = { + "profit_factor": ("Profit Factor", "盈利因子"), + "net_profit": ("Total Net Profit", "总净盈利"), + "total_trades": ("Total Trades", "交易总计"), + "sharpe": ("Sharpe Ratio", "夏普比率"), + "equity_dd": ("Equity Drawdown Maximal", "最大回撤"), +} + + +def read_text(path: Path) -> str: + text = path.read_text(encoding="utf-16", errors="ignore") + if not text.strip(): + text = path.read_text(encoding="utf-8", errors="ignore") + return text + + +def grab_metric(text: str, key: str) -> str | None: + for label in LABELS[key]: + for pat in ( + rf">{re.escape(label)}\s*]*>(?:)?([^<]+)", + rf">{re.escape(label)}:\s*]*>(?:)?([^<]+)", + ): + m = re.search(pat, text, re.I) + if m: + return m.group(1).strip() + return None + + +def parse_report(data: Path, report: str) -> dict: + for path in sorted(data.glob(f"**/{report}*.htm*"), key=lambda p: p.stat().st_mtime, reverse=True): + text = read_text(path) + pf = grab_metric(text, "profit_factor") + profit = grab_metric(text, "net_profit") + trades = grab_metric(text, "total_trades") + sharpe = grab_metric(text, "sharpe") + dd = grab_metric(text, "equity_dd") + if pf or profit or trades: + return { + "profit_factor": float(pf) if pf else None, + "net_profit": _num(profit), + "total_trades": int(float(trades)) if trades and trades[0].isdigit() else None, + "sharpe": float(sharpe) if sharpe else None, + "max_drawdown": dd, + "report": str(path), + "ready": True, + } + for ext in (".htm", ".html"): + p = data / f"{report}{ext}" + if p.exists(): + text = read_text(p) + pf = grab_metric(text, "profit_factor") + if pf: + return {"ready": True, "report": str(p), "profit_factor": float(pf)} + return {"ready": False} + + +def _num(s: str | None) -> float | None: + if not s: + return None + s = s.replace(" ", "").replace(",", "") + if s.endswith("%"): + return float(s[:-1]) + return float(s) + + +def mt5_context() -> dict: + if not mt5.initialize(): + raise RuntimeError(f"MT5 init failed: {mt5.last_error()}") + info = mt5.terminal_info() + acc = mt5.account_info() + ctx = { + "data": Path(info.data_path), + "mt5_path": Path(info.path), + "login": acc.login if acc else 0, + "server": acc.server if acc else "", + } + mt5.shutdown() + return ctx + + +def deploy_ea(data: Path, mt5_path: Path) -> Path: + dst_dir = data / "MQL5" / "Experts" / "lab" / "SimpleEMA" + dst_dir.mkdir(parents=True, exist_ok=True) + dst = dst_dir / "main.mq5" + shutil.copy2(EA_SRC, dst) + log = dst_dir / "compile.log" + subprocess.run( + [str(mt5_path / "metaeditor64.exe"), f"/compile:{dst}", f"/log:{log}"], + timeout=180, + capture_output=True, + ) + time.sleep(3) + ex5 = dst_dir / "main.ex5" + if not ex5.exists(): + tail = log.read_text(encoding="utf-8", errors="ignore")[-2000:] if log.exists() else "" + raise RuntimeError(f"Compile failed — open MetaEditor and check:\n{dst}\n{tail}") + pub = data / "MQL5" / "Experts" / "SimpleEMA.ex5" + shutil.copy2(ex5, pub) + return pub + + +def copy_set_to_tester(data: Path, set_path: Path, set_name: str) -> Path: + profiles = data / "MQL5" / "Profiles" / "Tester" + profiles.mkdir(parents=True, exist_ok=True) + dst = profiles / set_name + shutil.copy2(set_path, dst) + return dst + + +def build_ini( + *, + set_name: str, + report: str, + login: int, + server: str, + symbol: str, + period: str, + from_date: str, + to_date: str, + deposit: float, + leverage: int, + optimization: int, + visual: bool, +) -> str: + return f"""[Common] +Login={login} +Server={server} +[Tester] +Expert=SimpleEMA.ex5 +ExpertParameters={set_name} +Symbol={symbol} +Period={period} +Optimization={optimization} +Model=1 +Dates=1 +FromDate={from_date} +ToDate={to_date} +ForwardMode=0 +Deposit={deposit} +Currency=USD +Leverage={leverage} +ExecutionMode=0 +Report={report} +ReplaceReport=1 +ShutdownTerminal=1 +Visual={1 if visual else 0} +""" + + +def run_tester( + ctx: dict, + *, + mode: str, + set_path: Path, + set_name: str, + report: str, + symbol: str, + period: str, + from_date: str, + to_date: str, + deposit: float, + leverage: int, + visual: bool, + timeout_sec: int = 3600, +) -> dict: + data: Path = ctx["data"] + mt5_path: Path = ctx["mt5_path"] + deploy_ea(data, mt5_path) + copy_set_to_tester(data, set_path, set_name) + + optimization = 2 if mode == "optimize" else 0 + ini_body = build_ini( + set_name=set_name, + report=report, + login=ctx["login"], + server=ctx["server"], + symbol=symbol, + period=period, + from_date=from_date, + to_date=to_date, + deposit=deposit, + leverage=leverage, + optimization=optimization, + visual=visual, + ) + ini = data / f"{report}.ini" + ini.write_text(ini_body, encoding="utf-8") + for ext in (".htm", ".html"): + p = data / f"{report}{ext}" + if p.exists(): + p.unlink(missing_ok=True) + + subprocess.run(["taskkill", "/IM", "terminal64.exe", "/F"], capture_output=True) + subprocess.run(["taskkill", "/IM", "metatester64.exe", "/F"], capture_output=True) + time.sleep(4) + + print(f"Starting MT5 Strategy Tester ({mode}) …") + print(f" EA: SimpleEMA.ex5 Symbol: {symbol} Period: {period}") + print(f" Range: {from_date} → {to_date} Visual: {visual}") + t0 = time.time() + subprocess.run([str(mt5_path / "terminal64.exe"), f"/config:{ini}"], timeout=timeout_sec) + metrics = parse_report(data, report) + metrics["elapsed_sec"] = round(time.time() - t0, 1) + metrics["mode"] = mode + return metrics + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description="SimpleEMA MT5 Strategy Tester launcher") + p.add_argument("mode", choices=["backtest", "optimize"], help="backtest or genetic optimize") + p.add_argument("--symbol", default="EURUSD") + p.add_argument("--period", default="H1", choices=["M15", "M30", "H1", "H4"]) + p.add_argument("--from", dest="from_date", default="2023.01.01") + p.add_argument("--to", dest="to_date", default="2026.01.01") + p.add_argument("--deposit", type=float, default=10000) + p.add_argument("--leverage", type=int, default=100) + p.add_argument("--visual", action="store_true", help="Visual mode (watch bars tick by tick)") + p.add_argument("--set", dest="set_file", default="", help="Custom .set path") + return p.parse_args() + + +def main() -> None: + args = parse_args() + ctx = mt5_context() + set_path = Path(args.set_file) if args.set_file else (OPT_SET if args.mode == "optimize" else DEFAULT_SET) + set_name = set_path.name + report = f"SimpleEMA_{args.symbol}_{args.mode}" + + metrics = run_tester( + ctx, + mode=args.mode, + set_path=set_path, + set_name=set_name, + report=report, + symbol=args.symbol, + period=args.period, + from_date=args.from_date, + to_date=args.to_date, + deposit=args.deposit, + leverage=args.leverage, + visual=args.visual, + ) + + if metrics.get("ready"): + print("\n=== MT5 Report ===") + for k in ("net_profit", "profit_factor", "total_trades", "sharpe", "max_drawdown", "elapsed_sec"): + if k in metrics and metrics[k] is not None: + print(f" {k}: {metrics[k]}") + print(f" report: {metrics.get('report')}") + print("\nOpen the HTML report in MT5 → Results tab for per-deal review (逐单复盘).") + else: + print("Report not found — check MT5 Tester journal for errors.") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_optimize.py b/lab/EAs/SimpleEMA/run_optimize.py new file mode 100644 index 0000000..20396ab --- /dev/null +++ b/lab/EAs/SimpleEMA/run_optimize.py @@ -0,0 +1,489 @@ +""" +Fast vectorized optimizer for SimpleEMA v2 (crossover + pullback entries). + +Target: net_profit > 0, trades >= min_trades (default 2000). + +Usage: + python run_optimize.py --trials 5000 --min-trades 2000 +""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from indicator_utils import calculate_adx, calculate_atr, calculate_ema # noqa: E402 +from run_backtest import pip_size # noqa: E402 + +TF_MAP = {"M15": mt5.TIMEFRAME_M15, "M5": mt5.TIMEFRAME_M5} + + +@dataclass +class Params: + fast_ema: int = 8 + slow_ema: int = 34 + entry_mode: int = 1 + min_ema_gap_pips: float = 0.0 + cooldown_bars: int = 4 + use_atr_stops: bool = True + atr_period: int = 14 + atr_sl_mult: float = 2.0 + atr_tp_mult: float = 4.0 + stop_loss_pips: float = 20.0 + take_profit_pips: float = 40.0 + exit_on_cross: bool = False + max_bars_in_trade: int = 96 + use_trailing: bool = True + trail_atr_mult: float = 1.2 + use_adx_filter: bool = True + adx_period: int = 14 + adx_min: float = 18.0 + use_htf_filter: bool = True + htf_ema_period: int = 100 + session_start: int = 7 + session_end: int = 21 + max_spread_pips: float = 8.0 + lot_size: float = 0.10 + initial_balance: float = 10_000.0 + + +@dataclass +class SimResult: + net_profit: float + total_trades: int + win_rate: float + profit_factor: float + max_drawdown_pct: float + sharpe: float + trades: list[dict] + + +@dataclass +class MarketData: + df: pd.DataFrame + close: np.ndarray + open_: np.ndarray + high: np.ndarray + low: np.ndarray + hours: np.ndarray + fast: dict[int, np.ndarray] + slow: dict[int, np.ndarray] + atr: dict[int, np.ndarray] + adx: dict[int, np.ndarray] + htf: dict[int, np.ndarray] + + +def load_market(df: pd.DataFrame) -> MarketData: + close_s = df["close"] + h4 = close_s.resample("4h").last().dropna() + fast = {p: calculate_ema(close_s, p).to_numpy() for p in range(5, 13)} + slow = {p: calculate_ema(close_s, p).to_numpy() for p in range(20, 61, 2)} + atr = {p: calculate_atr(df, p).to_numpy() for p in (10, 14, 20)} + adx = {p: calculate_adx(df, p).to_numpy() for p in (10, 14, 20)} + htf = {p: calculate_ema(h4, p).reindex(df.index, method="ffill").to_numpy() for p in (50, 100, 200)} + return MarketData( + df=df, + close=close_s.to_numpy(), + open_=df["open"].to_numpy(), + high=df["high"].to_numpy(), + low=df["low"].to_numpy(), + hours=df.index.hour.to_numpy(), + fast=fast, + slow=slow, + atr=atr, + adx=adx, + htf=htf, + ) + + +def make_signals(md: MarketData, p: Params, pip: float) -> dict[str, np.ndarray]: + fast, slow = md.fast[p.fast_ema], md.slow[p.slow_ema] + close, high, low = md.close, md.high, md.low + f1, f2 = np.roll(fast, 1), np.roll(fast, 2) + s1, s2 = np.roll(slow, 1), np.roll(slow, 2) + c1, h1, l1 = np.roll(close, 1), np.roll(high, 1), np.roll(low, 1) + + bull_cross = (f2 <= s2) & (f1 > s1) + bear_cross = (f2 >= s2) & (f1 < s1) + bull_pb = (f1 > s1) & (l1 <= f1) & (c1 > f1) + bear_pb = (f1 < s1) & (h1 >= f1) & (c1 < f1) + + if p.entry_mode == 0: + buy_raw, sell_raw = bull_cross, bear_cross + elif p.entry_mode == 2: + buy_raw, sell_raw = bull_pb, bear_pb + else: + buy_raw = bull_cross | bull_pb + sell_raw = bear_cross | bear_pb + + gap_ok = np.abs(f1 - s1) / pip >= p.min_ema_gap_pips + sess = (md.hours >= p.session_start) & (md.hours < p.session_end) + adx_arr = md.adx[p.adx_period] + adx_ok = adx_arr >= p.adx_min if p.use_adx_filter else np.ones(len(close), dtype=bool) + htf_arr = md.htf[p.htf_ema_period] + if p.use_htf_filter: + htf_bull = close > htf_arr + htf_bear = close < htf_arr + else: + htf_bull = htf_bear = np.ones(len(close), dtype=bool) + + buy_sig = buy_raw & gap_ok & sess & adx_ok & htf_bull + sell_sig = sell_raw & gap_ok & sess & adx_ok & htf_bear + buy_sig[: p.slow_ema + 3] = False + sell_sig[: p.slow_ema + 3] = False + + return { + "open": md.open_, + "high": md.high, + "low": md.low, + "close": md.close, + "atr": md.atr[p.atr_period], + "bull_cross": bull_cross, + "bear_cross": bear_cross, + "buy_sig": buy_sig, + "sell_sig": sell_sig, + } + + +def simulate(md: MarketData, symbol: str, p: Params, costs: CostModel, pip: float, point: float) -> SimResult: + sig = make_signals(md, p, pip) + opn, high, low, close = sig["open"], sig["high"], sig["low"], sig["close"] + atr = sig["atr"] + bull_cross, bear_cross = sig["bull_cross"], sig["bear_cross"] + buy_sig, sell_sig = sig["buy_sig"], sig["sell_sig"] + + spread_px = costs.spread_points * point + slip = costs.slippage_points * point + half = spread_px / 2.0 + slip + commission = costs.commission_per_lot * p.lot_size * 2.0 + + balance = p.initial_balance + equity = [balance] + trades: list[dict] = [] + side = None + entry = 0.0 + entry_i = 0 + trail = 0.0 + last_entry_i = -10_000 + + def calc_profit(entry_px: float, exit_px: float, s: str) -> float: + ot = mt5.ORDER_TYPE_BUY if s == "BUY" else mt5.ORDER_TYPE_SELL + pr = mt5.order_calc_profit(ot, symbol, p.lot_size, entry_px, exit_px) + return float(pr) - commission if pr is not None else -commission + + warm = max(p.slow_ema + 5, 30) + for i in range(warm, len(md.df)): + atr1 = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + mid = float(opn[i]) + + if side is not None: + bars_held = i - entry_i + closed = False + if p.max_bars_in_trade > 0 and bars_held >= p.max_bars_in_trade: + exit_px = mid - half if side == "BUY" else mid + half + profit = calc_profit(entry, exit_px, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": "max_bars"}) + closed = True + elif p.exit_on_cross and side == "BUY" and bear_cross[i]: + profit = calc_profit(entry, mid - half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": "bear_cross"}) + closed = True + elif p.exit_on_cross and side == "SELL" and bull_cross[i]: + profit = calc_profit(entry, mid + half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": "bull_cross"}) + closed = True + elif side == "BUY": + if p.use_atr_stops and atr1 > 0: + sl_px = entry - atr1 * p.atr_sl_mult + tp_px = entry + atr1 * p.atr_tp_mult + else: + sl_px = entry - p.stop_loss_pips * pip + tp_px = entry + p.take_profit_pips * pip + eff_sl = sl_px + if p.use_trailing and atr1 > 0: + td = atr1 * p.trail_atr_mult + candidate = high[i] - td + if candidate > entry: + trail = max(trail, candidate) if trail > 0 else candidate + eff_sl = max(sl_px, trail) + if low[i] <= eff_sl: + reason = "trail" if trail > sl_px and eff_sl > entry else "sl" + profit = calc_profit(entry, eff_sl - half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": reason}) + closed = True + elif high[i] >= tp_px: + profit = calc_profit(entry, tp_px - half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": "tp"}) + closed = True + elif side == "SELL": + if p.use_atr_stops and atr1 > 0: + sl_px = entry + atr1 * p.atr_sl_mult + tp_px = entry - atr1 * p.atr_tp_mult + else: + sl_px = entry + p.stop_loss_pips * pip + tp_px = entry - p.take_profit_pips * pip + eff_sl = sl_px + if p.use_trailing and atr1 > 0: + td = atr1 * p.trail_atr_mult + candidate = low[i] + td + if candidate < entry: + trail = min(trail, candidate) if trail > 0 else candidate + eff_sl = min(sl_px, trail) + if high[i] >= eff_sl: + reason = "trail" if trail > 0 and trail < sl_px and eff_sl < entry else "sl" + profit = calc_profit(entry, eff_sl + half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": reason}) + closed = True + elif low[i] <= tp_px: + profit = calc_profit(entry, tp_px + half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": "tp"}) + closed = True + if closed: + side = None + + if side is None: + spread_pips = spread_px / pip if pip > 0 else 0 + if not (p.max_spread_pips > 0 and spread_pips > p.max_spread_pips) and i - last_entry_i >= p.cooldown_bars: + if buy_sig[i]: + side, entry, entry_i, trail, last_entry_i = "BUY", mid + half, i, 0.0, i + elif sell_sig[i]: + side, entry, entry_i, trail, last_entry_i = "SELL", mid - half, i, 0.0, i + + mark = balance + if side == "BUY": + mark += calc_profit(entry, float(close[i - 1]), side) + commission + elif side == "SELL": + mark += calc_profit(entry, float(close[i - 1]), side) + commission + equity.append(mark) + + if side is not None: + profit = calc_profit(entry, float(close[-1]), side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": len(md.df) - 1, "profit": profit, "exit_reason": "eod"}) + + eq = pd.Series(equity[: len(md.df)], index=md.df.index[: len(equity)]) + net = balance - p.initial_balance + wins = [t["profit"] for t in trades if t["profit"] > 0] + losses = [t["profit"] for t in trades if t["profit"] <= 0] + gp = sum(wins) if wins else 0.0 + gl = abs(sum(losses)) if losses else 0.0 + pf = gp / gl if gl > 0 else 0.0 + wr = 100.0 * len(wins) / len(trades) if trades else 0.0 + dd = abs(float(((eq - eq.cummax()) / eq.cummax() * 100).min())) if len(eq) else 0.0 + rets = eq.pct_change().dropna() + sharpe = float(rets.mean() / rets.std() * np.sqrt(252 * 24 * 4)) if len(rets) > 1 and rets.std() > 0 else 0.0 + return SimResult(net, len(trades), wr, pf, dd, sharpe, trades) + + +def sample(rng: random.Random, high_freq: bool = False) -> Params: + fast = rng.randint(5, 12) + if high_freq: + return Params( + fast_ema=fast, + slow_ema=rng.choice([p for p in range(max(fast + 6, 20), 41, 2)]), + entry_mode=rng.choice([1, 1, 1, 2]), + min_ema_gap_pips=round(rng.uniform(0, 1.5), 1), + cooldown_bars=rng.choice([2, 2, 3, 4]), + atr_period=rng.choice([10, 14, 20]), + atr_sl_mult=round(rng.uniform(1.8, 3.2), 2), + atr_tp_mult=round(rng.uniform(4.0, 9.0), 2), + exit_on_cross=False, + max_bars_in_trade=rng.choice([64, 96, 128]), + use_trailing=False, + use_adx_filter=rng.choice([False, False, True]), + adx_min=round(rng.uniform(15, 28), 1), + use_htf_filter=rng.choice([False, False, True]), + htf_ema_period=rng.choice([50, 100, 200]), + session_start=rng.choice([0, 6, 7]), + session_end=rng.choice([21, 22, 24]), + max_spread_pips=rng.choice([8, 10]), + ) + return Params( + fast_ema=fast, + slow_ema=rng.choice([p for p in range(max(fast + 8, 20), 61, 2)]), + entry_mode=rng.choice([0, 1, 1, 1, 2]), + min_ema_gap_pips=round(rng.uniform(0, 3), 1), + cooldown_bars=rng.choice([2, 4, 6, 8]), + atr_period=rng.choice([10, 14, 20]), + atr_sl_mult=round(rng.uniform(1.5, 3.5), 2), + atr_tp_mult=round(rng.uniform(3.0, 8.0), 2), + exit_on_cross=rng.choice([False, False, True]), + max_bars_in_trade=rng.choice([48, 64, 96, 128, 0]), + use_trailing=rng.choice([True, True, False]), + trail_atr_mult=round(rng.uniform(0.8, 2.0), 2), + use_adx_filter=rng.choice([True, False]), + adx_min=round(rng.uniform(15, 30), 1), + use_htf_filter=rng.choice([True, False]), + htf_ema_period=rng.choice([50, 100, 200]), + session_start=rng.choice([6, 7, 8]), + session_end=rng.choice([20, 21, 22]), + max_spread_pips=rng.choice([6, 8, 10]), + ) + + +def write_set(p: Params, path: Path) -> None: + path.write_text( + "\n".join( + [ + "; SimpleEMA v2 optimized", + "Timeframe=16388", + f"FastEmaPeriod={p.fast_ema}", + f"SlowEmaPeriod={p.slow_ema}", + f"EntryMode={p.entry_mode}", + f"MinEmaGapPips={p.min_ema_gap_pips}", + f"CooldownBars={p.cooldown_bars}", + f"UseAtrStops={'true' if p.use_atr_stops else 'false'}", + f"AtrPeriod={p.atr_period}", + f"AtrSlMult={p.atr_sl_mult}", + f"AtrTpMult={p.atr_tp_mult}", + f"ExitOnCross={'true' if p.exit_on_cross else 'false'}", + f"MaxBarsInTrade={p.max_bars_in_trade}", + f"UseTrailing={'true' if p.use_trailing else 'false'}", + f"TrailAtrMult={p.trail_atr_mult}", + f"UseAdxFilter={'true' if p.use_adx_filter else 'false'}", + f"AdxPeriod={p.adx_period}", + f"AdxMin={p.adx_min}", + f"UseHtfFilter={'true' if p.use_htf_filter else 'false'}", + f"HtfEmaPeriod={p.htf_ema_period}", + f"SessionStartHour={p.session_start}", + f"SessionEndHour={p.session_end}", + f"MaxSpreadPips={p.max_spread_pips}", + f"LotSize={p.lot_size}", + ] + ) + + "\n", + encoding="utf-8", + ) + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--symbol", default="EURUSD") + ap.add_argument("--timeframe", default="M15") + ap.add_argument("--start", default="2020-01-01") + ap.add_argument("--end", default="2026-01-01") + ap.add_argument("--trials", type=int, default=5000) + ap.add_argument("--min-trades", type=int, default=2000) + ap.add_argument("--max-trades", type=int, default=3500) + ap.add_argument("--profile", choices=["profit", "high-freq", "balanced"], default="balanced", + help="profit=max net; high-freq=2k-3.5k trades; balanced=net>0 with most trades") + ap.add_argument("--seed", type=int, default=42) + args = ap.parse_args() + out = Path(__file__).resolve().parent + rng = random.Random(args.seed) + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + try: + sym = resolve_symbol(args.symbol) + df = load_bars(sym, TF_MAP[args.timeframe], datetime.fromisoformat(args.start), datetime.fromisoformat(args.end)) + costs = CostModel.for_symbol(sym) + pip = pip_size(sym) + point = float(mt5.symbol_info(sym).point) + print(f"{sym} {args.timeframe} bars={len(df)} trials={args.trials} min_trades={args.min_trades}", flush=True) + print("Precomputing market data ...", flush=True) + md = load_market(df) + + best: SimResult | None = None + best_p: Params | None = None + target: tuple[SimResult, Params] | None = None + rows = [] + + hi_freq: tuple[SimResult, Params] | None = None + balanced: tuple[SimResult, Params] | None = None + + for n in range(1, args.trials + 1): + p = sample(rng, high_freq=(args.profile == "high-freq")) + r = simulate(md, sym, p, costs, pip, point) + rows.append({"trial": n, "net": r.net_profit, "trades": r.total_trades, "pf": r.profit_factor, **asdict(p)}) + + if best is None or r.net_profit > best.net_profit: + best, best_p = r, p + + if args.min_trades <= r.total_trades <= args.max_trades and r.net_profit > 0 and r.profit_factor >= 1.05: + if target is None or r.net_profit > target[0].net_profit: + target = (r, p) + print( + f" HIT {n}: net=${r.net_profit:,.0f} trades={r.total_trades} " + f"PF={r.profit_factor:.2f} WR={r.win_rate:.1f}%", + flush=True, + ) + + if args.min_trades <= r.total_trades <= args.max_trades: + if hi_freq is None or r.net_profit > hi_freq[0].net_profit: + hi_freq = (r, p) + + if r.net_profit > 0 and r.profit_factor >= 1.02: + if balanced is None or r.total_trades > balanced[0].total_trades or ( + r.total_trades == balanced[0].total_trades and r.net_profit > balanced[0].net_profit + ): + balanced = (r, p) + + if n % 1000 == 0: + b = balanced or hi_freq or (best, best_p) + print( + f" ... {n}/{args.trials} profile={args.profile} " + f"best_net=${best.net_profit:,.0f} t={best.total_trades} hit={'yes' if target else 'no'}", + flush=True, + ) + + pd.DataFrame(rows).sort_values("net", ascending=False).to_csv(out / "optimize_trials.csv", index=False) + + if args.profile == "profit": + final_r, final_p = target if target else (best, best_p) + elif args.profile == "high-freq": + final_r, final_p = hi_freq if hi_freq else (best, best_p) + else: + final_r, final_p = balanced if balanced else (target if target else (best, best_p)) + assert final_r and final_p + + with open(out / "best_params.json", "w", encoding="utf-8") as f: + json.dump({"target_met": target is not None, "params": asdict(final_p), "metrics": asdict(final_r)}, f, indent=2) + write_set(final_p, out / "SimpleEMA_optimized.set") + + (out / "best_run").mkdir(exist_ok=True) + trows = [ + { + "side": t["side"], + "open_time": df.index[t["open_i"]], + "close_time": df.index[t["close_i"]], + "profit": t["profit"], + "exit_reason": t["exit_reason"], + } + for t in final_r.trades + ] + pd.DataFrame(trows).to_csv(out / "best_run" / "trades.csv", index=False) + + print( + f"\n{'TARGET MET' if target else 'BEST EFFORT'}: net=${final_r.net_profit:,.2f} " + f"trades={final_r.total_trades} PF={final_r.profit_factor:.2f} WR={final_r.win_rate:.1f}% " + f"MaxDD={final_r.max_drawdown_pct:.1f}%", + flush=True, + ) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_optimize_portfolio.py b/lab/EAs/SimpleEMA/run_optimize_portfolio.py new file mode 100644 index 0000000..3b2c1ca --- /dev/null +++ b/lab/EAs/SimpleEMA/run_optimize_portfolio.py @@ -0,0 +1,292 @@ +#!/usr/bin/env python3 +"""Per-symbol v5 optimization + portfolio assembly.""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +from dataclasses import asdict, replace +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +LAB = Path(__file__).resolve().parent +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) +sys.path.insert(0, str(LAB)) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from run_backtest import pip_size # noqa: E402 +from run_optimize_v5 import seed_params # noqa: E402 +from run_portfolio_v5 import load_portfolio_config, portfolio_metrics # noqa: E402 +from strategy_v5 import V5Params, load_v5_cache, market_from_cache, sample_v5, simulate_v5 # noqa: E402 + +OUT_PATH = LAB / "portfolio_params.json" +TRIALS_DIR = LAB / "portfolio_opt_trials" + + +def is_metal(name: str) -> bool: + base = name.upper().split(".")[0] + return base.startswith("XAU") or base.startswith("XAG") + + +def is_index(name: str) -> bool: + base = name.upper().split(".")[0] + return base in {"US500", "NAS100", "US30", "GER40", "UK100", "JPN225", "SPX500", "USTEC"} + + +def is_crypto(name: str) -> bool: + base = name.upper().split(".")[0] + return base.startswith("BTC") or base.startswith("ETH") + + +def high_freq_seeds() -> list[V5Params]: + return [ + V5Params(fast_ema=8, slow_ema=30, cross_cooldown=2, pullback_cooldown=2, use_pullback=True, trend_leg_bars=48), + V5Params(fast_ema=9, slow_ema=34, cross_cooldown=3, pullback_cooldown=2, use_pullback=True, htf_ema_period=100), + V5Params(fast_ema=10, slow_ema=36, cross_cooldown=2, use_pullback=False, htf_ema_period=100), + V5Params(fast_ema=11, slow_ema=40, cross_cooldown=4, use_pullback=True, pullback_touch=1, pullback_adx_min=20), + ] + + +def all_seeds() -> list[V5Params]: + return seed_params() + high_freq_seeds() + + +def sample_for_symbol(rng: random.Random, name: str) -> V5Params: + p = sample_v5(rng) + p.cross_cooldown = rng.choice([2, 3, 4, 5, 6]) + p.pullback_cooldown = rng.choice([2, 3, 4]) + if is_metal(name): + p.max_spread_pips = rng.choice([30.0, 35.0, 40.0, 50.0, 60.0]) + p.min_ema_gap_pips = round(rng.uniform(1.0, 4.0), 1) + p.atr_sl_mult = round(rng.uniform(2.0, 3.5), 2) + p.atr_tp_mult = round(rng.uniform(3.5, 6.5), 2) + elif is_index(name) or is_crypto(name): + p.max_spread_pips = rng.choice([15.0, 20.0, 30.0, 40.0, 50.0]) + p.min_ema_gap_pips = round(rng.uniform(2.0, 8.0), 1) + p.atr_sl_mult = round(rng.uniform(2.0, 3.2), 2) + p.atr_tp_mult = round(rng.uniform(3.0, 5.5), 2) + elif "JPY" in name.upper(): + p.max_spread_pips = rng.choice([8.0, 10.0, 12.0, 15.0, 18.0]) + return p + + +def score_result(r, min_trades: int) -> float: + if r.total_trades < min_trades: + return -1e6 + r.net_profit + if r.net_profit > 0 and r.profit_factor >= 1.05: + return r.net_profit + r.total_trades * 4.0 + if r.net_profit > 0 and r.profit_factor >= 1.0: + return r.net_profit + r.total_trades * 2.0 + return r.net_profit + r.total_trades * 0.1 + + +def pick_best(trials: list[tuple], min_trades: int) -> tuple | None: + if not trials: + return None + profitable = [t for t in trials if t[0].net_profit > 0 and t[0].profit_factor >= 1.03 and t[0].total_trades >= min_trades] + if profitable: + return max(profitable, key=lambda t: score_result(t[0], min_trades)) + positive = [t for t in trials if t[0].net_profit > 0 and t[0].total_trades >= min_trades] + if positive: + return max(positive, key=lambda t: score_result(t[0], min_trades)) + return max(trials, key=lambda t: score_result(t[0], min_trades)) + + +def optimize_symbol( + req: str, + spread_cap: float, + lot: float, + start: datetime, + end: datetime, + trials: int, + min_trades: int, + seed: int, +) -> dict: + sym = resolve_symbol(req) + df = load_bars(sym, mt5.TIMEFRAME_M15, start, end) + cache = load_v5_cache(df) + pip = pip_size(sym) + point = float(mt5.symbol_info(sym).point) + costs = CostModel.for_symbol(sym) + rng = random.Random(hash(sym) ^ seed) + + results: list[tuple] = [] + seeds = all_seeds() + for p0 in seeds: + p = replace(p0, lot_size=lot, max_spread_pips=spread_cap) + r = simulate_v5(market_from_cache(cache, p), sym, p, costs, pip, point) + results.append((r, p)) + + for _ in range(max(0, trials - len(seeds))): + p = replace(sample_for_symbol(rng, sym), lot_size=lot, max_spread_pips=spread_cap) + r = simulate_v5(market_from_cache(cache, p), sym, p, costs, pip, point) + results.append((r, p)) + + best_r, best_p = pick_best(results, min_trades) + assert best_r and best_p + + enabled = best_r.net_profit > 0 and best_r.profit_factor >= 1.0 and best_r.total_trades >= min_trades + row = { + "requested": req, + "symbol": sym, + "enabled": True, + "max_spread_pips": spread_cap, + "params": asdict(best_p), + "metrics": {k: v for k, v in asdict(best_r).items() if k != "trades"}, + "score": round(score_result(best_r, min_trades), 2), + } + + TRIALS_DIR.mkdir(exist_ok=True) + pd.DataFrame( + [{"net": r.net_profit, "trades": r.total_trades, "pf": r.profit_factor, **asdict(p)} for r, p in results] + ).to_csv(TRIALS_DIR / f"{sym.replace('.', '_')}.csv", index=False) + + flag = "PY" if enabled else "py-" + print( + f" [{flag}] {sym}: net=${best_r.net_profit:,.0f} t={best_r.total_trades} " + f"PF={best_r.profit_factor:.2f} WR={best_r.win_rate:.1f}%" + ) + return row + + +def run_portfolio_backtest(members: list[dict], start: datetime, end: datetime, initial: float) -> tuple[pd.DataFrame, list[dict], dict]: + all_trades: list[dict] = [] + sym_rows: list[dict] = [] + + for m in members: + if not m.get("enabled", True): + continue + sym = m["symbol"] + p = V5Params(**m["params"]) + df = load_bars(sym, mt5.TIMEFRAME_M15, start, end) + pip = pip_size(sym) + point = float(mt5.symbol_info(sym).point) + costs = CostModel.for_symbol(sym) + r = simulate_v5(market_from_cache(load_v5_cache(df), p), sym, p, costs, pip, point) + for t in r.trades: + all_trades.append( + { + "symbol": sym, + "side": t["side"], + "open_time": df.index[t["open_i"]], + "close_time": df.index[t["close_i"]], + "profit": round(t["profit"], 2), + "exit_reason": t["exit_reason"], + } + ) + sym_rows.append( + { + "symbol": sym, + "enabled": True, + "trades": r.total_trades, + "net_profit": round(r.net_profit, 2), + "profit_factor": round(r.profit_factor, 2), + "win_rate": round(r.win_rate, 1), + } + ) + + tdf = pd.DataFrame(all_trades).sort_values(["close_time", "symbol"]) if all_trades else pd.DataFrame() + metrics = portfolio_metrics(tdf, initial) + metrics["target_met_2000_trades"] = metrics["total_trades"] >= 2000 + metrics["target_met_profit"] = metrics["net_profit"] > 0 + return tdf, sym_rows, metrics + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--config", type=Path, default=LAB / "portfolio_symbols.json") + ap.add_argument("--trials", type=int, default=350, help="trials per symbol") + ap.add_argument("--min-trades", type=int, default=15) + ap.add_argument("--min-pf", type=float, default=1.0) + ap.add_argument("--seed", type=int, default=42) + ap.add_argument("--skip-opt", action="store_true", help="only rebuild portfolio from existing portfolio_params.json") + args = ap.parse_args() + + cfg = load_portfolio_config(args.config) + start = datetime.fromisoformat(cfg["period"][0]) + end = datetime.fromisoformat(cfg["period"][1]) + lot = cfg.get("lot_per_symbol", 0.05) + initial = cfg.get("initial_balance", 10000.0) + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + try: + members: list[dict] = [] + if not args.skip_opt: + print(f"Per-symbol optimize: {len(cfg['symbols'])} symbols x {args.trials} trials") + for entry in cfg["symbols"]: + try: + members.append( + optimize_symbol( + entry["name"], + entry.get("max_spread_pips", 8.0), + lot, + start, + end, + args.trials, + args.min_trades, + args.seed, + ) + ) + except Exception as exc: # noqa: BLE001 + print(f" FAIL {entry['name']}: {exc}") + members.append( + { + "requested": entry["name"], + "symbol": entry["name"], + "enabled": False, + "error": str(exc), + } + ) + else: + existing = json.loads(OUT_PATH.read_text(encoding="utf-8")) + members = existing["members"] + + enabled_n = sum(1 for m in members if m.get("enabled")) + print(f"\nPortfolio assembly: {enabled_n}/{len(members)} symbols enabled") + + tdf, sym_rows, metrics = run_portfolio_backtest(members, start, end, initial) + + out = LAB / "best_run" + out.mkdir(exist_ok=True) + tdf.to_csv(out / "portfolio_trades.csv", index=False) + pd.DataFrame(sym_rows).to_csv(out / "portfolio_by_symbol.csv", index=False) + + payload = { + "version": 5, + "mode": "per_symbol_optimized", + "optimized_at": datetime.now().isoformat(timespec="seconds"), + "config": cfg, + "selection": { + "min_trades": args.min_trades, + "min_pf": args.min_pf, + "trials_per_symbol": args.trials, + }, + "members": members, + "portfolio_metrics": metrics, + "per_symbol_live": sym_rows, + } + OUT_PATH.write_text(json.dumps(payload, indent=2), encoding="utf-8") + (LAB / "portfolio_report.json").write_text( + json.dumps({"metrics": metrics, "per_symbol": sym_rows, "enabled_count": enabled_n}, indent=2), + encoding="utf-8", + ) + + print( + f"\nPORTFOLIO: net=${metrics['net_profit']:,.0f} trades={metrics['total_trades']} " + f"PF={metrics['profit_factor']:.2f} WR={metrics['win_rate']:.1f}% DD={metrics['max_drawdown_pct']:.1f}% " + f"2000+={'YES' if metrics['target_met_2000_trades'] else 'no'} profit={'YES' if metrics['target_met_profit'] else 'no'}" + ) + print(f"Saved {OUT_PATH}") + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_optimize_v3.py b/lab/EAs/SimpleEMA/run_optimize_v3.py new file mode 100644 index 0000000..d9da8b0 --- /dev/null +++ b/lab/EAs/SimpleEMA/run_optimize_v3.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +"""Optimize SimpleEMA v3 (trend pullback).""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +from dataclasses import asdict +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +LAB = Path(__file__).resolve().parent +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) +sys.path.insert(0, str(LAB)) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from run_backtest import pip_size # noqa: E402 +from strategy_v3 import V3Params, load_v3_cache, market_from_cache, sample_v3, simulate_v3, write_v3_set # noqa: E402 + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--trials", type=int, default=4000) + ap.add_argument("--min-trades", type=int, default=400) + ap.add_argument("--max-trades", type=int, default=2500) + ap.add_argument("--seed", type=int, default=42) + args = ap.parse_args() + out = LAB + rng = random.Random(args.seed) + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + try: + sym = resolve_symbol("EURUSD") + df = load_bars(sym, mt5.TIMEFRAME_M15, datetime(2020, 1, 1), datetime(2026, 1, 1)) + costs = CostModel.for_symbol(sym) + pip = pip_size(sym) + point = float(mt5.symbol_info(sym).point) + print(f"v3 optimize {sym} M15 trials={args.trials} trades={args.min_trades}-{args.max_trades}") + cache = load_v3_cache(df) + + best_profit = None + best_balanced = None + target = None + + for n in range(1, args.trials + 1): + p = sample_v3(rng) + md = market_from_cache(cache, p) + r = simulate_v3(md, sym, p, costs, pip, point) + + if args.min_trades <= r.total_trades <= args.max_trades and r.net_profit > 0 and r.profit_factor >= 1.05: + if target is None or r.net_profit > target[0].net_profit: + target = (r, p) + print(f" HIT {n}: net=${r.net_profit:,.0f} t={r.total_trades} PF={r.profit_factor:.2f}") + + if r.net_profit > 0: + if best_balanced is None or r.total_trades > best_balanced[0].total_trades or ( + r.total_trades == best_balanced[0].total_trades and r.net_profit > best_balanced[0].net_profit + ): + best_balanced = (r, p) + + if best_profit is None or r.net_profit > best_profit[0].net_profit: + best_profit = (r, p) + + if n % 1000 == 0: + b = best_balanced or best_profit + print(f" ... {n}/{args.trials} best_bal t={b[0].total_trades} net=${b[0].net_profit:,.0f} hit={'yes' if target else 'no'}") + + final_r, final_p = target or best_balanced or best_profit + assert final_r and final_p + + write_v3_set(final_p, out / "SimpleEMA_optimized.set") + payload = { + "version": 3, + "target_met": target is not None, + "params": asdict(final_p), + "metrics": asdict(final_r), + } + (out / "best_params.json").write_text(json.dumps(payload, indent=2), encoding="utf-8") + + (out / "best_run").mkdir(exist_ok=True) + rows = [ + { + "side": t["side"], + "open_time": df.index[t["open_i"]], + "close_time": df.index[t["close_i"]], + "profit": t["profit"], + "exit_reason": t["exit_reason"], + } + for t in final_r.trades + ] + pd.DataFrame(rows).to_csv(out / "best_run" / "trades.csv", index=False) + + print( + f"\n{'TARGET' if target else 'BEST'}: net=${final_r.net_profit:,.2f} " + f"trades={final_r.total_trades} PF={final_r.profit_factor:.2f} WR={final_r.win_rate:.1f}% DD={final_r.max_drawdown_pct:.1f}%" + ) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_optimize_v4.py b/lab/EAs/SimpleEMA/run_optimize_v4.py new file mode 100644 index 0000000..770f2f8 --- /dev/null +++ b/lab/EAs/SimpleEMA/run_optimize_v4.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +"""Optimize SimpleEMA v4 (regime dual entry + partial TP).""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +from dataclasses import asdict +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +LAB = Path(__file__).resolve().parent +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) +sys.path.insert(0, str(LAB)) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from run_backtest import pip_size # noqa: E402 +from strategy_v4 import V4Params, load_v4_cache, market_from_cache, sample_v4, simulate_v4, write_v4_set # noqa: E402 + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--trials", type=int, default=3000) + ap.add_argument("--min-trades", type=int, default=400) + ap.add_argument("--max-trades", type=int, default=2500) + ap.add_argument("--seed", type=int, default=42) + args = ap.parse_args() + out = LAB + rng = random.Random(args.seed) + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + try: + sym = resolve_symbol("EURUSD") + df = load_bars(sym, mt5.TIMEFRAME_M15, datetime(2020, 1, 1), datetime(2026, 1, 1)) + costs = CostModel.for_symbol(sym) + pip = pip_size(sym) + point = float(mt5.symbol_info(sym).point) + print(f"v4 optimize {sym} M15 trials={args.trials} trades={args.min_trades}-{args.max_trades}") + cache = load_v4_cache(df) + + best_profit = None + best_balanced = None + target = None + + for n in range(1, args.trials + 1): + p = sample_v4(rng) + md = market_from_cache(cache, p) + r = simulate_v4(md, sym, p, costs, pip, point) + + if args.min_trades <= r.total_trades <= args.max_trades and r.net_profit > 0 and r.profit_factor >= 1.05: + if target is None or r.net_profit > target[0].net_profit: + target = (r, p) + print(f" HIT {n}: net=${r.net_profit:,.0f} t={r.total_trades} PF={r.profit_factor:.2f}") + + if r.net_profit > 0: + if best_balanced is None or r.total_trades > best_balanced[0].total_trades or ( + r.total_trades == best_balanced[0].total_trades and r.net_profit > best_balanced[0].net_profit + ): + best_balanced = (r, p) + + if best_profit is None or r.net_profit > best_profit[0].net_profit: + best_profit = (r, p) + + if n % 500 == 0: + b = best_balanced or best_profit + print(f" ... {n}/{args.trials} best_bal t={b[0].total_trades} net=${b[0].net_profit:,.0f} hit={'yes' if target else 'no'}") + + final_r, final_p = target or best_balanced or best_profit + assert final_r and final_p + + write_v4_set(final_p, out / "SimpleEMA_optimized.set") + payload = { + "version": 4, + "target_met": target is not None, + "params": asdict(final_p), + "metrics": {k: v for k, v in asdict(final_r).items() if k != "trades"}, + } + (out / "best_params.json").write_text(json.dumps(payload, indent=2), encoding="utf-8") + + (out / "best_run").mkdir(exist_ok=True) + rows = [ + { + "side": t["side"], + "open_time": df.index[t["open_i"]], + "close_time": df.index[t["close_i"]], + "profit": t["profit"], + "exit_reason": t["exit_reason"], + } + for t in final_r.trades + ] + pd.DataFrame(rows).to_csv(out / "best_run" / "trades.csv", index=False) + + print( + f"\n{'TARGET' if target else 'BEST'}: net=${final_r.net_profit:,.2f} " + f"trades={final_r.total_trades} PF={final_r.profit_factor:.2f} WR={final_r.win_rate:.1f}% DD={final_r.max_drawdown_pct:.1f}%" + ) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_optimize_v5.py b/lab/EAs/SimpleEMA/run_optimize_v5.py new file mode 100644 index 0000000..f1dd60d --- /dev/null +++ b/lab/EAs/SimpleEMA/run_optimize_v5.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +"""Optimize SimpleEMA v5 (trend-leg cross + pullback).""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +from dataclasses import asdict +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +LAB = Path(__file__).resolve().parent +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) +sys.path.insert(0, str(LAB)) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from run_backtest import pip_size # noqa: E402 +from strategy_v5 import V5Params, load_v5_cache, market_from_cache, sample_v5, simulate_v5, write_v5_set # noqa: E402 + + +def seed_params() -> list[V5Params]: + """Known-good cross preset + selective pullback variants.""" + return [ + V5Params(fast_ema=10, slow_ema=36, cross_cooldown=2, htf_ema_period=100, use_pullback=False), + V5Params(fast_ema=10, slow_ema=46, cross_cooldown=8, htf_ema_period=200, use_pullback=False), + V5Params(fast_ema=7, slow_ema=46, cross_cooldown=5, use_pullback=False), + V5Params( + fast_ema=10, slow_ema=46, cross_cooldown=8, htf_ema_period=200, + use_pullback=True, pullback_touch=1, pullback_adx_min=22, + pullback_min_gap_pips=2.0, trend_leg_bars=56, pullback_cooldown=6, + max_pullbacks_per_leg=1, + ), + ] + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--trials", type=int, default=2000) + ap.add_argument("--min-trades", type=int, default=150) + ap.add_argument("--max-trades", type=int, default=2500) + ap.add_argument("--seed", type=int, default=42) + args = ap.parse_args() + out = LAB + rng = random.Random(args.seed) + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + try: + sym = resolve_symbol("EURUSD") + df = load_bars(sym, mt5.TIMEFRAME_M15, datetime(2020, 1, 1), datetime(2026, 1, 1)) + costs = CostModel.for_symbol(sym) + pip = pip_size(sym) + point = float(mt5.symbol_info(sym).point) + print(f"v5 optimize {sym} M15 trials={args.trials} trades={args.min_trades}-{args.max_trades}") + cache = load_v5_cache(df) + + best_profit = None + best_balanced = None + target = None + trial_rows = [] + + def eval_params(p: V5Params, n: int) -> None: + nonlocal best_profit, best_balanced, target + md = market_from_cache(cache, p) + r = simulate_v5(md, sym, p, costs, pip, point) + trial_rows.append({"trial": n, "net": r.net_profit, "trades": r.total_trades, "pf": r.profit_factor, **asdict(p)}) + + if args.min_trades <= r.total_trades <= args.max_trades and r.net_profit > 0 and r.profit_factor >= 1.05: + if target is None or r.net_profit > target[0].net_profit: + target = (r, p) + print(f" HIT {n}: net=${r.net_profit:,.0f} t={r.total_trades} PF={r.profit_factor:.2f}") + + if r.net_profit > 0: + if best_balanced is None or r.total_trades > best_balanced[0].total_trades or ( + r.total_trades == best_balanced[0].total_trades and r.net_profit > best_balanced[0].net_profit + ): + best_balanced = (r, p) + + if best_profit is None or r.net_profit > best_profit[0].net_profit: + best_profit = (r, p) + + for i, p in enumerate(seed_params(), 1): + eval_params(p, i) + print(f" seed {i}: net=${trial_rows[-1]['net']:,.0f} t={trial_rows[-1]['trades']} PF={trial_rows[-1]['pf']:.2f}") + + for n in range(len(seed_params()) + 1, args.trials + 1): + eval_params(sample_v5(rng), n) + if n % 500 == 0: + b = best_balanced or best_profit + print(f" ... {n}/{args.trials} best_bal t={b[0].total_trades} net=${b[0].net_profit:,.0f} hit={'yes' if target else 'no'}") + + final_r, final_p = target or best_balanced or best_profit + assert final_r and final_p + + write_v5_set(final_p, out / "SimpleEMA_optimized.set") + payload = { + "version": 5, + "target_met": target is not None, + "params": asdict(final_p), + "metrics": {k: v for k, v in asdict(final_r).items() if k != "trades"}, + } + (out / "best_params.json").write_text(json.dumps(payload, indent=2), encoding="utf-8") + pd.DataFrame(trial_rows).to_csv(out / "optimize_trials.csv", index=False) + + (out / "best_run").mkdir(exist_ok=True) + rows = [ + { + "side": t["side"], + "open_time": df.index[t["open_i"]], + "close_time": df.index[t["close_i"]], + "profit": t["profit"], + "exit_reason": t["exit_reason"], + } + for t in final_r.trades + ] + pd.DataFrame(rows).to_csv(out / "best_run" / "trades.csv", index=False) + + print( + f"\n{'TARGET' if target else 'BEST'}: net=${final_r.net_profit:,.2f} " + f"trades={final_r.total_trades} PF={final_r.profit_factor:.2f} WR={final_r.win_rate:.1f}% DD={final_r.max_drawdown_pct:.1f}%" + ) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/run_portfolio_v5.py b/lab/EAs/SimpleEMA/run_portfolio_v5.py new file mode 100644 index 0000000..b661e00 --- /dev/null +++ b/lab/EAs/SimpleEMA/run_portfolio_v5.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 +"""SimpleEMA v5 — 20-symbol portfolio backtest (shared params, per-symbol spread).""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict, replace +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +LAB = Path(__file__).resolve().parent +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) +sys.path.insert(0, str(LAB)) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from run_backtest import pip_size # noqa: E402 +from strategy_v5 import V5Params, load_v5_cache, market_from_cache, simulate_v5 # noqa: E402 + + +def load_portfolio_config(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def load_best_params(path: Path) -> V5Params: + data = json.loads(path.read_text(encoding="utf-8")) + return V5Params(**data["params"]) + + +def portfolio_metrics(trades: pd.DataFrame, initial: float) -> dict: + if trades.empty: + return {"net_profit": 0, "total_trades": 0, "profit_factor": 0, "win_rate": 0, "max_drawdown_pct": 0} + wins = trades[trades["profit"] > 0]["profit"] + losses = trades[trades["profit"] <= 0]["profit"] + gp = float(wins.sum()) if len(wins) else 0.0 + gl = abs(float(losses.sum())) if len(losses) else 0.0 + eq = initial + trades.sort_values("close_time")["profit"].cumsum() + dd = abs(float(((eq - eq.cummax()) / eq.cummax() * 100).min())) if len(eq) else 0.0 + return { + "net_profit": round(float(trades["profit"].sum()), 2), + "total_trades": len(trades), + "profit_factor": round(gp / gl, 2) if gl > 0 else 0.0, + "win_rate": round(100.0 * len(wins) / len(trades), 1), + "max_drawdown_pct": round(dd, 2), + "profitable_symbols": int((trades.groupby("symbol")["profit"].sum() > 0).sum()), + "symbol_count": trades["symbol"].nunique(), + } + + +def load_params_map(args) -> tuple[dict[str, V5Params], float, list[dict]]: + """Return symbol->params, lot, member metadata (may be empty).""" + if args.params and args.params.name == "portfolio_params.json" and args.params.exists(): + data = json.loads(args.params.read_text(encoding="utf-8")) + lot = data.get("config", {}).get("lot_per_symbol", 0.05) + mapping: dict[str, V5Params] = {} + members = [] + for m in data.get("members", []): + if not m.get("enabled", True) or "params" not in m: + continue + mapping[m["symbol"]] = V5Params(**m["params"]) + members.append(m) + return mapping, lot, members + + base = load_best_params(args.params) + lot = base.lot_size + return {}, lot, [] + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--config", type=Path, default=LAB / "portfolio_symbols.json") + ap.add_argument("--params", type=Path, default=LAB / "portfolio_params.json") + ap.add_argument("--shared-params", type=Path, default=LAB / "best_params.json", help="fallback single-param set") + args = ap.parse_args() + + cfg = load_portfolio_config(args.config) + per_sym, lot, members = load_params_map(args) + if not per_sym: + base = load_best_params(args.shared_params) + lot = cfg.get("lot_per_symbol", base.lot_size) + else: + lot = cfg.get("lot_per_symbol", lot) + initial = cfg.get("initial_balance", 10000) + + start = datetime.fromisoformat(cfg["period"][0]) + end = datetime.fromisoformat(cfg["period"][1]) + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + try: + sym_rows = [] + all_trades: list[dict] = [] + skipped: list[str] = [] + + for entry in cfg["symbols"]: + req = entry["name"] + try: + sym = resolve_symbol(req) + if per_sym and sym not in per_sym: + if members: + print(f" SKIP {sym}: disabled in portfolio_params") + continue + spread_cap = entry.get("max_spread_pips", 8.0) + if per_sym and sym in per_sym: + p = per_sym[sym] + else: + base = load_best_params(args.shared_params) + p = replace(base, lot_size=lot, max_spread_pips=spread_cap) + df = load_bars(sym, mt5.TIMEFRAME_M15, start, end) + pip = pip_size(sym) + point = float(mt5.symbol_info(sym).point) + costs = CostModel.for_symbol(sym) + r = simulate_v5(market_from_cache(load_v5_cache(df), p), sym, p, costs, pip, point) + for t in r.trades: + all_trades.append( + { + "symbol": sym, + "side": t["side"], + "open_time": df.index[t["open_i"]], + "close_time": df.index[t["close_i"]], + "profit": round(t["profit"], 2), + "exit_reason": t["exit_reason"], + } + ) + sym_rows.append( + { + "symbol": sym, + "trades": r.total_trades, + "net_profit": round(r.net_profit, 2), + "profit_factor": round(r.profit_factor, 2), + "win_rate": round(r.win_rate, 1), + } + ) + print(f" {sym}: t={r.total_trades} net=${r.net_profit:,.0f} PF={r.profit_factor:.2f}") + except Exception as exc: # noqa: BLE001 + skipped.append(f"{req}: {exc}") + print(f" SKIP {req}: {exc}") + + tdf = pd.DataFrame(all_trades).sort_values(["close_time", "symbol"]) if all_trades else pd.DataFrame() + metrics = portfolio_metrics(tdf, initial) + metrics["target_met_2000_trades"] = metrics["total_trades"] >= 2000 + metrics["target_met_profit"] = metrics["net_profit"] > 0 + + out = LAB / "best_run" + out.mkdir(exist_ok=True) + tdf.to_csv(out / "portfolio_trades.csv", index=False) + pd.DataFrame(sym_rows).to_csv(out / "portfolio_by_symbol.csv", index=False) + + mode = "per_symbol" if per_sym else "shared" + payload = { + "version": 5, + "mode": mode, + "symbol_count": len(sym_rows), + "skipped": skipped, + "metrics": metrics, + "per_symbol": sym_rows, + } + (LAB / "portfolio_report.json").write_text(json.dumps(payload, indent=2), encoding="utf-8") + + print( + f"\nPORTFOLIO ({len(sym_rows)} symbols): " + f"net=${metrics['net_profit']:,.0f} trades={metrics['total_trades']} " + f"PF={metrics['profit_factor']:.2f} WR={metrics['win_rate']:.1f}% " + f"DD={metrics['max_drawdown_pct']:.1f}% " + f"2000+={'YES' if metrics['target_met_2000_trades'] else 'no'} " + f"profit={'YES' if metrics['target_met_profit'] else 'no'}" + ) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/strategy_v3.py b/lab/EAs/SimpleEMA/strategy_v3.py new file mode 100644 index 0000000..4ac2a9a --- /dev/null +++ b/lab/EAs/SimpleEMA/strategy_v3.py @@ -0,0 +1,409 @@ +""" +SimpleEMA v3 — trend pullback engine (shared by main.mq5 mirror + optimizer). + +Logic: + 1. H4 EMA defines bias (long above / short below) + 2. M15 slow EMA slope confirms trend + 3. Entry on fast-EMA pullback + optional bullish/bearish bar + 4. ADX + DI filter; ATR band skips chop / spikes + 5. Breakeven after BE trigger; optional ATR trail after BE +""" + +from __future__ import annotations + +from dataclasses import dataclass + +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema # noqa: E402 + + +@dataclass +class V3Params: + fast_ema: int = 8 + slow_ema: int = 34 + min_ema_gap_pips: float = 1.0 + cooldown_bars: int = 4 + atr_period: int = 14 + atr_sl_mult: float = 2.0 + atr_tp_mult: float = 4.5 + max_bars_in_trade: int = 72 + htf_ema_period: int = 100 + adx_period: int = 14 + adx_min: float = 18.0 + adx_max: float = 42.0 + min_atr_pips: float = 4.0 + max_atr_pips: float = 22.0 + slope_lookback: int = 5 + require_bullish_bar: bool = True + use_di_filter: bool = True + use_breakeven: bool = True + be_trigger_atr: float = 1.0 + be_offset_pips: float = 1.0 + use_trail_after_be: bool = True + trail_atr_mult: float = 1.2 + session_start: int = 7 + session_end: int = 21 + max_spread_pips: float = 8.0 + lot_size: float = 0.10 + initial_balance: float = 10_000.0 + + +@dataclass +class V3Market: + df: pd.DataFrame + open_: np.ndarray + high: np.ndarray + low: np.ndarray + close: np.ndarray + hours: np.ndarray + fast: np.ndarray + slow: np.ndarray + atr: np.ndarray + adx: np.ndarray + plus_di: np.ndarray + minus_di: np.ndarray + htf: np.ndarray + + +@dataclass +class V3Result: + net_profit: float + total_trades: int + win_rate: float + profit_factor: float + max_drawdown_pct: float + sharpe: float + trades: list[dict] + + +@dataclass +class V3Cache: + df: pd.DataFrame + open_: np.ndarray + high: np.ndarray + low: np.ndarray + close: np.ndarray + hours: np.ndarray + fast: dict[int, np.ndarray] + slow: dict[int, np.ndarray] + atr: dict[int, np.ndarray] + adx: dict[int, np.ndarray] + plus_di: dict[int, np.ndarray] + minus_di: dict[int, np.ndarray] + htf: dict[int, np.ndarray] + + +def load_v3_cache(df: pd.DataFrame) -> V3Cache: + close_s = df["close"] + h4 = close_s.resample("4h").last().dropna() + return V3Cache( + df=df, + open_=df["open"].to_numpy(), + high=df["high"].to_numpy(), + low=df["low"].to_numpy(), + close=close_s.to_numpy(), + hours=df.index.hour.to_numpy(), + fast={p: calculate_ema(close_s, p).to_numpy() for p in range(6, 13)}, + slow={p: calculate_ema(close_s, p).to_numpy() for p in range(26, 53, 2)}, + atr={p: calculate_atr(df, p).to_numpy() for p in (10, 14, 20)}, + adx={p: calculate_adx(df, p).to_numpy() for p in (10, 14, 20)}, + plus_di={p: calculate_dmi(df, p)["plus_di"].to_numpy() for p in (10, 14, 20)}, + minus_di={p: calculate_dmi(df, p)["minus_di"].to_numpy() for p in (10, 14, 20)}, + htf={p: calculate_ema(h4, p).reindex(df.index, method="ffill").to_numpy() for p in (50, 100, 200)}, + ) + + +def market_from_cache(cache: V3Cache, p: V3Params) -> V3Market: + return V3Market( + df=cache.df, + open_=cache.open_, + high=cache.high, + low=cache.low, + close=cache.close, + hours=cache.hours, + fast=cache.fast[p.fast_ema], + slow=cache.slow[p.slow_ema], + atr=cache.atr[p.atr_period], + adx=cache.adx[p.adx_period], + plus_di=cache.plus_di[p.adx_period], + minus_di=cache.minus_di[p.adx_period], + htf=cache.htf[p.htf_ema_period], + ) + + +def load_v3_market(df: pd.DataFrame, p: V3Params) -> V3Market: + close_s = df["close"] + h4 = close_s.resample("4h").last().dropna() + dmi = calculate_dmi(df, p.adx_period) + return V3Market( + df=df, + open_=df["open"].to_numpy(), + high=df["high"].to_numpy(), + low=df["low"].to_numpy(), + close=close_s.to_numpy(), + hours=df.index.hour.to_numpy(), + fast=calculate_ema(close_s, p.fast_ema).to_numpy(), + slow=calculate_ema(close_s, p.slow_ema).to_numpy(), + atr=calculate_atr(df, p.atr_period).to_numpy(), + adx=calculate_adx(df, p.adx_period).to_numpy(), + plus_di=dmi["plus_di"].to_numpy(), + minus_di=dmi["minus_di"].to_numpy(), + htf=calculate_ema(h4, p.htf_ema_period).reindex(df.index, method="ffill").to_numpy(), + ) + + +def _session_ok(hours: np.ndarray, start: int, end: int) -> np.ndarray: + if start <= 0 and end >= 24: + return np.ones(len(hours), dtype=bool) + if start < end: + return (hours >= start) & (hours < end) + return (hours >= start) | (hours < end) + + +def build_v3_signals(md: V3Market, p: V3Params, pip: float) -> tuple[np.ndarray, np.ndarray]: + n = len(md.close) + lb = max(p.slope_lookback, 1) + slow_slope_up = md.slow > np.roll(md.slow, lb) + slow_slope_dn = md.slow < np.roll(md.slow, lb) + + c1 = np.roll(md.close, 1) + o1 = np.roll(md.open_, 1) + h1 = np.roll(md.high, 1) + l1 = np.roll(md.low, 1) + f1 = np.roll(md.fast, 1) + s1 = np.roll(md.slow, 1) + htf1 = np.roll(md.htf, 1) + adx1 = np.roll(md.adx, 1) + pdi1 = np.roll(md.plus_di, 1) + mdi1 = np.roll(md.minus_di, 1) + atr1 = np.roll(md.atr, 1) + + atr_pips = atr1 / pip + gap_ok = np.abs(f1 - s1) / pip >= p.min_ema_gap_pips + atr_ok = (atr_pips >= p.min_atr_pips) & (atr_pips <= p.max_atr_pips) + adx_ok = (adx1 >= p.adx_min) & (adx1 <= p.adx_max) + sess = _session_ok(np.roll(md.hours, 1), p.session_start, p.session_end) + + bull_bar = (c1 > o1) if p.require_bullish_bar else np.ones(n, dtype=bool) + bear_bar = (c1 < o1) if p.require_bullish_bar else np.ones(n, dtype=bool) + + di_long = (pdi1 > mdi1) if p.use_di_filter else np.ones(n, dtype=bool) + di_short = (mdi1 > pdi1) if p.use_di_filter else np.ones(n, dtype=bool) + + long_trend = (f1 > s1) & (c1 > htf1) & slow_slope_up & (c1 > s1) + short_trend = (f1 < s1) & (c1 < htf1) & slow_slope_dn & (c1 < s1) + + pullback_long = long_trend & (l1 <= f1) & (c1 > f1) & bull_bar + pullback_short = short_trend & (h1 >= f1) & (c1 < f1) & bear_bar + + buy = pullback_long & gap_ok & atr_ok & adx_ok & sess & di_long + sell = pullback_short & gap_ok & atr_ok & adx_ok & sess & di_short + warm = max(p.slow_ema + lb + 3, 30) + buy[:warm] = False + sell[:warm] = False + return buy, sell + + +def simulate_v3(md: V3Market, symbol: str, p: V3Params, costs, pip: float, point: float) -> V3Result: + buy_sig, sell_sig = build_v3_signals(md, p, pip) + opn, high, low, close, atr = md.open_, md.high, md.low, md.close, md.atr + + spread_px = costs.spread_points * point + slip = costs.slippage_points * point + half = spread_px / 2.0 + slip + commission = costs.commission_per_lot * p.lot_size * 2.0 + be_off = p.be_offset_pips * pip + + balance = p.initial_balance + equity = [balance] + trades: list[dict] = [] + side = None + entry = 0.0 + entry_i = 0 + sl_px = 0.0 + tp_px = 0.0 + trail = 0.0 + be_active = False + last_entry_i = -10_000 + + def calc_profit(entry_px: float, exit_px: float, s: str) -> float: + ot = mt5.ORDER_TYPE_BUY if s == "BUY" else mt5.ORDER_TYPE_SELL + pr = mt5.order_calc_profit(ot, symbol, p.lot_size, entry_px, exit_px) + return float(pr) - commission if pr is not None else -commission + + warm = max(p.slow_ema + p.slope_lookback + 5, 30) + for i in range(warm, len(md.df)): + atr1 = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + mid = float(opn[i]) + + if side is not None: + closed = False + bars_held = i - entry_i + + if p.max_bars_in_trade > 0 and bars_held >= p.max_bars_in_trade: + xp = mid - half if side == "BUY" else mid + half + pr = calc_profit(entry, xp, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "max_bars"}) + closed = True + + if not closed and side == "BUY": + if p.use_breakeven and not be_active and atr1 > 0 and high[i] >= entry + atr1 * p.be_trigger_atr: + be_active = True + sl_px = max(sl_px, entry + be_off) + if be_active and p.use_trail_after_be and atr1 > 0: + cand = high[i] - atr1 * p.trail_atr_mult + if cand > entry: + trail = max(trail, cand) if trail > 0 else cand + sl_px = max(sl_px, trail) + eff_sl = sl_px + if low[i] <= eff_sl: + reason = "trail" if trail > 0 and eff_sl > entry + be_off else ("be" if be_active and eff_sl >= entry else "sl") + pr = calc_profit(entry, eff_sl - half, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": reason}) + closed = True + elif high[i] >= tp_px: + pr = calc_profit(entry, tp_px - half, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "tp"}) + closed = True + + elif not closed and side == "SELL": + if p.use_breakeven and not be_active and atr1 > 0 and low[i] <= entry - atr1 * p.be_trigger_atr: + be_active = True + sl_px = min(sl_px, entry - be_off) + if be_active and p.use_trail_after_be and atr1 > 0: + cand = low[i] + atr1 * p.trail_atr_mult + if cand < entry: + trail = min(trail, cand) if trail > 0 else cand + sl_px = min(sl_px, trail) + eff_sl = sl_px + if high[i] >= eff_sl: + reason = "trail" if trail > 0 and eff_sl < entry - be_off else ("be" if be_active and eff_sl <= entry else "sl") + pr = calc_profit(entry, eff_sl + half, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": reason}) + closed = True + elif low[i] <= tp_px: + pr = calc_profit(entry, tp_px + half, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "tp"}) + closed = True + + if closed: + side = None + be_active = False + trail = 0.0 + + if side is None: + spread_pips = spread_px / pip if pip > 0 else 0 + if (p.max_spread_pips <= 0 or spread_pips <= p.max_spread_pips) and i - last_entry_i >= p.cooldown_bars: + if buy_sig[i] and atr1 > 0: + side = "BUY" + entry = mid + half + entry_i = i + sl_px = entry - atr1 * p.atr_sl_mult + tp_px = entry + atr1 * p.atr_tp_mult + be_active = False + trail = 0.0 + last_entry_i = i + elif sell_sig[i] and atr1 > 0: + side = "SELL" + entry = mid - half + entry_i = i + sl_px = entry + atr1 * p.atr_sl_mult + tp_px = entry - atr1 * p.atr_tp_mult + be_active = False + trail = 0.0 + last_entry_i = i + + mark = balance + if side == "BUY": + mark += calc_profit(entry, float(close[i - 1]), side) + commission + elif side == "SELL": + mark += calc_profit(entry, float(close[i - 1]), side) + commission + equity.append(mark) + + if side is not None: + pr = calc_profit(entry, float(close[-1]), side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": len(md.df) - 1, "profit": pr, "exit_reason": "eod"}) + + eq = pd.Series(equity[: len(md.df)], index=md.df.index[: len(equity)]) + net = balance - p.initial_balance + wins = [t["profit"] for t in trades if t["profit"] > 0] + losses = [t["profit"] for t in trades if t["profit"] <= 0] + gp = sum(wins) if wins else 0.0 + gl = abs(sum(losses)) if losses else 0.0 + pf = gp / gl if gl > 0 else 0.0 + wr = 100.0 * len(wins) / len(trades) if trades else 0.0 + dd = abs(float(((eq - eq.cummax()) / eq.cummax() * 100).min())) if len(eq) else 0.0 + rets = eq.pct_change().dropna() + sharpe = float(rets.mean() / rets.std() * np.sqrt(252 * 24 * 4)) if len(rets) > 1 and rets.std() > 0 else 0.0 + return V3Result(net, len(trades), wr, pf, dd, sharpe, trades) + + +def sample_v3(rng) -> V3Params: + return V3Params( + fast_ema=rng.randint(6, 12), + slow_ema=rng.choice([p for p in range(28, 51, 2)]), + min_ema_gap_pips=round(rng.uniform(0.5, 3.0), 1), + cooldown_bars=rng.choice([3, 4, 5, 6]), + atr_period=rng.choice([10, 14, 20]), + atr_sl_mult=round(rng.uniform(1.6, 2.8), 2), + atr_tp_mult=round(rng.uniform(3.5, 6.5), 2), + max_bars_in_trade=rng.choice([48, 72, 96]), + htf_ema_period=rng.choice([50, 100, 200]), + adx_min=round(rng.uniform(16, 24), 1), + adx_max=round(rng.uniform(35, 50), 1), + min_atr_pips=round(rng.uniform(2.0, 6.0), 1), + max_atr_pips=round(rng.uniform(15, 30), 1), + slope_lookback=rng.choice([4, 5, 6, 8]), + require_bullish_bar=rng.choice([True, True, False]), + use_di_filter=rng.choice([True, True, False]), + use_breakeven=rng.choice([True, True, False]), + be_trigger_atr=round(rng.uniform(0.8, 1.5), 2), + use_trail_after_be=rng.choice([True, False]), + trail_atr_mult=round(rng.uniform(1.0, 1.8), 2), + session_start=rng.choice([6, 7, 8]), + session_end=rng.choice([20, 21, 22]), + max_spread_pips=rng.choice([6, 8]), + ) + + +def write_v3_set(p: V3Params, path) -> None: + lines = [ + "; SimpleEMA v3 — trend pullback", + "Timeframe=16388", + f"FastEmaPeriod={p.fast_ema}", + f"SlowEmaPeriod={p.slow_ema}", + f"MinEmaGapPips={p.min_ema_gap_pips}", + f"CooldownBars={p.cooldown_bars}", + f"AtrPeriod={p.atr_period}", + f"AtrSlMult={p.atr_sl_mult}", + f"AtrTpMult={p.atr_tp_mult}", + f"MaxBarsInTrade={p.max_bars_in_trade}", + f"HtfEmaPeriod={p.htf_ema_period}", + f"AdxPeriod={p.adx_period}", + f"AdxMin={p.adx_min}", + f"AdxMax={p.adx_max}", + f"MinAtrPips={p.min_atr_pips}", + f"MaxAtrPips={p.max_atr_pips}", + f"SlopeLookback={p.slope_lookback}", + f"RequireBullishBar={'true' if p.require_bullish_bar else 'false'}", + f"UseDiFilter={'true' if p.use_di_filter else 'false'}", + f"UseBreakeven={'true' if p.use_breakeven else 'false'}", + f"BeTriggerAtr={p.be_trigger_atr}", + f"BeOffsetPips={p.be_offset_pips}", + f"UseTrailAfterBe={'true' if p.use_trail_after_be else 'false'}", + f"TrailAtrMult={p.trail_atr_mult}", + f"SessionStartHour={p.session_start}", + f"SessionEndHour={p.session_end}", + f"MaxSpreadPips={p.max_spread_pips}", + f"LotSize={p.lot_size}", + ] + path.write_text("\n".join(lines) + "\n", encoding="utf-8") diff --git a/lab/EAs/SimpleEMA/strategy_v4.py b/lab/EAs/SimpleEMA/strategy_v4.py new file mode 100644 index 0000000..7b45dbb --- /dev/null +++ b/lab/EAs/SimpleEMA/strategy_v4.py @@ -0,0 +1,477 @@ +""" +SimpleEMA v4 — regime-aware dual entry + partial take-profit. + +Changes vs v3: + 1. Chop filter: skip when fast/slow crossed too often recently + 2. Trend quality: ADX rising + EMA gap scaled by ATR (not fixed pips) + 3. Dual entry: EMA cross OR deep pullback in established trend + 4. Partial TP: scale out at TP1, trail remainder toward TP2 +""" + +from __future__ import annotations + +from dataclasses import dataclass + +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +from indicator_utils import calculate_adx, calculate_atr, calculate_dmi, calculate_ema # noqa: E402 + + +@dataclass +class V4Params: + fast_ema: int = 10 + slow_ema: int = 42 + entry_mode: int = 1 # 0=cross, 1=cross+pullback, 2=pullback + min_ema_gap_atr: float = 0.12 + chop_lookback: int = 24 + max_chop_crosses: int = 1 + pullback_swing_bars: int = 12 + pullback_min_depth_atr: float = 0.35 + adx_rising_bars: int = 3 + cooldown_bars: int = 5 + atr_period: int = 14 + atr_sl_mult: float = 2.2 + tp1_atr_mult: float = 1.8 + tp1_close_pct: float = 0.5 + tp2_atr_mult: float = 5.5 + max_bars_in_trade: int = 80 + htf_ema_period: int = 100 + adx_period: int = 14 + adx_min: float = 20.0 + adx_max: float = 45.0 + min_atr_pips: float = 3.0 + max_atr_pips: float = 24.0 + slope_lookback: int = 5 + require_bullish_bar: bool = True + use_di_filter: bool = True + use_partial_tp: bool = True + use_trail_after_tp1: bool = True + trail_atr_mult: float = 1.4 + be_offset_pips: float = 1.0 + session_start: int = 8 + session_end: int = 21 + max_spread_pips: float = 8.0 + lot_size: float = 0.10 + initial_balance: float = 10_000.0 + + +@dataclass +class V4Market: + df: pd.DataFrame + open_: np.ndarray + high: np.ndarray + low: np.ndarray + close: np.ndarray + hours: np.ndarray + fast: np.ndarray + slow: np.ndarray + atr: np.ndarray + adx: np.ndarray + plus_di: np.ndarray + minus_di: np.ndarray + htf: np.ndarray + + +@dataclass +class V4Result: + net_profit: float + total_trades: int + win_rate: float + profit_factor: float + max_drawdown_pct: float + sharpe: float + trades: list[dict] + + +@dataclass +class V4Cache: + df: pd.DataFrame + open_: np.ndarray + high: np.ndarray + low: np.ndarray + close: np.ndarray + hours: np.ndarray + fast: dict[int, np.ndarray] + slow: dict[int, np.ndarray] + atr: dict[int, np.ndarray] + adx: dict[int, np.ndarray] + plus_di: dict[int, np.ndarray] + minus_di: dict[int, np.ndarray] + htf: dict[int, np.ndarray] + + +def load_v4_cache(df: pd.DataFrame) -> V4Cache: + close_s = df["close"] + h4 = close_s.resample("4h").last().dropna() + return V4Cache( + df=df, + open_=df["open"].to_numpy(), + high=df["high"].to_numpy(), + low=df["low"].to_numpy(), + close=close_s.to_numpy(), + hours=df.index.hour.to_numpy(), + fast={p: calculate_ema(close_s, p).to_numpy() for p in range(6, 14)}, + slow={p: calculate_ema(close_s, p).to_numpy() for p in range(28, 55, 2)}, + atr={p: calculate_atr(df, p).to_numpy() for p in (10, 14, 20)}, + adx={p: calculate_adx(df, p).to_numpy() for p in (10, 14, 20)}, + plus_di={p: calculate_dmi(df, p)["plus_di"].to_numpy() for p in (10, 14, 20)}, + minus_di={p: calculate_dmi(df, p)["minus_di"].to_numpy() for p in (10, 14, 20)}, + htf={p: calculate_ema(h4, p).reindex(df.index, method="ffill").to_numpy() for p in (50, 100, 200)}, + ) + + +def market_from_cache(cache: V4Cache, p: V4Params) -> V4Market: + return V4Market( + df=cache.df, + open_=cache.open_, + high=cache.high, + low=cache.low, + close=cache.close, + hours=cache.hours, + fast=cache.fast[p.fast_ema], + slow=cache.slow[p.slow_ema], + atr=cache.atr[p.atr_period], + adx=cache.adx[p.adx_period], + plus_di=cache.plus_di[p.adx_period], + minus_di=cache.minus_di[p.adx_period], + htf=cache.htf[p.htf_ema_period], + ) + + +def _session_ok(hours: np.ndarray, start: int, end: int) -> np.ndarray: + if start <= 0 and end >= 24: + return np.ones(len(hours), dtype=bool) + if start < end: + return (hours >= start) & (hours < end) + return (hours >= start) | (hours < end) + + +def _rolling_cross_count(fast: np.ndarray, slow: np.ndarray, lookback: int) -> np.ndarray: + n = len(fast) + f1, f2 = np.roll(fast, 1), np.roll(fast, 2) + s1, s2 = np.roll(slow, 1), np.roll(slow, 2) + cross = ((f2 <= s2) & (f1 > s1)) | ((f2 >= s2) & (f1 < s1)) + out = np.zeros(n, dtype=np.int32) + for i in range(lookback, n): + out[i] = int(np.sum(cross[i - lookback + 1 : i + 1])) + return out + + +def _rolling_max(arr: np.ndarray, window: int) -> np.ndarray: + s = pd.Series(arr) + return s.shift(1).rolling(window, min_periods=1).max().to_numpy() + + +def _rolling_min(arr: np.ndarray, window: int) -> np.ndarray: + s = pd.Series(arr) + return s.shift(1).rolling(window, min_periods=1).min().to_numpy() + + +def build_v4_signals(md: V4Market, p: V4Params, pip: float) -> tuple[np.ndarray, np.ndarray]: + n = len(md.close) + lb = max(p.slope_lookback, 1) + rb = max(p.adx_rising_bars, 1) + + f1 = np.roll(md.fast, 1) + s1 = np.roll(md.slow, 1) + f2 = np.roll(md.fast, 2) + s2 = np.roll(md.slow, 2) + c1 = np.roll(md.close, 1) + o1 = np.roll(md.open_, 1) + h1 = np.roll(md.high, 1) + l1 = np.roll(md.low, 1) + htf1 = np.roll(md.htf, 1) + adx1 = np.roll(md.adx, 1) + adx_rb = np.roll(md.adx, 1 + rb) + pdi1 = np.roll(md.plus_di, 1) + mdi1 = np.roll(md.minus_di, 1) + atr1 = np.roll(md.atr, 1) + slow_old = np.roll(md.slow, lb) + + atr_pips = atr1 / pip + atr_ok = (atr_pips >= p.min_atr_pips) & (atr_pips <= p.max_atr_pips) + adx_ok = (adx1 >= p.adx_min) & (adx1 <= p.adx_max) + adx_rising = adx1 > adx_rb + sess = _session_ok(np.roll(md.hours, 1), p.session_start, p.session_end) + chop = _rolling_cross_count(md.fast, md.slow, p.chop_lookback) + chop_ok = chop <= p.max_chop_crosses + + gap_ok = np.abs(f1 - s1) >= atr1 * p.min_ema_gap_atr + bull_bar = (c1 > o1) if p.require_bullish_bar else np.ones(n, dtype=bool) + bear_bar = (c1 < o1) if p.require_bullish_bar else np.ones(n, dtype=bool) + di_long = (pdi1 > mdi1) if p.use_di_filter else np.ones(n, dtype=bool) + di_short = (mdi1 > pdi1) if p.use_di_filter else np.ones(n, dtype=bool) + + slow_up = s1 > slow_old + slow_dn = s1 < slow_old + long_regime = (f1 > s1) & (c1 > htf1) & (c1 > s1) & slow_up + short_regime = (f1 < s1) & (c1 < htf1) & (c1 < s1) & slow_dn + regime = long_regime | short_regime + + base = regime & gap_ok & atr_ok & adx_ok & adx_rising & sess & chop_ok + + bull_cross = (f2 <= s2) & (f1 > s1) + bear_cross = (f2 >= s2) & (f1 < s1) + + swing_hi = _rolling_max(md.high, p.pullback_swing_bars) + swing_lo = _rolling_min(md.low, p.pullback_swing_bars) + depth_long = (swing_hi - l1) >= atr1 * p.pullback_min_depth_atr + depth_short = (h1 - swing_lo) >= atr1 * p.pullback_min_depth_atr + + pb_long = long_regime & (l1 <= f1) & (c1 > f1) & depth_long & bull_bar + pb_short = short_regime & (h1 >= f1) & (c1 < f1) & depth_short & bear_bar + + if p.entry_mode == 0: + buy_raw, sell_raw = bull_cross, bear_cross + elif p.entry_mode == 2: + buy_raw, sell_raw = pb_long, pb_short + else: + buy_raw = bull_cross | pb_long + sell_raw = bear_cross | pb_short + + buy = buy_raw & base & di_long + sell = sell_raw & base & di_short + + warm = max(p.slow_ema + lb + p.chop_lookback + 5, 40) + buy[:warm] = False + sell[:warm] = False + return buy, sell + + +def simulate_v4(md: V4Market, symbol: str, p: V4Params, costs, pip: float, point: float) -> V4Result: + buy_sig, sell_sig = build_v4_signals(md, p, pip) + opn, high, low, close, atr = md.open_, md.high, md.low, md.close, md.atr + + spread_px = costs.spread_points * point + slip = costs.slippage_points * point + half = spread_px / 2.0 + slip + commission = costs.commission_per_lot * p.lot_size * 2.0 + be_off = p.be_offset_pips * pip + + balance = p.initial_balance + equity = [balance] + trades: list[dict] = [] + side = None + entry = 0.0 + entry_i = 0 + sl_px = 0.0 + tp_px = 0.0 + tp1_px = 0.0 + lot_frac = 1.0 + tp1_done = False + trail = 0.0 + last_entry_i = -10_000 + + def calc_profit(entry_px: float, exit_px: float, s: str, frac: float = 1.0) -> float: + lot = p.lot_size * frac + ot = mt5.ORDER_TYPE_BUY if s == "BUY" else mt5.ORDER_TYPE_SELL + pr = mt5.order_calc_profit(ot, symbol, lot, entry_px, exit_px) + comm = costs.commission_per_lot * lot * 2.0 + return float(pr) - comm if pr is not None else -comm + + warm = max(p.slow_ema + p.chop_lookback + 10, 40) + for i in range(warm, len(md.df)): + atr1 = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + mid = float(opn[i]) + + if side is not None: + closed = False + bars_held = i - entry_i + + if p.max_bars_in_trade > 0 and bars_held >= p.max_bars_in_trade: + xp = mid - half if side == "BUY" else mid + half + pr = calc_profit(entry, xp, side, lot_frac) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "max_bars"}) + closed = True + + if not closed and side == "BUY": + if p.use_partial_tp and not tp1_done and high[i] >= tp1_px: + pr1 = calc_profit(entry, tp1_px - half, side, p.tp1_close_pct) + balance += pr1 + tp1_done = True + lot_frac = 1.0 - p.tp1_close_pct + sl_px = max(sl_px, entry + be_off) + tp_px = entry + atr1 * p.tp2_atr_mult if atr1 > 0 else tp_px + + if tp1_done and p.use_trail_after_tp1 and atr1 > 0: + cand = high[i] - atr1 * p.trail_atr_mult + if cand > entry: + trail = max(trail, cand) if trail > 0 else cand + sl_px = max(sl_px, trail) + + eff_sl = sl_px + if low[i] <= eff_sl: + reason = "trail" if trail > 0 and eff_sl > entry + be_off else ("be" if tp1_done else "sl") + pr = calc_profit(entry, eff_sl - half, side, lot_frac) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": reason}) + closed = True + elif high[i] >= tp_px: + pr = calc_profit(entry, tp_px - half, side, lot_frac) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "tp2" if tp1_done else "tp"}) + closed = True + + elif not closed and side == "SELL": + if p.use_partial_tp and not tp1_done and low[i] <= tp1_px: + pr1 = calc_profit(entry, tp1_px + half, side, p.tp1_close_pct) + balance += pr1 + tp1_done = True + lot_frac = 1.0 - p.tp1_close_pct + sl_px = min(sl_px, entry - be_off) + tp_px = entry - atr1 * p.tp2_atr_mult if atr1 > 0 else tp_px + + if tp1_done and p.use_trail_after_tp1 and atr1 > 0: + cand = low[i] + atr1 * p.trail_atr_mult + if cand < entry: + trail = min(trail, cand) if trail > 0 else cand + sl_px = min(sl_px, trail) + + eff_sl = sl_px + if high[i] >= eff_sl: + reason = "trail" if trail > 0 and eff_sl < entry - be_off else ("be" if tp1_done else "sl") + pr = calc_profit(entry, eff_sl + half, side, lot_frac) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": reason}) + closed = True + elif low[i] <= tp_px: + pr = calc_profit(entry, tp_px + half, side, lot_frac) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "tp2" if tp1_done else "tp"}) + closed = True + + if closed: + side = None + tp1_done = False + lot_frac = 1.0 + trail = 0.0 + + if side is None: + spread_pips = spread_px / pip if pip > 0 else 0 + if (p.max_spread_pips <= 0 or spread_pips <= p.max_spread_pips) and i - last_entry_i >= p.cooldown_bars: + if buy_sig[i] and atr1 > 0: + side = "BUY" + entry = mid + half + entry_i = i + sl_px = entry - atr1 * p.atr_sl_mult + tp1_px = entry + atr1 * p.tp1_atr_mult + tp_px = entry + atr1 * (p.tp2_atr_mult if p.use_partial_tp else p.tp1_atr_mult) + tp1_done = False + lot_frac = 1.0 + trail = 0.0 + last_entry_i = i + elif sell_sig[i] and atr1 > 0: + side = "SELL" + entry = mid - half + entry_i = i + sl_px = entry + atr1 * p.atr_sl_mult + tp1_px = entry - atr1 * p.tp1_atr_mult + tp_px = entry - atr1 * (p.tp2_atr_mult if p.use_partial_tp else p.tp1_atr_mult) + tp1_done = False + lot_frac = 1.0 + trail = 0.0 + last_entry_i = i + + mark = balance + if side == "BUY": + mark += calc_profit(entry, float(close[i - 1]), side, lot_frac) + costs.commission_per_lot * p.lot_size * lot_frac * 2.0 + elif side == "SELL": + mark += calc_profit(entry, float(close[i - 1]), side, lot_frac) + costs.commission_per_lot * p.lot_size * lot_frac * 2.0 + equity.append(mark) + + if side is not None: + pr = calc_profit(entry, float(close[-1]), side, lot_frac) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": len(md.df) - 1, "profit": pr, "exit_reason": "eod"}) + + eq = pd.Series(equity[: len(md.df)], index=md.df.index[: len(equity)]) + net = balance - p.initial_balance + wins = [t["profit"] for t in trades if t["profit"] > 0] + losses = [t["profit"] for t in trades if t["profit"] <= 0] + gp = sum(wins) if wins else 0.0 + gl = abs(sum(losses)) if losses else 0.0 + pf = gp / gl if gl > 0 else 0.0 + wr = 100.0 * len(wins) / len(trades) if trades else 0.0 + dd = abs(float(((eq - eq.cummax()) / eq.cummax() * 100).min())) if len(eq) else 0.0 + rets = eq.pct_change().dropna() + sharpe = float(rets.mean() / rets.std() * np.sqrt(252 * 24 * 4)) if len(rets) > 1 and rets.std() > 0 else 0.0 + return V4Result(net, len(trades), wr, pf, dd, sharpe, trades) + + +def sample_v4(rng) -> V4Params: + return V4Params( + fast_ema=rng.randint(7, 13), + slow_ema=rng.choice([p for p in range(30, 53, 2)]), + entry_mode=rng.choice([0, 1, 1, 1]), + min_ema_gap_atr=round(rng.uniform(0.08, 0.25), 2), + chop_lookback=rng.choice([16, 20, 24, 32]), + max_chop_crosses=rng.choice([0, 1, 1, 2]), + pullback_swing_bars=rng.choice([8, 12, 16]), + pullback_min_depth_atr=round(rng.uniform(0.2, 0.6), 2), + adx_rising_bars=rng.choice([2, 3, 4, 5]), + cooldown_bars=rng.choice([3, 4, 5, 6, 8]), + atr_period=rng.choice([10, 14, 20]), + atr_sl_mult=round(rng.uniform(1.8, 2.8), 2), + tp1_atr_mult=round(rng.uniform(1.4, 2.2), 2), + tp1_close_pct=rng.choice([0.4, 0.5, 0.5, 0.6]), + tp2_atr_mult=round(rng.uniform(4.5, 7.0), 2), + max_bars_in_trade=rng.choice([64, 80, 96]), + htf_ema_period=rng.choice([50, 100, 200]), + adx_min=round(rng.uniform(18, 26), 1), + adx_max=round(rng.uniform(38, 50), 1), + min_atr_pips=round(rng.uniform(2.0, 5.0), 1), + max_atr_pips=round(rng.uniform(18, 28), 1), + slope_lookback=rng.choice([4, 5, 6]), + require_bullish_bar=rng.choice([True, True, False]), + use_di_filter=rng.choice([True, True, False]), + use_partial_tp=rng.choice([True, True, False]), + use_trail_after_tp1=rng.choice([True, True, False]), + trail_atr_mult=round(rng.uniform(1.1, 1.8), 2), + session_start=rng.choice([7, 8]), + session_end=rng.choice([20, 21, 22]), + max_spread_pips=rng.choice([6, 8]), + ) + + +def write_v4_set(p: V4Params, path) -> None: + lines = [ + "; SimpleEMA v4 — regime dual entry + partial TP", + "Timeframe=16388", + f"FastEmaPeriod={p.fast_ema}", + f"SlowEmaPeriod={p.slow_ema}", + f"EntryMode={p.entry_mode}", + f"MinEmaGapAtr={p.min_ema_gap_atr}", + f"ChopLookback={p.chop_lookback}", + f"MaxChopCrosses={p.max_chop_crosses}", + f"PullbackSwingBars={p.pullback_swing_bars}", + f"PullbackMinDepthAtr={p.pullback_min_depth_atr}", + f"AdxRisingBars={p.adx_rising_bars}", + f"CooldownBars={p.cooldown_bars}", + f"AtrPeriod={p.atr_period}", + f"AtrSlMult={p.atr_sl_mult}", + f"Tp1AtrMult={p.tp1_atr_mult}", + f"Tp1ClosePct={p.tp1_close_pct}", + f"Tp2AtrMult={p.tp2_atr_mult}", + f"MaxBarsInTrade={p.max_bars_in_trade}", + f"HtfEmaPeriod={p.htf_ema_period}", + f"AdxPeriod={p.adx_period}", + f"AdxMin={p.adx_min}", + f"AdxMax={p.adx_max}", + f"MinAtrPips={p.min_atr_pips}", + f"MaxAtrPips={p.max_atr_pips}", + f"SlopeLookback={p.slope_lookback}", + f"RequireBullishBar={'true' if p.require_bullish_bar else 'false'}", + f"UseDiFilter={'true' if p.use_di_filter else 'false'}", + f"UsePartialTp={'true' if p.use_partial_tp else 'false'}", + f"UseTrailAfterTp1={'true' if p.use_trail_after_tp1 else 'false'}", + f"TrailAtrMult={p.trail_atr_mult}", + f"BeOffsetPips={p.be_offset_pips}", + f"SessionStartHour={p.session_start}", + f"SessionEndHour={p.session_end}", + f"MaxSpreadPips={p.max_spread_pips}", + f"LotSize={p.lot_size}", + ] + path.write_text("\n".join(lines) + "\n", encoding="utf-8") diff --git a/lab/EAs/SimpleEMA/strategy_v5.py b/lab/EAs/SimpleEMA/strategy_v5.py new file mode 100644 index 0000000..1ea29e1 --- /dev/null +++ b/lab/EAs/SimpleEMA/strategy_v5.py @@ -0,0 +1,405 @@ +""" +SimpleEMA v5 — trend-leg pullback engine. + +Core idea: + - Cross entries use the proven v2-style filter stack (HTF + session + gap). + - Pullback entries only inside an active trend leg (bars since last same-dir cross). + - Avoids chop without stacking ADX-rising / chop-count on every signal. +""" + +from __future__ import annotations + +from dataclasses import dataclass + +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +from indicator_utils import calculate_adx, calculate_atr, calculate_ema # noqa: E402 + + +@dataclass +class V5Params: + fast_ema: int = 10 + slow_ema: int = 46 + trend_leg_bars: int = 48 + min_ema_gap_pips: float = 1.5 + cross_cooldown: int = 8 + pullback_cooldown: int = 3 + use_pullback: bool = True + pullback_touch: int = 0 # 0=fast EMA, 1=slow EMA + pullback_adx_min: float = 0.0 # 0 = same as cross (no extra) + pullback_min_gap_pips: float = 0.0 # 0 = use min_ema_gap_pips + max_pullbacks_per_leg: int = 1 + atr_period: int = 20 + atr_sl_mult: float = 2.71 + atr_tp_mult: float = 6.36 + max_bars_in_trade: int = 64 + htf_ema_period: int = 200 + use_htf_filter: bool = True + use_adx_filter: bool = False + adx_period: int = 14 + adx_min: float = 18.0 + session_start: int = 8 + session_end: int = 22 + max_spread_pips: float = 6.0 + lot_size: float = 0.10 + initial_balance: float = 10_000.0 + + +@dataclass +class V5Market: + df: pd.DataFrame + open_: np.ndarray + high: np.ndarray + low: np.ndarray + close: np.ndarray + hours: np.ndarray + fast: np.ndarray + slow: np.ndarray + atr: np.ndarray + adx: np.ndarray + htf: np.ndarray + + +@dataclass +class V5Result: + net_profit: float + total_trades: int + win_rate: float + profit_factor: float + max_drawdown_pct: float + sharpe: float + trades: list[dict] + + +@dataclass +class V5Cache: + df: pd.DataFrame + open_: np.ndarray + high: np.ndarray + low: np.ndarray + close: np.ndarray + hours: np.ndarray + fast: dict[int, np.ndarray] + slow: dict[int, np.ndarray] + atr: dict[int, np.ndarray] + adx: dict[int, np.ndarray] + htf: dict[int, np.ndarray] + + +def load_v5_cache(df: pd.DataFrame) -> V5Cache: + close_s = df["close"] + h4 = close_s.resample("4h").last().dropna() + return V5Cache( + df=df, + open_=df["open"].to_numpy(), + high=df["high"].to_numpy(), + low=df["low"].to_numpy(), + close=close_s.to_numpy(), + hours=df.index.hour.to_numpy(), + fast={p: calculate_ema(close_s, p).to_numpy() for p in range(6, 14)}, + slow={p: calculate_ema(close_s, p).to_numpy() for p in range(28, 55, 2)}, + atr={p: calculate_atr(df, p).to_numpy() for p in (10, 14, 20)}, + adx={p: calculate_adx(df, p).to_numpy() for p in (10, 14, 20)}, + htf={p: calculate_ema(h4, p).reindex(df.index, method="ffill").to_numpy() for p in (50, 100, 200)}, + ) + + +def market_from_cache(cache: V5Cache, p: V5Params) -> V5Market: + return V5Market( + df=cache.df, + open_=cache.open_, + high=cache.high, + low=cache.low, + close=cache.close, + hours=cache.hours, + fast=cache.fast[p.fast_ema], + slow=cache.slow[p.slow_ema], + atr=cache.atr[p.atr_period], + adx=cache.adx[p.adx_period], + htf=cache.htf[p.htf_ema_period], + ) + + +def _session_ok(hours: np.ndarray, start: int, end: int) -> np.ndarray: + if start <= 0 and end >= 24: + return np.ones(len(hours), dtype=bool) + if start < end: + return (hours >= start) & (hours < end) + return (hours >= start) | (hours < end) + + +def _last_cross_bar(cross: np.ndarray) -> np.ndarray: + idx = np.arange(len(cross), dtype=np.float64) + marked = np.where(cross, idx, np.nan) + return pd.Series(marked).ffill().to_numpy() + + +def _trend_legs(bull_cross: np.ndarray, bear_cross: np.ndarray, leg_bars: int) -> tuple[np.ndarray, np.ndarray]: + idx = np.arange(len(bull_cross), dtype=np.int32) + bull_bar = _last_cross_bar(bull_cross) + bear_bar = _last_cross_bar(bear_cross) + bull_ok = ~np.isnan(bull_bar) + bear_ok = ~np.isnan(bear_bar) + since_bull = idx - bull_bar + since_bear = idx - bear_bar + + long_leg = bull_ok & (since_bull <= leg_bars) & (~bear_ok | (bull_bar > bear_bar)) + short_leg = bear_ok & (since_bear <= leg_bars) & (~bull_ok | (bear_bar > bull_bar)) + return long_leg, short_leg + + +def build_v5_signals(md: V5Market, p: V5Params, pip: float) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + """Returns buy_cross, buy_pullback, sell_cross, sell_pullback as separate arrays.""" + n = len(md.close) + f1 = np.roll(md.fast, 1) + s1 = np.roll(md.slow, 1) + f2 = np.roll(md.fast, 2) + s2 = np.roll(md.slow, 2) + c1 = np.roll(md.close, 1) + h1 = np.roll(md.high, 1) + l1 = np.roll(md.low, 1) + htf1 = np.roll(md.htf, 1) + adx1 = np.roll(md.adx, 1) + + bull_cross = (f2 <= s2) & (f1 > s1) + bear_cross = (f2 >= s2) & (f1 < s1) + long_leg, short_leg = _trend_legs(bull_cross, bear_cross, p.trend_leg_bars) + + gap_ok = np.abs(f1 - s1) / pip >= p.min_ema_gap_pips + sess = _session_ok(np.roll(md.hours, 1), p.session_start, p.session_end) + adx_ok = (adx1 >= p.adx_min) if p.use_adx_filter else np.ones(n, dtype=bool) + + if p.use_htf_filter: + htf_long = c1 > htf1 + htf_short = c1 < htf1 + else: + htf_long = htf_short = np.ones(n, dtype=bool) + + base_long = gap_ok & sess & adx_ok & htf_long & (f1 > s1) + base_short = gap_ok & sess & adx_ok & htf_short & (f1 < s1) + + cross_buy = bull_cross & base_long + cross_sell = bear_cross & base_short + + touch = f1 if p.pullback_touch == 0 else s1 + pb_buy = np.zeros(n, dtype=bool) + pb_sell = np.zeros(n, dtype=bool) + if p.use_pullback: + pb_gap = p.pullback_min_gap_pips if p.pullback_min_gap_pips > 0 else p.min_ema_gap_pips + pb_gap_ok = np.abs(f1 - s1) / pip >= pb_gap + pb_adx_min = p.pullback_adx_min if p.pullback_adx_min > 0 else (p.adx_min if p.use_adx_filter else 0) + pb_adx_ok = (adx1 >= pb_adx_min) if pb_adx_min > 0 else np.ones(n, dtype=bool) + pb_base_long = pb_gap_ok & pb_adx_ok & sess & htf_long & (f1 > s1) + pb_base_short = pb_gap_ok & pb_adx_ok & sess & htf_short & (f1 < s1) + pb_buy = long_leg & pb_base_long & (l1 <= touch) & (c1 > touch) & ~bull_cross + pb_sell = short_leg & pb_base_short & (h1 >= touch) & (c1 < touch) & ~bear_cross + + warm = max(p.slow_ema + 5, 30) + for arr in (cross_buy, cross_sell, pb_buy, pb_sell): + arr[:warm] = False + + return cross_buy, pb_buy, cross_sell, pb_sell + + +def simulate_v5(md: V5Market, symbol: str, p: V5Params, costs, pip: float, point: float) -> V5Result: + cross_buy, pb_buy, cross_sell, pb_sell = build_v5_signals(md, p, pip) + opn, high, low, close, atr = md.open_, md.high, md.low, md.close, md.atr + + spread_px = costs.spread_points * point + slip = costs.slippage_points * point + half = spread_px / 2.0 + slip + commission = costs.commission_per_lot * p.lot_size * 2.0 + + balance = p.initial_balance + equity = [balance] + trades: list[dict] = [] + side = None + entry = 0.0 + entry_i = 0 + sl_px = 0.0 + tp_px = 0.0 + last_cross_i = -10_000 + last_pb_i = -10_000 + leg_pb_count = 0 + active_leg = 0 # 1=long, -1=short + + def calc_profit(entry_px: float, exit_px: float, s: str) -> float: + ot = mt5.ORDER_TYPE_BUY if s == "BUY" else mt5.ORDER_TYPE_SELL + pr = mt5.order_calc_profit(ot, symbol, p.lot_size, entry_px, exit_px) + return float(pr) - commission if pr is not None else -commission + + warm = max(p.slow_ema + 5, 30) + for i in range(warm, len(md.df)): + atr1 = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + mid = float(opn[i]) + + if side is not None: + closed = False + bars_held = i - entry_i + if p.max_bars_in_trade > 0 and bars_held >= p.max_bars_in_trade: + xp = mid - half if side == "BUY" else mid + half + pr = calc_profit(entry, xp, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "max_bars"}) + closed = True + elif side == "BUY": + if low[i] <= sl_px: + pr = calc_profit(entry, sl_px - half, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "sl"}) + closed = True + elif high[i] >= tp_px: + pr = calc_profit(entry, tp_px - half, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "tp"}) + closed = True + elif side == "SELL": + if high[i] >= sl_px: + pr = calc_profit(entry, sl_px + half, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "sl"}) + closed = True + elif low[i] <= tp_px: + pr = calc_profit(entry, tp_px + half, side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": pr, "exit_reason": "tp"}) + closed = True + + if closed: + side = None + + # track trend leg for pullback cap + if cross_buy[i]: + active_leg = 1 + leg_pb_count = 0 + elif cross_sell[i]: + active_leg = -1 + leg_pb_count = 0 + + if side is None: + spread_pips = spread_px / pip if pip > 0 else 0 + if p.max_spread_pips <= 0 or spread_pips <= p.max_spread_pips: + entered = False + if cross_buy[i] and atr1 > 0 and i - last_cross_i >= p.cross_cooldown: + side = "BUY" + entry = mid + half + entry_i = i + sl_px = entry - atr1 * p.atr_sl_mult + tp_px = entry + atr1 * p.atr_tp_mult + last_cross_i = i + entered = True + elif cross_sell[i] and atr1 > 0 and i - last_cross_i >= p.cross_cooldown: + side = "SELL" + entry = mid - half + entry_i = i + sl_px = entry + atr1 * p.atr_sl_mult + tp_px = entry - atr1 * p.atr_tp_mult + last_cross_i = i + entered = True + elif p.use_pullback and pb_buy[i] and atr1 > 0 and i - last_pb_i >= p.pullback_cooldown: + if active_leg == 1 and leg_pb_count < p.max_pullbacks_per_leg: + side = "BUY" + entry = mid + half + entry_i = i + sl_px = entry - atr1 * p.atr_sl_mult + tp_px = entry + atr1 * p.atr_tp_mult + last_pb_i = i + leg_pb_count += 1 + entered = True + elif p.use_pullback and pb_sell[i] and atr1 > 0 and i - last_pb_i >= p.pullback_cooldown: + if active_leg == -1 and leg_pb_count < p.max_pullbacks_per_leg: + side = "SELL" + entry = mid - half + entry_i = i + sl_px = entry + atr1 * p.atr_sl_mult + tp_px = entry - atr1 * p.atr_tp_mult + last_pb_i = i + leg_pb_count += 1 + entered = True + _ = entered + + mark = balance + if side == "BUY": + mark += calc_profit(entry, float(close[i - 1]), side) + commission + elif side == "SELL": + mark += calc_profit(entry, float(close[i - 1]), side) + commission + equity.append(mark) + + if side is not None: + pr = calc_profit(entry, float(close[-1]), side) + balance += pr + trades.append({"side": side, "open_i": entry_i, "close_i": len(md.df) - 1, "profit": pr, "exit_reason": "eod"}) + + eq = pd.Series(equity[: len(md.df)], index=md.df.index[: len(equity)]) + net = balance - p.initial_balance + wins = [t["profit"] for t in trades if t["profit"] > 0] + losses = [t["profit"] for t in trades if t["profit"] <= 0] + gp = sum(wins) if wins else 0.0 + gl = abs(sum(losses)) if losses else 0.0 + pf = gp / gl if gl > 0 else 0.0 + wr = 100.0 * len(wins) / len(trades) if trades else 0.0 + dd = abs(float(((eq - eq.cummax()) / eq.cummax() * 100).min())) if len(eq) else 0.0 + rets = eq.pct_change().dropna() + sharpe = float(rets.mean() / rets.std() * np.sqrt(252 * 24 * 4)) if len(rets) > 1 and rets.std() > 0 else 0.0 + return V5Result(net, len(trades), wr, pf, dd, sharpe, trades) + + +def sample_v5(rng) -> V5Params: + return V5Params( + fast_ema=rng.randint(8, 12), + slow_ema=rng.choice([p for p in range(38, 53, 2)]), + trend_leg_bars=rng.choice([32, 40, 48, 56, 64, 72]), + min_ema_gap_pips=round(rng.uniform(0.5, 2.5), 1), + cross_cooldown=rng.choice([6, 7, 8, 9, 10]), + pullback_cooldown=rng.choice([2, 3, 4, 5]), + use_pullback=rng.choice([True, False]), + pullback_touch=rng.choice([0, 1]), + pullback_adx_min=rng.choice([0.0, 20.0, 22.0, 25.0]), + pullback_min_gap_pips=rng.choice([0.0, 1.5, 2.0, 2.5]), + max_pullbacks_per_leg=rng.choice([1, 1, 2]), + atr_period=rng.choice([14, 20]), + atr_sl_mult=round(rng.uniform(2.0, 3.2), 2), + atr_tp_mult=round(rng.uniform(4.5, 7.5), 2), + max_bars_in_trade=rng.choice([48, 64, 80, 96]), + htf_ema_period=rng.choice([100, 200]), + use_htf_filter=rng.choice([True, True, False]), + use_adx_filter=rng.choice([False, False, True]), + adx_min=round(rng.uniform(16, 24), 1), + session_start=rng.choice([7, 8]), + session_end=rng.choice([21, 22]), + max_spread_pips=rng.choice([6, 8]), + ) + + +def write_v5_set(p: V5Params, path) -> None: + lines = [ + "; SimpleEMA v5 — trend-leg cross + pullback", + "Timeframe=16388", + f"FastEmaPeriod={p.fast_ema}", + f"SlowEmaPeriod={p.slow_ema}", + f"TrendLegBars={p.trend_leg_bars}", + f"MinEmaGapPips={p.min_ema_gap_pips}", + f"CrossCooldown={p.cross_cooldown}", + f"PullbackCooldown={p.pullback_cooldown}", + f"UsePullback={'true' if p.use_pullback else 'false'}", + f"PullbackTouch={p.pullback_touch}", + f"PullbackAdxMin={p.pullback_adx_min}", + f"PullbackMinGapPips={p.pullback_min_gap_pips}", + f"MaxPullbacksPerLeg={p.max_pullbacks_per_leg}", + f"AtrPeriod={p.atr_period}", + f"AtrSlMult={p.atr_sl_mult}", + f"AtrTpMult={p.atr_tp_mult}", + f"MaxBarsInTrade={p.max_bars_in_trade}", + f"HtfEmaPeriod={p.htf_ema_period}", + f"UseHtfFilter={'true' if p.use_htf_filter else 'false'}", + f"UseAdxFilter={'true' if p.use_adx_filter else 'false'}", + f"AdxPeriod={p.adx_period}", + f"AdxMin={p.adx_min}", + f"SessionStartHour={p.session_start}", + f"SessionEndHour={p.session_end}", + f"MaxSpreadPips={p.max_spread_pips}", + f"LotSize={p.lot_size}", + ] + path.write_text("\n".join(lines) + "\n", encoding="utf-8") diff --git a/lab/EAs/SimpleEMA/sync_frontline_cluster.py b/lab/EAs/SimpleEMA/sync_frontline_cluster.py new file mode 100644 index 0000000..8058896 --- /dev/null +++ b/lab/EAs/SimpleEMA/sync_frontline_cluster.py @@ -0,0 +1,260 @@ +#!/usr/bin/env python3 +"""Build frontline/cluster-SimpleEMA from portfolio_params.json + mt5_sets.""" + +from __future__ import annotations + +import json +import shutil +from datetime import datetime +from pathlib import Path + +LAB = Path(__file__).resolve().parent +ROOT = LAB.parents[2] +CLUSTER = ROOT / "frontline" / "cluster-SimpleEMA" +PARAMS = LAB / "portfolio_params.json" +SETS_SRC = LAB / "mt5_sets" +MAGIC_BASE = 930101 + + +def fmt_bool(v: bool) -> str: + return "true" if v else "false" + + +def describe_params(p: dict) -> str: + pb = "pb" if p.get("use_pullback") else "cross" + htf = p.get("htf_ema_period", 200) if p.get("use_htf_filter") else "off" + return f"fast={p['fast_ema']} slow={p['slow_ema']} {pb} htf={htf}" + + +def gen_params_mqh(members: list[dict]) -> str: + lines = [ + "// SimpleEMAParams.mqh — auto-generated; do not edit by hand", + f"// Generated: {datetime.now().isoformat(timespec='seconds')}", + "#ifndef SIMPLE_EMA_PARAMS_MQH", + "#define SIMPLE_EMA_PARAMS_MQH", + "", + f"#define SE_SLOT_COUNT {len(members)}", + "", + "struct SESlotParams", + "{", + " int fastEma;", + " int slowEma;", + " int trendLegBars;", + " double minEmaGapPips;", + " int crossCooldown;", + " int pullbackCooldown;", + " bool usePullback;", + " int pullbackTouch;", + " double pullbackAdxMin;", + " double pullbackMinGapPips;", + " int maxPullbacksPerLeg;", + " double lotSize;", + " int atrPeriod;", + " double atrSlMult;", + " double atrTpMult;", + " int maxBarsInTrade;", + " int htfEmaPeriod;", + " bool useHtfFilter;", + " bool useAdxFilter;", + " int adxPeriod;", + " double adxMin;", + " int sessionStart;", + " int sessionEnd;", + " int maxSpreadPips;", + "};", + "", + "struct SESlotConfig", + "{", + " string symbol;", + " int magic;", + " bool enabled;", + " SESlotParams p;", + "};", + "", + "const SESlotConfig SE_SLOTS[SE_SLOT_COUNT] =", + "{", + ] + for i, m in enumerate(members): + p = m["params"] + sym = m["symbol"] + magic = MAGIC_BASE + i + comma = "," if i < len(members) - 1 else "" + lines.append(f" // {sym} PF={m.get('mt5_metrics', {}).get('profit_factor', '-')} T={m.get('mt5_metrics', {}).get('total_trades', '-')}") + lines.append(" {") + lines.append(f' "{sym}", {magic}, true,') + lines.append(" {") + lines.append( + f" {p['fast_ema']}, {p['slow_ema']}, {p['trend_leg_bars']}, " + f"{p['min_ema_gap_pips']}, {p['cross_cooldown']}, {p['pullback_cooldown']}, " + f"{fmt_bool(p['use_pullback'])}, {p['pullback_touch']}, " + f"{p['pullback_adx_min']}, {p['pullback_min_gap_pips']}, {p['max_pullbacks_per_leg']}, " + f"{p['lot_size']}, {p['atr_period']}, {p['atr_sl_mult']}, {p['atr_tp_mult']}, " + f"{p['max_bars_in_trade']}, {p['htf_ema_period']}, " + f"{fmt_bool(p['use_htf_filter'])}, {fmt_bool(p['use_adx_filter'])}, " + f"{p['adx_period']}, {p['adx_min']}, {p['session_start']}, {p['session_end']}, " + f"{int(p['max_spread_pips'])}" + ) + lines.append(f" }}") + lines.append(f" }}{comma}") + lines.extend(["};", "", "#endif", ""]) + return "\n".join(lines) + + +def gen_magic_mqh(n: int) -> str: + lines = [ + "// SimpleEMAMagic.mqh — fixed slot magics (cluster-SimpleEMA)", + f"#define SE_MAGIC_BASE {MAGIC_BASE}", + "", + "const int SE_SLOT_MAGICS[SE_SLOT_COUNT] =", + "{", + ] + for i in range(n): + comma = "," if i < n - 1 else "" + lines.append(f" {MAGIC_BASE + i}{comma} // slot {i + 1}") + lines.extend(["};", ""]) + return "\n".join(lines) + + +def gen_manifest(members: list[dict], cfg: dict) -> dict: + slots = [] + for i, m in enumerate(members): + mt = m.get("mt5_metrics", {}) + slots.append( + { + "slot": i + 1, + "symbol": m["symbol"], + "magic": MAGIC_BASE + i, + "enabled": True, + "describe": describe_params(m["params"]), + "pf": mt.get("profit_factor"), + "trades": mt.get("total_trades"), + "net_profit": mt.get("net_profit"), + "set_file": f"sets/SimpleEMA_{m['symbol']}.set", + } + ) + return { + "ea": "cluster-SimpleEMA", + "timeframe": cfg.get("timeframe", "M15"), + "magic_range": [MAGIC_BASE, MAGIC_BASE + len(members) - 1], + "lot_per_symbol": cfg.get("lot_per_symbol", 0.05), + "period": cfg.get("period", ["2020-01-01", "2026-01-01"]), + "generated_at": datetime.now().isoformat(timespec="seconds"), + "source": "lab/EAs/SimpleEMA/portfolio_params.json", + "portfolio_metrics": { + "enabled_count": len(members), + "total_trades": sum(mt.get("total_trades", 0) for mt in (m.get("mt5_metrics", {}) for m in members)), + "net_profit": round(sum(mt.get("net_profit", 0) for mt in (m.get("mt5_metrics", {}) for m in members)), 2), + }, + "slots": slots, + } + + +def gen_readme(members: list[dict], manifest: dict) -> str: + pf = manifest["portfolio_metrics"] + syms = ", ".join(m["symbol"] for m in members[:8]) + ", …" + return f"""# cluster-SimpleEMA + +SimpleEMA v5 **35-symbol portfolio** — per-symbol MT5-optimized params (M15 trend-leg cross + pullback). + +> Source of truth: MT5 Strategy Tester per-symbol runs. See `lab/EAs/SimpleEMA/best_run/mt5_results.json`. + +## Performance (MT5 backtest 2020–2026) + +| Metric | Value | +|--------|-------| +| Symbols | {pf['enabled_count']} | +| Total trades | {pf['total_trades']} | +| Net profit (sum) | ${pf['net_profit']:,.2f} | + +## Deploy + +1. Copy this folder to `MQL5/Experts/cluster-SimpleEMA/` +2. Compile `main.mq5` in MetaEditor +3. Attach to **any** chart (e.g. EURUSD M15) — EA trades all symbols in `manifest.json` +4. Ensure all symbols are visible in Market Watch + +## Magic numbers + +**{MAGIC_BASE}–{MAGIC_BASE + len(members) - 1}** — one magic per symbol slot. No overlap with `cluster-NZDUSD` (928101+) or `cluster-latest`. + +Slot mapping: `manifest.json` / `SimpleEMAMagic.mqh`. + +## Symbols ({len(members)}) + +{syms} + +Full list in `manifest.json`. + +## Per-symbol .set files + +`sets/SimpleEMA_{{SYMBOL}}.set` — load in Strategy Tester to re-verify a single symbol with `lab/EAs/SimpleEMA/main.mq5`. + +## Regenerate from lab + +```powershell +cd lab/EAs/SimpleEMA +python sync_frontline_cluster.py +``` + +## Run alongside cluster-latest + +Different magic range. Use separate chart or same account — magics do not collide. +""" + + +def gen_portfolio_set(members: list[dict]) -> str: + sym_list = ",".join(m["symbol"] for m in members) + return f"""; cluster-SimpleEMA — attach reference (params baked in EA) +Timeframe=16388 +OneTradePerSymbol=true +; Symbols (informational — locked in SimpleEMAParams.mqh): +; {sym_list} +""" + + +def main() -> None: + data = json.loads(PARAMS.read_text(encoding="utf-8")) + members = [m for m in data["members"] if m.get("enabled") and "params" in m] + if not members: + raise SystemExit("No enabled members in portfolio_params.json") + + members.sort(key=lambda m: m["symbol"]) + CLUSTER.mkdir(parents=True, exist_ok=True) + sets_dir = CLUSTER / "sets" + sets_dir.mkdir(exist_ok=True) + + (CLUSTER / "SimpleEMAParams.mqh").write_text(gen_params_mqh(members), encoding="utf-8") + (CLUSTER / "SimpleEMAMagic.mqh").write_text(gen_magic_mqh(len(members)), encoding="utf-8") + + manifest = gen_manifest(members, data.get("config", {})) + (CLUSTER / "manifest.json").write_text(json.dumps(manifest, indent=2), encoding="utf-8") + (CLUSTER / "README.md").write_text(gen_readme(members, manifest), encoding="utf-8") + (CLUSTER / "SimpleEMA_portfolio.set").write_text(gen_portfolio_set(members), encoding="utf-8") + + copied = 0 + for m in members: + sym = m["symbol"] + src = SETS_SRC / f"SimpleEMA_{sym}.set" + dst = sets_dir / f"SimpleEMA_{sym}.set" + if src.exists(): + shutil.copy2(src, dst) + copied += 1 + + helpers_src = ROOT / "frontline" / "cluster-latest" / "MagicNumberHelpers.mqh" + if helpers_src.exists(): + shutil.copy2(helpers_src, CLUSTER / "MagicNumberHelpers.mqh") + + report_src = LAB / "best_run" / "MT5_portfolio_summary.png" + reports_dir = CLUSTER / "reports" + reports_dir.mkdir(exist_ok=True) + if report_src.exists(): + shutil.copy2(report_src, reports_dir / "MT5_portfolio_summary.png") + + print(f"Built {CLUSTER}") + print(f" slots: {len(members)}") + print(f" sets copied: {copied}/{len(members)}") + print(f" magic: {MAGIC_BASE}..{MAGIC_BASE + len(members) - 1}") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleEMA/sync_portfolio_from_mt5.py b/lab/EAs/SimpleEMA/sync_portfolio_from_mt5.py new file mode 100644 index 0000000..9bdd744 --- /dev/null +++ b/lab/EAs/SimpleEMA/sync_portfolio_from_mt5.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +"""Enable/disable portfolio members from MT5 backtest results (source of truth).""" + +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +LAB = Path(__file__).resolve().parent +PARAMS = LAB / "portfolio_params.json" +MT5 = LAB / "best_run" / "mt5_results.json" + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--min-pf", type=float, default=1.0) + ap.add_argument("--min-trades", type=int, default=8) + ap.add_argument("--min-net", type=float, default=0.01) + args = ap.parse_args() + + if not PARAMS.exists() or not MT5.exists(): + raise SystemExit("Need portfolio_params.json and best_run/mt5_results.json") + + params = json.loads(PARAMS.read_text(encoding="utf-8")) + mt5 = json.loads(MT5.read_text(encoding="utf-8")) + by_sym = {r["symbol"]: r for r in mt5.get("per_symbol", []) if r.get("ready")} + + enabled = 0 + for m in params.get("members", []): + sym = m.get("symbol", "") + r = by_sym.get(sym) + if not r: + m["enabled"] = False + m["mt5_status"] = "no_mt5_run" + continue + ok = ( + (r.get("net_profit") or 0) >= args.min_net + and (r.get("profit_factor") or 0) >= args.min_pf + and (r.get("total_trades") or 0) >= args.min_trades + ) + m["enabled"] = ok + m["mt5_status"] = "ok" if ok else "rejected" + m["mt5_metrics"] = { + "net_profit": r.get("net_profit"), + "total_trades": r.get("total_trades"), + "profit_factor": r.get("profit_factor"), + } + if ok: + enabled += 1 + + params["selection_source"] = "mt5_strategy_tester" + params["mt5_enabled_count"] = enabled + PARAMS.write_text(json.dumps(params, indent=2), encoding="utf-8") + + pf = mt5.get("portfolio", {}) + print(f"Synced {enabled} enabled symbols from MT5") + print(f"MT5 portfolio trades (all tested): {pf.get('total_trades', 0)}") + en_trades = sum(m["mt5_metrics"]["total_trades"] for m in params["members"] if m.get("enabled")) + en_net = sum(m["mt5_metrics"]["net_profit"] for m in params["members"] if m.get("enabled")) + print(f"MT5 enabled-only: {en_trades} trades net=${en_net:,.2f}") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/SimpleFibonacci/main.mq5 b/lab/EAs/SimpleFibonacci/main.mq5 deleted file mode 100644 index 509c229..0000000 --- a/lab/EAs/SimpleFibonacci/main.mq5 +++ /dev/null @@ -1,378 +0,0 @@ -#property strict -#property version "1.00" - -#include - -input group "=== Common ===" -input string InpSymbol = "BTCUSD"; -input ENUM_TIMEFRAMES InpTimeframe = PERIOD_M15; -input int InpSlippagePoints = 30; -input int InpPivotLookbackBars = 120; -input int InpMinSwingPoints = 500; - -input group "=== Robot 1: Fibonacci Retracement ===" -input bool FR_Enabled = true; -input int FR_Magic = 920101; -input double FR_Lots = 0.01; -input bool FR_BuyAt618 = true; -input bool FR_BuyAt500 = false; -input bool FR_UseHardSLTP = true; -input double FR_SL_BufferPoints = 400; -input double FR_TP_BufferPoints = 400; -input int FR_MaxHoldingBars = 96; // time-stop safety -input bool FR_CloseOnStructureBreak = true; // close if recent swing low breaks - -input group "=== Robot 2: Fibonacci Trend Extension ===" -input bool FE_Enabled = true; -input int FE_Magic = 920202; -input double FE_Lots = 0.01; -input bool FE_UseHardSLTP = true; -input double FE_SL_BufferPoints = 400; -input double FE_ExtensionLevel = 1.272; // Common values: 1.272 / 1.618 -input int FE_MinBarsBetweenTrades = 6; -input double FE_MinStopPoints = 3000; -input int FE_AtrPeriod = 14; -input double FE_MinStopAtrMult = 1.2; -input double FE_MinRR = 1.5; - -CTrade trade; -datetime g_lastBarTime = 0; -datetime g_lastFEEntryTime = 0; -datetime g_lastFREntryTime = 0; - -bool IsNewBar(const string symbol, ENUM_TIMEFRAMES tf) -{ - datetime t = iTime(symbol, tf, 0); - if(t <= 0 || t == g_lastBarTime) - return false; - g_lastBarTime = t; - return true; -} - -bool GetLowestLow(const string symbol, ENUM_TIMEFRAMES tf, const int bars, int &idx, double &price) -{ - idx = iLowest(symbol, tf, MODE_LOW, bars, 1); - if(idx < 0) - return false; - price = iLow(symbol, tf, idx); - return (price > 0.0); -} - -bool GetHighestHigh(const string symbol, ENUM_TIMEFRAMES tf, const int bars, int &idx, double &price) -{ - idx = iHighest(symbol, tf, MODE_HIGH, bars, 1); - if(idx < 0) - return false; - price = iHigh(symbol, tf, idx); - return (price > 0.0); -} - -double GetAtrPrice(const string symbol, ENUM_TIMEFRAMES tf, const int period) -{ - int hAtr = iATR(symbol, tf, period); - if(hAtr == INVALID_HANDLE) - return 0.0; - double b[1]; - if(CopyBuffer(hAtr, 0, 1, 1, b) <= 0) - { - IndicatorRelease(hAtr); - return 0.0; - } - IndicatorRelease(hAtr); - return b[0]; -} - -bool PositionExistsByMagic(const string symbol, const int magic) -{ - for(int i = PositionsTotal() - 1; i >= 0; --i) - { - ulong t = PositionGetTicket(i); - if(t == 0) - continue; - if(PositionGetString(POSITION_SYMBOL) == symbol && - (int)PositionGetInteger(POSITION_MAGIC) == magic) - return true; - } - return false; -} - -bool GetPositionByMagic(const string symbol, const int magic, ulong &ticket, ENUM_POSITION_TYPE &posType, datetime &openTime) -{ - for(int i = PositionsTotal() - 1; i >= 0; --i) - { - ulong t = PositionGetTicket(i); - if(t == 0) - continue; - if(PositionGetString(POSITION_SYMBOL) == symbol && - (int)PositionGetInteger(POSITION_MAGIC) == magic) - { - ticket = t; - posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); - openTime = (datetime)PositionGetInteger(POSITION_TIME); - return true; - } - } - return false; -} - -double NormalizePrice(const string symbol, const double price) -{ - int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS); - return NormalizeDouble(price, digits); -} - -bool ValidateAndAdjustStops(const bool isBuy, double &sl, double &tp) -{ - if(sl == 0.0 && tp == 0.0) - return true; - - MqlTick tick; - if(!SymbolInfoTick(InpSymbol, tick)) - return false; - - int stopsLevelPts = (int)SymbolInfoInteger(InpSymbol, SYMBOL_TRADE_STOPS_LEVEL); - int freezeLevelPts = (int)SymbolInfoInteger(InpSymbol, SYMBOL_TRADE_FREEZE_LEVEL); - double minDist = (double)MathMax(stopsLevelPts, freezeLevelPts) * _Point + 2.0 * _Point; - - if(isBuy) - { - if(sl > 0.0 && sl >= tick.bid - minDist) - sl = tick.bid - minDist; - if(tp > 0.0 && tp <= tick.ask + minDist) - tp = tick.ask + minDist; - if(sl > 0.0 && sl >= tick.bid) - return false; - if(tp > 0.0 && tp <= tick.ask) - return false; - } - else - { - if(sl > 0.0 && sl <= tick.ask + minDist) - sl = tick.ask + minDist; - if(tp > 0.0 && tp >= tick.bid - minDist) - tp = tick.bid - minDist; - if(sl > 0.0 && sl <= tick.ask) - return false; - if(tp > 0.0 && tp >= tick.bid) - return false; - } - - if(sl > 0.0) - sl = NormalizePrice(InpSymbol, sl); - if(tp > 0.0) - tp = NormalizePrice(InpSymbol, tp); - return true; -} - -bool OpenBuy(const int magic, const double lots, const string comment, const double sl, const double tp) -{ - MqlTick tick; - if(!SymbolInfoTick(InpSymbol, tick)) - return false; - double useSL = sl, useTP = tp; - if(!ValidateAndAdjustStops(true, useSL, useTP)) - return false; - trade.SetExpertMagicNumber(magic); - bool ok = trade.Buy(lots, InpSymbol, tick.ask, useSL, useTP, comment); - if(ok && magic == FR_Magic) - g_lastFREntryTime = iTime(InpSymbol, InpTimeframe, 0); - if(ok && magic == FE_Magic) - g_lastFEEntryTime = iTime(InpSymbol, InpTimeframe, 0); - return ok; -} - -bool OpenSell(const int magic, const double lots, const string comment, const double sl, const double tp) -{ - MqlTick tick; - if(!SymbolInfoTick(InpSymbol, tick)) - return false; - double useSL = sl, useTP = tp; - if(!ValidateAndAdjustStops(false, useSL, useTP)) - return false; - trade.SetExpertMagicNumber(magic); - bool ok = trade.Sell(lots, InpSymbol, tick.bid, useSL, useTP, comment); - if(ok && magic == FE_Magic) - g_lastFEEntryTime = iTime(InpSymbol, InpTimeframe, 0); - return ok; -} - -void RunFibonacciRetracement() -{ - if(!FR_Enabled) - return; - if(PositionExistsByMagic(InpSymbol, FR_Magic)) - return; - - int idxLow = -1, idxHigh = -1; - double swingLow = 0.0, swingHigh = 0.0; - if(!GetLowestLow(InpSymbol, InpTimeframe, InpPivotLookbackBars, idxLow, swingLow)) - return; - if(!GetHighestHigh(InpSymbol, InpTimeframe, InpPivotLookbackBars, idxHigh, swingHigh)) - return; - - double rangePts = (swingHigh - swingLow) / _Point; - if(rangePts < InpMinSwingPoints) - return; - - // Uptrend retracement model: low appears before high. - bool upSwing = (idxLow > idxHigh); - if(!upSwing) - return; - - double fib50 = swingHigh - (swingHigh - swingLow) * 0.500; - double fib61 = swingHigh - (swingHigh - swingLow) * 0.618; - - MqlTick tick; - if(!SymbolInfoTick(InpSymbol, tick)) - return; - - double sl = 0.0, tp = 0.0; - if(FR_UseHardSLTP) - { - // Positional levels: SL below swing low, TP near prior swing high breakout. - sl = swingLow - FR_SL_BufferPoints * _Point; - tp = swingHigh + FR_TP_BufferPoints * _Point; - } - - if(FR_BuyAt618 && tick.ask <= fib61) - OpenBuy(FR_Magic, FR_Lots, "FiboRetrace-61.8 Buy", sl, tp); - else if(FR_BuyAt500 && tick.ask <= fib50) - OpenBuy(FR_Magic, FR_Lots, "FiboRetrace-50.0 Buy", sl, tp); -} - -void ManageFibonacciRetracementExit() -{ - if(!FR_Enabled) - return; - - ulong ticket = 0; - ENUM_POSITION_TYPE posType = WRONG_VALUE; - datetime openTime = 0; - if(!GetPositionByMagic(InpSymbol, FR_Magic, ticket, posType, openTime)) - return; - - int tfSec = PeriodSeconds(InpTimeframe); - if(tfSec <= 0) - tfSec = 60; - int barsHeld = (int)((iTime(InpSymbol, InpTimeframe, 0) - openTime) / tfSec); - - // 1) Time stop: force close stale retracement trades. - if(FR_MaxHoldingBars > 0 && barsHeld >= FR_MaxHoldingBars) - { - trade.PositionClose(ticket); - return; - } - - // 2) Structure invalidation: if latest swing violates the trade idea, exit. - if(FR_CloseOnStructureBreak) - { - int idxLow = -1, idxHigh = -1; - double swingLow = 0.0, swingHigh = 0.0; - if(GetLowestLow(InpSymbol, InpTimeframe, InpPivotLookbackBars, idxLow, swingLow) && - GetHighestHigh(InpSymbol, InpTimeframe, InpPivotLookbackBars, idxHigh, swingHigh)) - { - MqlTick tick; - if(SymbolInfoTick(InpSymbol, tick)) - { - double invalidateBuffer = FR_SL_BufferPoints * _Point; - if(posType == POSITION_TYPE_BUY && tick.bid < (swingLow - invalidateBuffer)) - trade.PositionClose(ticket); - else if(posType == POSITION_TYPE_SELL && tick.ask > (swingHigh + invalidateBuffer)) - trade.PositionClose(ticket); - } - } - } -} - -void RunFibonacciExtension() -{ - if(!FE_Enabled) - return; - if(PositionExistsByMagic(InpSymbol, FE_Magic)) - return; - if(g_lastFEEntryTime > 0) - { - int tfSec = PeriodSeconds(InpTimeframe); - if(tfSec > 0) - { - int barsSince = (int)((iTime(InpSymbol, InpTimeframe, 0) - g_lastFEEntryTime) / tfSec); - if(barsSince < FE_MinBarsBetweenTrades) - return; - } - } - - int idxLow = -1, idxHigh = -1; - double swingLow = 0.0, swingHigh = 0.0; - if(!GetLowestLow(InpSymbol, InpTimeframe, InpPivotLookbackBars, idxLow, swingLow)) - return; - if(!GetHighestHigh(InpSymbol, InpTimeframe, InpPivotLookbackBars, idxHigh, swingHigh)) - return; - - double rangePts = (swingHigh - swingLow) / _Point; - if(rangePts < InpMinSwingPoints) - return; - - MqlTick tick; - if(!SymbolInfoTick(InpSymbol, tick)) - return; - - // Continuation breakout model: - // - If up swing (low before high), buy above swing high and target extension. - // - If down swing (high before low), sell below swing low and target extension. - bool upSwing = (idxLow > idxHigh); - - if(upSwing && tick.ask > swingHigh) - { - double sl = 0.0, tp = 0.0; - if(FE_UseHardSLTP) - { - sl = swingHigh - FE_SL_BufferPoints * _Point; - double extTP = swingLow + (swingHigh - swingLow) * FE_ExtensionLevel; - double atr = GetAtrPrice(InpSymbol, InpTimeframe, FE_AtrPeriod); - double minRisk = MathMax(FE_MinStopPoints * _Point, atr * FE_MinStopAtrMult); - double risk = tick.ask - sl; - if(risk < minRisk) - return; // Skip fragile entries with overly tight stop. - double rrTP = tick.ask + risk * FE_MinRR; - tp = MathMax(extTP, rrTP); - } - OpenBuy(FE_Magic, FE_Lots, "FiboExtension Buy", sl, tp); - } - else if(!upSwing && tick.bid < swingLow) - { - double sl = 0.0, tp = 0.0; - if(FE_UseHardSLTP) - { - sl = swingLow + FE_SL_BufferPoints * _Point; - double extTP = swingHigh - (swingHigh - swingLow) * FE_ExtensionLevel; - double atr = GetAtrPrice(InpSymbol, InpTimeframe, FE_AtrPeriod); - double minRisk = MathMax(FE_MinStopPoints * _Point, atr * FE_MinStopAtrMult); - double risk = sl - tick.bid; - if(risk < minRisk) - return; // Skip fragile entries with overly tight stop. - double rrTP = tick.bid - risk * FE_MinRR; - tp = MathMin(extTP, rrTP); - } - OpenSell(FE_Magic, FE_Lots, "FiboExtension Sell", sl, tp); - } -} - -int OnInit() -{ - if(!SymbolSelect(InpSymbol, true)) - return(INIT_FAILED); - trade.SetDeviationInPoints(InpSlippagePoints); - return(INIT_SUCCEEDED); -} - -void OnTick() -{ - if(_Symbol != InpSymbol) - return; - if(!IsNewBar(InpSymbol, InpTimeframe)) - return; - - ManageFibonacciRetracementExit(); - RunFibonacciRetracement(); - RunFibonacciExtension(); -} diff --git a/lab/EAs/SimpleTrendlineTSLA/SimpleTrendline_optimization.set b/lab/EAs/SimpleTrendlineTSLA/SimpleTrendline_optimization.set deleted file mode 100644 index 29aaeca..0000000 --- a/lab/EAs/SimpleTrendlineTSLA/SimpleTrendline_optimization.set +++ /dev/null @@ -1,14 +0,0 @@ -; SimpleTrendline.mq5 optimization preset (TSLA-focused) -; Strategy Tester -> Inputs -> Load -; Focus: trendline pullback + break exits on TSLA volatility (no broker SL/TP) -; -InpHigherTF=16385||16385||1||16387||Y -InpMAPeriod=55||30||5||160||Y -InpMAMethod=1||0||1||3||Y -InpAppliedPrice=0||0||1||6||Y -InpHTFBarsToScan=500||250||50||1500||Y -InpLineTouchTolerance=65.0||20.0||5.0||180.0||Y -InpBreakBuffer=22.0||8.0||2.0||70.0||Y -InpLots=0.10||0.10||0.01||0.10||N -InpMagic=26042501||26042501||1||26042501||N -InpDrawTrendline=false||false||0||true||N diff --git a/lab/EAs/TFXNZDUSD.mq5 b/lab/EAs/TFXNZDUSD.mq5 deleted file mode 100644 index fb85078..0000000 --- a/lab/EAs/TFXNZDUSD.mq5 +++ /dev/null @@ -1,383 +0,0 @@ -//+------------------------------------------------------------------+ -//| TFXNZDUSD.mq5 | -//| NZDUSD: HTF directional bias + intraday bearish→bullish shift | -//| Mirrors a reactive workflow: higher TFs for bias (D1/W1), | -//| lower TFs (H4–M15) for confirmation — long bias / pullback / | -//| reclaim entry. Not predictive; signals on closed bars. | -//+------------------------------------------------------------------+ -#property copyright "Lab" -#property link "" -#property version "1.01" -#property description "NZDUSD long-bias EA: D1/W1 trend filter, intraday EMA cross after pullback streak, ATR risk." - -#include - -input group "=== Symbol ===" -input string InpSymbol = "NZDUSD"; // Spot FX symbol (broker-specific) - -input group "=== Timeframes (thesis) ===" -input ENUM_TIMEFRAMES InpBiasTF = PERIOD_D1; // Directional bias (monthly/weekly/daily idea → D1 default) -input ENUM_TIMEFRAMES InpHigherBiasTF = PERIOD_W1; // Optional second bias filter -input ENUM_TIMEFRAMES InpSignalTF = PERIOD_H4; // Intraday environment shift (H4 or lower) - -input group "=== HTF bias (long-only, reactive) ===" -input bool InpUseWeeklyBias = true; // Require W1 close > W1 EMA -input int InpBiasEmaPeriod = 50; // EMA period on bias TFs -input bool InpAllowCounterBias = false; // If false, skip longs when D1 close < D1 EMA - -input group "=== Intraday shift (bearish → bullish) ===" -input int InpFastEma = 8; -input int InpSlowEma = 21; -input int InpMinBearishBars = 3; // Min consecutive bars with fast EMA < slow before cross-up -input bool InpRequireBullBody = true; // Bullish closed candle on cross bar - -input group "=== Risk ===" -input double InpLots = 0.10; -input int InpMagic = 926001; -input int InpSlippagePoints = 20; -input int InpMaxSpreadPoints = 40; -input bool InpUseAtrStops = true; -input int InpAtrPeriod = 14; -input double InpSlAtrMult = 1.5; -input double InpTpAtrMult = 2.5; -input double InpMinStopPoints = 50; -input int InpMaxPositions = 1; - -input group "=== Session (optional) ===" -input bool InpUseSessionFilter = false; -input int InpSessionStartHour = 7; // Server hour start -input int InpSessionEndHour = 20; // Server hour end (exclusive if cross midnight handled below) - -CTrade g_trade; - -int g_atrSig = INVALID_HANDLE; -int g_emaBiasD1 = INVALID_HANDLE; -int g_emaBiasW1 = INVALID_HANDLE; -int g_emaFastSig = INVALID_HANDLE; -int g_emaSlowSig = INVALID_HANDLE; - -/// Effective TFs after sanity check (genetic optimizers often pass invalid ENUM integers). -ENUM_TIMEFRAMES g_effBiasTF = PERIOD_D1; -ENUM_TIMEFRAMES g_effHigherBiasTF = PERIOD_W1; -ENUM_TIMEFRAMES g_effSignalTF = PERIOD_H4; - -datetime g_lastSignalBar = 0; - -// Maps garbage timeframe integers from optimization to nearest supported standard period. -ENUM_TIMEFRAMES NearestStandardTf(const ENUM_TIMEFRAMES raw) -{ - if(PeriodSeconds(raw) > 0) - return raw; - - const ENUM_TIMEFRAMES cand[] = - { - PERIOD_M15, PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1 - }; - const long r = (long)raw; - ENUM_TIMEFRAMES best = PERIOD_H4; - long bestDist = -1; - for(int i = 0; i < ArraySize(cand); i++) - { - if(PeriodSeconds(cand[i]) <= 0) - continue; - const long diff = r - (long)cand[i]; - const long d = (diff >= 0 ? diff : -diff); - if(bestDist < 0 || d < bestDist) - { - bestDist = d; - best = cand[i]; - } - } - return best; -} - -string WorkSymbol() -{ - string s = InpSymbol; - StringTrimLeft(s); - StringTrimRight(s); - // .set files sometimes concatenate optimization payload into string inputs (e.g. "NZDUSD||0||...") - const int bar = StringFind(s, "|"); - if(bar >= 0) - s = StringSubstr(s, 0, bar); - StringTrimRight(s); - return (StringLen(s) > 0 ? s : _Symbol); -} - -bool SessionOk() -{ - if(!InpUseSessionFilter) - return true; - MqlDateTime dt; - TimeToStruct(TimeCurrent(), dt); - int h = dt.hour; - if(InpSessionStartHour <= InpSessionEndHour) - return (h >= InpSessionStartHour && h < InpSessionEndHour); - return (h >= InpSessionStartHour || h < InpSessionEndHour); -} - -double Buf1(const int handle, const int shift) -{ - double b[]; - ArraySetAsSeries(b, true); - if(CopyBuffer(handle, 0, shift, 1, b) != 1) - return 0.0; - return b[0]; -} - -bool CopyClose(const string sym, const ENUM_TIMEFRAMES tf, const int shift, double &out) -{ - double c[]; - ArraySetAsSeries(c, true); - if(CopyClose(sym, tf, shift, 1, c) != 1) - return false; - out = c[0]; - return true; -} - -bool HtfLongBias(const string sym) -{ - double cD1 = 0.0, eD1 = 0.0; - if(!CopyClose(sym, g_effBiasTF, 1, cD1)) - return false; - eD1 = Buf1(g_emaBiasD1, 1); - if(eD1 <= 0.0) - return false; - if(!InpAllowCounterBias && cD1 <= eD1) - return false; - - if(InpUseWeeklyBias) - { - double cW1 = 0.0, eW1 = 0.0; - if(!CopyClose(sym, g_effHigherBiasTF, 1, cW1)) - return false; - eW1 = Buf1(g_emaBiasW1, 1); - if(eW1 <= 0.0) - return false; - if(cW1 <= eW1) - return false; - } - return true; -} - -int CountConsecutiveBearishEma(const string sym, const int fromShift, const int maxLookback) -{ - double f[], s[]; - ArraySetAsSeries(f, true); - ArraySetAsSeries(s, true); - int need = maxLookback + fromShift; - if(CopyBuffer(g_emaFastSig, 0, 0, need, f) < need) - return 0; - if(CopyBuffer(g_emaSlowSig, 0, 0, need, s) < need) - return 0; - - int n = 0; - for(int i = fromShift; i < fromShift + maxLookback; i++) - { - if(f[i] <= s[i]) - n++; - else - break; - } - return n; -} - -bool BullishCrossOnLastClosedBar(const string sym) -{ - double f1 = Buf1(g_emaFastSig, 1); - double s1 = Buf1(g_emaSlowSig, 1); - double f2 = Buf1(g_emaFastSig, 2); - double s2 = Buf1(g_emaSlowSig, 2); - if(f1 <= 0.0 || s1 <= 0.0 || f2 <= 0.0 || s2 <= 0.0) - return false; - - bool crossedUp = (f1 > s1 && f2 <= s2); - if(!crossedUp) - return false; - - int bearStreak = CountConsecutiveBearishEma(sym, 2, 32); - if(bearStreak < InpMinBearishBars) - return false; - - if(InpRequireBullBody) - { - MqlRates r[]; - ArraySetAsSeries(r, true); - if(CopyRates(sym, g_effSignalTF, 1, 1, r) != 1) - return false; - if(r[0].close <= r[0].open) - return false; - } - return true; -} - -double NormalizeVolumeLots(const string sym, double lots) -{ - double minLot = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN); - double maxLot = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX); - double step = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP); - if(step > 0.0) - lots = MathFloor(lots / step) * step; - if(lots < minLot) - lots = minLot; - if(lots > maxLot) - lots = maxLot; - return lots; -} - -int CountOurPositions(const string sym) -{ - int total = 0; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong ticket = PositionGetTicket(i); - if(ticket == 0 || !PositionSelectByTicket(ticket)) - continue; - if(PositionGetString(POSITION_SYMBOL) != sym) - continue; - if((int)PositionGetInteger(POSITION_MAGIC) != InpMagic) - continue; - total++; - } - return total; -} - -bool SpreadOk(const string sym) -{ - long spreadPts = SymbolInfoInteger(sym, SYMBOL_SPREAD); - return ((double)spreadPts <= (double)InpMaxSpreadPoints); -} - -void ComputeStopsBuy(const string sym, const double entry, double &sl, double &tp) -{ - double ptsSl = InpMinStopPoints; - double ptsTp = InpMinStopPoints * 2.0; - if(InpUseAtrStops && g_atrSig != INVALID_HANDLE) - { - double atr = Buf1(g_atrSig, 1); - if(atr > 0.0) - { - double atrPts = atr / SymbolInfoDouble(sym, SYMBOL_POINT); - ptsSl = MathMax(atrPts * InpSlAtrMult, InpMinStopPoints); - ptsTp = MathMax(atrPts * InpTpAtrMult, InpMinStopPoints); - } - } - double p = SymbolInfoDouble(sym, SYMBOL_POINT); - sl = entry - ptsSl * p; - tp = entry + ptsTp * p; - - long stopsLevel = SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL); - double minDist = (double)stopsLevel * p; - if(minDist > 0.0) - { - if(entry - sl < minDist) - sl = entry - minDist; - if(tp - entry < minDist) - tp = entry + minDist; - } - int dg = (int)SymbolInfoInteger(sym, SYMBOL_DIGITS); - sl = NormalizeDouble(sl, dg); - tp = NormalizeDouble(tp, dg); -} - -int OnInit() -{ - string sym = WorkSymbol(); - if(!SymbolSelect(sym, true)) - { - Print("TFXNZDUSD: symbol not available: ", sym); - return INIT_FAILED; - } - - g_effBiasTF = NearestStandardTf(InpBiasTF); - g_effHigherBiasTF = NearestStandardTf(InpHigherBiasTF); - g_effSignalTF = NearestStandardTf(InpSignalTF); - if(g_effBiasTF != InpBiasTF || g_effHigherBiasTF != InpHigherBiasTF || g_effSignalTF != InpSignalTF) - Print("TFXNZDUSD: resolved TFs — bias ", EnumToString(g_effBiasTF), " (in ", (long)InpBiasTF, ")", - " W1 ", EnumToString(g_effHigherBiasTF), " (in ", (long)InpHigherBiasTF, ")", - " signal ", EnumToString(g_effSignalTF), " (in ", (long)InpSignalTF, ")"); - - if(InpBiasEmaPeriod < 1 || InpFastEma < 1 || InpSlowEma < 1 || InpAtrPeriod < 1) - { - Print("TFXNZDUSD: EMA/ATR period must be >= 1"); - return INIT_PARAMETERS_INCORRECT; - } - - g_trade.SetExpertMagicNumber(InpMagic); - g_trade.SetDeviationInPoints(InpSlippagePoints); - g_trade.SetTypeFillingBySymbol(sym); - - g_emaBiasD1 = iMA(sym, g_effBiasTF, InpBiasEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); - g_emaBiasW1 = iMA(sym, g_effHigherBiasTF, InpBiasEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); - g_emaFastSig = iMA(sym, g_effSignalTF, InpFastEma, 0, MODE_EMA, PRICE_CLOSE); - g_emaSlowSig = iMA(sym, g_effSignalTF, InpSlowEma, 0, MODE_EMA, PRICE_CLOSE); - g_atrSig = iATR(sym, g_effSignalTF, InpAtrPeriod); - - if(g_emaBiasD1 == INVALID_HANDLE || g_emaFastSig == INVALID_HANDLE || g_emaSlowSig == INVALID_HANDLE || - g_atrSig == INVALID_HANDLE) - { - Print("TFXNZDUSD: indicator init failed — check InpBiasTF/InpHigherBiasTF/InpSignalTF & symbol history"); - return INIT_FAILED; - } - if(InpUseWeeklyBias && g_emaBiasW1 == INVALID_HANDLE) - { - Print("TFXNZDUSD: W1 bias handle failed"); - return INIT_FAILED; - } - - Print("TFXNZDUSD: ", sym, " eff TFs: bias=", EnumToString(g_effBiasTF), " higher=", EnumToString(g_effHigherBiasTF), - " signal=", EnumToString(g_effSignalTF)); - return INIT_SUCCEEDED; -} - -void OnDeinit(const int reason) -{ - if(g_emaBiasD1 != INVALID_HANDLE) IndicatorRelease(g_emaBiasD1); - if(g_emaBiasW1 != INVALID_HANDLE) IndicatorRelease(g_emaBiasW1); - if(g_emaFastSig != INVALID_HANDLE) IndicatorRelease(g_emaFastSig); - if(g_emaSlowSig != INVALID_HANDLE) IndicatorRelease(g_emaSlowSig); - if(g_atrSig != INVALID_HANDLE) IndicatorRelease(g_atrSig); -} - -void OnTick() -{ - string sym = WorkSymbol(); - datetime barOpen = iTime(sym, g_effSignalTF, 0); - if(barOpen == 0) - return; - if(barOpen == g_lastSignalBar) - return; - - datetime prevBar = iTime(sym, g_effSignalTF, 1); - if(prevBar == 0) - return; - - g_lastSignalBar = barOpen; - - if(!SessionOk()) - return; - if(!SpreadOk(sym)) - return; - - if(CountOurPositions(sym) >= InpMaxPositions) - return; - - if(!HtfLongBias(sym)) - return; - - if(!BullishCrossOnLastClosedBar(sym)) - return; - - MqlTick tick; - if(!SymbolInfoTick(sym, tick)) - return; - - double lots = NormalizeVolumeLots(sym, InpLots); - double sl = 0.0, tp = 0.0; - ComputeStopsBuy(sym, tick.ask, sl, tp); - - if(!g_trade.Buy(lots, sym, tick.ask, sl, tp, "TFX NZDUSD shift")) - Print("TFXNZDUSD Buy failed ret=", g_trade.ResultRetcode(), " ", g_trade.ResultRetcodeDescription()); -} - -//+------------------------------------------------------------------+ diff --git a/lab/EAs/TFXNZDUSD_Genetic_Optimization.set b/lab/EAs/TFXNZDUSD_Genetic_Optimization.set deleted file mode 100644 index 633c283..0000000 --- a/lab/EAs/TFXNZDUSD_Genetic_Optimization.set +++ /dev/null @@ -1,42 +0,0 @@ -; saved for genetic optimization — TFXNZDUSD.mq5 (Strategy Tester → Inputs → Load) -; Repo format: Parameter=Value||Step||Min||Max||Optimize(Y/N) -; ENUM_TIMEFRAMES: H1=16385, H4=16388, D1=16408, W1=32769 -; Do NOT optimize InpSignalTF as Min–Max integers — MT5 genetic samples invalid values (e.g. 16386) -; between real enums and OnInit fails. Compare H1 vs H4 in separate runs, or rely on EA TF resolution. - -; === Symbol === -; String inputs: use bare name OR Value||Value||Value||Value||N — never use 0 as middle field (MT5 may feed the whole line into the string). -InpSymbol=NZDUSD - -; === Timeframes (thesis) === -InpBiasTF=16408||0||16408||16408||N -InpHigherBiasTF=32769||0||32769||32769||N -InpSignalTF=16388||0||16388||16388||N - -; === HTF bias (long-only, reactive) === -InpUseWeeklyBias=true||false||0||true||N -InpBiasEmaPeriod=50||2||34||120||Y -InpAllowCounterBias=false||false||0||true||N - -; === Intraday shift (bearish → bullish) === -InpFastEma=8||1||5||34||Y -InpSlowEma=21||2||15||55||Y -InpMinBearishBars=3||1||2||10||Y -InpRequireBullBody=true||false||0||true||N - -; === Risk === -InpLots=0.1||0.01||0.1||0.1||N -InpMagic=926001||0||926001||926001||N -InpSlippagePoints=20||0||20||20||N -InpMaxSpreadPoints=40||5||20||60||Y -InpUseAtrStops=true||false||0||true||N -InpAtrPeriod=14||1||7||28||Y -InpSlAtrMult=1.5||0.1||1.0||3.5||Y -InpTpAtrMult=2.5||0.2||1.5||5.0||Y -InpMinStopPoints=50.0||5.0||30.0||120.0||Y -InpMaxPositions=1||0||1||1||N - -; === Session (optional) === -InpUseSessionFilter=false||false||0||true||N -InpSessionStartHour=7||0||7||7||N -InpSessionEndHour=20||0||20||20||N diff --git a/lab/EAs/TFXXAUUSDScalper.mq5 b/lab/EAs/TFXXAUUSDScalper.mq5 deleted file mode 100644 index c029180..0000000 --- a/lab/EAs/TFXXAUUSDScalper.mq5 +++ /dev/null @@ -1,367 +0,0 @@ -//+------------------------------------------------------------------+ -//| TFXXAUUSDScalper.mq5 | -//| Gold (XAUUSD) Donchian breakout scalper — momentum / range | -//| breakout style suited to impulse-or-consolidate dynamics. | -//+------------------------------------------------------------------+ -#property copyright "Lab" -#property link "" -#property version "1.00" -#property description "Donchian channel breakout on XAUUSD; optional consolidation filter; percent-risk or fixed lots." - -#include - -input group "=== Instrument ===" -input string InpSymbol = "XAUUSD"; - -input group "=== Session ===" -input ENUM_TIMEFRAMES InpSignalTF = PERIOD_M5; -input bool InpUseSessionFilter = false; -input int InpSessionStartHour = 7; -input int InpSessionEndHour = 22; - -input group "=== Donchian breakout ===" -input int InpDonchianPeriod = 20; // Lookback for channel high/low (past bars exclude signal bar) -input bool InpRequireFreshBreak = true; // Close[2] inside prior upper/lower band (no churn) -input bool InpTradeLong = true; -input bool InpTradeShort = true; - -input group "=== Consolidation filter (horizontal → breakout) ===" -input bool InpUseNarrowChannelFilter = false; -input double InpMaxChannelWidthAtrMult = 3.0; // Upper-Lower <= this * ATR(shift 2) - -input group "=== Stops & targets (Nick-style RR) ===" -input int InpSlBufferPoints = 30; // Beyond opposite Donchian / structural low-high -input double InpTpRiskReward = 2.0; // TP distance = RR * risk distance -input bool InpUseMidStopFallback = false; // Optional tighter SL at channel mid (more aggressive) - -input group "=== Risk ===" -input bool InpUsePercentRisk = true; -input double InpRiskPercent = 1.0; // % balance per trade (video example) -input double InpFixedLots = 0.10; -input int InpMagic = 928001; -input int InpSlippagePoints = 50; -input int InpMaxSpreadPoints = 60; -input int InpMaxPositions = 1; - -input group "=== Indicators ===" -input int InpAtrPeriod = 14; - -CTrade g_trade; - -int g_atr = INVALID_HANDLE; -datetime g_lastBar = 0; - -string WorkSymbol() -{ - string s = InpSymbol; - StringTrimLeft(s); - StringTrimRight(s); - const int bar = StringFind(s, "|"); - if(bar >= 0) - s = StringSubstr(s, 0, bar); - StringTrimRight(s); - return (StringLen(s) > 0 ? s : _Symbol); -} - -bool SessionOk() -{ - if(!InpUseSessionFilter) - return true; - MqlDateTime dt; - TimeToStruct(TimeCurrent(), dt); - const int h = dt.hour; - if(InpSessionStartHour <= InpSessionEndHour) - return (h >= InpSessionStartHour && h < InpSessionEndHour); - return (h >= InpSessionStartHour || h < InpSessionEndHour); -} - -double DonchianUpper(const string sym, const ENUM_TIMEFRAMES tf, const int period, const int shiftAnchor) -{ - if(period < 1) - return 0.0; - double mx = -DBL_MAX; - for(int i = shiftAnchor + 1; i <= shiftAnchor + period; i++) - { - const double hi = iHigh(sym, tf, i); - if(hi > mx) - mx = hi; - } - return mx; -} - -double DonchianLower(const string sym, const ENUM_TIMEFRAMES tf, const int period, const int shiftAnchor) -{ - if(period < 1) - return 0.0; - double mn = DBL_MAX; - for(int i = shiftAnchor + 1; i <= shiftAnchor + period; i++) - { - const double lo = iLow(sym, tf, i); - if(lo < mn) - mn = lo; - } - return mn; -} - -double AtrAt(const int shift) -{ - double b[]; - ArraySetAsSeries(b, true); - if(g_atr == INVALID_HANDLE || CopyBuffer(g_atr, 0, shift, 1, b) != 1) - return 0.0; - return b[0]; -} - -double NormalizeLots(const string sym, double lots) -{ - double mn = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN); - double mx = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX); - double st = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP); - if(st > 0.0) - lots = MathFloor(lots / st) * st; - if(lots < mn) - lots = mn; - if(lots > mx) - lots = mx; - return lots; -} - -bool MoneyPerLotAtSl(const string sym, const ENUM_ORDER_TYPE type, const double openPrice, const double slPrice, double &lossPerLot) -{ - lossPerLot = 0.0; - double p = 0.0; - if(!OrderCalcProfit(type, sym, 1.0, openPrice, slPrice, p)) - return false; - lossPerLot = MathAbs(p); - return (lossPerLot > 0.0); -} - -double LotsFromPercentRisk(const string sym, const ENUM_ORDER_TYPE type, const double openPrice, const double slPrice) -{ - double perLotLoss = 0.0; - if(!MoneyPerLotAtSl(sym, type, openPrice, slPrice, perLotLoss)) - return InpFixedLots; - - const double balance = AccountInfoDouble(ACCOUNT_BALANCE); - const double riskMoney = balance * (InpRiskPercent / 100.0); - if(riskMoney <= 0.0 || perLotLoss <= 0.0) - return NormalizeLots(sym, InpFixedLots); - - double lots = riskMoney / perLotLoss; - return NormalizeLots(sym, lots); -} - -bool SpreadOk(const string sym) -{ - const long sp = SymbolInfoInteger(sym, SYMBOL_SPREAD); - return ((double)sp <= (double)InpMaxSpreadPoints); -} - -int CountMagicPositions(const string sym) -{ - int n = 0; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - const ulong t = PositionGetTicket(i); - if(t == 0 || !PositionSelectByTicket(t)) - continue; - if(PositionGetString(POSITION_SYMBOL) != sym) - continue; - if((int)PositionGetInteger(POSITION_MAGIC) != InpMagic) - continue; - n++; - } - return n; -} - -void BuildStopsBuy(const string sym, const double entry, const double upperD1, const double lowerD1, - double &sl, double &tp) -{ - const double pt = SymbolInfoDouble(sym, SYMBOL_POINT); - const double buf = (double)InpSlBufferPoints * pt; - double riskDist = entry - (lowerD1 - buf); - sl = lowerD1 - buf; - - if(InpUseMidStopFallback) - { - const double mid = (upperD1 + lowerD1) * 0.5; - const double distMid = entry - mid; - if(distMid > 0 && distMid < riskDist) - { - sl = mid - buf; - riskDist = entry - sl; - } - } - - const long lvl = SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL); - const double minD = (double)lvl * pt; - if(minD > 0.0 && entry - sl < minD) - sl = entry - minD; - - riskDist = entry - sl; - tp = entry + riskDist * InpTpRiskReward; - - if(minD > 0.0 && tp - entry < minD) - tp = entry + minD; - - const int dg = (int)SymbolInfoInteger(sym, SYMBOL_DIGITS); - sl = NormalizeDouble(sl, dg); - tp = NormalizeDouble(tp, dg); -} - -void BuildStopsSell(const string sym, const double entry, const double upperD1, const double lowerD1, - double &sl, double &tp) -{ - const double pt = SymbolInfoDouble(sym, SYMBOL_POINT); - const double buf = (double)InpSlBufferPoints * pt; - double riskDist = (upperD1 + buf) - entry; - sl = upperD1 + buf; - - if(InpUseMidStopFallback) - { - const double mid = (upperD1 + lowerD1) * 0.5; - const double distMid = mid - entry; - if(distMid > 0 && distMid < riskDist) - { - sl = mid + buf; - riskDist = sl - entry; - } - } - - const long lvl = SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL); - const double minD = (double)lvl * pt; - if(minD > 0.0 && sl - entry < minD) - sl = entry + minD; - - riskDist = sl - entry; - tp = entry - riskDist * InpTpRiskReward; - - if(minD > 0.0 && entry - tp < minD) - tp = entry - minD; - - const int dg = (int)SymbolInfoInteger(sym, SYMBOL_DIGITS); - sl = NormalizeDouble(sl, dg); - tp = NormalizeDouble(tp, dg); -} - -bool NarrowChannelOk(const string sym, const ENUM_TIMEFRAMES tf, const int period) -{ - if(!InpUseNarrowChannelFilter) - return true; - const double up = DonchianUpper(sym, tf, period, 2); - const double lo = DonchianLower(sym, tf, period, 2); - const double atr = AtrAt(2); - if(up <= 0 || lo <= 0 || atr <= 0) - return false; - const double width = up - lo; - return (width <= atr * InpMaxChannelWidthAtrMult); -} - -int OnInit() -{ - const string sym = WorkSymbol(); - if(!SymbolSelect(sym, true)) - { - Print("TFXXAUUSDScalper: symbol not available: ", sym); - return INIT_FAILED; - } - if(InpDonchianPeriod < 2) - { - Print("TFXXAUUSDScalper: InpDonchianPeriod must be >= 2"); - return INIT_PARAMETERS_INCORRECT; - } - - g_trade.SetExpertMagicNumber(InpMagic); - g_trade.SetDeviationInPoints(InpSlippagePoints); - g_trade.SetTypeFillingBySymbol(sym); - - g_atr = iATR(sym, InpSignalTF, InpAtrPeriod); - if(g_atr == INVALID_HANDLE) - { - Print("TFXXAUUSDScalper: ATR init failed"); - return INIT_FAILED; - } - - Print("TFXXAUUSDScalper: ", sym, " ", EnumToString(InpSignalTF), - " Donchian=", InpDonchianPeriod, " RR=", InpTpRiskReward, - " risk%=", (InpUsePercentRisk ? DoubleToString(InpRiskPercent, 2) : "off")); - return INIT_SUCCEEDED; -} - -void OnDeinit(const int reason) -{ - if(g_atr != INVALID_HANDLE) - IndicatorRelease(g_atr); - g_atr = INVALID_HANDLE; -} - -void OnTick() -{ - const string sym = WorkSymbol(); - const datetime t0 = iTime(sym, InpSignalTF, 0); - if(t0 == 0 || t0 == g_lastBar) - return; - g_lastBar = t0; - - if(!SessionOk() || !SpreadOk(sym)) - return; - if(CountMagicPositions(sym) >= InpMaxPositions) - return; - - const int p = InpDonchianPeriod; - const double c1 = iClose(sym, InpSignalTF, 1); - const double c2 = iClose(sym, InpSignalTF, 2); - if(c1 <= 0.0 || c2 <= 0.0) - return; - - const double up1 = DonchianUpper(sym, InpSignalTF, p, 1); - const double lo1 = DonchianLower(sym, InpSignalTF, p, 1); - const double up2 = DonchianUpper(sym, InpSignalTF, p, 2); - const double lo2 = DonchianLower(sym, InpSignalTF, p, 2); - - if(up1 <= 0 || lo1 <= 0 || up2 <= 0 || lo2 <= 0) - return; - - if(!NarrowChannelOk(sym, InpSignalTF, p)) - return; - - bool longSig = InpTradeLong && (c1 > up1); - bool shortSig = InpTradeShort && (c1 < lo1); - - if(InpRequireFreshBreak) - { - longSig = longSig && (c2 <= up2); - shortSig = shortSig && (c2 >= lo2); - } - - if(!longSig && !shortSig) - return; - - MqlTick tick; - if(!SymbolInfoTick(sym, tick)) - return; - - if(longSig && !shortSig) - { - double sl = 0.0, tp = 0.0; - BuildStopsBuy(sym, tick.ask, up1, lo1, sl, tp); - const double lots = InpUsePercentRisk ? LotsFromPercentRisk(sym, ORDER_TYPE_BUY, tick.ask, sl) : NormalizeLots(sym, InpFixedLots); - if(!g_trade.Buy(lots, sym, tick.ask, sl, tp, "TFX Gold Donchian↑")) - Print("Buy failed ", g_trade.ResultRetcode(), " ", g_trade.ResultRetcodeDescription()); - return; - } - - if(shortSig && !longSig) - { - double sl = 0.0, tp = 0.0; - BuildStopsSell(sym, tick.bid, up1, lo1, sl, tp); - const double lots = InpUsePercentRisk ? LotsFromPercentRisk(sym, ORDER_TYPE_SELL, tick.bid, sl) : NormalizeLots(sym, InpFixedLots); - if(!g_trade.Sell(lots, sym, tick.bid, sl, tp, "TFX Gold Donchian↓")) - Print("Sell failed ", g_trade.ResultRetcode(), " ", g_trade.ResultRetcodeDescription()); - return; - } - - // Bothtrue — rare; skip to avoid ambiguous execution -} - -//+------------------------------------------------------------------+ diff --git a/lab/EAs/TFXXAUUSDScalper_Genetic_Optimization.set b/lab/EAs/TFXXAUUSDScalper_Genetic_Optimization.set deleted file mode 100644 index a1dc8cf..0000000 --- a/lab/EAs/TFXXAUUSDScalper_Genetic_Optimization.set +++ /dev/null @@ -1,44 +0,0 @@ -; TFXXAUUSDScalper.mq5 — Strategy Tester → Inputs → Load (Genetic optimization) -; Format: Parameter=Value||Step||Min||Max||Optimize(Y/N) -; -; ENUM_TIMEFRAMES (MT5): M1=1 M5=5 M15=15 M30=30 H1=16385 H4=16388 D1=16408 -; Keep InpSignalTF fixed (single integer). Do not use Min–Max sweeps on enums — genetic -; often tries invalid values between named periods and OnInit fails. -; -; Baseline aligned with Desktop 123.set (2026.05.08); magic corrected to 928001 (EA default). - -; === Instrument === -InpSymbol=XAUUSD - -; === Session === -InpSignalTF=5||0||5||5||N -InpUseSessionFilter=false||false||0||true||N -InpSessionStartHour=7||0||7||7||N -InpSessionEndHour=22||0||22||22||N - -; === Donchian breakout === -InpDonchianPeriod=20||2||10||80||Y -InpRequireFreshBreak=true||false||0||true||N -InpTradeLong=true||false||0||true||N -InpTradeShort=true||false||0||true||N - -; === Consolidation filter (horizontal → breakout) === -InpUseNarrowChannelFilter=false||false||0||true||N -InpMaxChannelWidthAtrMult=3.0||0.5||1.5||6.0||Y - -; === Stops & targets (Nick-style RR) === -InpSlBufferPoints=30||5||10||120||Y -InpTpRiskReward=2.0||0.25||1.25||4.0||Y -InpUseMidStopFallback=false||false||0||true||N - -; === Risk === -InpUsePercentRisk=true||false||0||true||N -InpRiskPercent=1.0||0.15||0.25||2.5||Y -InpFixedLots=0.1||0.01||0.1||0.1||N -InpMagic=928001||0||928001||928001||N -InpSlippagePoints=50||0||50||50||N -InpMaxSpreadPoints=60||5||20||100||Y -InpMaxPositions=1||0||1||1||N - -; === Indicators === -InpAtrPeriod=14||1||7||28||Y diff --git a/lab/EAs/TimeSelectiveEMA.mq5 b/lab/EAs/TimeSelectiveEMA.mq5 deleted file mode 100644 index 6fb0068..0000000 --- a/lab/EAs/TimeSelectiveEMA.mq5 +++ /dev/null @@ -1,342 +0,0 @@ -//+------------------------------------------------------------------+ -//| TimeSelectiveEMA.mq5 | -//| Copyright 2025, MetaQuotes Ltd. | -//| https://www.mql5.com | -//+------------------------------------------------------------------+ -#property copyright "Copyright 2025, MetaQuotes Ltd." -#property link "https://www.mql5.com" -#property version "1.00" -#property description "EMA Crossover EA for EURUSD with Trading Hours Filter" -#property description "Minimizes loss by trading only during optimal hours" - -#include - -//--- Input parameters -input group "Timeframe Settings" -input ENUM_TIMEFRAMES InpTimeframe = PERIOD_M15; // Trading Timeframe - -input group "EMA Settings" -input int InpFastEMA = 12; // Fast EMA Period -input int InpSlowEMA = 26; // Slow EMA Period - -input group "Trading Hours (Server Time)" -input int InpStartHour = 8; // Trading Start Hour (0-23) -input int InpEndHour = 18; // Trading End Hour (0-23) -input bool InpUseTimeFilter = true; // Use Trading Hours Filter - -input group "Risk Management" -input double InpLotSize = 0.01; // Lot Size -input int InpMagicNumber = 789012; // Magic Number -input int InpSlippage = 3; // Slippage (points) -input bool InpUseRecrossExit = true; // Use EMA Recross as Exit (No SL/TP) - -input group "Loss Minimization" -input bool InpUseMaxDailyLoss = true; // Use Max Daily Loss -input double InpMaxDailyLoss = 50.0; // Max Daily Loss (USD) - -//--- Global variables -CTrade trade; -int fast_ema_handle; -int slow_ema_handle; -datetime last_bar_time = 0; -double daily_profit = 0.0; -datetime last_daily_reset = 0; -double last_profit = 0.0; - -//+------------------------------------------------------------------+ -//| Expert initialization function | -//+------------------------------------------------------------------+ -int OnInit() -{ - // Check symbol - if(_Symbol != "EURUSD" && _Symbol != "EURUSD#") - { - Alert("This EA is designed for EURUSD only. Current symbol: ", _Symbol); - return(INIT_FAILED); - } - - // Set trade parameters - trade.SetExpertMagicNumber(InpMagicNumber); - trade.SetDeviationInPoints(InpSlippage); - trade.SetTypeFilling(ORDER_FILLING_FOK); - - // Create EMA indicators on specified timeframe - fast_ema_handle = iMA(_Symbol, InpTimeframe, InpFastEMA, 0, MODE_EMA, PRICE_CLOSE); - slow_ema_handle = iMA(_Symbol, InpTimeframe, InpSlowEMA, 0, MODE_EMA, PRICE_CLOSE); - - if(fast_ema_handle == INVALID_HANDLE || slow_ema_handle == INVALID_HANDLE) - { - Print("ERROR: Failed to create EMA indicators"); - return(INIT_FAILED); - } - - // Initialize daily tracking - last_daily_reset = TimeCurrent(); - daily_profit = 0.0; - - Print("TimeSelectiveEMA EA initialized for ", _Symbol); - Print("Timeframe: ", EnumToString(InpTimeframe)); - Print("Trading Hours: ", InpStartHour, ":00 - ", InpEndHour, ":00 (Server Time)"); - Print("EMA Crossover: Fast=", InpFastEMA, " Slow=", InpSlowEMA); - - return(INIT_SUCCEEDED); -} - -//+------------------------------------------------------------------+ -//| Expert deinitialization function | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) -{ - // Release indicators - if(fast_ema_handle != INVALID_HANDLE) - IndicatorRelease(fast_ema_handle); - if(slow_ema_handle != INVALID_HANDLE) - IndicatorRelease(slow_ema_handle); -} - -//+------------------------------------------------------------------+ -//| Expert tick function | -//+------------------------------------------------------------------+ -void OnTick() -{ - // Check if new bar on the specified timeframe - datetime current_bar_time = iTime(_Symbol, InpTimeframe, 0); - if(current_bar_time == last_bar_time) - { - // Still same bar - only manage existing positions - ManagePosition(); - return; - } - last_bar_time = current_bar_time; - - // Reset daily profit and consecutive losses at midnight - MqlDateTime dt; - TimeToStruct(TimeCurrent(), dt); - MqlDateTime last_dt; - TimeToStruct(last_daily_reset, last_dt); - - // Check if new day (day, month, or year changed) - bool is_new_day = (dt.day != last_dt.day || dt.month != last_dt.month || dt.year != last_dt.year); - - if(is_new_day) - { - // New day - reset daily profit - daily_profit = 0.0; - last_daily_reset = TimeCurrent(); - Print("Daily reset: New trading day started. Daily profit reset to 0."); - } - - // Check daily loss limit - if(InpUseMaxDailyLoss && daily_profit <= -InpMaxDailyLoss) - { - Print("Daily loss limit reached: ", daily_profit, " USD. Trading stopped for today."); - return; - } - - // Check trading hours - if(InpUseTimeFilter && !IsWithinTradingHours()) - { - return; // Outside trading hours - } - - // Get EMA values - double fast_ema[], slow_ema[]; - ArraySetAsSeries(fast_ema, true); - ArraySetAsSeries(slow_ema, true); - - if(CopyBuffer(fast_ema_handle, 0, 0, 3, fast_ema) < 3 || - CopyBuffer(slow_ema_handle, 0, 0, 3, slow_ema) < 3) - { - Print("ERROR: Failed to copy EMA buffers"); - return; - } - - // Check for crossover signals - bool bullish_cross = false; - bool bearish_cross = false; - - // Bullish: Fast EMA crosses above Slow EMA - if(fast_ema[1] > slow_ema[1] && fast_ema[2] <= slow_ema[2]) - { - bullish_cross = true; - } - - // Bearish: Fast EMA crosses below Slow EMA - if(fast_ema[1] < slow_ema[1] && fast_ema[2] >= slow_ema[2]) - { - bearish_cross = true; - } - - // Check existing position - if(PositionSelect(_Symbol)) - { - // Check for recross (opposite signal) - this is the exit signal - long position_type = PositionGetInteger(POSITION_TYPE); - if(InpUseRecrossExit) - { - if(position_type == POSITION_TYPE_BUY && bearish_cross) - { - // Close long position on bearish recross (Fast EMA crosses below Slow EMA) - if(trade.PositionClose(_Symbol)) - { - Print("Position closed due to bearish recross (Fast EMA crossed below Slow EMA)"); - } - } - else if(position_type == POSITION_TYPE_SELL && bullish_cross) - { - // Close short position on bullish recross (Fast EMA crosses above Slow EMA) - if(trade.PositionClose(_Symbol)) - { - Print("Position closed due to bullish recross (Fast EMA crossed above Slow EMA)"); - } - } - } - - // Manage existing position (trailing stop, break-even if enabled) - ManagePosition(); - } - else - { - // No position - check for new entry - if(bullish_cross) - { - OpenBuyPosition(); - } - else if(bearish_cross) - { - OpenSellPosition(); - } - } -} - -//+------------------------------------------------------------------+ -//| Check if current time is within trading hours | -//+------------------------------------------------------------------+ -bool IsWithinTradingHours() -{ - MqlDateTime dt; - TimeToStruct(TimeCurrent(), dt); - int current_hour = dt.hour; - - // Handle case where end hour is before start hour (overnight) - if(InpEndHour < InpStartHour) - { - return (current_hour >= InpStartHour || current_hour < InpEndHour); - } - else - { - return (current_hour >= InpStartHour && current_hour < InpEndHour); - } -} - -//+------------------------------------------------------------------+ -//| Open buy position | -//+------------------------------------------------------------------+ -void OpenBuyPosition() -{ - double price = SymbolInfoDouble(_Symbol, SYMBOL_ASK); - - // No SL/TP - exit only on EMA recross - if(trade.Buy(InpLotSize, _Symbol, price, 0, 0, "EMA Crossover Buy")) - { - Print("Buy order opened at ", price, " (Exit on bearish recross)"); - } - else - { - Print("Failed to open buy order: ", trade.ResultRetcodeDescription()); - } -} - -//+------------------------------------------------------------------+ -//| Open sell position | -//+------------------------------------------------------------------+ -void OpenSellPosition() -{ - double price = SymbolInfoDouble(_Symbol, SYMBOL_BID); - - // No SL/TP - exit only on EMA recross - if(trade.Sell(InpLotSize, _Symbol, price, 0, 0, "EMA Crossover Sell")) - { - Print("Sell order opened at ", price, " (Exit on bullish recross)"); - } - else - { - Print("Failed to open sell order: ", trade.ResultRetcodeDescription()); - } -} - -//+------------------------------------------------------------------+ -//| Manage existing position | -//+------------------------------------------------------------------+ -void ManagePosition() -{ - if(!PositionSelect(_Symbol)) - return; - - // Update daily profit - double current_profit = PositionGetDouble(POSITION_PROFIT); - if(current_profit != last_profit) - { - daily_profit += (current_profit - last_profit); - last_profit = current_profit; - } - - // Position management: Only track profit/loss - // Exit is handled by EMA recross signal in OnTick() -} - -//+------------------------------------------------------------------+ -//| Apply trailing stop (disabled - using recross exit only) | -//+------------------------------------------------------------------+ -void ApplyTrailingStop() -{ - // Trailing stop disabled - using EMA recross as exit signal only - // This function kept for compatibility but does nothing - return; -} - -//+------------------------------------------------------------------+ -//| Move stop loss to break-even (disabled - using recross exit only)| -//+------------------------------------------------------------------+ -void MoveToBreakEven() -{ - // Break-even disabled - using EMA recross as exit signal only - // This function kept for compatibility but does nothing - return; -} - -//+------------------------------------------------------------------+ -//| Trade transaction event handler | -//+------------------------------------------------------------------+ -void OnTradeTransaction(const MqlTradeTransaction& trans, - const MqlTradeRequest& request, - const MqlTradeResult& result) -{ - // Track daily profit only (consecutive losses feature removed) - if(trans.type == TRADE_TRANSACTION_DEAL_ADD) - { - if(HistoryDealSelect(trans.deal)) - { - long deal_type = HistoryDealGetInteger(trans.deal, DEAL_TYPE); - if(deal_type == DEAL_TYPE_BALANCE || deal_type == DEAL_TYPE_COMMISSION) - return; - - // Check if deal is from current day - datetime deal_time = (datetime)HistoryDealGetInteger(trans.deal, DEAL_TIME); - MqlDateTime deal_dt, current_dt; - TimeToStruct(deal_time, deal_dt); - TimeToStruct(TimeCurrent(), current_dt); - - // Only process deals from current day - bool is_current_day = (deal_dt.day == current_dt.day && - deal_dt.month == current_dt.month && - deal_dt.year == current_dt.year); - - if(is_current_day) - { - double deal_profit = HistoryDealGetDouble(trans.deal, DEAL_PROFIT); - // Daily profit is tracked in ManagePosition() - } - } - } -} diff --git a/lab/EAs/USDCHF.mq5 b/lab/EAs/USDCHF.mq5 new file mode 100644 index 0000000..aff2e11 --- /dev/null +++ b/lab/EAs/USDCHF.mq5 @@ -0,0 +1,700 @@ +//+------------------------------------------------------------------+ +//| USDCHF Playbook — six behavioral rules (momentum, traps, zones) | +//+------------------------------------------------------------------+ +#property copyright "lab/USDCHF" +#property version "1.20" +#property strict + +#include + +input group "=== Symbol / TF ===" +input ENUM_TIMEFRAMES Timeframe = PERIOD_M15; +input ENUM_TIMEFRAMES HtfTimeframe = PERIOD_H4; +input ENUM_TIMEFRAMES DailyTimeframe = PERIOD_D1; +input int MagicNumber = 20260625; + +input group "=== Daily swing bias (rule 6) ===" +input bool UseDailyBias = true; +input int DailyEmaPeriod = 50; + +input group "=== HTF zones (rule 3) ===" +input int HtfZoneBars = 20; +input double MinBreakBodyRatio = 0.55; + +input group "=== Double trap (rule 2) ===" +input bool UseDoubleTrap = true; + +input group "=== Session (rules 1 & 4) ===" +input int NyChaosStartHour = 12; +input int NyChaosEndHour = 15; +input int MomentumStartHour = 15; +input int MomentumEndHour = 2; + +input group "=== LTF entry ===" +input int LtfFastEma = 8; +input int LtfSlowEma = 21; +input int EntryMode = 1; // 0=h4 break 1=mixed 2=trap 3=LTF momentum +input bool AllowLtfPullback = true; +input bool AllowEmaCross = true; +input double MinEmaGapPips = 0.5; + +input group "=== Risk ===" +input double LotSize = 0.10; +input int AtrPeriod = 14; +input double AtrSlMult = 1.8; +input double AtrTpMult = 4.0; +input bool UseTrailing = true; +input double TrailAtrMult = 1.2; +input int MaxBarsInTrade = 96; +input bool ExtendHoldMomentum = true; +input int CooldownBars = 1; +input int MaxSpreadPips = 8; + +input group "=== News compression (rule 5) ===" +input bool UseCompressionFilter = true; +input double CompressAtrRatio = 0.70; +input int CompressLookback = 48; +input bool UseMomentumWindow = true; + +input group "=== Combo modules (组合逻辑) ===" +input int ComboMode = 0; // 0=任一触发 1=主信号+确认 2=评分达标 +input int MinComboScore = 2; // ComboMode=2 时最少几分 +input bool AllowRsiPullback = true; +input int RsiPeriod = 14; +input double RsiBuyZone = 42.0; +input double RsiSellZone = 58.0; +input bool AllowMacdMomentum = true; +input int MacdFast = 12; +input int MacdSlow = 26; +input int MacdSignal = 9; +input bool AllowInsideBarBreak = true; +input bool AllowAsianBreakout = true; +input int AsianStartHour = 0; +input int AsianEndHour = 8; +input double AsianBreakBufferPips = 1.0; +input bool UseH1TrendFilter = true; +input int H1EmaPeriod = 50; +input bool UseAdxFilter = false; +input int AdxPeriod = 14; +input double AdxMin = 20.0; + +CTrade g_trade; +int g_fastHandle = INVALID_HANDLE; +int g_slowHandle = INVALID_HANDLE; +int g_atrHandle = INVALID_HANDLE; +int g_dailyEma = INVALID_HANDLE; +int g_rsiHandle = INVALID_HANDLE; +int g_macdHandle = INVALID_HANDLE; +int g_adxHandle = INVALID_HANDLE; +int g_h1EmaHandle = INVALID_HANDLE; +datetime g_lastBar = 0; +int g_lastEntryBar = -100000; +int g_bars = 0; +double g_trail = 0.0; + +double PipSize() +{ + double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); + int d = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); + return (d == 3 || d == 5) ? pt * 10.0 : pt; +} + +int SpreadPips() +{ + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + if(ask <= 0 || bid <= 0) return 9999; + return (int)MathRound((ask - bid) / PipSize()); +} + +bool HourInRange(const int h, const int start, const int end) +{ + if(start == end) return true; + if(start < end) return (h >= start && h < end); + return (h >= start || h < end); +} + +bool InMomentumWindow() +{ + MqlDateTime ts; TimeToStruct(TimeCurrent(), ts); + return HourInRange(ts.hour, MomentumStartHour, MomentumEndHour); +} + +bool InNyChaos() +{ + MqlDateTime ts; TimeToStruct(TimeCurrent(), ts); + return HourInRange(ts.hour, NyChaosStartHour, NyChaosEndHour); +} + +bool SessionOk() +{ + if(InNyChaos()) return false; + if(!UseMomentumWindow) return true; + return InMomentumWindow(); +} + +bool IsNewBar() +{ + datetime t = iTime(_Symbol, Timeframe, 0); + if(t <= 0 || t == g_lastBar) return false; + g_lastBar = t; + g_bars++; + return true; +} + +bool Copy1(const int h, const int sh, const int buf, double &v) +{ + double b[1]; + if(CopyBuffer(h, buf, sh, 1, b) <= 0) return false; + v = b[0]; return true; +} + +int TfShift(const ENUM_TIMEFRAMES tf, const int ltf_sh) +{ + datetime t = iTime(_Symbol, Timeframe, ltf_sh); + if(t <= 0) return -1; + return iBarShift(_Symbol, tf, t, true); +} + +double BodyRatio(const ENUM_TIMEFRAMES tf, const int sh) +{ + double o = iOpen(_Symbol, tf, sh); + double h = iHigh(_Symbol, tf, sh); + double l = iLow(_Symbol, tf, sh); + double c = iClose(_Symbol, tf, sh); + double rng = h - l; + if(rng <= 0) return 0; + return MathAbs(c - o) / rng; +} + +bool HtfZoneAt(const int hsh, double &resistance, double &support) +{ + if(hsh < 0) return false; + resistance = -1e100; + support = 1e100; + for(int i = hsh + 1; i <= hsh + HtfZoneBars; i++) + { + double hi = iHigh(_Symbol, HtfTimeframe, i); + double lo = iLow(_Symbol, HtfTimeframe, i); + if(hi > resistance) resistance = hi; + if(lo < support) support = lo; + } + return (resistance > -1e50 && support < 1e50); +} + +int DailyBias(const int ltf_sh) +{ + if(!UseDailyBias) return 0; + int dsh = TfShift(DailyTimeframe, ltf_sh); + if(dsh < 0) return 0; + double ema, close; + if(!Copy1(g_dailyEma, dsh, 0, ema)) return 0; + close = iClose(_Symbol, DailyTimeframe, dsh); + if(close > ema) return 1; + if(close < ema) return -1; + return 0; +} + +bool HtfBullBreak(const int ltf_sh) +{ + int hsh = TfShift(HtfTimeframe, ltf_sh); + if(hsh < 0) return false; + double res, sup; + if(!HtfZoneAt(hsh + 1, res, sup)) return false; + double c = iClose(_Symbol, HtfTimeframe, hsh); + return (c > res && BodyRatio(HtfTimeframe, hsh) >= MinBreakBodyRatio); +} + +bool HtfBearBreak(const int ltf_sh) +{ + int hsh = TfShift(HtfTimeframe, ltf_sh); + if(hsh < 0) return false; + double res, sup; + if(!HtfZoneAt(hsh + 1, res, sup)) return false; + double c = iClose(_Symbol, HtfTimeframe, hsh); + return (c < sup && BodyRatio(HtfTimeframe, hsh) >= MinBreakBodyRatio); +} + +bool BullTrap(const int ltf_sh) +{ + if(!UseDoubleTrap) return false; + int hsh = TfShift(HtfTimeframe, ltf_sh); + if(hsh < 0) return false; + double res, sup; + if(!HtfZoneAt(hsh + 2, res, sup)) return false; + double hi = iHigh(_Symbol, HtfTimeframe, hsh + 1); + double cl = iClose(_Symbol, HtfTimeframe, hsh + 1); + return (hi > res && cl < res); +} + +bool BearTrap(const int ltf_sh) +{ + if(!UseDoubleTrap) return false; + int hsh = TfShift(HtfTimeframe, ltf_sh); + if(hsh < 0) return false; + double res, sup; + if(!HtfZoneAt(hsh + 2, res, sup)) return false; + double lo = iLow(_Symbol, HtfTimeframe, hsh + 1); + double cl = iClose(_Symbol, HtfTimeframe, hsh + 1); + return (lo < sup && cl > sup); +} + +bool CompressionOk(const int sh) +{ + if(!UseCompressionFilter || !InNyChaos()) return true; + double atrNow, atrSum = 0; + if(!Copy1(g_atrHandle, sh, 0, atrNow)) return true; + int n = MathMin(CompressLookback, 200); + for(int i = sh; i < sh + n; i++) + { + double a; + if(!Copy1(g_atrHandle, i, 0, a)) continue; + atrSum += a; + } + double avg = atrSum / MathMax(n, 1); + if(avg <= 0) return true; + return (atrNow / avg >= CompressAtrRatio); +} + +bool PullbackLong(const int sh) +{ + double f, s, close, low; + if(!Copy1(g_fastHandle, sh, 0, f) || !Copy1(g_slowHandle, sh, 0, s)) return false; + close = iClose(_Symbol, Timeframe, sh); + low = iLow(_Symbol, Timeframe, sh); + return (f > s && low <= f && close > f); +} + +bool PullbackShort(const int sh) +{ + double f, s, close, high; + if(!Copy1(g_fastHandle, sh, 0, f) || !Copy1(g_slowHandle, sh, 0, s)) return false; + close = iClose(_Symbol, Timeframe, sh); + high = iHigh(_Symbol, Timeframe, sh); + return (f < s && high >= f && close < f); +} + +bool ReclaimLong(const int sh) +{ + int hsh = TfShift(HtfTimeframe, sh); + if(hsh < 0) return false; + double res, sup, f; + if(!HtfZoneAt(hsh + 1, res, sup)) return false; + if(!Copy1(g_fastHandle, sh, 0, f)) return false; + double c = iClose(_Symbol, Timeframe, sh); + return (BullTrap(sh) && c > res && c > f); +} + +bool ReclaimShort(const int sh) +{ + int hsh = TfShift(HtfTimeframe, sh); + if(hsh < 0) return false; + double res, sup, f; + if(!HtfZoneAt(hsh + 1, res, sup)) return false; + if(!Copy1(g_fastHandle, sh, 0, f)) return false; + double c = iClose(_Symbol, Timeframe, sh); + return (BearTrap(sh) && c < sup && c < f); +} + +bool HasOurPosition() +{ + return PositionSelect(_Symbol) && PositionGetInteger(POSITION_MAGIC) == MagicNumber; +} + +void CloseOur(const string reason) +{ + if(!HasOurPosition()) return; + if(g_trade.PositionClose((ulong)PositionGetInteger(POSITION_TICKET))) + Print("[USDCHF Playbook] close ", reason); + g_trail = 0; +} + +bool TryOpen(const bool isLong) +{ + if(HasOurPosition()) return false; + if(OneTradeBlocked()) return false; + g_trade.SetExpertMagicNumber(MagicNumber); + bool ok = isLong ? g_trade.Buy(LotSize, _Symbol) : g_trade.Sell(LotSize, _Symbol); + if(ok) + { + g_lastEntryBar = g_bars; + g_trail = 0; + Print("[USDCHF Playbook] ", isLong ? "BUY" : "SELL"); + } + return ok; +} + +bool OneTradeBlocked() +{ + if(MaxSpreadPips > 0 && SpreadPips() > MaxSpreadPips) return true; + if(g_bars - g_lastEntryBar < CooldownBars) return true; + return false; +} + +bool EmaGapOk(const int sh) +{ + if(MinEmaGapPips <= 0) return true; + double f, s; + if(!Copy1(g_fastHandle, sh, 0, f) || !Copy1(g_slowHandle, sh, 0, s)) return false; + return (MathAbs(f - s) / PipSize() >= MinEmaGapPips); +} + +bool TrendLong(const int sh) +{ + double f, s; + if(!Copy1(g_fastHandle, sh, 0, f) || !Copy1(g_slowHandle, sh, 0, s)) return false; + return (f > s); +} + +bool TrendShort(const int sh) +{ + double f, s; + if(!Copy1(g_fastHandle, sh, 0, f) || !Copy1(g_slowHandle, sh, 0, s)) return false; + return (f < s); +} + +bool EmaCrossLong(const int sh) +{ + double f1, f2, s1, s2; + if(!Copy1(g_fastHandle, sh, 0, f1) || !Copy1(g_fastHandle, sh + 1, 0, f2)) return false; + if(!Copy1(g_slowHandle, sh, 0, s1) || !Copy1(g_slowHandle, sh + 1, 0, s2)) return false; + return (f2 <= s2 && f1 > s1); +} + +bool EmaCrossShort(const int sh) +{ + double f1, f2, s1, s2; + if(!Copy1(g_fastHandle, sh, 0, f1) || !Copy1(g_fastHandle, sh + 1, 0, f2)) return false; + if(!Copy1(g_slowHandle, sh, 0, s1) || !Copy1(g_slowHandle, sh + 1, 0, s2)) return false; + return (f2 >= s2 && f1 < s1); +} + +bool LtfMomentumLong(const int sh) +{ + if(!EmaGapOk(sh)) return false; + bool pb = AllowLtfPullback && PullbackLong(sh) && TrendLong(sh); + bool x = AllowEmaCross && EmaCrossLong(sh); + return (pb || x); +} + +bool LtfMomentumShort(const int sh) +{ + if(!EmaGapOk(sh)) return false; + bool pb = AllowLtfPullback && PullbackShort(sh) && TrendShort(sh); + bool x = AllowEmaCross && EmaCrossShort(sh); + return (pb || x); +} + +bool H1TrendLong(const int sh) +{ + if(!UseH1TrendFilter) return true; + int h1sh = TfShift(PERIOD_H1, sh); + if(h1sh < 0) return false; + double ema, close; + if(!Copy1(g_h1EmaHandle, h1sh, 0, ema)) return false; + close = iClose(_Symbol, PERIOD_H1, h1sh); + return (close > ema); +} + +bool H1TrendShort(const int sh) +{ + if(!UseH1TrendFilter) return true; + int h1sh = TfShift(PERIOD_H1, sh); + if(h1sh < 0) return false; + double ema, close; + if(!Copy1(g_h1EmaHandle, h1sh, 0, ema)) return false; + close = iClose(_Symbol, PERIOD_H1, h1sh); + return (close < ema); +} + +bool AdxOk(const int sh) +{ + if(!UseAdxFilter) return true; + double adx; + if(!Copy1(g_adxHandle, sh, 0, adx)) return false; + return (adx >= AdxMin); +} + +bool RsiPullbackLong(const int sh) +{ + if(!AllowRsiPullback) return false; + double r1, r2; + if(!Copy1(g_rsiHandle, sh, 0, r1) || !Copy1(g_rsiHandle, sh + 1, 0, r2)) return false; + return (r2 <= RsiBuyZone && r1 > RsiBuyZone && TrendLong(sh)); +} + +bool RsiPullbackShort(const int sh) +{ + if(!AllowRsiPullback) return false; + double r1, r2; + if(!Copy1(g_rsiHandle, sh, 0, r1) || !Copy1(g_rsiHandle, sh + 1, 0, r2)) return false; + return (r2 >= RsiSellZone && r1 < RsiSellZone && TrendShort(sh)); +} + +bool MacdMomentumLong(const int sh) +{ + if(!AllowMacdMomentum) return false; + double h1, h2; + if(!Copy1(g_macdHandle, sh, 2, h1) || !Copy1(g_macdHandle, sh + 1, 2, h2)) return false; + return (h1 > h2 && h1 > 0); +} + +bool MacdMomentumShort(const int sh) +{ + if(!AllowMacdMomentum) return false; + double h1, h2; + if(!Copy1(g_macdHandle, sh, 2, h1) || !Copy1(g_macdHandle, sh + 1, 2, h2)) return false; + return (h1 < h2 && h1 < 0); +} + +bool InsideBarBreakLong(const int sh) +{ + if(!AllowInsideBarBreak) return false; + double hiM = iHigh(_Symbol, Timeframe, sh + 1); + double loM = iLow(_Symbol, Timeframe, sh + 1); + double hiI = iHigh(_Symbol, Timeframe, sh); + double loI = iLow(_Symbol, Timeframe, sh); + double cI = iClose(_Symbol, Timeframe, sh); + if(hiI >= hiM || loI <= loM) return false; + return (cI > hiM && TrendLong(sh)); +} + +bool InsideBarBreakShort(const int sh) +{ + if(!AllowInsideBarBreak) return false; + double hiM = iHigh(_Symbol, Timeframe, sh + 1); + double loM = iLow(_Symbol, Timeframe, sh + 1); + double hiI = iHigh(_Symbol, Timeframe, sh); + double loI = iLow(_Symbol, Timeframe, sh); + double cI = iClose(_Symbol, Timeframe, sh); + if(hiI >= hiM || loI <= loM) return false; + return (cI < loM && TrendShort(sh)); +} + +bool AsianRange(const int sh, double &aHigh, double &aLow) +{ + aHigh = -1e100; + aLow = 1e100; + datetime barTime = iTime(_Symbol, Timeframe, sh); + if(barTime <= 0) return false; + MqlDateTime ts; TimeToStruct(barTime, ts); + if(!HourInRange(ts.hour, AsianEndHour, AsianEndHour + 12)) return false; + + for(int i = sh; i < sh + 96; i++) + { + datetime t = iTime(_Symbol, Timeframe, i); + if(t <= 0) break; + MqlDateTime bt; TimeToStruct(t, bt); + if(!HourInRange(bt.hour, AsianStartHour, AsianEndHour)) continue; + double hi = iHigh(_Symbol, Timeframe, i); + double lo = iLow(_Symbol, Timeframe, i); + if(hi > aHigh) aHigh = hi; + if(lo < aLow) aLow = lo; + } + return (aHigh > -1e50 && aLow < 1e50 && aHigh > aLow); +} + +bool AsianBreakoutLong(const int sh) +{ + if(!AllowAsianBreakout) return false; + double aHi, aLo; + if(!AsianRange(sh, aHi, aLo)) return false; + double buf = AsianBreakBufferPips * PipSize(); + double c = iClose(_Symbol, Timeframe, sh); + return (c > aHi + buf && TrendLong(sh)); +} + +bool AsianBreakoutShort(const int sh) +{ + if(!AllowAsianBreakout) return false; + double aHi, aLo; + if(!AsianRange(sh, aHi, aLo)) return false; + double buf = AsianBreakBufferPips * PipSize(); + double c = iClose(_Symbol, Timeframe, sh); + return (c < aLo - buf && TrendShort(sh)); +} + +bool PrimaryLong(const int sh) +{ + if(EntryMode == 0) return HtfBullBreak(sh); + if(EntryMode == 2) return ReclaimLong(sh); + if(EntryMode == 3) return LtfMomentumLong(sh); + return (HtfBullBreak(sh) || ReclaimLong(sh) || LtfMomentumLong(sh) || PullbackLong(sh)); +} + +bool PrimaryShort(const int sh) +{ + if(EntryMode == 0) return HtfBearBreak(sh); + if(EntryMode == 2) return ReclaimShort(sh); + if(EntryMode == 3) return LtfMomentumShort(sh); + return (HtfBearBreak(sh) || ReclaimShort(sh) || LtfMomentumShort(sh) || PullbackShort(sh)); +} + +bool ConfirmLong(const int sh) +{ + return (RsiPullbackLong(sh) || MacdMomentumLong(sh) || InsideBarBreakLong(sh) || AsianBreakoutLong(sh)); +} + +bool ConfirmShort(const int sh) +{ + return (RsiPullbackShort(sh) || MacdMomentumShort(sh) || InsideBarBreakShort(sh) || AsianBreakoutShort(sh)); +} + +int ScoreLong(const int sh) +{ + int sc = 0; + if(HtfBullBreak(sh)) sc++; + if(ReclaimLong(sh)) sc++; + if(LtfMomentumLong(sh)) sc++; + if(PullbackLong(sh) && TrendLong(sh)) sc++; + if(RsiPullbackLong(sh)) sc++; + if(MacdMomentumLong(sh)) sc++; + if(InsideBarBreakLong(sh)) sc++; + if(AsianBreakoutLong(sh)) sc++; + return sc; +} + +int ScoreShort(const int sh) +{ + int sc = 0; + if(HtfBearBreak(sh)) sc++; + if(ReclaimShort(sh)) sc++; + if(LtfMomentumShort(sh)) sc++; + if(PullbackShort(sh) && TrendShort(sh)) sc++; + if(RsiPullbackShort(sh)) sc++; + if(MacdMomentumShort(sh)) sc++; + if(InsideBarBreakShort(sh)) sc++; + if(AsianBreakoutShort(sh)) sc++; + return sc; +} + +bool ComboLong(const int sh) +{ + if(ComboMode == 1) return (PrimaryLong(sh) && ConfirmLong(sh)); + if(ComboMode == 2) return (ScoreLong(sh) >= MinComboScore); + return (PrimaryLong(sh) || ConfirmLong(sh) || LtfMomentumLong(sh)); +} + +bool ComboShort(const int sh) +{ + if(ComboMode == 1) return (PrimaryShort(sh) && ConfirmShort(sh)); + if(ComboMode == 2) return (ScoreShort(sh) >= MinComboScore); + return (PrimaryShort(sh) || ConfirmShort(sh) || LtfMomentumShort(sh)); +} + +bool BuySignal(const int sh) +{ + if(!SessionOk() || !CompressionOk(sh)) return false; + if(!H1TrendLong(sh) || !AdxOk(sh)) return false; + int bias = DailyBias(sh); + if(UseDailyBias && bias < 0) return false; + return ComboLong(sh); +} + +bool SellSignal(const int sh) +{ + if(!SessionOk() || !CompressionOk(sh)) return false; + if(!H1TrendShort(sh) || !AdxOk(sh)) return false; + int bias = DailyBias(sh); + if(UseDailyBias && bias > 0) return false; + return ComboShort(sh); +} + +void ManagePosition(const int sh) +{ + if(!HasOurPosition()) return; + long type = PositionGetInteger(POSITION_TYPE); + double entry = PositionGetDouble(POSITION_PRICE_OPEN); + datetime openTime = (datetime)PositionGetInteger(POSITION_TIME); + int barsHeld = iBarShift(_Symbol, Timeframe, openTime); + int maxBars = MaxBarsInTrade; + if(ExtendHoldMomentum && InMomentumWindow()) maxBars = (int)(maxBars * 1.5); + + if(maxBars > 0 && barsHeld >= maxBars) + { + CloseOur("max_bars"); + return; + } + + double atr; + if(!Copy1(g_atrHandle, sh, 0, atr) || atr <= 0) return; + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + if(type == POSITION_TYPE_BUY) + { + double sl = entry - atr * AtrSlMult; + double tp = entry + atr * AtrTpMult; + double effSl = sl; + if(UseTrailing) + { + double candidate = bid - atr * TrailAtrMult; + if(candidate > entry) + { + if(g_trail <= 0 || candidate > g_trail) g_trail = candidate; + effSl = MathMax(sl, g_trail); + } + } + if(bid <= effSl) { CloseOur("sl_trail"); return; } + if(bid >= tp) { CloseOur("tp"); return; } + } + else + { + double sl = entry + atr * AtrSlMult; + double tp = entry - atr * AtrTpMult; + double effSl = sl; + if(UseTrailing) + { + double candidate = ask + atr * TrailAtrMult; + if(candidate < entry) + { + if(g_trail <= 0 || candidate < g_trail) g_trail = candidate; + effSl = MathMin(sl, g_trail); + } + } + if(ask >= effSl) { CloseOur("sl_trail"); return; } + if(ask <= tp) { CloseOur("tp"); return; } + } +} + +int OnInit() +{ + g_fastHandle = iMA(_Symbol, Timeframe, LtfFastEma, 0, MODE_EMA, PRICE_CLOSE); + g_slowHandle = iMA(_Symbol, Timeframe, LtfSlowEma, 0, MODE_EMA, PRICE_CLOSE); + g_atrHandle = iATR(_Symbol, Timeframe, AtrPeriod); + g_dailyEma = iMA(_Symbol, DailyTimeframe, DailyEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + g_rsiHandle = iRSI(_Symbol, Timeframe, RsiPeriod, PRICE_CLOSE); + g_macdHandle = iMACD(_Symbol, Timeframe, MacdFast, MacdSlow, MacdSignal, PRICE_CLOSE); + g_adxHandle = iADX(_Symbol, Timeframe, AdxPeriod); + g_h1EmaHandle = iMA(_Symbol, PERIOD_H1, H1EmaPeriod, 0, MODE_EMA, PRICE_CLOSE); + if(g_fastHandle == INVALID_HANDLE || g_slowHandle == INVALID_HANDLE || + g_atrHandle == INVALID_HANDLE || g_dailyEma == INVALID_HANDLE || + g_rsiHandle == INVALID_HANDLE || g_macdHandle == INVALID_HANDLE || + g_adxHandle == INVALID_HANDLE || g_h1EmaHandle == INVALID_HANDLE) + return INIT_FAILED; + g_trade.SetExpertMagicNumber(MagicNumber); + Print("[USDCHF Playbook v1.20] combo modules on ", _Symbol); + return INIT_SUCCEEDED; +} + +void OnDeinit(const int reason) +{ + if(g_fastHandle != INVALID_HANDLE) IndicatorRelease(g_fastHandle); + if(g_slowHandle != INVALID_HANDLE) IndicatorRelease(g_slowHandle); + if(g_atrHandle != INVALID_HANDLE) IndicatorRelease(g_atrHandle); + if(g_dailyEma != INVALID_HANDLE) IndicatorRelease(g_dailyEma); + if(g_rsiHandle != INVALID_HANDLE) IndicatorRelease(g_rsiHandle); + if(g_macdHandle != INVALID_HANDLE) IndicatorRelease(g_macdHandle); + if(g_adxHandle != INVALID_HANDLE) IndicatorRelease(g_adxHandle); + if(g_h1EmaHandle != INVALID_HANDLE) IndicatorRelease(g_h1EmaHandle); +} + +void OnTick() +{ + if(!IsNewBar()) return; + const int sh = 1; + ManagePosition(sh); + if(HasOurPosition()) return; + if(BuySignal(sh)) TryOpen(true); + else if(SellSignal(sh)) TryOpen(false); +} diff --git a/lab/EAs/USDCHF/USDCHF_Combo_Any.set b/lab/EAs/USDCHF/USDCHF_Combo_Any.set new file mode 100644 index 0000000..c723f94 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_Combo_Any.set @@ -0,0 +1,52 @@ +; ComboMode=0 任一模块触发(最多交易) +ComboMode=0 +MinComboScore=2 +AllowRsiPullback=true +RsiPeriod=14 +RsiBuyZone=42.0 +RsiSellZone=58.0 +AllowMacdMomentum=true +MacdFast=12 +MacdSlow=26 +MacdSignal=9 +AllowInsideBarBreak=true +AllowAsianBreakout=true +AsianStartHour=0 +AsianEndHour=8 +AsianBreakBufferPips=1.0 +UseH1TrendFilter=true +H1EmaPeriod=50 +UseAdxFilter=false +AdxPeriod=14 +AdxMin=20.0 +EntryMode=1 +AllowLtfPullback=true +AllowEmaCross=true +MinEmaGapPips=0.3 +UseDailyBias=true +DailyEmaPeriod=50 +HtfZoneBars=16 +MinBreakBodyRatio=0.45 +UseDoubleTrap=false +NyChaosStartHour=12 +NyChaosEndHour=15 +MomentumStartHour=14 +MomentumEndHour=22 +UseMomentumWindow=false +LotSize=0.10 +AtrPeriod=14 +AtrSlMult=1.6 +AtrTpMult=2.8 +UseTrailing=true +TrailAtrMult=1.0 +MaxBarsInTrade=48 +ExtendHoldMomentum=false +CooldownBars=1 +MaxSpreadPips=8 +UseCompressionFilter=false +CompressAtrRatio=0.70 +CompressLookback=48 +Timeframe=16388 +HtfTimeframe=16396 +DailyTimeframe=16408 +MagicNumber=20260625 diff --git a/lab/EAs/USDCHF/USDCHF_Combo_Confirm.set b/lab/EAs/USDCHF/USDCHF_Combo_Confirm.set new file mode 100644 index 0000000..54efcb8 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_Combo_Confirm.set @@ -0,0 +1,52 @@ +; ComboMode=1 主信号(H4/陷阱/LTF) + 至少一个确认(RSI/MACD/内包线/亚盘) +ComboMode=1 +MinComboScore=2 +AllowRsiPullback=true +RsiPeriod=14 +RsiBuyZone=40.0 +RsiSellZone=60.0 +AllowMacdMomentum=true +MacdFast=12 +MacdSlow=26 +MacdSignal=9 +AllowInsideBarBreak=true +AllowAsianBreakout=true +AsianStartHour=0 +AsianEndHour=8 +AsianBreakBufferPips=1.0 +UseH1TrendFilter=true +H1EmaPeriod=50 +UseAdxFilter=true +AdxPeriod=14 +AdxMin=18.0 +EntryMode=1 +AllowLtfPullback=true +AllowEmaCross=true +MinEmaGapPips=0.5 +UseDailyBias=true +DailyEmaPeriod=66 +HtfZoneBars=20 +MinBreakBodyRatio=0.50 +UseDoubleTrap=false +NyChaosStartHour=12 +NyChaosEndHour=13 +MomentumStartHour=10 +MomentumEndHour=20 +UseMomentumWindow=true +LotSize=0.10 +AtrPeriod=14 +AtrSlMult=1.4 +AtrTpMult=2.8 +UseTrailing=true +TrailAtrMult=0.6 +MaxBarsInTrade=20 +ExtendHoldMomentum=false +CooldownBars=2 +MaxSpreadPips=10 +UseCompressionFilter=false +CompressAtrRatio=0.70 +CompressLookback=48 +Timeframe=16388 +HtfTimeframe=16396 +DailyTimeframe=16408 +MagicNumber=20260625 diff --git a/lab/EAs/USDCHF/USDCHF_Combo_Hybrid.set b/lab/EAs/USDCHF/USDCHF_Combo_Hybrid.set new file mode 100644 index 0000000..b030117 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_Combo_Hybrid.set @@ -0,0 +1,52 @@ +; ComboMode=2 评分>=2 + 超高频风控(推荐组合) +ComboMode=2 +MinComboScore=2 +AllowRsiPullback=true +RsiPeriod=14 +RsiBuyZone=42.0 +RsiSellZone=58.0 +AllowMacdMomentum=true +MacdFast=12 +MacdSlow=26 +MacdSignal=9 +AllowInsideBarBreak=true +AllowAsianBreakout=true +AsianStartHour=0 +AsianEndHour=8 +AsianBreakBufferPips=1.0 +UseH1TrendFilter=true +H1EmaPeriod=50 +UseAdxFilter=false +AdxPeriod=14 +AdxMin=18.0 +EntryMode=1 +AllowLtfPullback=true +AllowEmaCross=true +MinEmaGapPips=0.4 +UseDailyBias=true +DailyEmaPeriod=66 +HtfZoneBars=20 +MinBreakBodyRatio=0.50 +UseDoubleTrap=false +NyChaosStartHour=12 +NyChaosEndHour=13 +MomentumStartHour=10 +MomentumEndHour=20 +UseMomentumWindow=true +LotSize=0.10 +AtrPeriod=14 +AtrSlMult=1.4 +AtrTpMult=2.8 +UseTrailing=true +TrailAtrMult=0.6 +MaxBarsInTrade=20 +ExtendHoldMomentum=false +CooldownBars=2 +MaxSpreadPips=10 +UseCompressionFilter=false +CompressAtrRatio=0.70 +CompressLookback=48 +Timeframe=16388 +HtfTimeframe=16396 +DailyTimeframe=16408 +MagicNumber=20260625 diff --git a/lab/EAs/USDCHF/USDCHF_Combo_Score.set b/lab/EAs/USDCHF/USDCHF_Combo_Score.set new file mode 100644 index 0000000..4d63010 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_Combo_Score.set @@ -0,0 +1,52 @@ +; ComboMode=2 评分制:至少2个模块同时满足(质量+频率平衡) +ComboMode=2 +MinComboScore=2 +AllowRsiPullback=true +RsiPeriod=14 +RsiBuyZone=42.0 +RsiSellZone=58.0 +AllowMacdMomentum=true +MacdFast=12 +MacdSlow=26 +MacdSignal=9 +AllowInsideBarBreak=true +AllowAsianBreakout=true +AsianStartHour=0 +AsianEndHour=8 +AsianBreakBufferPips=1.0 +UseH1TrendFilter=true +H1EmaPeriod=50 +UseAdxFilter=false +AdxPeriod=14 +AdxMin=20.0 +EntryMode=3 +AllowLtfPullback=true +AllowEmaCross=true +MinEmaGapPips=0.4 +UseDailyBias=true +DailyEmaPeriod=50 +HtfZoneBars=16 +MinBreakBodyRatio=0.45 +UseDoubleTrap=true +NyChaosStartHour=12 +NyChaosEndHour=14 +MomentumStartHour=8 +MomentumEndHour=23 +UseMomentumWindow=false +LotSize=0.10 +AtrPeriod=14 +AtrSlMult=1.5 +AtrTpMult=2.5 +UseTrailing=true +TrailAtrMult=0.9 +MaxBarsInTrade=32 +ExtendHoldMomentum=false +CooldownBars=1 +MaxSpreadPips=8 +UseCompressionFilter=false +CompressAtrRatio=0.70 +CompressLookback=48 +Timeframe=16388 +HtfTimeframe=16396 +DailyTimeframe=16408 +MagicNumber=20260625 diff --git a/lab/EAs/USDCHF/USDCHF_Genetic_HighFreq.set b/lab/EAs/USDCHF/USDCHF_Genetic_HighFreq.set new file mode 100644 index 0000000..32b4df1 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_Genetic_HighFreq.set @@ -0,0 +1,42 @@ +; USDCHF Playbook — genetic optimization for HIGH trade count +; Format: Name=Default||Min||Step||Max||Y/N + +Timeframe=16388||16388||0||16388||N +HtfTimeframe=16396||16396||0||16396||N +DailyTimeframe=16408||16408||0||16408||N +MagicNumber=20260625||20260625||1||20260625||N +LotSize=0.10||0.10||0||0.10||N +AtrPeriod=14||14||1||14||N +ExtendHoldMomentum=false||false||0||true||Y +CompressLookback=48||48||1||48||N + +UseDailyBias=true||false||0||true||Y +DailyEmaPeriod=50||34||8||90||Y + +HtfZoneBars=16||8||4||24||Y +MinBreakBodyRatio=0.45||0.35||0.05||0.60||Y +UseDoubleTrap=false||false||0||true||Y + +NyChaosStartHour=12||11||1||14||Y +NyChaosEndHour=15||14||1||16||Y +MomentumStartHour=14||12||1||17||Y +MomentumEndHour=22||20||1||24||Y +UseMomentumWindow=false||false||0||true||Y + +LtfFastEma=8||5||1||12||Y +LtfSlowEma=21||16||2||34||Y +EntryMode=3||1||1||3||Y +AllowLtfPullback=true||true||0||true||Y +AllowEmaCross=true||false||0||true||Y +MinEmaGapPips=0.3||0.0||0.2||1.5||Y + +AtrSlMult=1.6||1.2||0.2||2.2||Y +AtrTpMult=2.8||2.0||0.3||4.5||Y +UseTrailing=true||false||0||true||Y +TrailAtrMult=1.0||0.7||0.2||1.5||Y +MaxBarsInTrade=48||24||8||80||Y +CooldownBars=1||1||1||3||Y +MaxSpreadPips=8||6||1||10||Y + +UseCompressionFilter=false||false||0||true||Y +CompressAtrRatio=0.70||0.55||0.05||0.85||Y diff --git a/lab/EAs/USDCHF/USDCHF_Genetic_Optimization.set b/lab/EAs/USDCHF/USDCHF_Genetic_Optimization.set new file mode 100644 index 0000000..aa78ea1 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_Genetic_Optimization.set @@ -0,0 +1,48 @@ +; USDCHF Playbook — genetic optimization ranges (M15) +; Format: Name=Default||Min||Step||Max||Y/N +; Load: Strategy Tester → Inputs → Load → Optimization → Genetic + +; === fixed === +Timeframe=16388||16388||0||16388||N +HtfTimeframe=16396||16396||0||16396||N +DailyTimeframe=16408||16408||0||16408||N +MagicNumber=20260625||20260625||1||20260625||N +LotSize=0.10||0.10||0||0.10||N +AtrPeriod=14||14||1||14||N +ExtendHoldMomentum=true||true||0||true||N +CompressLookback=48||48||1||48||N + +; === daily bias (rule 6) === +UseDailyBias=true||false||0||true||Y +DailyEmaPeriod=50||34||8||100||Y + +; === HTF zones (rule 3) === +HtfZoneBars=20||12||4||28||Y +MinBreakBodyRatio=0.55||0.45||0.05||0.70||Y + +; === double trap (rule 2) === +UseDoubleTrap=true||false||0||true||Y + +; === session (rules 1 & 4) === +NyChaosStartHour=12||11||1||14||Y +NyChaosEndHour=15||14||1||17||Y +MomentumStartHour=15||14||1||17||Y +MomentumEndHour=2||1||1||4||Y + +; === LTF entry === +LtfFastEma=8||5||1||12||Y +LtfSlowEma=21||18||3||34||Y +EntryMode=1||0||1||2||Y + +; === risk / swing === +AtrSlMult=1.8||1.4||0.2||2.6||Y +AtrTpMult=4.0||3.0||0.5||6.5||Y +UseTrailing=true||false||0||true||Y +TrailAtrMult=1.2||0.8||0.2||1.8||Y +MaxBarsInTrade=96||64||16||128||Y +CooldownBars=4||2||1||8||Y +MaxSpreadPips=8||6||1||10||Y + +; === news compression (rule 5) === +UseCompressionFilter=true||false||0||true||Y +CompressAtrRatio=0.70||0.55||0.05||0.85||Y diff --git a/lab/EAs/USDCHF/USDCHF_Genetic_UltraFreq.set b/lab/EAs/USDCHF/USDCHF_Genetic_UltraFreq.set new file mode 100644 index 0000000..1d179dd --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_Genetic_UltraFreq.set @@ -0,0 +1,40 @@ +; USDCHF — genetic optimize for ~daily trade frequency +Timeframe=16388||16388||0||16388||N +HtfTimeframe=16396||16396||0||16396||N +DailyTimeframe=16408||16408||0||16408||N +MagicNumber=20260625||20260625||1||20260625||N +LotSize=0.10||0.10||0||0.10||N +AtrPeriod=14||14||1||14||N +ExtendHoldMomentum=false||false||0||false||N +CompressLookback=48||48||1||48||N + +UseDailyBias=false||false||0||true||Y +DailyEmaPeriod=50||34||8||90||Y + +HtfZoneBars=12||8||2||20||Y +MinBreakBodyRatio=0.40||0.30||0.05||0.55||Y +UseDoubleTrap=false||false||0||true||Y + +NyChaosStartHour=12||11||1||14||Y +NyChaosEndHour=14||13||1||16||Y +MomentumStartHour=8||6||1||12||Y +MomentumEndHour=23||20||1||24||Y +UseMomentumWindow=false||false||0||true||Y + +LtfFastEma=6||5||1||9||Y +LtfSlowEma=18||14||2||24||Y +EntryMode=3||3||1||3||N +AllowLtfPullback=true||true||0||true||Y +AllowEmaCross=true||true||0||true||Y +MinEmaGapPips=0.0||0.0||0.2||0.8||Y + +AtrSlMult=1.3||1.0||0.1||1.8||Y +AtrTpMult=1.8||1.4||0.2||2.8||Y +UseTrailing=true||false||0||true||Y +TrailAtrMult=0.8||0.6||0.1||1.2||Y +MaxBarsInTrade=20||12||4||36||Y +CooldownBars=0||0||1||2||Y +MaxSpreadPips=8||6||1||10||Y + +UseCompressionFilter=false||false||0||true||Y +CompressAtrRatio=0.70||0.55||0.05||0.85||Y diff --git a/lab/EAs/USDCHF/USDCHF_HighFreq.set b/lab/EAs/USDCHF/USDCHF_HighFreq.set new file mode 100644 index 0000000..9c17d47 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_HighFreq.set @@ -0,0 +1,34 @@ +; USDCHF Playbook — high-frequency defaults (LTF momentum, avoid NY chaos only) +Timeframe=16388 +HtfTimeframe=16396 +DailyTimeframe=16408 +MagicNumber=20260625 +UseDailyBias=true +DailyEmaPeriod=50 +HtfZoneBars=16 +MinBreakBodyRatio=0.45 +UseDoubleTrap=false +NyChaosStartHour=12 +NyChaosEndHour=15 +MomentumStartHour=14 +MomentumEndHour=22 +LtfFastEma=8 +LtfSlowEma=21 +EntryMode=3 +AllowLtfPullback=true +AllowEmaCross=true +MinEmaGapPips=0.3 +LotSize=0.10 +AtrPeriod=14 +AtrSlMult=1.6 +AtrTpMult=2.8 +UseTrailing=true +TrailAtrMult=1.0 +MaxBarsInTrade=48 +ExtendHoldMomentum=false +CooldownBars=1 +MaxSpreadPips=8 +UseCompressionFilter=false +CompressAtrRatio=0.70 +CompressLookback=48 +UseMomentumWindow=false diff --git a/lab/EAs/USDCHF/USDCHF_Playbook.set b/lab/EAs/USDCHF/USDCHF_Playbook.set new file mode 100644 index 0000000..af452c4 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_Playbook.set @@ -0,0 +1,25 @@ +; USDCHF Playbook optimized +Timeframe=15 +UseDailyBias=true +DailyEmaPeriod=50 +HtfZoneBars=16 +MinBreakBodyRatio=0.51 +UseDoubleTrap=false +NyChaosStartHour=13 +NyChaosEndHour=14 +MomentumStartHour=15 +MomentumEndHour=2 +LtfFastEma=8 +LtfSlowEma=21 +EntryMode=1 +AtrPeriod=14 +AtrSlMult=2.14 +AtrTpMult=3.6 +UseTrailing=true +TrailAtrMult=1.2 +MaxBarsInTrade=96 +ExtendHoldMomentum=true +CooldownBars=4 +UseCompressionFilter=true +CompressAtrRatio=0.7 +LotSize=0.1 diff --git a/lab/EAs/USDCHF/USDCHF_UltraFreq.set b/lab/EAs/USDCHF/USDCHF_UltraFreq.set new file mode 100644 index 0000000..8da205e --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_UltraFreq.set @@ -0,0 +1,34 @@ +; USDCHF — ultra frequency preset (shorter holds, no cooldown) +Timeframe=16388 +HtfTimeframe=16396 +DailyTimeframe=16408 +MagicNumber=20260625 +UseDailyBias=false +DailyEmaPeriod=50 +HtfZoneBars=12 +MinBreakBodyRatio=0.35 +UseDoubleTrap=false +NyChaosStartHour=12 +NyChaosEndHour=14 +MomentumStartHour=8 +MomentumEndHour=23 +LtfFastEma=6 +LtfSlowEma=18 +EntryMode=3 +AllowLtfPullback=true +AllowEmaCross=true +MinEmaGapPips=0.0 +LotSize=0.10 +AtrPeriod=14 +AtrSlMult=1.3 +AtrTpMult=1.8 +UseTrailing=true +TrailAtrMult=0.8 +MaxBarsInTrade=20 +ExtendHoldMomentum=false +CooldownBars=0 +MaxSpreadPips=8 +UseCompressionFilter=false +CompressAtrRatio=0.70 +CompressLookback=48 +UseMomentumWindow=false diff --git a/lab/EAs/USDCHF/USDCHF_optimized.set b/lab/EAs/USDCHF/USDCHF_optimized.set new file mode 100644 index 0000000..2539dd6 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_optimized.set @@ -0,0 +1,30 @@ +; USDCHF Playbook — MT5 genetic optimization best +Timeframe=16388 +HtfTimeframe=16396 +DailyTimeframe=16408 +MagicNumber=20260625 +LotSize=0.10 +AtrPeriod=14 +ExtendHoldMomentum=true +CompressLookback=48 +UseDailyBias=false +DailyEmaPeriod=82 +HtfZoneBars=8 +MinBreakBodyRatio=0.45 +UseDoubleTrap=true +NyChaosStartHour=14 +NyChaosEndHour=16 +MomentumStartHour=12 +MomentumEndHour=23 +LtfFastEma=11 +LtfSlowEma=24 +EntryMode=3 +AtrSlMult=2.2 +AtrTpMult=4.4 +UseTrailing=true +TrailAtrMult=1.5 +MaxBarsInTrade=80 +CooldownBars=2 +MaxSpreadPips=9 +UseCompressionFilter=false +CompressAtrRatio=0.55 diff --git a/lab/EAs/USDCHF/USDCHF_optimized_balanced.set b/lab/EAs/USDCHF/USDCHF_optimized_balanced.set new file mode 100644 index 0000000..0c70b34 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_optimized_balanced.set @@ -0,0 +1,30 @@ +; USDCHF Playbook — MT5 genetic optimization best +Timeframe=16388 +HtfTimeframe=16396 +DailyTimeframe=16408 +MagicNumber=20260625 +LotSize=0.10 +AtrPeriod=14 +ExtendHoldMomentum=true +CompressLookback=48 +UseDailyBias=false +DailyEmaPeriod=82 +HtfZoneBars=20 +MinBreakBodyRatio=0.40 +UseDoubleTrap=true +NyChaosStartHour=14 +NyChaosEndHour=16 +MomentumStartHour=12 +MomentumEndHour=22 +LtfFastEma=11 +LtfSlowEma=24 +EntryMode=3 +AtrSlMult=2.2 +AtrTpMult=2.0 +UseTrailing=false +TrailAtrMult=0.7 +MaxBarsInTrade=72 +CooldownBars=3 +MaxSpreadPips=8 +UseCompressionFilter=true +CompressAtrRatio=0.55 diff --git a/lab/EAs/USDCHF/USDCHF_optimized_ultrafreq.set b/lab/EAs/USDCHF/USDCHF_optimized_ultrafreq.set new file mode 100644 index 0000000..338ea22 --- /dev/null +++ b/lab/EAs/USDCHF/USDCHF_optimized_ultrafreq.set @@ -0,0 +1,34 @@ +; USDCHF — MT5 ultra-freq genetic best (pass 6622) +Timeframe=16388 +HtfTimeframe=16396 +DailyTimeframe=16408 +MagicNumber=20260625 +UseDailyBias=true +DailyEmaPeriod=66 +HtfZoneBars=20 +MinBreakBodyRatio=0.50 +UseDoubleTrap=false +NyChaosStartHour=12 +NyChaosEndHour=13 +MomentumStartHour=10 +MomentumEndHour=20 +LtfFastEma=7 +LtfSlowEma=24 +EntryMode=3 +AllowLtfPullback=true +AllowEmaCross=false +MinEmaGapPips=0.6 +LotSize=0.10 +AtrPeriod=14 +AtrSlMult=1.4 +AtrTpMult=2.8 +UseTrailing=true +TrailAtrMult=0.6 +MaxBarsInTrade=20 +ExtendHoldMomentum=false +CooldownBars=2 +MaxSpreadPips=10 +UseCompressionFilter=false +CompressAtrRatio=0.70 +CompressLookback=48 +UseMomentumWindow=true diff --git a/lab/EAs/USDCHF/best_params.json b/lab/EAs/USDCHF/best_params.json new file mode 100644 index 0000000..e90bfe6 --- /dev/null +++ b/lab/EAs/USDCHF/best_params.json @@ -0,0 +1,39 @@ +{ + "metrics": { + "net_profit": 2632.999999999998, + "total_trades": 397, + "profit_factor": 3.192540532438441, + "win_rate": 80.85642317380352, + "max_drawdown_pct": 0.5389938096778568, + "sharpe": 4.378118012191507 + }, + "params": { + "daily_ema_period": 50, + "use_daily_bias": true, + "htf_zone_bars": 16, + "min_break_body_ratio": 0.51, + "use_double_trap": false, + "trap_lookback": 6, + "ny_chaos_start": 13, + "ny_chaos_end": 14, + "momentum_start": 15, + "momentum_end": 2, + "ltf_fast_ema": 8, + "ltf_slow_ema": 21, + "entry_mode": 1, + "atr_period": 14, + "atr_sl_mult": 2.14, + "atr_tp_mult": 3.6, + "use_trailing": true, + "trail_atr_mult": 1.2, + "max_bars_in_trade": 96, + "extend_hold_in_momentum": true, + "use_compression_filter": true, + "compress_atr_ratio": 0.7, + "compress_lookback": 48, + "cooldown_bars": 4, + "max_spread_pips": 8.0, + "lot_size": 0.1, + "initial_balance": 10000.0 + } +} \ No newline at end of file diff --git a/lab/EAs/USDCHF/best_trades.csv b/lab/EAs/USDCHF/best_trades.csv new file mode 100644 index 0000000..4653e68 --- /dev/null +++ b/lab/EAs/USDCHF/best_trades.csv @@ -0,0 +1,398 @@ +side,open_time,close_time,profit,exit_reason +BUY,2023-05-18 17:00:00,2023-05-19 04:00:00,4.01,trail +BUY,2023-05-24 17:00:00,2023-05-25 09:00:00,7.7,trail +BUY,2023-05-31 17:00:00,2023-05-31 18:00:00,21.8,trail +SELL,2023-06-08 15:00:00,2023-06-08 16:00:00,71.2,trail +SELL,2023-06-08 19:00:00,2023-06-09 08:00:00,8.75,trail +SELL,2023-06-14 15:00:00,2023-06-14 16:00:00,35.78,trail +SELL,2023-06-14 19:00:00,2023-06-14 21:00:00,-32.01,sl +SELL,2023-06-15 17:00:00,2023-06-16 08:00:00,45.95,tp +SELL,2023-07-07 15:00:00,2023-07-07 16:00:00,24.16,trail +SELL,2023-07-07 19:00:00,2023-07-10 00:00:00,7.23,trail +SELL,2023-07-10 21:00:00,2023-07-11 09:00:00,29.36,trail +SELL,2023-07-11 17:00:00,2023-07-11 18:00:00,2.76,trail +SELL,2023-07-11 21:00:00,2023-07-12 05:00:00,13.36,trail +SELL,2023-07-12 15:00:00,2023-07-12 16:00:00,87.92,trail +SELL,2023-07-12 19:00:00,2023-07-13 08:00:00,12.44,trail +SELL,2023-07-13 17:00:00,2023-07-14 08:00:00,14.83,trail +SELL,2023-07-26 21:00:00,2023-07-26 22:00:00,21.99,trail +SELL,2023-08-04 17:00:00,2023-08-07 02:00:00,-35.69,sl +BUY,2023-08-24 15:00:00,2023-08-25 00:00:00,19.3,trail +BUY,2023-08-25 00:00:00,2023-08-25 09:00:00,10.83,trail +SELL,2023-08-29 17:00:00,2023-08-29 18:00:00,42.0,trail +SELL,2023-08-30 15:00:00,2023-08-30 16:00:00,33.7,trail +BUY,2023-09-01 17:00:00,2023-09-01 18:00:00,18.7,trail +BUY,2023-09-18 15:00:00,2023-09-18 15:30:00,2.83,trail +BUY,2023-09-18 16:00:00,2023-09-18 18:30:00,-14.13,sl +BUY,2023-09-20 20:15:00,2023-09-20 21:00:00,38.66,trail +BUY,2023-09-20 21:15:00,2023-09-20 21:30:00,-22.58,sl +BUY,2023-09-20 22:15:00,2023-09-21 03:15:00,13.9,trail +BUY,2023-09-26 20:15:00,2023-09-26 22:00:00,7.53,trail +BUY,2023-09-26 22:00:00,2023-09-27 00:00:00,-10.14,sl +BUY,2023-09-27 00:00:00,2023-09-27 00:15:00,-14.0,sl +BUY,2023-09-27 16:15:00,2023-09-27 16:30:00,4.49,trail +BUY,2023-09-27 17:15:00,2023-09-27 20:00:00,8.2,trail +BUY,2023-09-27 20:00:00,2023-09-27 20:15:00,6.19,trail +BUY,2023-10-03 15:00:00,2023-10-03 17:00:00,9.78,trail +BUY,2023-10-12 20:15:00,2023-10-13 05:45:00,-10.71,sl +SELL,2023-10-19 16:15:00,2023-10-19 18:00:00,2.94,trail +SELL,2023-10-19 18:00:00,2023-10-19 18:45:00,7.47,trail +SELL,2023-10-19 19:00:00,2023-10-19 19:15:00,10.65,trail +SELL,2023-10-19 20:00:00,2023-10-20 01:00:00,17.88,trail +BUY,2023-10-26 16:15:00,2023-10-26 17:00:00,16.83,trail +BUY,2023-10-26 17:15:00,2023-10-27 00:00:00,-15.16,sl +BUY,2023-10-31 16:15:00,2023-10-31 17:00:00,18.5,trail +BUY,2023-10-31 17:15:00,2023-10-31 17:45:00,4.8100000000000005,trail +BUY,2023-10-31 18:15:00,2023-10-31 18:45:00,9.04,trail +BUY,2023-10-31 19:15:00,2023-10-31 20:00:00,-20.1,sl +SELL,2023-11-03 15:00:00,2023-11-03 15:30:00,52.81,trail +SELL,2023-11-03 16:00:00,2023-11-03 17:00:00,-25.47,sl +BUY,2023-11-09 20:15:00,2023-11-09 21:00:00,8.33,trail +BUY,2023-11-09 21:15:00,2023-11-09 21:30:00,9.4,trail +BUY,2023-11-09 22:15:00,2023-11-10 00:45:00,-14.2,sl +SELL,2023-11-14 15:00:00,2023-11-14 15:15:00,1.3900000000000001,trail +SELL,2023-11-14 16:00:00,2023-11-14 17:00:00,48.45,tp +SELL,2023-11-14 17:00:00,2023-11-14 18:00:00,3.7199999999999998,trail +SELL,2023-11-14 18:00:00,2023-11-14 21:45:00,30.6,tp +SELL,2023-11-14 21:45:00,2023-11-15 00:00:00,20.6,trail +SELL,2023-11-15 00:00:00,2023-11-15 00:45:00,0.35,trail +SELL,2023-11-24 16:15:00,2023-11-24 16:45:00,5.96,trail +SELL,2023-11-24 17:15:00,2023-11-24 21:00:00,0.35,trail +SELL,2023-11-27 15:00:00,2023-11-28 00:00:00,12.0,trail +SELL,2023-12-13 20:15:00,2023-12-13 20:45:00,3.88,trail +SELL,2023-12-13 21:15:00,2023-12-13 21:30:00,24.14,trail +SELL,2023-12-13 22:15:00,2023-12-14 05:00:00,31.22,tp +SELL,2023-12-14 16:15:00,2023-12-14 17:00:00,22.8,trail +SELL,2023-12-14 17:15:00,2023-12-14 20:00:00,18.33,trail +SELL,2023-12-14 20:00:00,2023-12-14 20:45:00,-29.57,sl +SELL,2023-12-19 15:00:00,2023-12-19 16:45:00,17.44,trail +SELL,2023-12-21 15:00:00,2023-12-21 15:30:00,19.28,trail +SELL,2023-12-21 16:00:00,2023-12-21 16:30:00,6.34,trail +SELL,2023-12-21 20:15:00,2023-12-21 23:15:00,25.79,tp +SELL,2023-12-21 23:15:00,2023-12-22 00:00:00,0.9,trail +SELL,2023-12-22 15:00:00,2023-12-22 15:30:00,-17.66,sl +SELL,2023-12-22 16:00:00,2023-12-22 17:30:00,-23.47,sl +SELL,2023-12-27 16:15:00,2023-12-27 16:45:00,2.88,trail +SELL,2023-12-27 17:15:00,2023-12-27 17:45:00,28.52,trail +SELL,2023-12-27 18:15:00,2023-12-27 19:00:00,11.47,trail +SELL,2023-12-27 19:15:00,2023-12-28 00:00:00,14.81,trail +SELL,2023-12-28 00:15:00,2023-12-28 03:45:00,12.58,trail +BUY,2024-01-18 15:00:00,2024-01-18 15:30:00,13.34,trail +BUY,2024-01-18 16:00:00,2024-01-19 00:00:00,-13.7,sl +BUY,2024-01-23 16:15:00,2024-01-23 16:30:00,14.39,trail +BUY,2024-01-23 17:15:00,2024-01-23 17:30:00,6.65,trail +BUY,2024-01-23 18:15:00,2024-01-23 23:30:00,-13.36,sl +SELL,2024-01-24 15:00:00,2024-01-24 15:15:00,16.25,trail +SELL,2024-01-24 16:00:00,2024-01-24 16:45:00,-20.84,sl +BUY,2024-02-02 16:15:00,2024-02-02 17:00:00,7.33,trail +BUY,2024-02-02 17:15:00,2024-02-02 20:30:00,20.71,trail +BUY,2024-02-08 15:00:00,2024-02-08 15:30:00,5.24,trail +BUY,2024-02-08 16:00:00,2024-02-08 16:30:00,-15.78,sl +BUY,2024-02-12 15:00:00,2024-02-12 15:15:00,-0.26,trail +BUY,2024-02-12 16:00:00,2024-02-12 18:15:00,-14.59,sl +BUY,2024-02-13 15:00:00,2024-02-13 15:30:00,62.14,trail +BUY,2024-02-13 16:00:00,2024-02-13 17:00:00,1.8900000000000001,trail +BUY,2024-02-29 16:15:00,2024-02-29 16:30:00,10.08,trail +BUY,2024-02-29 17:15:00,2024-02-29 17:45:00,7.96,trail +BUY,2024-02-29 18:15:00,2024-02-29 19:15:00,19.36,trail +BUY,2024-02-29 19:15:00,2024-03-01 00:00:00,5.32,trail +BUY,2024-03-01 00:00:00,2024-03-01 08:15:00,2.32,trail +BUY,2024-03-01 15:00:00,2024-03-01 15:15:00,7.22,trail +BUY,2024-03-01 16:00:00,2024-03-01 16:45:00,6.49,trail +BUY,2024-03-14 16:15:00,2024-03-14 16:30:00,3.23,trail +BUY,2024-03-14 17:15:00,2024-03-14 18:00:00,13.22,trail +BUY,2024-03-14 18:15:00,2024-03-15 03:00:00,8.66,trail +BUY,2024-03-18 16:15:00,2024-03-18 16:45:00,0.84,trail +BUY,2024-03-18 17:15:00,2024-03-18 17:30:00,7.42,trail +BUY,2024-03-18 18:15:00,2024-03-18 20:15:00,20.84,tp +BUY,2024-03-21 16:15:00,2024-03-21 16:30:00,9.78,trail +BUY,2024-03-21 17:15:00,2024-03-22 00:00:00,-13.41,sl +BUY,2024-03-26 15:00:00,2024-03-26 15:30:00,10.12,trail +BUY,2024-03-26 16:00:00,2024-03-26 16:15:00,1.21,trail +BUY,2024-04-10 15:00:00,2024-04-10 15:15:00,-10.65,sl +BUY,2024-04-10 16:00:00,2024-04-10 16:30:00,14.0,trail +BUY,2024-04-10 17:00:00,2024-04-10 20:15:00,17.83,trail +BUY,2024-04-30 16:15:00,2024-04-30 17:30:00,-21.6,sl +BUY,2024-04-30 17:30:00,2024-04-30 17:45:00,34.73,trail +BUY,2024-04-30 18:30:00,2024-04-30 23:00:00,25.76,tp +BUY,2024-04-30 23:00:00,2024-05-01 00:00:00,-13.44,sl +BUY,2024-05-01 00:00:00,2024-05-01 00:45:00,-15.98,sl +BUY,2024-05-20 15:00:00,2024-05-20 15:15:00,3.55,trail +BUY,2024-05-20 16:00:00,2024-05-20 16:15:00,-12.26,sl +SELL,2024-05-30 15:00:00,2024-05-30 15:15:00,4.46,trail +SELL,2024-05-30 16:00:00,2024-05-30 17:45:00,10.29,trail +SELL,2024-06-03 16:15:00,2024-06-03 17:00:00,27.52,trail +SELL,2024-06-03 17:15:00,2024-06-03 17:45:00,7.5600000000000005,trail +SELL,2024-06-03 18:15:00,2024-06-04 00:00:00,12.49,trail +SELL,2024-06-04 16:15:00,2024-06-04 16:30:00,5.61,trail +SELL,2024-06-04 17:15:00,2024-06-04 17:45:00,12.62,trail +SELL,2024-06-04 18:15:00,2024-06-04 20:45:00,9.55,trail +SELL,2024-06-12 15:00:00,2024-06-12 15:15:00,3.7,trail +SELL,2024-06-12 16:00:00,2024-06-12 17:00:00,-20.35,sl +SELL,2024-06-18 00:30:00,2024-06-18 02:30:00,3.18,trail +SELL,2024-06-18 15:00:00,2024-06-18 15:30:00,24.26,trail +SELL,2024-06-18 16:00:00,2024-06-18 16:30:00,16.18,trail +BUY,2024-06-27 20:15:00,2024-06-28 00:00:00,3.94,trail +BUY,2024-07-01 15:00:00,2024-07-01 15:30:00,6.61,trail +BUY,2024-07-01 16:00:00,2024-07-01 16:30:00,-12.44,sl +SELL,2024-07-05 20:15:00,2024-07-05 21:15:00,8.61,trail +SELL,2024-07-05 21:15:00,2024-07-08 00:00:00,7.78,trail +SELL,2024-07-08 00:00:00,2024-07-08 00:15:00,0.8,trail +BUY,2024-07-10 16:15:00,2024-07-10 16:30:00,3.96,trail +BUY,2024-07-10 17:15:00,2024-07-10 18:15:00,0.44,trail +BUY,2024-07-10 18:15:00,2024-07-10 21:00:00,0.32,trail +SELL,2024-07-11 15:00:00,2024-07-11 15:15:00,-6.96,sl +SELL,2024-07-11 16:00:00,2024-07-11 16:15:00,2.75,trail +SELL,2024-07-17 16:15:00,2024-07-17 16:30:00,-0.18,trail +SELL,2024-07-17 17:15:00,2024-07-17 21:00:00,7.87,trail +SELL,2024-07-24 15:00:00,2024-07-24 15:45:00,12.58,trail +SELL,2024-07-24 16:00:00,2024-07-24 16:30:00,3.89,trail +SELL,2024-07-31 15:00:00,2024-07-31 15:15:00,13.09,trail +SELL,2024-07-31 16:00:00,2024-07-31 17:00:00,7.02,trail +SELL,2024-08-01 16:15:00,2024-08-01 17:00:00,17.23,trail +SELL,2024-08-01 17:15:00,2024-08-01 17:30:00,1.97,trail +SELL,2024-08-01 18:15:00,2024-08-01 19:15:00,3.81,trail +SELL,2024-08-01 19:15:00,2024-08-01 22:30:00,8.11,trail +SELL,2024-08-02 15:00:00,2024-08-02 15:30:00,59.86,trail +SELL,2024-08-02 16:00:00,2024-08-02 16:45:00,3.57,trail +SELL,2024-08-05 15:00:00,2024-08-05 15:15:00,7.67,trail +SELL,2024-08-05 16:00:00,2024-08-05 16:45:00,-49.05,sl +SELL,2024-08-20 16:15:00,2024-08-20 17:45:00,12.5,trail +SELL,2024-08-20 17:45:00,2024-08-20 21:45:00,23.51,tp +SELL,2024-08-20 21:45:00,2024-08-20 23:15:00,12.44,trail +SELL,2024-08-20 23:15:00,2024-08-21 01:00:00,3.49,trail +SELL,2024-08-21 16:15:00,2024-08-21 17:00:00,5.53,trail +SELL,2024-08-21 17:15:00,2024-08-21 17:30:00,-23.71,sl +SELL,2024-08-21 18:15:00,2024-08-21 21:00:00,26.47,trail +SELL,2024-08-27 16:15:00,2024-08-27 16:45:00,8.99,trail +SELL,2024-08-27 17:15:00,2024-08-27 17:30:00,5.67,trail +SELL,2024-08-27 18:15:00,2024-08-27 20:00:00,3.44,trail +SELL,2024-08-27 20:00:00,2024-08-27 23:30:00,19.92,tp +SELL,2024-08-27 23:30:00,2024-08-28 04:15:00,-10.38,sl +SELL,2024-09-04 20:15:00,2024-09-04 22:45:00,7.59,trail +SELL,2024-09-04 22:45:00,2024-09-05 00:00:00,7.13,trail +SELL,2024-09-05 00:00:00,2024-09-05 02:30:00,3.71,trail +SELL,2024-09-06 00:15:00,2024-09-06 03:30:00,0.72,trail +SELL,2024-09-24 16:15:00,2024-09-24 17:00:00,8.17,trail +SELL,2024-09-24 17:15:00,2024-09-24 17:30:00,-0.26,trail +SELL,2024-09-24 18:15:00,2024-09-24 22:30:00,24.5,tp +SELL,2024-09-24 22:30:00,2024-09-25 01:45:00,7.84,trail +SELL,2024-09-25 01:45:00,2024-09-25 03:00:00,8.85,trail +SELL,2024-09-27 15:00:00,2024-09-27 15:30:00,15.97,trail +SELL,2024-09-27 16:00:00,2024-09-27 17:15:00,-24.87,sl +SELL,2024-09-27 20:15:00,2024-09-30 01:00:00,10.88,trail +BUY,2024-10-04 15:00:00,2024-10-04 15:30:00,76.51,trail +BUY,2024-10-04 16:00:00,2024-10-04 22:30:00,-16.46,sl +BUY,2024-10-09 16:15:00,2024-10-09 17:30:00,9.16,trail +BUY,2024-10-09 17:30:00,2024-10-09 17:45:00,1.25,trail +BUY,2024-10-09 18:30:00,2024-10-09 21:45:00,19.59,tp +BUY,2024-10-09 21:45:00,2024-10-10 00:00:00,-10.54,sl +BUY,2024-10-14 15:00:00,2024-10-14 15:15:00,4.04,trail +BUY,2024-10-14 16:00:00,2024-10-14 19:30:00,1.8399999999999999,trail +BUY,2024-10-28 00:15:00,2024-10-28 01:00:00,6.82,trail +BUY,2024-10-28 01:15:00,2024-10-28 03:30:00,3.45,trail +BUY,2024-11-06 15:00:00,2024-11-06 17:00:00,-27.78,sl +BUY,2024-11-11 15:00:00,2024-11-11 15:30:00,3.36,trail +BUY,2024-11-11 16:00:00,2024-11-11 16:45:00,3.62,trail +BUY,2024-11-11 20:15:00,2024-11-11 21:45:00,3.4,trail +BUY,2024-11-11 21:45:00,2024-11-12 00:00:00,-8.77,sl +BUY,2024-11-12 00:00:00,2024-11-12 00:15:00,-11.22,sl +BUY,2024-11-12 01:00:00,2024-11-12 03:15:00,3.51,trail +BUY,2024-11-13 16:15:00,2024-11-13 16:30:00,14.91,trail +BUY,2024-11-13 17:15:00,2024-11-13 21:15:00,11.61,trail +BUY,2024-11-13 21:15:00,2024-11-14 00:00:00,-13.71,sl +BUY,2024-11-14 00:00:00,2024-11-14 01:00:00,1.78,trail +BUY,2024-11-14 01:00:00,2024-11-14 03:00:00,4.47,trail +BUY,2024-11-22 15:00:00,2024-11-22 15:30:00,23.68,trail +BUY,2024-11-22 16:00:00,2024-11-22 16:30:00,6.58,trail +BUY,2024-12-10 16:15:00,2024-12-10 16:30:00,2.45,trail +BUY,2024-12-10 17:15:00,2024-12-10 21:45:00,1.45,trail +BUY,2024-12-12 20:15:00,2024-12-12 23:15:00,25.57,tp +BUY,2024-12-12 23:15:00,2024-12-13 00:00:00,-14.8,sl +BUY,2024-12-18 20:15:00,2024-12-18 21:00:00,49.95,trail +BUY,2024-12-18 21:15:00,2024-12-18 21:30:00,9.0,trail +BUY,2024-12-18 22:15:00,2024-12-18 22:45:00,2.89,trail +BUY,2024-12-18 23:15:00,2024-12-19 02:00:00,11.35,trail +BUY,2024-12-24 16:15:00,2024-12-24 17:15:00,-0.31,trail +BUY,2024-12-24 17:15:00,2024-12-24 17:45:00,3.75,trail +BUY,2024-12-24 18:15:00,2024-12-24 21:15:00,-11.29,sl +BUY,2024-12-27 16:15:00,2024-12-27 16:30:00,1.54,trail +BUY,2024-12-27 17:15:00,2024-12-27 20:30:00,6.72,trail +BUY,2024-12-30 15:00:00,2024-12-30 15:45:00,21.87,trail +BUY,2024-12-30 16:00:00,2024-12-30 20:30:00,-18.63,sl +BUY,2024-12-31 16:15:00,2024-12-31 17:30:00,2.09,trail +BUY,2024-12-31 17:30:00,2024-12-31 18:30:00,6.96,trail +BUY,2024-12-31 18:30:00,2024-12-31 21:15:00,10.73,trail +BUY,2025-01-02 15:00:00,2025-01-02 15:30:00,0.22,trail +BUY,2025-01-02 16:00:00,2025-01-02 17:15:00,6.2,trail +BUY,2025-01-02 17:15:00,2025-01-02 17:45:00,0.91,trail +BUY,2025-01-02 18:15:00,2025-01-02 18:30:00,1.22,trail +BUY,2025-01-02 19:15:00,2025-01-02 22:15:00,5.0,trail +BUY,2025-01-10 15:00:00,2025-01-10 15:30:00,48.99,trail +BUY,2025-01-10 16:00:00,2025-01-13 00:00:00,-13.06,sl +BUY,2025-01-29 15:00:00,2025-01-29 15:15:00,8.79,trail +BUY,2025-01-29 16:00:00,2025-01-29 16:45:00,-13.83,sl +BUY,2025-02-07 15:00:00,2025-02-07 15:15:00,0.96,trail +BUY,2025-02-07 16:00:00,2025-02-07 16:15:00,-19.17,sl +BUY,2025-02-10 00:15:00,2025-02-10 05:00:00,11.55,trail +BUY,2025-02-11 15:00:00,2025-02-11 15:30:00,1.5,trail +BUY,2025-02-11 16:00:00,2025-02-11 17:15:00,0.13,trail +BUY,2025-02-12 15:00:00,2025-02-12 15:15:00,0.42,trail +BUY,2025-02-12 16:00:00,2025-02-12 19:00:00,-20.33,sl +SELL,2025-02-14 15:00:00,2025-02-14 15:30:00,14.94,trail +SELL,2025-02-14 16:00:00,2025-02-14 16:30:00,4.4,trail +SELL,2025-02-20 16:15:00,2025-02-20 16:30:00,6.09,trail +SELL,2025-02-20 17:15:00,2025-02-20 17:45:00,12.45,trail +SELL,2025-02-20 18:15:00,2025-02-20 19:00:00,7.97,trail +SELL,2025-02-20 19:15:00,2025-02-21 00:00:00,13.89,trail +SELL,2025-02-25 15:00:00,2025-02-25 15:30:00,2.18,trail +SELL,2025-02-25 16:00:00,2025-02-25 17:00:00,2.79,trail +SELL,2025-03-18 16:15:00,2025-03-18 17:15:00,6.61,trail +SELL,2025-03-18 17:15:00,2025-03-18 17:30:00,3.17,trail +SELL,2025-03-18 18:15:00,2025-03-18 18:30:00,7.12,trail +SELL,2025-03-18 19:15:00,2025-03-18 19:30:00,3.56,trail +SELL,2025-04-03 15:00:00,2025-04-03 16:00:00,2.55,trail +SELL,2025-04-03 16:00:00,2025-04-03 16:15:00,20.95,trail +SELL,2025-04-09 00:15:00,2025-04-09 03:15:00,14.52,trail +SELL,2025-04-09 15:00:00,2025-04-09 15:15:00,13.27,trail +SELL,2025-04-09 16:00:00,2025-04-09 16:30:00,-47.84,sl +SELL,2025-04-10 16:15:00,2025-04-10 17:45:00,50.96,trail +SELL,2025-04-10 17:45:00,2025-04-10 18:15:00,65.79,trail +SELL,2025-04-10 18:45:00,2025-04-11 02:15:00,29.6,trail +SELL,2025-04-28 16:15:00,2025-04-28 16:30:00,19.82,trail +SELL,2025-04-28 17:15:00,2025-04-28 17:30:00,37.77,trail +SELL,2025-04-28 18:15:00,2025-04-28 19:00:00,16.96,trail +SELL,2025-04-28 19:15:00,2025-04-28 19:45:00,23.39,trail +SELL,2025-04-28 20:15:00,2025-04-29 00:00:00,13.19,trail +SELL,2025-04-29 00:00:00,2025-04-29 01:15:00,-19.48,sl +SELL,2025-05-07 16:15:00,2025-05-07 17:00:00,2.1,trail +SELL,2025-05-07 17:15:00,2025-05-07 17:30:00,6.88,trail +SELL,2025-05-07 18:15:00,2025-05-07 21:00:00,5.59,trail +SELL,2025-05-20 20:15:00,2025-05-20 22:15:00,31.19,tp +SELL,2025-05-20 22:15:00,2025-05-21 01:00:00,36.45,trail +SELL,2025-05-21 01:00:00,2025-05-21 01:15:00,15.14,trail +SELL,2025-05-23 16:15:00,2025-05-23 17:45:00,12.51,trail +SELL,2025-05-23 17:45:00,2025-05-23 23:45:00,13.2,trail +SELL,2025-06-12 15:00:00,2025-06-12 15:30:00,15.67,trail +SELL,2025-06-12 16:00:00,2025-06-12 17:30:00,-27.22,sl +SELL,2025-06-13 00:15:00,2025-06-13 02:45:00,21.58,trail +SELL,2025-06-23 16:15:00,2025-06-23 16:30:00,4.63,trail +SELL,2025-06-23 17:15:00,2025-06-23 17:30:00,4.44,trail +SELL,2025-06-23 18:15:00,2025-06-23 20:15:00,1.02,trail +SELL,2025-06-24 15:00:00,2025-06-24 16:00:00,-0.38,trail +SELL,2025-06-24 16:00:00,2025-06-24 17:00:00,17.56,trail +SELL,2025-06-24 17:00:00,2025-06-24 17:15:00,36.03,trail +SELL,2025-06-24 18:00:00,2025-06-24 22:00:00,8.86,trail +SELL,2025-06-27 15:00:00,2025-06-27 15:30:00,16.59,trail +SELL,2025-06-27 16:00:00,2025-06-27 16:15:00,-24.29,sl +SELL,2025-06-30 16:15:00,2025-06-30 17:00:00,4.25,trail +SELL,2025-06-30 17:15:00,2025-06-30 17:30:00,11.81,trail +SELL,2025-06-30 18:15:00,2025-07-01 00:00:00,22.25,trail +SELL,2025-07-01 00:00:00,2025-07-01 03:00:00,6.3,trail +SELL,2025-07-10 00:15:00,2025-07-10 00:30:00,1.8900000000000001,trail +SELL,2025-07-10 01:15:00,2025-07-10 02:45:00,8.01,trail +SELL,2025-07-21 16:15:00,2025-07-21 17:00:00,5.62,trail +SELL,2025-07-21 17:15:00,2025-07-21 17:30:00,-0.13,trail +SELL,2025-07-21 18:15:00,2025-07-21 20:30:00,-15.96,sl +SELL,2025-07-22 16:15:00,2025-07-22 16:30:00,5.19,trail +SELL,2025-07-22 17:15:00,2025-07-22 17:45:00,4.52,trail +SELL,2025-07-22 18:15:00,2025-07-22 18:30:00,0.05,trail +SELL,2025-07-22 19:15:00,2025-07-23 00:00:00,4.85,trail +BUY,2025-07-30 15:00:00,2025-07-30 15:15:00,8.52,trail +BUY,2025-07-30 16:00:00,2025-07-30 16:15:00,13.47,trail +BUY,2025-07-30 20:15:00,2025-07-30 21:30:00,6.47,trail +BUY,2025-07-30 21:30:00,2025-07-30 21:45:00,33.26,trail +BUY,2025-07-30 22:30:00,2025-07-31 05:15:00,-17.19,sl +BUY,2025-08-11 15:00:00,2025-08-11 16:15:00,2.37,trail +BUY,2025-08-11 16:15:00,2025-08-11 17:00:00,7.8100000000000005,trail +BUY,2025-08-11 17:15:00,2025-08-11 18:30:00,0.39,trail +BUY,2025-08-11 18:30:00,2025-08-11 23:15:00,-11.07,sl +SELL,2025-08-20 16:15:00,2025-08-20 16:45:00,3.31,trail +SELL,2025-08-20 17:15:00,2025-08-20 17:45:00,4.96,trail +SELL,2025-08-20 18:15:00,2025-08-20 20:00:00,6.14,trail +SELL,2025-08-20 20:00:00,2025-08-21 00:15:00,5.17,trail +SELL,2025-08-22 16:15:00,2025-08-22 16:45:00,-11.97,sl +SELL,2025-08-22 17:15:00,2025-08-22 18:00:00,30.14,trail +SELL,2025-08-22 18:15:00,2025-08-25 00:00:00,5.51,trail +SELL,2025-08-29 16:15:00,2025-08-29 16:45:00,11.94,trail +SELL,2025-08-29 17:15:00,2025-08-29 17:30:00,16.23,trail +SELL,2025-08-29 18:15:00,2025-08-29 23:30:00,-12.07,sl +SELL,2025-09-05 15:00:00,2025-09-05 15:15:00,15.61,trail +SELL,2025-09-05 16:00:00,2025-09-05 16:15:00,0.91,trail +SELL,2025-09-05 17:00:00,2025-09-05 18:00:00,0.1,trail +SELL,2025-09-05 18:00:00,2025-09-05 19:30:00,12.29,trail +SELL,2025-09-05 19:30:00,2025-09-05 21:00:00,-21.11,sl +SELL,2025-09-08 15:00:00,2025-09-08 15:15:00,-0.01,trail +SELL,2025-09-08 16:00:00,2025-09-08 16:45:00,8.14,trail +SELL,2025-09-16 15:00:00,2025-09-16 15:15:00,-14.41,sl +SELL,2025-09-16 16:00:00,2025-09-16 16:15:00,8.21,trail +SELL,2025-09-16 17:00:00,2025-09-16 17:15:00,8.8,trail +SELL,2025-09-16 18:00:00,2025-09-16 20:30:00,14.95,trail +SELL,2025-09-30 16:15:00,2025-09-30 17:00:00,15.23,trail +SELL,2025-09-30 17:15:00,2025-09-30 18:15:00,-20.28,sl +SELL,2025-09-30 18:15:00,2025-09-30 19:30:00,9.44,trail +SELL,2025-09-30 19:30:00,2025-09-30 20:30:00,13.65,trail +BUY,2025-10-08 16:15:00,2025-10-08 16:45:00,5.78,trail +BUY,2025-10-08 17:15:00,2025-10-08 18:30:00,2.71,trail +BUY,2025-10-08 18:30:00,2025-10-08 18:45:00,3.89,trail +BUY,2025-10-08 19:30:00,2025-10-08 22:00:00,-13.12,sl +BUY,2025-10-09 16:15:00,2025-10-09 16:30:00,12.97,trail +BUY,2025-10-09 17:15:00,2025-10-09 18:00:00,10.51,trail +BUY,2025-10-09 18:15:00,2025-10-09 21:45:00,25.09,tp +SELL,2025-10-15 16:15:00,2025-10-15 16:30:00,4.07,trail +SELL,2025-10-15 17:15:00,2025-10-15 18:15:00,8.39,trail +SELL,2025-10-15 18:15:00,2025-10-15 18:30:00,23.48,trail +SELL,2025-10-15 19:15:00,2025-10-15 20:15:00,4.84,trail +SELL,2025-10-16 00:15:00,2025-10-16 00:45:00,-0.36,trail +SELL,2025-10-16 01:15:00,2025-10-16 03:30:00,11.8,trail +SELL,2025-10-16 20:15:00,2025-10-16 21:45:00,0.08,trail +SELL,2025-10-16 21:45:00,2025-10-17 02:45:00,17.75,tp +SELL,2025-10-28 16:15:00,2025-10-28 16:45:00,8.92,trail +SELL,2025-10-28 17:15:00,2025-10-28 17:30:00,6.82,trail +SELL,2025-10-28 18:15:00,2025-10-28 18:30:00,3.93,trail +SELL,2025-10-28 19:15:00,2025-10-29 05:15:00,-10.03,sl +BUY,2025-10-29 20:15:00,2025-10-29 21:00:00,8.08,trail +BUY,2025-10-29 21:15:00,2025-10-29 21:30:00,40.92,trail +BUY,2025-10-29 22:15:00,2025-10-30 00:00:00,-21.98,sl +BUY,2025-10-30 00:00:00,2025-10-30 03:15:00,7.6,trail +BUY,2025-10-30 15:00:00,2025-10-30 15:15:00,1.7,trail +BUY,2025-10-30 16:00:00,2025-10-30 17:00:00,-18.8,sl +BUY,2025-10-31 15:00:00,2025-10-31 15:30:00,0.81,trail +BUY,2025-10-31 16:00:00,2025-10-31 16:30:00,3.37,trail +BUY,2025-11-03 15:00:00,2025-11-03 15:30:00,3.05,trail +BUY,2025-11-03 16:00:00,2025-11-03 16:45:00,2.05,trail +BUY,2025-11-04 00:15:00,2025-11-04 01:00:00,0.32,trail +BUY,2025-11-04 01:15:00,2025-11-04 02:00:00,5.86,trail +BUY,2025-11-04 20:15:00,2025-11-04 23:00:00,6.29,trail +BUY,2025-11-04 23:00:00,2025-11-05 00:00:00,-9.72,sl +BUY,2025-11-05 00:00:00,2025-11-05 01:00:00,1.53,trail +SELL,2025-11-11 15:00:00,2025-11-11 15:15:00,20.19,trail +SELL,2025-11-11 16:00:00,2025-11-11 16:15:00,-0.18,trail +SELL,2025-11-12 15:00:00,2025-11-12 16:00:00,0.63,trail +SELL,2025-11-12 16:00:00,2025-11-12 17:00:00,0.74,trail +SELL,2025-11-12 17:00:00,2025-11-12 17:15:00,6.14,trail +SELL,2025-11-12 18:00:00,2025-11-12 21:45:00,-10.68,sl +SELL,2025-11-13 16:15:00,2025-11-13 16:30:00,6.06,trail +SELL,2025-11-13 17:15:00,2025-11-13 17:30:00,12.51,trail +SELL,2025-11-13 18:15:00,2025-11-13 19:30:00,5.15,trail +SELL,2025-11-13 19:30:00,2025-11-13 21:30:00,-15.64,sl +SELL,2025-11-14 15:00:00,2025-11-14 16:00:00,-20.92,sl +SELL,2025-11-14 16:00:00,2025-11-14 16:45:00,-21.68,sl +BUY,2025-11-19 15:00:00,2025-11-19 16:30:00,2.73,trail +BUY,2025-11-19 16:30:00,2025-11-19 16:45:00,2.4,trail +BUY,2025-11-19 17:30:00,2025-11-19 21:00:00,6.93,trail +BUY,2025-12-08 15:00:00,2025-12-08 15:30:00,4.37,trail +BUY,2025-12-08 16:00:00,2025-12-08 16:45:00,0.52,trail +SELL,2025-12-10 16:15:00,2025-12-10 20:30:00,2.87,trail +SELL,2025-12-10 20:30:00,2025-12-10 21:00:00,7.38,trail +SELL,2025-12-10 21:30:00,2025-12-10 21:45:00,3.63,trail +SELL,2025-12-10 22:30:00,2025-12-11 00:00:00,0.88,trail +SELL,2025-12-11 00:00:00,2025-12-11 05:30:00,0.4,trail +SELL,2025-12-11 15:00:00,2025-12-11 15:30:00,1.41,trail +SELL,2025-12-11 16:00:00,2025-12-11 17:00:00,9.87,trail +SELL,2025-12-11 17:00:00,2025-12-11 18:00:00,4.16,trail +SELL,2025-12-11 18:00:00,2025-12-11 21:45:00,-15.51,sl +SELL,2025-12-22 16:15:00,2025-12-22 16:30:00,6.47,trail +SELL,2025-12-22 17:15:00,2025-12-22 20:00:00,4.41,trail +SELL,2025-12-22 20:00:00,2025-12-23 00:00:00,5.39,trail +SELL,2025-12-23 00:15:00,2025-12-23 02:00:00,0.8,trail diff --git a/lab/EAs/USDCHF/optimize_trials.csv b/lab/EAs/USDCHF/optimize_trials.csv new file mode 100644 index 0000000..43a9b74 --- /dev/null +++ b/lab/EAs/USDCHF/optimize_trials.csv @@ -0,0 +1,2501 @@ +trial,score,net,trades,pf,daily_ema_period,use_daily_bias,htf_zone_bars,min_break_body_ratio,use_double_trap,trap_lookback,ny_chaos_start,ny_chaos_end,momentum_start,momentum_end,ltf_fast_ema,ltf_slow_ema,entry_mode,atr_period,atr_sl_mult,atr_tp_mult,use_trailing,trail_atr_mult,max_bars_in_trade,extend_hold_in_momentum,use_compression_filter,compress_atr_ratio,compress_lookback,cooldown_bars,max_spread_pips,lot_size,initial_balance +453,4591.050309516106,2632.999999999998,397,3.192540532438441,50,True,16,0.51,False,6,13,14,15,2,8,21,1,14,2.14,3.6,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +246,4328.801628144681,2431.929999999982,385,3.113600611849367,50,True,16,0.53,False,6,13,15,15,3,8,21,1,14,1.87,4.43,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +15,4328.6269788895215,2057.7399999999943,464,2.1326427266122105,50,True,16,0.51,True,6,12,14,15,3,8,21,1,14,1.91,4.06,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +488,4320.1248471670515,2063.929999999993,461,2.1473161674782646,50,True,16,0.51,True,6,13,15,15,3,8,21,1,14,1.92,5.17,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +597,4127.900507846966,2016.979999999996,430,2.1669299082993434,50,True,16,0.54,True,6,12,15,15,2,8,21,1,14,2.06,3.8,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +530,4084.6267456058335,1983.4500000000007,429,2.200911832019472,50,True,16,0.56,True,6,13,14,15,3,8,21,1,14,1.85,5.32,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +492,3929.465937388707,2327.6199999999953,326,3.447858825509002,50,True,16,0.59,False,6,13,14,15,3,8,21,1,14,2.06,4.69,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +522,3918.7581845804943,1899.4399999999969,412,2.1847434897863716,50,True,20,0.51,True,6,12,15,15,2,8,21,1,14,1.92,4.39,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +748,3877.0776235336552,1867.3000000000047,411,2.1343851186751635,50,True,16,0.57,True,6,13,15,15,2,8,21,1,14,1.9,3.67,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +217,3860.430914377547,2417.119999999999,294,4.5952462405735455,50,True,16,0.54,False,6,13,14,15,2,8,21,1,14,2.08,4.64,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +491,3829.56324391871,2153.7799999999843,341,3.14321395520086,50,True,24,0.51,False,6,12,15,15,2,8,21,1,14,1.67,4.69,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +666,3827.922740894914,1959.1999999999953,380,2.4341556255032577,50,True,16,0.51,True,6,12,15,15,3,8,21,1,14,1.78,5.13,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +205,3808.521182191435,2215.489999999996,324,3.4135455476392793,50,True,20,0.57,False,6,12,15,15,3,8,21,1,14,1.78,5.34,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +706,3763.627290419309,1838.7000000000025,394,2.1774160497938064,50,True,20,0.54,True,6,12,15,15,2,8,21,1,14,1.94,3.93,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +832,3702.7525302796375,2311.9500000000007,283,4.515739051094891,50,True,20,0.53,False,6,13,14,15,3,8,21,1,14,1.99,5.21,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +783,3698.3459354959036,2001.8699999999826,345,2.838365750179073,50,True,16,0.51,False,6,13,14,16,3,8,21,1,14,2.1,4.6,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +47,3672.7590466557813,1785.4799999999923,387,2.2192320561583685,50,True,24,0.51,True,6,12,14,15,2,8,21,1,14,1.68,4.84,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +737,3617.6578574180576,2269.819999999996,274,4.612349805044959,50,True,24,0.52,False,6,12,15,15,3,8,21,1,14,2.07,3.79,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +412,3589.828707145046,1742.7100000000064,378,2.165162334189131,50,True,20,0.58,True,6,12,14,15,3,8,21,1,14,1.79,5.35,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +308,3561.29074874081,1753.6700000000092,369,2.1824753042716027,50,True,16,0.63,True,6,13,15,15,2,8,21,1,14,1.79,4.16,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +535,3545.3906776751387,1750.5499999999975,369,2.2208823857613122,50,True,24,0.53,True,6,13,14,15,2,8,21,1,14,1.85,5.03,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +399,3540.9098710080543,1858.839999999982,343,2.7084926470588235,50,True,16,0.51,False,6,13,16,16,2,8,21,1,14,1.73,4.94,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +815,3539.5261921265187,2275.240000000007,258,5.93951630411185,50,True,16,0.53,False,6,13,15,15,3,8,21,1,14,1.93,4.28,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +762,3521.8017063356506,1902.5099999999893,330,2.8764091487410126,50,True,16,0.53,False,6,13,16,16,3,8,21,1,14,1.98,3.73,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +420,3496.074639359998,1734.569999999996,362,2.267877113347806,50,True,24,0.56,True,6,13,15,15,3,8,21,1,14,1.69,5.29,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +560,3457.556517776787,2119.8900000000012,272,4.291448001738969,50,True,20,0.55,False,6,12,15,15,3,8,21,1,14,1.67,3.88,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +79,3417.699297755158,2140.190000000006,261,4.444474844690507,50,True,16,0.59,False,6,13,15,15,3,8,21,1,14,2.01,3.82,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +386,3397.430404288948,1833.8299999999854,319,2.818644319928596,50,True,16,0.54,False,6,12,16,16,3,8,21,1,14,2.02,4.48,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +533,3393.8922500383087,1468.3899999999903,397,1.911301984099894,100,True,16,0.52,True,6,12,14,15,3,8,21,1,14,2.15,3.73,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +179,3389.245804278609,2077.210000000001,268,3.87977429953834,50,True,20,0.63,False,6,13,14,15,2,8,21,1,14,1.83,4.71,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +421,3376.7826359144415,1726.4199999999928,341,2.2592597995594392,50,True,24,0.58,True,6,13,14,15,3,8,21,1,14,2.15,4.16,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +809,3368.775547471057,1953.25,289,3.2829809366854845,50,True,24,0.58,False,6,12,14,15,3,8,21,1,14,1.61,5.29,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +418,3353.9523080402714,1634.1600000000071,353,2.1543286618444846,50,True,20,0.6,True,6,13,15,15,2,8,21,1,14,1.9,4.42,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +546,3349.6341269435775,1782.699999999999,319,2.627278619090652,50,True,16,0.52,True,6,12,15,15,2,8,21,1,14,1.96,4.15,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +617,3332.215290315327,1639.8799999999828,348,2.207169936324487,50,True,24,0.58,True,6,12,15,15,3,8,21,1,14,1.66,4.92,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +124,3323.7464324237662,2123.620000000008,245,5.24113276881291,50,True,16,0.61,False,6,12,15,15,3,8,21,1,14,1.63,4.34,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +31,3314.742488955815,2117.1400000000103,244,4.263967686235817,50,True,16,0.66,False,6,13,15,15,2,8,21,1,14,2.0,4.3,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +422,3304.737377505524,1780.2800000000043,313,2.6126162848628134,50,True,24,0.53,True,6,12,15,15,3,8,21,1,14,1.99,4.63,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +183,3293.9981116119666,2081.17,248,5.221354536419139,50,True,16,0.55,False,6,13,14,15,3,8,21,1,14,1.83,5.17,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +715,3287.560124750306,1756.1500000000015,312,2.5885284752876476,50,True,16,0.53,True,6,12,15,15,2,8,21,1,14,2.14,5.03,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +576,3285.351334716374,1809.5499999999774,302,2.928849331130416,50,True,16,0.56,False,6,12,16,16,2,8,21,1,14,1.95,4.79,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +707,3285.0961856305757,1751.5099999999857,313,2.787364532522399,50,True,16,0.55,False,6,13,16,15,2,8,21,1,14,1.78,4.26,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +379,3282.437441191723,1436.0799999999854,380,1.9045945299016087,50,True,16,0.53,True,6,12,14,16,2,8,21,1,14,2.06,4.55,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +238,3270.7312529465894,1602.840000000011,342,2.0916595153446935,50,True,16,0.65,True,6,12,14,15,2,8,21,1,14,1.82,5.34,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +405,3266.1345950211585,1993.2500000000036,260,4.169271620053106,50,True,24,0.53,False,6,12,15,15,2,8,21,1,14,1.61,5.14,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +587,3262.9268838308226,2061.2400000000107,246,4.1135615238210335,50,True,16,0.66,False,6,13,14,15,3,8,21,1,14,1.84,3.86,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +239,3256.111517563151,1746.150000000005,308,2.996855166104408,100,True,16,0.56,False,6,13,15,15,3,8,21,1,14,1.9,5.3,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +159,3255.998005798014,1349.2599999999857,396,1.8904948586966566,100,True,16,0.52,True,6,12,14,15,2,8,21,1,14,1.66,4.16,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +790,3245.80520830232,1622.2599999999966,334,2.1861400327562004,50,True,20,0.63,True,6,13,14,15,2,8,21,1,14,1.96,5.19,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +272,3228.303831108044,1838.639999999994,285,3.06984126984127,50,True,16,0.58,False,6,12,16,15,3,8,21,1,14,2.15,5.33,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +337,3222.264168462236,1423.019999999975,371,1.940777469258231,50,True,16,0.56,True,6,12,15,16,3,8,21,1,14,1.97,4.11,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +771,3209.7181489584996,1564.539999999999,338,2.128067949124679,50,True,20,0.64,True,6,12,14,15,3,8,21,1,14,1.87,4.79,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +230,3200.4416970667125,1635.9300000000076,321,2.2978215339701076,50,True,16,0.6,True,6,12,15,15,2,8,21,1,14,2.16,3.76,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +494,3185.4531495936194,1818.1000000000022,279,3.434422827149418,100,True,16,0.5,False,6,12,14,15,2,8,21,1,14,2.02,4.69,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +57,3183.8388427120235,2039.2299999999996,234,5.4927845953865475,50,True,16,0.56,False,6,12,15,15,2,8,21,1,14,1.63,3.61,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +8,3165.8971955350935,1705.179999999993,298,2.786988325543376,50,True,20,0.53,False,6,13,16,16,3,8,21,1,14,2.2,3.78,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +467,3138.097607620728,1425.5899999999892,352,1.966822876752277,50,True,16,0.58,True,6,13,16,15,3,8,21,1,14,2.16,4.65,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +122,3132.4590891767034,1927.3399999999983,246,4.544402964488663,50,True,20,0.51,False,6,12,15,15,3,8,21,1,14,1.62,5.36,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +70,3115.1596882757,1987.7900000000063,230,4.960135471660524,50,True,20,0.61,False,6,12,14,15,3,8,21,1,14,1.99,3.81,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +777,3114.376882528717,1957.2200000000066,236,4.409612738010209,50,True,24,0.57,False,6,12,14,15,2,8,21,1,14,1.92,4.7,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +189,3105.415282873579,2041.9000000000087,218,5.916094859756831,50,True,16,0.58,False,6,13,14,15,2,8,21,1,14,1.9,4.37,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +141,3089.388464004916,1624.979999999996,300,2.693622520766673,50,True,20,0.53,False,6,12,15,16,2,8,21,1,14,1.72,5.41,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +493,3080.0423620446068,1611.1899999999896,300,2.6779209147808336,50,True,20,0.53,False,6,12,16,16,2,8,21,1,14,1.75,4.66,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +682,3079.911689443329,1720.4099999999962,278,3.208400189979847,100,True,16,0.59,False,6,12,14,15,2,8,21,1,14,1.78,4.57,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +401,3076.272899332621,1602.8099999999995,302,2.5532308706101245,50,True,20,0.52,True,6,12,14,15,3,8,21,1,14,1.72,4.81,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +281,3068.171107489159,1558.1099999999988,309,2.721307128890068,100,True,20,0.53,False,6,12,15,15,3,8,21,1,14,1.7,4.64,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +319,3067.7770967799365,2003.1299999999956,219,5.822751895991332,50,True,24,0.52,False,6,12,14,15,2,8,21,1,14,2.05,3.82,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +519,3051.550086379761,1346.7399999999925,356,1.9580496688506162,100,True,16,0.57,True,6,13,14,15,3,8,21,1,14,2.06,5.4,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +92,3047.9979628149204,1543.8799999999937,309,2.3985813803911618,50,True,16,0.57,True,6,13,14,15,3,8,21,1,14,1.68,4.34,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +258,3045.8851219232765,2042.4100000000053,205,6.348303131873887,50,True,20,0.64,False,6,12,14,15,2,8,21,1,14,2.11,5.22,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +388,3045.083976564807,1739.499999999991,268,3.1355087409153404,50,True,16,0.6,False,6,13,15,16,3,8,21,1,14,2.02,3.56,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +819,3044.5668720664207,1633.6499999999978,291,2.6028433507976687,50,True,20,0.54,True,6,13,15,15,3,8,21,1,14,2.16,4.75,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +145,3038.155484677251,1529.359999999997,309,2.649884028264739,100,True,20,0.53,False,6,12,15,15,3,8,21,1,14,1.76,4.0,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +396,3024.7360541094704,1743.159999999989,262,3.294899813054583,50,True,16,0.61,False,6,13,15,16,3,8,21,1,14,2.07,4.51,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +335,3014.7754810836404,1305.119999999999,356,1.9616977378232996,100,True,16,0.58,True,6,12,14,15,3,8,21,1,14,1.67,4.84,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +585,3001.1076862469517,1527.6599999999871,302,2.464201506699638,50,True,20,0.51,True,6,13,15,15,3,8,21,1,14,1.62,4.42,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +646,3000.6248590580326,1526.430000000002,304,2.3172278697295527,50,True,20,0.59,True,6,13,15,15,2,8,21,1,14,1.74,4.18,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +769,2990.1278787878678,1566.3399999999892,292,2.6504989410016755,50,True,20,0.54,False,6,12,16,16,2,8,21,1,14,1.74,4.95,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +433,2984.5484112413533,1574.550000000003,291,2.4966636249572263,50,True,20,0.61,True,6,12,15,15,2,8,21,1,14,1.71,4.92,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +28,2984.0812086950677,1585.8400000000147,290,2.4549391267649567,50,True,20,0.62,True,6,13,14,15,3,8,21,1,14,2.14,5.09,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +63,2982.1407959676985,1568.349999999995,290,2.5640488656195464,50,True,20,0.52,True,6,12,15,15,2,8,21,1,14,1.7,4.12,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +518,2980.06390056358,1474.9099999999999,308,2.2953487555110574,50,True,16,0.52,False,6,12,15,16,3,8,21,1,14,1.72,4.91,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +786,2977.542905712168,1280.1899999999878,349,1.8528857236127674,50,True,16,0.59,True,6,13,15,16,3,8,21,1,14,2.07,4.89,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +369,2977.0070663344723,1623.7899999999972,276,2.83564137057846,50,True,24,0.53,False,6,13,16,15,3,8,21,1,14,2.12,5.05,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +755,2974.9073598290443,1305.8099999999959,348,1.9680913370649071,100,True,16,0.59,True,6,12,14,15,2,8,21,1,14,1.68,3.58,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +352,2972.1755010725115,1333.8299999999945,337,1.9609933932289603,50,True,16,0.6,True,6,12,16,16,3,8,21,1,14,2.12,4.9,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +19,2960.3577378811956,1508.280000000006,301,2.2845608775635347,50,True,20,0.6,True,6,13,14,15,3,8,21,1,14,2.19,4.03,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +426,2955.8843401742383,1526.5800000000054,296,2.320456707897241,50,True,20,0.6,True,6,12,14,15,2,8,21,1,14,2.06,3.53,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +714,2952.53001114495,1357.4899999999925,329,2.0007445741920264,50,True,16,0.6,True,6,13,16,16,2,8,21,1,14,2.17,4.46,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +271,2950.0695207374374,1571.2099999999919,283,2.7535043078434,50,True,20,0.56,False,6,12,16,15,2,8,21,1,14,1.7,5.47,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +648,2938.0366034290164,1450.8699999999917,305,2.2340687942297226,50,True,16,0.51,False,6,12,15,16,2,8,21,1,14,2.01,4.62,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +849,2933.5802368471645,1677.42,257,3.5645878881465283,100,True,16,0.54,False,6,12,14,15,3,8,21,1,14,1.95,4.48,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +656,2930.7132617283823,1238.3500000000076,352,1.870171666280189,100,True,16,0.58,True,6,13,14,15,3,8,21,1,14,1.93,3.78,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +668,2924.1491368866073,1584.7500000000055,277,2.601517892332724,50,True,20,0.63,True,6,13,14,15,2,8,21,1,14,1.74,4.67,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +373,2921.16929411193,1399.9700000000012,313,2.0635160594366284,50,True,20,0.66,True,6,13,15,15,3,8,21,1,14,1.78,4.62,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +651,2918.269843300308,1551.1799999999894,280,2.739361523194402,50,True,24,0.53,False,6,13,15,16,3,8,21,1,14,1.75,5.09,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +642,2916.716267392825,1522.8400000000001,287,2.419778293663003,50,True,16,0.62,True,6,12,15,15,3,8,21,1,14,2.11,3.55,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +820,2916.687060350089,1190.5899999999729,355,1.8054595271115923,50,True,16,0.59,True,6,12,14,16,3,8,21,1,14,1.66,4.49,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +380,2909.315773317058,1542.6199999999972,280,2.8664940470428806,100,True,24,0.53,False,6,13,14,15,3,8,21,1,14,1.98,3.76,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +299,2903.7359327940953,1307.5499999999902,332,2.0101513430829487,100,True,16,0.6,True,6,13,14,15,3,8,21,1,14,1.97,5.06,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +559,2901.1706289691638,1863.9900000000034,213,5.511435970665827,50,True,24,0.54,False,6,12,14,15,3,8,21,1,14,1.85,5.22,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +133,2896.8135928553065,1710.849999999995,242,3.4711124591963487,50,True,16,0.63,False,6,13,16,15,2,8,21,1,14,2.11,4.86,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +225,2892.122837350066,1335.7800000000097,319,2.105183469159806,100,True,16,0.53,True,6,13,14,15,3,8,21,1,14,2.19,4.34,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +389,2887.858983014538,1377.3500000000076,312,1.9981375731926487,50,True,20,0.66,True,6,13,14,15,3,8,21,1,14,2.1,3.74,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +86,2886.7075760528646,1451.0899999999892,294,2.4530807205872045,50,True,24,0.51,False,6,13,16,16,2,8,21,1,14,1.63,3.57,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +282,2879.6124884241617,1564.6599999999835,269,2.8178079327090644,50,True,24,0.54,False,6,12,16,15,3,8,21,1,14,1.99,4.7,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +186,2879.591676567035,1622.380000000001,256,3.468925006087168,100,True,20,0.51,False,6,13,14,15,3,8,21,1,14,1.61,4.94,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +785,2879.107659281762,1877.8400000000147,204,5.569843278497031,50,True,24,0.62,False,6,12,14,15,3,8,21,1,14,1.65,3.65,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +330,2871.7646773829074,1540.3600000000079,276,2.506214125768821,50,True,20,0.64,True,6,12,14,15,2,8,21,1,14,1.93,4.65,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +793,2865.9639061079038,1537.4100000000017,271,2.909399140564843,100,True,24,0.54,False,6,13,14,15,3,8,21,1,14,2.14,4.51,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +758,2856.9450327176273,1100.8499999999913,363,1.6424119699816762,50,True,16,0.51,True,6,13,14,16,3,8,21,1,14,2.15,3.7,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +616,2852.725860491243,1506.0799999999945,277,2.516757976152111,50,True,20,0.56,True,6,13,15,15,2,8,21,1,14,1.78,4.83,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +447,2850.4685579777706,1686.8200000000033,238,3.9373802807090863,100,True,24,0.51,False,6,12,15,15,3,8,21,1,14,2.1,4.11,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +264,2839.076582663525,1109.8199999999852,356,1.7393624462875987,50,True,16,0.59,True,6,13,14,16,3,8,21,1,14,1.64,3.84,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +390,2832.0384535518483,1204.9299999999967,337,1.9192956489231026,100,True,20,0.55,True,6,12,15,15,2,8,21,1,14,1.83,5.42,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +162,2821.241297602958,1148.029999999986,351,1.7866182465997464,100,True,16,0.5,True,6,13,15,16,3,8,21,1,14,2.11,4.44,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2,2812.796472684085,1523.6099999999897,264,2.736090062784152,50,True,24,0.54,False,6,12,15,16,2,8,21,1,14,2.02,4.18,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +516,2812.033061573329,1633.9100000000035,241,3.579138450853183,100,True,20,0.61,False,6,12,15,15,3,8,21,1,14,2.18,5.04,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +279,2805.3800989879987,1465.270000000006,276,2.318744318744319,50,True,16,0.68,True,6,12,14,15,3,8,21,1,14,2.15,4.91,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +745,2805.0627398589213,1438.6899999999987,284,2.30389349090975,50,True,24,0.59,True,6,12,14,15,3,8,21,1,14,1.91,5.4,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +284,2800.759549751483,1633.7900000000063,238,3.9557485300768884,100,True,24,0.52,False,6,13,15,15,3,8,21,1,14,1.8,4.05,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +81,2792.3184415013798,1521.0299999999952,259,3.1227722495917827,100,True,24,0.56,False,6,13,14,15,3,8,21,1,14,2.07,3.96,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +536,2784.189864204346,1513.9500000000116,263,2.608941931644278,50,True,20,0.65,True,6,12,14,15,2,8,21,1,14,1.67,4.01,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +161,2780.9950575991256,1267.7399999999998,313,1.9509999549907733,50,True,16,0.63,True,6,12,14,16,2,8,21,1,14,2.2,4.29,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +347,2778.3471301217883,1489.699999999979,265,2.6817945765314186,50,True,24,0.55,False,6,12,15,16,3,8,21,1,14,1.95,4.79,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +365,2771.4957928282784,1467.5099999999802,268,2.6473328543846257,50,True,20,0.58,False,6,12,16,16,2,8,21,1,14,1.66,4.85,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +673,2771.405658905451,1262.7799999999934,309,2.076135124079629,100,True,16,0.54,True,6,13,15,15,2,8,21,1,14,2.0,3.64,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +302,2770.8763666973537,1111.079999999989,347,1.7695152610692098,100,True,16,0.52,True,6,12,15,16,3,8,21,1,14,2.04,3.69,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +392,2762.1524229025267,1378.3500000000058,286,2.2744445369060498,50,True,24,0.59,True,6,12,15,15,3,8,21,1,14,1.61,3.58,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +423,2761.618507553526,1465.9700000000012,269,2.4024394910551994,50,True,24,0.61,True,6,12,15,15,2,8,21,1,14,2.13,4.33,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +237,2758.3225583133953,1769.8499999999967,203,5.231155418489565,50,True,20,0.59,False,6,12,15,15,3,8,21,1,14,1.75,3.71,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +676,2755.2473828974457,1364.629999999992,285,2.2241359204140765,50,True,20,0.51,False,6,12,16,16,3,8,21,1,14,1.88,3.58,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +213,2742.3589792769085,1609.6400000000012,232,3.7953874474662217,100,True,24,0.51,False,6,12,15,15,2,8,21,1,14,2.18,4.51,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +660,2739.0040229965466,1497.4000000000015,254,3.2298665713604957,100,True,24,0.57,False,6,12,14,15,3,8,21,1,14,1.8,3.61,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +171,2738.050612092179,1357.419999999991,283,2.251528199076166,50,True,20,0.51,False,6,12,14,16,3,8,21,1,14,1.87,5.33,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +65,2722.599736551575,1099.1599999999853,339,1.7950754452208382,100,True,16,0.52,True,6,13,16,15,2,8,21,1,14,1.91,4.38,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +680,2722.1394515511,1199.7299999999996,312,2.0200051011732696,100,True,16,0.55,True,6,13,14,15,3,8,21,1,14,1.81,4.3,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +498,2711.7246415240757,1141.5800000000017,325,1.8148380787871434,50,True,16,0.63,True,6,12,16,16,3,8,21,1,14,1.86,4.17,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +723,2692.0065862803076,1340.4399999999914,277,2.6089205766206955,100,True,20,0.51,False,6,13,16,15,3,8,21,1,14,1.68,5.0,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +449,2688.493656149577,1278.92,292,2.191677304534993,100,True,20,0.53,True,6,12,14,15,3,8,21,1,14,2.03,4.54,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +586,2683.0420251276278,1594.8600000000042,223,3.762714800443459,100,True,20,0.63,False,6,12,15,15,3,8,21,1,14,2.17,5.5,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +250,2677.7557047687455,1055.769999999995,341,1.7214697682046798,100,True,16,0.5,True,6,12,16,16,2,8,21,1,14,2.14,5.16,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +751,2670.9705924454092,1311.999999999991,279,2.192792334127316,50,True,20,0.51,False,6,13,16,16,2,8,21,1,14,2.0,5.4,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +173,2653.489217741468,1554.9600000000046,225,3.834828265149858,100,True,20,0.63,False,6,13,14,15,3,8,21,1,14,1.69,3.88,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +631,2651.535117955222,1008.0299999999825,344,1.7369286779542066,100,True,16,0.51,True,6,12,15,16,2,8,21,1,14,1.64,4.43,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +32,2643.3137135240236,1559.1600000000017,223,3.6907584778669427,100,True,20,0.63,False,6,13,14,15,3,8,21,1,14,1.95,5.47,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +773,2641.3364861220434,1595.610000000006,216,3.4724339903309778,50,True,16,0.65,False,6,12,16,15,2,8,21,1,14,1.93,5.14,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +645,2634.08366481129,1278.120000000008,282,2.0129820723762424,50,True,24,0.66,True,6,13,14,15,2,8,21,1,14,1.8,3.63,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +828,2627.7039526431145,1512.12000000001,229,3.48157022352053,100,True,20,0.62,False,6,13,14,15,2,8,21,1,14,1.86,3.87,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +752,2625.4660723240986,1397.1999999999898,252,2.7253855937959224,50,True,20,0.6,False,6,12,15,16,3,8,21,1,14,1.67,3.72,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +348,2625.1367799675527,953.2399999999943,346,1.5907169858090104,50,True,16,0.53,True,6,12,16,15,2,8,21,1,14,1.7,5.34,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +234,2611.9381682755284,1382.3300000000072,254,2.5146000197223533,50,True,20,0.64,True,6,12,14,15,3,8,21,1,14,1.87,4.72,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +487,2607.459929883524,1491.880000000001,228,3.090199649737303,50,True,20,0.63,False,6,13,14,16,3,8,21,1,14,2.13,4.38,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +664,2600.29679645598,1303.7599999999984,266,2.293438361872259,50,True,24,0.51,False,6,13,15,16,3,8,21,1,14,1.82,4.5,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +789,2599.5061740767665,1359.559999999994,255,2.8770675134612733,100,True,24,0.51,False,6,12,16,15,3,8,21,1,14,1.79,4.78,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +827,2598.6112141570825,1403.9299999999985,250,2.497573255677515,50,True,24,0.58,True,6,13,15,15,3,8,21,1,14,2.13,5.42,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +138,2595.7593046340317,1305.3899999999976,266,2.2913913181116694,50,True,20,0.6,True,6,12,14,15,3,8,21,1,14,1.82,4.64,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +506,2586.483930116915,1213.8699999999953,284,2.194342500122989,100,True,20,0.55,True,6,13,14,15,3,8,21,1,14,1.74,5.5,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +82,2583.5644726358055,1037.4199999999837,323,1.767572286838912,50,True,24,0.55,True,6,12,16,15,3,8,21,1,14,1.62,4.23,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +659,2582.5325071052607,1344.9099999999926,254,2.787232063361284,100,True,16,0.57,False,6,12,16,16,2,8,21,1,14,1.69,5.35,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +796,2581.3414437846427,1039.7999999999847,324,1.8148775097569005,100,True,16,0.54,True,6,12,16,16,2,8,21,1,14,1.69,5.24,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +630,2572.194518418672,1461.260000000002,228,3.6792937164231105,100,True,24,0.53,False,6,12,14,15,3,8,21,1,14,1.66,3.78,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +688,2567.3072426160743,1465.1799999999948,226,3.781441615885491,100,True,16,0.51,False,6,13,14,15,2,8,21,1,14,1.78,4.7,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +88,2566.1418227830036,1429.6099999999897,234,2.953686368295183,50,True,20,0.62,False,6,12,16,16,2,8,21,1,14,1.87,3.97,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +804,2563.2082664287595,910.9499999999898,342,1.5702632995705574,50,True,16,0.54,True,6,13,15,16,2,8,21,1,14,1.69,4.05,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +845,2561.067541319063,1220.5300000000025,279,2.1237731332289846,100,True,24,0.59,True,6,12,14,15,2,8,21,1,14,2.14,4.65,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +709,2556.517622239849,882.6399999999903,348,1.5118504300021456,50,True,16,0.54,True,6,13,16,16,3,8,21,1,14,2.05,4.71,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +563,2552.378362196797,1359.7100000000064,249,2.4275320475805517,50,True,20,0.69,True,6,12,14,15,3,8,21,1,14,2.13,3.98,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +104,2538.9857094089916,1005.4599999999882,321,1.7479542952361113,100,True,16,0.54,True,6,12,14,16,2,8,21,1,14,2.06,4.08,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +843,2537.4817352946197,1515.4200000000128,210,3.8992156112492826,100,True,16,0.6,False,6,13,15,15,2,8,21,1,14,1.86,3.8,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +568,2530.5888620017804,892.4299999999785,340,1.5575631485889578,50,True,16,0.56,True,6,13,16,16,3,8,21,1,14,1.76,3.66,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +542,2525.246891484004,1319.099999999993,248,2.5840478420635495,50,True,24,0.58,False,6,12,14,16,3,8,21,1,14,1.61,4.85,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +679,2507.084456552231,1326.9200000000092,247,2.3045726701601565,50,True,24,0.65,True,6,13,15,15,3,8,21,1,14,2.05,4.51,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +113,2504.385724708091,1343.3200000000106,242,2.4917158974814555,50,True,20,0.7,True,6,12,14,15,3,8,21,1,14,1.91,4.72,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +471,2502.6826550041733,1232.5700000000033,261,2.197030174130078,50,True,24,0.51,False,6,12,15,16,2,8,21,1,14,1.9,5.2,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +526,2501.221949748177,1243.0200000000004,258,2.2466852546486673,50,True,16,0.58,False,6,13,14,16,2,8,21,1,14,1.71,4.26,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +523,2498.097439303917,1129.8800000000083,282,2.0140728774008254,100,True,16,0.6,True,6,13,15,15,3,8,21,1,14,1.83,3.52,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +699,2493.866852594334,1311.8799999999956,247,2.4599641652848416,50,True,24,0.59,True,6,12,14,15,3,8,21,1,14,1.84,4.33,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +848,2488.2925861587546,1432.9100000000053,217,3.757982869791166,100,True,24,0.55,False,6,12,14,15,3,8,21,1,14,1.69,3.53,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +483,2487.0116360465763,1254.9400000000078,254,2.3258882819681137,50,True,20,0.64,True,6,12,14,15,3,8,21,1,14,1.61,4.5,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +803,2482.7079829889494,926.5899999999983,322,1.5949366275859413,50,True,20,0.53,True,6,13,16,15,3,8,21,1,14,2.16,4.22,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +687,2481.9060664642393,999.949999999988,309,1.8152541681953447,100,True,20,0.52,True,6,12,15,16,2,8,21,1,14,1.84,4.13,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +622,2479.842040543897,1301.649999999996,243,2.495719620798621,50,True,16,0.53,False,6,12,15,16,2,8,21,1,14,2.09,4.48,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +45,2477.2330546878547,1382.70999999999,225,2.962682753726047,50,True,24,0.61,False,6,12,14,16,2,8,21,1,14,1.71,4.02,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +224,2476.546552551032,1010.0299999999897,307,1.8156256308798,100,True,20,0.52,True,6,12,15,16,2,8,21,1,14,1.99,4.91,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +588,2474.6315555109045,1289.9599999999973,244,2.4958486015121295,50,True,16,0.53,False,6,13,16,15,2,8,21,1,14,1.89,4.36,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +170,2474.199784467138,1245.3599999999951,253,2.581771071483006,100,True,24,0.5,False,6,12,16,15,2,8,21,1,14,1.85,4.9,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +746,2466.438288775383,990.2399999999961,308,1.7912614765036317,100,True,16,0.57,True,6,13,16,15,2,8,21,1,14,1.78,4.09,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +108,2466.2134894324336,1001.4699999999866,306,1.8023827837066952,100,True,16,0.57,True,6,12,16,15,2,8,21,1,14,1.81,5.42,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +398,2464.0498096650604,1427.8900000000085,212,3.6204624701780146,100,True,20,0.58,False,6,12,14,15,2,8,21,1,14,1.71,3.56,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +509,2459.5725241815253,1166.3600000000042,271,1.9140537448179118,50,True,24,0.68,True,6,13,14,15,3,8,21,1,14,1.88,3.58,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +206,2455.1384469152263,1186.8099999999922,261,2.192426328004903,50,True,20,0.56,False,6,12,16,16,3,8,21,1,14,1.66,4.94,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +691,2450.1220406539765,1261.3299999999963,248,2.346409624150041,50,True,24,0.59,True,6,12,14,15,3,8,21,1,14,1.78,3.8,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +84,2446.6604689291735,1003.0999999999949,302,1.7830784483633497,100,True,16,0.59,True,6,12,14,16,3,8,21,1,14,2.07,3.53,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +686,2446.2335097119962,1046.9100000000071,291,1.8020885207971007,50,True,16,0.66,True,6,12,14,16,2,8,21,1,14,1.79,4.75,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +486,2443.6193761712207,975.6899999999896,307,1.765973983152639,100,True,20,0.51,True,6,13,16,16,2,8,21,1,14,2.06,4.08,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +200,2443.5657412336113,1191.5299999999916,257,2.1890686279401637,50,True,20,0.56,False,6,13,15,16,2,8,21,1,14,1.83,5.13,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +126,2438.371791654497,1158.8599999999933,264,2.1931634491634493,100,True,16,0.63,True,6,13,14,15,3,8,21,1,14,1.63,4.27,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +368,2438.1988976731614,1228.409999999998,250,2.2635233128645043,50,True,20,0.57,False,6,13,16,16,3,8,21,1,14,2.19,5.33,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +314,2437.6820254812656,1179.9400000000041,260,2.1708309353231856,100,True,16,0.64,True,6,13,14,15,3,8,21,1,14,2.0,5.41,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +277,2436.570603359055,1256.5699999999906,243,2.428569804456571,50,True,16,0.53,False,6,13,15,16,2,8,21,1,14,1.87,5.33,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +328,2434.103611391601,984.1699999999964,303,1.781434605856571,100,True,20,0.51,True,6,13,16,15,2,8,21,1,14,2.18,5.05,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +830,2431.7572002961206,1381.8599999999988,217,3.275003704252482,100,True,16,0.61,False,6,13,16,15,2,8,21,1,14,1.94,4.93,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +636,2426.6226823071374,1182.1599999999944,256,2.4984155956092984,100,True,20,0.54,False,6,13,16,16,3,8,21,1,14,1.75,5.47,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +795,2425.5190254588565,994.9900000000016,297,1.7360101193162067,50,True,16,0.66,True,6,12,16,16,3,8,21,1,14,1.8,4.22,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +448,2422.416717655539,864.5600000000013,324,1.534236332964636,50,True,16,0.57,True,6,12,14,16,2,8,21,1,14,2.14,3.81,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +684,2407.974088961305,1011.4699999999921,291,1.8789658918096892,100,True,24,0.51,True,6,13,16,16,3,8,21,1,14,1.96,3.6,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +9,2392.3537599768874,916.2399999999925,309,1.6439605853164843,50,True,16,0.53,True,6,13,16,15,3,8,21,1,14,1.96,4.44,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +791,2390.620794539982,1031.9800000000032,284,1.91477856965571,100,True,16,0.61,True,6,12,16,15,3,8,21,1,14,1.93,4.78,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +602,2384.8073514471316,1178.5299999999916,249,2.1899295248480444,50,True,24,0.54,False,6,13,14,16,3,8,21,1,14,2.1,4.85,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +780,2384.105271590841,1152.9800000000087,256,2.2580113692158292,100,True,24,0.56,True,6,13,14,15,3,8,21,1,14,1.79,4.35,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +504,2381.6840504781876,1364.4600000000028,210,3.4252755065766083,100,True,16,0.62,False,6,13,14,16,2,8,21,1,14,1.8,4.66,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +109,2380.4562864382265,971.9399999999969,294,1.7187842035201892,50,True,16,0.53,True,6,12,16,15,2,8,21,1,14,2.17,4.76,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +410,2374.5700067380412,1306.4400000000005,220,2.7762127474439855,50,True,16,0.63,False,6,13,16,15,2,8,21,1,14,1.77,4.29,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +456,2371.107447493927,1155.5999999999967,250,2.4312962917089846,100,True,20,0.54,False,6,13,15,16,2,8,21,1,14,1.89,4.2,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +744,2359.2696108964096,981.939999999986,289,1.7546012741398789,50,True,20,0.5,True,6,12,16,16,3,8,21,1,14,2.2,4.82,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +351,2354.249562281151,1210.4399999999969,236,2.3646756409389162,50,True,16,0.54,False,6,12,16,15,2,8,21,1,14,2.14,4.7,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +42,2347.5453780408125,787.2400000000016,326,1.4763991092176605,50,True,16,0.58,True,6,12,14,16,3,8,21,1,14,1.93,4.33,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +621,2346.1315305435915,1073.7599999999911,263,2.0729016786570744,100,True,16,0.52,False,6,12,16,15,2,8,21,1,14,1.78,4.25,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +35,2339.2054115685696,1156.2600000000002,244,2.5056841118331095,100,True,24,0.53,False,6,13,16,15,3,8,21,1,14,1.93,3.5,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +358,2328.953279722584,958.2099999999864,288,1.8467295830903272,100,True,24,0.5,True,6,12,15,16,2,8,21,1,14,1.76,4.24,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +267,2301.478692732799,795.5799999999872,317,1.5555260732340865,100,True,16,0.51,True,6,13,14,16,3,8,21,1,14,1.66,3.91,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +835,2298.311621350808,1235.9100000000017,220,2.5740266687043896,50,True,20,0.69,True,6,12,14,15,2,8,21,1,14,1.66,4.15,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +51,2290.615716202171,963.419999999991,276,1.8942995850699442,100,True,24,0.53,True,6,13,16,16,3,8,21,1,14,2.1,4.68,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +702,2283.9929008360923,995.5599999999831,269,1.8399719885591825,50,True,24,0.63,True,6,13,16,16,2,8,21,1,14,1.75,4.66,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +387,2281.237524395373,962.8999999999905,274,1.7341023275671472,50,True,16,0.69,True,6,12,14,16,3,8,21,1,14,2.03,4.95,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +841,2279.5280055955996,952.779999999997,276,1.8760712052668358,100,True,24,0.53,True,6,12,14,16,3,8,21,1,14,2.12,4.53,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +725,2275.7110969874975,974.9599999999846,270,1.8200383541365273,50,True,20,0.65,True,6,12,15,16,2,8,21,1,14,1.66,5.45,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +41,2268.7338369715135,1168.5699999999997,227,2.7334490380193732,100,True,24,0.55,False,6,12,16,16,2,8,21,1,14,1.8,5.29,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +452,2264.940799537401,806.8499999999913,304,1.5783456383054977,50,True,16,0.55,True,6,12,14,16,3,8,21,1,14,1.68,4.91,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +553,2254.9807554792496,1126.4899999999998,233,2.201550883705055,50,True,24,0.57,False,6,13,16,16,3,8,21,1,14,2.02,4.68,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +573,2253.8223997829127,959.3799999999901,269,1.7504771738790328,50,True,16,0.69,True,6,13,16,15,2,8,21,1,14,1.97,4.7,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +370,2253.721376989448,1109.9800000000014,239,2.2698547076993476,100,True,20,0.64,True,6,12,15,15,3,8,21,1,14,1.97,4.02,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +21,2249.951508528962,830.8999999999978,296,1.5663824189007722,50,True,16,0.62,True,6,12,16,15,2,8,21,1,14,1.96,4.85,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +266,2243.826588768665,836.3599999999915,293,1.6165436813045049,50,True,16,0.57,True,6,13,16,16,3,8,21,1,14,1.74,3.6,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +46,2241.898964439337,1081.7200000000012,238,2.4864712591554325,100,True,20,0.57,False,6,13,15,16,2,8,21,1,14,1.61,4.58,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +123,2240.876650472879,1003.639999999994,257,1.9965742882959814,100,True,16,0.53,False,6,13,16,15,3,8,21,1,14,1.97,5.31,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +847,2239.7245218326293,1183.670000000002,218,2.4886309329174736,50,True,16,0.57,False,6,13,16,15,2,8,21,1,14,1.9,4.9,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +263,2239.2695594394995,1183.720000000003,218,2.497413062453353,50,True,16,0.58,False,6,12,15,16,3,8,21,1,14,1.93,3.7,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +158,2236.6127613162284,846.1099999999933,288,1.6535787668587496,50,True,20,0.51,True,6,13,15,16,3,8,21,1,14,1.72,4.58,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +371,2235.0238794215893,1073.6399999999976,239,2.1244423032613478,50,True,20,0.59,False,6,13,14,16,3,8,21,1,14,1.85,5.0,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +824,2233.7448985259607,848.8499999999913,290,1.6343174838029906,50,True,16,0.57,True,6,12,16,15,3,8,21,1,14,1.89,5.41,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +180,2217.5407912720593,912.960000000001,273,1.7357003561816042,50,True,24,0.64,True,6,13,14,16,3,8,21,1,14,1.73,3.88,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +554,2217.4965247474133,1232.0300000000043,204,3.170174913247961,100,True,20,0.61,False,6,12,16,15,3,8,21,1,14,1.9,5.03,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +734,2212.3094485144948,914.4500000000116,273,1.7241103526915096,100,True,16,0.69,True,6,13,15,15,3,8,21,1,14,1.93,4.02,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +201,2212.2062766170416,834.1999999999916,289,1.5834749704485525,50,True,24,0.54,True,6,12,16,16,2,8,21,1,14,2.08,5.16,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +517,2208.890313821864,925.4999999999945,268,1.8320971004720161,100,True,20,0.59,True,6,12,16,16,2,8,21,1,14,2.1,4.89,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +384,2204.569663343648,946.4100000000071,262,1.7712008735403644,50,True,20,0.66,True,6,12,16,16,2,8,21,1,14,2.13,4.37,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +38,2203.4988627410225,776.119999999999,296,1.5096396301744064,50,True,20,0.58,True,6,13,15,16,2,8,21,1,14,1.99,3.51,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +22,2202.2650906319495,797.0399999999936,296,1.5454657441435522,50,True,24,0.55,True,6,12,15,16,3,8,21,1,14,2.0,4.13,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +343,2200.498437996397,994.7499999999964,248,2.100435859993805,100,True,20,0.51,False,6,12,14,16,3,8,21,1,14,1.63,3.91,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +443,2196.3714596940154,1170.1900000000023,210,2.814473112944241,100,True,20,0.6,False,6,12,14,16,3,8,21,1,14,2.03,4.73,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +618,2193.25046988736,877.059999999994,276,1.6757843802009496,50,True,16,0.58,True,6,13,14,16,2,8,21,1,14,2.01,4.31,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +29,2192.963159704504,826.519999999995,286,1.5853748362194127,50,True,24,0.55,True,6,13,16,16,2,8,21,1,14,2.12,5.45,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +211,2192.6888814341432,1119.37000000001,224,2.374607034089793,100,True,24,0.62,True,6,13,14,15,3,8,21,1,14,1.71,4.89,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +292,2190.355216337885,900.3900000000085,269,1.726783278310073,50,True,20,0.66,True,6,12,16,16,3,8,21,1,14,1.86,4.45,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +429,2189.589857293963,1068.1799999999948,230,2.2491726210662955,100,True,24,0.51,False,6,12,14,16,3,8,21,1,14,2.13,5.05,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +226,2188.1887788107865,825.5599999999995,285,1.617296505107,50,True,16,0.58,True,6,12,15,16,3,8,21,1,14,1.83,5.13,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +589,2187.0423302536783,1178.9600000000028,208,2.618850151729441,50,True,20,0.63,False,6,12,15,16,3,8,21,1,14,1.76,4.7,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +64,2178.0774961313155,992.3999999999905,245,2.012952812566984,100,True,20,0.52,False,6,13,15,16,3,8,21,1,14,1.96,5.28,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +288,2167.966324439961,793.3999999999996,287,1.5688189157023844,50,True,24,0.55,True,6,13,16,15,2,8,21,1,14,1.73,5.24,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +681,2165.949156164591,704.9599999999864,305,1.495853584767639,50,True,16,0.55,True,6,13,16,16,3,8,21,1,14,1.64,4.6,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +657,2165.9323491380324,922.869999999999,263,1.7488092823238266,100,True,16,0.7,True,6,12,15,15,2,8,21,1,14,2.03,4.18,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +663,2164.3653790147164,1014.4399999999969,237,2.0124252737053263,50,True,20,0.59,False,6,12,15,16,2,8,21,1,14,2.05,4.09,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +807,2153.5059375559167,1155.5900000000074,206,2.5343831742195904,50,True,20,0.63,False,6,12,14,16,2,8,21,1,14,2.12,3.73,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +105,2146.5951271080407,958.8199999999924,249,2.0172077233184806,100,True,24,0.59,True,6,13,16,15,3,8,21,1,14,1.84,4.98,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +838,2143.2515965895755,948.8799999999992,250,1.9956454676138213,100,True,24,0.59,True,6,12,16,16,3,8,21,1,14,1.79,4.96,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +652,2141.259537490444,1169.7200000000012,201,3.0444289085030154,100,True,24,0.59,False,6,13,16,15,2,8,21,1,14,1.79,4.19,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +413,2139.1091008387243,991.2299999999996,239,2.1310633636477743,100,True,20,0.57,True,6,13,15,15,3,8,21,1,14,2.19,4.73,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +545,2138.173380673869,1118.819999999996,210,2.775763828267598,100,True,20,0.6,False,6,13,16,16,2,8,21,1,14,1.66,4.0,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +541,2137.342319269077,1097.970000000012,217,2.390046589355345,100,True,24,0.64,True,6,13,15,15,3,8,21,1,14,1.87,4.97,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +512,2127.191538220149,1149.6500000000124,202,2.494993498049415,50,True,20,0.64,False,6,13,16,16,2,8,21,1,14,2.14,4.42,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +175,2126.870203250127,1090.6499999999978,214,2.3626482089981136,50,True,24,0.51,False,6,12,16,15,2,8,21,1,14,1.9,4.08,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +608,2126.3787505357227,768.1699999999801,283,1.555714709435655,50,True,24,0.57,True,6,12,14,16,3,8,21,1,14,1.75,5.12,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +772,2126.3694639139285,962.7399999999943,245,1.8203795386568729,50,True,24,0.65,True,6,12,15,16,2,8,21,1,14,2.1,5.03,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +776,2121.73430380797,822.8200000000033,271,1.6388502837799017,50,True,20,0.63,True,6,13,16,15,3,8,21,1,14,2.19,3.95,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +415,2117.737685253306,773.279999999997,280,1.5811164216791413,50,True,20,0.5,True,6,13,15,16,2,8,21,1,14,1.73,4.58,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +507,2113.7839020941537,971.4100000000035,237,2.043203247492429,100,True,16,0.64,True,6,13,15,15,3,8,21,1,14,2.07,4.24,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +196,2108.2487051773664,1001.0799999999945,230,2.2354894047663123,100,True,16,0.51,False,6,12,16,16,3,8,21,1,14,1.78,4.28,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +774,2094.4085703973356,1106.7599999999966,204,2.557040559361855,50,True,16,0.6,False,6,12,15,16,3,8,21,1,14,1.75,4.59,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +836,2092.5945908005874,664.1299999999956,301,1.4453034376864844,100,True,16,0.53,True,6,13,16,15,2,8,21,1,14,2.13,3.59,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +640,2089.4412953667043,996.9799999999905,227,2.247675422678864,100,True,16,0.52,False,6,12,14,16,3,8,21,1,14,1.77,5.31,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +775,2089.383813988114,815.25,266,1.5943961620344718,50,True,16,0.66,True,6,13,14,16,2,8,21,1,14,2.15,3.55,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +600,2087.983293371145,836.5400000000081,262,1.6897421732641837,100,True,16,0.64,True,6,13,16,16,2,8,21,1,14,2.14,4.33,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +435,2085.1206413934688,893.0300000000097,250,1.8199254471335706,100,True,20,0.67,True,6,13,14,15,3,8,21,1,14,1.85,3.66,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +592,2085.059945221762,815.699999999988,265,1.7126880668216053,100,True,24,0.51,True,6,12,16,15,3,8,21,1,14,1.66,4.82,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +736,2081.063621964111,715.739999999987,284,1.527637301879838,50,True,24,0.57,True,6,13,14,16,3,8,21,1,14,1.62,4.71,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +544,2078.1460070818757,965.4499999999989,231,2.0569848916137508,100,True,16,0.57,False,6,12,14,16,3,8,21,1,14,2.06,5.03,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +460,2077.3011371593157,883.2499999999982,249,1.7512226238571125,50,True,20,0.69,True,6,12,16,16,3,8,21,1,14,1.99,3.62,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +556,2074.776737204538,880.7500000000036,252,1.7277722690464383,50,True,24,0.65,True,6,12,16,16,3,8,21,1,14,1.94,4.56,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +296,2069.1354817084207,776.4600000000119,270,1.5583873890718714,50,True,16,0.65,True,6,12,16,15,2,8,21,1,14,1.82,4.8,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +154,2062.0300161534788,753.2399999999943,272,1.6041676692814861,50,True,16,0.61,True,6,12,14,16,3,8,21,1,14,1.69,4.88,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +143,2058.465197609197,730.2499999999782,277,1.5315161219884998,50,True,24,0.58,True,6,13,16,16,3,8,21,1,14,1.75,5.11,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +360,2052.760892770638,753.5200000000077,272,1.5457916847747357,50,True,16,0.66,True,6,12,16,15,3,8,21,1,14,1.99,5.45,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +763,2046.2125241353015,789.989999999987,262,1.751462516765436,100,True,20,0.6,True,6,12,16,16,2,8,21,1,14,1.63,4.63,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +817,2036.4153189165559,876.0400000000045,243,1.786271394849978,50,True,24,0.66,True,6,13,16,16,2,8,21,1,14,1.72,3.69,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +690,2032.1598693778726,920.1800000000003,229,2.085258701010744,100,True,16,0.57,False,6,13,16,15,2,8,21,1,14,1.61,5.02,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +197,2027.7419015884016,1001.810000000005,212,2.1383816460802474,50,True,24,0.6,False,6,12,14,16,3,8,21,1,14,1.9,3.63,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +792,2018.2806809846975,898.5600000000068,234,1.8670346211741096,100,True,16,0.7,True,6,13,14,15,3,8,21,1,14,2.17,3.52,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +754,2015.5221696613073,847.1500000000069,248,1.7247598107573983,100,True,16,0.65,True,6,12,16,15,2,8,21,1,14,2.06,5.23,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +291,2015.2827973214544,730.3099999999886,267,1.5758861333438472,50,True,16,0.6,True,6,13,16,15,2,8,21,1,14,1.76,5.02,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +685,2008.8498601224892,825.5700000000015,248,1.6924760946149975,50,True,20,0.68,True,6,12,14,16,2,8,21,1,14,1.8,3.88,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +844,2005.5185412826522,954.4300000000003,217,2.137933090111358,100,True,16,0.59,False,6,12,14,16,3,8,21,1,14,1.78,4.31,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +52,2005.1080866576697,799.79000000001,253,1.6482068322729668,50,True,20,0.68,True,6,13,16,16,3,8,21,1,14,1.9,4.15,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +499,1995.9882465953315,798.7399999999943,251,1.6615919821088379,50,True,24,0.51,True,6,12,14,16,2,8,21,1,14,2.14,4.94,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +605,1988.3340969784208,768.2599999999948,254,1.6473155606484446,50,True,20,0.59,True,6,12,16,15,3,8,21,1,14,2.2,5.07,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +24,1987.825586183818,1003.1599999999999,204,2.3038719991681504,50,True,24,0.55,False,6,12,14,16,3,8,21,1,14,1.86,4.59,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +572,1982.7036288864513,940.3199999999979,218,2.134487542981239,100,True,16,0.52,False,6,12,15,16,2,8,21,1,14,2.17,5.35,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +17,1977.266742756065,744.5899999999947,258,1.6479259304379605,100,True,24,0.51,True,6,12,15,16,2,8,21,1,14,1.71,4.57,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +564,1973.8778821136593,1003.7800000000134,203,2.2955343314403716,100,True,24,0.65,True,6,13,14,15,2,8,21,1,14,1.73,4.05,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +599,1972.0326255106365,921.1799999999894,219,2.1477734306860374,100,True,16,0.52,False,6,13,15,16,2,8,21,1,14,1.84,4.53,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +228,1963.2107895075017,659.8700000000081,275,1.5302844009418421,100,True,16,0.52,True,6,12,14,16,3,8,21,1,14,1.79,3.78,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +521,1956.2942000942367,681.4399999999878,267,1.513144122231677,50,True,24,0.6,True,6,12,16,15,3,8,21,1,14,1.84,5.18,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +500,1950.4784632226294,853.3799999999956,227,1.9691883113195763,100,True,20,0.54,False,6,12,14,16,2,8,21,1,14,1.74,4.33,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +655,1948.1714587957717,720.239999999998,258,1.5670779236117125,50,True,16,0.63,True,6,13,16,15,2,8,21,1,14,2.04,5.41,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +757,1945.5982491098296,685.0300000000025,265,1.5328774902180424,100,True,16,0.6,True,6,13,14,16,3,8,21,1,14,2.17,4.92,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +74,1931.8328180619924,961.0800000000127,204,2.1514214858210834,100,True,24,0.66,True,6,13,14,15,3,8,21,1,14,2.12,4.38,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +417,1928.5291397919748,617.1600000000035,276,1.4845563180126562,100,True,16,0.59,True,6,12,15,16,3,8,21,1,14,1.61,5.23,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +96,1921.573992164747,689.4599999999937,257,1.5589415570202108,50,True,20,0.59,True,6,13,15,16,3,8,21,1,14,2.04,4.13,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +216,1918.464394759727,884.8600000000024,214,2.098413565381464,100,True,24,0.54,False,6,12,16,15,3,8,21,1,14,1.87,4.2,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +764,1911.2565471239873,755.5800000000017,244,1.7081150483116687,100,True,20,0.64,True,6,12,15,16,3,8,21,1,14,1.96,3.91,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +629,1908.4928471103606,621.6099999999915,271,1.5021041833264677,100,True,20,0.55,True,6,12,16,15,3,8,21,1,14,1.71,5.04,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +265,1903.1598418182489,868.9300000000021,220,1.8157205486139145,50,True,24,0.69,True,6,13,16,16,2,8,21,1,14,2.17,3.83,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +385,1901.582767169396,613.2499999999945,273,1.4716291875596026,100,True,20,0.54,True,6,13,16,15,3,8,21,1,14,1.99,4.56,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +391,1893.2670428455485,858.0200000000023,220,1.7931557248239014,50,True,24,0.69,True,6,13,15,16,2,8,21,1,14,2.13,5.23,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +195,1877.782582460814,609.9999999999927,265,1.5118566130196183,100,True,20,0.57,True,6,12,15,16,3,8,21,1,14,1.66,3.67,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +814,1876.9986287671873,749.3799999999992,238,1.6602932365276846,100,True,16,0.69,True,6,13,15,16,3,8,21,1,14,2.0,3.51,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +397,1852.65355378322,758.539999999999,232,1.645615408839826,50,True,24,0.67,True,6,13,16,15,3,8,21,1,14,1.91,4.5,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +735,1852.1864987367487,887.0399999999936,201,2.2257012574271107,100,True,20,0.52,False,6,13,16,15,2,8,21,1,14,1.98,4.04,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +114,1843.813486239238,844.7099999999991,206,2.0807307992477067,100,True,20,0.58,False,6,12,16,16,2,8,21,1,14,1.66,4.86,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +627,1840.0272796127024,679.239999999998,242,1.578495081548354,50,True,20,0.6,True,6,12,16,15,2,8,21,1,14,2.07,3.99,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +749,1833.32819013071,733.890000000003,233,1.6671969889814173,100,True,16,0.68,True,6,12,16,16,2,8,21,1,14,1.84,4.1,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +416,1827.796961118997,844.8200000000015,206,2.1249267643142478,100,True,24,0.6,True,6,12,15,15,3,8,21,1,14,1.64,3.9,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +579,1827.7702769321252,790.5900000000056,217,1.8484819215042338,100,True,16,0.69,True,6,12,15,15,3,8,21,1,14,2.13,3.76,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +800,1821.054815374155,792.5499999999993,217,1.7638373538680985,50,True,24,0.7,True,6,12,16,15,2,8,21,1,14,1.77,3.82,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +116,1817.8176423272887,656.0100000000148,245,1.5640961700517653,100,True,16,0.63,True,6,13,16,16,2,8,21,1,14,1.79,5.4,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +254,1813.5401265907867,543.3499999999876,267,1.4433157916207726,100,True,20,0.55,True,6,13,16,15,2,8,21,1,14,1.64,5.48,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +248,1811.2727622607754,762.6900000000023,222,1.7803173693741623,100,True,20,0.66,True,6,12,15,16,2,8,21,1,14,1.88,5.11,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +537,1809.4130539634164,658.8799999999992,240,1.5646316799780617,50,True,16,0.66,True,6,12,14,16,2,8,21,1,14,1.69,4.99,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +260,1803.0648079305554,645.9700000000066,245,1.5383576827875887,100,True,16,0.63,True,6,13,15,16,2,8,21,1,14,2.04,5.4,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +403,1801.2540748069564,664.5400000000009,239,1.6139391363795939,100,True,24,0.57,True,6,13,15,16,3,8,21,1,14,1.85,4.77,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +181,1779.8970087680514,617.5800000000036,245,1.517218853639744,100,True,16,0.64,True,6,13,14,16,3,8,21,1,14,1.88,4.8,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +144,1757.5285774457009,586.510000000002,247,1.4864275347294216,100,True,16,0.64,True,6,13,15,16,3,8,21,1,14,1.8,3.79,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +671,1745.9785306706442,635.7200000000084,234,1.5948201654253529,100,True,20,0.62,True,6,12,14,16,3,8,21,1,14,1.72,4.28,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +131,1745.3191159727294,648.6499999999996,234,1.5794725651700046,100,True,16,0.65,True,6,13,16,15,3,8,21,1,14,1.66,4.16,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +638,1744.7550992209906,646.3400000000038,233,1.5902163292514773,100,True,20,0.61,True,6,12,16,16,2,8,21,1,14,2.18,4.25,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +732,1742.9582551994665,598.0399999999863,239,1.5089832080819083,50,True,24,0.56,True,6,13,16,15,2,8,21,1,14,1.63,5.39,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +801,1727.1281218894749,595.0300000000043,237,1.4859728358964726,50,True,20,0.67,True,6,13,15,16,3,8,21,1,14,1.65,4.96,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +650,1723.327357352701,596.3099999999868,234,1.5248745709004492,50,True,20,0.63,True,6,13,16,16,2,8,21,1,14,1.66,4.69,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +142,1721.937113500585,693.3400000000038,216,1.7324684654228908,100,True,24,0.61,True,6,12,14,16,2,8,21,1,14,1.65,5.4,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +458,1717.1711164569497,625.970000000003,229,1.5956626827040192,100,True,24,0.58,True,6,12,15,16,2,8,21,1,14,1.72,4.89,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +164,1715.9153179875607,583.8099999999995,239,1.5101718020867925,100,True,20,0.6,True,6,13,16,15,2,8,21,1,14,1.89,5.37,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +667,1704.995603494902,628.3399999999983,228,1.5541405767704382,50,True,24,0.62,True,6,13,14,16,3,8,21,1,14,2.07,4.31,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +822,1700.0702245758396,526.3099999999922,251,1.4216281603486396,100,True,16,0.54,True,6,12,16,15,2,8,21,1,14,2.2,4.47,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +128,1698.7316919708794,657.5200000000023,219,1.661449007102187,100,True,24,0.6,True,6,12,14,16,2,8,21,1,14,1.72,5.08,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +147,1698.3988891111574,558.5900000000001,241,1.466366103109998,100,True,20,0.6,True,6,13,16,16,2,8,21,1,14,1.95,3.6,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +375,1690.581854140763,559.8599999999897,242,1.4926306897674377,100,True,20,0.5,True,6,13,16,15,2,8,21,1,14,1.81,4.85,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +782,1683.0823454529525,684.1600000000126,211,1.68012684779259,100,True,24,0.62,True,6,12,14,16,2,8,21,1,14,2.2,3.53,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +821,1664.63846066697,595.6399999999958,227,1.5666609585783053,100,True,16,0.6,True,6,13,14,16,2,8,21,1,14,2.01,4.25,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +77,1658.1721654243559,605.650000000016,222,1.5214737132131355,50,True,20,0.7,True,6,13,14,16,2,8,21,1,14,1.79,3.61,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +295,1650.7339574518371,669.850000000004,209,1.6587176713541154,100,True,20,0.68,True,6,13,15,16,2,8,21,1,14,2.17,5.34,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +787,1639.7958007239943,559.399999999996,230,1.4565896977562296,50,True,16,0.68,True,6,12,16,15,2,8,21,1,14,2.1,4.86,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +445,1625.6002138945332,643.2099999999973,210,1.6445312891427428,100,True,20,0.69,True,6,13,16,16,2,8,21,1,14,1.95,4.16,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +353,1615.7488019307561,551.7199999999957,226,1.5329546662029927,100,True,20,0.57,True,6,13,14,16,3,8,21,1,14,2.15,3.67,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +83,1604.1354843499514,614.0999999999967,212,1.6022950176539819,100,True,20,0.65,True,6,12,14,16,3,8,21,1,14,1.75,5.15,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +495,1596.8121135622016,568.1100000000024,218,1.569242793158385,100,True,24,0.53,True,6,13,16,16,3,8,21,1,14,2.16,4.72,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +220,1583.1707057727679,554.6400000000085,219,1.5475330213824556,100,True,20,0.59,True,6,13,16,16,3,8,21,1,14,2.17,4.15,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +151,1578.6455771574442,528.869999999999,223,1.4791617591099353,100,True,16,0.62,True,6,13,16,16,2,8,21,1,14,2.19,4.98,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +548,1567.952668195749,496.0299999999952,230,1.4044173399753777,50,True,16,0.7,True,6,13,15,16,3,8,21,1,14,1.88,3.57,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +432,1552.847284216506,563.6999999999971,210,1.5113342585789313,50,True,24,0.65,True,6,12,16,16,3,8,21,1,14,1.91,4.27,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +148,1548.0754702224035,558.3200000000052,210,1.6008738888051832,100,True,20,0.61,True,6,13,14,16,3,8,21,1,14,1.82,4.3,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +759,1547.2160685783301,512.6700000000037,219,1.4999658673116119,100,True,20,0.57,True,6,12,16,15,2,8,21,1,14,1.82,5.12,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +593,1525.6245734769718,575.2499999999964,203,1.6151288001112099,100,True,20,0.62,True,6,12,16,16,2,8,21,1,14,2.11,3.59,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +747,1524.3964952493475,504.0700000000106,218,1.4674412997514747,100,True,16,0.68,True,6,13,16,16,2,8,21,1,14,1.6,4.42,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +670,1520.1570366154135,522.5400000000063,210,1.4890910622525482,50,True,20,0.69,True,6,13,16,16,3,8,21,1,14,1.85,4.87,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +202,1497.2323739100516,447.5399999999936,224,1.4264560146363774,100,True,16,0.63,True,6,13,16,15,3,8,21,1,14,1.64,5.48,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +374,1481.9617146723076,470.6999999999971,215,1.4309019004723718,100,True,16,0.64,True,6,12,15,16,2,8,21,1,14,2.05,4.02,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +724,1467.1924910153427,513.1299999999956,203,1.5512725475660982,100,True,20,0.63,True,6,13,16,16,3,8,21,1,14,1.73,5.11,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +678,1463.2998135069693,487.8099999999904,207,1.4971869457977456,100,True,24,0.54,True,6,13,16,15,2,8,21,1,14,1.76,4.76,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +252,1431.0296305372337,496.52000000000953,201,1.4774276675737266,100,True,20,0.68,True,6,12,16,16,3,8,21,1,14,2.13,4.46,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +485,1416.4382602678797,480.3600000000133,201,1.4649830117997813,100,True,20,0.67,True,6,12,14,16,3,8,21,1,14,1.94,5.37,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2471,-inf,0.0,391,0.0,50,True,16,0.53,True,6,12,15,16,3,8,21,1,14,1.78,5.08,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2472,-inf,0.0,231,0.0,50,True,24,0.57,False,6,13,16,16,2,8,21,1,14,1.62,4.32,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2473,-inf,0.0,218,0.0,50,True,16,0.58,False,6,13,15,16,3,8,21,1,14,1.67,3.82,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2474,-inf,0.0,283,0.0,50,True,24,0.62,True,6,13,16,15,3,8,21,1,14,1.62,4.97,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2475,-inf,0.0,236,0.0,50,True,16,0.68,True,6,12,15,16,3,8,21,1,14,1.85,4.89,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2476,-inf,0.0,247,0.0,50,True,20,0.57,False,6,13,16,16,2,8,21,1,14,2.18,3.92,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2477,-inf,0.0,195,0.0,50,True,20,0.6,False,6,12,14,15,3,8,21,1,14,2.11,3.88,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2478,-inf,0.0,205,0.0,50,True,20,0.64,False,6,12,14,15,2,8,21,1,14,1.94,4.94,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2479,-inf,0.0,235,0.0,50,True,16,0.69,True,6,12,14,16,3,8,21,1,14,2.01,4.3,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2480,-inf,0.0,0,0.0,50,True,20,0.63,False,6,12,16,15,3,8,21,2,14,1.66,3.58,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2481,-inf,0.0,259,0.0,50,True,20,0.56,True,6,13,15,16,2,8,21,1,14,1.83,4.96,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2482,-inf,0.0,102,0.0,50,True,24,0.55,True,6,12,16,15,3,8,21,2,14,1.97,3.72,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2483,-inf,0.0,289,0.0,50,True,20,0.52,True,6,13,14,15,2,8,21,1,14,1.91,4.8,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +4,-inf,0.0,0,0.0,100,True,24,0.62,False,6,12,16,15,2,8,21,2,14,1.74,4.08,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +23,-inf,0.0,0,0.0,50,True,24,0.63,False,6,13,14,15,3,8,21,2,14,2.2,5.49,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +25,-inf,951.5499999999956,136,2.969471178722964,50,True,24,0.66,False,6,12,14,16,2,8,21,1,14,2.05,3.81,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +26,-inf,0.0,0,0.0,50,True,24,0.57,False,6,13,15,15,2,8,21,2,14,1.85,4.05,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +27,-inf,395.9299999999985,182,1.3989259337625568,50,True,24,0.7,True,6,13,16,16,2,8,21,1,14,1.65,5.27,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +30,-inf,1288.590000000002,197,2.8388726364609345,50,True,16,0.65,False,6,13,16,15,3,8,21,1,14,2.07,3.72,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +33,-inf,0.0,0,0.0,100,True,20,0.65,False,6,13,16,15,3,8,21,2,14,1.71,3.59,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +34,-inf,0.0,0,0.0,50,True,20,0.59,False,6,13,16,15,3,8,21,2,14,1.79,4.32,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +36,-inf,0.0,0,0.0,100,True,24,0.62,False,6,13,15,16,2,8,21,2,14,1.88,5.3,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +37,-inf,1010.0899999999947,189,2.467066564029571,50,True,20,0.6,False,6,12,14,16,2,8,21,1,14,1.69,3.59,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +39,-inf,1067.7900000000063,160,3.0604955424337152,50,True,16,0.66,False,6,12,16,15,2,8,21,1,14,1.68,4.43,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +40,-inf,860.5500000000011,150,2.7841519291771197,100,True,20,0.62,False,6,13,14,16,3,8,21,1,14,2.05,5.18,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +43,-inf,775.5100000000075,176,2.0954614156766915,100,True,24,0.69,True,6,13,15,15,3,8,21,1,14,2.05,5.21,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +44,-inf,0.0,0,0.0,50,True,20,0.54,False,6,13,14,16,3,8,21,2,14,2.01,4.31,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +48,-inf,724.0099999999984,168,2.209343889891094,100,True,24,0.55,False,6,12,16,15,2,8,21,1,14,1.66,3.55,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +49,-inf,-173.6200000000008,94,0.7157870612886328,100,True,20,0.69,True,6,12,16,15,2,8,21,2,14,2.06,5.2,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +50,-inf,1054.949999999997,185,2.6385282057654074,50,True,20,0.61,False,6,12,16,16,2,8,21,1,14,2.09,3.71,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +53,-inf,781.1600000000053,174,2.2099564752714485,100,True,20,0.57,False,6,12,16,15,2,8,21,1,14,2.03,4.48,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +54,-inf,934.7900000000136,152,2.8124866698982065,100,True,24,0.64,False,6,12,14,16,2,8,21,1,14,2.02,4.11,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +55,-inf,905.899999999996,174,2.506343637240393,100,True,24,0.61,False,6,13,15,16,3,8,21,1,14,1.75,3.74,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +56,-inf,-259.62000000000444,100,0.6253517468288671,50,True,24,0.61,True,6,12,14,16,3,8,21,2,14,1.95,5.02,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +58,-inf,940.0700000000106,151,2.545481447383563,50,True,24,0.67,False,6,12,14,16,3,8,21,1,14,1.86,3.87,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +59,-inf,1584.3200000000124,199,3.982923201476098,100,True,16,0.66,False,6,13,14,15,2,8,21,1,14,2.09,5.4,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +60,-inf,-157.1400000000067,100,0.759768849752339,50,True,24,0.65,True,6,13,15,16,3,8,21,2,14,2.19,4.11,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +61,-inf,0.0,0,0.0,50,True,16,0.63,False,6,12,14,15,2,8,21,2,14,1.65,3.51,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +62,-inf,0.0,0,0.0,100,True,20,0.51,False,6,13,16,16,2,8,21,2,14,1.74,4.03,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +66,-inf,597.6400000000103,193,1.6296581151556655,100,True,24,0.66,True,6,13,15,16,3,8,21,1,14,2.0,5.22,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +67,-inf,1393.8000000000065,148,8.212792382529496,100,True,20,0.63,False,6,12,15,15,3,8,21,1,14,1.79,5.44,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +68,-inf,0.0,0,0.0,50,True,24,0.67,False,6,13,14,15,3,8,21,2,14,2.05,4.75,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +69,-inf,779.2400000000052,177,2.1938533192382526,100,True,24,0.53,False,6,13,16,16,2,8,21,1,14,2.18,4.72,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +71,-inf,1256.8300000000072,171,3.418887969360457,100,True,20,0.67,False,6,12,15,15,3,8,21,1,14,2.15,4.52,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +72,-inf,784.8399999999983,180,2.2334045763138044,100,True,20,0.57,False,6,12,15,16,3,8,21,1,14,1.87,4.47,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +73,-inf,487.0699999999997,197,1.5104645922634332,100,True,20,0.69,True,6,12,16,16,2,8,21,1,14,1.63,4.99,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +75,-inf,-248.21999999999935,100,0.6440014342058085,50,True,24,0.53,True,6,12,15,16,3,8,21,2,14,2.02,4.8,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +76,-inf,0.0,0,0.0,100,True,20,0.63,False,6,12,16,15,2,8,21,2,14,2.01,4.07,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +78,-inf,0.0,0,0.0,100,True,16,0.55,False,6,12,14,15,2,8,21,2,14,2.12,4.74,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +80,-inf,1108.1600000000053,106,9.470228540854544,100,True,24,0.69,False,6,13,15,15,3,8,21,1,14,1.66,4.26,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +85,-inf,0.0,0,0.0,100,True,20,0.63,False,6,13,16,16,2,8,21,2,14,1.74,3.55,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +87,-inf,-354.28000000000065,127,0.6026736648498306,50,True,16,0.68,True,6,13,15,16,3,8,21,2,14,2.05,3.81,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +89,-inf,706.5400000000063,103,2.9539269911504427,100,True,24,0.68,False,6,12,15,16,2,8,21,1,14,2.17,5.15,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +90,-inf,-243.09000000000015,109,0.6650776373982171,50,True,24,0.63,True,6,12,15,15,2,8,21,2,14,1.72,5.16,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +91,-inf,-304.99000000001615,138,0.6645660111741675,50,True,16,0.57,True,6,12,15,15,2,8,21,2,14,1.75,3.85,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +93,-inf,0.0,0,0.0,50,True,20,0.59,False,6,12,15,15,2,8,21,2,14,2.07,5.23,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +94,-inf,506.0700000000088,181,1.5291515924632468,100,True,24,0.69,True,6,13,15,16,2,8,21,1,14,2.03,4.39,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +95,-inf,0.0,0,0.0,50,True,16,0.53,False,6,13,16,16,3,8,21,2,14,1.96,3.7,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +97,-inf,1153.3800000000047,112,9.021838920573098,100,True,20,0.69,False,6,12,14,15,2,8,21,1,14,1.66,4.98,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +98,-inf,0.0,0,0.0,50,True,24,0.69,False,6,12,15,16,3,8,21,2,14,1.63,4.08,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +99,-inf,-316.1600000000053,115,0.6063696012151546,50,True,24,0.6,True,6,13,14,15,3,8,21,2,14,1.82,5.03,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +100,-inf,-231.0599999999995,95,0.6468808264816456,100,True,24,0.69,True,6,13,14,15,3,8,21,2,14,2.06,5.34,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +101,-inf,0.0,0,0.0,50,True,16,0.61,False,6,12,14,15,2,8,21,2,14,1.92,4.25,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +102,-inf,0.0,0,0.0,50,True,20,0.56,False,6,12,14,15,2,8,21,2,14,1.63,3.66,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +103,-inf,1545.7500000000127,182,5.436965382628165,100,True,20,0.62,False,6,13,14,15,3,8,21,1,14,1.67,4.86,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +106,-inf,793.310000000005,124,2.915698727391273,100,True,16,0.67,False,6,13,16,16,3,8,21,1,14,1.84,5.43,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +107,-inf,-276.3000000000029,96,0.5860053940665269,100,True,24,0.68,True,6,13,14,15,3,8,21,2,14,1.84,3.66,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +110,-inf,672.6300000000047,103,2.872942945451508,100,True,24,0.68,False,6,13,14,16,2,8,21,1,14,1.87,4.11,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +111,-inf,1831.1200000000008,194,5.87,50,True,20,0.6,False,6,13,15,15,2,8,21,1,14,2.1,3.65,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +112,-inf,-168.2599999999984,96,0.7167959874101628,100,True,20,0.62,True,6,13,16,15,3,8,21,2,14,1.89,3.8,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +115,-inf,-254.67000000000735,106,0.6528205687488072,50,True,20,0.52,True,6,13,15,16,2,8,21,2,14,2.03,3.67,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +117,-inf,-311.88000000000466,136,0.6597944891681393,50,True,16,0.7,True,6,12,15,15,2,8,21,2,14,1.8,5.03,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +118,-inf,-288.570000000007,109,0.6133220775044219,100,True,16,0.53,True,6,13,14,16,3,8,21,2,14,2.03,5.44,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +119,-inf,950.5200000000041,169,2.756189490798906,100,True,16,0.61,False,6,13,14,16,3,8,21,1,14,2.06,5.06,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +120,-inf,-295.19000000000415,110,0.6143525292642141,100,True,16,0.66,True,6,13,14,16,3,8,21,2,14,2.16,4.92,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +121,-inf,1034.6800000000076,161,2.8046849109587844,100,True,16,0.65,False,6,13,16,15,3,8,21,1,14,2.17,3.94,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +125,-inf,1017.9000000000069,148,2.9703069954705588,50,True,16,0.67,False,6,12,16,15,2,8,21,1,14,1.86,4.73,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +127,-inf,1230.7800000000025,197,2.996172372966573,50,True,20,0.66,False,6,12,16,15,3,8,21,1,14,1.63,4.59,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +129,-inf,1365.2800000000043,197,3.7210363726955653,100,True,24,0.58,False,6,13,14,15,3,8,21,1,14,2.12,3.6,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +130,-inf,1011.6000000000149,156,2.8230311767886107,100,True,16,0.66,False,6,13,16,16,3,8,21,1,14,2.18,4.49,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +132,-inf,-158.3000000000011,81,0.7108358906912173,100,True,24,0.64,True,6,13,15,16,2,8,21,2,14,2.12,4.21,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +134,-inf,0.0,0,0.0,50,True,16,0.55,False,6,13,15,15,2,8,21,2,14,1.87,4.24,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +135,-inf,0.0,0,0.0,50,True,24,0.57,False,6,13,14,15,2,8,21,2,14,1.71,4.54,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +136,-inf,503.220000000003,196,1.547686681686094,100,True,20,0.64,True,6,13,16,16,2,8,21,1,14,1.68,3.65,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +137,-inf,871.3700000000063,133,3.0773118459007796,100,True,16,0.66,False,6,13,16,15,3,8,21,1,14,2.11,4.92,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +139,-inf,472.2400000000034,199,1.4306676515918397,50,True,24,0.68,True,6,13,15,16,3,8,21,1,14,2.09,3.65,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +140,-inf,964.2800000000007,194,2.2764312661327684,50,True,20,0.59,False,6,12,16,15,2,8,21,1,14,1.9,5.24,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +146,-inf,857.6200000000099,135,2.736529856034989,100,True,20,0.67,False,6,12,14,16,3,8,21,1,14,2.06,4.5,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +149,-inf,-265.3099999999995,111,0.6483212046499913,50,True,20,0.61,True,6,13,16,16,3,8,21,2,14,2.01,3.74,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +150,-inf,729.0800000000017,153,2.4190785760165054,100,True,20,0.61,False,6,12,14,16,2,8,21,1,14,1.62,4.93,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +152,-inf,1276.7700000000077,128,6.711339745023484,100,True,24,0.67,False,6,13,15,15,3,8,21,1,14,2.0,5.46,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +153,-inf,-211.09000000000742,97,0.6807229826816911,50,True,24,0.59,True,6,12,16,16,2,8,21,2,14,1.98,4.74,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +155,-inf,-235.1299999999992,86,0.6112268518518519,100,True,24,0.65,True,6,12,16,16,3,8,21,2,14,1.83,5.41,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +156,-inf,0.0,0,0.0,100,True,24,0.57,False,6,13,14,15,3,8,21,2,14,1.78,5.38,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +157,-inf,1025.580000000009,188,2.363422448518366,50,True,24,0.64,False,6,13,15,16,3,8,21,1,14,1.94,4.59,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +160,-inf,-325.2500000000018,128,0.6198174188495751,50,True,16,0.69,True,6,13,16,16,3,8,21,2,14,1.72,5.43,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +163,-inf,0.0,0,0.0,100,True,16,0.65,False,6,12,14,16,3,8,21,2,14,2.0,3.89,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +165,-inf,0.0,0,0.0,100,True,16,0.59,False,6,13,15,15,3,8,21,2,14,1.82,3.97,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +166,-inf,0.0,0,0.0,100,True,20,0.53,False,6,12,16,16,3,8,21,2,14,1.73,5.41,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +167,-inf,706.6000000000022,98,3.223620857853164,100,True,24,0.7,False,6,13,16,16,2,8,21,1,14,2.01,4.69,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +168,-inf,903.140000000003,189,2.257644961844817,100,True,24,0.64,True,6,12,14,15,2,8,21,1,14,1.8,4.54,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +169,-inf,-219.07000000000153,95,0.6638019674345084,50,True,24,0.62,True,6,13,14,16,2,8,21,2,14,1.85,4.63,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +172,-inf,-256.27000000001135,115,0.6552266917799004,50,True,24,0.69,True,6,13,14,15,3,8,21,2,14,1.68,5.46,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +174,-inf,-221.24000000000888,109,0.6869437251489294,50,True,24,0.58,True,6,12,14,15,2,8,21,2,14,1.62,4.7,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +176,-inf,1292.7200000000048,139,7.424091835213438,100,True,24,0.62,False,6,12,15,15,2,8,21,1,14,1.78,3.62,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +177,-inf,0.0,0,0.0,50,True,24,0.64,False,6,12,15,16,3,8,21,2,14,1.85,3.8,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +178,-inf,1430.0500000000084,148,6.491954376128116,100,True,16,0.67,False,6,12,15,15,3,8,21,1,14,1.93,3.77,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +182,-inf,1003.79000000001,136,3.4339613491428436,100,True,24,0.68,False,6,12,16,16,3,8,21,1,14,1.82,4.33,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +184,-inf,1291.3200000000052,130,8.988864142538976,100,True,20,0.65,False,6,13,15,15,3,8,21,1,14,1.68,4.59,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +185,-inf,-231.35000000000036,98,0.6526276276276276,50,True,24,0.51,True,6,12,14,16,2,8,21,2,14,1.74,4.91,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +187,-inf,1831.4900000000089,165,7.911283018867925,50,True,24,0.66,False,6,12,14,15,2,8,21,1,14,1.72,4.55,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +188,-inf,865.1499999999942,188,2.251120751988431,100,True,16,0.57,False,6,13,16,15,2,8,21,1,14,2.01,5.2,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +190,-inf,540.8599999999951,195,1.5225851957061556,50,True,24,0.68,True,6,12,16,16,3,8,21,1,14,2.15,4.87,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +191,-inf,2031.100000000013,173,10.2714657415438,50,True,16,0.69,False,6,12,14,15,3,8,21,1,14,1.78,4.63,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +192,-inf,524.6700000000128,186,1.58154511194857,100,True,20,0.65,True,6,12,16,16,2,8,21,1,14,1.86,5.18,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +193,-inf,0.0,0,0.0,100,True,20,0.51,False,6,13,15,15,3,8,21,2,14,2.16,4.36,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +194,-inf,1327.520000000006,178,3.7927799049101703,100,True,16,0.65,False,6,12,16,15,2,8,21,1,14,1.69,4.92,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +198,-inf,-198.09000000000742,107,0.7084339122755373,100,True,20,0.6,True,6,13,15,15,3,8,21,2,14,1.97,4.42,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +199,-inf,0.0,0,0.0,50,True,20,0.57,False,6,13,15,16,3,8,21,2,14,2.18,3.77,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +203,-inf,1255.8400000000056,149,5.649709356140547,100,True,24,0.6,False,6,12,15,15,2,8,21,1,14,1.99,4.21,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +204,-inf,1522.9900000000016,117,12.941273326015368,50,True,24,0.7,False,6,13,15,15,2,8,21,1,14,1.76,4.52,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +207,-inf,-249.6300000000101,118,0.6789035668806195,50,True,20,0.51,True,6,12,15,15,2,8,21,2,14,1.75,3.85,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +208,-inf,764.9599999999955,190,2.063818543396331,100,True,20,0.55,False,6,12,14,16,3,8,21,1,14,2.04,5.27,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +209,-inf,-187.83000000000538,105,0.7143139610932818,100,True,20,0.5,True,6,12,15,15,2,8,21,2,14,1.71,4.15,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +210,-inf,682.5099999999984,103,2.8561094340648885,100,True,24,0.67,False,6,13,16,16,2,8,21,1,14,1.81,4.42,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +212,-inf,0.0,0,0.0,100,True,24,0.53,False,6,13,14,16,2,8,21,2,14,1.7,4.08,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +214,-inf,1507.1100000000115,167,6.23211248047214,100,True,20,0.64,False,6,13,14,15,2,8,21,1,14,1.78,4.05,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +215,-inf,0.0,0,0.0,50,True,20,0.61,False,6,12,16,15,3,8,21,2,14,2.09,4.23,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +218,-inf,1092.270000000004,152,3.062754947877323,50,True,20,0.7,False,6,13,16,16,2,8,21,1,14,2.18,5.07,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +219,-inf,-244.04000000000633,95,0.6305223315669947,50,True,24,0.67,True,6,12,16,16,2,8,21,2,14,1.84,3.78,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +221,-inf,1023.1900000000078,146,2.8447489407734605,50,True,24,0.69,False,6,12,16,16,2,8,21,1,14,2.09,4.49,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +222,-inf,1200.5500000000047,178,3.4798603651987112,100,True,24,0.62,False,6,13,16,15,2,8,21,1,14,1.98,5.17,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +223,-inf,1003.3000000000011,198,2.332492197357062,50,True,20,0.59,False,6,12,16,15,3,8,21,1,14,2.12,5.25,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +227,-inf,-328.5300000000025,122,0.6194442192079139,50,True,16,0.61,True,6,12,15,16,2,8,21,2,14,2.05,5.34,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +229,-inf,0.0,0,0.0,50,True,16,0.61,False,6,12,16,16,2,8,21,2,14,1.96,3.88,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +231,-inf,1284.3500000000004,129,8.08450548844393,100,True,24,0.64,False,6,12,14,15,2,8,21,1,14,1.73,5.35,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +232,-inf,0.0,0,0.0,100,True,24,0.64,False,6,13,16,16,2,8,21,2,14,1.92,4.73,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +233,-inf,-276.57000000000335,109,0.6233453178623958,100,True,16,0.6,True,6,12,16,16,3,8,21,2,14,1.98,5.17,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +235,-inf,-311.480000000005,128,0.6361852479121649,50,True,16,0.5,True,6,12,14,16,3,8,21,2,14,1.91,5.15,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +236,-inf,878.6700000000019,138,2.9218083593972137,100,True,16,0.65,False,6,12,14,16,3,8,21,1,14,1.91,4.03,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +240,-inf,0.0,0,0.0,50,True,20,0.51,False,6,13,15,16,2,8,21,2,14,1.87,4.24,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +241,-inf,0.0,0,0.0,100,True,24,0.62,False,6,13,16,16,2,8,21,2,14,2.14,5.02,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +242,-inf,0.0,0,0.0,50,True,20,0.5,False,6,12,15,15,3,8,21,2,14,2.04,3.71,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +243,-inf,-206.48999999999614,104,0.6905125899280575,100,True,20,0.69,True,6,13,14,15,2,8,21,2,14,1.85,5.29,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +244,-inf,-210.3499999999949,110,0.7156356459200779,50,True,24,0.52,True,6,13,14,15,3,8,21,2,14,2.18,3.97,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +245,-inf,984.4300000000021,135,3.233179075359557,100,True,24,0.67,False,6,13,15,16,2,8,21,1,14,2.17,3.77,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +247,-inf,-251.85000000001492,109,0.6594228376697139,50,True,24,0.56,True,6,12,15,15,2,8,21,2,14,1.75,4.21,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +249,-inf,-334.75000000000364,127,0.6203572441168131,50,True,16,0.67,True,6,12,14,16,3,8,21,2,14,1.98,4.79,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +251,-inf,0.0,0,0.0,50,True,20,0.51,False,6,13,15,15,3,8,21,2,14,1.86,4.21,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +253,-inf,-298.50000000000546,109,0.6077374929366466,100,True,16,0.58,True,6,12,15,16,3,8,21,2,14,2.07,4.19,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +255,-inf,-315.0700000000088,123,0.6346463814835859,50,True,16,0.52,True,6,13,16,15,2,8,21,2,14,2.11,5.09,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +256,-inf,0.0,0,0.0,50,True,16,0.62,False,6,12,16,16,2,8,21,2,14,2.17,5.17,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +257,-inf,-269.9800000000032,120,0.6596619057823944,100,True,16,0.6,True,6,12,14,15,2,8,21,2,14,1.89,4.16,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +259,-inf,0.0,0,0.0,100,True,24,0.52,False,6,13,14,15,3,8,21,2,14,2.18,4.8,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +261,-inf,-316.91000000000895,144,0.6593830610490112,50,True,16,0.62,True,6,12,15,15,3,8,21,2,14,1.65,4.19,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +262,-inf,997.4500000000007,159,2.7700033716039965,50,True,24,0.63,False,6,13,14,16,2,8,21,1,14,2.02,4.2,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +268,-inf,1068.9800000000032,164,2.734202884443796,50,True,20,0.67,False,6,13,15,16,3,8,21,1,14,1.99,4.28,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +269,-inf,830.9299999999985,178,2.2446897750082386,100,True,16,0.59,False,6,13,15,16,2,8,21,1,14,1.94,3.8,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +270,-inf,0.0,0,0.0,50,True,16,0.63,False,6,12,16,15,3,8,21,2,14,1.85,4.57,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +273,-inf,0.0,0,0.0,100,True,24,0.58,False,6,13,16,16,2,8,21,2,14,1.97,4.55,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +274,-inf,-291.4300000000021,109,0.6140511190570785,100,True,16,0.53,True,6,12,16,15,3,8,21,2,14,2.13,5.26,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +275,-inf,-184.6600000000053,82,0.6686345936440146,100,True,24,0.62,True,6,12,15,16,2,8,21,2,14,1.97,4.89,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +276,-inf,1280.0400000000009,180,4.749494712791822,100,True,24,0.55,False,6,13,15,15,3,8,21,1,14,1.79,5.19,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +278,-inf,693.2900000000027,196,1.7462996652206206,100,True,24,0.67,True,6,12,14,16,3,8,21,1,14,2.07,4.55,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +280,-inf,-184.60999999999694,85,0.670362831226341,100,True,24,0.58,True,6,12,14,16,3,8,21,2,14,1.87,5.42,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +283,-inf,757.0800000000054,113,3.1299198199465468,100,True,24,0.66,False,6,13,15,16,3,8,21,1,14,1.75,4.43,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +285,-inf,0.0,0,0.0,100,True,24,0.64,False,6,12,14,15,2,8,21,2,14,1.84,4.14,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +286,-inf,0.0,0,0.0,50,True,24,0.6,False,6,13,15,16,3,8,21,2,14,1.62,4.92,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +287,-inf,0.0,0,0.0,100,True,24,0.64,False,6,13,16,16,2,8,21,2,14,2.13,3.86,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +289,-inf,1542.4400000000114,180,5.282771067610718,100,True,20,0.62,False,6,12,15,15,2,8,21,1,14,2.13,4.5,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +290,-inf,-185.26000000000022,96,0.7036930409609263,100,True,20,0.51,True,6,12,14,16,3,8,21,2,14,2.14,5.47,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +293,-inf,-207.75000000000182,95,0.6676319073368956,50,True,24,0.57,True,6,13,16,15,2,8,21,2,14,1.6,4.97,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +294,-inf,1424.2600000000039,199,4.234014532243415,100,True,20,0.53,False,6,13,14,15,2,8,21,1,14,2.17,4.41,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +297,-inf,-168.23999999999978,82,0.6881036688233441,100,True,24,0.62,True,6,12,16,15,2,8,21,2,14,1.67,4.39,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +298,-inf,-128.89000000000124,94,0.7757459765115268,100,True,20,0.64,True,6,12,15,16,2,8,21,2,14,1.91,4.75,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +300,-inf,-162.1800000000003,82,0.7090993883517784,100,True,24,0.58,True,6,12,16,16,2,8,21,2,14,2.16,4.16,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +301,-inf,2024.2500000000127,177,8.545569761807135,50,True,16,0.67,False,6,12,14,15,2,8,21,1,14,1.99,4.41,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +303,-inf,1074.7000000000062,191,2.4819768884966495,50,True,24,0.63,False,6,13,15,16,2,8,21,1,14,2.09,3.87,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +304,-inf,1029.7700000000023,147,3.298132071682028,100,True,20,0.67,False,6,13,16,15,2,8,21,1,14,2.02,3.62,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +305,-inf,0.0,0,0.0,100,True,24,0.6,False,6,12,16,16,3,8,21,2,14,1.62,4.87,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +306,-inf,0.0,0,0.0,100,True,20,0.52,False,6,13,14,15,3,8,21,2,14,1.79,4.91,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +307,-inf,518.2000000000007,197,1.493805984372022,50,True,24,0.67,True,6,13,16,15,3,8,21,1,14,2.0,4.78,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +309,-inf,0.0,0,0.0,50,True,24,0.63,False,6,12,14,16,3,8,21,2,14,1.87,5.21,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +310,-inf,-217.25000000000182,106,0.6919619436527854,50,True,20,0.65,True,6,12,15,16,2,8,21,2,14,1.93,5.15,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +311,-inf,1450.7000000000062,177,4.981392540549441,100,True,24,0.61,False,6,13,15,15,2,8,21,1,14,1.8,5.03,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +312,-inf,-133.96999999999935,84,0.7573446839340698,100,True,24,0.59,True,6,12,14,16,3,8,21,2,14,2.18,4.08,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +313,-inf,1469.4899999999998,188,3.5636154289004027,50,True,16,0.68,False,6,12,16,16,2,8,21,1,14,1.97,3.88,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +315,-inf,0.0,0,0.0,50,True,24,0.65,False,6,13,16,15,2,8,21,2,14,2.09,3.71,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +316,-inf,690.0100000000002,105,2.9213376771642583,100,True,24,0.68,False,6,12,15,16,3,8,21,1,14,1.87,3.77,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +317,-inf,0.0,0,0.0,100,True,24,0.61,False,6,12,14,15,3,8,21,2,14,1.81,4.84,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +318,-inf,0.0,0,0.0,50,True,24,0.61,False,6,12,15,16,3,8,21,2,14,2.05,5.18,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +320,-inf,797.0300000000007,124,3.0060657924542546,100,True,16,0.67,False,6,12,16,15,3,8,21,1,14,1.66,5.24,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +321,-inf,1082.0299999999988,191,2.5241147139194866,50,True,24,0.63,False,6,12,16,16,2,8,21,1,14,1.83,5.41,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +322,-inf,-258.4399999999987,122,0.6914996478579016,50,True,16,0.65,True,6,13,14,16,2,8,21,2,14,2.18,4.09,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +323,-inf,-339.4500000000153,130,0.6101367880646384,50,True,16,0.69,True,6,13,14,16,3,8,21,2,14,1.76,3.82,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +324,-inf,-150.49000000000706,93,0.7450704702534218,100,True,20,0.64,True,6,12,14,16,2,8,21,2,14,1.97,4.82,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +325,-inf,1532.3800000000174,199,3.84850174734181,100,True,16,0.66,False,6,12,14,15,2,8,21,1,14,1.93,4.31,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +326,-inf,1030.1499999999996,185,2.483169200645013,50,True,24,0.57,False,6,13,14,16,2,8,21,1,14,2.0,4.39,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +327,-inf,0.0,0,0.0,50,True,16,0.64,False,6,13,14,16,3,8,21,2,14,2.03,3.55,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +329,-inf,-355.64000000000306,142,0.6372833991167681,50,True,16,0.63,True,6,13,14,15,3,8,21,2,14,2.09,3.64,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +331,-inf,0.0,0,0.0,100,True,20,0.59,False,6,13,15,15,3,8,21,2,14,1.67,3.51,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +332,-inf,-287.5600000000013,101,0.592396773873478,50,True,24,0.62,True,6,13,16,15,3,8,21,2,14,1.78,3.67,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +333,-inf,-190.67000000000007,86,0.6597244530106721,100,True,24,0.51,True,6,12,14,16,3,8,21,2,14,1.69,4.85,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +334,-inf,-310.65999999999985,122,0.6200063605450498,100,True,16,0.61,True,6,12,14,15,3,8,21,2,14,1.93,3.67,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +336,-inf,0.0,0,0.0,100,True,24,0.61,False,6,12,15,15,2,8,21,2,14,1.95,5.4,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +338,-inf,-195.49000000000342,105,0.712370891328017,100,True,20,0.69,True,6,12,15,15,2,8,21,2,14,2.04,4.37,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +339,-inf,0.0,0,0.0,100,True,20,0.59,False,6,13,15,15,2,8,21,2,14,1.96,5.18,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +340,-inf,-269.0800000000072,124,0.6626252241182592,50,True,20,0.65,True,6,12,14,15,3,8,21,2,14,1.73,3.57,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +341,-inf,760.0200000000059,112,3.07951187479479,100,True,24,0.66,False,6,13,14,16,2,8,21,1,14,1.9,3.68,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +342,-inf,-258.5,105,0.6586827928594063,50,True,24,0.55,True,6,12,15,15,2,8,21,2,14,2.17,4.82,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +344,-inf,-170.09999999999854,96,0.7150371909133553,100,True,20,0.68,True,6,13,14,16,3,8,21,2,14,1.93,3.85,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +345,-inf,976.1000000000076,196,2.4030271233703697,100,True,24,0.63,True,6,13,15,15,3,8,21,1,14,2.09,4.19,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +346,-inf,1580.2299999999996,128,10.713732480944184,50,True,24,0.68,False,6,12,14,15,3,8,21,1,14,1.69,3.81,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +349,-inf,1356.4300000000003,186,3.357573650821239,50,True,24,0.65,False,6,12,14,16,3,8,21,1,14,1.7,5.16,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +350,-inf,0.0,0,0.0,50,True,24,0.63,False,6,12,16,16,3,8,21,2,14,1.95,3.96,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +354,-inf,-171.84000000000378,97,0.713399379565696,100,True,20,0.54,True,6,12,16,15,3,8,21,2,14,1.72,5.11,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +355,-inf,0.0,0,0.0,50,True,16,0.59,False,6,13,16,16,3,8,21,2,14,1.77,4.86,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +356,-inf,0.0,0,0.0,100,True,16,0.57,False,6,13,15,16,3,8,21,2,14,1.68,5.23,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +357,-inf,-260.6200000000117,112,0.6564234394568585,50,True,20,0.66,True,6,12,14,16,3,8,21,2,14,1.97,4.87,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +359,-inf,980.410000000009,177,2.668271848625102,100,True,20,0.62,False,6,12,14,16,3,8,21,1,14,1.72,4.81,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +361,-inf,793.5200000000077,142,2.638116471583989,100,True,20,0.63,False,6,12,16,15,2,8,21,1,14,1.93,4.95,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +362,-inf,668.1100000000042,113,2.651775118670886,100,True,20,0.69,False,6,12,16,15,3,8,21,1,14,1.94,4.02,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +363,-inf,0.0,0,0.0,50,True,24,0.51,False,6,13,14,16,3,8,21,2,14,1.87,4.25,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +364,-inf,560.3200000000015,194,1.622017961612327,100,True,20,0.64,True,6,13,14,16,2,8,21,1,14,1.98,5.49,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +366,-inf,-261.96000000000095,126,0.6757278669043375,50,True,20,0.56,True,6,13,14,15,3,8,21,2,14,1.72,4.97,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +367,-inf,0.0,0,0.0,50,True,16,0.67,False,6,12,14,15,2,8,21,2,14,2.17,4.49,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +372,-inf,-136.8099999999995,93,0.7607338358488257,100,True,20,0.54,True,6,12,14,16,2,8,21,2,14,1.86,4.26,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +376,-inf,0.0,0,0.0,100,True,16,0.58,False,6,13,16,15,2,8,21,2,14,2.08,4.17,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +377,-inf,0.0,0,0.0,100,True,16,0.52,False,6,12,15,16,3,8,21,2,14,1.76,4.79,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +378,-inf,1257.600000000004,138,6.520389798516308,100,True,24,0.62,False,6,13,14,15,2,8,21,1,14,2.04,4.82,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +381,-inf,1060.380000000001,192,2.5307041602910183,50,True,24,0.57,False,6,13,15,16,3,8,21,1,14,2.18,4.9,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +382,-inf,1103.560000000005,151,3.509630909876515,100,True,24,0.65,False,6,13,15,16,2,8,21,1,14,1.87,4.23,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +383,-inf,-282.8100000000104,106,0.6194442575523111,100,True,16,0.5,True,6,13,15,16,2,8,21,2,14,2.15,5.39,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +393,-inf,-243.40000000000873,124,0.6888064949178546,50,True,20,0.65,True,6,12,15,15,3,8,21,2,14,1.64,4.21,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +394,-inf,0.0,0,0.0,50,True,16,0.6,False,6,13,15,15,2,8,21,2,14,1.83,4.95,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +395,-inf,1236.4200000000055,158,5.000452971818682,100,True,24,0.59,False,6,13,14,15,3,8,21,1,14,2.04,4.05,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +400,-inf,-248.3900000000176,111,0.6490873643761301,100,True,16,0.59,True,6,13,16,16,3,8,21,2,14,1.63,4.73,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +402,-inf,0.0,0,0.0,50,True,24,0.65,False,6,12,16,16,3,8,21,2,14,2.0,5.27,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +404,-inf,876.7400000000034,173,2.409640491349926,50,True,24,0.61,False,6,13,15,16,3,8,21,1,14,1.6,3.57,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +406,-inf,0.0,0,0.0,50,True,16,0.51,False,6,12,14,16,3,8,21,2,14,1.75,4.01,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +407,-inf,-254.0899999999947,95,0.6179844541668547,100,True,24,0.68,True,6,13,15,15,3,8,21,2,14,2.02,5.14,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +408,-inf,919.940000000006,138,3.0800416035453457,100,True,16,0.65,False,6,12,14,16,3,8,21,1,14,1.85,5.24,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +409,-inf,0.0,0,0.0,50,True,24,0.66,False,6,12,15,15,3,8,21,2,14,1.94,4.15,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +411,-inf,-254.39999999999964,123,0.6817852050133839,50,True,20,0.61,True,6,13,15,15,3,8,21,2,14,1.86,4.9,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +414,-inf,-237.74000000000524,107,0.6738372890657155,50,True,20,0.51,True,6,12,16,16,2,8,21,2,14,2.11,3.72,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +419,-inf,1151.2800000000043,174,2.816844729906734,50,True,16,0.68,False,6,13,15,16,2,8,21,1,14,1.81,4.2,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +424,-inf,1243.3000000000065,126,7.351144258275439,100,True,24,0.69,False,6,12,14,15,2,8,21,1,14,1.62,5.47,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +425,-inf,-203.41000000000895,94,0.6876669840002457,50,True,24,0.55,True,6,13,14,16,2,8,21,2,14,2.11,4.44,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +427,-inf,-259.43000000000575,113,0.6569702098401408,50,True,24,0.63,True,6,12,14,15,3,8,21,2,14,1.89,4.15,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +428,-inf,1292.810000000005,122,10.227765881513205,100,True,20,0.66,False,6,13,15,15,2,8,21,1,14,1.87,5.26,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +430,-inf,-215.79999999999745,106,0.6903251729185202,50,True,20,0.56,True,6,12,15,16,2,8,21,2,14,1.9,3.86,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +431,-inf,978.389999999994,198,2.287914489186094,50,True,20,0.58,False,6,12,14,16,2,8,21,1,14,1.65,4.15,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +434,-inf,1127.0700000000052,154,3.4346445466917244,100,True,24,0.65,False,6,13,16,15,2,8,21,1,14,2.18,3.51,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +436,-inf,-283.8699999999935,106,0.619925556983719,50,True,24,0.56,True,6,12,14,15,2,8,21,2,14,1.81,3.79,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +437,-inf,-210.41999999999643,104,0.6897329656880814,100,True,20,0.68,True,6,12,15,15,2,8,21,2,14,1.77,4.82,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +438,-inf,1075.9400000000023,157,3.0033888206159465,50,True,20,0.65,False,6,12,14,16,3,8,21,1,14,2.14,5.14,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +439,-inf,-233.65000000000873,106,0.6684545854440708,50,True,20,0.59,True,6,13,15,16,2,8,21,2,14,1.73,3.62,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +440,-inf,0.0,0,0.0,50,True,20,0.64,False,6,13,16,16,3,8,21,2,14,1.95,4.75,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +441,-inf,1362.1800000000112,181,4.020689655172414,100,True,24,0.65,False,6,13,14,15,3,8,21,1,14,1.6,3.55,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +442,-inf,1212.380000000001,149,3.604748093243098,50,True,24,0.7,False,6,12,15,16,2,8,21,1,14,1.98,4.88,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +444,-inf,1858.560000000014,166,8.074838218500192,50,True,20,0.67,False,6,13,14,15,3,8,21,1,14,1.98,5.28,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +446,-inf,893.5399999999972,139,2.7081302211771905,50,True,20,0.67,False,6,13,16,15,3,8,21,1,14,1.96,5.23,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +450,-inf,-257.18000000000393,105,0.6528956851524436,50,True,24,0.67,True,6,13,15,15,2,8,21,2,14,2.06,4.99,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +451,-inf,0.0,0,0.0,100,True,24,0.68,False,6,12,14,16,3,8,21,2,14,1.79,4.38,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +454,-inf,0.0,0,0.0,50,True,20,0.58,False,6,13,15,16,2,8,21,2,14,2.06,5.12,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +455,-inf,1223.7300000000123,190,2.899051816446562,50,True,16,0.66,False,6,12,15,16,3,8,21,1,14,1.74,3.95,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +457,-inf,-209.14999999999964,107,0.694408322496749,100,True,20,0.62,True,6,12,15,15,3,8,21,2,14,1.99,5.08,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +459,-inf,-178.0599999999995,82,0.6792347462665057,100,True,24,0.64,True,6,12,16,16,2,8,21,2,14,1.96,4.15,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +461,-inf,1198.6299999999956,186,3.051008709638781,50,True,16,0.63,False,6,13,15,16,2,8,21,1,14,2.01,4.13,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +462,-inf,1152.1600000000017,185,3.0880785820435683,100,True,20,0.64,False,6,12,16,15,3,8,21,1,14,2.11,3.62,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +463,-inf,1732.5400000000027,173,6.831700831397894,50,True,24,0.61,False,6,12,15,15,2,8,21,1,14,2.02,4.29,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +464,-inf,-234.4399999999987,105,0.6649133840260706,100,True,20,0.58,True,6,12,15,15,2,8,21,2,14,1.83,5.35,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +465,-inf,-150.01000000000204,82,0.7272396676182337,100,True,24,0.53,True,6,12,16,15,2,8,21,2,14,2.13,4.82,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +466,-inf,0.0,0,0.0,50,True,24,0.66,False,6,13,16,15,3,8,21,2,14,1.85,5.14,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +468,-inf,0.0,0,0.0,100,True,24,0.57,False,6,12,14,16,3,8,21,2,14,1.65,5.28,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +469,-inf,-186.40000000000146,84,0.6753800874244614,100,True,24,0.65,True,6,13,16,15,3,8,21,2,14,2.07,4.44,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +470,-inf,0.0,0,0.0,100,True,20,0.57,False,6,13,14,15,3,8,21,2,14,2.07,4.02,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +472,-inf,0.0,0,0.0,50,True,24,0.56,False,6,12,16,15,2,8,21,2,14,2.04,4.82,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +473,-inf,-233.30999999999767,91,0.6384080095469833,100,True,24,0.55,True,6,12,15,15,2,8,21,2,14,2.16,3.81,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +474,-inf,-253.5900000000147,107,0.6414675526650644,100,True,16,0.63,True,6,12,16,16,2,8,21,2,14,1.76,5.14,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +475,-inf,889.0899999999983,192,2.252486405770152,100,True,20,0.6,False,6,12,15,16,3,8,21,1,14,1.69,5.24,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +476,-inf,-188.15000000000873,96,0.7004553270075781,100,True,20,0.64,True,6,12,16,16,3,8,21,2,14,2.15,5.22,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +477,-inf,0.0,0,0.0,100,True,16,0.55,False,6,13,16,15,2,8,21,2,14,1.8,4.88,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +478,-inf,-243.1999999999971,106,0.6599362380446334,50,True,24,0.5,True,6,12,15,15,2,8,21,2,14,1.87,3.94,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +479,-inf,-346.69000000000415,123,0.6081890511278875,50,True,16,0.5,True,6,12,16,15,2,8,21,2,14,2.17,3.67,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +480,-inf,622.6100000000042,194,1.6576217837677973,100,True,24,0.65,True,6,12,16,15,3,8,21,1,14,1.88,5.37,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +481,-inf,1531.0100000000093,168,6.376681299385425,100,True,20,0.64,False,6,13,14,15,3,8,21,1,14,1.83,4.17,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +482,-inf,0.0,0,0.0,100,True,16,0.59,False,6,12,16,16,2,8,21,2,14,1.9,3.79,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +484,-inf,0.0,0,0.0,50,True,16,0.63,False,6,12,16,16,3,8,21,2,14,1.6,4.92,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +489,-inf,-273.38000000000466,123,0.6740897928041771,50,True,20,0.51,True,6,13,14,15,3,8,21,2,14,2.12,4.57,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +490,-inf,-316.30000000001746,130,0.6268639109097773,50,True,16,0.51,True,6,13,16,15,3,8,21,2,14,1.63,4.9,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +496,-inf,-240.3000000000011,98,0.6391891891891892,50,True,24,0.6,True,6,13,15,16,2,8,21,2,14,1.74,3.74,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +497,-inf,1413.5600000000068,182,4.280711119363149,100,True,24,0.6,False,6,12,15,15,2,8,21,1,14,2.08,4.87,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +501,-inf,0.0,0,0.0,50,True,16,0.59,False,6,12,15,15,2,8,21,2,14,1.87,4.27,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +502,-inf,0.0,0,0.0,50,True,24,0.57,False,6,12,15,15,2,8,21,2,14,1.94,4.06,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +503,-inf,0.0,0,0.0,100,True,20,0.53,False,6,12,15,15,2,8,21,2,14,2.18,5.21,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +505,-inf,-259.420000000011,113,0.6554115084214441,50,True,20,0.7,True,6,13,16,15,3,8,21,2,14,1.84,5.12,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +508,-inf,0.0,0,0.0,50,True,24,0.51,False,6,12,15,16,3,8,21,2,14,2.17,4.58,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +510,-inf,-239.69000000000415,106,0.6658301615848983,50,True,24,0.64,True,6,12,15,15,2,8,21,2,14,1.89,5.38,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +511,-inf,853.5699999999979,143,2.6059038229981937,50,True,24,0.65,False,6,13,15,16,3,8,21,1,14,1.64,4.19,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +513,-inf,-216.70000000000073,106,0.6858691870578685,50,True,20,0.69,True,6,12,14,16,2,8,21,2,14,1.69,3.8,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +514,-inf,-241.45999999999913,112,0.6780490406538754,50,True,20,0.58,True,6,13,15,16,3,8,21,2,14,1.99,4.08,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +515,-inf,0.0,0,0.0,50,True,24,0.63,False,6,13,16,16,3,8,21,2,14,2.0,4.56,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +520,-inf,0.0,0,0.0,50,True,24,0.61,False,6,13,15,16,2,8,21,2,14,2.04,5.34,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +524,-inf,392.7100000000064,180,1.4345338865836792,100,True,20,0.67,True,6,12,16,16,3,8,21,1,14,1.77,5.11,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +525,-inf,-263.87000000000626,109,0.6456884281762763,100,True,16,0.67,True,6,12,14,16,3,8,21,2,14,2.19,3.63,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +527,-inf,919.5499999999975,137,2.8016261755485896,50,True,20,0.67,False,6,13,16,16,2,8,21,1,14,2.07,3.81,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +528,-inf,888.6200000000026,154,2.8671233164541,100,True,16,0.63,False,6,13,14,16,2,8,21,1,14,1.67,4.05,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +529,-inf,1144.5099999999948,191,3.0203534042966336,100,True,24,0.6,False,6,13,16,16,2,8,21,1,14,1.91,4.65,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +531,-inf,-169.26999999999862,93,0.7212790831700451,100,True,20,0.61,True,6,12,16,15,2,8,21,2,14,2.05,4.59,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +532,-inf,943.200000000008,164,2.76950640676885,100,True,20,0.64,False,6,12,16,16,2,8,21,1,14,1.68,4.06,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +534,-inf,0.0,0,0.0,100,True,20,0.56,False,6,12,15,16,2,8,21,2,14,1.78,4.99,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +538,-inf,-180.36000000000604,105,0.7256756962294858,100,True,20,0.53,True,6,12,14,15,2,8,21,2,14,1.71,4.06,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +539,-inf,0.0,0,0.0,50,True,16,0.68,False,6,13,16,15,3,8,21,2,14,2.17,3.86,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +540,-inf,1409.0800000000054,179,5.038635712238464,100,True,16,0.6,False,6,12,15,15,3,8,21,1,14,1.91,4.49,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +543,-inf,-170.70000000000437,97,0.7168261973092683,100,True,20,0.6,True,6,12,14,16,3,8,21,2,14,1.95,3.7,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +547,-inf,1134.4100000000035,189,2.813373189679977,50,True,16,0.63,False,6,13,14,16,3,8,21,1,14,1.9,4.58,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +549,-inf,789.0300000000025,184,2.201745434607125,100,True,24,0.53,False,6,12,15,16,3,8,21,1,14,1.94,4.48,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +550,-inf,-132.01000000000022,96,0.7825564157469939,100,True,20,0.61,True,6,12,15,16,3,8,21,2,14,2.18,4.73,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +551,-inf,-283.75000000000364,106,0.6070869739811956,100,True,16,0.51,True,6,12,15,16,2,8,21,2,14,1.8,3.69,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +552,-inf,-150.3900000000067,94,0.7402904657468009,100,True,20,0.51,True,6,12,14,16,2,8,21,2,14,1.64,4.11,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +555,-inf,482.56000000000495,198,1.484133433659393,100,True,20,0.69,True,6,13,16,15,2,8,21,1,14,1.76,4.09,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +557,-inf,889.9800000000014,154,2.7916775713164093,100,True,16,0.63,False,6,13,15,16,2,8,21,1,14,1.84,4.75,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +558,-inf,-312.85000000000036,127,0.6359627177416539,50,True,16,0.63,True,6,13,14,16,3,8,21,2,14,1.92,4.73,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +561,-inf,835.6200000000026,155,2.652729430379747,100,True,20,0.61,False,6,13,16,15,2,8,21,1,14,1.76,3.56,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +562,-inf,0.0,0,0.0,50,True,24,0.67,False,6,12,14,15,3,8,21,2,14,1.78,3.63,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +565,-inf,-251.12000000001171,112,0.6643274384782987,50,True,20,0.61,True,6,13,16,16,3,8,21,2,14,1.75,4.06,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +566,-inf,0.0,0,0.0,100,True,24,0.57,False,6,12,16,15,2,8,21,2,14,2.15,4.84,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +567,-inf,965.6400000000103,170,2.872774523874171,100,True,20,0.63,False,6,12,16,15,3,8,21,1,14,1.6,5.42,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +569,-inf,511.8400000000056,195,1.5541972996091256,100,True,20,0.64,True,6,12,16,16,2,8,21,1,14,1.85,4.96,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +570,-inf,503.26000000000204,195,1.5406108001847656,100,True,20,0.64,True,6,12,16,16,2,8,21,1,14,1.84,4.76,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +571,-inf,-314.1100000000097,128,0.62479992355288,50,True,16,0.53,True,6,13,15,16,3,8,21,2,14,1.68,3.85,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +574,-inf,-249.0699999999997,110,0.6481813687407302,100,True,16,0.69,True,6,12,16,16,3,8,21,2,14,1.9,3.95,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +575,-inf,1424.4800000000087,152,6.248830096908508,100,True,20,0.65,False,6,12,15,15,2,8,21,1,14,2.04,3.88,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +577,-inf,0.0,0,0.0,100,True,16,0.67,False,6,12,16,16,3,8,21,2,14,1.96,3.65,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +578,-inf,879.5300000000043,133,2.8217274233637113,50,True,20,0.69,False,6,13,16,15,2,8,21,1,14,1.9,4.26,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +580,-inf,0.0,0,0.0,100,True,16,0.55,False,6,12,14,16,3,8,21,2,14,1.82,4.36,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +581,-inf,-145.06000000000677,82,0.7338006716458996,100,True,24,0.56,True,6,13,16,16,2,8,21,2,14,2.11,4.81,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +582,-inf,-284.86000000000786,123,0.651129182383775,50,True,16,0.51,True,6,12,15,16,2,8,21,2,14,1.88,3.73,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +583,-inf,1219.2100000000028,162,3.6567518685581057,100,True,20,0.7,False,6,13,15,15,2,8,21,1,14,1.81,3.91,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +584,-inf,986.8400000000001,171,2.5707259617680296,50,True,24,0.6,False,6,12,16,15,2,8,21,1,14,2.15,3.99,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +590,-inf,0.0,0,0.0,100,True,24,0.54,False,6,12,14,16,3,8,21,2,14,1.73,4.87,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +591,-inf,-268.75000000000364,118,0.671032498928943,50,True,20,0.59,True,6,13,15,15,2,8,21,2,14,2.14,5.18,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +594,-inf,939.4000000000069,177,2.577948364772479,100,True,20,0.62,False,6,13,16,16,3,8,21,1,14,1.73,3.66,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +595,-inf,-226.99000000000524,118,0.7047169320428764,50,True,20,0.61,True,6,13,14,15,2,8,21,2,14,1.89,4.88,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +596,-inf,1243.650000000005,152,5.519077034883721,100,True,20,0.62,False,6,13,15,15,2,8,21,1,14,1.61,3.72,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +598,-inf,0.0,0,0.0,50,True,16,0.68,False,6,13,15,15,3,8,21,2,14,1.75,4.09,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +601,-inf,804.0200000000059,125,2.8067053166149836,100,True,24,0.69,False,6,13,16,16,2,8,21,1,14,1.77,3.88,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +603,-inf,1090.7100000000119,189,2.746449329896082,100,True,16,0.62,False,6,12,16,16,2,8,21,1,14,1.72,4.71,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +604,-inf,-159.76000000000386,98,0.7310799892270401,100,True,20,0.55,True,6,12,15,16,3,8,21,2,14,1.7,5.16,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +606,-inf,370.2600000000002,196,1.3500978640115735,100,True,16,0.67,True,6,12,15,16,2,8,21,1,14,2.07,4.72,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +607,-inf,-265.95000000000255,113,0.6523802054740805,50,True,24,0.52,True,6,12,15,15,3,8,21,2,14,1.86,4.51,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +609,-inf,0.0,0,0.0,50,True,16,0.55,False,6,13,16,15,2,8,21,2,14,1.85,3.96,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +610,-inf,0.0,0,0.0,100,True,20,0.69,False,6,12,15,15,2,8,21,2,14,2.08,5.39,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +611,-inf,-173.67000000000553,94,0.7149492827364343,100,True,20,0.7,True,6,13,14,16,2,8,21,2,14,2.15,3.8,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +612,-inf,0.0,0,0.0,100,True,20,0.58,False,6,13,15,15,3,8,21,2,14,1.97,3.79,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +613,-inf,891.8999999999996,163,2.4600487828834283,50,True,24,0.62,False,6,13,16,16,2,8,21,1,14,1.65,4.57,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +614,-inf,0.0,0,0.0,50,True,24,0.7,False,6,12,14,16,3,8,21,2,14,1.7,3.56,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +615,-inf,1172.420000000002,159,3.483151540823891,100,True,16,0.67,False,6,13,16,15,2,8,21,1,14,1.76,4.51,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +619,-inf,956.2900000000027,177,2.642150633650445,100,True,20,0.62,False,6,13,16,16,3,8,21,1,14,1.69,3.75,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +620,-inf,-205.77000000000044,95,0.676533467475713,50,True,24,0.6,True,6,12,15,16,2,8,21,2,14,1.69,4.62,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +623,-inf,797.4600000000028,124,2.869645745902985,100,True,16,0.67,False,6,13,16,16,3,8,21,1,14,2.07,4.45,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +624,-inf,0.0,0,0.0,50,True,16,0.6,False,6,13,16,16,2,8,21,2,14,1.8,5.1,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +625,-inf,0.0,0,0.0,100,True,20,0.55,False,6,13,16,15,3,8,21,2,14,1.77,3.68,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +626,-inf,0.0,0,0.0,50,True,24,0.63,False,6,12,16,15,2,8,21,2,14,1.93,5.02,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +628,-inf,849.3000000000047,133,3.0327421555252383,100,True,16,0.66,False,6,13,16,15,3,8,21,1,14,1.8,3.86,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +632,-inf,-296.4500000000007,119,0.6324194968319509,100,True,16,0.58,True,6,12,15,15,2,8,21,2,14,1.99,3.75,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +633,-inf,-322.45000000000255,119,0.619379817510063,100,True,16,0.67,True,6,12,15,15,2,8,21,2,14,2.17,5.42,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +634,-inf,2154.720000000012,192,8.952463554161286,50,True,16,0.66,False,6,12,14,15,3,8,21,1,14,1.96,5.18,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +635,-inf,1564.2499999999964,128,9.792861157953906,50,True,24,0.67,False,6,12,14,15,3,8,21,1,14,1.84,3.75,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +637,-inf,570.2199999999993,196,1.6457538248983614,100,True,24,0.57,True,6,12,16,16,2,8,21,1,14,2.0,4.33,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +639,-inf,317.4600000000064,196,1.3153597043689031,100,True,16,0.67,True,6,12,15,16,2,8,21,1,14,1.61,4.99,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +641,-inf,0.0,0,0.0,50,True,16,0.54,False,6,12,15,16,2,8,21,2,14,1.72,4.98,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +643,-inf,1313.5400000000009,147,6.996804236669101,100,True,24,0.61,False,6,12,15,15,3,8,21,1,14,2.11,4.31,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +644,-inf,-170.03999999999724,96,0.7124642778632666,100,True,20,0.57,True,6,12,14,16,3,8,21,2,14,1.87,3.51,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +647,-inf,1321.6900000000114,189,3.0872854187394387,50,True,16,0.66,False,6,12,16,16,2,8,21,1,14,2.18,5.33,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +649,-inf,949.25,163,2.890145556639653,100,True,16,0.62,False,6,12,16,15,3,8,21,1,14,1.88,4.36,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +653,-inf,-348.6300000000101,137,0.6417988656912708,50,True,16,0.55,True,6,13,15,15,2,8,21,2,14,2.15,5.07,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +654,-inf,914.0900000000111,153,2.8079669297256675,100,True,24,0.64,False,6,13,16,16,3,8,21,1,14,1.8,3.71,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +658,-inf,0.0,0,0.0,50,True,16,0.5,False,6,12,14,15,3,8,21,2,14,2.07,3.72,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +661,-inf,1002.0600000000086,161,2.739294950792356,100,True,16,0.65,False,6,12,14,16,3,8,21,1,14,1.91,3.86,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +662,-inf,815.1600000000144,125,2.872080472176928,100,True,24,0.69,False,6,13,16,16,2,8,21,1,14,1.73,3.91,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +665,-inf,0.0,0,0.0,50,True,16,0.59,False,6,12,15,15,3,8,21,2,14,1.91,4.79,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +669,-inf,1084.3500000000022,159,3.3684038091909843,100,True,20,0.66,False,6,12,15,16,2,8,21,1,14,1.87,4.62,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +672,-inf,0.0,0,0.0,50,True,20,0.52,False,6,13,14,15,2,8,21,2,14,1.93,3.56,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +674,-inf,0.0,0,0.0,50,True,16,0.57,False,6,13,14,15,2,8,21,2,14,1.85,4.99,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +675,-inf,0.0,0,0.0,50,True,16,0.56,False,6,12,16,16,2,8,21,2,14,2.03,4.42,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +677,-inf,968.7300000000141,165,2.8018525751911163,100,True,20,0.64,False,6,13,16,15,3,8,21,1,14,1.71,4.74,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +683,-inf,1380.8500000000004,183,3.3539489609791855,50,True,24,0.65,False,6,12,15,16,2,8,21,1,14,2.03,5.29,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +689,-inf,950.7199999999975,135,3.084409462629629,50,True,20,0.69,False,6,13,16,15,3,8,21,1,14,1.98,5.27,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +692,-inf,0.0,0,0.0,50,True,16,0.68,False,6,13,14,16,3,8,21,2,14,2.07,3.58,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +693,-inf,0.0,0,0.0,100,True,16,0.55,False,6,13,14,15,2,8,21,2,14,2.19,5.1,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +694,-inf,1571.7600000000002,191,3.725674152432151,50,True,24,0.67,False,6,12,15,15,2,8,21,1,14,1.64,3.88,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +695,-inf,-317.18000000000757,128,0.6284686837450656,50,True,16,0.52,True,6,12,16,15,3,8,21,2,14,1.88,3.83,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +696,-inf,1099.800000000012,189,2.675962329706501,100,True,16,0.62,False,6,13,16,16,2,8,21,1,14,2.12,4.46,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +697,-inf,877.3500000000058,180,2.3539769745979813,100,True,16,0.59,False,6,13,14,16,2,8,21,1,14,1.86,3.67,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +698,-inf,1079.3700000000044,170,2.6568222634964003,50,True,24,0.65,False,6,13,15,16,3,8,21,1,14,1.83,4.71,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +700,-inf,-206.32000000000517,108,0.6917146059021293,100,True,20,0.6,True,6,13,14,15,3,8,21,2,14,1.7,5.03,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +701,-inf,0.0,0,0.0,100,True,24,0.64,False,6,12,16,16,3,8,21,2,14,1.75,4.46,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +703,-inf,1299.6500000000106,196,2.9370295849169086,50,True,16,0.65,False,6,13,16,15,2,8,21,1,14,1.7,4.35,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +704,-inf,759.2999999999975,163,2.2821898377210017,100,True,24,0.56,False,6,12,14,16,2,8,21,1,14,2.05,5.36,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +705,-inf,0.0,0,0.0,100,True,16,0.7,False,6,12,14,15,3,8,21,2,14,1.85,4.08,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +708,-inf,911.9200000000037,160,2.741136038186158,100,True,16,0.62,False,6,13,16,15,2,8,21,1,14,1.76,5.41,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +710,-inf,1426.2300000000087,147,6.581021326550577,100,True,20,0.66,False,6,13,15,15,3,8,21,1,14,2.08,3.51,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +711,-inf,0.0,0,0.0,50,True,16,0.62,False,6,12,15,16,3,8,21,2,14,1.85,3.88,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +712,-inf,-214.69000000000415,95,0.6667339335610059,50,True,24,0.57,True,6,13,16,16,2,8,21,2,14,1.89,4.98,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +713,-inf,-204.9300000000003,104,0.6998769807562754,100,True,20,0.7,True,6,13,15,15,2,8,21,2,14,2.13,5.07,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +716,-inf,-218.97000000000116,82,0.6217612105299524,100,True,24,0.6,True,6,12,16,16,2,8,21,2,14,1.8,3.95,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +717,-inf,1777.0599999999995,198,5.608797136780954,50,True,24,0.57,False,6,13,14,15,3,8,21,1,14,1.77,3.72,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +718,-inf,921.4100000000035,146,2.6946406238505114,50,True,24,0.69,False,6,12,15,16,2,8,21,1,14,1.64,4.57,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +719,-inf,-152.01000000000568,94,0.746447157726181,100,True,20,0.66,True,6,12,14,16,2,8,21,2,14,2.11,4.13,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +720,-inf,740.7800000000079,152,2.366954532034249,100,True,24,0.59,False,6,12,16,15,3,8,21,1,14,1.9,4.88,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +721,-inf,1044.4600000000046,136,3.703543602619522,100,True,24,0.67,False,6,13,16,16,2,8,21,1,14,1.69,4.93,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +722,-inf,0.0,0,0.0,50,True,16,0.67,False,6,13,16,15,2,8,21,2,14,1.84,4.34,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +726,-inf,943.8299999999963,159,2.6550581303593033,50,True,24,0.63,False,6,12,16,16,2,8,21,1,14,1.67,4.29,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +727,-inf,-233.4900000000016,102,0.6616724385260748,50,True,24,0.65,True,6,13,16,16,3,8,21,2,14,1.99,4.23,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +728,-inf,-346.8700000000026,127,0.6109840073570644,50,True,16,0.6,True,6,12,16,16,3,8,21,2,14,2.05,5.09,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +729,-inf,0.0,0,0.0,100,True,24,0.64,False,6,12,14,16,2,8,21,2,14,2.15,5.09,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +730,-inf,0.0,0,0.0,50,True,20,0.61,False,6,12,16,15,2,8,21,2,14,2.14,3.86,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +731,-inf,0.0,0,0.0,50,True,16,0.61,False,6,12,14,15,2,8,21,2,14,1.7,4.62,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +733,-inf,0.0,0,0.0,100,True,16,0.62,False,6,13,16,15,2,8,21,2,14,2.09,3.97,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +738,-inf,-327.6300000000101,137,0.6552895996633173,50,True,16,0.58,True,6,13,14,15,2,8,21,2,14,2.04,4.11,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +739,-inf,937.160000000009,172,2.5733136352953028,100,True,24,0.61,False,6,13,16,15,2,8,21,1,14,1.79,5.0,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +740,-inf,834.0100000000039,147,2.753153115277895,100,True,20,0.62,False,6,12,16,15,2,8,21,1,14,1.83,4.97,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +741,-inf,742.1200000000099,113,3.0305351866039176,100,True,24,0.66,False,6,13,14,16,3,8,21,1,14,1.9,4.05,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +742,-inf,-224.99000000000524,108,0.6817140108646447,50,True,20,0.63,True,6,13,15,16,2,8,21,2,14,1.65,4.96,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +743,-inf,1972.020000000006,170,11.320389365710696,50,True,16,0.65,False,6,12,15,15,3,8,21,1,14,1.91,5.5,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +750,-inf,1177.7300000000068,153,3.618283275160623,100,True,16,0.7,False,6,12,14,16,3,8,21,1,14,1.82,5.24,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +753,-inf,-261.14000000000306,111,0.6585735765182715,50,True,20,0.6,True,6,12,16,16,3,8,21,2,14,2.04,4.37,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +756,-inf,-281.75000000000364,109,0.6162907882551615,100,True,16,0.62,True,6,12,15,16,3,8,21,2,14,1.98,3.96,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +760,-inf,-315.93000000000575,119,0.617397728098433,100,True,16,0.63,True,6,13,14,15,2,8,21,2,14,2.05,3.74,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +761,-inf,-316.1300000000083,127,0.6296986095981071,50,True,16,0.64,True,6,12,16,16,3,8,21,2,14,1.88,5.02,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +765,-inf,0.0,0,0.0,50,True,24,0.64,False,6,13,15,15,3,8,21,2,14,1.76,3.74,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +766,-inf,-174.50000000000546,106,0.7518063378278432,50,True,20,0.51,True,6,13,14,16,2,8,21,2,14,2.19,5.48,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +767,-inf,1171.030000000006,186,2.919092100950508,50,True,16,0.63,False,6,13,14,16,2,8,21,1,14,2.14,4.09,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +768,-inf,0.0,0,0.0,50,True,20,0.54,False,6,12,15,15,2,8,21,2,14,2.05,4.26,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +770,-inf,0.0,0,0.0,100,True,16,0.6,False,6,12,14,15,3,8,21,2,14,1.71,4.06,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +778,-inf,0.0,0,0.0,50,True,24,0.64,False,6,13,14,16,3,8,21,2,14,1.82,4.03,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +779,-inf,-350.9499999999989,128,0.6110581611845022,50,True,16,0.66,True,6,13,14,16,3,8,21,2,14,2.08,5.45,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +781,-inf,-261.630000000001,109,0.6336535230200515,100,True,16,0.66,True,6,13,15,16,3,8,21,2,14,1.92,3.96,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +784,-inf,-311.300000000012,130,0.6305833768453031,50,True,16,0.51,True,6,12,16,15,3,8,21,2,14,1.62,5.43,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +788,-inf,-210.96999999999935,84,0.6413355774298295,100,True,24,0.6,True,6,13,14,16,2,8,21,2,14,1.83,5.4,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +794,-inf,0.0,0,0.0,50,True,24,0.66,False,6,12,15,15,2,8,21,2,14,1.88,5.27,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +797,-inf,-339.6600000000053,123,0.5958834027364663,100,True,16,0.59,True,6,13,14,15,3,8,21,2,14,1.82,3.68,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +798,-inf,0.0,0,0.0,100,True,20,0.7,False,6,13,16,15,2,8,21,2,14,1.89,4.23,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +799,-inf,395.7900000000027,165,1.4667444986910068,100,True,24,0.68,True,6,13,15,16,3,8,21,1,14,2.01,4.51,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +802,-inf,0.0,0,0.0,50,True,20,0.57,False,6,13,16,16,2,8,21,2,14,2.04,3.73,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +805,-inf,1442.88000000001,196,3.987391043292822,100,True,20,0.6,False,6,12,14,15,3,8,21,1,14,2.18,4.09,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +806,-inf,-174.9200000000019,93,0.7149886758020628,100,True,20,0.6,True,6,13,15,16,2,8,21,2,14,2.07,4.69,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +808,-inf,822.9800000000032,126,3.0701295434536533,100,True,24,0.64,False,6,12,16,16,2,8,21,1,14,1.73,5.46,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +810,-inf,0.0,0,0.0,100,True,24,0.7,False,6,13,15,16,3,8,21,2,14,2.18,4.17,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +811,-inf,-173.2099999999955,98,0.7188423205531927,100,True,20,0.54,True,6,13,15,16,3,8,21,2,14,1.77,4.74,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +812,-inf,0.0,0,0.0,50,True,16,0.63,False,6,12,15,15,3,8,21,2,14,1.95,3.57,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +813,-inf,1163.270000000004,160,3.3508002586694685,50,True,16,0.66,False,6,12,14,16,2,8,21,1,14,2.18,5.33,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +816,-inf,1237.2600000000093,171,3.4358388786077096,100,True,16,0.66,False,6,12,16,16,2,8,21,1,14,2.14,4.53,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +818,-inf,-348.95000000000437,141,0.6400313599273769,50,True,16,0.62,True,6,13,14,15,3,8,21,2,14,1.98,4.22,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +823,-inf,0.0,0,0.0,50,True,16,0.6,False,6,12,14,15,2,8,21,2,14,1.91,3.8,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +825,-inf,982.0100000000148,149,3.022261120263591,100,True,20,0.65,False,6,13,16,16,2,8,21,1,14,1.7,4.87,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +826,-inf,939.1900000000078,163,2.8389168445166724,100,True,16,0.62,False,6,12,14,16,3,8,21,1,14,1.85,4.99,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +829,-inf,-248.48999999999796,112,0.6561643835616437,50,True,24,0.57,True,6,13,14,15,3,8,21,2,14,1.61,4.16,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +831,-inf,1383.1200000000135,175,3.919761035232526,100,True,24,0.65,False,6,13,14,15,2,8,21,1,14,1.9,5.48,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +833,-inf,0.0,0,0.0,100,True,16,0.67,False,6,12,16,15,3,8,21,2,14,1.61,4.44,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +834,-inf,0.0,0,0.0,100,True,20,0.56,False,6,13,14,16,3,8,21,2,14,1.63,4.1,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +837,-inf,0.0,0,0.0,50,True,20,0.57,False,6,13,16,15,2,8,21,2,14,1.88,3.75,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +839,-inf,832.6500000000069,140,2.7250201992997574,100,True,20,0.64,False,6,12,16,15,2,8,21,1,14,2.18,3.62,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +840,-inf,-248.63000000000284,106,0.6656176450810303,50,True,20,0.66,True,6,13,14,16,2,8,21,2,14,2.06,4.53,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +842,-inf,0.0,0,0.0,50,True,20,0.58,False,6,12,14,16,2,8,21,2,14,1.67,3.53,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +846,-inf,0.0,0,0.0,50,True,20,0.55,False,6,13,15,15,2,8,21,2,14,2.09,4.88,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +850,-inf,0.0,189,0.0,50,True,16,0.66,False,6,12,16,15,2,8,21,1,14,1.66,5.11,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +851,-inf,0.0,164,0.0,100,True,24,0.57,False,6,13,15,16,3,8,21,1,14,2.1,4.1,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +852,-inf,0.0,263,0.0,100,True,16,0.55,True,6,12,15,15,2,8,21,1,14,1.9,3.99,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +853,-inf,0.0,107,0.0,100,True,20,0.54,True,6,12,15,15,3,8,21,2,14,2.01,5.3,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +854,-inf,0.0,163,0.0,50,True,20,0.68,False,6,13,15,16,3,8,21,1,14,1.71,4.66,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +855,-inf,0.0,0,0.0,50,True,20,0.66,False,6,13,14,15,3,8,21,2,14,1.69,4.86,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +856,-inf,0.0,281,0.0,50,True,20,0.6,True,6,13,14,16,2,8,21,1,14,1.77,4.69,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +857,-inf,0.0,345,0.0,100,True,16,0.59,True,6,12,15,15,3,8,21,1,14,2.07,4.5,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +858,-inf,0.0,254,0.0,50,True,24,0.55,True,6,13,16,15,3,8,21,1,14,1.62,5.37,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +859,-inf,0.0,94,0.0,100,True,20,0.58,True,6,13,15,16,2,8,21,2,14,1.86,5.25,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +860,-inf,0.0,123,0.0,50,True,20,0.53,True,6,13,15,15,3,8,21,2,14,2.16,4.42,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +861,-inf,0.0,257,0.0,100,True,16,0.53,False,6,13,16,16,3,8,21,1,14,1.86,4.34,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +862,-inf,0.0,0,0.0,50,True,24,0.51,False,6,12,14,16,2,8,21,2,14,1.91,3.75,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +863,-inf,0.0,0,0.0,100,True,16,0.65,False,6,12,15,15,3,8,21,2,14,1.88,3.61,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +864,-inf,0.0,178,0.0,50,True,20,0.62,False,6,13,16,16,2,8,21,1,14,2.04,4.85,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +865,-inf,0.0,300,0.0,50,True,24,0.54,True,6,13,14,15,2,8,21,1,14,1.98,4.94,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +866,-inf,0.0,359,0.0,50,True,16,0.51,True,6,12,16,15,2,8,21,1,14,1.66,3.55,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +867,-inf,0.0,0,0.0,100,True,16,0.69,False,6,13,15,15,2,8,21,2,14,1.76,4.73,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +868,-inf,0.0,118,0.0,50,True,20,0.53,True,6,12,14,15,2,8,21,2,14,2.04,4.59,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +869,-inf,0.0,170,0.0,100,True,20,0.63,False,6,13,16,16,3,8,21,1,14,2.02,3.71,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +870,-inf,0.0,123,0.0,50,True,16,0.56,True,6,13,14,16,2,8,21,2,14,1.99,4.81,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +871,-inf,0.0,0,0.0,100,True,16,0.59,False,6,13,14,15,3,8,21,2,14,2.11,4.51,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +872,-inf,0.0,84,0.0,100,True,24,0.51,True,6,13,16,16,3,8,21,2,14,2.12,3.78,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +873,-inf,0.0,146,0.0,100,True,16,0.68,False,6,13,15,15,3,8,21,1,14,2.02,4.68,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +874,-inf,0.0,123,0.0,100,True,16,0.51,True,6,12,14,15,3,8,21,2,14,1.89,5.02,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +875,-inf,0.0,200,0.0,50,True,16,0.65,False,6,13,14,15,3,8,21,1,14,1.62,5.0,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +876,-inf,0.0,355,0.0,50,True,16,0.56,False,6,13,14,15,2,8,21,1,14,1.89,4.86,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +877,-inf,0.0,244,0.0,50,True,20,0.66,True,6,12,16,15,2,8,21,1,14,1.62,3.78,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +878,-inf,0.0,216,0.0,100,True,24,0.61,True,6,13,14,16,2,8,21,1,14,1.94,4.45,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +879,-inf,0.0,0,0.0,50,True,16,0.59,False,6,12,16,15,2,8,21,2,14,1.78,3.74,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +880,-inf,0.0,271,0.0,100,True,16,0.54,False,6,13,15,16,2,8,21,1,14,2.18,3.65,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +881,-inf,0.0,291,0.0,100,True,20,0.62,True,6,13,15,15,2,8,21,1,14,1.85,3.9,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +882,-inf,0.0,0,0.0,50,True,24,0.66,False,6,12,14,16,2,8,21,2,14,2.14,4.91,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +883,-inf,0.0,271,0.0,50,True,20,0.62,True,6,13,14,16,2,8,21,1,14,1.62,4.52,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +884,-inf,0.0,104,0.0,100,True,20,0.56,True,6,12,14,15,2,8,21,2,14,1.96,4.26,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +885,-inf,0.0,0,0.0,50,True,24,0.6,False,6,13,16,15,3,8,21,2,14,1.86,3.78,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +886,-inf,0.0,0,0.0,100,True,20,0.54,False,6,12,14,15,2,8,21,2,14,1.61,4.33,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +887,-inf,0.0,251,0.0,50,True,16,0.67,True,6,12,14,15,2,8,21,1,14,1.71,3.59,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +888,-inf,0.0,223,0.0,50,True,20,0.53,False,6,13,16,15,2,8,21,1,14,1.75,4.59,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +889,-inf,0.0,0,0.0,100,True,16,0.59,False,6,13,16,16,2,8,21,2,14,2.14,4.14,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +890,-inf,0.0,224,0.0,50,True,16,0.57,False,6,13,15,15,2,8,21,1,14,2.1,4.54,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +891,-inf,0.0,332,0.0,50,True,16,0.57,True,6,12,14,16,3,8,21,1,14,1.61,5.17,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +892,-inf,0.0,215,0.0,100,True,20,0.67,True,6,12,15,16,3,8,21,1,14,2.12,4.27,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +893,-inf,0.0,0,0.0,50,True,20,0.54,False,6,12,16,16,2,8,21,2,14,2.06,5.37,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +894,-inf,0.0,84,0.0,100,True,24,0.54,True,6,13,16,16,3,8,21,2,14,2.16,5.0,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +895,-inf,0.0,135,0.0,100,True,24,0.69,False,6,13,15,16,2,8,21,1,14,1.88,5.49,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +896,-inf,0.0,0,0.0,50,True,20,0.66,False,6,12,14,16,3,8,21,2,14,1.84,4.73,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +897,-inf,0.0,196,0.0,100,True,24,0.66,True,6,12,15,16,3,8,21,1,14,1.87,3.53,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +898,-inf,0.0,124,0.0,50,True,20,0.6,True,6,13,14,15,3,8,21,2,14,1.93,5.41,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +899,-inf,0.0,0,0.0,100,True,20,0.55,False,6,12,14,15,2,8,21,2,14,1.99,3.97,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +900,-inf,0.0,0,0.0,50,True,24,0.6,False,6,13,14,15,2,8,21,2,14,2.2,5.45,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +901,-inf,0.0,195,0.0,100,True,24,0.64,True,6,13,14,15,3,8,21,1,14,1.91,3.97,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +902,-inf,0.0,0,0.0,100,True,24,0.58,False,6,13,14,15,3,8,21,2,14,2.07,4.17,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +903,-inf,0.0,145,0.0,100,True,20,0.69,False,6,12,14,16,2,8,21,1,14,2.16,5.32,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +904,-inf,0.0,289,0.0,50,True,20,0.6,False,6,12,15,15,2,8,21,1,14,2.06,4.8,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +905,-inf,0.0,194,0.0,100,True,24,0.65,True,6,13,16,16,3,8,21,1,14,1.72,4.65,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +906,-inf,0.0,0,0.0,50,True,20,0.55,False,6,12,16,15,3,8,21,2,14,2.17,4.32,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +907,-inf,0.0,118,0.0,50,True,20,0.63,True,6,13,15,15,2,8,21,2,14,1.75,5.32,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +908,-inf,0.0,249,0.0,50,True,24,0.55,False,6,13,15,15,2,8,21,1,14,1.85,5.47,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +909,-inf,0.0,128,0.0,50,True,16,0.68,True,6,12,14,16,3,8,21,2,14,2.03,4.44,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +910,-inf,0.0,292,0.0,50,True,20,0.5,True,6,12,14,16,3,8,21,1,14,1.68,4.89,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +911,-inf,0.0,0,0.0,100,True,16,0.57,False,6,12,16,15,2,8,21,2,14,2.15,5.4,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +912,-inf,0.0,0,0.0,100,True,24,0.67,False,6,13,16,15,2,8,21,2,14,2.06,5.33,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +913,-inf,0.0,255,0.0,50,True,16,0.62,False,6,13,15,16,3,8,21,1,14,1.91,4.68,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +914,-inf,0.0,181,0.0,100,True,20,0.57,False,6,13,15,16,3,8,21,1,14,2.17,3.58,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +915,-inf,0.0,247,0.0,50,True,20,0.6,False,6,12,15,16,2,8,21,1,14,1.77,4.47,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +916,-inf,0.0,205,0.0,100,True,20,0.7,True,6,12,16,16,2,8,21,1,14,1.72,5.18,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +917,-inf,0.0,240,0.0,50,True,24,0.61,True,6,12,15,15,3,8,21,1,14,1.77,5.4,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +918,-inf,0.0,228,0.0,100,True,24,0.53,False,6,13,14,15,3,8,21,1,14,1.9,3.67,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +919,-inf,0.0,312,0.0,50,True,20,0.66,True,6,12,15,15,3,8,21,1,14,1.87,4.97,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +920,-inf,0.0,178,0.0,100,True,16,0.59,False,6,12,16,15,2,8,21,1,14,1.68,4.25,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +921,-inf,0.0,198,0.0,50,True,20,0.59,False,6,12,16,16,3,8,21,1,14,1.72,5.25,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +922,-inf,0.0,209,0.0,50,True,16,0.59,False,6,12,16,15,2,8,21,1,14,2.01,4.73,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +923,-inf,0.0,243,0.0,50,True,24,0.57,True,6,13,14,16,3,8,21,1,14,2.08,4.28,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +924,-inf,0.0,287,0.0,100,True,20,0.52,True,6,13,15,16,3,8,21,1,14,2.0,3.73,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +925,-inf,0.0,287,0.0,50,True,20,0.64,True,6,13,15,16,2,8,21,1,14,1.77,4.51,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +926,-inf,0.0,188,0.0,100,True,20,0.63,False,6,13,15,16,3,8,21,1,14,2.15,4.04,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +927,-inf,0.0,0,0.0,100,True,24,0.66,False,6,13,15,15,2,8,21,2,14,1.72,4.75,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +928,-inf,0.0,324,0.0,100,True,16,0.62,True,6,12,15,15,3,8,21,1,14,2.06,4.61,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +929,-inf,0.0,245,0.0,50,True,20,0.61,True,6,13,16,15,3,8,21,1,14,2.15,4.16,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +930,-inf,0.0,320,0.0,50,True,16,0.51,True,6,12,16,16,3,8,21,1,14,1.69,4.1,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +931,-inf,0.0,123,0.0,50,True,16,0.55,True,6,13,16,16,2,8,21,2,14,2.13,5.22,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +932,-inf,0.0,106,0.0,100,True,16,0.5,True,6,12,16,16,2,8,21,2,14,2.12,5.07,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +933,-inf,0.0,275,0.0,50,True,20,0.55,True,6,12,15,16,3,8,21,1,14,1.86,3.94,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +934,-inf,0.0,288,0.0,100,True,20,0.56,True,6,13,14,16,3,8,21,1,14,2.06,4.93,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +935,-inf,0.0,240,0.0,50,True,20,0.65,False,6,13,15,15,3,8,21,1,14,1.69,4.76,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +936,-inf,0.0,0,0.0,50,True,16,0.67,False,6,12,14,15,3,8,21,2,14,2.1,4.55,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +937,-inf,0.0,0,0.0,50,True,20,0.55,False,6,13,14,15,3,8,21,2,14,1.94,4.31,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +938,-inf,0.0,138,0.0,50,True,24,0.66,False,6,13,16,15,3,8,21,1,14,2.03,4.53,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +939,-inf,0.0,137,0.0,50,True,16,0.59,True,6,13,14,15,2,8,21,2,14,2.05,3.83,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +940,-inf,0.0,190,0.0,50,True,20,0.6,False,6,12,16,16,3,8,21,1,14,1.78,4.37,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +941,-inf,0.0,0,0.0,100,True,24,0.56,False,6,12,14,16,2,8,21,2,14,2.17,4.24,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +942,-inf,0.0,250,0.0,100,True,20,0.54,False,6,12,14,16,2,8,21,1,14,1.85,3.8,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +943,-inf,0.0,92,0.0,100,True,24,0.54,True,6,13,15,15,2,8,21,2,14,1.88,3.81,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +944,-inf,0.0,242,0.0,50,True,20,0.63,True,6,13,15,16,3,8,21,1,14,1.97,4.31,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +945,-inf,0.0,142,0.0,50,True,16,0.62,True,6,12,15,15,3,8,21,2,14,1.66,5.09,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +946,-inf,0.0,229,0.0,100,True,20,0.62,False,6,13,14,15,2,8,21,1,14,2.19,3.68,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +947,-inf,0.0,136,0.0,50,True,16,0.6,True,6,13,14,15,2,8,21,2,14,2.08,4.35,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +948,-inf,0.0,210,0.0,100,True,24,0.65,True,6,13,15,16,3,8,21,1,14,1.79,4.54,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +949,-inf,0.0,0,0.0,50,True,16,0.69,False,6,12,15,16,3,8,21,2,14,2.07,4.87,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +950,-inf,0.0,268,0.0,100,True,16,0.51,False,6,13,16,16,3,8,21,1,14,1.97,5.25,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +951,-inf,0.0,218,0.0,100,True,16,0.69,True,6,12,15,16,2,8,21,1,14,1.95,4.16,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +952,-inf,0.0,210,0.0,50,True,24,0.55,False,6,13,15,15,3,8,21,1,14,1.98,5.44,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +953,-inf,0.0,133,0.0,100,True,24,0.63,False,6,12,15,15,2,8,21,1,14,1.62,5.29,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +954,-inf,0.0,333,0.0,50,True,16,0.52,True,6,12,15,15,3,8,21,1,14,2.11,4.05,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +955,-inf,0.0,0,0.0,50,True,20,0.67,False,6,12,16,16,2,8,21,2,14,1.84,5.18,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +956,-inf,0.0,280,0.0,50,True,16,0.67,True,6,13,14,15,3,8,21,1,14,1.77,3.9,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +957,-inf,0.0,203,0.0,50,True,24,0.65,True,6,13,15,16,2,8,21,1,14,1.88,5.17,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +958,-inf,0.0,337,0.0,100,True,16,0.52,True,6,12,16,15,2,8,21,1,14,1.95,5.43,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +959,-inf,0.0,288,0.0,50,True,24,0.57,True,6,12,15,15,2,8,21,1,14,1.63,4.91,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +960,-inf,0.0,294,0.0,50,True,24,0.56,True,6,12,15,15,2,8,21,1,14,1.76,4.38,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +961,-inf,0.0,0,0.0,100,True,24,0.57,False,6,12,14,16,2,8,21,2,14,1.94,5.49,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +962,-inf,0.0,195,0.0,100,True,16,0.57,False,6,12,16,15,3,8,21,1,14,1.88,3.56,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +963,-inf,0.0,296,0.0,50,True,20,0.53,False,6,13,16,16,2,8,21,1,14,2.02,4.76,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +964,-inf,0.0,218,0.0,100,True,20,0.57,True,6,12,15,16,2,8,21,1,14,1.93,5.0,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +965,-inf,0.0,0,0.0,100,True,24,0.62,False,6,13,15,15,3,8,21,2,14,1.82,4.18,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +966,-inf,0.0,111,0.0,100,True,16,0.69,True,6,12,15,16,3,8,21,2,14,1.84,3.56,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +967,-inf,0.0,181,0.0,100,True,24,0.69,True,6,12,14,16,2,8,21,1,14,1.79,5.03,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +968,-inf,0.0,302,0.0,100,True,16,0.59,True,6,12,14,16,3,8,21,1,14,1.71,5.22,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +969,-inf,0.0,279,0.0,50,True,16,0.64,False,6,12,15,15,3,8,21,1,14,1.88,4.87,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +970,-inf,0.0,189,0.0,100,True,24,0.58,False,6,12,14,16,2,8,21,1,14,2.06,3.77,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +971,-inf,0.0,92,0.0,100,True,24,0.58,True,6,13,15,15,2,8,21,2,14,1.71,3.97,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +972,-inf,0.0,217,0.0,50,True,24,0.62,False,6,12,16,15,2,8,21,1,14,1.71,3.92,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +973,-inf,0.0,0,0.0,100,True,20,0.63,False,6,12,15,16,3,8,21,2,14,2.09,3.57,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +974,-inf,0.0,107,0.0,50,True,20,0.64,True,6,13,14,16,2,8,21,2,14,2.12,5.11,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +975,-inf,0.0,169,0.0,100,True,16,0.61,False,6,13,14,16,3,8,21,1,14,2.06,4.11,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +976,-inf,0.0,164,0.0,50,True,24,0.66,False,6,13,15,16,3,8,21,1,14,2.07,5.46,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +977,-inf,0.0,317,0.0,50,True,16,0.5,False,6,12,16,16,3,8,21,1,14,1.88,3.58,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +978,-inf,0.0,145,0.0,100,True,16,0.68,False,6,13,15,16,3,8,21,1,14,1.93,3.86,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +979,-inf,0.0,287,0.0,50,True,20,0.56,True,6,12,15,15,3,8,21,1,14,1.71,4.57,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +980,-inf,0.0,179,0.0,50,True,24,0.6,False,6,13,15,15,3,8,21,1,14,1.65,4.25,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +981,-inf,0.0,250,0.0,50,True,20,0.6,True,6,13,16,16,3,8,21,1,14,1.61,5.4,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +982,-inf,0.0,242,0.0,50,True,20,0.69,True,6,13,15,15,2,8,21,1,14,1.94,3.93,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +983,-inf,0.0,251,0.0,50,True,20,0.6,True,6,13,14,16,3,8,21,1,14,1.84,3.54,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +984,-inf,0.0,0,0.0,50,True,20,0.55,False,6,12,14,15,2,8,21,2,14,1.79,3.63,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +985,-inf,0.0,197,0.0,100,True,24,0.58,False,6,13,15,15,3,8,21,1,14,1.79,5.15,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +986,-inf,0.0,106,0.0,100,True,16,0.61,True,6,13,15,16,2,8,21,2,14,2.11,5.44,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +987,-inf,0.0,0,0.0,100,True,16,0.54,False,6,13,15,16,3,8,21,2,14,1.88,3.81,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +988,-inf,0.0,242,0.0,100,True,24,0.59,True,6,13,16,16,2,8,21,1,14,2.15,3.76,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +989,-inf,0.0,124,0.0,50,True,20,0.54,True,6,13,14,15,3,8,21,2,14,1.85,5.0,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +990,-inf,0.0,226,0.0,100,True,20,0.65,True,6,13,16,16,2,8,21,1,14,1.9,4.43,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +991,-inf,0.0,257,0.0,50,True,20,0.56,False,6,13,16,15,2,8,21,1,14,1.95,4.34,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +992,-inf,0.0,267,0.0,50,True,24,0.51,True,6,12,16,15,3,8,21,1,14,1.8,4.0,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +993,-inf,0.0,249,0.0,100,True,24,0.52,False,6,12,16,16,2,8,21,1,14,1.87,4.95,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +994,-inf,0.0,104,0.0,100,True,24,0.68,False,6,12,15,15,2,8,21,1,14,1.95,4.42,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +995,-inf,0.0,131,0.0,100,True,16,0.66,False,6,12,16,16,2,8,21,1,14,1.88,5.42,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +996,-inf,0.0,0,0.0,50,True,24,0.64,False,6,13,14,16,3,8,21,2,14,1.92,4.93,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +997,-inf,0.0,301,0.0,50,True,20,0.6,True,6,13,15,15,3,8,21,1,14,2.03,4.52,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +998,-inf,0.0,267,0.0,100,True,16,0.52,False,6,12,16,15,3,8,21,1,14,1.99,3.78,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +999,-inf,0.0,324,0.0,50,True,20,0.52,True,6,13,16,16,2,8,21,1,14,1.81,4.88,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1000,-inf,0.0,238,0.0,100,True,24,0.56,True,6,12,14,16,2,8,21,1,14,2.13,4.63,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1001,-inf,0.0,184,0.0,100,True,24,0.53,False,6,13,16,16,3,8,21,1,14,2.05,4.89,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1002,-inf,0.0,93,0.0,100,True,20,0.55,True,6,12,14,16,2,8,21,2,14,1.61,4.23,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1003,-inf,0.0,97,0.0,100,True,20,0.62,True,6,13,16,15,3,8,21,2,14,1.82,5.23,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1004,-inf,0.0,179,0.0,50,True,24,0.6,False,6,13,14,15,3,8,21,1,14,1.79,3.95,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1005,-inf,0.0,0,0.0,50,True,24,0.54,False,6,13,16,15,2,8,21,2,14,1.72,4.83,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1006,-inf,0.0,187,0.0,50,True,20,0.6,False,6,12,14,16,2,8,21,1,14,1.75,4.98,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1007,-inf,0.0,237,0.0,50,True,16,0.64,False,6,12,14,16,3,8,21,1,14,2.05,4.97,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1008,-inf,0.0,371,0.0,100,True,16,0.54,True,6,13,15,15,2,8,21,1,14,2.07,3.65,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1009,-inf,0.0,110,0.0,100,True,16,0.6,True,6,12,16,16,3,8,21,2,14,1.61,4.36,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1010,-inf,0.0,177,0.0,100,True,24,0.54,False,6,12,15,16,3,8,21,1,14,1.98,4.16,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1011,-inf,0.0,261,0.0,100,True,24,0.56,True,6,13,15,16,3,8,21,1,14,2.19,5.39,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1012,-inf,0.0,196,0.0,100,True,24,0.59,True,6,12,14,16,3,8,21,1,14,2.16,4.39,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1013,-inf,0.0,128,0.0,50,True,16,0.66,True,6,12,15,16,3,8,21,2,14,1.88,4.87,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1014,-inf,0.0,0,0.0,50,True,20,0.53,False,6,12,14,15,3,8,21,2,14,2.19,4.81,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1015,-inf,0.0,146,0.0,100,True,16,0.69,False,6,13,15,15,3,8,21,1,14,2.04,5.16,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1016,-inf,0.0,192,0.0,100,True,20,0.61,False,6,12,15,15,3,8,21,1,14,1.99,3.78,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1017,-inf,0.0,213,0.0,50,True,24,0.54,False,6,13,15,15,3,8,21,1,14,2.07,4.15,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1018,-inf,0.0,196,0.0,50,True,16,0.62,False,6,13,14,15,2,8,21,1,14,1.8,4.46,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1019,-inf,0.0,133,0.0,100,True,16,0.66,False,6,13,14,16,3,8,21,1,14,1.66,4.78,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1020,-inf,0.0,108,0.0,100,True,20,0.68,True,6,13,14,15,3,8,21,2,14,1.85,3.8,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1021,-inf,0.0,87,0.0,100,True,24,0.54,True,6,13,14,16,3,8,21,2,14,1.92,4.08,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1022,-inf,0.0,239,0.0,50,True,24,0.64,False,6,13,15,15,2,8,21,1,14,1.88,4.42,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1023,-inf,0.0,253,0.0,100,True,20,0.62,True,6,12,14,16,3,8,21,1,14,2.08,5.1,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1024,-inf,0.0,110,0.0,100,True,16,0.61,True,6,13,16,16,3,8,21,2,14,1.8,3.63,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1025,-inf,0.0,225,0.0,50,True,24,0.66,True,6,12,16,16,2,8,21,1,14,2.06,4.36,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1026,-inf,0.0,0,0.0,100,True,24,0.53,False,6,12,14,16,3,8,21,2,14,2.07,4.98,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1027,-inf,0.0,175,0.0,100,True,24,0.56,False,6,12,14,15,3,8,21,1,14,1.69,5.21,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1028,-inf,0.0,191,0.0,100,True,24,0.59,True,6,13,16,15,2,8,21,1,14,1.72,3.86,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1029,-inf,0.0,384,0.0,50,True,16,0.61,True,6,13,15,15,2,8,21,1,14,1.78,4.35,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1030,-inf,0.0,0,0.0,50,True,20,0.51,False,6,12,15,15,3,8,21,2,14,2.11,3.92,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1031,-inf,0.0,193,0.0,100,True,20,0.54,False,6,12,14,15,2,8,21,1,14,2.05,3.74,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1032,-inf,0.0,151,0.0,100,True,24,0.7,False,6,12,14,15,3,8,21,1,14,1.75,3.72,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1033,-inf,0.0,195,0.0,50,True,20,0.66,False,6,12,15,16,3,8,21,1,14,1.86,5.2,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1034,-inf,0.0,214,0.0,50,True,24,0.63,False,6,13,14,16,3,8,21,1,14,1.68,4.0,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1035,-inf,0.0,324,0.0,50,True,24,0.53,False,6,12,14,15,3,8,21,1,14,1.97,5.15,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1036,-inf,0.0,221,0.0,50,True,24,0.69,True,6,13,14,15,2,8,21,1,14,1.72,4.31,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1037,-inf,0.0,132,0.0,100,True,16,0.66,False,6,12,15,15,2,8,21,1,14,1.63,4.25,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1038,-inf,0.0,252,0.0,50,True,16,0.52,False,6,12,14,16,2,8,21,1,14,2.18,4.43,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1039,-inf,0.0,200,0.0,100,True,16,0.67,True,6,13,15,16,3,8,21,1,14,1.79,4.58,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1040,-inf,0.0,295,0.0,50,True,20,0.6,True,6,12,14,15,2,8,21,1,14,2.0,4.99,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1041,-inf,0.0,84,0.0,100,True,24,0.52,True,6,13,14,16,3,8,21,2,14,2.18,4.84,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1042,-inf,0.0,0,0.0,100,True,16,0.57,False,6,12,16,15,3,8,21,2,14,1.63,3.9,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1043,-inf,0.0,95,0.0,50,True,24,0.51,True,6,12,15,16,2,8,21,2,14,1.89,5.22,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1044,-inf,0.0,0,0.0,100,True,20,0.7,False,6,13,16,16,2,8,21,2,14,1.77,5.04,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1045,-inf,0.0,0,0.0,50,True,20,0.57,False,6,13,16,15,3,8,21,2,14,1.76,5.06,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1046,-inf,0.0,271,0.0,50,True,24,0.53,True,6,13,14,15,3,8,21,1,14,2.12,4.11,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1047,-inf,0.0,310,0.0,50,True,24,0.54,True,6,12,16,15,2,8,21,1,14,2.04,4.21,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1048,-inf,0.0,109,0.0,50,True,24,0.57,True,6,12,15,15,2,8,21,2,14,1.7,4.77,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1049,-inf,0.0,148,0.0,50,True,24,0.69,False,6,12,15,15,3,8,21,1,14,1.83,4.54,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1050,-inf,0.0,261,0.0,100,True,20,0.53,False,6,12,14,16,3,8,21,1,14,2.15,4.73,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1051,-inf,0.0,386,0.0,100,True,16,0.53,True,6,12,15,15,3,8,21,1,14,1.95,4.0,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1052,-inf,0.0,300,0.0,50,True,20,0.53,False,6,12,16,15,2,8,21,1,14,1.69,4.05,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1053,-inf,0.0,311,0.0,50,True,24,0.56,True,6,13,14,16,3,8,21,1,14,1.92,4.72,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1054,-inf,0.0,214,0.0,100,True,20,0.69,True,6,13,15,15,3,8,21,1,14,1.95,5.25,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1055,-inf,0.0,234,0.0,100,True,16,0.6,True,6,13,14,16,3,8,21,1,14,1.63,3.71,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1056,-inf,0.0,191,0.0,100,True,20,0.63,False,6,13,16,16,3,8,21,1,14,1.61,4.93,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1057,-inf,0.0,0,0.0,100,True,16,0.62,False,6,12,16,16,3,8,21,2,14,1.91,5.35,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1058,-inf,0.0,111,0.0,50,True,24,0.67,True,6,12,14,15,3,8,21,2,14,2.0,5.31,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1059,-inf,0.0,0,0.0,50,True,20,0.63,False,6,13,16,15,3,8,21,2,14,2.05,4.36,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1060,-inf,0.0,0,0.0,50,True,16,0.63,False,6,12,15,16,2,8,21,2,14,1.87,5.28,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1061,-inf,0.0,246,0.0,100,True,20,0.69,True,6,13,15,15,3,8,21,1,14,2.02,4.77,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1062,-inf,0.0,197,0.0,100,True,24,0.58,False,6,12,15,15,3,8,21,1,14,1.97,4.98,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1063,-inf,0.0,218,0.0,100,True,16,0.68,True,6,13,15,16,2,8,21,1,14,1.72,5.21,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1064,-inf,0.0,190,0.0,100,True,20,0.68,True,6,12,15,15,2,8,21,1,14,1.95,5.32,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1065,-inf,0.0,0,0.0,100,True,24,0.61,False,6,12,14,15,2,8,21,2,14,1.96,5.25,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1066,-inf,0.0,0,0.0,50,True,24,0.57,False,6,13,14,16,2,8,21,2,14,2.09,5.27,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1067,-inf,0.0,194,0.0,50,True,20,0.7,False,6,12,14,15,3,8,21,1,14,1.9,5.17,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1068,-inf,0.0,264,0.0,50,True,20,0.63,True,6,12,14,16,2,8,21,1,14,2.11,4.47,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1069,-inf,0.0,268,0.0,50,True,20,0.54,False,6,13,16,16,3,8,21,1,14,1.86,4.23,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1070,-inf,0.0,195,0.0,100,True,16,0.69,True,6,13,16,15,2,8,21,1,14,2.19,5.07,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1071,-inf,0.0,245,0.0,100,True,24,0.56,True,6,13,16,15,3,8,21,1,14,1.94,3.61,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1072,-inf,0.0,190,0.0,100,True,24,0.59,True,6,12,16,16,2,8,21,1,14,1.89,4.91,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1073,-inf,0.0,158,0.0,100,True,16,0.69,False,6,13,16,15,3,8,21,1,14,2.02,5.39,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1074,-inf,0.0,0,0.0,100,True,20,0.61,False,6,13,14,16,2,8,21,2,14,2.19,4.67,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1075,-inf,0.0,104,0.0,50,True,24,0.65,True,6,12,16,15,3,8,21,2,14,1.7,3.89,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1076,-inf,0.0,223,0.0,50,True,16,0.63,False,6,12,15,15,2,8,21,1,14,1.94,5.4,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1077,-inf,0.0,202,0.0,100,True,24,0.59,False,6,12,14,16,3,8,21,1,14,2.02,5.26,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1078,-inf,0.0,260,0.0,50,True,20,0.58,True,6,13,16,15,3,8,21,1,14,2.05,4.55,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1079,-inf,0.0,219,0.0,50,True,24,0.51,False,6,12,14,15,2,8,21,1,14,1.8,4.11,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1080,-inf,0.0,237,0.0,100,True,16,0.69,True,6,13,14,15,3,8,21,1,14,2.12,5.33,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1081,-inf,0.0,118,0.0,50,True,20,0.64,True,6,12,15,15,2,8,21,2,14,2.13,5.09,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1082,-inf,0.0,106,0.0,100,True,16,0.57,True,6,12,14,16,2,8,21,2,14,1.69,4.73,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1083,-inf,0.0,209,0.0,100,True,20,0.69,True,6,13,14,16,2,8,21,1,14,2.18,4.48,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1084,-inf,0.0,0,0.0,100,True,16,0.68,False,6,12,16,15,3,8,21,2,14,1.94,4.9,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1085,-inf,0.0,285,0.0,50,True,20,0.56,False,6,12,15,16,3,8,21,1,14,1.83,4.48,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1086,-inf,0.0,0,0.0,100,True,24,0.6,False,6,13,15,16,2,8,21,2,14,2.1,3.88,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1087,-inf,0.0,289,0.0,50,True,24,0.56,True,6,12,14,16,3,8,21,1,14,1.81,4.58,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1088,-inf,0.0,277,0.0,50,True,24,0.57,True,6,12,14,16,2,8,21,1,14,2.03,3.65,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1089,-inf,0.0,312,0.0,50,True,24,0.63,True,6,12,15,15,2,8,21,1,14,1.6,3.98,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1090,-inf,0.0,0,0.0,100,True,16,0.57,False,6,12,14,15,2,8,21,2,14,2.0,5.26,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1091,-inf,0.0,145,0.0,100,True,16,0.69,False,6,13,16,15,3,8,21,1,14,1.83,5.19,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1092,-inf,0.0,0,0.0,100,True,24,0.5,False,6,12,16,16,2,8,21,2,14,2.01,3.64,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1093,-inf,0.0,284,0.0,50,True,20,0.51,False,6,12,16,16,3,8,21,1,14,1.92,4.07,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1094,-inf,0.0,352,0.0,50,True,16,0.58,True,6,12,16,16,2,8,21,1,14,1.91,3.57,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1095,-inf,0.0,315,0.0,50,True,16,0.51,False,6,12,14,15,2,8,21,1,14,1.97,4.38,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1096,-inf,0.0,98,0.0,50,True,24,0.69,True,6,12,16,16,2,8,21,2,14,1.61,3.81,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1097,-inf,0.0,108,0.0,100,True,20,0.54,True,6,13,15,15,3,8,21,2,14,1.64,3.87,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1098,-inf,0.0,196,0.0,100,True,16,0.67,True,6,12,16,16,2,8,21,1,14,1.93,4.14,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1099,-inf,0.0,315,0.0,50,True,20,0.6,True,6,12,16,16,3,8,21,1,14,1.69,3.71,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1100,-inf,0.0,170,0.0,100,True,16,0.61,False,6,12,14,15,2,8,21,1,14,1.99,5.32,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1101,-inf,0.0,0,0.0,100,True,20,0.64,False,6,13,16,15,3,8,21,2,14,1.75,5.46,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1102,-inf,0.0,178,0.0,100,True,16,0.59,False,6,12,14,16,2,8,21,1,14,2.2,5.26,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1103,-inf,0.0,243,0.0,50,True,20,0.66,True,6,12,15,16,2,8,21,1,14,1.68,4.75,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1104,-inf,0.0,168,0.0,100,True,20,0.59,False,6,13,15,16,3,8,21,1,14,1.8,4.3,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1105,-inf,0.0,127,0.0,50,True,16,0.54,True,6,12,16,16,3,8,21,2,14,2.12,5.08,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1106,-inf,0.0,0,0.0,100,True,16,0.58,False,6,12,16,16,3,8,21,2,14,1.85,3.9,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1107,-inf,0.0,185,0.0,50,True,24,0.58,False,6,12,15,15,2,8,21,1,14,1.94,3.84,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1108,-inf,0.0,278,0.0,50,True,24,0.58,True,6,12,15,16,3,8,21,1,14,2.12,3.76,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1109,-inf,0.0,379,0.0,50,True,24,0.52,True,6,12,14,15,2,8,21,1,14,2.11,4.13,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1110,-inf,0.0,374,0.0,50,True,16,0.56,True,6,13,16,16,3,8,21,1,14,1.8,3.85,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1111,-inf,0.0,127,0.0,50,True,16,0.53,True,6,13,14,16,3,8,21,2,14,2.11,4.0,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1112,-inf,0.0,336,0.0,50,True,20,0.52,True,6,12,15,16,3,8,21,1,14,1.7,3.54,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1113,-inf,0.0,144,0.0,100,True,24,0.61,False,6,12,15,16,3,8,21,1,14,2.13,3.64,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1114,-inf,0.0,233,0.0,100,True,24,0.58,True,6,12,16,15,3,8,21,1,14,2.03,5.4,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1115,-inf,0.0,0,0.0,100,True,16,0.62,False,6,12,15,16,2,8,21,2,14,1.77,4.54,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1116,-inf,0.0,315,0.0,100,True,16,0.51,True,6,13,15,16,3,8,21,1,14,1.62,5.0,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1117,-inf,0.0,310,0.0,50,True,20,0.61,True,6,12,16,15,3,8,21,1,14,1.72,4.44,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1118,-inf,0.0,189,0.0,100,True,24,0.58,False,6,13,15,16,2,8,21,1,14,2.03,4.6,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1119,-inf,0.0,233,0.0,100,True,16,0.68,True,6,13,16,15,2,8,21,1,14,2.08,3.71,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1120,-inf,0.0,120,0.0,100,True,16,0.53,True,6,12,14,15,2,8,21,2,14,2.08,5.24,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1121,-inf,0.0,207,0.0,50,True,24,0.63,False,6,13,16,15,2,8,21,1,14,2.02,3.9,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1122,-inf,0.0,272,0.0,50,True,16,0.64,True,6,12,15,15,2,8,21,1,14,2.03,4.27,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1123,-inf,0.0,197,0.0,50,True,20,0.66,False,6,12,15,16,2,8,21,1,14,1.71,3.51,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1124,-inf,0.0,233,0.0,100,True,16,0.68,True,6,12,16,15,2,8,21,1,14,2.11,5.01,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1125,-inf,0.0,103,0.0,100,True,24,0.67,False,6,13,16,16,2,8,21,1,14,1.75,4.19,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1126,-inf,0.0,126,0.0,50,True,24,0.68,False,6,13,14,15,2,8,21,1,14,1.9,5.31,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1127,-inf,0.0,0,0.0,100,True,16,0.63,False,6,12,16,15,3,8,21,2,14,2.06,5.33,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1128,-inf,0.0,204,0.0,50,True,24,0.55,False,6,13,15,16,3,8,21,1,14,1.78,4.48,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1129,-inf,0.0,300,0.0,50,True,16,0.62,True,6,13,15,16,3,8,21,1,14,2.15,5.19,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1130,-inf,0.0,243,0.0,100,True,20,0.53,False,6,13,14,15,3,8,21,1,14,2.19,4.76,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1131,-inf,0.0,243,0.0,50,True,20,0.66,True,6,12,16,15,2,8,21,1,14,1.61,4.44,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1132,-inf,0.0,305,0.0,50,True,16,0.6,True,6,13,16,16,2,8,21,1,14,1.89,4.95,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1133,-inf,0.0,123,0.0,50,True,20,0.69,True,6,13,14,15,3,8,21,2,14,1.89,4.08,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1134,-inf,0.0,111,0.0,100,True,16,0.58,True,6,13,16,15,3,8,21,2,14,1.79,4.74,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1135,-inf,0.0,238,0.0,50,True,24,0.56,False,6,12,15,16,2,8,21,1,14,1.87,4.33,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1136,-inf,0.0,0,0.0,50,True,20,0.63,False,6,13,16,16,3,8,21,2,14,1.72,3.75,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1137,-inf,0.0,220,0.0,50,True,24,0.62,True,6,12,15,16,2,8,21,1,14,1.91,3.69,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1138,-inf,0.0,201,0.0,100,True,16,0.61,False,6,13,14,16,3,8,21,1,14,2.07,4.05,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1139,-inf,0.0,261,0.0,50,True,20,0.55,True,6,13,15,16,2,8,21,1,14,2.17,4.47,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1140,-inf,0.0,94,0.0,50,True,24,0.54,True,6,13,16,15,2,8,21,2,14,2.08,4.06,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1141,-inf,0.0,331,0.0,50,True,20,0.55,True,6,13,14,15,3,8,21,1,14,1.82,5.05,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1142,-inf,0.0,244,0.0,100,True,24,0.53,False,6,13,14,16,3,8,21,1,14,1.72,4.71,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1143,-inf,0.0,248,0.0,50,True,20,0.69,True,6,12,15,16,3,8,21,1,14,1.79,4.94,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1144,-inf,0.0,263,0.0,100,True,24,0.56,True,6,13,16,15,3,8,21,1,14,1.94,4.64,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1145,-inf,0.0,118,0.0,50,True,20,0.51,True,6,12,14,15,2,8,21,2,14,1.74,5.01,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1146,-inf,0.0,124,0.0,50,True,20,0.57,True,6,13,15,15,3,8,21,2,14,2.07,4.89,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1147,-inf,0.0,348,0.0,50,True,20,0.53,False,6,12,14,15,2,8,21,1,14,1.99,4.89,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1148,-inf,0.0,249,0.0,50,True,16,0.65,True,6,12,16,16,3,8,21,1,14,2.05,4.84,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1149,-inf,0.0,211,0.0,100,True,20,0.5,False,6,12,14,15,2,8,21,1,14,1.74,4.48,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1150,-inf,0.0,105,0.0,50,True,24,0.68,True,6,13,14,15,2,8,21,2,14,2.05,4.06,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1151,-inf,0.0,146,0.0,100,True,16,0.67,False,6,13,14,16,3,8,21,1,14,1.67,4.07,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1152,-inf,0.0,119,0.0,100,True,16,0.54,True,6,13,14,15,2,8,21,2,14,2.04,4.1,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1153,-inf,0.0,209,0.0,50,True,24,0.66,False,6,13,14,15,3,8,21,1,14,1.91,4.12,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1154,-inf,0.0,223,0.0,100,True,16,0.6,False,6,13,15,16,2,8,21,1,14,1.89,4.69,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1155,-inf,0.0,251,0.0,50,True,24,0.52,True,6,12,16,15,2,8,21,1,14,2.16,4.11,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1156,-inf,0.0,398,0.0,50,True,16,0.51,True,6,12,15,16,2,8,21,1,14,1.85,3.54,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1157,-inf,0.0,300,0.0,100,True,16,0.55,True,6,12,16,15,3,8,21,1,14,1.61,3.67,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1158,-inf,0.0,247,0.0,100,True,20,0.5,False,6,12,16,15,2,8,21,1,14,1.84,4.25,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1159,-inf,0.0,98,0.0,100,True,20,0.58,True,6,12,16,15,3,8,21,2,14,1.77,4.46,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1160,-inf,0.0,0,0.0,100,True,16,0.55,False,6,12,16,15,3,8,21,2,14,2.17,4.48,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1161,-inf,0.0,0,0.0,50,True,20,0.57,False,6,13,15,15,3,8,21,2,14,2.14,4.95,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1162,-inf,0.0,133,0.0,100,True,24,0.63,False,6,12,16,16,3,8,21,1,14,2.19,5.03,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1163,-inf,0.0,140,0.0,100,True,24,0.61,False,6,13,14,16,2,8,21,1,14,2.15,4.79,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1164,-inf,0.0,353,0.0,50,True,16,0.57,True,6,13,16,15,2,8,21,1,14,2.09,4.29,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1165,-inf,0.0,94,0.0,50,True,24,0.52,True,6,13,16,15,2,8,21,2,14,2.03,4.17,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1166,-inf,0.0,0,0.0,100,True,24,0.69,False,6,12,16,16,3,8,21,2,14,2.05,3.71,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1167,-inf,0.0,237,0.0,100,True,16,0.67,True,6,12,16,15,3,8,21,1,14,2.15,4.89,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1168,-inf,0.0,248,0.0,100,True,20,0.67,True,6,12,14,15,2,8,21,1,14,1.67,3.87,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1169,-inf,0.0,107,0.0,50,True,20,0.59,True,6,13,15,16,2,8,21,2,14,1.96,4.19,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1170,-inf,0.0,176,0.0,100,True,20,0.62,False,6,12,16,16,2,8,21,1,14,1.79,3.56,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1171,-inf,0.0,137,0.0,100,True,24,0.65,False,6,13,16,16,2,8,21,1,14,1.62,4.47,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1172,-inf,0.0,263,0.0,100,True,24,0.52,True,6,12,15,16,3,8,21,1,14,1.96,4.44,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1173,-inf,0.0,106,0.0,100,True,16,0.62,True,6,12,16,15,2,8,21,2,14,1.87,4.5,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1174,-inf,0.0,228,0.0,100,True,24,0.63,True,6,13,16,15,3,8,21,1,14,2.14,4.09,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1175,-inf,0.0,217,0.0,100,True,24,0.57,True,6,12,14,15,3,8,21,1,14,1.75,4.27,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1176,-inf,0.0,107,0.0,50,True,20,0.51,True,6,12,15,16,2,8,21,2,14,1.87,4.9,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1177,-inf,0.0,309,0.0,50,True,16,0.53,True,6,13,15,16,3,8,21,1,14,2.03,5.3,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1178,-inf,0.0,237,0.0,50,True,20,0.59,False,6,13,16,16,2,8,21,1,14,1.65,5.26,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1179,-inf,0.0,221,0.0,100,True,20,0.6,True,6,12,14,15,2,8,21,1,14,1.94,4.83,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1180,-inf,0.0,84,0.0,100,True,24,0.55,True,6,12,16,16,2,8,21,2,14,1.62,3.9,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1181,-inf,0.0,281,0.0,100,True,16,0.57,True,6,12,16,16,2,8,21,1,14,2.13,3.77,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1182,-inf,0.0,287,0.0,50,True,16,0.63,False,6,13,14,15,2,8,21,1,14,1.93,4.75,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1183,-inf,0.0,293,0.0,50,True,24,0.53,True,6,13,16,15,2,8,21,1,14,1.98,4.33,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1184,-inf,0.0,242,0.0,50,True,20,0.58,False,6,12,15,16,2,8,21,1,14,2.0,5.36,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1185,-inf,0.0,0,0.0,50,True,24,0.68,False,6,13,16,15,2,8,21,2,14,1.91,4.49,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1186,-inf,0.0,332,0.0,50,True,20,0.51,True,6,12,16,15,3,8,21,1,14,1.84,4.43,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1187,-inf,0.0,115,0.0,100,True,20,0.67,False,6,13,15,15,3,8,21,1,14,1.65,4.48,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1188,-inf,0.0,208,0.0,50,True,20,0.63,False,6,13,16,15,3,8,21,1,14,2.14,4.63,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1189,-inf,0.0,0,0.0,50,True,20,0.6,False,6,13,15,16,2,8,21,2,14,2.13,3.78,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1190,-inf,0.0,0,0.0,50,True,24,0.64,False,6,12,15,15,2,8,21,2,14,2.03,4.08,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1191,-inf,0.0,0,0.0,100,True,16,0.68,False,6,13,14,16,3,8,21,2,14,1.76,4.64,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1192,-inf,0.0,213,0.0,50,True,20,0.62,False,6,12,15,16,2,8,21,1,14,1.71,5.37,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1193,-inf,0.0,88,0.0,100,True,24,0.61,True,6,13,14,16,3,8,21,2,14,1.66,4.37,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1194,-inf,0.0,122,0.0,50,True,16,0.52,True,6,12,14,16,2,8,21,2,14,1.92,3.75,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1195,-inf,0.0,275,0.0,100,True,16,0.51,True,6,12,14,16,3,8,21,1,14,1.86,3.96,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1196,-inf,0.0,196,0.0,100,True,24,0.57,True,6,12,14,16,2,8,21,1,14,2.08,5.15,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1197,-inf,0.0,400,0.0,50,True,16,0.52,False,6,13,14,15,2,8,21,1,14,1.73,4.42,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1198,-inf,0.0,287,0.0,50,True,20,0.52,True,6,13,15,16,3,8,21,1,14,1.74,5.19,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1199,-inf,0.0,0,0.0,100,True,20,0.53,False,6,13,14,16,2,8,21,2,14,1.89,5.08,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1200,-inf,0.0,173,0.0,100,True,16,0.6,False,6,13,16,15,3,8,21,1,14,2.02,4.7,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1201,-inf,0.0,233,0.0,100,True,16,0.66,True,6,12,15,16,3,8,21,1,14,1.75,4.08,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1202,-inf,0.0,123,0.0,100,True,16,0.64,True,6,12,15,15,3,8,21,2,14,1.81,4.26,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1203,-inf,0.0,209,0.0,100,True,20,0.52,False,6,13,14,16,3,8,21,1,14,1.89,3.84,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1204,-inf,0.0,209,0.0,50,True,16,0.7,False,6,12,14,15,2,8,21,1,14,1.97,4.61,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1205,-inf,0.0,348,0.0,100,True,20,0.53,True,6,13,15,15,2,8,21,1,14,1.79,4.54,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1206,-inf,0.0,224,0.0,50,True,24,0.63,True,6,13,16,16,3,8,21,1,14,1.74,5.12,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1207,-inf,0.0,0,0.0,50,True,16,0.65,False,6,12,16,15,3,8,21,2,14,2.06,4.95,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1208,-inf,0.0,248,0.0,50,True,16,0.66,False,6,12,15,15,2,8,21,1,14,1.68,3.6,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1209,-inf,0.0,0,0.0,50,True,24,0.67,False,6,13,14,16,2,8,21,2,14,1.67,4.0,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1210,-inf,0.0,127,0.0,50,True,16,0.7,True,6,12,15,16,3,8,21,2,14,2.05,4.6,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1211,-inf,0.0,0,0.0,100,True,24,0.69,False,6,13,15,16,2,8,21,2,14,2.11,3.75,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1212,-inf,0.0,153,0.0,50,True,24,0.7,False,6,12,16,16,3,8,21,1,14,1.78,3.55,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1213,-inf,0.0,324,0.0,50,True,16,0.59,True,6,13,16,15,3,8,21,1,14,1.75,3.53,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1214,-inf,0.0,168,0.0,100,True,20,0.58,False,6,13,14,16,2,8,21,1,14,2.18,3.99,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1215,-inf,0.0,0,0.0,50,True,20,0.57,False,6,13,15,16,2,8,21,2,14,1.78,5.14,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1216,-inf,0.0,368,0.0,50,True,20,0.51,False,6,12,15,15,2,8,21,1,14,1.69,4.92,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1217,-inf,0.0,0,0.0,50,True,24,0.54,False,6,12,15,16,3,8,21,2,14,1.88,4.74,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1218,-inf,0.0,167,0.0,50,True,24,0.62,False,6,13,15,15,2,8,21,1,14,2.16,4.26,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1219,-inf,0.0,0,0.0,100,True,24,0.64,False,6,12,14,15,2,8,21,2,14,1.83,4.29,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1220,-inf,0.0,236,0.0,100,True,16,0.69,True,6,13,16,15,3,8,21,1,14,1.86,4.64,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1221,-inf,0.0,151,0.0,50,True,16,0.67,False,6,13,14,15,3,8,21,1,14,2.15,4.49,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1222,-inf,0.0,0,0.0,100,True,20,0.62,False,6,13,15,16,3,8,21,2,14,1.69,4.86,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1223,-inf,0.0,172,0.0,100,True,24,0.66,True,6,12,14,16,3,8,21,1,14,1.8,4.52,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1224,-inf,0.0,180,0.0,100,True,16,0.69,False,6,13,14,15,2,8,21,1,14,2.13,4.0,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1225,-inf,0.0,194,0.0,100,True,20,0.65,False,6,13,15,15,2,8,21,1,14,1.97,5.4,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1226,-inf,0.0,216,0.0,100,True,16,0.59,False,6,12,15,16,2,8,21,1,14,2.16,3.74,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1227,-inf,0.0,0,0.0,100,True,20,0.62,False,6,13,14,16,2,8,21,2,14,2.08,4.17,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1228,-inf,0.0,272,0.0,100,True,16,0.52,True,6,12,14,16,3,8,21,1,14,2.16,5.09,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1229,-inf,0.0,127,0.0,50,True,16,0.5,True,6,12,14,16,3,8,21,2,14,2.01,5.15,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1230,-inf,0.0,379,0.0,50,True,16,0.53,False,6,13,14,15,2,8,21,1,14,1.97,5.14,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1231,-inf,0.0,200,0.0,100,True,20,0.52,False,6,12,16,16,2,8,21,1,14,1.88,5.2,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1232,-inf,0.0,0,0.0,50,True,20,0.62,False,6,12,15,16,2,8,21,2,14,1.88,4.41,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1233,-inf,0.0,171,0.0,100,True,24,0.64,False,6,13,14,16,3,8,21,1,14,1.74,3.8,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1234,-inf,0.0,263,0.0,50,True,16,0.62,True,6,12,14,16,2,8,21,1,14,2.03,4.06,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1235,-inf,0.0,0,0.0,100,True,24,0.55,False,6,13,15,15,3,8,21,2,14,1.73,4.45,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1236,-inf,0.0,276,0.0,50,True,20,0.54,True,6,12,14,16,3,8,21,1,14,2.09,4.43,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1237,-inf,0.0,233,0.0,100,True,20,0.53,False,6,13,16,16,2,8,21,1,14,2.12,3.83,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1238,-inf,0.0,0,0.0,50,True,20,0.68,False,6,12,14,15,2,8,21,2,14,1.96,5.41,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1239,-inf,0.0,371,0.0,50,True,20,0.51,True,6,13,16,16,3,8,21,1,14,1.6,4.47,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1240,-inf,0.0,0,0.0,50,True,16,0.57,False,6,13,16,15,3,8,21,2,14,2.08,4.41,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1241,-inf,0.0,120,0.0,100,True,24,0.7,False,6,12,15,16,2,8,21,1,14,1.95,5.43,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1242,-inf,0.0,214,0.0,100,True,20,0.68,True,6,13,16,15,3,8,21,1,14,1.78,4.8,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1243,-inf,0.0,269,0.0,100,True,20,0.55,True,6,12,14,16,2,8,21,1,14,1.6,3.6,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1244,-inf,0.0,179,0.0,100,True,16,0.6,False,6,12,15,15,3,8,21,1,14,2.11,5.35,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1245,-inf,0.0,277,0.0,100,True,16,0.61,True,6,12,16,16,2,8,21,1,14,1.99,5.39,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1246,-inf,0.0,236,0.0,50,True,24,0.65,True,6,13,16,16,3,8,21,1,14,2.14,3.91,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1247,-inf,0.0,389,0.0,50,True,20,0.56,True,6,12,14,15,2,8,21,1,14,1.64,5.04,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1248,-inf,0.0,270,0.0,50,True,20,0.57,False,6,12,15,16,2,8,21,1,14,2.07,4.21,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1249,-inf,0.0,281,0.0,100,True,24,0.5,True,6,12,14,15,3,8,21,1,14,1.91,4.88,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1250,-inf,0.0,188,0.0,100,True,16,0.57,False,6,13,14,16,2,8,21,1,14,1.71,4.77,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1251,-inf,0.0,266,0.0,50,True,24,0.55,False,6,13,15,16,3,8,21,1,14,2.14,3.57,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1252,-inf,0.0,119,0.0,100,True,16,0.7,False,6,13,15,15,3,8,21,1,14,1.65,5.19,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1253,-inf,0.0,328,0.0,50,True,24,0.53,False,6,13,14,15,3,8,21,1,14,1.79,5.14,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1254,-inf,0.0,273,0.0,50,True,16,0.69,True,6,13,15,15,3,8,21,1,14,2.11,5.46,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1255,-inf,0.0,224,0.0,50,True,20,0.56,False,6,13,14,15,3,8,21,1,14,1.71,3.69,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1256,-inf,0.0,0,0.0,50,True,20,0.52,False,6,13,15,15,2,8,21,2,14,1.73,5.1,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1257,-inf,0.0,212,0.0,100,True,20,0.67,True,6,13,16,16,2,8,21,1,14,2.05,3.58,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1258,-inf,0.0,200,0.0,100,True,20,0.65,True,6,12,14,15,2,8,21,1,14,1.63,5.12,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1259,-inf,0.0,118,0.0,50,True,20,0.53,True,6,12,15,15,2,8,21,2,14,2.15,4.9,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1260,-inf,0.0,276,0.0,50,True,20,0.54,True,6,12,16,15,3,8,21,1,14,2.01,5.25,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1261,-inf,0.0,106,0.0,50,True,20,0.61,True,6,13,14,16,2,8,21,2,14,1.78,3.77,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1262,-inf,0.0,226,0.0,100,True,20,0.55,True,6,13,15,16,2,8,21,1,14,1.84,3.88,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1263,-inf,0.0,300,0.0,50,True,24,0.54,True,6,12,14,15,2,8,21,1,14,2.05,4.96,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1264,-inf,0.0,122,0.0,50,True,16,0.56,True,6,12,16,15,2,8,21,2,14,1.61,3.71,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1265,-inf,0.0,128,0.0,50,True,16,0.64,True,6,13,15,16,3,8,21,2,14,1.91,4.05,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1266,-inf,0.0,364,0.0,50,True,16,0.58,True,6,12,15,16,3,8,21,1,14,1.63,3.51,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1267,-inf,0.0,200,0.0,50,True,16,0.65,False,6,12,15,15,3,8,21,1,14,1.77,3.85,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1268,-inf,0.0,276,0.0,50,True,24,0.59,False,6,12,15,15,3,8,21,1,14,2.18,4.04,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1269,-inf,0.0,281,0.0,100,True,16,0.5,True,6,13,15,15,2,8,21,1,14,1.76,4.24,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1270,-inf,0.0,138,0.0,50,True,20,0.67,False,6,13,14,15,2,8,21,1,14,2.14,4.0,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1271,-inf,0.0,104,0.0,50,True,24,0.6,True,6,12,14,16,3,8,21,2,14,1.8,4.46,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1272,-inf,0.0,0,0.0,100,True,24,0.65,False,6,13,16,15,3,8,21,2,14,2.11,4.7,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1273,-inf,0.0,312,0.0,50,True,20,0.59,True,6,12,15,15,3,8,21,1,14,1.88,3.98,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1274,-inf,0.0,220,0.0,50,True,20,0.69,True,6,12,14,15,2,8,21,1,14,2.12,3.91,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1275,-inf,0.0,217,0.0,50,True,16,0.64,False,6,12,14,15,2,8,21,1,14,1.66,4.01,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1276,-inf,0.0,0,0.0,50,True,20,0.63,False,6,12,14,16,2,8,21,2,14,1.67,5.11,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1277,-inf,0.0,266,0.0,50,True,16,0.6,False,6,12,16,15,3,8,21,1,14,2.08,5.27,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1278,-inf,0.0,255,0.0,50,True,24,0.56,False,6,13,15,16,2,8,21,1,14,2.04,5.46,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1279,-inf,0.0,300,0.0,100,True,16,0.53,True,6,12,16,15,2,8,21,1,14,2.1,3.9,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1280,-inf,0.0,110,0.0,50,True,24,0.59,True,6,12,14,15,3,8,21,2,14,2.05,5.02,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1281,-inf,0.0,388,0.0,50,True,24,0.51,True,6,13,15,15,2,8,21,1,14,1.62,3.85,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1282,-inf,0.0,122,0.0,50,True,16,0.54,True,6,13,14,16,2,8,21,2,14,2.09,4.03,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1283,-inf,0.0,353,0.0,100,True,20,0.53,True,6,13,15,15,3,8,21,1,14,1.79,4.71,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1284,-inf,0.0,210,0.0,50,True,20,0.56,False,6,12,16,15,2,8,21,1,14,1.74,4.9,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1285,-inf,0.0,177,0.0,100,True,20,0.68,True,6,12,16,15,2,8,21,1,14,1.74,3.6,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1286,-inf,0.0,339,0.0,50,True,16,0.61,True,6,13,16,15,3,8,21,1,14,1.8,3.77,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1287,-inf,0.0,104,0.0,100,True,20,0.67,True,6,12,14,15,2,8,21,2,14,1.87,4.34,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1288,-inf,0.0,144,0.0,50,True,24,0.65,False,6,12,16,16,3,8,21,1,14,1.62,3.52,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1289,-inf,0.0,0,0.0,50,True,24,0.51,False,6,12,16,15,2,8,21,2,14,1.71,5.41,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1290,-inf,0.0,110,0.0,100,True,16,0.66,True,6,12,15,16,3,8,21,2,14,1.67,5.33,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1291,-inf,0.0,233,0.0,100,True,20,0.53,True,6,13,15,16,2,8,21,1,14,1.71,5.03,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1292,-inf,0.0,118,0.0,50,True,20,0.58,True,6,13,15,15,2,8,21,2,14,1.63,4.82,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1293,-inf,0.0,200,0.0,100,True,24,0.57,False,6,13,16,15,3,8,21,1,14,1.94,3.97,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1294,-inf,0.0,124,0.0,50,True,20,0.57,True,6,13,15,15,3,8,21,2,14,1.63,4.93,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1295,-inf,0.0,0,0.0,50,True,20,0.54,False,6,13,16,16,2,8,21,2,14,2.07,5.41,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1296,-inf,0.0,122,0.0,50,True,16,0.51,True,6,12,15,16,2,8,21,2,14,2.15,4.98,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1297,-inf,0.0,0,0.0,100,True,24,0.54,False,6,13,14,15,3,8,21,2,14,2.06,4.56,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1298,-inf,0.0,110,0.0,100,True,16,0.53,True,6,12,16,16,3,8,21,2,14,1.7,4.64,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1299,-inf,0.0,108,0.0,100,True,20,0.56,True,6,12,15,15,3,8,21,2,14,2.04,4.56,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1300,-inf,0.0,306,0.0,100,True,20,0.52,True,6,13,15,16,2,8,21,1,14,2.17,4.25,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1301,-inf,0.0,151,0.0,50,True,20,0.66,False,6,13,16,15,3,8,21,1,14,2.18,5.32,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1302,-inf,0.0,0,0.0,50,True,20,0.58,False,6,13,15,15,2,8,21,2,14,1.67,3.98,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1303,-inf,0.0,334,0.0,50,True,20,0.57,True,6,13,16,15,3,8,21,1,14,1.77,4.78,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1304,-inf,0.0,0,0.0,50,True,16,0.54,False,6,12,16,16,3,8,21,2,14,1.67,4.96,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1305,-inf,0.0,0,0.0,50,True,16,0.64,False,6,13,16,15,2,8,21,2,14,2.19,3.98,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1306,-inf,0.0,231,0.0,50,True,20,0.54,False,6,13,14,15,3,8,21,1,14,2.03,5.41,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1307,-inf,0.0,205,0.0,100,True,20,0.7,True,6,13,16,16,2,8,21,1,14,2.15,3.92,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1308,-inf,0.0,106,0.0,50,True,20,0.66,True,6,12,16,15,2,8,21,2,14,1.83,4.44,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1309,-inf,0.0,304,0.0,100,True,24,0.56,True,6,13,14,15,3,8,21,1,14,1.97,4.19,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1310,-inf,0.0,217,0.0,100,True,24,0.51,True,6,13,14,16,2,8,21,1,14,1.84,4.45,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1311,-inf,0.0,340,0.0,50,True,20,0.54,True,6,12,16,15,2,8,21,1,14,1.87,4.17,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1312,-inf,0.0,170,0.0,50,True,20,0.69,False,6,12,16,16,2,8,21,1,14,1.98,5.06,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1313,-inf,0.0,232,0.0,100,True,20,0.59,True,6,12,14,15,3,8,21,1,14,2.16,5.39,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1314,-inf,0.0,379,0.0,50,True,20,0.58,True,6,12,15,15,3,8,21,1,14,1.79,4.99,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1315,-inf,0.0,0,0.0,50,True,20,0.68,False,6,12,15,15,3,8,21,2,14,1.67,4.75,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1316,-inf,0.0,246,0.0,50,True,24,0.54,False,6,13,16,15,2,8,21,1,14,1.78,4.61,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1317,-inf,0.0,329,0.0,50,True,20,0.56,False,6,12,15,15,2,8,21,1,14,1.99,4.73,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1318,-inf,0.0,233,0.0,50,True,24,0.57,True,6,12,16,16,2,8,21,1,14,1.77,3.86,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1319,-inf,0.0,97,0.0,100,True,20,0.62,True,6,13,16,16,3,8,21,2,14,1.78,4.61,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1320,-inf,0.0,0,0.0,100,True,16,0.68,False,6,12,16,16,3,8,21,2,14,2.17,4.0,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1321,-inf,0.0,295,0.0,50,True,20,0.5,False,6,12,14,15,2,8,21,1,14,2.1,5.11,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1322,-inf,0.0,329,0.0,50,True,20,0.58,True,6,13,16,15,3,8,21,1,14,1.84,3.74,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1323,-inf,0.0,0,0.0,100,True,16,0.65,False,6,12,16,15,3,8,21,2,14,2.0,5.32,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1324,-inf,0.0,101,0.0,50,True,24,0.68,True,6,13,14,16,3,8,21,2,14,1.67,3.78,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1325,-inf,0.0,280,0.0,100,True,20,0.51,True,6,13,16,16,2,8,21,1,14,2.0,3.69,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1326,-inf,0.0,278,0.0,100,True,20,0.58,True,6,12,14,16,3,8,21,1,14,2.0,4.87,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1327,-inf,0.0,86,0.0,100,True,24,0.57,True,6,13,14,16,3,8,21,2,14,1.69,4.68,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1328,-inf,0.0,192,0.0,100,True,24,0.68,True,6,12,15,15,2,8,21,1,14,2.0,4.53,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1329,-inf,0.0,227,0.0,100,True,16,0.7,True,6,13,16,15,2,8,21,1,14,2.0,5.13,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1330,-inf,0.0,122,0.0,50,True,16,0.58,True,6,13,14,16,2,8,21,2,14,1.79,4.41,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1331,-inf,0.0,0,0.0,50,True,24,0.69,False,6,12,14,16,2,8,21,2,14,1.77,3.53,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1332,-inf,0.0,84,0.0,100,True,24,0.56,True,6,12,16,16,2,8,21,2,14,1.84,5.23,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1333,-inf,0.0,363,0.0,50,True,20,0.5,True,6,13,16,16,3,8,21,1,14,2.19,4.63,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1334,-inf,0.0,227,0.0,100,True,16,0.58,False,6,12,14,15,2,8,21,1,14,1.74,5.37,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1335,-inf,0.0,231,0.0,50,True,16,0.57,False,6,12,15,15,3,8,21,1,14,1.72,5.49,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1336,-inf,0.0,381,0.0,50,True,16,0.62,True,6,13,14,15,3,8,21,1,14,2.1,5.46,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1337,-inf,0.0,190,0.0,100,True,20,0.61,False,6,13,14,15,2,8,21,1,14,1.64,4.84,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1338,-inf,0.0,276,0.0,100,True,24,0.51,True,6,13,14,15,3,8,21,1,14,1.91,5.45,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1339,-inf,0.0,193,0.0,100,True,20,0.7,True,6,13,14,16,2,8,21,1,14,1.88,3.72,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1340,-inf,0.0,273,0.0,100,True,24,0.6,True,6,12,14,15,2,8,21,1,14,2.14,4.68,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1341,-inf,0.0,0,0.0,50,True,20,0.6,False,6,12,16,16,3,8,21,2,14,2.01,4.38,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1342,-inf,0.0,325,0.0,50,True,16,0.67,True,6,13,15,15,3,8,21,1,14,1.94,4.4,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1343,-inf,0.0,181,0.0,100,True,24,0.62,False,6,13,16,15,3,8,21,1,14,2.02,4.31,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1344,-inf,0.0,98,0.0,100,True,24,0.66,True,6,12,15,15,3,8,21,2,14,1.69,4.82,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1345,-inf,0.0,232,0.0,50,True,24,0.57,True,6,12,15,16,2,8,21,1,14,1.92,4.39,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1346,-inf,0.0,109,0.0,100,True,20,0.61,True,6,12,14,15,3,8,21,2,14,1.84,4.41,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1347,-inf,0.0,184,0.0,100,True,16,0.59,False,6,12,14,15,2,8,21,1,14,2.08,5.4,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1348,-inf,0.0,125,0.0,50,True,24,0.67,False,6,13,16,16,2,8,21,1,14,2.13,4.18,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1349,-inf,0.0,0,0.0,50,True,24,0.52,False,6,13,16,16,2,8,21,2,14,1.99,3.68,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1350,-inf,0.0,222,0.0,100,True,20,0.58,True,6,12,14,16,3,8,21,1,14,2.07,5.43,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1351,-inf,0.0,0,0.0,100,True,20,0.62,False,6,13,16,15,3,8,21,2,14,1.9,5.19,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1352,-inf,0.0,112,0.0,50,True,20,0.7,True,6,13,16,15,3,8,21,2,14,1.71,4.75,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1353,-inf,0.0,102,0.0,50,True,24,0.55,True,6,13,15,16,3,8,21,2,14,1.87,3.58,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1354,-inf,0.0,236,0.0,50,True,20,0.68,True,6,13,15,16,3,8,21,1,14,2.16,4.29,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1355,-inf,0.0,0,0.0,50,True,16,0.57,False,6,12,16,15,2,8,21,2,14,1.92,4.65,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1356,-inf,0.0,287,0.0,50,True,16,0.61,True,6,13,15,15,3,8,21,1,14,2.01,5.33,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1357,-inf,0.0,0,0.0,100,True,24,0.7,False,6,12,15,16,2,8,21,2,14,1.7,5.39,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1358,-inf,0.0,191,0.0,50,True,20,0.61,False,6,12,14,15,3,8,21,1,14,1.82,5.4,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1359,-inf,0.0,0,0.0,100,True,20,0.69,False,6,12,16,16,3,8,21,2,14,1.77,4.02,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1360,-inf,0.0,184,0.0,100,True,24,0.62,True,6,12,15,16,2,8,21,1,14,1.72,5.17,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1361,-inf,0.0,249,0.0,50,True,20,0.66,True,6,13,14,16,3,8,21,1,14,1.8,4.41,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1362,-inf,0.0,379,0.0,50,True,16,0.54,True,6,13,16,15,3,8,21,1,14,2.04,5.4,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1363,-inf,0.0,94,0.0,100,True,20,0.67,True,6,12,16,16,2,8,21,2,14,2.12,5.1,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1364,-inf,0.0,0,0.0,50,True,20,0.54,False,6,12,16,16,2,8,21,2,14,2.04,3.76,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1365,-inf,0.0,0,0.0,100,True,20,0.53,False,6,13,14,15,3,8,21,2,14,2.09,5.12,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1366,-inf,0.0,164,0.0,50,True,20,0.67,False,6,13,16,16,3,8,21,1,14,2.12,3.78,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1367,-inf,0.0,136,0.0,100,True,24,0.68,False,6,13,16,16,3,8,21,1,14,2.07,5.18,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1368,-inf,0.0,248,0.0,50,True,20,0.69,True,6,12,16,16,3,8,21,1,14,1.68,5.2,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1369,-inf,0.0,118,0.0,50,True,20,0.57,True,6,12,14,15,2,8,21,2,14,2.13,5.27,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1370,-inf,0.0,0,0.0,100,True,16,0.54,False,6,13,15,15,2,8,21,2,14,1.98,4.61,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1371,-inf,0.0,255,0.0,50,True,20,0.56,False,6,13,16,16,2,8,21,1,14,2.18,4.88,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1372,-inf,0.0,170,0.0,100,True,24,0.66,False,6,13,14,15,2,8,21,1,14,2.11,5.47,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1373,-inf,0.0,337,0.0,100,True,20,0.54,True,6,12,14,15,2,8,21,1,14,2.1,3.75,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1374,-inf,0.0,109,0.0,50,True,24,0.56,True,6,12,15,15,2,8,21,2,14,1.75,4.02,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1375,-inf,0.0,305,0.0,100,True,20,0.5,True,6,13,15,15,3,8,21,1,14,2.07,5.3,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1376,-inf,0.0,195,0.0,100,True,20,0.65,False,6,13,15,15,3,8,21,1,14,2.12,5.38,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1377,-inf,0.0,163,0.0,50,True,24,0.66,False,6,13,16,15,2,8,21,1,14,1.63,5.24,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1378,-inf,0.0,226,0.0,50,True,24,0.59,True,6,13,16,15,2,8,21,1,14,2.07,4.96,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1379,-inf,0.0,288,0.0,50,True,16,0.57,True,6,12,16,15,3,8,21,1,14,2.17,4.97,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1380,-inf,0.0,100,0.0,50,True,24,0.56,True,6,12,14,16,3,8,21,2,14,2.18,5.08,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1381,-inf,0.0,0,0.0,100,True,24,0.69,False,6,13,14,16,3,8,21,2,14,2.05,4.49,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1382,-inf,0.0,144,0.0,100,True,16,0.69,False,6,13,15,16,2,8,21,1,14,2.14,4.71,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1383,-inf,0.0,245,0.0,50,True,16,0.61,False,6,12,14,15,3,8,21,1,14,2.0,4.69,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1384,-inf,0.0,268,0.0,50,True,16,0.6,False,6,12,16,15,2,8,21,1,14,1.62,4.85,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1385,-inf,0.0,222,0.0,100,True,20,0.65,True,6,12,14,15,2,8,21,1,14,2.06,4.48,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1386,-inf,0.0,215,0.0,100,True,20,0.64,False,6,13,14,15,3,8,21,1,14,2.08,5.35,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1387,-inf,0.0,242,0.0,50,True,20,0.7,True,6,13,16,15,3,8,21,1,14,1.88,4.19,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1388,-inf,0.0,240,0.0,50,True,16,0.66,True,6,13,16,15,2,8,21,1,14,1.72,4.05,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1389,-inf,0.0,270,0.0,50,True,16,0.62,True,6,12,16,16,3,8,21,1,14,1.73,4.69,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1390,-inf,0.0,334,0.0,50,True,16,0.58,True,6,12,14,15,2,8,21,1,14,2.12,5.35,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1391,-inf,0.0,324,0.0,100,True,24,0.53,True,6,12,14,15,3,8,21,1,14,1.66,5.33,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1392,-inf,0.0,280,0.0,50,True,20,0.53,False,6,13,14,15,2,8,21,1,14,1.78,3.88,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1393,-inf,0.0,332,0.0,50,True,24,0.5,True,6,13,16,16,2,8,21,1,14,2.06,4.06,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1394,-inf,0.0,201,0.0,100,True,16,0.66,False,6,12,15,15,3,8,21,1,14,1.69,4.07,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1395,-inf,0.0,0,0.0,50,True,24,0.67,False,6,13,14,15,2,8,21,2,14,2.0,4.69,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1396,-inf,0.0,224,0.0,100,True,16,0.66,True,6,13,14,15,3,8,21,1,14,1.85,4.22,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1397,-inf,0.0,94,0.0,100,True,20,0.56,True,6,12,14,16,2,8,21,2,14,2.07,3.55,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1398,-inf,0.0,249,0.0,100,True,16,0.57,True,6,13,14,16,3,8,21,1,14,1.7,4.74,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1399,-inf,0.0,304,0.0,50,True,20,0.59,True,6,13,14,15,2,8,21,1,14,1.92,5.39,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1400,-inf,0.0,198,0.0,100,True,20,0.69,True,6,12,14,16,2,8,21,1,14,1.64,3.53,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1401,-inf,0.0,125,0.0,100,True,24,0.68,False,6,13,15,16,2,8,21,1,14,1.87,4.85,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1402,-inf,0.0,192,0.0,100,True,20,0.67,True,6,13,15,15,2,8,21,1,14,1.88,3.51,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1403,-inf,0.0,144,0.0,50,True,16,0.66,True,6,12,14,15,3,8,21,2,14,1.74,4.4,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1404,-inf,0.0,308,0.0,100,True,16,0.58,True,6,12,16,15,3,8,21,1,14,1.66,4.69,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1405,-inf,0.0,294,0.0,100,True,24,0.51,True,6,12,16,15,3,8,21,1,14,1.66,3.61,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1406,-inf,0.0,123,0.0,100,True,16,0.69,False,6,13,16,16,3,8,21,1,14,1.72,4.3,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1407,-inf,0.0,350,0.0,50,True,16,0.5,False,6,12,15,16,3,8,21,1,14,2.02,4.69,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1408,-inf,0.0,240,0.0,50,True,16,0.61,False,6,12,16,15,3,8,21,1,14,2.09,5.34,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1409,-inf,0.0,311,0.0,100,True,20,0.59,True,6,12,15,15,2,8,21,1,14,2.02,4.45,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1410,-inf,0.0,266,0.0,100,True,20,0.58,True,6,13,15,15,2,8,21,1,14,1.63,4.68,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1411,-inf,0.0,0,0.0,50,True,20,0.51,False,6,12,16,15,3,8,21,2,14,1.6,4.0,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1412,-inf,0.0,109,0.0,100,True,16,0.51,True,6,13,16,16,3,8,21,2,14,1.92,4.49,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1413,-inf,0.0,281,0.0,50,True,16,0.59,False,6,12,15,16,3,8,21,1,14,1.85,4.26,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1414,-inf,0.0,330,0.0,50,True,20,0.56,True,6,13,15,16,2,8,21,1,14,2.1,5.02,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1415,-inf,0.0,187,0.0,50,True,24,0.64,False,6,12,16,16,2,8,21,1,14,2.03,5.32,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1416,-inf,0.0,292,0.0,50,True,16,0.54,True,6,13,16,15,2,8,21,1,14,1.85,5.18,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1417,-inf,0.0,136,0.0,50,True,24,0.66,False,6,12,16,15,2,8,21,1,14,2.01,5.0,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1418,-inf,0.0,217,0.0,100,True,16,0.68,True,6,13,14,16,2,8,21,1,14,2.18,5.36,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1419,-inf,0.0,0,0.0,50,True,16,0.65,False,6,13,16,15,3,8,21,2,14,1.82,5.37,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1420,-inf,0.0,128,0.0,50,True,16,0.55,True,6,13,15,16,3,8,21,2,14,1.66,5.19,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1421,-inf,0.0,303,0.0,50,True,20,0.62,True,6,12,14,16,3,8,21,1,14,1.96,4.35,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1422,-inf,0.0,118,0.0,100,True,24,0.65,False,6,12,15,15,3,8,21,1,14,2.03,4.02,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1423,-inf,0.0,241,0.0,100,True,16,0.57,True,6,13,16,15,2,8,21,1,14,1.77,5.29,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1424,-inf,0.0,169,0.0,50,True,20,0.64,False,6,12,15,16,2,8,21,1,14,1.98,5.27,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1425,-inf,0.0,230,0.0,100,True,24,0.58,True,6,13,16,16,2,8,21,1,14,1.87,4.12,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1426,-inf,0.0,141,0.0,50,True,16,0.61,True,6,13,14,15,3,8,21,2,14,2.06,5.15,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1427,-inf,0.0,122,0.0,50,True,16,0.6,True,6,13,16,16,2,8,21,2,14,1.62,4.37,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1428,-inf,0.0,117,0.0,100,True,16,0.7,False,6,12,15,15,2,8,21,1,14,1.78,3.93,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1429,-inf,0.0,265,0.0,50,True,20,0.63,True,6,12,16,16,2,8,21,1,14,1.73,4.94,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1430,-inf,0.0,309,0.0,50,True,16,0.51,False,6,13,16,15,3,8,21,1,14,2.07,4.9,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1431,-inf,0.0,192,0.0,100,True,20,0.6,False,6,12,16,15,3,8,21,1,14,1.99,5.25,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1432,-inf,0.0,0,0.0,100,True,16,0.66,False,6,13,14,16,3,8,21,2,14,1.64,4.53,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1433,-inf,0.0,325,0.0,50,True,24,0.61,True,6,13,15,15,2,8,21,1,14,1.65,4.04,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1434,-inf,0.0,0,0.0,50,True,20,0.62,False,6,13,15,16,2,8,21,2,14,2.19,4.29,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1435,-inf,0.0,146,0.0,100,True,20,0.69,False,6,13,16,15,3,8,21,1,14,1.95,5.46,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1436,-inf,0.0,332,0.0,50,True,16,0.62,True,6,12,16,16,3,8,21,1,14,2.02,4.26,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1437,-inf,0.0,107,0.0,100,True,16,0.51,True,6,13,16,15,2,8,21,2,14,1.92,5.04,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1438,-inf,0.0,295,0.0,100,True,20,0.55,True,6,12,16,16,3,8,21,1,14,1.96,4.26,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1439,-inf,0.0,159,0.0,50,True,24,0.63,False,6,12,15,16,2,8,21,1,14,1.78,4.25,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1440,-inf,0.0,125,0.0,100,True,24,0.67,False,6,13,15,16,2,8,21,1,14,2.07,4.02,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1441,-inf,0.0,115,0.0,100,True,20,0.67,False,6,13,15,15,3,8,21,1,14,2.06,5.43,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1442,-inf,0.0,0,0.0,50,True,20,0.53,False,6,13,15,16,2,8,21,2,14,1.71,4.34,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1443,-inf,0.0,0,0.0,50,True,16,0.58,False,6,13,14,15,2,8,21,2,14,2.16,4.35,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1444,-inf,0.0,278,0.0,50,True,16,0.56,False,6,13,15,16,3,8,21,1,14,1.68,4.13,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1445,-inf,0.0,0,0.0,50,True,16,0.52,False,6,12,14,16,3,8,21,2,14,2.08,4.78,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1446,-inf,0.0,253,0.0,50,True,16,0.59,False,6,13,16,16,2,8,21,1,14,2.12,3.85,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1447,-inf,0.0,123,0.0,100,True,16,0.69,False,6,13,14,16,3,8,21,1,14,1.98,4.35,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1448,-inf,0.0,309,0.0,50,True,16,0.51,False,6,12,16,16,3,8,21,1,14,1.86,4.89,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1449,-inf,0.0,262,0.0,50,True,20,0.61,True,6,13,15,15,3,8,21,1,14,1.67,4.61,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1450,-inf,0.0,216,0.0,100,True,20,0.57,False,6,12,14,16,3,8,21,1,14,1.99,4.07,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1451,-inf,0.0,136,0.0,50,True,16,0.67,True,6,12,14,15,2,8,21,2,14,2.19,4.07,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1452,-inf,0.0,161,0.0,100,True,24,0.69,True,6,13,15,16,2,8,21,1,14,2.0,4.79,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1453,-inf,0.0,351,0.0,50,True,20,0.53,True,6,13,16,15,2,8,21,1,14,1.81,3.53,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1454,-inf,0.0,225,0.0,50,True,24,0.66,True,6,12,15,16,2,8,21,1,14,1.83,5.49,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1455,-inf,0.0,237,0.0,50,True,20,0.62,True,6,13,14,16,2,8,21,1,14,2.11,5.23,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1456,-inf,0.0,262,0.0,50,True,24,0.51,False,6,13,15,16,2,8,21,1,14,1.81,3.84,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1457,-inf,0.0,226,0.0,100,True,20,0.55,True,6,12,16,16,2,8,21,1,14,1.96,3.93,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1458,-inf,0.0,0,0.0,50,True,16,0.63,False,6,12,16,15,2,8,21,2,14,1.87,4.5,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1459,-inf,0.0,189,0.0,100,True,24,0.61,False,6,12,16,15,3,8,21,1,14,1.89,4.91,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1460,-inf,0.0,0,0.0,100,True,20,0.64,False,6,13,14,15,2,8,21,2,14,2.19,4.58,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1461,-inf,0.0,107,0.0,100,True,16,0.55,True,6,12,16,16,2,8,21,2,14,1.74,4.64,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1462,-inf,0.0,162,0.0,50,True,24,0.63,False,6,12,15,15,2,8,21,1,14,1.91,4.53,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1463,-inf,0.0,314,0.0,50,True,16,0.53,True,6,12,14,15,2,8,21,1,14,2.13,3.53,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1464,-inf,0.0,280,0.0,100,True,20,0.59,True,6,12,14,16,3,8,21,1,14,1.61,3.67,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1465,-inf,0.0,123,0.0,100,True,20,0.66,False,6,12,16,15,3,8,21,1,14,1.99,4.78,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1466,-inf,0.0,114,0.0,50,True,20,0.56,True,6,12,15,16,3,8,21,2,14,1.79,4.85,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1467,-inf,0.0,261,0.0,50,True,16,0.65,True,6,13,15,15,2,8,21,1,14,2.09,4.06,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1468,-inf,0.0,135,0.0,100,True,20,0.67,False,6,12,16,15,3,8,21,1,14,2.18,4.84,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1469,-inf,0.0,0,0.0,50,True,16,0.5,False,6,13,15,15,2,8,21,2,14,2.1,5.49,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1470,-inf,0.0,311,0.0,50,True,20,0.61,True,6,13,16,16,3,8,21,1,14,1.91,3.53,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1471,-inf,0.0,201,0.0,100,True,20,0.61,False,6,12,15,16,2,8,21,1,14,1.96,5.07,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1472,-inf,0.0,236,0.0,100,True,24,0.61,True,6,13,16,16,2,8,21,1,14,1.62,5.11,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1473,-inf,0.0,136,0.0,100,True,20,0.67,False,6,13,14,15,2,8,21,1,14,2.17,3.77,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1474,-inf,0.0,81,0.0,100,True,24,0.6,True,6,13,14,16,2,8,21,2,14,2.11,5.02,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1475,-inf,0.0,160,0.0,50,True,16,0.66,False,6,13,16,16,2,8,21,1,14,1.89,4.08,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1476,-inf,0.0,327,0.0,50,True,20,0.56,True,6,12,14,15,3,8,21,1,14,1.97,4.68,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1477,-inf,0.0,219,0.0,100,True,16,0.53,False,6,13,16,15,3,8,21,1,14,2.09,5.26,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1478,-inf,0.0,181,0.0,100,True,20,0.68,True,6,13,16,16,3,8,21,1,14,2.1,3.59,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1479,-inf,0.0,123,0.0,50,True,16,0.67,True,6,12,15,16,2,8,21,2,14,1.94,5.38,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1480,-inf,0.0,182,0.0,100,True,16,0.69,False,6,13,15,15,3,8,21,1,14,1.73,3.77,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1481,-inf,0.0,0,0.0,50,True,24,0.62,False,6,12,14,15,3,8,21,2,14,1.99,5.32,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1482,-inf,0.0,314,0.0,50,True,24,0.55,False,6,12,14,15,3,8,21,1,14,1.83,5.37,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1483,-inf,0.0,235,0.0,100,True,16,0.51,False,6,12,14,15,3,8,21,1,14,1.97,5.19,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1484,-inf,0.0,345,0.0,50,True,20,0.54,True,6,12,16,16,2,8,21,1,14,1.63,4.64,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1485,-inf,0.0,313,0.0,50,True,20,0.51,False,6,13,16,15,2,8,21,1,14,1.75,4.9,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1486,-inf,0.0,153,0.0,100,True,24,0.64,False,6,12,16,15,3,8,21,1,14,1.96,4.65,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1487,-inf,0.0,312,0.0,50,True,24,0.55,False,6,12,15,15,2,8,21,1,14,1.72,4.12,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1488,-inf,0.0,285,0.0,50,True,24,0.65,True,6,13,15,15,2,8,21,1,14,2.06,4.83,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1489,-inf,0.0,255,0.0,50,True,16,0.59,False,6,12,16,16,3,8,21,1,14,1.91,5.26,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1490,-inf,0.0,0,0.0,50,True,20,0.61,False,6,13,16,16,2,8,21,2,14,1.86,3.89,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1491,-inf,0.0,197,0.0,100,True,20,0.69,True,6,13,14,16,2,8,21,1,14,2.15,5.1,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1492,-inf,0.0,169,0.0,100,True,16,0.61,False,6,13,14,16,3,8,21,1,14,2.02,4.29,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1493,-inf,0.0,0,0.0,100,True,20,0.52,False,6,12,14,15,2,8,21,2,14,1.62,5.37,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1494,-inf,0.0,173,0.0,50,True,20,0.63,False,6,12,16,15,2,8,21,1,14,2.17,5.49,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1495,-inf,0.0,111,0.0,100,True,16,0.62,True,6,12,15,16,3,8,21,2,14,1.83,4.87,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1496,-inf,0.0,0,0.0,50,True,20,0.64,False,6,12,15,16,2,8,21,2,14,1.71,3.5,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1497,-inf,0.0,323,0.0,50,True,16,0.59,False,6,13,14,15,2,8,21,1,14,2.06,4.9,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1498,-inf,0.0,109,0.0,100,True,16,0.57,True,6,13,16,16,3,8,21,2,14,2.13,4.18,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1499,-inf,0.0,231,0.0,50,True,20,0.52,False,6,12,14,16,2,8,21,1,14,2.02,4.68,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1500,-inf,0.0,128,0.0,50,True,16,0.63,True,6,12,14,16,3,8,21,2,14,1.97,5.44,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1501,-inf,0.0,190,0.0,50,True,24,0.68,True,6,12,15,16,2,8,21,1,14,2.13,4.36,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1502,-inf,0.0,0,0.0,100,True,16,0.51,False,6,12,14,16,2,8,21,2,14,1.82,5.02,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1503,-inf,0.0,348,0.0,100,True,16,0.51,False,6,12,14,15,3,8,21,1,14,1.94,4.66,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1504,-inf,0.0,229,0.0,100,True,24,0.59,True,6,12,16,16,3,8,21,1,14,1.76,5.06,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1505,-inf,0.0,87,0.0,100,True,24,0.64,True,6,12,16,16,3,8,21,2,14,2.02,5.47,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1506,-inf,0.0,248,0.0,50,True,20,0.6,False,6,12,15,16,2,8,21,1,14,1.7,4.2,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1507,-inf,0.0,116,0.0,100,True,16,0.7,False,6,13,14,16,2,8,21,1,14,1.66,4.57,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1508,-inf,0.0,256,0.0,50,True,24,0.54,True,6,12,14,16,3,8,21,1,14,1.64,4.97,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1509,-inf,0.0,0,0.0,50,True,24,0.68,False,6,12,15,15,2,8,21,2,14,2.06,4.58,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1510,-inf,0.0,318,0.0,100,True,16,0.5,True,6,12,15,16,3,8,21,1,14,2.08,4.73,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1511,-inf,0.0,213,0.0,100,True,20,0.57,False,6,13,16,15,2,8,21,1,14,1.96,4.69,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1512,-inf,0.0,108,0.0,50,True,20,0.51,True,6,13,16,15,2,8,21,2,14,1.68,4.24,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1513,-inf,0.0,262,0.0,50,True,20,0.59,False,6,12,16,15,2,8,21,1,14,1.67,5.1,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1514,-inf,0.0,291,0.0,50,True,16,0.54,True,6,12,16,15,2,8,21,1,14,2.14,4.55,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1515,-inf,0.0,0,0.0,100,True,24,0.5,False,6,12,15,15,2,8,21,2,14,1.86,4.57,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1516,-inf,0.0,0,0.0,50,True,24,0.62,False,6,13,16,16,2,8,21,2,14,2.01,4.26,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1517,-inf,0.0,0,0.0,50,True,20,0.68,False,6,12,14,16,2,8,21,2,14,2.15,4.46,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1518,-inf,0.0,145,0.0,100,True,20,0.69,False,6,12,16,15,2,8,21,1,14,2.03,4.45,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1519,-inf,0.0,0,0.0,50,True,24,0.54,False,6,12,16,15,2,8,21,2,14,2.17,3.62,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1520,-inf,0.0,170,0.0,100,True,20,0.7,True,6,12,16,15,2,8,21,1,14,2.18,5.41,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1521,-inf,0.0,390,0.0,50,True,24,0.5,True,6,12,14,15,2,8,21,1,14,1.77,4.93,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1522,-inf,0.0,185,0.0,50,True,16,0.64,False,6,13,14,15,2,8,21,1,14,2.03,3.58,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1523,-inf,0.0,254,0.0,50,True,20,0.57,True,6,13,15,16,2,8,21,1,14,2.01,5.15,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1524,-inf,0.0,257,0.0,50,True,20,0.59,False,6,13,16,15,2,8,21,1,14,2.06,4.87,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1525,-inf,0.0,284,0.0,50,True,20,0.64,True,6,13,15,16,2,8,21,1,14,1.95,5.41,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1526,-inf,0.0,292,0.0,50,True,20,0.55,False,6,12,16,16,3,8,21,1,14,1.69,3.66,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1527,-inf,0.0,290,0.0,100,True,20,0.5,True,6,13,15,16,3,8,21,1,14,1.88,5.01,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1528,-inf,0.0,277,0.0,50,True,24,0.58,True,6,12,16,16,3,8,21,1,14,1.64,4.66,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1529,-inf,0.0,0,0.0,50,True,20,0.69,False,6,12,16,16,2,8,21,2,14,1.73,4.33,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1530,-inf,0.0,349,0.0,100,True,16,0.59,True,6,12,15,15,3,8,21,1,14,1.65,5.44,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1531,-inf,0.0,0,0.0,100,True,24,0.53,False,6,13,15,15,2,8,21,2,14,1.91,4.53,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1532,-inf,0.0,96,0.0,100,True,24,0.69,True,6,13,14,15,3,8,21,2,14,1.65,4.7,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1533,-inf,0.0,211,0.0,100,True,16,0.54,False,6,12,14,16,3,8,21,1,14,2.13,4.83,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1534,-inf,0.0,290,0.0,50,True,16,0.55,True,6,12,16,15,2,8,21,1,14,2.02,4.23,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1535,-inf,0.0,209,0.0,100,True,20,0.51,False,6,13,15,16,3,8,21,1,14,1.8,4.41,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1536,-inf,0.0,141,0.0,100,True,24,0.65,False,6,12,15,15,3,8,21,1,14,1.94,5.48,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1537,-inf,0.0,215,0.0,100,True,24,0.62,False,6,12,15,15,3,8,21,1,14,1.65,4.19,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1538,-inf,0.0,0,0.0,50,True,24,0.57,False,6,12,15,15,3,8,21,2,14,1.69,5.07,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1539,-inf,0.0,226,0.0,100,True,20,0.56,False,6,12,14,15,2,8,21,1,14,2.12,4.05,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1540,-inf,0.0,338,0.0,50,True,20,0.54,True,6,13,14,16,2,8,21,1,14,2.08,3.81,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1541,-inf,0.0,94,0.0,100,True,20,0.68,True,6,12,15,16,2,8,21,2,14,2.06,3.95,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1542,-inf,0.0,216,0.0,50,True,24,0.63,True,6,13,16,16,2,8,21,1,14,2.16,3.66,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1543,-inf,0.0,0,0.0,100,True,16,0.68,False,6,13,14,15,3,8,21,2,14,1.77,5.29,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1544,-inf,0.0,0,0.0,100,True,20,0.55,False,6,12,14,16,2,8,21,2,14,2.18,5.24,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1545,-inf,0.0,202,0.0,100,True,20,0.68,True,6,12,15,16,3,8,21,1,14,1.95,4.3,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1546,-inf,0.0,401,0.0,50,True,16,0.59,True,6,13,14,15,3,8,21,1,14,2.09,5.36,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1547,-inf,0.0,109,0.0,100,True,20,0.63,True,6,12,14,15,3,8,21,2,14,1.71,3.76,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1548,-inf,0.0,287,0.0,100,True,20,0.63,True,6,12,15,15,3,8,21,1,14,2.18,4.88,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1549,-inf,0.0,178,0.0,100,True,24,0.66,True,6,13,14,15,2,8,21,1,14,1.72,4.74,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1550,-inf,0.0,231,0.0,50,True,24,0.66,True,6,12,16,15,3,8,21,1,14,1.81,4.94,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1551,-inf,0.0,313,0.0,50,True,16,0.53,True,6,13,14,15,2,8,21,1,14,1.77,5.21,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1552,-inf,0.0,291,0.0,50,True,20,0.55,True,6,13,15,15,3,8,21,1,14,1.88,3.68,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1553,-inf,0.0,268,0.0,100,True,16,0.6,False,6,13,14,15,2,8,21,1,14,1.62,3.53,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1554,-inf,0.0,109,0.0,100,True,16,0.57,True,6,12,16,15,3,8,21,2,14,2.08,4.76,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1555,-inf,0.0,244,0.0,100,True,20,0.6,False,6,13,15,15,2,8,21,1,14,2.19,5.43,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1556,-inf,0.0,235,0.0,50,True,16,0.68,True,6,12,16,16,3,8,21,1,14,1.81,5.48,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1557,-inf,0.0,231,0.0,50,True,24,0.66,True,6,12,16,16,3,8,21,1,14,1.83,5.14,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1558,-inf,0.0,206,0.0,50,True,20,0.63,False,6,12,16,16,2,8,21,1,14,2.11,3.73,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1559,-inf,0.0,0,0.0,100,True,24,0.66,False,6,12,14,15,3,8,21,2,14,1.79,5.21,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1560,-inf,0.0,123,0.0,100,True,16,0.5,True,6,12,15,15,3,8,21,2,14,1.63,5.07,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1561,-inf,0.0,0,0.0,50,True,24,0.67,False,6,13,15,15,3,8,21,2,14,1.77,4.45,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1562,-inf,0.0,96,0.0,100,True,24,0.51,True,6,12,15,15,3,8,21,2,14,1.76,3.65,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1563,-inf,0.0,295,0.0,100,True,20,0.55,True,6,13,16,15,3,8,21,1,14,1.93,4.22,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1564,-inf,0.0,106,0.0,100,True,16,0.66,True,6,13,14,16,2,8,21,2,14,1.61,4.75,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1565,-inf,0.0,136,0.0,50,True,16,0.65,True,6,12,15,15,2,8,21,2,14,1.75,4.93,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1566,-inf,0.0,188,0.0,100,True,24,0.61,False,6,13,14,16,2,8,21,1,14,1.7,4.48,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1567,-inf,0.0,179,0.0,50,True,24,0.7,True,6,12,15,16,2,8,21,1,14,2.18,4.89,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1568,-inf,0.0,174,0.0,100,True,24,0.61,False,6,12,16,15,3,8,21,1,14,1.67,3.68,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1569,-inf,0.0,347,0.0,100,True,16,0.51,False,6,12,14,15,2,8,21,1,14,1.7,4.67,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1570,-inf,0.0,146,0.0,100,True,20,0.66,False,6,13,16,16,3,8,21,1,14,1.6,3.6,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1571,-inf,0.0,0,0.0,100,True,20,0.56,False,6,13,15,16,3,8,21,2,14,1.87,4.12,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1572,-inf,0.0,175,0.0,50,True,20,0.68,False,6,12,15,16,2,8,21,1,14,1.84,4.21,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1573,-inf,0.0,222,0.0,100,True,16,0.51,False,6,13,16,16,2,8,21,1,14,1.86,3.72,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1574,-inf,0.0,0,0.0,100,True,16,0.61,False,6,12,15,15,2,8,21,2,14,1.82,4.43,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1575,-inf,0.0,260,0.0,100,True,20,0.52,True,6,13,15,15,3,8,21,1,14,1.74,3.66,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1576,-inf,0.0,0,0.0,100,True,24,0.62,False,6,13,15,16,3,8,21,2,14,1.86,4.1,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1577,-inf,0.0,0,0.0,100,True,24,0.54,False,6,12,15,15,3,8,21,2,14,2.16,4.68,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1578,-inf,0.0,150,0.0,100,True,20,0.62,False,6,12,16,16,3,8,21,1,14,1.61,5.02,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1579,-inf,0.0,0,0.0,50,True,16,0.54,False,6,13,14,16,2,8,21,2,14,2.0,4.57,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1580,-inf,0.0,318,0.0,100,True,16,0.55,True,6,12,16,16,2,8,21,1,14,2.01,3.73,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1581,-inf,0.0,245,0.0,100,True,20,0.56,False,6,12,15,16,3,8,21,1,14,1.88,4.67,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1582,-inf,0.0,340,0.0,50,True,16,0.51,False,6,13,15,16,2,8,21,1,14,2.03,3.95,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1583,-inf,0.0,209,0.0,50,True,24,0.67,True,6,12,14,15,3,8,21,1,14,2.12,5.23,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1584,-inf,0.0,0,0.0,100,True,16,0.57,False,6,13,14,16,2,8,21,2,14,1.97,5.39,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1585,-inf,0.0,204,0.0,100,True,24,0.56,False,6,13,15,16,2,8,21,1,14,1.64,5.37,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1586,-inf,0.0,348,0.0,50,True,16,0.56,True,6,12,15,15,2,8,21,1,14,2.11,3.89,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1587,-inf,0.0,123,0.0,50,True,20,0.58,True,6,12,15,15,3,8,21,2,14,1.95,4.51,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1588,-inf,0.0,165,0.0,100,True,24,0.67,True,6,13,16,15,3,8,21,1,14,2.05,5.42,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1589,-inf,0.0,196,0.0,50,True,24,0.63,False,6,13,15,15,3,8,21,1,14,1.71,3.58,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1590,-inf,0.0,248,0.0,50,True,16,0.55,False,6,12,14,15,3,8,21,1,14,1.83,3.86,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1591,-inf,0.0,435,0.0,50,True,16,0.54,True,6,12,14,15,2,8,21,1,14,1.8,4.65,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1592,-inf,0.0,347,0.0,50,True,16,0.55,True,6,12,15,16,3,8,21,1,14,1.64,4.88,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1593,-inf,0.0,108,0.0,100,True,20,0.69,True,6,13,15,15,3,8,21,2,14,1.97,5.0,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1594,-inf,0.0,282,0.0,50,True,16,0.56,False,6,12,14,15,2,8,21,1,14,2.04,4.61,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1595,-inf,0.0,269,0.0,50,True,16,0.51,False,6,12,14,15,3,8,21,1,14,1.64,5.44,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1596,-inf,0.0,322,0.0,50,True,16,0.59,True,6,12,16,15,3,8,21,1,14,2.13,3.62,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1597,-inf,0.0,136,0.0,100,True,24,0.68,False,6,12,15,16,3,8,21,1,14,1.85,4.74,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1598,-inf,0.0,297,0.0,100,True,16,0.58,True,6,13,14,16,2,8,21,1,14,1.9,5.36,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1599,-inf,0.0,0,0.0,100,True,24,0.51,False,6,13,15,16,3,8,21,2,14,2.03,3.79,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1600,-inf,0.0,256,0.0,50,True,24,0.54,True,6,12,14,15,2,8,21,1,14,2.19,3.74,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1601,-inf,0.0,237,0.0,50,True,16,0.64,False,6,12,16,15,3,8,21,1,14,2.12,4.47,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1602,-inf,0.0,95,0.0,50,True,24,0.53,True,6,13,16,16,2,8,21,2,14,1.79,5.27,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1603,-inf,0.0,287,0.0,50,True,16,0.54,False,6,13,16,16,2,8,21,1,14,1.93,3.86,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1604,-inf,0.0,0,0.0,100,True,16,0.53,False,6,12,15,16,3,8,21,2,14,2.13,4.27,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1605,-inf,0.0,227,0.0,50,True,24,0.61,True,6,12,15,16,3,8,21,1,14,2.13,5.17,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1606,-inf,0.0,162,0.0,100,True,24,0.62,False,6,12,15,16,2,8,21,1,14,1.61,4.25,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1607,-inf,0.0,191,0.0,100,True,16,0.62,False,6,12,16,16,3,8,21,1,14,1.97,5.31,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1608,-inf,0.0,185,0.0,50,True,16,0.69,False,6,13,14,16,2,8,21,1,14,2.15,4.45,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1609,-inf,0.0,217,0.0,100,True,24,0.53,False,6,12,15,16,2,8,21,1,14,2.09,3.77,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1610,-inf,0.0,263,0.0,50,True,16,0.62,True,6,12,15,16,2,8,21,1,14,1.69,4.14,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1611,-inf,0.0,0,0.0,100,True,16,0.59,False,6,12,16,16,2,8,21,2,14,2.03,4.83,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1612,-inf,0.0,202,0.0,100,True,20,0.52,False,6,12,16,16,2,8,21,1,14,1.72,3.71,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1613,-inf,0.0,354,0.0,50,True,16,0.55,True,6,12,14,15,2,8,21,1,14,1.66,5.16,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1614,-inf,0.0,86,0.0,100,True,24,0.63,True,6,13,16,15,3,8,21,2,14,1.85,4.5,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1615,-inf,0.0,344,0.0,50,True,16,0.65,True,6,13,15,15,3,8,21,1,14,2.19,5.0,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1616,-inf,0.0,217,0.0,50,True,20,0.54,False,6,13,16,16,2,8,21,1,14,1.91,5.05,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1617,-inf,0.0,0,0.0,100,True,20,0.69,False,6,13,16,15,3,8,21,2,14,1.68,4.09,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1618,-inf,0.0,260,0.0,50,True,24,0.69,True,6,12,14,15,2,8,21,1,14,1.78,3.63,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1619,-inf,0.0,245,0.0,100,True,24,0.54,True,6,13,16,16,2,8,21,1,14,1.88,4.73,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1620,-inf,0.0,82,0.0,100,True,24,0.64,True,6,12,16,15,2,8,21,2,14,1.93,3.61,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1621,-inf,0.0,226,0.0,100,True,16,0.65,True,6,12,14,15,3,8,21,1,14,2.05,4.58,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1622,-inf,0.0,200,0.0,100,True,16,0.67,True,6,13,16,15,3,8,21,1,14,1.76,5.27,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1623,-inf,0.0,300,0.0,50,True,20,0.61,True,6,13,16,15,2,8,21,1,14,1.87,4.57,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1624,-inf,0.0,96,0.0,100,True,20,0.69,True,6,12,16,15,3,8,21,2,14,2.07,5.42,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1625,-inf,0.0,226,0.0,100,True,24,0.52,False,6,12,16,16,2,8,21,1,14,1.87,4.0,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1626,-inf,0.0,228,0.0,50,True,16,0.69,True,6,12,16,15,2,8,21,1,14,2.03,3.8,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1627,-inf,0.0,0,0.0,50,True,20,0.68,False,6,12,16,16,3,8,21,2,14,2.16,4.97,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1628,-inf,0.0,257,0.0,100,True,20,0.6,True,6,12,15,16,2,8,21,1,14,1.98,5.37,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1629,-inf,0.0,233,0.0,100,True,16,0.65,True,6,13,16,16,3,8,21,1,14,1.88,4.51,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1630,-inf,0.0,84,0.0,100,True,24,0.67,True,6,13,15,16,2,8,21,2,14,2.01,5.48,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1631,-inf,0.0,174,0.0,100,True,20,0.57,False,6,13,14,16,2,8,21,1,14,1.79,3.91,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1632,-inf,0.0,0,0.0,50,True,20,0.57,False,6,13,16,15,3,8,21,2,14,1.78,3.77,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1633,-inf,0.0,198,0.0,100,True,20,0.63,True,6,13,15,16,2,8,21,1,14,1.94,4.29,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1634,-inf,0.0,0,0.0,50,True,24,0.66,False,6,13,16,16,3,8,21,2,14,1.81,4.74,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1635,-inf,0.0,286,0.0,100,True,20,0.52,True,6,13,14,16,3,8,21,1,14,1.77,4.42,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1636,-inf,0.0,242,0.0,50,True,20,0.65,True,6,13,15,15,3,8,21,1,14,1.79,5.08,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1637,-inf,0.0,300,0.0,100,True,16,0.57,True,6,12,14,15,3,8,21,1,14,2.18,3.58,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1638,-inf,0.0,128,0.0,50,True,16,0.67,True,6,13,16,16,3,8,21,2,14,1.66,3.94,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1639,-inf,0.0,139,0.0,50,True,24,0.66,False,6,13,15,15,3,8,21,1,14,2.1,4.99,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1640,-inf,0.0,198,0.0,100,True,20,0.7,True,6,12,14,16,3,8,21,1,14,1.63,3.93,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1641,-inf,0.0,211,0.0,100,True,24,0.58,False,6,12,14,16,3,8,21,1,14,1.66,4.02,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1642,-inf,0.0,0,0.0,100,True,24,0.63,False,6,13,15,15,3,8,21,2,14,2.15,4.81,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1643,-inf,0.0,253,0.0,50,True,20,0.68,True,6,12,14,15,3,8,21,1,14,2.13,3.75,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1644,-inf,0.0,113,0.0,100,True,20,0.69,False,6,12,16,15,3,8,21,1,14,1.76,4.19,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1645,-inf,0.0,287,0.0,100,True,20,0.53,True,6,13,14,15,2,8,21,1,14,2.15,4.72,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1646,-inf,0.0,220,0.0,50,True,20,0.69,True,6,12,14,15,2,8,21,1,14,1.74,5.36,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1647,-inf,0.0,145,0.0,100,True,20,0.66,False,6,13,15,16,3,8,21,1,14,1.92,4.87,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1648,-inf,0.0,286,0.0,50,True,24,0.59,True,6,12,14,15,3,8,21,1,14,1.89,3.66,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1649,-inf,0.0,84,0.0,100,True,24,0.57,True,6,12,16,15,2,8,21,2,14,1.75,3.76,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1650,-inf,0.0,207,0.0,50,True,24,0.66,True,6,12,16,16,3,8,21,1,14,1.86,4.04,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1651,-inf,0.0,230,0.0,50,True,24,0.57,False,6,13,16,16,2,8,21,1,14,1.95,4.11,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1652,-inf,0.0,220,0.0,50,True,24,0.67,True,6,13,14,16,3,8,21,1,14,1.97,4.4,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1653,-inf,0.0,234,0.0,50,True,24,0.67,True,6,13,15,15,3,8,21,1,14,1.87,4.04,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1654,-inf,0.0,155,0.0,50,True,20,0.65,False,6,13,16,16,2,8,21,1,14,1.67,4.66,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1655,-inf,0.0,122,0.0,100,True,16,0.55,True,6,12,15,15,3,8,21,2,14,1.92,3.94,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1656,-inf,0.0,301,0.0,50,True,20,0.52,True,6,12,14,15,3,8,21,1,14,1.91,4.51,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1657,-inf,0.0,0,0.0,50,True,20,0.66,False,6,13,14,15,3,8,21,2,14,1.86,4.13,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1658,-inf,0.0,0,0.0,50,True,16,0.59,False,6,13,15,15,3,8,21,2,14,1.74,5.12,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1659,-inf,0.0,222,0.0,50,True,24,0.61,True,6,13,15,16,2,8,21,1,14,1.77,4.26,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1660,-inf,0.0,191,0.0,100,True,20,0.65,True,6,13,16,15,3,8,21,1,14,1.73,4.29,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1661,-inf,0.0,0,0.0,100,True,20,0.63,False,6,13,15,15,2,8,21,2,14,1.62,3.6,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1662,-inf,0.0,226,0.0,100,True,20,0.55,True,6,12,16,16,2,8,21,1,14,2.02,4.58,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1663,-inf,0.0,0,0.0,100,True,20,0.53,False,6,13,15,16,3,8,21,2,14,1.82,3.84,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1664,-inf,0.0,152,0.0,100,True,24,0.64,False,6,12,16,15,2,8,21,1,14,1.69,4.38,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1665,-inf,0.0,331,0.0,50,True,16,0.56,True,6,13,14,16,2,8,21,1,14,2.05,4.56,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1666,-inf,0.0,124,0.0,50,True,20,0.66,True,6,13,15,15,3,8,21,2,14,1.66,3.86,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1667,-inf,0.0,0,0.0,50,True,16,0.61,False,6,13,16,15,2,8,21,2,14,1.75,5.47,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1668,-inf,0.0,202,0.0,50,True,20,0.69,False,6,12,14,15,2,8,21,1,14,1.88,3.59,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1669,-inf,0.0,93,0.0,100,True,20,0.62,True,6,13,14,16,2,8,21,2,14,1.88,5.0,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1670,-inf,0.0,274,0.0,50,True,16,0.63,True,6,12,14,15,2,8,21,1,14,1.75,5.22,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1671,-inf,0.0,206,0.0,100,True,20,0.53,False,6,13,14,15,3,8,21,1,14,1.94,4.88,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1672,-inf,0.0,307,0.0,50,True,24,0.64,True,6,13,15,15,2,8,21,1,14,1.73,4.42,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1673,-inf,0.0,111,0.0,100,True,24,0.66,False,6,12,15,16,2,8,21,1,14,1.65,4.88,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1674,-inf,0.0,0,0.0,100,True,24,0.55,False,6,12,16,15,2,8,21,2,14,1.8,4.14,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1675,-inf,0.0,126,0.0,100,True,24,0.69,False,6,12,14,16,3,8,21,1,14,1.74,4.47,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1676,-inf,0.0,0,0.0,100,True,16,0.52,False,6,12,15,15,2,8,21,2,14,2.15,4.44,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1677,-inf,0.0,245,0.0,50,True,16,0.61,False,6,13,15,15,3,8,21,1,14,1.78,4.54,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1678,-inf,0.0,134,0.0,100,True,16,0.66,False,6,12,14,15,3,8,21,1,14,1.98,3.91,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1679,-inf,0.0,105,0.0,100,True,20,0.67,True,6,13,14,15,2,8,21,2,14,1.94,3.5,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1680,-inf,0.0,348,0.0,50,True,20,0.53,False,6,12,15,15,2,8,21,1,14,1.98,4.85,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1681,-inf,0.0,237,0.0,50,True,24,0.56,True,6,12,16,16,2,8,21,1,14,1.9,4.02,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1682,-inf,0.0,213,0.0,50,True,24,0.53,False,6,13,15,16,3,8,21,1,14,2.11,3.97,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1683,-inf,0.0,120,0.0,100,True,16,0.67,True,6,13,15,15,2,8,21,2,14,2.18,5.11,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1684,-inf,0.0,0,0.0,50,True,20,0.67,False,6,12,14,16,2,8,21,2,14,1.9,4.55,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1685,-inf,0.0,217,0.0,100,True,16,0.61,False,6,13,16,15,2,8,21,1,14,1.84,5.02,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1686,-inf,0.0,325,0.0,100,True,16,0.55,True,6,12,16,15,3,8,21,1,14,1.91,4.77,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1687,-inf,0.0,373,0.0,50,True,24,0.53,True,6,13,15,15,2,8,21,1,14,1.64,5.19,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1688,-inf,0.0,196,0.0,50,True,24,0.63,False,6,13,14,15,3,8,21,1,14,1.64,3.61,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1689,-inf,0.0,324,0.0,100,True,16,0.61,True,6,13,15,15,2,8,21,1,14,1.97,4.93,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1690,-inf,0.0,0,0.0,50,True,16,0.65,False,6,12,16,16,2,8,21,2,14,1.83,4.01,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1691,-inf,0.0,309,0.0,50,True,16,0.54,True,6,13,15,15,2,8,21,1,14,1.61,5.16,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1692,-inf,0.0,411,0.0,50,True,16,0.58,True,6,12,14,15,3,8,21,1,14,1.92,3.7,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1693,-inf,0.0,316,0.0,50,True,20,0.5,False,6,13,16,15,2,8,21,1,14,2.07,3.56,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1694,-inf,0.0,240,0.0,100,True,20,0.64,True,6,13,14,16,2,8,21,1,14,1.8,4.45,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1695,-inf,0.0,335,0.0,50,True,16,0.6,True,6,13,16,15,2,8,21,1,14,1.73,4.42,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1696,-inf,0.0,106,0.0,100,True,16,0.53,True,6,12,16,16,2,8,21,2,14,1.91,5.27,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1697,-inf,0.0,262,0.0,100,True,16,0.54,True,6,13,15,16,3,8,21,1,14,2.2,3.72,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1698,-inf,0.0,166,0.0,50,True,20,0.67,False,6,13,15,15,3,8,21,1,14,2.19,3.79,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1699,-inf,0.0,295,0.0,100,True,16,0.54,True,6,12,16,16,2,8,21,1,14,1.81,3.93,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1700,-inf,0.0,277,0.0,50,True,16,0.69,True,6,13,15,16,3,8,21,1,14,1.83,3.55,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1701,-inf,0.0,136,0.0,100,True,24,0.63,False,6,12,14,15,3,8,21,1,14,1.65,4.43,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1702,-inf,0.0,206,0.0,50,True,24,0.53,False,6,13,16,16,2,8,21,1,14,1.62,3.71,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1703,-inf,0.0,111,0.0,50,True,20,0.69,True,6,12,15,16,3,8,21,2,14,1.96,4.57,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1704,-inf,0.0,186,0.0,100,True,24,0.59,False,6,12,14,16,3,8,21,1,14,2.14,4.5,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1705,-inf,0.0,94,0.0,100,True,20,0.5,True,6,13,16,15,2,8,21,2,14,1.62,4.08,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1706,-inf,0.0,111,0.0,50,True,20,0.56,True,6,13,16,15,3,8,21,2,14,2.18,4.75,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1707,-inf,0.0,228,0.0,50,True,20,0.61,False,6,13,15,15,2,8,21,1,14,1.73,5.43,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1708,-inf,0.0,105,0.0,100,True,20,0.54,True,6,12,14,15,2,8,21,2,14,2.04,4.87,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1709,-inf,0.0,245,0.0,50,True,20,0.68,True,6,12,14,15,2,8,21,1,14,1.61,4.54,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1710,-inf,0.0,240,0.0,100,True,20,0.55,True,6,12,14,15,2,8,21,1,14,1.67,5.1,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1711,-inf,0.0,239,0.0,50,True,20,0.61,True,6,12,14,16,2,8,21,1,14,2.05,4.66,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1712,-inf,0.0,84,0.0,100,True,24,0.64,True,6,13,14,16,3,8,21,2,14,2.19,5.4,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1713,-inf,0.0,272,0.0,100,True,20,0.58,True,6,12,14,16,2,8,21,1,14,1.86,5.28,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1714,-inf,0.0,236,0.0,100,True,16,0.69,True,6,13,14,16,3,8,21,1,14,1.9,5.02,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1715,-inf,0.0,311,0.0,50,True,16,0.63,True,6,12,15,15,3,8,21,1,14,1.77,4.32,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1716,-inf,0.0,181,0.0,100,True,24,0.62,False,6,13,16,16,3,8,21,1,14,1.86,4.93,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1717,-inf,0.0,231,0.0,50,True,20,0.68,True,6,12,16,15,2,8,21,1,14,1.99,4.53,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1718,-inf,0.0,171,0.0,50,True,16,0.69,False,6,12,14,16,2,8,21,1,14,1.76,4.15,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1719,-inf,0.0,335,0.0,50,True,20,0.63,True,6,13,15,15,2,8,21,1,14,2.2,3.53,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1720,-inf,0.0,322,0.0,50,True,24,0.52,True,6,13,14,15,3,8,21,1,14,1.98,5.07,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1721,-inf,0.0,0,0.0,50,True,20,0.63,False,6,12,14,15,3,8,21,2,14,1.7,3.61,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1722,-inf,0.0,450,0.0,50,True,16,0.52,True,6,12,15,15,2,8,21,1,14,2.03,4.99,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1723,-inf,0.0,143,0.0,50,True,24,0.65,False,6,12,15,15,2,8,21,1,14,1.99,4.03,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1724,-inf,0.0,180,0.0,100,True,16,0.6,False,6,13,15,15,3,8,21,1,14,1.83,3.59,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1725,-inf,0.0,183,0.0,50,True,16,0.7,False,6,12,16,16,3,8,21,1,14,1.66,3.68,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1726,-inf,0.0,237,0.0,100,True,20,0.64,True,6,13,15,15,3,8,21,1,14,1.81,5.42,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1727,-inf,0.0,0,0.0,100,True,24,0.53,False,6,12,16,15,3,8,21,2,14,2.17,4.29,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1728,-inf,0.0,164,0.0,100,True,20,0.64,False,6,13,16,16,2,8,21,1,14,1.77,3.65,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1729,-inf,0.0,0,0.0,100,True,24,0.59,False,6,13,15,16,2,8,21,2,14,1.7,3.62,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1730,-inf,0.0,361,0.0,50,True,16,0.58,True,6,13,16,16,3,8,21,1,14,1.68,4.13,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1731,-inf,0.0,237,0.0,100,True,16,0.56,False,6,13,16,15,2,8,21,1,14,1.65,5.08,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1732,-inf,0.0,109,0.0,100,True,16,0.57,True,6,12,15,16,3,8,21,2,14,2.09,5.03,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1733,-inf,0.0,119,0.0,100,True,16,0.61,True,6,12,15,15,2,8,21,2,14,1.86,4.11,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1734,-inf,0.0,88,0.0,100,True,24,0.67,True,6,12,16,16,3,8,21,2,14,1.61,4.31,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1735,-inf,0.0,223,0.0,100,True,16,0.66,True,6,12,14,15,3,8,21,1,14,1.72,5.0,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1736,-inf,0.0,279,0.0,50,True,16,0.67,True,6,13,14,16,3,8,21,1,14,2.09,3.98,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1737,-inf,0.0,119,0.0,100,True,16,0.7,True,6,12,14,15,2,8,21,2,14,1.87,5.16,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1738,-inf,0.0,317,0.0,50,True,16,0.52,False,6,12,14,15,3,8,21,1,14,2.09,3.98,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1739,-inf,0.0,138,0.0,50,True,24,0.66,False,6,12,16,15,3,8,21,1,14,2.06,5.38,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1740,-inf,0.0,284,0.0,50,True,24,0.6,True,6,13,16,16,3,8,21,1,14,2.15,4.76,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1741,-inf,0.0,93,0.0,100,True,20,0.54,True,6,12,14,16,2,8,21,2,14,1.92,5.23,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1742,-inf,0.0,231,0.0,50,True,20,0.53,False,6,12,16,15,3,8,21,1,14,2.17,3.71,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1743,-inf,0.0,275,0.0,50,True,24,0.59,True,6,12,14,16,3,8,21,1,14,1.89,3.74,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1744,-inf,0.0,0,0.0,100,True,16,0.51,False,6,12,14,15,3,8,21,2,14,1.61,4.95,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1745,-inf,0.0,215,0.0,100,True,20,0.67,True,6,12,14,16,3,8,21,1,14,2.08,3.77,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1746,-inf,0.0,325,0.0,50,True,16,0.58,True,6,13,16,16,3,8,21,1,14,1.76,4.83,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1747,-inf,0.0,81,0.0,100,True,24,0.64,True,6,13,16,15,2,8,21,2,14,2.11,5.33,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1748,-inf,0.0,434,0.0,50,True,16,0.56,True,6,13,15,15,3,8,21,1,14,1.6,5.36,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1749,-inf,0.0,0,0.0,100,True,16,0.7,False,6,12,15,15,2,8,21,2,14,1.92,3.94,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1750,-inf,0.0,94,0.0,100,True,24,0.51,True,6,12,15,15,3,8,21,2,14,2.09,3.65,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1751,-inf,0.0,0,0.0,50,True,16,0.53,False,6,12,15,16,3,8,21,2,14,1.93,4.28,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1752,-inf,0.0,223,0.0,50,True,16,0.63,False,6,12,15,15,2,8,21,1,14,1.8,5.14,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1753,-inf,0.0,186,0.0,100,True,20,0.65,True,6,13,16,16,2,8,21,1,14,1.88,4.6,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1754,-inf,0.0,302,0.0,50,True,16,0.61,True,6,13,15,16,2,8,21,1,14,1.74,4.24,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1755,-inf,0.0,307,0.0,50,True,20,0.57,True,6,13,16,15,3,8,21,1,14,1.74,4.27,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1756,-inf,0.0,170,0.0,100,True,20,0.65,False,6,13,15,16,3,8,21,1,14,1.62,3.63,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1757,-inf,0.0,0,0.0,100,True,16,0.51,False,6,12,15,16,3,8,21,2,14,1.89,5.49,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1758,-inf,0.0,259,0.0,50,True,16,0.52,False,6,13,14,15,2,8,21,1,14,1.78,3.65,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1759,-inf,0.0,203,0.0,100,True,24,0.59,True,6,13,14,15,2,8,21,1,14,1.76,5.0,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1760,-inf,0.0,224,0.0,100,True,16,0.68,True,6,13,14,16,3,8,21,1,14,1.75,3.52,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1761,-inf,0.0,393,0.0,50,True,16,0.6,True,6,12,15,15,3,8,21,1,14,1.85,3.78,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1762,-inf,0.0,0,0.0,50,True,24,0.59,False,6,12,15,15,3,8,21,2,14,2.15,4.55,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1763,-inf,0.0,339,0.0,50,True,16,0.51,False,6,13,14,16,2,8,21,1,14,2.07,4.87,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1764,-inf,0.0,230,0.0,100,True,16,0.62,True,6,13,16,16,3,8,21,1,14,2.07,4.13,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1765,-inf,0.0,168,0.0,100,True,20,0.59,False,6,13,15,16,3,8,21,1,14,1.7,5.2,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1766,-inf,0.0,189,0.0,50,True,16,0.67,False,6,12,14,16,2,8,21,1,14,2.05,3.76,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1767,-inf,0.0,301,0.0,50,True,16,0.64,True,6,12,15,15,2,8,21,1,14,2.1,5.16,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1768,-inf,0.0,292,0.0,100,True,24,0.52,False,6,12,15,15,2,8,21,1,14,1.69,5.27,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1769,-inf,0.0,146,0.0,100,True,20,0.67,False,6,12,14,16,2,8,21,1,14,2.1,5.41,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1770,-inf,0.0,397,0.0,50,True,16,0.51,True,6,13,16,15,2,8,21,1,14,1.71,4.3,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1771,-inf,0.0,292,0.0,50,True,20,0.61,True,6,13,15,15,2,8,21,1,14,1.84,3.89,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1772,-inf,0.0,375,0.0,50,True,16,0.56,True,6,12,14,16,3,8,21,1,14,1.75,4.06,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1773,-inf,0.0,0,0.0,50,True,20,0.53,False,6,13,15,15,2,8,21,2,14,1.73,4.63,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1774,-inf,0.0,314,0.0,100,True,20,0.51,False,6,13,14,15,2,8,21,1,14,1.88,3.82,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1775,-inf,0.0,269,0.0,50,True,16,0.68,True,6,13,14,16,2,8,21,1,14,2.18,4.63,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1776,-inf,0.0,202,0.0,50,True,20,0.64,False,6,13,16,16,2,8,21,1,14,2.12,4.61,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1777,-inf,0.0,217,0.0,50,True,24,0.6,False,6,12,15,15,3,8,21,1,14,2.09,4.34,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1778,-inf,0.0,300,0.0,100,True,16,0.53,True,6,12,16,15,2,8,21,1,14,1.71,3.66,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1779,-inf,0.0,290,0.0,50,True,24,0.51,False,6,12,16,15,2,8,21,1,14,1.81,3.88,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1780,-inf,0.0,304,0.0,50,True,16,0.55,True,6,12,14,16,3,8,21,1,14,2.11,3.62,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1781,-inf,0.0,108,0.0,50,True,20,0.56,True,6,12,15,16,2,8,21,2,14,1.72,5.05,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1782,-inf,0.0,346,0.0,100,True,16,0.58,True,6,13,14,15,2,8,21,1,14,1.94,4.98,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1783,-inf,0.0,177,0.0,50,True,16,0.67,False,6,13,14,15,2,8,21,1,14,2.07,5.0,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1784,-inf,0.0,452,0.0,50,True,16,0.52,True,6,13,15,15,2,8,21,1,14,1.88,4.68,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1785,-inf,0.0,286,0.0,50,True,16,0.58,False,6,12,16,15,3,8,21,1,14,1.97,5.09,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1786,-inf,0.0,106,0.0,50,True,20,0.59,True,6,12,15,16,2,8,21,2,14,1.84,5.39,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1787,-inf,0.0,0,0.0,100,True,16,0.63,False,6,13,15,15,2,8,21,2,14,1.62,4.74,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1788,-inf,0.0,386,0.0,50,True,16,0.5,True,6,13,15,15,3,8,21,1,14,1.71,4.91,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1789,-inf,0.0,210,0.0,50,True,20,0.57,False,6,12,15,15,2,8,21,1,14,1.95,3.71,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1790,-inf,0.0,127,0.0,50,True,24,0.67,False,6,13,16,15,3,8,21,1,14,1.96,3.75,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1791,-inf,0.0,110,0.0,100,True,16,0.53,True,6,12,16,16,3,8,21,2,14,2.16,5.08,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1792,-inf,0.0,0,0.0,50,True,20,0.65,False,6,13,14,16,3,8,21,2,14,1.83,4.65,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1793,-inf,0.0,197,0.0,50,True,24,0.62,False,6,13,14,16,2,8,21,1,14,1.8,4.93,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1794,-inf,0.0,268,0.0,100,True,20,0.51,False,6,13,16,15,2,8,21,1,14,2.02,4.92,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1795,-inf,0.0,279,0.0,100,True,16,0.5,False,6,13,15,15,2,8,21,1,14,1.78,3.93,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1796,-inf,0.0,133,0.0,100,True,16,0.66,False,6,12,16,15,2,8,21,1,14,2.12,3.52,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1797,-inf,0.0,0,0.0,50,True,20,0.65,False,6,12,15,16,2,8,21,2,14,1.85,4.68,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1798,-inf,0.0,274,0.0,50,True,16,0.67,True,6,12,14,16,2,8,21,1,14,1.94,3.85,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1799,-inf,0.0,264,0.0,100,True,20,0.53,False,6,12,14,16,3,8,21,1,14,1.76,5.16,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1800,-inf,0.0,105,0.0,100,True,20,0.54,True,6,13,15,15,2,8,21,2,14,1.74,3.65,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1801,-inf,0.0,347,0.0,50,True,16,0.57,True,6,12,14,15,3,8,21,1,14,1.66,5.4,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1802,-inf,0.0,253,0.0,50,True,24,0.51,True,6,12,15,16,2,8,21,1,14,1.84,4.3,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1803,-inf,0.0,0,0.0,100,True,16,0.59,False,6,12,15,16,2,8,21,2,14,1.92,5.38,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1804,-inf,0.0,345,0.0,100,True,16,0.59,True,6,13,15,15,3,8,21,1,14,2.0,5.21,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1805,-inf,0.0,130,0.0,50,True,16,0.66,True,6,12,16,16,3,8,21,2,14,1.66,4.37,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1806,-inf,0.0,210,0.0,50,True,20,0.57,False,6,12,16,15,3,8,21,1,14,1.88,4.82,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1807,-inf,0.0,97,0.0,100,True,20,0.69,True,6,13,16,15,3,8,21,2,14,1.78,4.75,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1808,-inf,0.0,178,0.0,100,True,16,0.59,False,6,12,16,16,2,8,21,1,14,2.1,4.49,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1809,-inf,0.0,331,0.0,50,True,16,0.56,True,6,12,14,16,2,8,21,1,14,1.78,5.04,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1810,-inf,0.0,287,0.0,50,True,16,0.55,False,6,13,14,16,3,8,21,1,14,1.94,5.49,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1811,-inf,0.0,235,0.0,100,True,24,0.57,True,6,13,14,16,2,8,21,1,14,2.01,3.85,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1812,-inf,0.0,252,0.0,100,True,16,0.63,True,6,13,14,16,3,8,21,1,14,2.05,4.04,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1813,-inf,0.0,110,0.0,100,True,16,0.56,True,6,12,16,15,3,8,21,2,14,1.65,4.84,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1814,-inf,0.0,213,0.0,100,True,24,0.63,True,6,13,14,16,3,8,21,1,14,1.73,3.6,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1815,-inf,0.0,170,0.0,50,True,24,0.65,False,6,13,15,16,3,8,21,1,14,2.01,4.28,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1816,-inf,0.0,234,0.0,50,True,20,0.63,True,6,13,16,15,2,8,21,1,14,1.87,5.35,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1817,-inf,0.0,190,0.0,50,True,16,0.66,False,6,13,14,16,3,8,21,1,14,1.77,3.97,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1818,-inf,0.0,111,0.0,50,True,20,0.68,True,6,12,15,16,3,8,21,2,14,1.91,3.92,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1819,-inf,0.0,170,0.0,100,True,24,0.54,False,6,13,16,15,2,8,21,1,14,2.04,4.34,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1820,-inf,0.0,0,0.0,100,True,16,0.62,False,6,13,15,15,3,8,21,2,14,1.96,5.15,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1821,-inf,0.0,225,0.0,50,True,24,0.58,False,6,12,16,16,3,8,21,1,14,2.05,4.13,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1822,-inf,0.0,266,0.0,50,True,24,0.63,True,6,12,14,16,2,8,21,1,14,1.99,4.62,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1823,-inf,0.0,189,0.0,100,True,24,0.64,True,6,13,15,15,2,8,21,1,14,2.06,4.3,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1824,-inf,0.0,348,0.0,50,True,20,0.54,True,6,12,16,15,3,8,21,1,14,1.94,4.34,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1825,-inf,0.0,275,0.0,50,True,20,0.52,True,6,13,15,16,2,8,21,1,14,1.95,3.82,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1826,-inf,0.0,303,0.0,50,True,16,0.63,True,6,13,15,15,2,8,21,1,14,1.82,4.63,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1827,-inf,0.0,295,0.0,50,True,20,0.62,True,6,13,16,16,2,8,21,1,14,1.82,5.49,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1828,-inf,0.0,171,0.0,100,True,16,0.61,False,6,12,14,15,2,8,21,1,14,2.03,3.72,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1829,-inf,0.0,0,0.0,50,True,20,0.63,False,6,12,16,15,3,8,21,2,14,1.92,5.23,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1830,-inf,0.0,172,0.0,100,True,24,0.67,True,6,12,15,15,2,8,21,1,14,2.06,3.73,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1831,-inf,0.0,119,0.0,50,True,20,0.63,True,6,13,14,15,2,8,21,2,14,1.98,3.56,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1832,-inf,0.0,245,0.0,100,True,16,0.58,True,6,13,16,15,3,8,21,1,14,2.11,4.15,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1833,-inf,0.0,232,0.0,50,True,20,0.53,False,6,12,16,16,3,8,21,1,14,1.65,4.58,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1834,-inf,0.0,221,0.0,50,True,24,0.62,False,6,12,14,16,3,8,21,1,14,1.68,4.61,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1835,-inf,0.0,230,0.0,50,True,16,0.62,False,6,12,16,15,3,8,21,1,14,2.0,5.26,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1836,-inf,0.0,0,0.0,50,True,20,0.66,False,6,12,16,16,3,8,21,2,14,2.01,5.25,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1837,-inf,0.0,258,0.0,50,True,16,0.65,False,6,12,15,15,3,8,21,1,14,1.84,3.54,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1838,-inf,0.0,329,0.0,50,True,20,0.57,True,6,12,16,16,3,8,21,1,14,2.09,5.35,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1839,-inf,0.0,206,0.0,100,True,24,0.65,True,6,12,15,15,3,8,21,1,14,1.68,5.03,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1840,-inf,0.0,274,0.0,50,True,20,0.57,False,6,13,16,15,3,8,21,1,14,2.07,4.06,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1841,-inf,0.0,250,0.0,100,True,24,0.55,True,6,12,15,16,3,8,21,1,14,1.91,4.05,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1842,-inf,0.0,212,0.0,100,True,16,0.7,True,6,12,15,15,3,8,21,1,14,2.08,4.71,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1843,-inf,0.0,96,0.0,100,True,20,0.62,True,6,13,16,16,3,8,21,2,14,2.14,3.77,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1844,-inf,0.0,236,0.0,50,True,24,0.6,True,6,12,15,15,2,8,21,1,14,1.85,3.65,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1845,-inf,0.0,247,0.0,100,True,16,0.54,False,6,13,16,15,2,8,21,1,14,1.79,4.61,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1846,-inf,0.0,205,0.0,100,True,24,0.6,True,6,13,15,15,3,8,21,1,14,1.75,4.55,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1847,-inf,0.0,234,0.0,100,True,24,0.66,True,6,13,14,15,2,8,21,1,14,2.19,4.3,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1848,-inf,0.0,0,0.0,50,True,20,0.56,False,6,13,14,15,3,8,21,2,14,1.99,3.95,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1849,-inf,0.0,367,0.0,50,True,16,0.56,True,6,12,16,16,3,8,21,1,14,2.14,5.19,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1850,-inf,0.0,217,0.0,50,True,24,0.62,False,6,13,16,16,3,8,21,1,14,2.05,4.83,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1851,-inf,0.0,282,0.0,100,True,16,0.57,True,6,12,16,15,2,8,21,1,14,2.1,3.56,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1852,-inf,0.0,82,0.0,100,True,24,0.69,True,6,13,16,16,2,8,21,2,14,2.16,5.15,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1853,-inf,0.0,93,0.0,100,True,20,0.61,True,6,12,15,16,2,8,21,2,14,2.16,4.4,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1854,-inf,0.0,218,0.0,50,True,24,0.59,False,6,13,14,16,2,8,21,1,14,1.75,5.38,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1855,-inf,0.0,102,0.0,50,True,24,0.53,True,6,12,16,15,3,8,21,2,14,1.97,5.2,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1856,-inf,0.0,251,0.0,50,True,20,0.6,True,6,12,14,16,3,8,21,1,14,1.74,3.67,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1857,-inf,0.0,253,0.0,50,True,16,0.53,False,6,12,16,15,3,8,21,1,14,1.73,3.58,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1858,-inf,0.0,139,0.0,50,True,20,0.67,False,6,13,15,16,2,8,21,1,14,1.9,3.55,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1859,-inf,0.0,161,0.0,100,True,16,0.65,False,6,12,14,16,3,8,21,1,14,1.65,5.01,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1860,-inf,0.0,0,0.0,50,True,24,0.61,False,6,12,15,15,2,8,21,2,14,1.96,3.66,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1861,-inf,0.0,368,0.0,50,True,20,0.51,True,6,13,16,15,3,8,21,1,14,1.93,3.66,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1862,-inf,0.0,293,0.0,100,True,20,0.55,False,6,13,14,15,3,8,21,1,14,1.99,5.14,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1863,-inf,0.0,106,0.0,100,True,16,0.62,True,6,13,15,16,2,8,21,2,14,1.77,3.54,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1864,-inf,0.0,400,0.0,50,True,16,0.52,True,6,12,16,16,3,8,21,1,14,2.06,4.98,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1865,-inf,0.0,172,0.0,100,True,24,0.61,False,6,12,16,16,2,8,21,1,14,1.84,3.81,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1866,-inf,0.0,0,0.0,50,True,20,0.56,False,6,12,14,15,3,8,21,2,14,1.85,3.9,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1867,-inf,0.0,94,0.0,100,True,20,0.55,True,6,12,15,16,2,8,21,2,14,2.03,4.71,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1868,-inf,0.0,245,0.0,50,True,16,0.7,True,6,12,16,16,2,8,21,1,14,1.66,4.86,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1869,-inf,0.0,300,0.0,100,True,16,0.52,False,6,13,16,15,3,8,21,1,14,2.08,3.98,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1870,-inf,0.0,227,0.0,50,True,24,0.63,True,6,13,15,15,2,8,21,1,14,1.79,4.7,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1871,-inf,0.0,190,0.0,50,True,20,0.6,False,6,13,16,16,3,8,21,1,14,2.04,5.42,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1872,-inf,0.0,101,0.0,50,True,24,0.68,True,6,13,14,16,3,8,21,2,14,1.64,4.74,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1873,-inf,0.0,252,0.0,50,True,24,0.55,False,6,13,15,15,3,8,21,1,14,1.75,4.91,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1874,-inf,0.0,106,0.0,50,True,20,0.55,True,6,12,16,16,2,8,21,2,14,1.92,3.53,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1875,-inf,0.0,247,0.0,100,True,16,0.54,False,6,13,14,16,2,8,21,1,14,1.74,4.29,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1876,-inf,0.0,409,0.0,50,True,20,0.51,True,6,13,15,15,2,8,21,1,14,2.12,4.67,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1877,-inf,0.0,289,0.0,50,True,16,0.66,True,6,12,14,16,2,8,21,1,14,1.96,4.18,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1878,-inf,0.0,244,0.0,100,True,20,0.61,False,6,12,14,15,3,8,21,1,14,1.63,4.93,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1879,-inf,0.0,272,0.0,50,True,20,0.57,False,6,13,16,16,3,8,21,1,14,2.19,4.68,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1880,-inf,0.0,128,0.0,100,True,20,0.65,False,6,13,15,15,2,8,21,1,14,1.93,4.76,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1881,-inf,0.0,230,0.0,100,True,20,0.63,True,6,13,15,16,3,8,21,1,14,1.69,3.84,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1882,-inf,0.0,244,0.0,50,True,16,0.6,False,6,12,15,16,3,8,21,1,14,1.74,5.12,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1883,-inf,0.0,114,0.0,50,True,20,0.61,True,6,13,14,16,3,8,21,2,14,1.69,4.34,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1884,-inf,0.0,356,0.0,50,True,16,0.57,True,6,13,16,16,2,8,21,1,14,1.82,3.9,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1885,-inf,0.0,312,0.0,100,True,16,0.64,True,6,13,15,15,3,8,21,1,14,1.63,4.55,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1886,-inf,0.0,257,0.0,100,True,16,0.54,False,6,12,14,15,3,8,21,1,14,1.87,4.03,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1887,-inf,0.0,86,0.0,100,True,24,0.65,True,6,12,16,16,3,8,21,2,14,1.63,4.95,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1888,-inf,0.0,0,0.0,50,True,24,0.69,False,6,13,16,16,3,8,21,2,14,1.73,4.16,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1889,-inf,0.0,0,0.0,50,True,16,0.68,False,6,13,16,16,3,8,21,2,14,2.17,4.25,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1890,-inf,0.0,141,0.0,50,True,16,0.7,False,6,13,16,15,3,8,21,1,14,2.11,5.11,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1891,-inf,0.0,260,0.0,50,True,16,0.51,False,6,13,15,15,2,8,21,1,14,2.11,3.79,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1892,-inf,0.0,231,0.0,100,True,16,0.66,True,6,12,16,16,3,8,21,1,14,1.62,5.24,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1893,-inf,0.0,162,0.0,50,True,16,0.66,False,6,13,16,15,3,8,21,1,14,1.86,5.34,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1894,-inf,0.0,0,0.0,50,True,16,0.64,False,6,12,14,15,2,8,21,2,14,1.71,4.65,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1895,-inf,0.0,360,0.0,50,True,16,0.58,True,6,12,14,16,3,8,21,1,14,1.73,4.09,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1896,-inf,0.0,348,0.0,50,True,24,0.5,False,6,13,15,15,3,8,21,1,14,2.01,3.75,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1897,-inf,0.0,273,0.0,100,True,20,0.59,True,6,12,16,15,2,8,21,1,14,1.6,5.16,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1898,-inf,0.0,255,0.0,50,True,24,0.53,False,6,12,14,16,3,8,21,1,14,1.88,3.91,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1899,-inf,0.0,266,0.0,50,True,20,0.58,False,6,13,14,16,2,8,21,1,14,1.94,3.6,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1900,-inf,0.0,0,0.0,100,True,24,0.56,False,6,12,16,16,2,8,21,2,14,2.09,4.78,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1901,-inf,0.0,190,0.0,50,True,16,0.68,False,6,12,16,16,3,8,21,1,14,1.9,4.36,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1902,-inf,0.0,0,0.0,100,True,24,0.69,False,6,12,14,15,2,8,21,2,14,1.84,5.11,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1903,-inf,0.0,213,0.0,100,True,20,0.69,True,6,13,16,16,3,8,21,1,14,1.96,4.79,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1904,-inf,0.0,0,0.0,50,True,24,0.64,False,6,13,16,15,3,8,21,2,14,2.15,4.51,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1905,-inf,0.0,215,0.0,100,True,20,0.5,False,6,12,14,16,3,8,21,1,14,1.73,3.76,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1906,-inf,0.0,307,0.0,100,True,20,0.52,True,6,12,16,15,2,8,21,1,14,1.97,4.62,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1907,-inf,0.0,110,0.0,100,True,16,0.5,True,6,12,16,16,3,8,21,2,14,2.02,5.34,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1908,-inf,0.0,123,0.0,50,True,24,0.69,False,6,13,15,15,2,8,21,1,14,1.84,4.42,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1909,-inf,0.0,238,0.0,100,True,16,0.67,True,6,12,14,16,3,8,21,1,14,1.8,4.59,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1910,-inf,0.0,226,0.0,100,True,24,0.51,True,6,12,16,16,3,8,21,1,14,1.78,5.0,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1911,-inf,0.0,0,0.0,100,True,20,0.5,False,6,13,16,16,3,8,21,2,14,2.07,4.27,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1912,-inf,0.0,175,0.0,50,True,16,0.67,False,6,12,14,16,2,8,21,1,14,2.1,3.62,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1913,-inf,0.0,300,0.0,50,True,20,0.58,True,6,12,15,16,3,8,21,1,14,2.04,4.87,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1914,-inf,0.0,170,0.0,100,True,20,0.63,False,6,13,15,16,3,8,21,1,14,1.66,5.43,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1915,-inf,0.0,97,0.0,100,True,20,0.5,True,6,13,16,16,3,8,21,2,14,2.07,4.33,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1916,-inf,0.0,267,0.0,100,True,24,0.51,True,6,13,15,16,3,8,21,1,14,1.66,3.85,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1917,-inf,0.0,207,0.0,100,True,16,0.65,False,6,13,14,15,2,8,21,1,14,1.92,5.32,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1918,-inf,0.0,257,0.0,50,True,20,0.66,True,6,12,15,15,2,8,21,1,14,1.72,5.26,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1919,-inf,0.0,0,0.0,50,True,16,0.6,False,6,12,14,15,3,8,21,2,14,1.63,4.72,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1920,-inf,0.0,0,0.0,50,True,24,0.66,False,6,12,14,16,2,8,21,2,14,2.06,4.78,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1921,-inf,0.0,177,0.0,100,True,24,0.68,True,6,13,15,15,3,8,21,1,14,1.73,4.28,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1922,-inf,0.0,111,0.0,50,True,20,0.56,True,6,13,14,16,3,8,21,2,14,1.9,5.48,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1923,-inf,0.0,97,0.0,100,True,20,0.63,True,6,13,16,15,3,8,21,2,14,2.1,5.02,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1924,-inf,0.0,263,0.0,100,True,16,0.53,False,6,13,14,15,2,8,21,1,14,1.81,4.56,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1925,-inf,0.0,161,0.0,100,True,24,0.67,True,6,13,14,16,2,8,21,1,14,1.74,4.63,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1926,-inf,0.0,0,0.0,100,True,20,0.56,False,6,13,15,16,2,8,21,2,14,1.79,4.53,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1927,-inf,0.0,95,0.0,100,True,24,0.6,True,6,12,14,15,3,8,21,2,14,1.91,4.29,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1928,-inf,0.0,95,0.0,50,True,24,0.58,True,6,12,14,16,2,8,21,2,14,1.99,4.95,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1929,-inf,0.0,242,0.0,100,True,16,0.59,False,6,13,16,15,2,8,21,1,14,1.72,3.5,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1930,-inf,0.0,111,0.0,50,True,24,0.69,True,6,13,14,15,3,8,21,2,14,1.9,4.09,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1931,-inf,0.0,190,0.0,100,True,20,0.61,False,6,12,15,15,2,8,21,1,14,1.88,3.79,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1932,-inf,0.0,123,0.0,50,True,20,0.62,True,6,12,14,15,3,8,21,2,14,2.1,3.61,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1933,-inf,0.0,114,0.0,100,True,20,0.67,False,6,12,16,16,3,8,21,1,14,1.95,4.91,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1934,-inf,0.0,190,0.0,100,True,20,0.6,False,6,12,16,15,2,8,21,1,14,2.05,4.43,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1935,-inf,0.0,242,0.0,50,True,20,0.6,True,6,13,15,16,2,8,21,1,14,2.1,3.92,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1936,-inf,0.0,300,0.0,100,True,20,0.54,True,6,12,14,16,3,8,21,1,14,1.69,4.69,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1937,-inf,0.0,226,0.0,50,True,16,0.69,True,6,13,16,15,2,8,21,1,14,2.16,4.79,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1938,-inf,0.0,204,0.0,100,True,24,0.66,True,6,12,14,16,2,8,21,1,14,1.83,5.02,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1939,-inf,0.0,330,0.0,50,True,16,0.59,True,6,12,15,15,2,8,21,1,14,1.93,5.29,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1940,-inf,0.0,203,0.0,100,True,24,0.56,False,6,12,14,16,2,8,21,1,14,1.89,4.42,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1941,-inf,0.0,0,0.0,50,True,16,0.57,False,6,12,15,16,2,8,21,2,14,1.66,3.84,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1942,-inf,0.0,280,0.0,50,True,20,0.57,True,6,13,15,15,3,8,21,1,14,1.99,4.55,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1943,-inf,0.0,0,0.0,50,True,24,0.55,False,6,13,14,16,3,8,21,2,14,1.92,3.71,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1944,-inf,0.0,293,0.0,50,True,20,0.68,True,6,12,14,15,3,8,21,1,14,1.72,4.57,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1945,-inf,0.0,87,0.0,100,True,24,0.65,True,6,12,16,16,3,8,21,2,14,1.87,3.61,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1946,-inf,0.0,0,0.0,100,True,24,0.55,False,6,13,15,16,3,8,21,2,14,2.09,3.55,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1947,-inf,0.0,263,0.0,100,True,20,0.66,True,6,13,14,15,3,8,21,1,14,1.73,4.5,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1948,-inf,0.0,0,0.0,50,True,20,0.62,False,6,13,15,15,2,8,21,2,14,1.86,3.71,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1949,-inf,0.0,104,0.0,50,True,24,0.51,True,6,13,16,16,3,8,21,2,14,1.7,5.14,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1950,-inf,0.0,0,0.0,100,True,16,0.58,False,6,12,16,16,3,8,21,2,14,1.75,4.37,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1951,-inf,0.0,201,0.0,100,True,16,0.56,False,6,13,16,16,3,8,21,1,14,2.04,4.19,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1952,-inf,0.0,304,0.0,100,True,24,0.56,True,6,13,15,15,3,8,21,1,14,1.87,4.17,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1953,-inf,0.0,159,0.0,50,True,24,0.63,False,6,12,16,16,2,8,21,1,14,2.07,4.1,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1954,-inf,0.0,200,0.0,100,True,20,0.64,True,6,13,16,15,3,8,21,1,14,1.77,4.97,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1955,-inf,0.0,112,0.0,50,True,24,0.58,True,6,12,14,15,3,8,21,2,14,1.81,5.37,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1956,-inf,0.0,193,0.0,100,True,24,0.66,True,6,12,15,16,3,8,21,1,14,1.67,4.99,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +1957,-inf,0.0,304,0.0,100,True,16,0.5,False,6,13,14,16,2,8,21,1,14,1.68,5.2,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1958,-inf,0.0,112,0.0,50,True,20,0.62,True,6,12,14,16,3,8,21,2,14,1.73,4.34,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1959,-inf,0.0,326,0.0,50,True,16,0.59,False,6,12,15,15,3,8,21,1,14,2.09,3.74,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1960,-inf,0.0,317,0.0,50,True,16,0.55,False,6,12,15,16,3,8,21,1,14,1.86,4.11,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1961,-inf,0.0,0,0.0,50,True,24,0.58,False,6,12,15,15,2,8,21,2,14,1.95,5.0,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1962,-inf,0.0,0,0.0,100,True,24,0.63,False,6,12,16,15,3,8,21,2,14,1.86,5.2,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1963,-inf,0.0,277,0.0,100,True,24,0.51,True,6,13,14,15,3,8,21,1,14,1.64,4.94,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1964,-inf,0.0,0,0.0,100,True,24,0.55,False,6,13,14,15,2,8,21,2,14,1.6,4.44,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1965,-inf,0.0,0,0.0,50,True,20,0.69,False,6,13,16,15,3,8,21,2,14,1.89,4.66,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1966,-inf,0.0,297,0.0,100,True,16,0.52,False,6,13,16,16,2,8,21,1,14,1.68,4.88,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1967,-inf,0.0,288,0.0,100,True,20,0.55,False,6,13,15,15,2,8,21,1,14,2.02,5.11,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1968,-inf,0.0,0,0.0,50,True,16,0.64,False,6,12,14,16,2,8,21,2,14,1.65,3.68,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1969,-inf,0.0,245,0.0,50,True,20,0.6,False,6,12,16,15,2,8,21,1,14,2.08,3.66,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1970,-inf,0.0,165,0.0,50,True,24,0.63,False,6,13,15,15,3,8,21,1,14,2.1,4.31,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1971,-inf,0.0,260,0.0,50,True,16,0.67,True,6,12,16,15,3,8,21,1,14,1.71,4.99,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1972,-inf,0.0,128,0.0,50,True,16,0.54,True,6,12,16,16,3,8,21,2,14,2.01,4.17,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1973,-inf,0.0,384,0.0,100,True,16,0.53,True,6,12,15,15,2,8,21,1,14,1.85,3.57,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1974,-inf,0.0,230,0.0,100,True,20,0.65,True,6,12,14,16,3,8,21,1,14,1.72,4.98,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1975,-inf,0.0,136,0.0,50,True,16,0.56,True,6,13,14,15,2,8,21,2,14,1.71,4.24,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1976,-inf,0.0,144,0.0,50,True,16,0.69,True,6,12,14,15,3,8,21,2,14,1.78,3.95,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1977,-inf,0.0,259,0.0,50,True,24,0.53,True,6,13,14,15,2,8,21,1,14,2.04,4.01,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1978,-inf,0.0,262,0.0,100,True,20,0.53,False,6,12,16,16,3,8,21,1,14,1.97,4.36,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1979,-inf,0.0,0,0.0,100,True,24,0.6,False,6,12,15,15,2,8,21,2,14,2.09,5.4,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1980,-inf,0.0,84,0.0,100,True,24,0.63,True,6,13,16,16,2,8,21,2,14,1.88,3.96,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +1981,-inf,0.0,211,0.0,100,True,24,0.54,False,6,13,15,16,2,8,21,1,14,1.89,5.29,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1982,-inf,0.0,217,0.0,50,True,24,0.6,False,6,13,15,15,3,8,21,1,14,2.07,4.24,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1983,-inf,0.0,0,0.0,100,True,16,0.56,False,6,13,15,16,3,8,21,2,14,1.74,3.92,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1984,-inf,0.0,0,0.0,100,True,16,0.65,False,6,12,14,16,2,8,21,2,14,2.05,4.28,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1985,-inf,0.0,285,0.0,100,True,16,0.57,True,6,12,16,16,3,8,21,1,14,2.05,4.59,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1986,-inf,0.0,146,0.0,100,True,16,0.69,False,6,13,16,16,3,8,21,1,14,2.0,3.55,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1987,-inf,0.0,297,0.0,50,True,20,0.61,True,6,12,15,15,3,8,21,1,14,2.0,4.5,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1988,-inf,0.0,293,0.0,50,True,24,0.59,True,6,12,14,16,2,8,21,1,14,1.68,3.62,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +1989,-inf,0.0,310,0.0,50,True,16,0.55,False,6,13,16,15,2,8,21,1,14,2.04,4.65,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1990,-inf,0.0,251,0.0,50,True,20,0.58,True,6,13,15,16,2,8,21,1,14,1.99,5.18,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1991,-inf,0.0,0,0.0,50,True,20,0.67,False,6,13,15,15,2,8,21,2,14,1.67,3.78,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +1992,-inf,0.0,0,0.0,100,True,16,0.54,False,6,12,16,15,2,8,21,2,14,1.85,5.32,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +1993,-inf,0.0,195,0.0,100,True,16,0.62,False,6,12,15,15,2,8,21,1,14,1.73,3.72,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1994,-inf,0.0,142,0.0,50,True,16,0.57,True,6,12,15,15,3,8,21,2,14,1.95,5.02,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1995,-inf,0.0,0,0.0,50,True,16,0.55,False,6,12,15,16,3,8,21,2,14,2.08,5.41,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +1996,-inf,0.0,280,0.0,50,True,20,0.51,False,6,12,16,15,2,8,21,1,14,1.9,3.93,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1997,-inf,0.0,0,0.0,50,True,16,0.58,False,6,12,14,15,3,8,21,2,14,2.14,3.82,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +1998,-inf,0.0,133,0.0,100,True,20,0.69,False,6,12,16,15,2,8,21,1,14,1.78,3.74,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +1999,-inf,0.0,203,0.0,100,True,20,0.61,True,6,12,14,16,2,8,21,1,14,1.86,4.89,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2000,-inf,0.0,249,0.0,50,True,20,0.67,True,6,12,16,16,2,8,21,1,14,1.79,4.46,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2001,-inf,0.0,324,0.0,100,True,16,0.54,True,6,12,16,16,2,8,21,1,14,1.78,4.43,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2002,-inf,0.0,284,0.0,50,True,20,0.52,True,6,13,16,16,3,8,21,1,14,2.15,5.37,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2003,-inf,0.0,248,0.0,50,True,20,0.6,False,6,13,15,16,3,8,21,1,14,1.96,3.98,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2004,-inf,0.0,249,0.0,100,True,20,0.62,True,6,13,14,16,2,8,21,1,14,1.98,3.74,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2005,-inf,0.0,0,0.0,50,True,24,0.55,False,6,12,15,15,3,8,21,2,14,2.0,5.43,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2006,-inf,0.0,0,0.0,50,True,20,0.61,False,6,13,14,16,2,8,21,2,14,1.9,4.12,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2007,-inf,0.0,0,0.0,50,True,24,0.57,False,6,12,16,16,3,8,21,2,14,1.92,5.32,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2008,-inf,0.0,81,0.0,100,True,24,0.61,True,6,12,14,16,2,8,21,2,14,2.19,4.9,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2009,-inf,0.0,113,0.0,100,True,20,0.69,False,6,12,15,16,3,8,21,1,14,2.11,3.87,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2010,-inf,0.0,275,0.0,50,True,20,0.53,False,6,12,16,16,3,8,21,1,14,1.62,4.27,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2011,-inf,0.0,336,0.0,50,True,24,0.51,False,6,13,14,15,2,8,21,1,14,1.91,5.41,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2012,-inf,0.0,201,0.0,100,True,16,0.66,False,6,12,14,15,3,8,21,1,14,1.92,3.62,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2013,-inf,0.0,120,0.0,100,True,16,0.61,True,6,13,15,15,2,8,21,2,14,2.03,3.74,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2014,-inf,0.0,325,0.0,50,True,16,0.53,True,6,12,14,15,3,8,21,1,14,1.92,4.44,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2015,-inf,0.0,127,0.0,50,True,20,0.7,False,6,12,14,16,2,8,21,1,14,2.04,4.61,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2016,-inf,0.0,357,0.0,50,True,16,0.57,True,6,12,14,16,2,8,21,1,14,1.72,5.43,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2017,-inf,0.0,95,0.0,50,True,24,0.61,True,6,12,15,16,2,8,21,2,14,2.02,4.83,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2018,-inf,0.0,215,0.0,50,True,24,0.65,True,6,12,14,15,2,8,21,1,14,2.14,3.7,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2019,-inf,0.0,239,0.0,100,True,16,0.56,False,6,12,16,15,3,8,21,1,14,1.88,4.32,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2020,-inf,0.0,252,0.0,50,True,24,0.51,True,6,12,14,16,2,8,21,1,14,1.9,5.33,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2021,-inf,0.0,140,0.0,50,True,24,0.7,False,6,12,16,15,2,8,21,1,14,2.09,4.74,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2022,-inf,0.0,133,0.0,100,True,16,0.66,False,6,12,15,16,3,8,21,1,14,2.15,5.07,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2023,-inf,0.0,0,0.0,100,True,24,0.65,False,6,12,16,15,3,8,21,2,14,2.18,4.63,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2024,-inf,0.0,134,0.0,100,True,20,0.68,False,6,12,15,15,2,8,21,1,14,1.8,4.42,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2025,-inf,0.0,212,0.0,100,True,20,0.59,True,6,12,15,16,2,8,21,1,14,1.85,5.35,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2026,-inf,0.0,118,0.0,50,True,20,0.62,True,6,12,15,15,2,8,21,2,14,1.77,4.46,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2027,-inf,0.0,166,0.0,50,True,24,0.62,False,6,13,15,16,3,8,21,1,14,2.12,3.86,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2028,-inf,0.0,96,0.0,100,True,24,0.54,True,6,13,14,15,3,8,21,2,14,1.6,3.56,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2029,-inf,0.0,231,0.0,50,True,20,0.52,False,6,13,14,16,2,8,21,1,14,1.92,4.13,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2030,-inf,0.0,356,0.0,50,True,20,0.53,False,6,13,14,15,3,8,21,1,14,1.82,3.62,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2031,-inf,0.0,137,0.0,50,True,24,0.66,False,6,13,14,15,2,8,21,1,14,1.98,5.34,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2032,-inf,0.0,346,0.0,100,True,16,0.51,True,6,12,16,16,3,8,21,1,14,2.14,4.88,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2033,-inf,0.0,295,0.0,100,True,16,0.52,False,6,12,16,15,2,8,21,1,14,1.78,4.31,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2034,-inf,0.0,337,0.0,50,True,20,0.64,True,6,13,15,15,3,8,21,1,14,1.84,5.47,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2035,-inf,0.0,230,0.0,50,True,16,0.67,True,6,12,15,16,2,8,21,1,14,1.69,4.34,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2036,-inf,0.0,142,0.0,50,True,16,0.62,True,6,12,15,15,3,8,21,2,14,1.89,4.71,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2037,-inf,0.0,180,0.0,50,True,16,0.64,False,6,13,14,16,2,8,21,1,14,2.11,4.25,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2038,-inf,0.0,0,0.0,100,True,24,0.6,False,6,13,16,16,2,8,21,2,14,1.87,5.5,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2039,-inf,0.0,228,0.0,50,True,20,0.66,False,6,12,14,15,2,8,21,1,14,1.99,4.44,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2040,-inf,0.0,0,0.0,100,True,20,0.58,False,6,13,14,16,2,8,21,2,14,1.67,4.09,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2041,-inf,0.0,222,0.0,50,True,16,0.63,False,6,13,15,16,3,8,21,1,14,1.81,4.82,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2042,-inf,0.0,128,0.0,50,True,16,0.51,True,6,12,16,16,3,8,21,2,14,1.63,4.82,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2043,-inf,0.0,353,0.0,50,True,16,0.53,True,6,12,15,16,3,8,21,1,14,1.83,5.15,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2044,-inf,0.0,106,0.0,50,True,20,0.55,True,6,12,16,16,2,8,21,2,14,1.81,3.81,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2045,-inf,0.0,223,0.0,100,True,24,0.6,False,6,12,15,15,2,8,21,1,14,2.11,4.71,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2046,-inf,0.0,268,0.0,50,True,16,0.69,True,6,13,15,15,2,8,21,1,14,2.02,3.65,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2047,-inf,0.0,193,0.0,100,True,20,0.62,False,6,13,16,15,2,8,21,1,14,2.05,4.57,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2048,-inf,0.0,221,0.0,100,True,24,0.61,False,6,13,15,15,3,8,21,1,14,2.15,3.78,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2049,-inf,0.0,126,0.0,100,True,24,0.67,False,6,13,14,16,3,8,21,1,14,1.71,4.39,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2050,-inf,0.0,247,0.0,50,True,16,0.6,False,6,13,15,15,2,8,21,1,14,2.17,4.23,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2051,-inf,0.0,0,0.0,100,True,24,0.59,False,6,13,16,16,3,8,21,2,14,1.86,3.83,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2052,-inf,0.0,0,0.0,100,True,16,0.5,False,6,12,15,15,3,8,21,2,14,1.68,4.63,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2053,-inf,0.0,109,0.0,100,True,16,0.53,True,6,13,14,16,3,8,21,2,14,1.9,4.69,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2054,-inf,0.0,190,0.0,100,True,24,0.5,False,6,12,15,16,2,8,21,1,14,1.68,3.72,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2055,-inf,0.0,251,0.0,100,True,16,0.54,True,6,13,15,16,2,8,21,1,14,2.15,5.44,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2056,-inf,0.0,235,0.0,100,True,16,0.57,False,6,12,15,15,2,8,21,1,14,1.99,4.56,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2057,-inf,0.0,82,0.0,100,True,24,0.64,True,6,12,14,16,2,8,21,2,14,1.63,4.63,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2058,-inf,0.0,195,0.0,100,True,16,0.64,False,6,13,15,16,2,8,21,1,14,1.72,4.76,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2059,-inf,0.0,120,0.0,100,True,16,0.5,True,6,12,14,15,2,8,21,2,14,2.01,4.08,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2060,-inf,0.0,97,0.0,100,True,20,0.65,True,6,12,14,16,3,8,21,2,14,1.95,3.55,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2061,-inf,0.0,107,0.0,100,True,20,0.64,True,6,12,15,15,3,8,21,2,14,2.01,4.71,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2062,-inf,0.0,202,0.0,50,True,16,0.61,False,6,13,15,15,2,8,21,1,14,1.69,4.74,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2063,-inf,0.0,289,0.0,50,True,20,0.51,True,6,12,14,16,3,8,21,1,14,1.67,4.19,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2064,-inf,0.0,215,0.0,50,True,24,0.68,True,6,12,15,16,2,8,21,1,14,1.77,4.04,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2065,-inf,0.0,113,0.0,100,True,20,0.68,False,6,12,16,15,3,8,21,1,14,1.91,4.81,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2066,-inf,0.0,212,0.0,50,True,20,0.56,False,6,13,16,15,2,8,21,1,14,1.97,3.52,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2067,-inf,0.0,259,0.0,100,True,20,0.56,True,6,13,15,16,2,8,21,1,14,2.18,4.72,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2068,-inf,0.0,237,0.0,50,True,20,0.68,True,6,13,16,15,3,8,21,1,14,1.66,4.53,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2069,-inf,0.0,0,0.0,100,True,16,0.52,False,6,13,15,16,2,8,21,2,14,1.72,4.33,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2070,-inf,0.0,109,0.0,100,True,16,0.57,True,6,13,14,16,3,8,21,2,14,1.92,4.68,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2071,-inf,0.0,0,0.0,100,True,24,0.53,False,6,12,15,15,2,8,21,2,14,1.99,5.04,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2072,-inf,0.0,110,0.0,100,True,16,0.58,True,6,12,15,16,3,8,21,2,14,1.63,4.86,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2073,-inf,0.0,105,0.0,100,True,20,0.61,True,6,12,14,15,2,8,21,2,14,1.8,3.82,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2074,-inf,0.0,107,0.0,100,True,20,0.59,True,6,13,15,15,3,8,21,2,14,2.03,3.83,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2075,-inf,0.0,269,0.0,100,True,20,0.59,True,6,12,16,16,2,8,21,1,14,1.92,4.63,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2076,-inf,0.0,289,0.0,50,True,24,0.59,True,6,12,15,16,3,8,21,1,14,2.15,5.4,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2077,-inf,0.0,303,0.0,100,True,16,0.56,False,6,13,14,15,2,8,21,1,14,1.87,3.67,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2078,-inf,0.0,195,0.0,50,True,24,0.67,True,6,12,15,16,3,8,21,1,14,2.13,5.43,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2079,-inf,0.0,0,0.0,100,True,24,0.63,False,6,12,16,16,2,8,21,2,14,1.95,4.76,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2080,-inf,0.0,164,0.0,100,True,24,0.62,False,6,13,15,16,3,8,21,1,14,1.62,4.72,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2081,-inf,0.0,226,0.0,50,True,16,0.56,False,6,12,14,16,2,8,21,1,14,2.16,5.18,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2082,-inf,0.0,219,0.0,100,True,24,0.64,True,6,13,16,15,2,8,21,1,14,2.1,4.66,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2083,-inf,0.0,246,0.0,50,True,20,0.5,False,6,13,16,15,3,8,21,1,14,2.06,4.17,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2084,-inf,0.0,174,0.0,50,True,16,0.68,False,6,12,16,15,2,8,21,1,14,1.84,5.16,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2085,-inf,0.0,388,0.0,50,True,16,0.6,True,6,13,15,15,3,8,21,1,14,2.15,4.7,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2086,-inf,0.0,388,0.0,50,True,20,0.56,True,6,13,15,15,2,8,21,1,14,1.77,4.31,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2087,-inf,0.0,191,0.0,100,True,20,0.55,False,6,13,15,15,2,8,21,1,14,2.13,3.68,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2088,-inf,0.0,244,0.0,50,True,24,0.58,False,6,12,16,15,3,8,21,1,14,1.92,4.03,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2089,-inf,0.0,92,0.0,100,True,24,0.53,True,6,12,14,15,2,8,21,2,14,1.83,3.6,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2090,-inf,0.0,360,0.0,100,True,16,0.56,True,6,13,15,15,2,8,21,1,14,2.13,4.3,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2091,-inf,0.0,262,0.0,50,True,24,0.64,True,6,12,15,16,2,8,21,1,14,1.96,5.03,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2092,-inf,0.0,122,0.0,50,True,16,0.51,True,6,12,16,15,2,8,21,2,14,1.87,3.73,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2093,-inf,0.0,264,0.0,50,True,16,0.61,True,6,13,16,16,2,8,21,1,14,1.93,5.39,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2094,-inf,0.0,237,0.0,50,True,24,0.65,True,6,13,16,15,3,8,21,1,14,1.85,3.98,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2095,-inf,0.0,112,0.0,50,True,24,0.68,True,6,12,14,15,3,8,21,2,14,1.64,5.21,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2096,-inf,0.0,151,0.0,100,True,24,0.7,False,6,12,15,15,2,8,21,1,14,1.62,4.2,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2097,-inf,0.0,150,0.0,50,True,16,0.67,False,6,13,14,16,3,8,21,1,14,1.66,4.67,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2098,-inf,0.0,106,0.0,100,True,16,0.63,True,6,13,15,16,2,8,21,2,14,1.66,5.12,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2099,-inf,0.0,174,0.0,50,True,24,0.6,False,6,12,16,15,3,8,21,1,14,1.86,4.55,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2100,-inf,0.0,0,0.0,100,True,16,0.52,False,6,12,15,16,2,8,21,2,14,1.7,4.35,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2101,-inf,0.0,211,0.0,50,True,24,0.64,True,6,13,16,16,2,8,21,1,14,2.19,4.15,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2102,-inf,0.0,334,0.0,50,True,20,0.56,True,6,13,16,15,2,8,21,1,14,1.8,4.45,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2103,-inf,0.0,0,0.0,100,True,20,0.69,False,6,13,15,15,2,8,21,2,14,1.82,4.98,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2104,-inf,0.0,222,0.0,50,True,16,0.68,False,6,12,15,15,3,8,21,1,14,1.89,4.67,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2105,-inf,0.0,125,0.0,50,True,24,0.69,False,6,13,15,15,3,8,21,1,14,1.99,5.18,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2106,-inf,0.0,278,0.0,100,True,16,0.51,False,6,12,14,15,3,8,21,1,14,1.96,4.78,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2107,-inf,0.0,94,0.0,100,True,20,0.63,True,6,12,16,15,2,8,21,2,14,1.72,3.75,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2108,-inf,0.0,0,0.0,100,True,24,0.5,False,6,12,15,16,2,8,21,2,14,2.05,3.55,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2109,-inf,0.0,229,0.0,100,True,16,0.7,True,6,12,14,16,2,8,21,1,14,1.98,3.53,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2110,-inf,0.0,123,0.0,50,True,20,0.63,True,6,12,15,15,3,8,21,2,14,2.03,3.78,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2111,-inf,0.0,0,0.0,100,True,20,0.55,False,6,12,16,16,3,8,21,2,14,1.66,4.78,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2112,-inf,0.0,136,0.0,100,True,24,0.69,False,6,13,16,16,3,8,21,1,14,2.03,4.59,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2113,-inf,0.0,163,0.0,100,True,24,0.56,False,6,12,15,16,2,8,21,1,14,1.83,4.36,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2114,-inf,0.0,96,0.0,100,True,20,0.69,True,6,13,16,15,3,8,21,2,14,2.04,3.96,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2115,-inf,0.0,184,0.0,100,True,24,0.53,False,6,13,14,16,3,8,21,1,14,1.91,3.98,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2116,-inf,0.0,174,0.0,100,True,20,0.57,False,6,12,16,16,2,8,21,1,14,2.06,4.8,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2117,-inf,0.0,0,0.0,50,True,24,0.67,False,6,13,14,16,3,8,21,2,14,1.62,3.55,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2118,-inf,0.0,285,0.0,100,True,16,0.57,True,6,12,16,16,3,8,21,1,14,1.7,5.15,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2119,-inf,0.0,277,0.0,50,True,20,0.53,True,6,12,16,16,3,8,21,1,14,2.15,4.48,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2120,-inf,0.0,223,0.0,100,True,20,0.63,False,6,12,14,15,2,8,21,1,14,1.68,4.62,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2121,-inf,0.0,120,0.0,100,True,16,0.64,True,6,13,15,15,2,8,21,2,14,1.66,3.92,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2122,-inf,0.0,295,0.0,50,True,20,0.62,True,6,12,15,16,2,8,21,1,14,2.08,4.95,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2123,-inf,0.0,264,0.0,50,True,16,0.63,True,6,13,14,16,3,8,21,1,14,2.13,5.13,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2124,-inf,0.0,214,0.0,100,True,24,0.58,True,6,13,14,15,3,8,21,1,14,1.73,3.88,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2125,-inf,0.0,94,0.0,100,True,20,0.56,True,6,13,16,16,2,8,21,2,14,2.09,4.75,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2126,-inf,0.0,0,0.0,100,True,16,0.52,False,6,13,15,16,2,8,21,2,14,1.87,3.56,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2127,-inf,0.0,328,0.0,100,True,16,0.61,True,6,13,15,15,2,8,21,1,14,1.75,3.69,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2128,-inf,0.0,176,0.0,100,True,20,0.57,False,6,12,15,16,2,8,21,1,14,2.05,3.56,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2129,-inf,0.0,177,0.0,50,True,24,0.7,False,6,13,14,15,2,8,21,1,14,1.94,3.67,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2130,-inf,0.0,147,0.0,50,True,16,0.68,False,6,12,15,16,2,8,21,1,14,1.8,4.92,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2131,-inf,0.0,148,0.0,50,True,16,0.68,False,6,13,14,15,2,8,21,1,14,1.77,3.96,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2132,-inf,0.0,281,0.0,50,True,20,0.6,True,6,13,16,15,2,8,21,1,14,1.82,5.13,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2133,-inf,0.0,218,0.0,100,True,16,0.67,True,6,12,16,15,2,8,21,1,14,1.75,4.44,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2134,-inf,0.0,98,0.0,100,True,20,0.54,True,6,12,16,16,3,8,21,2,14,1.61,4.07,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2135,-inf,0.0,196,0.0,50,True,24,0.67,True,6,13,14,16,3,8,21,1,14,2.15,3.67,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2136,-inf,0.0,119,0.0,50,True,24,0.7,False,6,13,14,15,3,8,21,1,14,1.84,4.87,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2137,-inf,0.0,0,0.0,100,True,24,0.53,False,6,12,15,15,2,8,21,2,14,1.67,4.35,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2138,-inf,0.0,288,0.0,50,True,24,0.51,False,6,12,16,15,2,8,21,1,14,1.96,3.99,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2139,-inf,0.0,234,0.0,100,True,20,0.54,False,6,13,15,15,2,8,21,1,14,1.68,4.53,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2140,-inf,0.0,272,0.0,50,True,20,0.63,False,6,12,15,15,2,8,21,1,14,1.76,3.6,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2141,-inf,0.0,95,0.0,50,True,24,0.58,True,6,13,16,15,2,8,21,2,14,2.16,4.78,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2142,-inf,0.0,197,0.0,100,True,24,0.58,False,6,12,14,15,3,8,21,1,14,1.96,4.94,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2143,-inf,0.0,167,0.0,100,True,24,0.64,False,6,13,16,15,2,8,21,1,14,2.07,4.58,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2144,-inf,0.0,322,0.0,50,True,16,0.67,True,6,13,14,15,2,8,21,1,14,1.66,3.99,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2145,-inf,0.0,251,0.0,50,True,24,0.56,True,6,12,14,15,2,8,21,1,14,2.08,3.85,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2146,-inf,0.0,141,0.0,50,True,24,0.65,False,6,12,16,16,2,8,21,1,14,2.1,3.98,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2147,-inf,0.0,122,0.0,50,True,24,0.69,False,6,12,16,16,2,8,21,1,14,2.05,4.69,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2148,-inf,0.0,239,0.0,100,True,20,0.6,True,6,12,14,16,2,8,21,1,14,1.75,4.93,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2149,-inf,0.0,107,0.0,50,True,20,0.52,True,6,13,16,16,2,8,21,2,14,2.0,5.18,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2150,-inf,0.0,0,0.0,50,True,16,0.59,False,6,12,14,15,3,8,21,2,14,1.78,4.02,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2151,-inf,0.0,195,0.0,100,True,16,0.62,False,6,13,15,15,2,8,21,1,14,1.86,3.66,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2152,-inf,0.0,173,0.0,50,True,24,0.65,False,6,12,15,15,3,8,21,1,14,1.66,4.98,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2153,-inf,0.0,0,0.0,50,True,16,0.57,False,6,12,15,15,2,8,21,2,14,2.11,4.55,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2154,-inf,0.0,296,0.0,50,True,16,0.65,True,6,13,16,16,2,8,21,1,14,1.78,4.28,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2155,-inf,0.0,338,0.0,100,True,20,0.54,True,6,12,15,15,2,8,21,1,14,1.85,3.69,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2156,-inf,0.0,345,0.0,50,True,20,0.54,True,6,12,16,16,3,8,21,1,14,2.13,4.33,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2157,-inf,0.0,0,0.0,100,True,20,0.56,False,6,13,14,15,3,8,21,2,14,1.94,5.42,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2158,-inf,0.0,206,0.0,100,True,24,0.54,True,6,13,16,15,2,8,21,1,14,1.95,3.86,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2159,-inf,0.0,191,0.0,50,True,24,0.63,False,6,12,15,16,2,8,21,1,14,1.64,5.32,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2160,-inf,0.0,228,0.0,50,True,24,0.52,False,6,12,14,15,3,8,21,1,14,1.67,3.89,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2161,-inf,0.0,0,0.0,50,True,20,0.64,False,6,12,15,16,3,8,21,2,14,1.97,5.08,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2162,-inf,0.0,194,0.0,100,True,24,0.6,False,6,13,16,15,3,8,21,1,14,2.16,3.77,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2163,-inf,0.0,0,0.0,50,True,20,0.61,False,6,13,15,16,2,8,21,2,14,1.97,4.83,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2164,-inf,0.0,275,0.0,50,True,20,0.54,False,6,13,14,15,3,8,21,1,14,2.1,3.84,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2165,-inf,0.0,160,0.0,100,True,20,0.66,False,6,12,15,16,3,8,21,1,14,1.89,4.62,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2166,-inf,0.0,214,0.0,50,True,24,0.67,True,6,13,16,15,2,8,21,1,14,2.06,4.79,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2167,-inf,0.0,152,0.0,50,True,20,0.7,False,6,12,16,15,2,8,21,1,14,1.73,5.47,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2168,-inf,0.0,302,0.0,50,True,16,0.52,False,6,13,16,15,2,8,21,1,14,2.01,5.17,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2169,-inf,0.0,185,0.0,50,True,24,0.57,False,6,13,16,16,2,8,21,1,14,2.02,5.31,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2170,-inf,0.0,242,0.0,50,True,16,0.6,False,6,12,16,15,2,8,21,1,14,2.07,5.28,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2171,-inf,0.0,200,0.0,100,True,16,0.67,True,6,13,16,15,3,8,21,1,14,2.12,5.3,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2172,-inf,0.0,97,0.0,50,True,24,0.54,True,6,12,16,16,2,8,21,2,14,1.96,4.22,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2173,-inf,0.0,231,0.0,100,True,20,0.55,False,6,13,14,15,2,8,21,1,14,2.14,5.1,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2174,-inf,0.0,0,0.0,100,True,24,0.51,False,6,13,15,16,2,8,21,2,14,1.77,4.96,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2175,-inf,0.0,343,0.0,50,True,24,0.52,False,6,12,15,15,3,8,21,1,14,1.9,3.63,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2176,-inf,0.0,122,0.0,100,True,16,0.69,False,6,12,15,15,2,8,21,1,14,1.99,4.91,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2177,-inf,0.0,107,0.0,50,True,20,0.53,True,6,12,16,16,2,8,21,2,14,1.97,5.26,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2178,-inf,0.0,301,0.0,50,True,20,0.63,True,6,12,16,15,3,8,21,1,14,1.79,3.53,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2179,-inf,0.0,0,0.0,100,True,20,0.55,False,6,13,14,15,2,8,21,2,14,1.77,5.12,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2180,-inf,0.0,215,0.0,100,True,20,0.58,True,6,12,16,16,2,8,21,1,14,1.85,4.05,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2181,-inf,0.0,265,0.0,100,True,16,0.56,False,6,12,16,15,2,8,21,1,14,1.62,4.12,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2182,-inf,0.0,185,0.0,100,True,20,0.7,True,6,12,15,15,2,8,21,1,14,1.99,4.14,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2183,-inf,0.0,206,0.0,100,True,16,0.65,True,6,12,16,15,2,8,21,1,14,1.83,4.26,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2184,-inf,0.0,230,0.0,100,True,24,0.53,True,6,13,14,15,3,8,21,1,14,1.94,3.69,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2185,-inf,0.0,214,0.0,50,True,24,0.64,True,6,13,14,16,2,8,21,1,14,1.6,4.35,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2186,-inf,0.0,252,0.0,50,True,20,0.58,True,6,13,16,15,2,8,21,1,14,1.73,4.24,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2187,-inf,0.0,147,0.0,100,True,20,0.68,False,6,12,16,16,3,8,21,1,14,1.71,4.0,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2188,-inf,0.0,126,0.0,100,True,24,0.69,False,6,13,14,16,3,8,21,1,14,1.8,5.17,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2189,-inf,0.0,0,0.0,50,True,24,0.63,False,6,13,15,15,2,8,21,2,14,1.86,5.31,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2190,-inf,0.0,311,0.0,100,True,16,0.56,True,6,13,15,16,2,8,21,1,14,1.87,5.11,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2191,-inf,0.0,166,0.0,50,True,16,0.65,False,6,13,14,16,2,8,21,1,14,2.19,4.98,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2192,-inf,0.0,157,0.0,100,True,24,0.58,False,6,13,15,16,3,8,21,1,14,1.85,3.71,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2193,-inf,0.0,271,0.0,50,True,20,0.62,True,6,13,16,16,2,8,21,1,14,1.62,5.02,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2194,-inf,0.0,195,0.0,100,True,16,0.57,False,6,13,15,16,3,8,21,1,14,1.99,3.65,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2195,-inf,0.0,0,0.0,100,True,16,0.64,False,6,13,16,16,3,8,21,2,14,2.13,4.87,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2196,-inf,0.0,181,0.0,50,True,20,0.62,False,6,13,14,16,3,8,21,1,14,1.99,5.06,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2197,-inf,0.0,106,0.0,50,True,20,0.57,True,6,12,16,16,2,8,21,2,14,1.86,4.44,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2198,-inf,0.0,237,0.0,50,True,20,0.66,True,6,13,14,15,3,8,21,1,14,2.19,4.86,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2199,-inf,0.0,0,0.0,100,True,24,0.7,False,6,12,15,16,2,8,21,2,14,1.85,5.01,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2200,-inf,0.0,226,0.0,100,True,24,0.55,False,6,12,16,16,2,8,21,1,14,1.91,3.94,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2201,-inf,0.0,275,0.0,50,True,16,0.67,True,6,13,16,16,3,8,21,1,14,2.18,4.72,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2202,-inf,0.0,136,0.0,100,True,24,0.68,False,6,12,16,16,3,8,21,1,14,1.91,5.02,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2203,-inf,0.0,216,0.0,100,True,20,0.58,True,6,12,16,16,2,8,21,1,14,1.78,4.06,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2204,-inf,0.0,0,0.0,100,True,20,0.6,False,6,12,14,15,2,8,21,2,14,2.18,3.89,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2205,-inf,0.0,281,0.0,100,True,16,0.6,True,6,13,14,15,3,8,21,1,14,1.77,4.21,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2206,-inf,0.0,101,0.0,50,True,24,0.58,True,6,13,14,16,3,8,21,2,14,1.79,3.58,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2207,-inf,0.0,0,0.0,100,True,20,0.55,False,6,13,16,16,3,8,21,2,14,1.74,4.07,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2208,-inf,0.0,255,0.0,100,True,16,0.62,True,6,13,16,16,3,8,21,1,14,2.18,5.07,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2209,-inf,0.0,157,0.0,100,True,20,0.61,False,6,12,15,15,2,8,21,1,14,1.85,4.21,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2210,-inf,0.0,94,0.0,100,True,20,0.54,True,6,12,15,16,2,8,21,2,14,2.07,3.62,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2211,-inf,0.0,188,0.0,50,True,24,0.64,False,6,12,15,16,3,8,21,1,14,2.04,3.8,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2212,-inf,0.0,234,0.0,100,True,20,0.55,False,6,13,15,15,3,8,21,1,14,2.15,5.23,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2213,-inf,0.0,107,0.0,100,True,16,0.63,True,6,12,15,16,2,8,21,2,14,2.04,3.64,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2214,-inf,0.0,102,0.0,100,True,24,0.7,False,6,13,14,15,3,8,21,1,14,2.2,3.67,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2215,-inf,0.0,229,0.0,100,True,24,0.54,False,6,13,15,16,2,8,21,1,14,2.04,4.44,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2216,-inf,0.0,192,0.0,100,True,24,0.6,True,6,13,16,16,3,8,21,1,14,2.0,5.22,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2217,-inf,0.0,0,0.0,50,True,24,0.62,False,6,12,15,16,3,8,21,2,14,1.95,3.53,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2218,-inf,0.0,277,0.0,50,True,20,0.64,True,6,12,14,15,2,8,21,1,14,1.85,4.07,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2219,-inf,0.0,144,0.0,100,True,20,0.64,False,6,12,14,15,3,8,21,1,14,1.81,3.93,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2220,-inf,0.0,0,0.0,100,True,20,0.51,False,6,13,15,15,2,8,21,2,14,1.95,3.68,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2221,-inf,0.0,206,0.0,100,True,16,0.55,False,6,13,14,15,2,8,21,1,14,1.96,4.06,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2222,-inf,0.0,252,0.0,50,True,24,0.55,False,6,12,15,15,3,8,21,1,14,1.79,5.23,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2223,-inf,0.0,308,0.0,100,True,16,0.54,True,6,13,14,15,2,8,21,1,14,1.81,4.25,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2224,-inf,0.0,0,0.0,100,True,24,0.66,False,6,12,16,16,2,8,21,2,14,1.67,4.6,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2225,-inf,0.0,267,0.0,50,True,24,0.6,True,6,12,16,16,3,8,21,1,14,2.08,5.18,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2226,-inf,0.0,94,0.0,100,True,20,0.65,True,6,12,16,15,2,8,21,2,14,1.73,4.56,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2227,-inf,0.0,302,0.0,50,True,24,0.51,True,6,12,15,16,2,8,21,1,14,1.68,4.71,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2228,-inf,0.0,0,0.0,50,True,16,0.64,False,6,13,16,15,2,8,21,2,14,2.04,3.7,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2229,-inf,0.0,123,0.0,100,True,16,0.59,True,6,13,14,15,3,8,21,2,14,1.84,3.89,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2230,-inf,0.0,282,0.0,100,True,20,0.54,True,6,12,15,15,2,8,21,1,14,1.64,4.11,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2231,-inf,0.0,85,0.0,100,True,24,0.52,True,6,12,16,16,3,8,21,2,14,1.93,4.83,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2232,-inf,0.0,128,0.0,100,True,20,0.65,False,6,12,16,16,3,8,21,1,14,1.67,4.62,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2233,-inf,0.0,333,0.0,50,True,16,0.58,False,6,13,14,15,3,8,21,1,14,2.01,5.37,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2234,-inf,0.0,133,0.0,50,True,20,0.69,False,6,13,16,15,2,8,21,1,14,2.14,5.28,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2235,-inf,0.0,141,0.0,50,True,16,0.63,True,6,12,15,15,3,8,21,2,14,2.16,3.8,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2236,-inf,0.0,134,0.0,100,True,20,0.69,False,6,12,16,16,3,8,21,1,14,1.62,3.89,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2237,-inf,0.0,296,0.0,50,True,24,0.5,False,6,12,14,16,3,8,21,1,14,2.06,4.6,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2238,-inf,0.0,128,0.0,50,True,16,0.53,True,6,13,15,16,3,8,21,2,14,1.68,5.11,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2239,-inf,0.0,375,0.0,50,True,16,0.62,True,6,13,15,15,2,8,21,1,14,2.01,4.52,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2240,-inf,0.0,0,0.0,50,True,24,0.69,False,6,12,15,15,3,8,21,2,14,1.62,5.08,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2241,-inf,0.0,0,0.0,50,True,20,0.66,False,6,13,15,16,3,8,21,2,14,2.19,5.43,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2242,-inf,0.0,163,0.0,50,True,20,0.67,False,6,13,15,16,2,8,21,1,14,1.66,4.28,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2243,-inf,0.0,211,0.0,100,True,16,0.54,False,6,13,16,16,3,8,21,1,14,2.02,5.32,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2244,-inf,0.0,122,0.0,50,True,16,0.54,True,6,13,16,15,2,8,21,2,14,1.61,3.68,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2245,-inf,0.0,185,0.0,50,True,24,0.58,False,6,13,16,16,3,8,21,1,14,2.05,4.73,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2246,-inf,0.0,0,0.0,50,True,16,0.57,False,6,13,16,15,2,8,21,2,14,1.94,4.12,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2247,-inf,0.0,256,0.0,50,True,20,0.59,True,6,13,14,16,3,8,21,1,14,1.94,4.68,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2248,-inf,0.0,93,0.0,100,True,20,0.54,True,6,13,16,15,2,8,21,2,14,2.04,4.49,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2249,-inf,0.0,144,0.0,100,True,24,0.61,False,6,13,15,15,2,8,21,1,14,2.06,5.38,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2250,-inf,0.0,283,0.0,50,True,16,0.61,True,6,12,14,15,2,8,21,1,14,1.82,3.58,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2251,-inf,0.0,0,0.0,100,True,20,0.61,False,6,13,15,16,3,8,21,2,14,1.61,5.4,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2252,-inf,0.0,173,0.0,50,True,20,0.69,False,6,13,16,16,3,8,21,1,14,1.65,4.21,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2253,-inf,0.0,0,0.0,100,True,20,0.68,False,6,12,16,16,3,8,21,2,14,2.03,5.43,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2254,-inf,0.0,162,0.0,50,True,24,0.63,False,6,12,15,16,3,8,21,1,14,2.1,4.8,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2255,-inf,0.0,273,0.0,100,True,20,0.55,True,6,13,16,16,3,8,21,1,14,1.64,4.22,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2256,-inf,0.0,0,0.0,100,True,16,0.62,False,6,13,14,15,2,8,21,2,14,2.17,4.2,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2257,-inf,0.0,128,0.0,50,True,16,0.58,True,6,12,14,16,3,8,21,2,14,1.98,3.85,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2258,-inf,0.0,249,0.0,50,True,24,0.56,True,6,13,16,15,3,8,21,1,14,1.85,3.6,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2259,-inf,0.0,204,0.0,100,True,20,0.63,True,6,12,16,15,3,8,21,1,14,2.08,3.89,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2260,-inf,0.0,0,0.0,50,True,16,0.67,False,6,12,15,15,3,8,21,2,14,1.84,5.47,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2261,-inf,0.0,231,0.0,100,True,20,0.55,False,6,12,15,15,2,8,21,1,14,1.62,5.28,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2262,-inf,0.0,126,0.0,100,True,24,0.64,False,6,12,14,16,2,8,21,1,14,2.16,5.21,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2263,-inf,0.0,122,0.0,50,True,16,0.62,True,6,13,15,16,2,8,21,2,14,1.82,3.59,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2264,-inf,0.0,196,0.0,100,True,24,0.68,True,6,12,14,16,3,8,21,1,14,2.12,4.6,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2265,-inf,0.0,245,0.0,100,True,16,0.58,True,6,13,15,16,3,8,21,1,14,2.05,3.51,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2266,-inf,0.0,215,0.0,50,True,20,0.67,True,6,12,16,15,3,8,21,1,14,1.82,3.64,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2267,-inf,0.0,206,0.0,100,True,20,0.52,False,6,12,15,15,2,8,21,1,14,2.15,4.74,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2268,-inf,0.0,179,0.0,50,True,24,0.66,False,6,13,15,16,3,8,21,1,14,1.81,5.06,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2269,-inf,0.0,194,0.0,100,True,16,0.57,False,6,13,16,15,3,8,21,1,14,2.19,4.36,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2270,-inf,0.0,0,0.0,100,True,16,0.57,False,6,12,14,15,3,8,21,2,14,2.12,3.61,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2271,-inf,0.0,176,0.0,50,True,20,0.67,False,6,12,15,16,3,8,21,1,14,2.2,4.83,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2272,-inf,0.0,0,0.0,100,True,24,0.55,False,6,12,15,16,2,8,21,2,14,1.64,5.29,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2273,-inf,0.0,219,0.0,100,True,16,0.53,False,6,13,16,16,3,8,21,1,14,1.66,4.19,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2274,-inf,0.0,256,0.0,100,True,20,0.52,False,6,13,15,15,3,8,21,1,14,1.74,3.79,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2275,-inf,0.0,237,0.0,100,True,24,0.5,False,6,13,16,16,3,8,21,1,14,2.16,3.7,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2276,-inf,0.0,189,0.0,50,True,16,0.66,False,6,12,14,16,2,8,21,1,14,1.73,4.97,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2277,-inf,0.0,0,0.0,100,True,16,0.56,False,6,12,15,16,3,8,21,2,14,2.03,4.01,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2278,-inf,0.0,88,0.0,100,True,24,0.66,True,6,13,14,16,3,8,21,2,14,1.8,3.58,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2279,-inf,0.0,234,0.0,100,True,20,0.57,False,6,12,14,16,2,8,21,1,14,1.97,4.28,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2280,-inf,0.0,202,0.0,100,True,20,0.62,True,6,12,14,16,2,8,21,1,14,1.88,5.08,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2281,-inf,0.0,124,0.0,50,True,20,0.61,True,6,13,15,15,3,8,21,2,14,1.69,5.0,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2282,-inf,0.0,214,0.0,50,True,24,0.61,False,6,13,15,15,3,8,21,1,14,2.07,4.47,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2283,-inf,0.0,224,0.0,100,True,24,0.61,False,6,12,15,15,3,8,21,1,14,1.68,4.58,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2284,-inf,0.0,291,0.0,50,True,16,0.66,True,6,12,16,15,2,8,21,1,14,1.71,4.71,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2285,-inf,0.0,255,0.0,100,True,24,0.56,True,6,13,15,15,3,8,21,1,14,2.03,4.95,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2286,-inf,0.0,241,0.0,50,True,24,0.55,True,6,12,16,15,2,8,21,1,14,2.0,3.96,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2287,-inf,0.0,221,0.0,100,True,20,0.61,True,6,13,14,15,3,8,21,1,14,2.17,4.84,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2288,-inf,0.0,88,0.0,100,True,24,0.69,True,6,12,16,16,3,8,21,2,14,1.66,5.12,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2289,-inf,0.0,302,0.0,50,True,16,0.52,True,6,13,14,16,2,8,21,1,14,1.95,5.08,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2290,-inf,0.0,0,0.0,50,True,20,0.66,False,6,13,15,16,3,8,21,2,14,1.98,4.26,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2291,-inf,0.0,0,0.0,50,True,16,0.57,False,6,13,15,15,2,8,21,2,14,1.66,5.04,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2292,-inf,0.0,211,0.0,100,True,16,0.54,False,6,12,16,15,3,8,21,1,14,1.63,4.61,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2293,-inf,0.0,0,0.0,50,True,24,0.62,False,6,13,16,16,2,8,21,2,14,2.07,4.06,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2294,-inf,0.0,244,0.0,100,True,20,0.63,True,6,12,14,16,2,8,21,1,14,1.75,4.03,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2295,-inf,0.0,136,0.0,50,True,16,0.59,True,6,13,14,15,2,8,21,2,14,1.89,5.06,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2296,-inf,0.0,234,0.0,100,True,16,0.65,True,6,13,16,16,3,8,21,1,14,2.18,3.97,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2297,-inf,0.0,97,0.0,50,True,24,0.62,True,6,13,15,16,2,8,21,2,14,1.85,5.42,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2298,-inf,0.0,0,0.0,50,True,20,0.61,False,6,12,16,16,2,8,21,2,14,1.83,4.65,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2299,-inf,0.0,179,0.0,50,True,20,0.67,False,6,13,15,16,3,8,21,1,14,1.67,4.73,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2300,-inf,0.0,82,0.0,100,True,24,0.68,True,6,12,15,16,2,8,21,2,14,2.03,5.0,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2301,-inf,0.0,106,0.0,50,True,20,0.53,True,6,13,16,15,2,8,21,2,14,1.64,5.23,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2302,-inf,0.0,413,0.0,50,True,16,0.58,True,6,13,15,15,3,8,21,1,14,1.71,5.42,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2303,-inf,0.0,228,0.0,50,True,24,0.68,True,6,13,14,16,2,8,21,1,14,1.7,4.35,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2304,-inf,0.0,223,0.0,100,True,20,0.66,True,6,12,16,15,2,8,21,1,14,1.93,5.01,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2305,-inf,0.0,337,0.0,50,True,16,0.58,False,6,12,15,15,3,8,21,1,14,1.8,4.01,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2306,-inf,0.0,276,0.0,100,True,16,0.51,True,6,12,15,15,2,8,21,1,14,2.15,3.99,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2307,-inf,0.0,160,0.0,100,True,20,0.6,False,6,12,14,16,3,8,21,1,14,1.9,4.49,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2308,-inf,0.0,343,0.0,50,True,16,0.51,False,6,13,14,16,2,8,21,1,14,1.75,5.37,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2309,-inf,0.0,121,0.0,100,True,16,0.69,False,6,12,16,16,2,8,21,1,14,1.87,4.62,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2310,-inf,0.0,168,0.0,100,True,20,0.59,False,6,12,14,16,3,8,21,1,14,1.79,5.38,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2311,-inf,0.0,206,0.0,100,True,24,0.63,True,6,12,16,16,2,8,21,1,14,1.74,3.85,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2312,-inf,0.0,112,0.0,100,True,20,0.68,False,6,13,15,15,2,8,21,1,14,1.93,5.29,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2313,-inf,0.0,159,0.0,100,True,24,0.67,False,6,12,14,15,3,8,21,1,14,1.61,4.18,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2314,-inf,0.0,216,0.0,100,True,16,0.59,False,6,13,15,16,2,8,21,1,14,1.66,4.47,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2315,-inf,0.0,146,0.0,100,True,20,0.68,False,6,13,16,16,3,8,21,1,14,1.88,4.52,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2316,-inf,0.0,112,0.0,50,True,20,0.64,True,6,13,16,16,3,8,21,2,14,1.61,3.91,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2317,-inf,0.0,0,0.0,100,True,24,0.58,False,6,13,14,16,3,8,21,2,14,1.95,4.69,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2318,-inf,0.0,106,0.0,100,True,16,0.54,True,6,13,16,16,2,8,21,2,14,2.06,4.39,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2319,-inf,0.0,197,0.0,100,True,24,0.57,True,6,12,16,16,2,8,21,1,14,1.73,4.44,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2320,-inf,0.0,319,0.0,100,True,16,0.63,True,6,12,15,15,3,8,21,1,14,1.68,4.69,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2321,-inf,0.0,347,0.0,50,True,20,0.61,True,6,13,14,15,2,8,21,1,14,2.01,5.05,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2322,-inf,0.0,220,0.0,50,True,24,0.62,True,6,13,15,16,2,8,21,1,14,2.09,5.28,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2323,-inf,0.0,243,0.0,100,True,24,0.55,True,6,13,16,16,2,8,21,1,14,1.8,4.58,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2324,-inf,0.0,282,0.0,50,True,24,0.56,True,6,13,14,16,2,8,21,1,14,2.07,5.22,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2325,-inf,0.0,240,0.0,100,True,20,0.61,False,6,12,14,15,2,8,21,1,14,1.7,4.2,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2326,-inf,0.0,228,0.0,50,True,20,0.55,False,6,13,15,15,3,8,21,1,14,2.08,4.46,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2327,-inf,0.0,289,0.0,100,True,24,0.58,True,6,12,14,15,2,8,21,1,14,1.75,3.65,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2328,-inf,0.0,0,0.0,50,True,24,0.69,False,6,13,15,15,2,8,21,2,14,2.09,4.63,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2329,-inf,0.0,200,0.0,100,True,16,0.67,True,6,13,14,16,3,8,21,1,14,1.7,5.13,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2330,-inf,0.0,0,0.0,100,True,20,0.56,False,6,12,14,15,2,8,21,2,14,1.93,3.51,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2331,-inf,0.0,215,0.0,100,True,16,0.64,True,6,13,15,16,2,8,21,1,14,2.16,3.79,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2332,-inf,0.0,238,0.0,50,True,16,0.64,False,6,13,15,16,3,8,21,1,14,1.84,4.56,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2333,-inf,0.0,178,0.0,50,True,16,0.67,False,6,13,15,15,3,8,21,1,14,1.99,3.54,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2334,-inf,0.0,172,0.0,50,True,20,0.64,False,6,13,15,15,2,8,21,1,14,2.12,4.3,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2335,-inf,0.0,212,0.0,100,True,20,0.65,True,6,12,14,16,3,8,21,1,14,2.14,4.88,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2336,-inf,0.0,276,0.0,50,True,20,0.51,True,6,13,15,16,2,8,21,1,14,1.68,4.47,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2337,-inf,0.0,0,0.0,100,True,24,0.64,False,6,12,14,16,2,8,21,2,14,1.66,4.36,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2338,-inf,0.0,192,0.0,50,True,16,0.62,False,6,12,16,15,2,8,21,1,14,2.11,3.81,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2339,-inf,0.0,319,0.0,100,True,16,0.55,True,6,13,14,16,2,8,21,1,14,1.95,4.51,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2340,-inf,0.0,127,0.0,100,True,24,0.69,False,6,13,14,15,3,8,21,1,14,2.08,4.79,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2341,-inf,0.0,188,0.0,50,True,16,0.68,False,6,13,15,16,2,8,21,1,14,2.15,4.1,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2342,-inf,0.0,182,0.0,100,True,16,0.58,False,6,12,16,15,2,8,21,1,14,1.78,4.65,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2343,-inf,0.0,164,0.0,100,True,16,0.65,False,6,13,15,15,3,8,21,1,14,1.71,4.11,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2344,-inf,0.0,126,0.0,100,True,24,0.68,False,6,12,16,16,3,8,21,1,14,1.67,5.31,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2345,-inf,0.0,212,0.0,50,True,24,0.67,True,6,12,16,15,2,8,21,1,14,2.16,4.79,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2346,-inf,0.0,0,0.0,50,True,20,0.59,False,6,12,16,15,2,8,21,2,14,1.77,4.7,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2347,-inf,0.0,292,0.0,100,True,20,0.55,False,6,12,15,15,3,8,21,1,14,2.02,5.44,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2348,-inf,0.0,104,0.0,100,True,20,0.62,True,6,12,15,15,2,8,21,2,14,2.06,4.94,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2349,-inf,0.0,364,0.0,50,True,16,0.64,True,6,13,14,15,2,8,21,1,14,1.71,3.86,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2350,-inf,0.0,0,0.0,100,True,20,0.69,False,6,13,16,15,2,8,21,2,14,1.64,4.03,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2351,-inf,0.0,0,0.0,50,True,20,0.62,False,6,13,15,15,2,8,21,2,14,1.92,3.98,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2352,-inf,0.0,0,0.0,100,True,24,0.58,False,6,13,14,16,2,8,21,2,14,1.61,3.84,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2353,-inf,0.0,104,0.0,100,True,20,0.65,True,6,13,15,15,2,8,21,2,14,1.72,4.71,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2354,-inf,0.0,226,0.0,50,True,24,0.69,True,6,13,15,16,3,8,21,1,14,2.12,4.79,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2355,-inf,0.0,184,0.0,100,True,24,0.6,False,6,13,15,15,3,8,21,1,14,1.98,3.75,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2356,-inf,0.0,101,0.0,50,True,24,0.64,True,6,13,15,16,3,8,21,2,14,1.73,3.89,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2357,-inf,0.0,236,0.0,100,True,24,0.5,False,6,12,16,15,3,8,21,1,14,1.91,4.62,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2358,-inf,0.0,380,0.0,100,True,16,0.55,True,6,12,14,15,3,8,21,1,14,1.77,4.0,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2359,-inf,0.0,140,0.0,50,True,16,0.7,False,6,13,14,15,2,8,21,1,14,2.05,5.37,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2360,-inf,0.0,229,0.0,100,True,16,0.64,False,6,12,14,15,2,8,21,1,14,1.63,5.33,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2361,-inf,0.0,207,0.0,50,True,16,0.66,False,6,12,14,16,2,8,21,1,14,2.17,4.15,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2362,-inf,0.0,172,0.0,100,True,24,0.7,True,6,13,14,15,3,8,21,1,14,1.84,3.64,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2363,-inf,0.0,307,0.0,50,True,20,0.66,True,6,12,15,15,2,8,21,1,14,2.06,3.65,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2364,-inf,0.0,106,0.0,100,True,16,0.57,True,6,13,16,16,2,8,21,2,14,2.03,4.44,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2365,-inf,0.0,104,0.0,100,True,20,0.57,True,6,13,15,15,2,8,21,2,14,1.98,3.76,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2366,-inf,0.0,175,0.0,50,True,16,0.67,False,6,12,16,16,2,8,21,1,14,2.0,5.25,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2367,-inf,0.0,245,0.0,100,True,16,0.56,True,6,12,15,16,2,8,21,1,14,1.62,3.81,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2368,-inf,0.0,171,0.0,100,True,24,0.66,False,6,13,15,15,3,8,21,1,14,2.01,4.89,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2369,-inf,0.0,289,0.0,50,True,24,0.65,True,6,12,14,15,3,8,21,1,14,2.04,5.2,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2370,-inf,0.0,112,0.0,50,True,20,0.67,True,6,12,14,16,3,8,21,2,14,1.67,5.38,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2371,-inf,0.0,0,0.0,50,True,20,0.69,False,6,13,14,16,3,8,21,2,14,1.63,4.2,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2372,-inf,0.0,237,0.0,100,True,20,0.7,True,6,13,15,15,2,8,21,1,14,1.89,3.81,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2373,-inf,0.0,256,0.0,50,True,24,0.63,True,6,13,15,15,2,8,21,1,14,1.73,4.34,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2374,-inf,0.0,99,0.0,50,True,24,0.64,True,6,12,14,16,3,8,21,2,14,2.06,4.67,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2375,-inf,0.0,243,0.0,50,True,24,0.55,False,6,12,15,16,2,8,21,1,14,1.83,4.03,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2376,-inf,0.0,184,0.0,100,True,24,0.6,False,6,13,15,15,3,8,21,1,14,2.14,3.67,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2377,-inf,0.0,228,0.0,100,True,16,0.57,False,6,13,14,16,2,8,21,1,14,1.9,5.33,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2378,-inf,0.0,216,0.0,50,True,24,0.69,True,6,12,14,16,3,8,21,1,14,1.8,5.08,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2379,-inf,0.0,96,0.0,100,True,20,0.66,True,6,12,14,16,3,8,21,2,14,1.93,3.72,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2380,-inf,0.0,264,0.0,50,True,20,0.56,False,6,12,14,15,2,8,21,1,14,2.0,3.78,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2381,-inf,0.0,104,0.0,100,True,20,0.5,True,6,13,15,15,2,8,21,2,14,1.94,5.34,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2382,-inf,0.0,250,0.0,100,True,20,0.63,True,6,13,14,16,3,8,21,1,14,1.84,3.53,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2383,-inf,0.0,388,0.0,50,True,24,0.51,True,6,12,15,15,3,8,21,1,14,1.97,4.74,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2384,-inf,0.0,105,0.0,100,True,24,0.69,False,6,12,15,16,3,8,21,1,14,1.85,4.27,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2385,-inf,0.0,314,0.0,100,True,24,0.54,True,6,13,14,15,3,8,21,1,14,1.87,4.15,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2386,-inf,0.0,383,0.0,50,True,16,0.53,True,6,12,14,16,2,8,21,1,14,1.83,4.44,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2387,-inf,0.0,233,0.0,100,True,16,0.63,True,6,13,14,15,2,8,21,1,14,1.64,4.31,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2388,-inf,0.0,351,0.0,50,True,16,0.54,True,6,13,16,16,3,8,21,1,14,1.98,3.57,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2389,-inf,0.0,335,0.0,50,True,20,0.52,True,6,13,15,16,3,8,21,1,14,1.78,3.53,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2390,-inf,0.0,245,0.0,50,True,20,0.61,False,6,12,16,15,2,8,21,1,14,1.74,3.65,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2391,-inf,0.0,128,0.0,50,True,16,0.67,True,6,12,16,15,3,8,21,2,14,1.83,4.67,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2392,-inf,0.0,143,0.0,50,True,24,0.65,False,6,12,15,15,2,8,21,1,14,1.87,5.07,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2393,-inf,0.0,142,0.0,50,True,16,0.66,True,6,13,15,15,3,8,21,2,14,1.89,4.62,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2394,-inf,0.0,196,0.0,100,True,16,0.69,True,6,13,14,16,2,8,21,1,14,2.05,4.53,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2395,-inf,0.0,236,0.0,50,True,20,0.5,False,6,12,16,15,2,8,21,1,14,1.98,4.39,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2396,-inf,0.0,390,0.0,50,True,20,0.56,True,6,13,15,15,3,8,21,1,14,2.08,5.31,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2397,-inf,0.0,136,0.0,100,True,24,0.66,False,6,12,14,15,2,8,21,1,14,1.76,5.11,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2398,-inf,0.0,304,0.0,100,True,20,0.53,True,6,13,15,16,3,8,21,1,14,1.87,4.04,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2399,-inf,0.0,0,0.0,100,True,20,0.55,False,6,12,16,15,2,8,21,2,14,1.66,3.96,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2400,-inf,0.0,257,0.0,100,True,16,0.54,False,6,13,14,15,3,8,21,1,14,1.73,4.35,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2401,-inf,0.0,256,0.0,50,True,16,0.64,True,6,13,15,16,2,8,21,1,14,2.01,3.57,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2402,-inf,0.0,218,0.0,100,True,24,0.57,False,6,12,14,16,2,8,21,1,14,1.62,5.36,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2403,-inf,0.0,0,0.0,100,True,20,0.56,False,6,13,16,16,3,8,21,2,14,1.98,5.13,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2404,-inf,0.0,324,0.0,100,True,24,0.51,True,6,12,15,15,2,8,21,1,14,2.15,4.41,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2405,-inf,0.0,242,0.0,50,True,20,0.6,True,6,13,15,16,2,8,21,1,14,2.09,5.37,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2406,-inf,0.0,252,0.0,50,True,16,0.69,True,6,13,14,16,2,8,21,1,14,1.77,3.55,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2407,-inf,0.0,209,0.0,100,True,20,0.52,False,6,13,16,16,3,8,21,1,14,1.74,3.97,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2408,-inf,0.0,0,0.0,100,True,24,0.61,False,6,13,15,15,2,8,21,2,14,2.19,4.46,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2409,-inf,0.0,241,0.0,50,True,24,0.55,True,6,12,14,16,2,8,21,1,14,1.98,5.46,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2410,-inf,0.0,198,0.0,100,True,24,0.52,False,6,13,14,15,3,8,21,1,14,2.18,5.24,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2411,-inf,0.0,309,0.0,50,True,20,0.6,True,6,12,16,16,3,8,21,1,14,2.18,3.99,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2412,-inf,0.0,112,0.0,100,True,24,0.66,False,6,12,15,15,2,8,21,1,14,1.95,5.08,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2413,-inf,0.0,111,0.0,100,True,20,0.69,False,6,12,15,16,2,8,21,1,14,2.12,5.15,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2414,-inf,0.0,272,0.0,50,True,16,0.68,True,6,13,14,16,2,8,21,1,14,2.02,4.67,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2415,-inf,0.0,168,0.0,100,True,20,0.58,False,6,12,16,16,2,8,21,1,14,2.16,4.83,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2416,-inf,0.0,107,0.0,100,True,20,0.6,True,6,12,15,15,3,8,21,2,14,2.1,3.7,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2417,-inf,0.0,266,0.0,100,True,24,0.62,True,6,13,15,15,2,8,21,1,14,1.61,5.35,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2418,-inf,0.0,323,0.0,50,True,16,0.63,True,6,12,14,16,3,8,21,1,14,1.85,5.19,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2419,-inf,0.0,190,0.0,100,True,20,0.69,True,6,12,14,15,2,8,21,1,14,2.0,4.61,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2420,-inf,0.0,162,0.0,50,True,24,0.67,False,6,12,16,16,3,8,21,1,14,1.72,5.36,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2421,-inf,0.0,81,0.0,100,True,24,0.55,True,6,13,16,16,2,8,21,2,14,2.2,5.21,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2422,-inf,0.0,224,0.0,100,True,16,0.62,True,6,12,16,15,2,8,21,1,14,1.85,5.0,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2423,-inf,0.0,201,0.0,100,True,20,0.52,False,6,12,16,15,2,8,21,1,14,1.71,4.02,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2424,-inf,0.0,271,0.0,100,True,24,0.55,True,6,13,16,15,3,8,21,1,14,1.86,3.53,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2425,-inf,0.0,106,0.0,50,True,24,0.63,True,6,12,15,15,2,8,21,2,14,2.08,5.11,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2426,-inf,0.0,217,0.0,100,True,24,0.55,False,6,13,14,15,3,8,21,1,14,2.14,4.33,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2427,-inf,0.0,239,0.0,100,True,24,0.6,True,6,13,16,16,2,8,21,1,14,1.64,5.07,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2428,-inf,0.0,275,0.0,50,True,20,0.55,True,6,13,16,16,3,8,21,1,14,2.1,4.13,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2429,-inf,0.0,224,0.0,50,True,24,0.68,True,6,13,16,16,2,8,21,1,14,2.15,4.65,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2430,-inf,0.0,172,0.0,50,True,24,0.65,False,6,12,15,15,2,8,21,1,14,1.71,4.95,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2431,-inf,0.0,0,0.0,50,True,16,0.53,False,6,13,14,15,2,8,21,2,14,1.79,4.82,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2432,-inf,0.0,0,0.0,100,True,20,0.65,False,6,12,16,16,3,8,21,2,14,1.79,4.19,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2433,-inf,0.0,0,0.0,50,True,20,0.64,False,6,12,14,15,3,8,21,2,14,1.73,4.28,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2434,-inf,0.0,265,0.0,50,True,24,0.61,True,6,13,15,16,3,8,21,1,14,1.66,4.23,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2435,-inf,0.0,292,0.0,50,True,16,0.54,True,6,12,15,16,2,8,21,1,14,2.05,4.52,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2436,-inf,0.0,254,0.0,50,True,24,0.55,True,6,13,14,15,2,8,21,1,14,2.13,4.87,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2437,-inf,0.0,297,0.0,50,True,16,0.53,False,6,12,16,16,3,8,21,1,14,1.93,3.8,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2438,-inf,0.0,0,0.0,50,True,16,0.51,False,6,12,16,16,2,8,21,2,14,1.88,5.16,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2439,-inf,0.0,215,0.0,50,True,20,0.62,False,6,12,16,16,3,8,21,1,14,1.69,4.96,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2440,-inf,0.0,119,0.0,100,True,16,0.64,True,6,12,15,15,2,8,21,2,14,1.67,4.11,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2441,-inf,0.0,343,0.0,50,True,16,0.59,True,6,12,16,15,2,8,21,1,14,1.85,5.49,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2442,-inf,0.0,114,0.0,50,True,20,0.51,True,6,12,16,15,3,8,21,2,14,1.69,5.14,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2443,-inf,0.0,94,0.0,100,True,20,0.66,True,6,13,16,15,2,8,21,2,14,1.67,4.33,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2444,-inf,0.0,164,0.0,50,True,20,0.67,False,6,13,16,16,3,8,21,1,14,1.75,5.22,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2445,-inf,0.0,248,0.0,100,True,20,0.51,True,6,13,14,16,3,8,21,1,14,1.95,3.51,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2446,-inf,0.0,121,0.0,100,True,20,0.66,False,6,12,14,16,2,8,21,1,14,1.84,3.79,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2447,-inf,0.0,330,0.0,50,True,24,0.5,True,6,13,14,15,3,8,21,1,14,1.79,3.54,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2448,-inf,0.0,295,0.0,100,True,16,0.65,True,6,12,15,15,3,8,21,1,14,1.7,3.99,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2449,-inf,0.0,251,0.0,50,True,20,0.6,True,6,13,16,16,3,8,21,1,14,1.81,4.04,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2450,-inf,0.0,209,0.0,100,True,20,0.7,True,6,13,16,15,3,8,21,1,14,2.06,3.67,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2451,-inf,0.0,191,0.0,100,True,20,0.6,False,6,12,15,16,2,8,21,1,14,1.62,3.66,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2452,-inf,0.0,0,0.0,50,True,16,0.5,False,6,12,16,16,2,8,21,2,14,1.86,5.1,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2453,-inf,0.0,100,0.0,50,True,24,0.7,True,6,13,16,16,3,8,21,2,14,2.04,4.69,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2454,-inf,0.0,0,0.0,100,True,24,0.66,False,6,13,15,16,3,8,21,2,14,1.96,5.21,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2455,-inf,0.0,229,0.0,50,True,20,0.7,True,6,12,16,16,3,8,21,1,14,1.85,3.79,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2456,-inf,0.0,262,0.0,50,True,16,0.7,True,6,13,16,16,2,8,21,1,14,2.13,4.82,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2457,-inf,0.0,251,0.0,50,True,16,0.54,False,6,12,14,15,3,8,21,1,14,1.86,5.0,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2458,-inf,0.0,0,0.0,50,True,16,0.64,False,6,13,15,15,2,8,21,2,14,1.75,5.17,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2459,-inf,0.0,195,0.0,100,True,24,0.68,True,6,13,14,16,3,8,21,1,14,2.15,5.21,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2460,-inf,0.0,0,0.0,100,True,24,0.61,False,6,12,16,16,3,8,21,2,14,1.99,4.59,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2461,-inf,0.0,201,0.0,100,True,20,0.64,True,6,12,16,15,3,8,21,1,14,1.9,4.07,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2462,-inf,0.0,185,0.0,100,True,20,0.56,False,6,13,15,15,2,8,21,1,14,1.84,5.31,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2463,-inf,0.0,187,0.0,100,True,16,0.58,False,6,13,16,15,3,8,21,1,14,2.1,5.49,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2464,-inf,0.0,0,0.0,100,True,16,0.69,False,6,12,15,15,3,8,21,2,14,1.98,5.22,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2465,-inf,0.0,0,0.0,100,True,24,0.64,False,6,13,16,16,3,8,21,2,14,2.05,5.34,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2466,-inf,0.0,188,0.0,100,True,24,0.7,True,6,13,15,16,2,8,21,1,14,2.01,4.48,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2467,-inf,0.0,107,0.0,50,True,20,0.63,True,6,13,15,16,2,8,21,2,14,1.98,3.89,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2468,-inf,0.0,281,0.0,50,True,20,0.6,True,6,13,16,15,2,8,21,1,14,1.72,4.92,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +3,-inf,-243.1500000000069,107,0.6500834676490905,100,True,16,0.52,True,6,13,15,16,2,8,21,2,14,1.88,3.75,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2486,-inf,0.0,186,0.0,100,True,20,0.64,False,6,13,14,16,3,8,21,1,14,1.61,4.64,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2487,-inf,0.0,202,0.0,100,True,20,0.59,False,6,13,14,16,3,8,21,1,14,1.87,4.43,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2488,-inf,0.0,127,0.0,100,True,24,0.68,False,6,12,15,15,3,8,21,1,14,1.79,4.44,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2489,-inf,0.0,147,0.0,50,True,16,0.68,False,6,12,16,16,2,8,21,1,14,1.91,5.09,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +2490,-inf,0.0,342,0.0,50,True,20,0.64,True,6,13,15,15,3,8,21,1,14,1.6,3.89,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +2491,-inf,0.0,238,0.0,100,True,16,0.57,False,6,12,14,15,3,8,21,1,14,1.78,4.44,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2492,-inf,0.0,122,0.0,50,True,16,0.59,True,6,12,14,16,2,8,21,2,14,2.01,3.98,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +2493,-inf,0.0,111,0.0,100,True,16,0.67,True,6,12,16,15,3,8,21,2,14,1.61,4.38,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2494,-inf,0.0,193,0.0,100,True,16,0.64,False,6,13,14,16,2,8,21,1,14,1.89,4.8,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2495,-inf,0.0,97,0.0,100,True,20,0.51,True,6,12,15,16,3,8,21,2,14,1.83,4.9,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2496,-inf,0.0,185,0.0,100,True,16,0.63,False,6,12,14,15,2,8,21,1,14,2.01,3.6,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +2497,-inf,0.0,123,0.0,100,True,16,0.65,True,6,13,14,15,3,8,21,2,14,1.77,4.45,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2498,-inf,0.0,105,0.0,50,True,24,0.64,True,6,12,14,15,2,8,21,2,14,2.14,4.44,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2499,-inf,0.0,0,0.0,100,True,20,0.63,False,6,12,16,16,3,8,21,2,14,2.12,5.48,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +20,-inf,803.1300000000083,125,2.688347453173285,100,True,24,0.69,False,6,12,14,16,2,8,21,1,14,1.95,4.58,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +2469,-inf,0.0,0,0.0,50,True,16,0.68,False,6,13,14,16,2,8,21,2,14,1.71,3.67,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +6,-inf,-249.89999999999782,98,0.6349426630633263,50,True,24,0.65,True,6,13,15,16,2,8,21,2,14,1.79,5.04,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +7,-inf,-208.84000000000015,106,0.7003128318457078,50,True,20,0.58,True,6,12,16,16,2,8,21,2,14,1.9,5.27,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +5,-inf,0.0,0,0.0,50,True,20,0.56,False,6,12,15,16,2,8,21,2,14,1.76,5.37,True,1.2,120,True,True,0.7,48,4,8.0,0.1,10000.0 +2500,-inf,0.0,188,0.0,100,True,16,0.57,False,6,13,16,15,2,8,21,1,14,1.65,4.07,True,1.2,96,True,True,0.7,48,8,8.0,0.1,10000.0 +10,-inf,1053.670000000002,188,2.453418119620393,50,True,24,0.64,False,6,13,14,16,3,8,21,1,14,1.87,5.41,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +11,-inf,0.0,0,0.0,50,True,24,0.68,False,6,12,14,16,2,8,21,2,14,2.17,5.34,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +12,-inf,0.0,0,0.0,100,True,20,0.5,False,6,13,14,15,2,8,21,2,14,2.17,3.67,True,1.2,96,True,True,0.7,48,4,8.0,0.1,10000.0 +13,-inf,-328.5300000000025,122,0.6194442192079139,50,True,16,0.63,True,6,13,16,16,2,8,21,2,14,2.05,4.88,True,1.2,120,True,True,0.7,48,6,8.0,0.1,10000.0 +14,-inf,1284.930000000004,133,7.691995208582887,100,True,24,0.63,False,6,13,14,15,2,8,21,1,14,1.8,4.68,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 +1,-inf,-301.0300000000025,137,0.6668179302711678,50,True,16,0.65,True,6,12,14,15,2,8,21,2,14,1.85,3.56,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +16,-inf,971.100000000004,146,2.7847166066308904,50,True,24,0.69,False,6,12,15,16,2,8,21,1,14,1.66,4.36,True,1.2,96,True,True,0.7,48,6,8.0,0.1,10000.0 +2485,-inf,0.0,319,0.0,50,True,16,0.58,True,6,12,16,15,2,8,21,1,14,1.85,4.65,True,1.2,80,True,True,0.7,48,6,8.0,0.1,10000.0 +18,-inf,-170.98000000000138,107,0.7578667119834593,50,True,20,0.59,True,6,13,16,15,2,8,21,2,14,2.2,5.17,True,1.2,80,True,True,0.7,48,4,8.0,0.1,10000.0 +2470,-inf,0.0,186,0.0,100,True,20,0.54,False,6,12,15,16,2,8,21,1,14,1.97,3.81,True,1.2,120,True,True,0.7,48,8,8.0,0.1,10000.0 +2484,-inf,0.0,109,0.0,100,True,16,0.59,True,6,13,15,16,3,8,21,2,14,1.92,5.28,True,1.2,80,True,True,0.7,48,8,8.0,0.1,10000.0 diff --git a/lab/EAs/USDCHF/parse_optimize_xml.py b/lab/EAs/USDCHF/parse_optimize_xml.py new file mode 100644 index 0000000..a9e5c5b --- /dev/null +++ b/lab/EAs/USDCHF/parse_optimize_xml.py @@ -0,0 +1,124 @@ +"""Parse MT5 optimization XML and export best / high-trade sets.""" +from __future__ import annotations + +import re +import sys +from pathlib import Path + +LAB = Path(__file__).resolve().parent + +SET_DEFAULTS = { + "UseDailyBias": "false", + "DailyEmaPeriod": "50", + "HtfZoneBars": "12", + "MinBreakBodyRatio": "0.40", + "UseDoubleTrap": "false", + "NyChaosStartHour": "12", + "NyChaosEndHour": "14", + "MomentumStartHour": "8", + "MomentumEndHour": "23", + "UseMomentumWindow": "false", + "LtfFastEma": "6", + "LtfSlowEma": "18", + "EntryMode": "3", + "AllowLtfPullback": "true", + "AllowEmaCross": "true", + "MinEmaGapPips": "0.0", + "AtrSlMult": "1.3", + "AtrTpMult": "1.8", + "UseTrailing": "true", + "TrailAtrMult": "0.8", + "MaxBarsInTrade": "20", + "CooldownBars": "0", + "MaxSpreadPips": "8", + "UseCompressionFilter": "false", + "CompressAtrRatio": "0.70", +} + + +def parse_xml(path: Path) -> tuple[list[str], list[dict[str, str]]]: + text = path.read_text(encoding="utf-8", errors="ignore") + header = re.search(r".*?Pass.*?", text, re.S) + if not header: + raise SystemExit("header not found") + cols = re.findall(r'([^<]+)', header.group(0)) + out: list[dict[str, str]] = [] + for row in re.findall(r"(.*?)", text, re.S)[1:]: + cells = re.findall(r'([^<]+)', row) + if len(cells) >= len(cols): + out.append(dict(zip(cols, cells))) + return cols, out + + +def row_to_set_params(row: dict[str, str]) -> dict[str, str]: + merged = dict(SET_DEFAULTS) + for k, v in row.items(): + if k in merged: + merged[k] = v + if "EntryMode" not in row: + merged["EntryMode"] = "3" + return merged + + +def write_set(path: Path, params: dict[str, str]) -> None: + merged = {**SET_DEFAULTS, **params} + lines = [ + "; USDCHF Playbook — MT5 genetic optimization export", + "Timeframe=16388", + "HtfTimeframe=16396", + "DailyTimeframe=16408", + "MagicNumber=20260625", + "LotSize=0.10", + "AtrPeriod=14", + "ExtendHoldMomentum=false", + "CompressLookback=48", + ] + for k in SET_DEFAULTS: + lines.append(f"{k}={merged[k]}") + path.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def main() -> None: + xml = Path(sys.argv[1]) if len(sys.argv) > 1 else None + if xml is None: + xml = LAB.parent.parent.parent / ".." / "USDCHF_USDCHF_optimize.xml" + if not xml.exists(): + import MetaTrader5 as mt5 + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + data = Path(mt5.terminal_info().data_path) + mt5.shutdown() + xml = data / "USDCHF_USDCHF_optimize.xml" + if not xml.exists(): + raise SystemExit(f"missing {xml}") + + _, rows = parse_xml(xml) + best_profit = max(rows, key=lambda r: float(r["Profit"])) + best_balanced = None + for r in rows: + profit = float(r["Profit"]) + trades = int(float(r["Trades"])) + pf = float(r["Profit Factor"]) + if profit > 0 and pf >= 1.05 and trades >= 80: + sc = profit + trades * 15.0 + if best_balanced is None or sc > float(best_balanced["score"]): + best_balanced = {**r, "score": str(sc)} + + out_profit = LAB / "USDCHF_optimized.set" + write_set(out_profit, row_to_set_params(best_profit)) + print(f"Best profit: ${float(best_profit['Profit']):,.2f} trades={best_profit['Trades']} PF={best_profit['Profit Factor']}") + print(f"Wrote {out_profit}") + + if best_balanced: + out_bal = LAB / "USDCHF_optimized_balanced.set" + write_set(out_bal, row_to_set_params(best_balanced)) + print( + f"Best balanced: ${float(best_balanced['Profit']):,.2f} " + f"trades={best_balanced['Trades']} PF={best_balanced['Profit Factor']}" + ) + print(f"Wrote {out_bal}") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/USDCHF/run_backtest.py b/lab/EAs/USDCHF/run_backtest.py new file mode 100644 index 0000000..a1e1428 --- /dev/null +++ b/lab/EAs/USDCHF/run_backtest.py @@ -0,0 +1,125 @@ +""" +USDCHF Playbook — Python bar backtest via MT5 live data. + +Usage: + python run_backtest.py + python run_backtest.py --start 2022-01-01 --end 2026-01-01 +""" + +from __future__ import annotations + +import argparse +import json +import sys +from dataclasses import asdict +from datetime import datetime +from pathlib import Path + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from strategy_core import PlaybookParams, STRATEGY_ID, build_market, pip_size, simulate # noqa: E402 + + +def save_reports(result, params: PlaybookParams, df: pd.DataFrame, out_dir: Path) -> None: + rows = [ + { + "side": t["side"], + "open_time": df.index[t["open_i"]], + "close_time": df.index[t["close_i"]], + "profit": t["profit"], + "exit_reason": t["exit_reason"], + } + for t in result.trades + ] + pd.DataFrame(rows).to_csv(out_dir / "trades.csv", index=False) + report = { + "strategy_id": STRATEGY_ID, + "symbol": "USDCHF", + "net_profit": result.net_profit, + "total_trades": result.total_trades, + "win_rate": result.win_rate, + "profit_factor": result.profit_factor, + "max_drawdown_pct": result.max_drawdown_pct, + "sharpe": result.sharpe, + "params": params.to_dict(), + } + with open(out_dir / "backtest_report.json", "w", encoding="utf-8") as f: + json.dump(report, f, indent=2) + + if not result.trades: + fig, ax = plt.subplots(figsize=(10, 4)) + ax.text(0.5, 0.5, "No trades", ha="center", va="center") + ax.axis("off") + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + return + + tdf = pd.DataFrame(rows).sort_values("close_time") + bal0 = params.initial_balance + eq = bal0 + tdf["profit"].cumsum() + fig, axes = plt.subplots(2, 1, figsize=(12, 8)) + axes[0].plot(tdf["close_time"], eq, lw=1.8) + axes[0].set_title(f"{STRATEGY_ID} Equity") + axes[0].grid(alpha=0.3) + axes[1].hist(tdf["profit"], bins=30, color="#6a5acd", alpha=0.85) + axes[1].axvline(0, color="black") + axes[1].set_title("Trade PnL") + fig.suptitle( + f"Net ${result.net_profit:,.0f} | Trades {result.total_trades} | " + f"PF {result.profit_factor:.2f} | WR {result.win_rate:.1f}% | DD {result.max_drawdown_pct:.1f}%" + ) + fig.tight_layout() + fig.savefig(out_dir / "report.png", dpi=200, bbox_inches="tight") + plt.close(fig) + + +def parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=f"{STRATEGY_ID} backtest") + p.add_argument("--symbol", default="USDCHF") + p.add_argument("--start", default="2022-01-01") + p.add_argument("--end", default="2026-01-01") + p.add_argument("--balance", type=float, default=10_000.0) + p.add_argument("--params", default="", help="JSON file with PlaybookParams overrides") + return p.parse_args() + + +def main() -> None: + args = parse_args() + out_dir = Path(__file__).resolve().parent + params = PlaybookParams(initial_balance=args.balance) + if args.params: + overrides = json.loads(Path(args.params).read_text(encoding="utf-8")) + params = PlaybookParams(**{**params.to_dict(), **overrides}) + + if not mt5.initialize(): + raise SystemExit("MT5 initialize() failed") + try: + symbol = resolve_symbol(args.symbol) + df = load_bars(symbol, mt5.TIMEFRAME_M15, datetime.fromisoformat(args.start), datetime.fromisoformat(args.end)) + costs = CostModel.for_symbol(symbol) + pip = pip_size(symbol) + point = float(mt5.symbol_info(symbol).point) + print(f"Loaded {len(df)} M15 bars for {symbol}") + md = build_market(df, params) + result = simulate(md, symbol, params, costs, pip, point) + save_reports(result, params, df, out_dir) + print( + f"Net: ${result.net_profit:,.2f} | Trades: {result.total_trades} | " + f"PF: {result.profit_factor:.2f} | WR: {result.win_rate:.1f}% | DD: {result.max_drawdown_pct:.1f}%" + ) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/USDCHF/run_mt5_tester.py b/lab/EAs/USDCHF/run_mt5_tester.py new file mode 100644 index 0000000..358141b --- /dev/null +++ b/lab/EAs/USDCHF/run_mt5_tester.py @@ -0,0 +1,319 @@ +""" +Launch MT5 Strategy Tester for USDCHF Playbook EA. + +Usage: + python run_mt5_tester.py backtest + python run_mt5_tester.py optimize + python run_mt5_tester.py backtest --visual +""" + +from __future__ import annotations + +import argparse +import json +import re +import shutil +import subprocess +import sys +import time +from pathlib import Path + +import MetaTrader5 as mt5 + +LAB = Path(__file__).resolve().parent +EA_SRC = LAB.parent / "USDCHF.mq5" +DEFAULT_SET = LAB / "USDCHF_Playbook.set" +OPT_SET = LAB / "USDCHF_Genetic_Optimization.set" +OPT_HIGHFREQ_SET = LAB / "USDCHF_Genetic_HighFreq.set" +OPT_ULTRAFREQ_SET = LAB / "USDCHF_Genetic_UltraFreq.set" + +LABELS = { + "profit_factor": ("Profit Factor", "盈利因子"), + "net_profit": ("Total Net Profit", "总净盈利"), + "total_trades": ("Total Trades", "交易总计"), + "sharpe": ("Sharpe Ratio", "夏普比率"), + "equity_dd": ("Equity Drawdown Maximal", "最大回撤"), +} + + +def read_text(path: Path) -> str: + text = path.read_text(encoding="utf-16", errors="ignore") + if not text.strip(): + text = path.read_text(encoding="utf-8", errors="ignore") + return text + + +def grab_metric(text: str, key: str) -> str | None: + for label in LABELS[key]: + for pat in ( + rf">{re.escape(label)}\s*]*>(?:)?([^<]+)", + rf">{re.escape(label)}:\s*]*>(?:)?([^<]+)", + ): + m = re.search(pat, text, re.I) + if m: + return m.group(1).strip() + return None + + +def parse_report(data: Path, report: str) -> dict: + xml_path = data / f"{report}.xml" + if xml_path.exists(): + text = xml_path.read_text(encoding="utf-8", errors="ignore") + m = re.search( + r"\s*]*>]*>Pass.*?\s*(.*?)", + text, + re.S, + ) + if m: + cells = re.findall(r'([^<]+)', m.group(1)) + if len(cells) >= 10: + params = {} + param_names = [ + "UseDailyBias", + "DailyEmaPeriod", + "HtfZoneBars", + "MinBreakBodyRatio", + "UseDoubleTrap", + "NyChaosStartHour", + "NyChaosEndHour", + "MomentumStartHour", + "MomentumEndHour", + "UseMomentumWindow", + "LtfFastEma", + "LtfSlowEma", + "EntryMode", + "AllowLtfPullback", + "AllowEmaCross", + "MinEmaGapPips", + "AtrSlMult", + "AtrTpMult", + "UseTrailing", + "TrailAtrMult", + "MaxBarsInTrade", + "CooldownBars", + "MaxSpreadPips", + "UseCompressionFilter", + "CompressAtrRatio", + ] + for i, name in enumerate(param_names): + if i + 10 < len(cells): + params[name] = cells[i + 10] + return { + "ready": True, + "report": str(xml_path), + "net_profit": float(cells[2]), + "profit_factor": float(cells[4]), + "sharpe": float(cells[6]), + "max_drawdown": f"{cells[8]}%", + "total_trades": int(float(cells[9])), + "optimized_params": params, + } + for path in sorted(data.glob(f"**/{report}*.htm*"), key=lambda p: p.stat().st_mtime, reverse=True): + text = read_text(path) + pf = grab_metric(text, "profit_factor") + profit = grab_metric(text, "net_profit") + trades = grab_metric(text, "total_trades") + sharpe = grab_metric(text, "sharpe") + dd = grab_metric(text, "equity_dd") + if pf or profit or trades: + return { + "profit_factor": float(pf) if pf else None, + "net_profit": _num(profit), + "total_trades": int(float(trades)) if trades and trades[0].isdigit() else None, + "sharpe": float(sharpe) if sharpe else None, + "max_drawdown": dd, + "report": str(path), + "ready": True, + } + return {"ready": False} + + +def _num(s: str | None) -> float | None: + if not s: + return None + s = s.replace(" ", "").replace(",", "") + if s.endswith("%"): + return float(s[:-1]) + return float(s) + + +def mt5_context() -> dict: + if not mt5.initialize(): + raise RuntimeError(f"MT5 init failed: {mt5.last_error()}") + info = mt5.terminal_info() + acc = mt5.account_info() + ctx = { + "data": Path(info.data_path), + "mt5_path": Path(info.path), + "login": acc.login if acc else 0, + "server": acc.server if acc else "", + } + mt5.shutdown() + return ctx + + +def deploy_ea(data: Path, mt5_path: Path) -> Path: + dst_dir = data / "MQL5" / "Experts" / "lab" / "USDCHF" + dst_dir.mkdir(parents=True, exist_ok=True) + dst = dst_dir / "USDCHF.mq5" + shutil.copy2(EA_SRC, dst) + log = dst_dir / "compile.log" + subprocess.run( + [str(mt5_path / "metaeditor64.exe"), f"/compile:{dst}", f"/log:{log}"], + timeout=180, + capture_output=True, + ) + time.sleep(3) + ex5 = dst_dir / "USDCHF.ex5" + if not ex5.exists(): + tail = log.read_text(encoding="utf-8", errors="ignore")[-2000:] if log.exists() else "" + raise RuntimeError(f"Compile failed:\n{dst}\n{tail}") + pub = data / "MQL5" / "Experts" / "USDCHF.ex5" + shutil.copy2(ex5, pub) + return pub + + +def copy_set_to_tester(data: Path, set_path: Path, set_name: str) -> Path: + profiles = data / "MQL5" / "Profiles" / "Tester" + profiles.mkdir(parents=True, exist_ok=True) + dst = profiles / set_name + shutil.copy2(set_path, dst) + return dst + + +def build_ini(**kw) -> str: + return f"""[Common] +Login={kw['login']} +Server={kw['server']} +[Tester] +Expert=USDCHF.ex5 +ExpertParameters={kw['set_name']} +Symbol={kw['symbol']} +Period={kw['period']} +Optimization={kw['optimization']} +Model=1 +Dates=1 +FromDate={kw['from_date']} +ToDate={kw['to_date']} +ForwardMode=0 +Deposit={kw['deposit']} +Currency=USD +Leverage={kw['leverage']} +ExecutionMode=0 +Report={kw['report']} +ReplaceReport=1 +ShutdownTerminal=1 +Visual={1 if kw['visual'] else 0} +""" + + +def run_tester(ctx: dict, **kw) -> dict: + data: Path = ctx["data"] + mt5_path: Path = ctx["mt5_path"] + deploy_ea(data, mt5_path) + copy_set_to_tester(data, kw["set_path"], kw["set_name"]) + ini_body = build_ini( + login=ctx["login"], + server=ctx["server"], + set_name=kw["set_name"], + report=kw["report"], + symbol=kw["symbol"], + period=kw["period"], + from_date=kw["from_date"], + to_date=kw["to_date"], + deposit=kw["deposit"], + leverage=kw["leverage"], + optimization=2 if kw["mode"] == "optimize" else 0, + visual=kw["visual"], + ) + ini = data / f"{kw['report']}.ini" + ini.write_text(ini_body, encoding="utf-8") + for ext in (".htm", ".html"): + p = data / f"{kw['report']}{ext}" + if p.exists(): + p.unlink(missing_ok=True) + + subprocess.run(["taskkill", "/IM", "terminal64.exe", "/F"], capture_output=True) + subprocess.run(["taskkill", "/IM", "metatester64.exe", "/F"], capture_output=True) + time.sleep(4) + + print(f"Starting MT5 Strategy Tester ({kw['mode']}) …") + print(f" EA: USDCHF.ex5 Symbol: {kw['symbol']} Period: {kw['period']}") + print(f" Set: {kw['set_name']}") + print(f" Range: {kw['from_date']} → {kw['to_date']} Visual: {kw['visual']}") + t0 = time.time() + timeout = kw.get("timeout_sec", 7200 if kw["mode"] == "optimize" else 3600) + subprocess.run([str(mt5_path / "terminal64.exe"), f"/config:{ini}"], timeout=timeout) + metrics = parse_report(data, kw["report"]) + metrics["elapsed_sec"] = round(time.time() - t0, 1) + metrics["mode"] = kw["mode"] + metrics["symbol"] = kw["symbol"] + metrics["period"] = kw["period"] + metrics["set_file"] = str(kw["set_path"]) + return metrics + + +def main() -> None: + p = argparse.ArgumentParser() + p.add_argument("mode", choices=["backtest", "optimize"]) + p.add_argument("--symbol", default="USDCHF") + p.add_argument("--period", default="M15") + p.add_argument("--from", dest="from_date", default="2022.01.01") + p.add_argument("--to", dest="to_date", default="2026.01.01") + p.add_argument("--deposit", type=float, default=10000) + p.add_argument("--leverage", type=int, default=100) + p.add_argument("--visual", action="store_true") + p.add_argument("--high-freq", action="store_true", help="High-frequency genetic ranges") + p.add_argument("--ultra-freq", action="store_true", help="Ultra-frequency genetic (~daily trades)") + p.add_argument("--set", dest="set_file", default="", help="Custom .set path") + args = p.parse_args() + + ctx = mt5_context() + set_path = Path(args.set_file) if args.set_file else ( + OPT_ULTRAFREQ_SET if args.mode == "optimize" and args.ultra_freq else + OPT_HIGHFREQ_SET if args.mode == "optimize" and args.high_freq else + OPT_SET if args.mode == "optimize" else DEFAULT_SET + ) + if not set_path.exists(): + set_path = DEFAULT_SET + report = f"USDCHF_{args.symbol}_{args.mode}" + metrics = run_tester( + ctx, + mode=args.mode, + set_path=set_path, + set_name=set_path.name, + report=report, + symbol=args.symbol, + period=args.period, + from_date=args.from_date, + to_date=args.to_date, + deposit=args.deposit, + leverage=args.leverage, + visual=args.visual, + ) + out_json = LAB / "mt5_results.json" + with open(out_json, "w", encoding="utf-8") as f: + json.dump(metrics, f, indent=2) + + if metrics.get("ready"): + print("\n=== MT5 Report ===") + for k in ("net_profit", "profit_factor", "total_trades", "sharpe", "max_drawdown", "elapsed_sec"): + if metrics.get(k) is not None: + print(f" {k}: {metrics[k]}") + print(f" report: {metrics.get('report')}") + print(f" saved: {out_json}") + if args.mode == "optimize" and metrics.get("optimized_params"): + opt_set = LAB / "USDCHF_optimized.set" + subprocess.run( + [sys.executable, str(LAB / "parse_optimize_xml.py"), metrics["report"]], + check=False, + ) + if opt_set.exists(): + print(f" optimized set: {opt_set}") + else: + print("Report not found — check MT5 Tester journal.") + print(f" ini/log hint: {ctx['data']}") + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/USDCHF/run_optimize.py b/lab/EAs/USDCHF/run_optimize.py new file mode 100644 index 0000000..995a708 --- /dev/null +++ b/lab/EAs/USDCHF/run_optimize.py @@ -0,0 +1,214 @@ +""" +Random-search optimizer for USDCHF Playbook. + +Targets: net_profit > 0, trades >= min_trades, stable PF. + +Usage: + python run_optimize.py --trials 3000 --min-trades 150 + python run_optimize.py --profile balanced --trials 5000 +""" + +from __future__ import annotations + +import argparse +import json +import random +import sys +from dataclasses import asdict +from datetime import datetime +from pathlib import Path + +import MetaTrader5 as mt5 +import pandas as pd + +ROOT = Path(__file__).resolve().parents[3] +sys.path.insert(0, str(ROOT / "backtesting" / "MT5")) +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from cluster_audit.backtest_core import CostModel, load_bars, resolve_symbol # noqa: E402 +from strategy_core import PlaybookParams, build_market, pip_size, simulate # noqa: E402 + +LAB = Path(__file__).resolve().parent +EA_SET = LAB / "USDCHF_Playbook.set" + + +def sample_params(rng: random.Random, high_freq: bool) -> PlaybookParams: + if high_freq: + return PlaybookParams( + daily_ema_period=rng.choice([34, 50, 100]), + use_daily_bias=rng.choice([True, True, False]), + htf_zone_bars=rng.choice([12, 16, 20]), + min_break_body_ratio=round(rng.uniform(0.45, 0.65), 2), + use_double_trap=rng.choice([True, True, False]), + ny_chaos_start=rng.choice([11, 12, 13]), + ny_chaos_end=rng.choice([14, 15, 16]), + momentum_start=rng.choice([14, 15, 16]), + momentum_end=rng.choice([1, 2, 3]), + ltf_fast_ema=rng.randint(5, 12), + ltf_slow_ema=rng.choice([18, 21, 26, 34]), + entry_mode=rng.choice([0, 1, 1, 2]), + atr_sl_mult=round(rng.uniform(1.4, 2.4), 2), + atr_tp_mult=round(rng.uniform(3.0, 6.0), 2), + use_trailing=rng.choice([True, False]), + trail_atr_mult=round(rng.uniform(0.9, 1.6), 2), + max_bars_in_trade=rng.choice([64, 96, 128]), + use_compression_filter=rng.choice([True, False]), + compress_atr_ratio=round(rng.uniform(0.55, 0.80), 2), + cooldown_bars=rng.choice([2, 3, 4]), + ) + return PlaybookParams( + daily_ema_period=rng.choice([50, 100]), + htf_zone_bars=rng.choice([16, 20, 24]), + min_break_body_ratio=round(rng.uniform(0.50, 0.70), 2), + use_double_trap=rng.choice([True, False]), + ny_chaos_start=rng.choice([12, 13]), + ny_chaos_end=rng.choice([14, 15, 16]), + momentum_start=rng.choice([15, 16]), + momentum_end=rng.choice([2, 3]), + entry_mode=rng.choice([1, 1, 2]), + atr_sl_mult=round(rng.uniform(1.6, 2.2), 2), + atr_tp_mult=round(rng.uniform(3.5, 5.5), 2), + max_bars_in_trade=rng.choice([80, 96, 120]), + cooldown_bars=rng.choice([4, 6, 8]), + ) + + +def write_set(p: PlaybookParams, path: Path) -> None: + lines = [ + "; USDCHF Playbook optimized", + "Timeframe=15", + f"UseDailyBias={'true' if p.use_daily_bias else 'false'}", + f"DailyEmaPeriod={p.daily_ema_period}", + f"HtfZoneBars={p.htf_zone_bars}", + f"MinBreakBodyRatio={p.min_break_body_ratio}", + f"UseDoubleTrap={'true' if p.use_double_trap else 'false'}", + f"NyChaosStartHour={p.ny_chaos_start}", + f"NyChaosEndHour={p.ny_chaos_end}", + f"MomentumStartHour={p.momentum_start}", + f"MomentumEndHour={p.momentum_end}", + f"LtfFastEma={p.ltf_fast_ema}", + f"LtfSlowEma={p.ltf_slow_ema}", + f"EntryMode={p.entry_mode}", + f"AtrPeriod={p.atr_period}", + f"AtrSlMult={p.atr_sl_mult}", + f"AtrTpMult={p.atr_tp_mult}", + f"UseTrailing={'true' if p.use_trailing else 'false'}", + f"TrailAtrMult={p.trail_atr_mult}", + f"MaxBarsInTrade={p.max_bars_in_trade}", + f"ExtendHoldMomentum={'true' if p.extend_hold_in_momentum else 'false'}", + f"CooldownBars={p.cooldown_bars}", + f"UseCompressionFilter={'true' if p.use_compression_filter else 'false'}", + f"CompressAtrRatio={p.compress_atr_ratio}", + f"LotSize={p.lot_size}", + ] + path.write_text("\n".join(lines) + "\n", encoding="utf-8") + + +def score_result(r, min_trades: int, profile: str) -> float: + if r.total_trades < min_trades: + return float("-inf") + if r.net_profit <= 0: + return float("-inf") + if r.profit_factor < 1.02: + return float("-inf") + base = r.net_profit + if profile == "high-freq": + return base + r.total_trades * 2.0 + if profile == "balanced": + return base + r.total_trades * 5.0 - r.max_drawdown_pct * 50.0 + return base - r.max_drawdown_pct * 80.0 + + +def main() -> None: + ap = argparse.ArgumentParser() + ap.add_argument("--symbol", default="USDCHF") + ap.add_argument("--start", default="2022-01-01") + ap.add_argument("--end", default="2026-01-01") + ap.add_argument("--trials", type=int, default=3000) + ap.add_argument("--min-trades", type=int, default=120) + ap.add_argument("--max-trades", type=int, default=800) + ap.add_argument("--profile", choices=["profit", "high-freq", "balanced"], default="balanced") + ap.add_argument("--seed", type=int, default=42) + args = ap.parse_args() + rng = random.Random(args.seed) + + if not mt5.initialize(): + raise SystemExit("MT5 init failed") + try: + sym = resolve_symbol(args.symbol) + df = load_bars(sym, mt5.TIMEFRAME_M15, datetime.fromisoformat(args.start), datetime.fromisoformat(args.end)) + costs = CostModel.for_symbol(sym) + pip = pip_size(sym) + point = float(mt5.symbol_info(sym).point) + print(f"{sym} M15 bars={len(df)} trials={args.trials} profile={args.profile}", flush=True) + + best_sc = float("-inf") + best = None + best_p = None + rows = [] + high_freq = args.profile == "high-freq" + + for n in range(1, args.trials + 1): + p = sample_params(rng, high_freq) + md = build_market(df, p) + r = simulate(md, sym, p, costs, pip, point) + sc = score_result(r, args.min_trades, args.profile) + if args.max_trades and r.total_trades > args.max_trades: + sc = float("-inf") + rows.append({"trial": n, "score": sc, "net": r.net_profit, "trades": r.total_trades, "pf": r.profit_factor, **asdict(p)}) + if sc > best_sc: + best_sc, best, best_p = sc, r, p + print( + f" NEW BEST {n}: net=${r.net_profit:,.0f} trades={r.total_trades} " + f"PF={r.profit_factor:.2f} DD={r.max_drawdown_pct:.1f}%", + flush=True, + ) + if n % 500 == 0: + b = best + print(f" ... {n}/{args.trials} best_net=${b.net_profit if b else 0:,.0f}", flush=True) + + pd.DataFrame(rows).sort_values("score", ascending=False).to_csv(LAB / "optimize_trials.csv", index=False) + assert best and best_p + + with open(LAB / "best_params.json", "w", encoding="utf-8") as f: + json.dump( + { + "metrics": { + "net_profit": best.net_profit, + "total_trades": best.total_trades, + "profit_factor": best.profit_factor, + "win_rate": best.win_rate, + "max_drawdown_pct": best.max_drawdown_pct, + "sharpe": best.sharpe, + }, + "params": asdict(best_p), + }, + f, + indent=2, + ) + write_set(best_p, EA_SET) + + trows = [ + { + "side": t["side"], + "open_time": df.index[t["open_i"]], + "close_time": df.index[t["close_i"]], + "profit": t["profit"], + "exit_reason": t["exit_reason"], + } + for t in best.trades + ] + pd.DataFrame(trows).to_csv(LAB / "best_trades.csv", index=False) + + print( + f"\nBEST: net=${best.net_profit:,.2f} trades={best.total_trades} " + f"PF={best.profit_factor:.2f} WR={best.win_rate:.1f}% MaxDD={best.max_drawdown_pct:.1f}%", + flush=True, + ) + print(f"Saved {EA_SET.name} and best_params.json", flush=True) + finally: + mt5.shutdown() + + +if __name__ == "__main__": + main() diff --git a/lab/EAs/USDCHF/strategy_core.py b/lab/EAs/USDCHF/strategy_core.py new file mode 100644 index 0000000..8fbaf7e --- /dev/null +++ b/lab/EAs/USDCHF/strategy_core.py @@ -0,0 +1,387 @@ +""" +USDCHF Playbook — six behavioral rules from month-long backtest study. + +1. Momentum window: entries after NY chaos, hold through late-session momentum. +2. Double-trap: frequent fake breaks — wait for reclaim after second tap. +3. Respect zones: HTF (H4) close confirmation before LTF entry. +4. Avoid NY open chaos: skip high-volatility US open window. +5. News compression: skip tight ranges; trade post-breakout direction. +6. Daily swing bias: D1 EMA defines primary direction; wider targets. +""" + +from __future__ import annotations + +from dataclasses import asdict, dataclass +from typing import Any + +import MetaTrader5 as mt5 +import numpy as np +import pandas as pd + +from indicator_utils import calculate_atr, calculate_ema # noqa: E402 + + +STRATEGY_ID = "USDCHFPlaybook" + + +@dataclass +class PlaybookParams: + # Daily swing bias (rule 6) + daily_ema_period: int = 50 + use_daily_bias: bool = True + + # HTF zones (rule 3) + htf_zone_bars: int = 20 + min_break_body_ratio: float = 0.55 + + # Double trap (rule 2) + use_double_trap: bool = True + trap_lookback: int = 6 + + # Session (rules 1 & 4) — server/broker hours + ny_chaos_start: int = 12 + ny_chaos_end: int = 15 + momentum_start: int = 15 + momentum_end: int = 2 # wraps past midnight (hold until ~2am) + + # LTF structure + ltf_fast_ema: int = 8 + ltf_slow_ema: int = 21 + entry_mode: int = 1 # 0=htf breakout, 1=+pullback, 2=trap reclaim + + # Risk / swing holds (rule 6) + atr_period: int = 14 + atr_sl_mult: float = 1.8 + atr_tp_mult: float = 4.0 + use_trailing: bool = True + trail_atr_mult: float = 1.2 + max_bars_in_trade: int = 96 + extend_hold_in_momentum: bool = True + + # News compression proxy (rule 5) + use_compression_filter: bool = True + compress_atr_ratio: float = 0.70 + compress_lookback: int = 48 + + cooldown_bars: int = 4 + max_spread_pips: float = 8.0 + lot_size: float = 0.10 + initial_balance: float = 10_000.0 + + def to_dict(self) -> dict[str, Any]: + return asdict(self) + + +@dataclass +class MarketPack: + df: pd.DataFrame + close: np.ndarray + open_: np.ndarray + high: np.ndarray + low: np.ndarray + hours: np.ndarray + atr: np.ndarray + atr_ma: np.ndarray + daily_bias: np.ndarray # +1 bull, -1 bear, 0 neutral + h4_res: np.ndarray + h4_sup: np.ndarray + h4_bull_break: np.ndarray + h4_bear_break: np.ndarray + bull_trap: np.ndarray + bear_trap: np.ndarray + fast_ema: np.ndarray + slow_ema: np.ndarray + + +def pip_size(symbol: str) -> float: + info = mt5.symbol_info(symbol) + if not info: + return 0.0001 + pt = float(info.point) + return pt * 10.0 if info.digits in (3, 5) else pt + + +def _hour_in_range(h: int, start: int, end: int) -> bool: + if start == end: + return True + if start < end: + return start <= h < end + return h >= start or h < end + + +def in_momentum_window(hours: np.ndarray, p: PlaybookParams) -> np.ndarray: + return np.array([_hour_in_range(int(h), p.momentum_start, p.momentum_end) for h in hours]) + + +def in_ny_chaos(hours: np.ndarray, p: PlaybookParams) -> np.ndarray: + return np.array([_hour_in_range(int(h), p.ny_chaos_start, p.ny_chaos_end) for h in hours]) + + +def _body_ratio(o: float, h: float, l: float, c: float) -> float: + rng = h - l + if rng <= 0: + return 0.0 + return abs(c - o) / rng + + +def build_market(df: pd.DataFrame, p: PlaybookParams) -> MarketPack: + close_s = df["close"] + d1 = close_s.resample("1D").last().dropna() + d_ema = calculate_ema(d1, p.daily_ema_period) + bias_s = pd.Series(0, index=d1.index, dtype=float) + if p.use_daily_bias: + bias_s = np.where(d1 > d_ema, 1.0, np.where(d1 < d_ema, -1.0, 0.0)) + daily_bias = pd.Series(bias_s, index=d1.index).reindex(df.index, method="ffill").fillna(0).to_numpy() + + h4 = df.resample("4h").agg({"open": "first", "high": "max", "low": "min", "close": "last"}).dropna() + h4_res = h4["high"].rolling(p.htf_zone_bars).max().shift(1) + h4_sup = h4["low"].rolling(p.htf_zone_bars).min().shift(1) + h4_res_i = h4_res.reindex(df.index, method="ffill").to_numpy() + h4_sup_i = h4_sup.reindex(df.index, method="ffill").to_numpy() + + h4_o = h4["open"].reindex(df.index, method="ffill").to_numpy() + h4_h = h4["high"].reindex(df.index, method="ffill").to_numpy() + h4_l = h4["low"].reindex(df.index, method="ffill").to_numpy() + h4_c = h4["close"].reindex(df.index, method="ffill").to_numpy() + + bull_body = np.array([_body_ratio(h4_o[i], h4_h[i], h4_l[i], h4_c[i]) for i in range(len(df))]) + h4_bull_break = (h4_c > h4_res_i) & (bull_body >= p.min_break_body_ratio) + h4_bear_break = (h4_c < h4_sup_i) & (bull_body >= p.min_break_body_ratio) + + high = df["high"].to_numpy() + low = df["low"].to_numpy() + close = close_s.to_numpy() + n = len(df) + bull_trap = np.zeros(n, dtype=bool) + bear_trap = np.zeros(n, dtype=bool) + if p.use_double_trap: + for i in range(2, n): + # false break above resistance then close back under zone + if high[i - 1] > h4_res_i[i - 2] and close[i - 1] < h4_res_i[i - 2]: + bull_trap[i] = True + if low[i - 1] < h4_sup_i[i - 2] and close[i - 1] > h4_sup_i[i - 2]: + bear_trap[i] = True + + atr = calculate_atr(df, p.atr_period).to_numpy() + atr_ma = pd.Series(atr).rolling(p.compress_lookback).mean().to_numpy() + + return MarketPack( + df=df, + close=close, + open_=df["open"].to_numpy(), + high=high, + low=low, + hours=df.index.hour.to_numpy(), + atr=atr, + atr_ma=atr_ma, + daily_bias=daily_bias, + h4_res=h4_res_i, + h4_sup=h4_sup_i, + h4_bull_break=h4_bull_break, + h4_bear_break=h4_bear_break, + bull_trap=bull_trap, + bear_trap=bear_trap, + fast_ema=calculate_ema(close_s, p.ltf_fast_ema).to_numpy(), + slow_ema=calculate_ema(close_s, p.ltf_slow_ema).to_numpy(), + ) + + +def make_signals(md: MarketPack, p: PlaybookParams) -> dict[str, np.ndarray]: + n = len(md.df) + momentum = in_momentum_window(md.hours, p) + chaos = in_ny_chaos(md.hours, p) + session_ok = momentum & ~chaos + + compress_ok = np.ones(n, dtype=bool) + if p.use_compression_filter: + compress_ok = ~( + (md.atr_ma > 0) + & (md.atr / np.maximum(md.atr_ma, 1e-12) < p.compress_atr_ratio) + & chaos + ) + + c1 = np.roll(md.close, 1) + h1 = np.roll(md.high, 1) + l1 = np.roll(md.low, 1) + f1 = np.roll(md.fast_ema, 1) + s1 = np.roll(md.slow_ema, 1) + bull_pb = (f1 > s1) & (l1 <= f1) & (c1 > f1) + bear_pb = (f1 < s1) & (h1 >= f1) & (c1 < f1) + + h4_bull = np.roll(md.h4_bull_break, 1) + h4_bear = np.roll(md.h4_bear_break, 1) + bias = md.daily_bias + bias_bull = (bias >= 0) if p.use_daily_bias else np.ones(n, dtype=bool) + bias_bear = (bias <= 0) if p.use_daily_bias else np.ones(n, dtype=bool) + + trap_bull = np.roll(md.bull_trap, 1) + trap_bear = np.roll(md.bear_trap, 1) + reclaim_bull = trap_bull & (c1 > md.h4_res) & (c1 > f1) + reclaim_bear = trap_bear & (c1 < md.h4_sup) & (c1 < f1) + + if p.entry_mode == 0: + buy_raw = h4_bull & bias_bull + sell_raw = h4_bear & bias_bear + elif p.entry_mode == 2: + buy_raw = reclaim_bull & bias_bull + sell_raw = reclaim_bear & bias_bear + else: + buy_raw = (h4_bull | (h4_bull & bull_pb) | reclaim_bull) & bias_bull + sell_raw = (h4_bear | (h4_bear & bear_pb) | reclaim_bear) & bias_bear + + buy_sig = buy_raw & session_ok & compress_ok + sell_sig = sell_raw & session_ok & compress_ok + + warm = max(p.htf_zone_bars * 16, p.daily_ema_period * 24, 80) + buy_sig[:warm] = False + sell_sig[:warm] = False + return { + "buy_sig": buy_sig, + "sell_sig": sell_sig, + "session_ok": session_ok, + "momentum": momentum, + "atr": md.atr, + } + + +@dataclass +class SimResult: + net_profit: float + total_trades: int + win_rate: float + profit_factor: float + max_drawdown_pct: float + sharpe: float + trades: list[dict] + + +def simulate( + md: MarketPack, + symbol: str, + p: PlaybookParams, + costs: Any, + pip: float, + point: float, +) -> SimResult: + from cluster_audit.backtest_core import CostModel # local import avoids cycle + + sig = make_signals(md, p) + opn, high, low, close = md.open_, md.high, md.low, md.close + atr = sig["atr"] + momentum = sig["momentum"] + buy_sig, sell_sig = sig["buy_sig"], sig["sell_sig"] + + spread_px = costs.spread_points * point + slip = costs.slippage_points * point + half = spread_px / 2.0 + slip + commission = costs.commission_per_lot * p.lot_size * 2.0 + + balance = p.initial_balance + equity: list[float] = [balance] + trades: list[dict] = [] + side = None + entry = 0.0 + entry_i = 0 + trail = 0.0 + last_entry_i = -10_000 + + def calc_profit(entry_px: float, exit_px: float, s: str) -> float: + ot = mt5.ORDER_TYPE_BUY if s == "BUY" else mt5.ORDER_TYPE_SELL + pr = mt5.order_calc_profit(ot, symbol, p.lot_size, entry_px, exit_px) + return float(pr) - commission if pr is not None else -commission + + warm = max(p.htf_zone_bars * 16, 80) + for i in range(warm, len(md.df)): + atr1 = float(atr[i - 1]) if not np.isnan(atr[i - 1]) else 0.0 + mid = float(opn[i]) + + if side is not None: + bars_held = i - entry_i + closed = False + max_bars = p.max_bars_in_trade + if p.extend_hold_in_momentum and momentum[i]: + max_bars = int(max_bars * 1.5) + if max_bars > 0 and bars_held >= max_bars: + exit_px = mid - half if side == "BUY" else mid + half + profit = calc_profit(entry, exit_px, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": "max_bars"}) + closed = True + elif side == "BUY": + sl_px = entry - atr1 * p.atr_sl_mult if atr1 > 0 else entry - 20 * pip + tp_px = entry + atr1 * p.atr_tp_mult if atr1 > 0 else entry + 40 * pip + eff_sl = sl_px + if p.use_trailing and atr1 > 0: + td = atr1 * p.trail_atr_mult + candidate = high[i] - td + if candidate > entry: + trail = max(trail, candidate) if trail > 0 else candidate + eff_sl = max(sl_px, trail) + if low[i] <= eff_sl: + reason = "trail" if trail > sl_px and eff_sl > entry else "sl" + profit = calc_profit(entry, eff_sl - half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": reason}) + closed = True + elif high[i] >= tp_px: + profit = calc_profit(entry, tp_px - half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": "tp"}) + closed = True + elif side == "SELL": + sl_px = entry + atr1 * p.atr_sl_mult if atr1 > 0 else entry + 20 * pip + tp_px = entry - atr1 * p.atr_tp_mult if atr1 > 0 else entry - 40 * pip + eff_sl = sl_px + if p.use_trailing and atr1 > 0: + td = atr1 * p.trail_atr_mult + candidate = low[i] + td + if candidate < entry: + trail = min(trail, candidate) if trail > 0 else candidate + eff_sl = min(sl_px, trail) + if high[i] >= eff_sl: + reason = "trail" if trail > 0 and trail < sl_px and eff_sl < entry else "sl" + profit = calc_profit(entry, eff_sl + half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": reason}) + closed = True + elif low[i] <= tp_px: + profit = calc_profit(entry, tp_px + half, side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": i, "profit": profit, "exit_reason": "tp"}) + closed = True + if closed: + side = None + trail = 0.0 + + if side is None: + spread_pips = spread_px / pip if pip > 0 else 0 + if not (p.max_spread_pips > 0 and spread_pips > p.max_spread_pips) and i - last_entry_i >= p.cooldown_bars: + if buy_sig[i]: + side, entry, entry_i, last_entry_i = "BUY", mid + half, i, i + elif sell_sig[i]: + side, entry, entry_i, last_entry_i = "SELL", mid - half, i, i + + mark = balance + if side == "BUY": + mark += calc_profit(entry, float(close[i - 1]), side) + commission + elif side == "SELL": + mark += calc_profit(entry, float(close[i - 1]), side) + commission + equity.append(mark) + + if side is not None: + profit = calc_profit(entry, float(close[-1]), side) + balance += profit + trades.append({"side": side, "open_i": entry_i, "close_i": len(md.df) - 1, "profit": profit, "exit_reason": "eod"}) + + eq = pd.Series(equity[: len(md.df)], index=md.df.index[: len(equity)]) + net = balance - p.initial_balance + wins = [t["profit"] for t in trades if t["profit"] > 0] + losses = [t["profit"] for t in trades if t["profit"] <= 0] + gp = sum(wins) if wins else 0.0 + gl = abs(sum(losses)) if losses else 0.0 + pf = gp / gl if gl > 0 else 0.0 + wr = 100.0 * len(wins) / len(trades) if trades else 0.0 + dd = abs(float(((eq - eq.cummax()) / eq.cummax() * 100).min())) if len(eq) else 0.0 + rets = eq.pct_change().dropna() + sharpe = float(rets.mean() / rets.std() * np.sqrt(252 * 24 * 4)) if len(rets) > 1 and rets.std() > 0 else 0.0 + return SimResult(net, len(trades), wr, pf, dd, sharpe, trades) diff --git a/lab/EAs/__pycache__/quxiuhanidea_alpha_backtest.cpython-312.pyc b/lab/EAs/__pycache__/quxiuhanidea_alpha_backtest.cpython-312.pyc deleted file mode 100644 index 9e676fa..0000000 Binary files a/lab/EAs/__pycache__/quxiuhanidea_alpha_backtest.cpython-312.pyc and /dev/null differ diff --git a/lab/EAs/_united/MagicNumberHelpers.mqh b/lab/EAs/_united/MagicNumberHelpers.mqh new file mode 100644 index 0000000..911767c --- /dev/null +++ b/lab/EAs/_united/MagicNumberHelpers.mqh @@ -0,0 +1,75 @@ +//+------------------------------------------------------------------+ +//| MagicNumberHelpers.mqh | +//| Copyright 2025, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +//+------------------------------------------------------------------+ +//| Select position by symbol and magic number | +//+------------------------------------------------------------------+ +bool PositionSelectByMagic(string symbol, ulong magic_number) +{ + if(!PositionSelect(symbol)) + return false; + + if(PositionGetInteger(POSITION_MAGIC) != magic_number) + { + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + if(PositionGetTicket(i) > 0) + { + if(PositionGetString(POSITION_SYMBOL) == symbol && + PositionGetInteger(POSITION_MAGIC) == magic_number) + { + return true; + } + } + } + return false; + } + + return true; +} + +//+------------------------------------------------------------------+ +//| Select position by ticket and verify magic number and symbol | +//+------------------------------------------------------------------+ +bool PositionSelectByTicketSymbolAndMagic(ulong ticket, string symbol, ulong magic_number) +{ + if(!PositionSelectByTicket(ticket)) + return false; + + return (PositionGetString(POSITION_SYMBOL) == symbol && + PositionGetInteger(POSITION_MAGIC) == magic_number); +} + +//+------------------------------------------------------------------+ +//| Check if position exists with correct magic number | +//+------------------------------------------------------------------+ +bool PositionExistsByMagic(string symbol, ulong magic_number) +{ + return PositionSelectByMagic(symbol, magic_number); +} + +//+------------------------------------------------------------------+ +//| Close position by symbol and magic number | +//+------------------------------------------------------------------+ +bool ClosePositionByMagic(CTrade &trade_obj, string symbol, ulong magic_number) +{ + for(int i = PositionsTotal() - 1; i >= 0; i--) + { + ulong ticket = PositionGetTicket(i); + if(ticket > 0) + { + if(PositionGetString(POSITION_SYMBOL) == symbol && + PositionGetInteger(POSITION_MAGIC) == magic_number) + { + return trade_obj.PositionClose(ticket); + } + } + } + return false; +} diff --git a/lab/EAs/catcher-optimization.set b/lab/EAs/catcher-optimization.set deleted file mode 100644 index f7d4f7e..0000000 --- a/lab/EAs/catcher-optimization.set +++ /dev/null @@ -1,21 +0,0 @@ -; saved on 2026.04.25 -; optimization profile for double-top-bottom-catcher.mq5 -; load this in Strategy Tester > Inputs tab > Load -; -InpTf=1||0||0||49153||N -InpHtf=5||0||0||49153||N -InpUseHtfFilter=true||false||0||true||Y -InpEmaFast=9||7||1||14||Y -InpEmaSlow=21||18||1||34||Y -InpPivotLeft=2||1||1||4||Y -InpPivotRight=2||1||1||4||Y -InpPatternLookbackBars=180||100||20||300||Y -InpMinPatternSeparation=6||4||1||12||Y -InpMaxPatternSeparation=50||20||5||80||Y -InpTopBottomTolPts=120.0||50.0||10.0||250.0||Y -InpMinEmaPriceDistPts=80.0||20.0||10.0||180.0||Y -InpPrevLevelLookback=120||50||10||250||Y -InpLots=0.01||0.01||0.0||0.01||N -InpSlBufferPts=25||10||5||60||Y -InpMagic=930101||930101||1||9301010||N -InpSlippagePts=30||10||5||50||Y diff --git a/lab/EAs/double-top-bottom-catcher.mq5 b/lab/EAs/double-top-bottom-catcher.mq5 deleted file mode 100644 index 9286bed..0000000 --- a/lab/EAs/double-top-bottom-catcher.mq5 +++ /dev/null @@ -1,350 +0,0 @@ -//+------------------------------------------------------------------+ -//| double-top-bottom-catcher.mq5 | -//| Lab EA: Double top/bottom catcher with EMA distance + HTF trend | -//+------------------------------------------------------------------+ -#property copyright "Lab" -#property version "1.00" - -#include - -input ENUM_TIMEFRAMES InpTf = PERIOD_M1; // Signal timeframe -input ENUM_TIMEFRAMES InpHtf = PERIOD_M5; // Higher timeframe -input bool InpUseHtfFilter = true; // Require HTF trend alignment -input int InpEmaFast = 9; // Fast EMA -input int InpEmaSlow = 21; // Slow EMA - -input int InpPivotLeft = 2; // Pivot bars left -input int InpPivotRight = 2; // Pivot bars right -input int InpPatternLookbackBars = 180; // Search range for patterns -input int InpMinPatternSeparation = 6; // Min bars between tops/bottoms -input int InpMaxPatternSeparation = 50; // Max bars between tops/bottoms -input double InpTopBottomTolPts = 120; // Max diff between top/top or bottom/bottom -input double InpMinEmaPriceDistPts = 80; // Min stretch from EMA at 2nd touch -input int InpPrevLevelLookback = 120; // Lookback to find previous support/resistance - -input double InpLots = 0.01; -input int InpSlBufferPts = 25; // SL buffer beyond pattern extreme -input ulong InpMagic = 20260425; -input int InpSlippagePts = 30; - -CTrade g_trade; - -int g_hEmaFast = INVALID_HANDLE; -int g_hEmaSlow = INVALID_HANDLE; -int g_hEmaFastHtf = INVALID_HANDLE; -int g_hEmaSlowHtf = INVALID_HANDLE; - -double g_emaFast[]; -double g_emaSlow[]; -double g_emaFastHtf[]; -double g_emaSlowHtf[]; - -int OnInit() -{ - g_trade.SetExpertMagicNumber(InpMagic); - g_trade.SetDeviationInPoints(InpSlippagePts); - SetTradeFillingBySymbol(); - - g_hEmaFast = iMA(_Symbol, InpTf, InpEmaFast, 0, MODE_EMA, PRICE_CLOSE); - g_hEmaSlow = iMA(_Symbol, InpTf, InpEmaSlow, 0, MODE_EMA, PRICE_CLOSE); - g_hEmaFastHtf = iMA(_Symbol, InpHtf, InpEmaFast, 0, MODE_EMA, PRICE_CLOSE); - g_hEmaSlowHtf = iMA(_Symbol, InpHtf, InpEmaSlow, 0, MODE_EMA, PRICE_CLOSE); - - if(g_hEmaFast == INVALID_HANDLE || g_hEmaSlow == INVALID_HANDLE || - g_hEmaFastHtf == INVALID_HANDLE || g_hEmaSlowHtf == INVALID_HANDLE) - return INIT_FAILED; - - ArraySetAsSeries(g_emaFast, true); - ArraySetAsSeries(g_emaSlow, true); - ArraySetAsSeries(g_emaFastHtf, true); - ArraySetAsSeries(g_emaSlowHtf, true); - - return INIT_SUCCEEDED; -} - -void OnDeinit(const int reason) -{ - if(g_hEmaFast != INVALID_HANDLE) IndicatorRelease(g_hEmaFast); - if(g_hEmaSlow != INVALID_HANDLE) IndicatorRelease(g_hEmaSlow); - if(g_hEmaFastHtf != INVALID_HANDLE) IndicatorRelease(g_hEmaFastHtf); - if(g_hEmaSlowHtf != INVALID_HANDLE) IndicatorRelease(g_hEmaSlowHtf); -} - -void OnTick() -{ - static datetime lastBar = 0; - datetime barTime = iTime(_Symbol, InpTf, 0); - if(barTime == lastBar) - return; - lastBar = barTime; - - const int need = MathMax(260, InpPatternLookbackBars + InpPrevLevelLookback + 20); - if(CopyBuffer(g_hEmaFast, 0, 0, need, g_emaFast) < need) return; - if(CopyBuffer(g_hEmaSlow, 0, 0, need, g_emaSlow) < need) return; - if(CopyBuffer(g_hEmaFastHtf, 0, 0, 5, g_emaFastHtf) < 5) return; - if(CopyBuffer(g_hEmaSlowHtf, 0, 0, 5, g_emaSlowHtf) < 5) return; - - if(PositionExistsForMagic()) - return; - - TryEnterLongDoubleBottom(); - if(!PositionExistsForMagic()) - TryEnterShortDoubleTop(); -} - -void TryEnterLongDoubleBottom() -{ - int firstBottom = -1; // older - int secondBottom = -1; // newer - double neckline = 0.0; - double lowA = 0.0; - double lowB = 0.0; - - if(!FindDoubleBottom(firstBottom, secondBottom, neckline, lowA, lowB)) - return; - - const int c = 1; - double close1 = iClose(_Symbol, InpTf, c); - if(close1 <= neckline) - return; // wait for neckline break confirmation - - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - double stretched = g_emaFast[secondBottom] - lowB; - if(stretched < InpMinEmaPriceDistPts * pt) - return; // no enough EMA/price displacement for reversal - - if(close1 <= g_emaFast[c]) - return; // keep confirmation strict: close above EMA fast - - if(InpUseHtfFilter && !(g_emaFastHtf[c] > g_emaSlowHtf[c])) - return; - - double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); - int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); - double sl = MathMin(lowA, lowB) - InpSlBufferPts * pt; - double tp = FindPreviousResistance(firstBottom); - if(tp <= ask + pt) - return; - if(sl >= ask - pt) - return; - - sl = NormalizeDouble(sl, digits); - tp = NormalizeDouble(tp, digits); - g_trade.Buy(InpLots, _Symbol, ask, sl, tp, "Double bottom"); -} - -void TryEnterShortDoubleTop() -{ - int firstTop = -1; // older - int secondTop = -1; // newer - double neckline = 0.0; - double hiA = 0.0; - double hiB = 0.0; - - if(!FindDoubleTop(firstTop, secondTop, neckline, hiA, hiB)) - return; - - const int c = 1; - double close1 = iClose(_Symbol, InpTf, c); - if(close1 >= neckline) - return; // wait for neckline break confirmation - - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - double stretched = hiB - g_emaFast[secondTop]; - if(stretched < InpMinEmaPriceDistPts * pt) - return; // no enough EMA/price displacement for reversal - - if(close1 >= g_emaFast[c]) - return; // keep confirmation strict: close below EMA fast - - if(InpUseHtfFilter && !(g_emaFastHtf[c] < g_emaSlowHtf[c])) - return; - - double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); - int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); - double sl = MathMax(hiA, hiB) + InpSlBufferPts * pt; - double tp = FindPreviousSupport(firstTop); - if(tp >= bid - pt) - return; - if(sl <= bid + pt) - return; - - sl = NormalizeDouble(sl, digits); - tp = NormalizeDouble(tp, digits); - g_trade.Sell(InpLots, _Symbol, bid, sl, tp, "Double top"); -} - -bool FindDoubleBottom(int &firstBottom, int &secondBottom, double &neckline, double &lowA, double &lowB) -{ - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - int minShift = InpPivotRight + 1; - int maxShift = MathMin(InpPatternLookbackBars, Bars(_Symbol, InpTf) - InpPivotLeft - 2); - if(maxShift <= minShift + InpPivotLeft + InpPivotRight + 2) - return false; - - for(int newer = minShift; newer <= maxShift; newer++) - { - if(!IsPivotLow(newer)) - continue; - for(int older = newer + InpMinPatternSeparation; older <= maxShift; older++) - { - int sep = older - newer; - if(sep > InpMaxPatternSeparation) - break; - if(!IsPivotLow(older)) - continue; - - double lNew = iLow(_Symbol, InpTf, newer); - double lOld = iLow(_Symbol, InpTf, older); - if(MathAbs(lNew - lOld) > InpTopBottomTolPts * pt) - continue; - - double neck = HighestHighBetween(newer, older); - if(neck <= 0.0) - continue; - - firstBottom = older; - secondBottom = newer; - lowA = lOld; - lowB = lNew; - neckline = neck; - return true; - } - } - return false; -} - -bool FindDoubleTop(int &firstTop, int &secondTop, double &neckline, double &hiA, double &hiB) -{ - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - int minShift = InpPivotRight + 1; - int maxShift = MathMin(InpPatternLookbackBars, Bars(_Symbol, InpTf) - InpPivotLeft - 2); - if(maxShift <= minShift + InpPivotLeft + InpPivotRight + 2) - return false; - - for(int newer = minShift; newer <= maxShift; newer++) - { - if(!IsPivotHigh(newer)) - continue; - for(int older = newer + InpMinPatternSeparation; older <= maxShift; older++) - { - int sep = older - newer; - if(sep > InpMaxPatternSeparation) - break; - if(!IsPivotHigh(older)) - continue; - - double hNew = iHigh(_Symbol, InpTf, newer); - double hOld = iHigh(_Symbol, InpTf, older); - if(MathAbs(hNew - hOld) > InpTopBottomTolPts * pt) - continue; - - double neck = LowestLowBetween(newer, older); - if(neck <= 0.0) - continue; - - firstTop = older; - secondTop = newer; - hiA = hOld; - hiB = hNew; - neckline = neck; - return true; - } - } - return false; -} - -bool IsPivotLow(const int shift) -{ - double v = iLow(_Symbol, InpTf, shift); - for(int i = 1; i <= InpPivotLeft; i++) - if(iLow(_Symbol, InpTf, shift + i) <= v) return false; - for(int i = 1; i <= InpPivotRight; i++) - if(iLow(_Symbol, InpTf, shift - i) < v) return false; - return true; -} - -bool IsPivotHigh(const int shift) -{ - double v = iHigh(_Symbol, InpTf, shift); - for(int i = 1; i <= InpPivotLeft; i++) - if(iHigh(_Symbol, InpTf, shift + i) >= v) return false; - for(int i = 1; i <= InpPivotRight; i++) - if(iHigh(_Symbol, InpTf, shift - i) > v) return false; - return true; -} - -double HighestHighBetween(const int shiftA, const int shiftB) -{ - int from = MathMin(shiftA, shiftB); - int to = MathMax(shiftA, shiftB); - double v = -DBL_MAX; - for(int i = from; i <= to; i++) - v = MathMax(v, iHigh(_Symbol, InpTf, i)); - return v; -} - -double LowestLowBetween(const int shiftA, const int shiftB) -{ - int from = MathMin(shiftA, shiftB); - int to = MathMax(shiftA, shiftB); - double v = DBL_MAX; - for(int i = from; i <= to; i++) - v = MathMin(v, iLow(_Symbol, InpTf, i)); - return v; -} - -double FindPreviousResistance(const int firstBottomShift) -{ - int start = firstBottomShift + 1; - int end = firstBottomShift + InpPrevLevelLookback; - int bars = Bars(_Symbol, InpTf); - end = MathMin(end, bars - 2); - if(start > end) - return 0.0; - - double r = -DBL_MAX; - for(int i = start; i <= end; i++) - r = MathMax(r, iHigh(_Symbol, InpTf, i)); - return r; -} - -double FindPreviousSupport(const int firstTopShift) -{ - int start = firstTopShift + 1; - int end = firstTopShift + InpPrevLevelLookback; - int bars = Bars(_Symbol, InpTf); - end = MathMin(end, bars - 2); - if(start > end) - return 0.0; - - double s = DBL_MAX; - for(int i = start; i <= end; i++) - s = MathMin(s, iLow(_Symbol, InpTf, i)); - return s; -} - -bool PositionExistsForMagic() -{ - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong ticket = PositionGetTicket(i); - if(ticket == 0) continue; - if(!PositionSelectByTicket(ticket)) continue; - if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) == InpMagic) - return true; - } - return false; -} - -void SetTradeFillingBySymbol() -{ - long mask = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE); - if((mask & SYMBOL_FILLING_IOC) != 0) - g_trade.SetTypeFilling(ORDER_FILLING_IOC); - else if((mask & SYMBOL_FILLING_FOK) != 0) - g_trade.SetTypeFilling(ORDER_FILLING_FOK); - else - g_trade.SetTypeFilling(ORDER_FILLING_RETURN); -} diff --git a/lab/EAs/rsi-dual-martingale-hybrid.mq5 b/lab/EAs/rsi-dual-martingale-hybrid.mq5 deleted file mode 100644 index 066a3d3..0000000 --- a/lab/EAs/rsi-dual-martingale-hybrid.mq5 +++ /dev/null @@ -1,404 +0,0 @@ -//+------------------------------------------------------------------+ -//| rsi-dual-martingale-hybrid.mq5 | -//| Two robots: RSI reversal martingale + RSI midpoint trend helper | -//+------------------------------------------------------------------+ -#property copyright "Lab" -#property version "1.00" - -#include - -//--- core -input ENUM_TIMEFRAMES InpTf = PERIOD_M5; -input int InpRsiLen = 14; -input double InpRsiOverbought = 70.0; -input double InpRsiOversold = 30.0; -input double InpRsiMid = 50.0; - -//--- money -input double InpBaseLot = 0.01; -input int InpSlippagePts = 30; -input ulong InpMagicBase = 2026042501; - -//--- robot A: RSI reversal martingale -input bool InpEnableReversalMartingale = true; -input double InpMartingaleMult = 1.7; -input int InpMartingaleStepPts = 300; -input int InpMartingaleMaxLevels = 6; - -//--- robot B: reverse martingale trend follow (RSI cross midpoint) -input bool InpEnableTrendReverseMartingale = true; -input double InpTrendPyramidMult = 1.5; -input int InpTrendPyramidStepPts = 250; -input int InpTrendMaxLevels = 5; - -//--- rescue / coordination -input bool InpEnableRescue = true; -input double InpTroubleLossMoney = -8.0; // martingale basket in trouble below this -input double InpRescueLotMult = 2.0; // base lot multiplier for rescue trade -input int InpRescueCooldownBars = 3; - -CTrade g_trade; -int g_hRsi = INVALID_HANDLE; -double g_rsi[]; - -datetime g_lastBar = 0; -int g_lastRescueBarIndex = -1000000; - -enum RobotDirection -{ - DIR_NONE = 0, - DIR_BUY = 1, - DIR_SELL = -1 -}; - -// Magic map: -// base + 1 : reversal martingale basket -// base + 2 : trend reverse-martingale basket -// base + 3 : rescue positions -ulong MagicRev() { return InpMagicBase + 1; } -ulong MagicTrend() { return InpMagicBase + 2; } -ulong MagicRescue() { return InpMagicBase + 3; } - -int OnInit() -{ - g_trade.SetDeviationInPoints(InpSlippagePts); - SetTradeFillingBySymbol(); - - g_hRsi = iRSI(_Symbol, InpTf, InpRsiLen, PRICE_CLOSE); - if(g_hRsi == INVALID_HANDLE) - return INIT_FAILED; - - ArraySetAsSeries(g_rsi, true); - return INIT_SUCCEEDED; -} - -void OnDeinit(const int reason) -{ - if(g_hRsi != INVALID_HANDLE) - IndicatorRelease(g_hRsi); -} - -void OnTick() -{ - if(CopyBuffer(g_hRsi, 0, 0, 10, g_rsi) < 10) - return; - - // Rescue management can run every tick. - ManageRescueCoordination(); - - datetime t = iTime(_Symbol, InpTf, 0); - if(t == g_lastBar) - return; - g_lastBar = t; - - if(InpEnableReversalMartingale) - RunReversalMartingale(); - - if(InpEnableTrendReverseMartingale) - RunTrendReverseMartingale(); -} - -void RunReversalMartingale() -{ - ulong magic = MagicRev(); - int count = BasketCountByMagic(magic); - double rsi1 = g_rsi[1]; - - // No fixed TP/SL: close reversal basket when mean-reversion reaches RSI midpoint. - RobotDirection dir = BasketDirectionByMagic(magic); - if(count > 0 && - ((dir == DIR_BUY && rsi1 >= InpRsiMid) || - (dir == DIR_SELL && rsi1 <= InpRsiMid))) - { - CloseBasketByMagic(magic); - return; - } - - double rsi2 = g_rsi[2]; - - if(count == 0) - { - if(rsi2 < InpRsiOversold && rsi1 > InpRsiOversold) - { - OpenMarketByDirection(magic, DIR_BUY, NormalizeVolume(InpBaseLot), "REV start"); - return; - } - if(rsi2 > InpRsiOverbought && rsi1 < InpRsiOverbought) - { - OpenMarketByDirection(magic, DIR_SELL, NormalizeVolume(InpBaseLot), "REV start"); - return; - } - return; - } - - if(dir == DIR_NONE || count >= InpMartingaleMaxLevels) - return; - - double lastEntry = LastEntryPriceByMagic(magic); - double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); - double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - - bool adverseEnough = false; - if(dir == DIR_BUY) - adverseEnough = (lastEntry - bid) >= (InpMartingaleStepPts * pt); - else if(dir == DIR_SELL) - adverseEnough = (ask - lastEntry) >= (InpMartingaleStepPts * pt); - - if(!adverseEnough) - return; - - double lot = NormalizeVolume(InpBaseLot * MathPow(InpMartingaleMult, count)); - OpenMarketByDirection(magic, dir, lot, "REV scale"); -} - -void RunTrendReverseMartingale() -{ - ulong magic = MagicTrend(); - int count = BasketCountByMagic(magic); - RobotDirection dir = BasketDirectionByMagic(magic); - double basketProfit = BasketProfitByMagic(magic); - double rsi1 = g_rsi[1]; - double rsi2 = g_rsi[2]; - - // No fixed TP/SL: close trend basket when RSI crosses back through midpoint. - if(count > 0 && - ((dir == DIR_BUY && rsi2 > InpRsiMid && rsi1 < InpRsiMid) || - (dir == DIR_SELL && rsi2 < InpRsiMid && rsi1 > InpRsiMid))) - { - CloseBasketByMagic(magic); - return; - } - - if(count == 0) - { - if(rsi2 < InpRsiMid && rsi1 > InpRsiMid) - { - OpenMarketByDirection(magic, DIR_BUY, NormalizeVolume(InpBaseLot), "TREND cross"); - return; - } - if(rsi2 > InpRsiMid && rsi1 < InpRsiMid) - { - OpenMarketByDirection(magic, DIR_SELL, NormalizeVolume(InpBaseLot), "TREND cross"); - return; - } - return; - } - - if(dir == DIR_NONE || count >= InpTrendMaxLevels) - return; - if(basketProfit <= 0.0) - return; // reverse martingale: only add into winners - - double lastEntry = LastEntryPriceByMagic(magic); - double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); - double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - - bool favorableEnough = false; - if(dir == DIR_BUY) - favorableEnough = (bid - lastEntry) >= (InpTrendPyramidStepPts * pt); - else if(dir == DIR_SELL) - favorableEnough = (lastEntry - ask) >= (InpTrendPyramidStepPts * pt); - - if(!favorableEnough) - return; - - double lot = NormalizeVolume(InpBaseLot * MathPow(InpTrendPyramidMult, count)); - OpenMarketByDirection(magic, dir, lot, "TREND add"); -} - -void ManageRescueCoordination() -{ - if(!InpEnableRescue) - return; - - ulong mRev = MagicRev(); - ulong mRes = MagicRescue(); - - double revProfit = BasketProfitByMagic(mRev); - int revCount = BasketCountByMagic(mRev); - - if(revCount == 0) - { - CloseBasketByMagic(mRes); - return; - } - - // Phase 1: no fixed rescue TP/SL; close rescue on RSI midpoint recross against rescue direction. - RobotDirection rescueDir = BasketDirectionByMagic(mRes); - if(BasketCountByMagic(mRes) > 0 && - ((rescueDir == DIR_BUY && g_rsi[2] > InpRsiMid && g_rsi[1] < InpRsiMid) || - (rescueDir == DIR_SELL && g_rsi[2] < InpRsiMid && g_rsi[1] > InpRsiMid))) - { - ulong worstTicket = WorstTicketByMagic(mRev); - CloseBasketByMagic(mRes); - if(worstTicket != 0) - g_trade.PositionClose(worstTicket); - return; - } - - // Phase 2: if martingale basket is in trouble, launch one trend-aligned rescue trade. - if(revProfit > InpTroubleLossMoney) - return; - - if(BasketCountByMagic(mRes) > 0) - return; - - int barsNow = iBars(_Symbol, InpTf); - if((barsNow - g_lastRescueBarIndex) < InpRescueCooldownBars) - return; - - RobotDirection helperDir = (g_rsi[1] >= InpRsiMid ? DIR_BUY : DIR_SELL); - - // avoid adding rescue in same direction as losing reversal basket when RSI trend disagrees - RobotDirection revDir = BasketDirectionByMagic(mRev); - if(revDir == helperDir) - helperDir = (helperDir == DIR_BUY ? DIR_SELL : DIR_BUY); - - double lot = NormalizeVolume(InpBaseLot * InpRescueLotMult); - if(OpenMarketByDirection(mRes, helperDir, lot, "RESCUE")) - g_lastRescueBarIndex = barsNow; -} - -bool OpenMarketByDirection(const ulong magic, const RobotDirection dir, const double lot, const string comment) -{ - if(dir == DIR_NONE || lot <= 0.0) - return false; - - g_trade.SetExpertMagicNumber(magic); - - double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); - double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); - - if(dir == DIR_BUY) - return g_trade.Buy(lot, _Symbol, ask, 0.0, 0.0, comment); - return g_trade.Sell(lot, _Symbol, bid, 0.0, 0.0, comment); -} - -int BasketCountByMagic(const ulong magic) -{ - int n = 0; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong ticket = PositionGetTicket(i); - if(ticket == 0) continue; - if(!PositionSelectByTicket(ticket)) continue; - if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != magic) continue; - n++; - } - return n; -} - -double BasketProfitByMagic(const ulong magic) -{ - double sum = 0.0; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong ticket = PositionGetTicket(i); - if(ticket == 0) continue; - if(!PositionSelectByTicket(ticket)) continue; - if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != magic) continue; - sum += PositionGetDouble(POSITION_PROFIT); - } - return sum; -} - -RobotDirection BasketDirectionByMagic(const ulong magic) -{ - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong ticket = PositionGetTicket(i); - if(ticket == 0) continue; - if(!PositionSelectByTicket(ticket)) continue; - if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != magic) continue; - long type = PositionGetInteger(POSITION_TYPE); - return (type == POSITION_TYPE_BUY ? DIR_BUY : DIR_SELL); - } - return DIR_NONE; -} - -double LastEntryPriceByMagic(const ulong magic) -{ - datetime newest = 0; - double price = 0.0; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong ticket = PositionGetTicket(i); - if(ticket == 0) continue; - if(!PositionSelectByTicket(ticket)) continue; - if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != magic) continue; - datetime t = (datetime)PositionGetInteger(POSITION_TIME); - if(t >= newest) - { - newest = t; - price = PositionGetDouble(POSITION_PRICE_OPEN); - } - } - return price; -} - -ulong WorstTicketByMagic(const ulong magic) -{ - double worstProfit = DBL_MAX; - ulong worstTicket = 0; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong ticket = PositionGetTicket(i); - if(ticket == 0) continue; - if(!PositionSelectByTicket(ticket)) continue; - if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != magic) continue; - double p = PositionGetDouble(POSITION_PROFIT); - if(p < worstProfit) - { - worstProfit = p; - worstTicket = ticket; - } - } - return worstTicket; -} - -void CloseBasketByMagic(const ulong magic) -{ - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong ticket = PositionGetTicket(i); - if(ticket == 0) continue; - if(!PositionSelectByTicket(ticket)) continue; - if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != magic) continue; - g_trade.PositionClose(ticket); - } -} - -double NormalizeVolume(const double volRaw) -{ - double vMin = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); - double vMax = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX); - double vStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP); - if(vStep <= 0.0) - vStep = 0.01; - - double v = MathMax(vMin, MathMin(vMax, volRaw)); - v = MathFloor(v / vStep) * vStep; - int vd = 2; - if(vStep < 0.01) vd = 3; - if(vStep < 0.001) vd = 4; - return NormalizeDouble(v, vd); -} - -void SetTradeFillingBySymbol() -{ - long mask = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE); - if((mask & SYMBOL_FILLING_IOC) != 0) - g_trade.SetTypeFilling(ORDER_FILLING_IOC); - else if((mask & SYMBOL_FILLING_FOK) != 0) - g_trade.SetTypeFilling(ORDER_FILLING_FOK); - else - g_trade.SetTypeFilling(ORDER_FILLING_RETURN); -} diff --git a/lab/EAs/rsi-scalping.mq5 b/lab/EAs/rsi-scalping.mq5 deleted file mode 100644 index 71b76c6..0000000 --- a/lab/EAs/rsi-scalping.mq5 +++ /dev/null @@ -1,381 +0,0 @@ -//+------------------------------------------------------------------+ -//| rsi-scalping.mq5 | -//| Lab EA: EMA 9/21 + Stochastic RSI — M1 scalping rules (tutorial) | -//+------------------------------------------------------------------+ -#property copyright "Lab" -#property version "1.00" - -#include - -//--- inputs: indicator tuning (video defaults) -input ENUM_TIMEFRAMES InpTf = PERIOD_M1; // Chart / signal timeframe -input int InpEmaFast = 9; // EMA fast (short-term) -input int InpEmaSlow = 21; // EMA slow (trend) -input int InpRsiLen = 14; // RSI length (Stoch RSI core) -input int InpStochLen = 14; // Stochastic lookback on RSI -input int InpStochK = 4; // Stoch RSI %K smoothing -input int InpStochD = 7; // Stoch RSI %D smoothing -input double InpObLevel = 80.0; // Overbought line -input double InpOsLevel = 20.0; // Oversold line -//--- filters -input bool InpUseMidZoneFilter = true; // Skip if K,D in 40–60 (indecision) -input int InpMinBarsSinceCross = 10; // Min bars between EMA crosses -input bool InpUseHtfFilter = false; // Align with higher TF EMAs -input ENUM_TIMEFRAMES InpHtf = PERIOD_M5; // Higher timeframe -input double InpMinEmaSepPts = 0.0; // Min |EMA9-EMA21| in points (0=off) -//--- risk -input double InpLots = 0.01; -input int InpSlBufferPts = 20; // Extra SL beyond last 2-bar extreme -input double InpTpRiskMultiple = 1.75; // TP = risk * this (1.5–2.0 typical) -input bool InpExitOnEma9Break = true; // Close long if close < EMA9 (vice versa shorts) -input bool InpExitOnStochZone = true; // Close long at Stoch RSI ≥ OB; short at ≤ OS -//--- session -input ulong InpMagic = 20260412; -input int InpSlippagePts = 30; - -CTrade g_trade; - -int g_hEmaFast = INVALID_HANDLE; -int g_hEmaSlow = INVALID_HANDLE; -int g_hRsi = INVALID_HANDLE; -int g_hEmaFastHtf = INVALID_HANDLE; -int g_hEmaSlowHtf = INVALID_HANDLE; - -double g_emaFast[]; -double g_emaSlow[]; -double g_rsi[]; -double g_stochK[]; -double g_stochD[]; -double g_emaFastHtf[]; -double g_emaSlowHtf[]; - -//+------------------------------------------------------------------+ -int OnInit() -{ - g_trade.SetExpertMagicNumber(InpMagic); - g_trade.SetDeviationInPoints(InpSlippagePts); - SetTradeFillingBySymbol(); - - g_hEmaFast = iMA(_Symbol, InpTf, InpEmaFast, 0, MODE_EMA, PRICE_CLOSE); - g_hEmaSlow = iMA(_Symbol, InpTf, InpEmaSlow, 0, MODE_EMA, PRICE_CLOSE); - g_hRsi = iRSI(_Symbol, InpTf, InpRsiLen, PRICE_CLOSE); - if(InpUseHtfFilter) - { - g_hEmaFastHtf = iMA(_Symbol, InpHtf, InpEmaFast, 0, MODE_EMA, PRICE_CLOSE); - g_hEmaSlowHtf = iMA(_Symbol, InpHtf, InpEmaSlow, 0, MODE_EMA, PRICE_CLOSE); - } - - if(g_hEmaFast == INVALID_HANDLE || g_hEmaSlow == INVALID_HANDLE || g_hRsi == INVALID_HANDLE) - return INIT_FAILED; - if(InpUseHtfFilter && (g_hEmaFastHtf == INVALID_HANDLE || g_hEmaSlowHtf == INVALID_HANDLE)) - return INIT_FAILED; - - ArraySetAsSeries(g_emaFast, true); - ArraySetAsSeries(g_emaSlow, true); - ArraySetAsSeries(g_rsi, true); - ArraySetAsSeries(g_stochK, true); - ArraySetAsSeries(g_stochD, true); - ArraySetAsSeries(g_emaFastHtf, true); - ArraySetAsSeries(g_emaSlowHtf, true); - - return INIT_SUCCEEDED; -} - -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) -{ - if(g_hEmaFast != INVALID_HANDLE) IndicatorRelease(g_hEmaFast); - if(g_hEmaSlow != INVALID_HANDLE) IndicatorRelease(g_hEmaSlow); - if(g_hRsi != INVALID_HANDLE) IndicatorRelease(g_hRsi); - if(g_hEmaFastHtf != INVALID_HANDLE) IndicatorRelease(g_hEmaFastHtf); - if(g_hEmaSlowHtf != INVALID_HANDLE) IndicatorRelease(g_hEmaSlowHtf); -} - -//+------------------------------------------------------------------+ -void OnTick() -{ - static datetime last_bar = 0; - datetime t = iTime(_Symbol, InpTf, 0); - if(t == last_bar) - { - // Still manage exits on tick if you use break-even / trailing — here bar-based only - return; - } - last_bar = t; - - const int need = 400; - if(CopyBuffer(g_hEmaFast, 0, 0, need, g_emaFast) < need) return; - if(CopyBuffer(g_hEmaSlow, 0, 0, need, g_emaSlow) < need) return; - if(CopyBuffer(g_hRsi, 0, 0, need + InpStochLen + InpStochK + InpStochD + 5, g_rsi) < need) return; - - if(!ComputeStochRsi(g_rsi, InpStochLen, InpStochK, InpStochD, g_stochK, g_stochD, need)) - return; - - if(InpUseHtfFilter) - { - if(CopyBuffer(g_hEmaFastHtf, 0, 0, 3, g_emaFastHtf) < 3) return; - if(CopyBuffer(g_hEmaSlowHtf, 0, 0, 3, g_emaSlowHtf) < 3) return; - } - - // bar 1 = last closed candle (tutorial: trade after confirmation candle closes) - const int c = 1; - const int p = 2; - - if(PositionExistsForMagic()) - { - ManageOpenPosition(c, p); - return; - } - - if(!PassesFlatEmaFilter(c)) - return; - - // Long: EMA9 crosses EMA21 up at bar 1 close; Stoch RSI K,D leave oversold with bullish K/D cross - const bool bull_cross = (g_emaFast[p] < g_emaSlow[p] && g_emaFast[c] > g_emaSlow[c]); - const bool bear_cross = (g_emaFast[p] > g_emaSlow[p] && g_emaFast[c] < g_emaSlow[c]); - - if(!bull_cross && !bear_cross) - return; - - if(InpUseHtfFilter) - { - if(bull_cross && !(g_emaFastHtf[c] > g_emaSlowHtf[c])) - return; - if(bear_cross && !(g_emaFastHtf[c] < g_emaSlowHtf[c])) - return; - } - - if(!MinBarsSincePreviousCrossOk()) - return; - - const bool stoch_long_ok = - (g_stochK[p] < InpOsLevel && g_stochD[p] < InpOsLevel) && - (g_stochK[c] > g_stochD[c] && g_stochK[p] <= g_stochD[p]) && - (g_stochK[c] > InpOsLevel * 0.9); // "left" oversold — allow ~18 if OS=20 - - const bool stoch_short_ok = - (g_stochK[p] > InpObLevel && g_stochD[p] > InpObLevel) && - (g_stochK[c] < g_stochD[c] && g_stochK[p] >= g_stochD[p]) && - (g_stochK[c] < InpObLevel * 1.05); - - if(InpUseMidZoneFilter) - { - if(g_stochK[c] > 40.0 && g_stochK[c] < 60.0 && g_stochD[c] > 40.0 && g_stochD[c] < 60.0) - return; - } - - if(bull_cross && stoch_long_ok) - { - double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - int dg = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); - double low12 = MathMin(iLow(_Symbol, InpTf, c), iLow(_Symbol, InpTf, p)); - double sl = low12 - InpSlBufferPts * pt; - sl = NormalizeDouble(sl, dg); - if(sl >= ask - pt) - sl = ask - 10 * pt; - double risk = ask - sl; - if(risk <= 0) return; - double tp = ask + risk * InpTpRiskMultiple; - tp = NormalizeDouble(tp, dg); - g_trade.Buy(InpLots, _Symbol, ask, sl, tp, "EMA+StochRSI long"); - return; - } - - if(bear_cross && stoch_short_ok) - { - double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - int dg = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS); - double hi12 = MathMax(iHigh(_Symbol, InpTf, c), iHigh(_Symbol, InpTf, p)); - double sl = hi12 + InpSlBufferPts * pt; - sl = NormalizeDouble(sl, dg); - if(sl <= bid + pt) - sl = bid + 10 * pt; - double risk = sl - bid; - if(risk <= 0) return; - double tp = bid - risk * InpTpRiskMultiple; - tp = NormalizeDouble(tp, dg); - g_trade.Sell(InpLots, _Symbol, bid, sl, tp, "EMA+StochRSI short"); - } -} - -//+------------------------------------------------------------------+ -bool ComputeStochRsi(const double &rsi[], const int stoch_len, const int k_len, const int d_len, - double &out_k[], double &out_d[], const int out_count) -{ - int rsi_count = ArraySize(rsi); - static double raw[]; - ArrayResize(raw, rsi_count); - ArraySetAsSeries(raw, true); - - for(int i = 0; i < rsi_count; i++) - { - if(i + stoch_len > rsi_count) - { - raw[i] = 50.0; - continue; - } - double lo = rsi[i]; - double hi = rsi[i]; - for(int j = 0; j < stoch_len; j++) - { - double v = rsi[i + j]; - if(v < lo) lo = v; - if(v > hi) hi = v; - } - if(hi == lo) - raw[i] = 50.0; - else - raw[i] = (rsi[i] - lo) / (hi - lo) * 100.0; - } - - ArrayResize(out_k, out_count); - ArrayResize(out_d, out_count); - ArraySetAsSeries(out_k, true); - ArraySetAsSeries(out_d, true); - - static double k_unsm[]; - ArrayResize(k_unsm, rsi_count); - ArraySetAsSeries(k_unsm, true); - - for(int i = 0; i < rsi_count; i++) - { - if(i + k_len > rsi_count) - { - k_unsm[i] = raw[i]; - continue; - } - double s = 0.0; - for(int j = 0; j < k_len; j++) - s += raw[i + j]; - k_unsm[i] = s / (double)k_len; - } - - for(int i = 0; i < out_count; i++) - { - if(i + d_len > rsi_count) - { - out_k[i] = k_unsm[i]; - out_d[i] = k_unsm[i]; - continue; - } - double sk = 0.0; - for(int j = 0; j < d_len; j++) - sk += k_unsm[i + j]; - out_d[i] = sk / (double)d_len; - out_k[i] = k_unsm[i]; - } - return true; -} - -//+------------------------------------------------------------------+ -bool PassesFlatEmaFilter(const int c) -{ - if(InpMinEmaSepPts <= 0.0) - return true; - double pt = SymbolInfoDouble(_Symbol, SYMBOL_POINT); - double sep = MathAbs(g_emaFast[c] - g_emaSlow[c]) / pt; - return (sep >= InpMinEmaSepPts); -} - -//+------------------------------------------------------------------+ -bool MinBarsSincePreviousCrossOk() -{ - if(InpMinBarsSinceCross <= 0) - return true; - // Cross under test completed on bar 1 (index c=1): between shift 2 and 1. - // Earliest earlier cross: between i+1 and i for i >= 3. - for(int i = 3; i < 300; i++) - { - const bool cu = (g_emaFast[i + 1] < g_emaSlow[i + 1] && g_emaFast[i] > g_emaSlow[i]); - const bool cd = (g_emaFast[i + 1] > g_emaSlow[i + 1] && g_emaFast[i] < g_emaSlow[i]); - if(cu || cd) - return (i - 1 >= InpMinBarsSinceCross); - } - return true; -} - -//+------------------------------------------------------------------+ -bool PositionExistsForMagic() -{ - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong ticket = PositionGetTicket(i); - if(ticket == 0) continue; - if(!PositionSelectByTicket(ticket)) continue; - if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) == InpMagic) - return true; - } - return false; -} - -//+------------------------------------------------------------------+ -void SetTradeFillingBySymbol() -{ - long mask = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE); - if((mask & SYMBOL_FILLING_IOC) != 0) - g_trade.SetTypeFilling(ORDER_FILLING_IOC); - else if((mask & SYMBOL_FILLING_FOK) != 0) - g_trade.SetTypeFilling(ORDER_FILLING_FOK); - else - g_trade.SetTypeFilling(ORDER_FILLING_RETURN); -} - -//+------------------------------------------------------------------+ -void ManageOpenPosition(const int c, const int p) -{ - if(!PositionSelectBySymbolForMagic()) - return; - ulong ticket = (ulong)PositionGetInteger(POSITION_TICKET); - long type = PositionGetInteger(POSITION_TYPE); - double k1 = g_stochK[c]; - double d1 = g_stochD[c]; - - if(InpExitOnEma9Break) - { - double close1 = iClose(_Symbol, InpTf, c); - if(type == POSITION_TYPE_BUY && close1 < g_emaFast[c]) - { - g_trade.PositionClose(ticket); - return; - } - if(type == POSITION_TYPE_SELL && close1 > g_emaFast[c]) - { - g_trade.PositionClose(ticket); - return; - } - } - - if(InpExitOnStochZone) - { - if(type == POSITION_TYPE_BUY && k1 >= InpObLevel && d1 >= InpObLevel * 0.95) - { - g_trade.PositionClose(ticket); - return; - } - if(type == POSITION_TYPE_SELL && k1 <= InpOsLevel && d1 <= InpOsLevel * 1.05) - { - g_trade.PositionClose(ticket); - return; - } - } -} - -//+------------------------------------------------------------------+ -bool PositionSelectBySymbolForMagic() -{ - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - ulong t = PositionGetTicket(i); - if(t == 0) continue; - if(!PositionSelectByTicket(t)) continue; - if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) == InpMagic) - return true; - } - return false; -} - -//+------------------------------------------------------------------+ diff --git a/lab/EAs/rsiDivergence.mq5 b/lab/EAs/rsiDivergence.mq5 deleted file mode 100644 index ea2527c..0000000 --- a/lab/EAs/rsiDivergence.mq5 +++ /dev/null @@ -1,384 +0,0 @@ -//+------------------------------------------------------------------+ -//| rsiDivergence.mq5 | -//| Lab EA: RSI divergence + EMA distance filter | -//+------------------------------------------------------------------+ -#property copyright "Lab" -#property version "1.00" -#property strict - -#include - -input group "=== Market ===" -input string InpSymbol = ""; -input ENUM_TIMEFRAMES InpTf = PERIOD_CURRENT; -input double InpLots = 0.01; -input ulong InpMagic = 202604231; -input int InpSlippagePts = 30; -input int InpMaxPositions = 1; -input bool InpRequireFlat = true; // no new entry while any position with this magic exists - -input group "=== Indicators ===" -input int InpRsiPeriod = 14; -input int InpEmaPeriod = 200; - -input group "=== Swing / divergence ===" -input int InpPivotRadius = 2; // bars each side; pivot confirms after radius closes -input int InpSwingLookback = 80; // search swings within [radius+1 .. lookback] -input int InpMinPivotGap = 3; // min bars between the two swings used for a pair - -input group "=== EMA distance (entry filter) ===" -input double InpMinEmaDistPtsBuy = 80.0; // buy: (EMA - close) / _Point >= this on signal bar -input double InpMinEmaDistPtsSell = 80.0; // sell: (close - EMA) / _Point >= this - -input group "=== Risk ===" -input bool InpUseSLTP = true; // off = naked positions (can run years until margin stop) -input double InpSLPts = 500.0; // points; tune per symbol (_Point) -input double InpTPPts = 1000.0; -input int InpMaxHoldBars = 0; // 0=off; else close position after this many bars open (signal TF) - -CTrade g_trade; -int g_hRsi = INVALID_HANDLE; -int g_hEma = INVALID_HANDLE; -datetime g_lastBar = 0; -datetime g_lastBuyPivotNew = 0; -datetime g_lastBuyPivotOld = 0; -datetime g_lastSellPivotNew = 0; -datetime g_lastSellPivotOld = 0; - -string WorkSymbol() -{ - if(StringLen(InpSymbol) > 0) - return InpSymbol; - return _Symbol; -} - -ENUM_TIMEFRAMES WorkTf() -{ - if(InpTf == PERIOD_CURRENT) - return (ENUM_TIMEFRAMES)_Period; - return InpTf; -} - -void SetFilling() -{ - const long fill = SymbolInfoInteger(WorkSymbol(), SYMBOL_FILLING_MODE); - if((fill & SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK) - g_trade.SetTypeFilling(ORDER_FILLING_FOK); - else if((fill & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC) - g_trade.SetTypeFilling(ORDER_FILLING_IOC); -} - -bool CopyRsiEma(const int bars, double &rsi[], double &ema[]) -{ - ArrayResize(rsi, bars); - ArrayResize(ema, bars); - ArraySetAsSeries(rsi, true); - ArraySetAsSeries(ema, true); - if(CopyBuffer(g_hRsi, 0, 0, bars, rsi) < bars) - return false; - if(CopyBuffer(g_hEma, 0, 0, bars, ema) < bars) - return false; - return true; -} - -bool IsSwingLow(const int s, const int r) -{ - if(s < r + 1) - return false; - const string sym = WorkSymbol(); - const ENUM_TIMEFRAMES tf = WorkTf(); - double lv = iLow(sym, tf, s); - for(int k = -r; k <= r; k++) - { - if(k == 0) - continue; - if(iLow(sym, tf, s + k) <= lv) - return false; - } - return true; -} - -bool IsSwingHigh(const int s, const int r) -{ - if(s < r + 1) - return false; - const string sym = WorkSymbol(); - const ENUM_TIMEFRAMES tf = WorkTf(); - double hv = iHigh(sym, tf, s); - for(int k = -r; k <= r; k++) - { - if(k == 0) - continue; - if(iHigh(sym, tf, s + k) >= hv) - return false; - } - return true; -} - -bool CollectSwingLows(int &outSwings[], const int r, const int lookback) -{ - ArrayResize(outSwings, 0); - const int from = r + 1; - if(lookback <= from) - return false; - for(int s = from; s <= lookback; s++) - { - if(!IsSwingLow(s, r)) - continue; - int n = ArraySize(outSwings); - ArrayResize(outSwings, n + 1); - outSwings[n] = s; - } - return ArraySize(outSwings) >= 2; -} - -bool CollectSwingHighs(int &outSwings[], const int r, const int lookback) -{ - ArrayResize(outSwings, 0); - const int from = r + 1; - if(lookback <= from) - return false; - for(int s = from; s <= lookback; s++) - { - if(!IsSwingHigh(s, r)) - continue; - int n = ArraySize(outSwings); - ArrayResize(outSwings, n + 1); - outSwings[n] = s; - } - return ArraySize(outSwings) >= 2; -} - -void SortSwingsAscending(int &sw[]) -{ - int n = ArraySize(sw); - for(int i = 0; i < n - 1; i++) - for(int j = i + 1; j < n; j++) - if(sw[i] > sw[j]) - { - int t = sw[i]; - sw[i] = sw[j]; - sw[j] = t; - } -} - -bool BullishDivergence(const double &rsi[], const int r, const int lookback, int &sNew, int &sOld) -{ - int swings[]; - if(!CollectSwingLows(swings, r, lookback)) - return false; - SortSwingsAscending(swings); - const int n = ArraySize(swings); - sNew = swings[0]; - sOld = swings[1]; - if(sOld - sNew < InpMinPivotGap) - return false; - const string sym = WorkSymbol(); - const ENUM_TIMEFRAMES tf = WorkTf(); - const double lowNew = iLow(sym, tf, sNew); - const double lowOld = iLow(sym, tf, sOld); - if(lowNew >= lowOld) - return false; - if(rsi[sNew] <= rsi[sOld]) - return false; - return true; -} - -bool BearishDivergence(const double &rsi[], const int r, const int lookback, int &sNew, int &sOld) -{ - int swings[]; - if(!CollectSwingHighs(swings, r, lookback)) - return false; - SortSwingsAscending(swings); - sNew = swings[0]; - sOld = swings[1]; - if(sOld - sNew < InpMinPivotGap) - return false; - const string sym = WorkSymbol(); - const ENUM_TIMEFRAMES tf = WorkTf(); - const double hiNew = iHigh(sym, tf, sNew); - const double hiOld = iHigh(sym, tf, sOld); - if(hiNew <= hiOld) - return false; - if(rsi[sNew] >= rsi[sOld]) - return false; - return true; -} - -bool EmaDistanceBuyOk(const double &ema[], const int barShift) -{ - const string sym = WorkSymbol(); - const ENUM_TIMEFRAMES tf = WorkTf(); - const double c = iClose(sym, tf, barShift); - if(c <= 0.0 || ema[barShift] <= 0.0) - return false; - const double pts = (ema[barShift] - c) / _Point; - return (pts >= InpMinEmaDistPtsBuy); -} - -bool EmaDistanceSellOk(const double &ema[], const int barShift) -{ - const string sym = WorkSymbol(); - const ENUM_TIMEFRAMES tf = WorkTf(); - const double c = iClose(sym, tf, barShift); - if(c <= 0.0 || ema[barShift] <= 0.0) - return false; - const double pts = (c - ema[barShift]) / _Point; - return (pts >= InpMinEmaDistPtsSell); -} - -int CountOurPositions() -{ - const string sym = WorkSymbol(); - int c = 0; - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - const ulong ticket = PositionGetTicket(i); - if(ticket == 0 || !PositionSelectByTicket(ticket)) - continue; - if(PositionGetString(POSITION_SYMBOL) != sym) - continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != InpMagic) - continue; - c++; - } - return c; -} - -void ManageMaxHoldBars() -{ - if(InpMaxHoldBars <= 0) - return; - const string sym = WorkSymbol(); - const ENUM_TIMEFRAMES tf = WorkTf(); - - for(int i = PositionsTotal() - 1; i >= 0; i--) - { - const ulong ticket = PositionGetTicket(i); - if(ticket == 0 || !PositionSelectByTicket(ticket)) - continue; - if(PositionGetString(POSITION_SYMBOL) != sym) - continue; - if((ulong)PositionGetInteger(POSITION_MAGIC) != InpMagic) - continue; - - const datetime openTime = (datetime)PositionGetInteger(POSITION_TIME); - const int sh = iBarShift(sym, tf, openTime); - if(sh < 0) - continue; - if(sh >= InpMaxHoldBars) - g_trade.PositionClose(ticket); - } -} - -void BuildSLTP(const bool isBuy, const double price, double &sl, double &tp) -{ - sl = tp = 0.0; - if(!InpUseSLTP) - return; - if(isBuy) - { - sl = price - InpSLPts * _Point; - tp = price + InpTPPts * _Point; - } - else - { - sl = price + InpSLPts * _Point; - tp = price - InpTPPts * _Point; - } -} - -int OnInit() -{ - const string sym = WorkSymbol(); - const ENUM_TIMEFRAMES tf = WorkTf(); - if(!SymbolSelect(sym, true)) - Print("rsiDivergence: SymbolSelect note for ", sym); - - g_hRsi = iRSI(sym, tf, InpRsiPeriod, PRICE_CLOSE); - g_hEma = iMA(sym, tf, InpEmaPeriod, 0, MODE_EMA, PRICE_CLOSE); - if(g_hRsi == INVALID_HANDLE || g_hEma == INVALID_HANDLE) - return INIT_FAILED; - - g_trade.SetExpertMagicNumber(InpMagic); - g_trade.SetDeviationInPoints(InpSlippagePts); - SetFilling(); - return INIT_SUCCEEDED; -} - -void OnDeinit(const int reason) -{ - if(g_hRsi != INVALID_HANDLE) IndicatorRelease(g_hRsi); - if(g_hEma != INVALID_HANDLE) IndicatorRelease(g_hEma); -} - -void OnTick() -{ - const string sym = WorkSymbol(); - const ENUM_TIMEFRAMES tf = WorkTf(); - - ManageMaxHoldBars(); - - datetime t = iTime(sym, tf, 0); - if(t == 0 || t == g_lastBar) - return; - g_lastBar = t; - - const int need = InpSwingLookback + InpPivotRadius + 5; - double rsi[], ema[]; - if(!CopyRsiEma(need, rsi, ema)) - return; - - const int openN = CountOurPositions(); - if(openN >= InpMaxPositions) - return; - if(InpRequireFlat && openN > 0) - return; - - const int r = MathMax(1, InpPivotRadius); - const int lb = MathMax(r + 3, InpSwingLookback); - - int sNew = 0, sOld = 0; - MqlTick tick; - if(!SymbolInfoTick(sym, tick)) - return; - - if(BullishDivergence(rsi, r, lb, sNew, sOld) && EmaDistanceBuyOk(ema, 1)) - { - const datetime tPivotNew = iTime(sym, tf, sNew); - const datetime tPivotOld = iTime(sym, tf, sOld); - if(tPivotNew == 0 || tPivotOld == 0) - return; - if(tPivotNew == g_lastBuyPivotNew && tPivotOld == g_lastBuyPivotOld) - return; - - double sl, tp; - BuildSLTP(true, tick.ask, sl, tp); - if(g_trade.Buy(InpLots, sym, tick.ask, sl, tp, "RSI div+EMA buy")) - { - g_lastBuyPivotNew = tPivotNew; - g_lastBuyPivotOld = tPivotOld; - Print("Buy RSI div: swings ", sOld, "->", sNew, " pivots ", TimeToString(tPivotOld), " -> ", TimeToString(tPivotNew)); - } - return; - } - - if(BearishDivergence(rsi, r, lb, sNew, sOld) && EmaDistanceSellOk(ema, 1)) - { - const datetime tPivotNew = iTime(sym, tf, sNew); - const datetime tPivotOld = iTime(sym, tf, sOld); - if(tPivotNew == 0 || tPivotOld == 0) - return; - if(tPivotNew == g_lastSellPivotNew && tPivotOld == g_lastSellPivotOld) - return; - - double sl, tp; - BuildSLTP(false, tick.bid, sl, tp); - if(g_trade.Sell(InpLots, sym, tick.bid, sl, tp, "RSI div+EMA sell")) - { - g_lastSellPivotNew = tPivotNew; - g_lastSellPivotOld = tPivotOld; - Print("Sell RSI div: swings ", sOld, "->", sNew, " pivots ", TimeToString(tPivotOld), " -> ", TimeToString(tPivotNew)); - } - } -} diff --git a/lab/EAs/rsiDivergence_XAUUSD.set b/lab/EAs/rsiDivergence_XAUUSD.set deleted file mode 100644 index 55397f5..0000000 --- a/lab/EAs/rsiDivergence_XAUUSD.set +++ /dev/null @@ -1,29 +0,0 @@ -; rsiDivergence.mq5 — XAUUSD test / optimization preset -; Strategy Tester → Inputs → Load. If your server lists "XAU" not "XAUUSD", change InpSymbol only. -; -; value||start||step||stop||Y|N (MT5 convention) -; InpTf: 0 = chart timeframe (PERIOD_CURRENT). Attach EA to XAUUSD chart at desired TF (e.g. H1). -; -; === Market === -InpSymbol=XAUUSD -InpTf=0||0||0||49153||N -InpLots=0.01||0.01||0.01||0.20||N -InpMagic=930204||930204||1||9302040||N -InpSlippagePts=80||30||10||400||N -InpMaxPositions=1||1||1||4||N -InpRequireFlat=true||false||0||true||N -; === Indicators === -InpRsiPeriod=14||7||1||28||Y -InpEmaPeriod=200||50||10||400||Y -; === Swing / divergence === -InpPivotRadius=2||2||1||8||N -InpSwingLookback=120||60||10||300||Y -InpMinPivotGap=3||2||1||15||Y -; === EMA distance (entry filter) — gold: wider point ranges than FX === -InpMinEmaDistPtsBuy=200.0||50.0||25.0||2500.0||Y -InpMinEmaDistPtsSell=200.0||50.0||25.0||2500.0||Y -; === Risk === -InpUseSLTP=true||false||0||true||N -InpSLPts=800.0||300.0||50.0||5000.0||Y -InpTPPts=1600.0||500.0||100.0||10000.0||Y -InpMaxHoldBars=48||0||8||240||Y diff --git a/lab/EAs/rsisauce-optimize.set b/lab/EAs/rsisauce-optimize.set deleted file mode 100644 index d0dc530..0000000 --- a/lab/EAs/rsisauce-optimize.set +++ /dev/null @@ -1,25 +0,0 @@ -; saved for genetic optimization — rsi-scalping (rsisauce) lab EA -; copy to: ...\MQL5\Profiles\Tester\ then Load from Inputs tab -; last field: Y = optimize, N = fixed -; -InpTf=1||0||0||49153||N -InpEmaFast=9||5||1||15||Y -InpEmaSlow=21||15||1||34||Y -InpRsiLen=14||10||1||21||Y -InpStochLen=14||8||1||24||Y -InpStochK=4||3||1||8||Y -InpStochD=7||3||1||12||Y -InpObLevel=80.0||72.0||1.0||88.0||Y -InpOsLevel=20.0||12.0||1.0||28.0||Y -InpUseMidZoneFilter=true||false||0||true||N -InpMinBarsSinceCross=10||4||1||18||Y -InpUseHtfFilter=false||false||0||true||N -InpHtf=5||0||0||49153||N -InpMinEmaSepPts=0.0||0.0||2.0||40.0||Y -InpLots=0.01||0.01||0.001000||0.100000||N -InpSlBufferPts=20||5||2||60||Y -InpTpRiskMultiple=1.75||1.25||0.05||2.50||Y -InpExitOnEma9Break=true||false||0||true||N -InpExitOnStochZone=true||false||0||true||N -InpMagic=20260412||20260412||1||202604120||N -InpSlippagePts=30||30||1||300||N diff --git a/paper/figures/game_theory_optimal_vs_default.png b/paper/figures/game_theory_optimal_vs_default.png deleted file mode 100644 index 6fc35cc..0000000 Binary files a/paper/figures/game_theory_optimal_vs_default.png and /dev/null differ diff --git a/paper/figures/game_theory_optimization.png b/paper/figures/game_theory_optimization.png deleted file mode 100644 index be78c47..0000000 Binary files a/paper/figures/game_theory_optimization.png and /dev/null differ diff --git a/paper/figures/game_theory_trading.png b/paper/figures/game_theory_trading.png deleted file mode 100644 index 212166e..0000000 Binary files a/paper/figures/game_theory_trading.png and /dev/null differ diff --git a/paper/figures/grid_trading_analysis.png b/paper/figures/grid_trading_analysis.png deleted file mode 100644 index 21ef9a0..0000000 Binary files a/paper/figures/grid_trading_analysis.png and /dev/null differ diff --git a/paper/figures/martingale_analysis.png b/paper/figures/martingale_analysis.png deleted file mode 100644 index c3ef274..0000000 Binary files a/paper/figures/martingale_analysis.png and /dev/null differ diff --git a/paper/figures/partial_exit_analysis.png b/paper/figures/partial_exit_analysis.png deleted file mode 100644 index cd85651..0000000 Binary files a/paper/figures/partial_exit_analysis.png and /dev/null differ diff --git a/paper/figures/trailing_stop_analysis.png b/paper/figures/trailing_stop_analysis.png deleted file mode 100644 index 529fc3e..0000000 Binary files a/paper/figures/trailing_stop_analysis.png and /dev/null differ diff --git a/paper/simulations/__pycache__/game_theory_trading.cpython-312.pyc b/paper/simulations/__pycache__/game_theory_trading.cpython-312.pyc deleted file mode 100644 index 5a61f39..0000000 Binary files a/paper/simulations/__pycache__/game_theory_trading.cpython-312.pyc and /dev/null differ diff --git a/pe-zero-to-one/chapter/ch01.tex b/pe-zero-to-one/chapter/ch01.tex deleted file mode 100644 index 10878d5..0000000 --- a/pe-zero-to-one/chapter/ch01.tex +++ /dev/null @@ -1,17 +0,0 @@ -\chapter{私募股权与另类投资版图} - -\section{另类投资在资产配置中的位置} - -另类投资(Alternative Investments)泛指在传统股票与债券之外、流动性通常较低、结构更复杂、信息披露与监管框架与公募不同的资产类别。机构组合引入另类资产的核心动机包括:\textbf{分散化}(与公开市场相关性不完全同步)、\textbf{风险溢价}(流动性折价与复杂度溢价)、以及在某些市场环境下\textbf{绝对收益}或\textbf{通胀对冲}的诉求。私募股权(PE)是其中体量最大、制度最成熟的一条主线,但与对冲基金、实物资产、私募信贷等边界常有交叉。 - -\section{私募股权的主要形态} - -\textbf{并购基金(Buyout)}通常以控股或重大少数股权方式收购成熟企业,依托杠杆、运营改善与行业整合提升退出倍数。\textbf{成长资本(Growth)}面向已盈利或接近盈利的扩张期企业,股权稀释程度与估值弹性介于 VC 与并购之间。\textbf{风险投资(VC)}聚焦早期技术与商业模式验证,单笔损失率可较高,依赖幂律分布中的极端成功项目。\textbf{夹层资本(Mezzanine)}与\textbf{困境/特殊机会}策略则更接近信贷或混合工具,在资本结构中的位置与纯股权 PE 不同。读者在本书语境下可将「PE」理解为\textbf{以非上市股权或相关工具为主、以主动治理与退出为收益来源}的广义家族,而不局限于某一细分标签。 - -\section{与公募、对冲基金的对照} - -\textbf{期限与流动性:}典型 PE 基金有固定存续期与资本召唤(capital call)节奏,LP 在基金层面难以按净值每日申赎;公募与多数对冲基金则强调份额流动性(尽管侧袋、门控等机制会削弱这一特征)。\textbf{定价:}非上市股权缺乏连续报价,估值依赖季度评估与交易事件,业绩归因与「账面回报」解读需要额外谨慎。\textbf{监管:}面向零售的公募受最严格的信息披露与销售规则约束;私募链条在各国法域下对应不同「合格投资者」门槛与募集方式限制(详见本书合规篇)。\textbf{收益结构:}PE 更强调\textbf{控制或强影响}下的价值创造叙事;多策略对冲基金可能以市场中性、套利或宏观为主,与单一企业基本面绑定度较低。 - -\section{为何「版图」思维重要} - -从零到一设立或参与一支基金时,先明确自己在版图中的\textbf{坐标}(阶段、行业、地域、币种、是否杠杆),能避免基金条款与团队能力与宣称策略错位。后续章节中的募资对象、尽调深度、条款谈判与退出假设,都隐含了这一坐标选择;合规篇则进一步约束该坐标在特定司法辖区是否可合法落地。 diff --git a/pe-zero-to-one/chapter/ch02.tex b/pe-zero-to-one/chapter/ch02.tex deleted file mode 100644 index 4889a35..0000000 --- a/pe-zero-to-one/chapter/ch02.tex +++ /dev/null @@ -1,17 +0,0 @@ -\chapter{生态链:LP、GP、被投企业与服务商} - -\section{LP 与 GP:信托关系与经济条款} - -有限合伙人(Limited Partner, LP)是基金的主要出资方,以认缴承诺为上限承担有限责任;普通合伙人(General Partner, GP)或其关联实体担任基金管理人,负责投资决议、投后管理与投资者关系。二者关系由\textbf{有限合伙协议(LPA)}及附属 side letter 约束,核心经济条款包括管理费基数与费率、业绩报酬(carried interest)与门槛收益率(hurdle)、分配瀑布(European vs American waterfall)以及 GP 跟投(GP commit)比例。法律上 LP 通常不得干预具体项目投资,以免丧失有限责任保护;实务中通过咨询委员会(advisory committee)与协议约定的重大事项同意权行使制衡。 - -\section{基金载体、管理人与被投企业} - -常见结构为:一支(或数支并列)\textbf{有限合伙基金}作为投资主体,向被投企业注资;\textbf{基金管理公司}(常由 GP 关联方设立)向基金收取管理费并聘用投资团队。被投企业处于生态链的「资产端」:其董事会构成、信息披露节奏与股东协议中的保护条款,直接决定 GP 能否有效行使治理。理解这一\textbf{三角结构}有助于划分「基金层面的义务」与「管理公司层面的义务」,例如在跨境架构中税务与监管申报的责任主体。 - -\section{交易服务商的角色} - -\textbf{财务顾问(FA)}组织买方或卖方流程、协调尽调数据室与谈判节奏,但不替代 GP 的投资判断。\textbf{律师事务所}起草交易文件与 LPA,并出具法律意见。\textbf{审计师}提供基金与被投企业的财务审计或商定程序报告,支撑估值与 LP 报告。\textbf{基金行政管理人(fund administrator)}处理 NAV、投资者报表与监管报送接口。\textbf{托管行}在适用法域下保管现金与证券。这些角色嵌入在「立项—签约—交割—季报—退出」的时间轴上;冷启动阶段可用外包与里程碑付款降低固定成本,但随着 AUM 与 LP 要求上升,服务商层级与独立性往往需加强。 - -\section{网络效应与声誉资本} - -生态链不是静态供应链:同一批 LP、FA 与律师在多个基金周期中重复博弈,\textbf{声誉}与\textbf{执行记录}成为比单次条款更重要的资产。新 GP 在构建生态位时,应优先建立可验证的里程碑(透明报告、按时交割、清晰沟通),以便在后续轮次中获得更优的介绍链与条款空间。 diff --git a/pe-zero-to-one/chapter/ch03.tex b/pe-zero-to-one/chapter/ch03.tex deleted file mode 100644 index 3f871bd..0000000 --- a/pe-zero-to-one/chapter/ch03.tex +++ /dev/null @@ -1,17 +0,0 @@ -\chapter{基金设立:载体选择与基本条款} - -\section{有限合伙:PE 的主流选择} - -在多数法域,\textbf{有限合伙}因其\textbf{税收穿透}(在符合条件下由合伙人层面纳税而非实体层面双重征税)、GP 无限责任与 LP 有限责任的清晰划分,成为私募股权基金的首选载体。基金期限、投资期与延长期、GP 移除与关键人条款等,均在 LPA 中锁定。设立成本包括注册费用、首次法律起草与监管登记(若适用);跨境 LP 时还需考虑反洗钱(KYC)与制裁筛查流程。 - -\section{公司制与契约型:何时出现} - -\textbf{公司制}基金在部分辖区便于某些类型投资者(如养老基金子账户)持有,或用于上市载体(如部分投资信托结构);劣势常在于\textbf{双重征税}或治理灵活性不足。\textbf{契约型基金}在部分亚洲市场与资管产品中常见,依赖托管人与管理人合同网络;与经典离岸/在岸有限合伙相比,权利义务映射方式不同,需在律师协助下逐条对照 LPA 等价物。 - -\section{LPA 中的经济条款框架} - -\textbf{管理费}通常按认缴或实缴或 NAV 的一定比例计提,投资期后可能调降或切换基数。\textbf{业绩报酬}在超过 hurdle 后对利润分成;需明确是\textbf{whole-of-fund}还是 deal-by-deal、是否存在 clawback(回拨)机制。\textbf{分配瀑布}决定税、费、本金与收益在 LP 与 GP 之间的先后顺序,直接影响 IRR 与 DPI 的时间形态。Side letter 可能对大型 LP 给予最惠国(MFN)、共同投资权或额外信息权,管理公司需建立台账避免承诺冲突。 - -\section{治理与管理条款} - -投资委员会组成、关联交易审批、个人跟投(co-investment)规则、借款与担保限额、关键人事件与 GP 替换程序,构成管理条款的骨架。从零到一阶段,常见错误是\textbf{过度照搬大型基金模板}导致小团队无法合规执行;应在「可运营」与「LP 可接受」之间折中,并预留随基金规模扩大而修订的修正案机制(须符合适用法律)。 diff --git a/pe-zero-to-one/chapter/ch04.tex b/pe-zero-to-one/chapter/ch04.tex deleted file mode 100644 index 73c6a42..0000000 --- a/pe-zero-to-one/chapter/ch04.tex +++ /dev/null @@ -1,17 +0,0 @@ -\chapter{募资从零到一:材料、路演与合规边界} - -\section{材料体系:PPM、数据室与 DDQ} - -私募配售备忘录(PPM / 私募备忘录)是面向合格投资者的\textbf{核心法律与营销混合文件},需披露策略、风险因素、费用、利益冲突、管理团队与历史业绩(若有)。\textbf{数据室(VDR)}存放基金章程、LPA 草案、合规政策样本、过往审计与参考投资组合(在允许范围内)。\textbf{尽职调查问卷(DDQ)}回复机构 LP 的标准问题,便于进入 allocator 的内部评分流程。三类材料应\textbf{同源更新},避免路演口述与书面文件不一致引发监管或民事风险。 - -\section{路演节奏与叙事} - -首轮沟通通常以\textbf{一页 Teaser}与简短电话开始,确认策略与规模是否匹配 allocator 的授权。正式路演聚焦:投资逻辑可重复性、团队分工、风险控制、费用与条款、与同类基金的差异化。\textbf{演示材料}须经合规审查(若管理人已持牌或在持牌顾问指导下)。问答环节应如实记录;对无法承诺的事项(如未来收益)明确拒绝书面化。 - -\section{合格投资者与宣传边界} - -各法域对「合格投资者」「专业客户」的定义不同;本书合规篇提供框架性索引。一般原则是:\textbf{非公开募集}、\textbf{不对不特定对象宣传保本或确定收益}、\textbf{适当性匹配}。社交媒体与公开会议上的表述极易构成「公开劝诱」的争议,冷启动章节亦强调有节制的触达;本章从基金文件角度要求:所有对外版本留有\textbf{版本号与审批记录}。 - -\section{首次交割与后续关闭} - -首次关闭(first closing)确定首批 LP 的认缴与计费起点;后续关闭(subsequent closings)可能涉及\textbf{同等条款最惠}、对早期 LP 的补偿(equalisation)与对价调整。行政上需协调认购书签署、KYC、资金到账与工商/登记变更(视载体而定)。延长的募集期会增加法律与市场成本,应在 PPM 中设定明确截止条件与 GP 的权利。 diff --git a/pe-zero-to-one/chapter/ch05.tex b/pe-zero-to-one/chapter/ch05.tex deleted file mode 100644 index 3a66474..0000000 --- a/pe-zero-to-one/chapter/ch05.tex +++ /dev/null @@ -1,17 +0,0 @@ -\chapter{赛道与策略:如何定义你的「第一只基金」} - -\section{聚焦优于泛化} - -首只基金若宣称「全行业、全阶段、全球配置」,在 allocator 视角中往往等同于\textbf{无清晰边际优势}。更可行的做法是在\textbf{行业 × 地域 × 阶段 × 单笔规模}四维中至少锁定两维,形成可辩护的「为什么是你」的故事。聚焦不等于永久狭窄:可在 LPA 中保留\textbf{合理扩展投资范围}的修正案机制,但首轮沟通应强调核心圈。 - -\section{可重复的筛选标准} - -建立书面化的\textbf{立项标准}:最低收入/利润门槛、市场集中度上限、禁止行业(如强监管敏感领域)、ESG 红线、以及技术与团队评分卡。标准应可回溯:每个过会/否决决策对应哪一条标准被触发。这样既能训练初级投资人员,也能向 LP 证明流程非拍脑袋。量化背景团队可将部分标准\textbf{指标化},但仍需与投资委员会的人文判断结合。 - -\section{基金规模与机会集的匹配} - -目标募资额应与\textbf{可完成投资节奏}及\textbf{团队覆盖能力}一致:过小则管理费无法覆盖固定成本;过大则被迫降低标准或拉长投资期,损害 IRR 与声誉。冷启动阶段可采用较低硬上限 + 后续基金接力,而不是单支基金「一步到位」。 - -\section{品牌与执行的乘数} - -赛道定义会通过每一次公开露面、案例研究与 LP 推荐被\textbf{重复强化}。频繁切换叙事会稀释品牌,使介绍链无法累积。建议每年复盘一次策略声明,仅在证据充分时调整表述,并同步修订 PPM 与网站(若有)。 diff --git a/pe-zero-to-one/chapter/ch06.tex b/pe-zero-to-one/chapter/ch06.tex deleted file mode 100644 index 891de95..0000000 --- a/pe-zero-to-one/chapter/ch06.tex +++ /dev/null @@ -1,17 +0,0 @@ -\chapter{项目获取与初步判断} - -\section{项目流的来源} - -冷触达(cold outreach)在缺乏品牌时效率低但并非无效:关键是\textbf{高度定制}的切入点(对目标公司近期融资、产品或监管变化的具体评论)。更可持续的来源包括:创始人推荐、同行 FA、律师与会计师转介、行业会议与学术合作。\textbf{网络效应}随成功案例累积——第一单往往最难,需在冷启动章节所述触达策略与这里所述来源之间建立闭环。 - -\section{Teaser 与保密} - -卖方 Teaser 通常为匿名一页纸,概述行业、财务区间与交易诉求。买方在签署\textbf{保密协议(NDA)}前应明确:接触信息的人员范围、用途限制、存续期与管辖法律。NDA 不是万能盾:敏感信息仍应分层披露,核心技术细节可推迟至 exclusivity 阶段。 - -\section{商业逻辑的快速体检} - -在完整尽调之前,用有限时间回答:\textbf{客户为什么买单?}替代方案与切换成本?\textbf{单位经济模型}是否随规模改善?竞争格局是赢家通吃还是分散?若上述任一项无法在假设表格中自洽,可暂缓投入重度资源。市场大小(TAM/SAM/SOM)宜用多种方法交叉校验,避免单一夸张口径。 - -\section{与内部流程的衔接} - -立项会应产生\textbf{书面备忘录}:投资主题、主要风险、下一步工作清单与负责人。避免「口头立项、无编号」导致后续 DD 与法务脱节。对于可能触发利益冲突的项目(如 LP 关联),应尽早启动合规标注与回避程序。 diff --git a/pe-zero-to-one/chapter/ch07.tex b/pe-zero-to-one/chapter/ch07.tex deleted file mode 100644 index 1696a3b..0000000 --- a/pe-zero-to-one/chapter/ch07.tex +++ /dev/null @@ -1,21 +0,0 @@ -\chapter{尽职调查:财务、法律与商业} - -\section{DD 的整体节奏} - -尽职调查(Due Diligence)应在 Term Sheet 签署后、重大交割款项划出前完成,但\textbf{高风险事项}(诉讼、环保、核心知识产权归属)宜在签署前做\textbf{有限度预尽调}以避免排他期浪费。典型工作流:数据室清单 → 管理层问答(Q\&A)→ 现场走访 → 第三方报告(环境、税务、IT)→ 问题汇总与价格/条款调整建议。投资团队须指定\textbf{工作流负责人},防止律师与会计师各跑各的、结论无法合并。 - -\section{财务尽调} - -关注\textbf{盈利质量}:收入确认政策是否激进?应收账款与现金流是否匹配?一次性收益与非经常性项目是否被误当作可持续利润?\textbf{正常化 EBITDA} 的调整须有证据支撑并在投资备忘录中披露假设。营运资金(NWC)目标与交割后「漏桶」条款常是谈判焦点。对早期企业,财务 DD 可能让位于\textbf{单位经济与跑道}分析。 - -\section{法律尽调} - -重点扫描:重大合同(客户/供应商集中度、变更控制权条款)、诉讼与监管调查、土地与环保许可、知识产权链条(职务发明、开源许可污染)、劳动与社保合规、数据隐私。红色事项应进入\textbf{交割条件(CP)}或价格机制(earn-out、托管账户),而非仅停留在尽调报告附录。 - -\section{商业与运营尽调} - -访谈中层与客户样本(在合规前提下)、考察供应链与产能利用率、评估数字化与内控成熟度。对 PE 而言,\textbf{100 日计划}的雏形往往在此阶段形成:投后哪些杠杆(采购、定价、组织)最可能兑现。 - -\section{内部与外部顾问的协作} - -内部:投资负责人对结论负总责,需参与关键会议而非仅读摘要。外部:律师与审计师的范围说明书(SOW)应明确交付物与时间,避免范围蔓延。所有重大发现应进入\textbf{问题清单}并标注状态(已解决/留待交割后/放弃交易)。 diff --git a/pe-zero-to-one/chapter/ch08.tex b/pe-zero-to-one/chapter/ch08.tex deleted file mode 100644 index 2427834..0000000 --- a/pe-zero-to-one/chapter/ch08.tex +++ /dev/null @@ -1,21 +0,0 @@ -\chapter{估值与交易结构入门} - -\section{可比公司与可比交易} - -上市公司估值倍数(EV/EBITDA、P/E 等)提供市场锚点,但需调整:流动性折价、控制权溢价、行业周期位置与会计差异。\textbf{可比交易}更接近一级市场,但样本稀疏、披露不全,应对区间取保守情景。两者结合形成\textbf{估值走廊},而非单点数字。 - -\section{DCF 与情景分析} - -现金流折现(DCF)强迫显式列出增长、利润率、资本支出与终值假设;敏感性分析可展示关键驱动因子。早期企业 DCF 权重常低于\textbf{最近融资价格}或\textbf{风险投资法},但仍有内部讨论价值。注意 WACC 与终值增长率假设勿机械套用教科书 defaults。 - -\section{股权比例与对价形式} - -估值决定入门股权比例;\textbf{员工期权池}是否投前扩池会稀释有效比例。对价可为现金、换股或分期支付;分期与\textbf{earn-out} 绑定未来业绩,降低买方 upfront 风险但增加争议与会计复杂性。 - -\section{对赌与调整机制} - -业绩承诺、回购与现金补偿等条款在中文语境常称「对赌」,实质是\textbf{价格与风险的再分配}。设计时应避免不可执行的惩罚、与公司法冲突的约定,以及税务上的意外后果。所有对赌须由\textbf{律师与税务顾问}联合审阅;本书仅强调经济含义:对赌不是「保证收益」,而是条件支付。 - -\section{谈判中的艺术} - -估值是\textbf{区间博弈}:卖方要叙事上限,买方要风险下限。交易结构(分期、托管、陈述保证保险)常比硬压估值更能成交。保留\textbf{双赢叙事}有利于投后合作——过度压榨条款往往在董事会层面反噬。 diff --git a/pe-zero-to-one/chapter/ch09.tex b/pe-zero-to-one/chapter/ch09.tex deleted file mode 100644 index fc5e150..0000000 --- a/pe-zero-to-one/chapter/ch09.tex +++ /dev/null @@ -1,21 +0,0 @@ -\chapter{Term Sheet 与谈判要点} - -\section{Term Sheet 的法律地位} - -Term Sheet(条款清单)可分为\textbf{有约束力}(如保密、费用、排他)与\textbf{无约束力}(商业核心条款)段落。签署前应明确哪些条款在最终协议中\textbf{不得劣化},避免签署后被对方律师「技术性推翻」。中英文版本并存时须指定\textbf{优先语言}。 - -\section{经济条款簇} - -投资金额、投前/投后估值、股价与稀释、期权池、清算优先(1x non-participating vs participating)、股息(多为累积与否的象征性条款)。\textbf{反稀释}(full ratchet vs weighted average)在下行轮融资中争议最大,需与创始人心理预期和公司后续融资能力一并评估。 - -\section{治理与控制簇} - -董事会席位、观察员席位、否决权清单(预算、并购、关联交易、高管任免)。过多否决权会瘫痪公司;过少则 LP 对资产保护不足。应在「关键少数」事项上集中否决权,日常运营授权管理层。 - -\section{流动性与协同退出} - -\textbf{领售权(drag-along)}迫使小股东参与整体出售;\textbf{随售权(tag-along)}保护小股东参与买方要约。\textbf{优先认购权}与\textbf{共同出售权}影响后续轮次节奏。IPO 场景下需关注\textbf{注册权}与锁定期。 - -\section{谈判策略:底线与交换} - -事先内部分类:\textbf{必须守住}(如核心信息权、重大资产处置否决)、\textbf{可交换}(如观察员人数)、\textbf{可放弃}(如象征性股息)。用次要让步换取对方在估值或关键治理上的让步。记录谈判历史,避免口头承诺遗失;重大让步须经投资委员会书面确认。 diff --git a/pe-zero-to-one/chapter/ch10.tex b/pe-zero-to-one/chapter/ch10.tex deleted file mode 100644 index 3609614..0000000 --- a/pe-zero-to-one/chapter/ch10.tex +++ /dev/null @@ -1,21 +0,0 @@ -\chapter{交割、资金划付与投后治理} - -\section{交割条件(CP)} - -常见 CP 包括:陈述与保证真实、无法律禁令、关键第三方同意、政府审批(若需)、员工留任协议签署、无重大不利影响(MAC)未发生。GP 应维护\textbf{CP 检查表},由律师出具法律意见、财务确认资金路径。\textbf{划款指令}须双人复核,防范欺诈性邮件篡改账户。 - -\section{文件签署顺序} - -通常先满足 CP,再签署最终股份认购/增资文件,最后释放托管或直接划款。跨境交易可能涉及\textbf{外汇登记}与税务代扣;时间表应预留监管机构处理窗口。签字页与正本份数在 closing memo 中列明。 - -\section{投后信息权} - -股东协议与 LPA 往往规定:月度/季度报表、年度预算、重大事件即时通报、审计配合权。GP 应建立\textbf{被投企业报告模板}与内部 CRM 提醒,避免投后「失联」引发 LP 质疑。 - -\section{董事会节奏与赋能} - -董事会频率与议程应匹配公司阶段:早期可更密,成熟期可季度。GP 董事应在\textbf{战略、资本结构、关键招聘}上发力,避免微观管理日常运营。赋能形式包括介绍客户、补充高管、协助下一轮融资——均须注意利益冲突披露。 - -\section{重大事项同意权} - -基金层面可能对超过单笔金额或特定类型的投资要求 LPAC 或顾问委员会知情;被投企业层面的否决权行使应记录在案,以支持未来退出时的治理叙事。 diff --git a/pe-zero-to-one/chapter/ch11.tex b/pe-zero-to-one/chapter/ch11.tex deleted file mode 100644 index 3b43837..0000000 --- a/pe-zero-to-one/chapter/ch11.tex +++ /dev/null @@ -1,21 +0,0 @@ -\chapter{投后管理与价值创造} - -\section{从监控到主动价值创造} - -投后不仅是收取报表:优秀 GP 在交易完成前已草拟\textbf{价值创造路线图}(采购协同、定价、渠道、数字化、组织瘦身等)。执行依赖被投企业管理层的信任与激励——投后首 100 天的沟通节奏与「不做什么」的承诺同样重要。 - -\section{财务与运营 KPI} - -建立与战略一致的 KPI 仪表盘:收入增长、利润率、现金转换周期、客户留存、安全与环境指标(若适用)。对比投资备忘录中的基准,定期复盘偏差原因;必要时触发\textbf{预警会}与纠偏措施。 - -\section{人才与组织} - -关键人风险是 PE 失败主因之一。投后应参与\textbf{高管评估、薪酬与长期激励}设计,必要时引入猎头与外部董事。文化冲突在跨境并购中尤为突出,需预留整合预算与时间。 - -\section{追加投资与跟投} - -后续轮次是否跟进,应基于\textbf{重新估值}与\textbf{权利维持}(防稀释),而非沉没成本。LP 侧共同投资(co-invest)机会需公平分配并记录,避免利益输送指控。 - -\section{危机项目} - -业绩持续恶化、治理僵局或合规爆雷时,应启动\textbf{危机协议}:增派资源、更换管理层、寻求出售或重组。法律上注意董事\textbf{受信义务}在困境中的变化。早期识别比晚期救火成本更低;投后例会应保留「黄色/红色」分级机制。 diff --git a/pe-zero-to-one/chapter/ch12.tex b/pe-zero-to-one/chapter/ch12.tex deleted file mode 100644 index f145750..0000000 --- a/pe-zero-to-one/chapter/ch12.tex +++ /dev/null @@ -1,21 +0,0 @@ -\chapter{退出路径:IPO、并购与二级转让} - -\section{退出是投资 thesis 的一部分} - -进入时就应讨论\textbf{最可能的退出通道}:战略并购、财务买家、IPO、 secondary sale(卖老股)或 recap。不同通道对持股比例、治理清洁度、审计年限与合规记录要求不同;临退出才补洞往往代价高昂。 - -\section{并购退出} - -战略买家通常愿付\textbf{协同溢价},但谈判周期与反垄断审查不确定。财务买家(另一家 PE)依赖杠杆与再次出售,尽调更偏财务模型。拍卖流程(broad auction vs targeted)影响价格与泄密风险;顾问费用与管理层激励(management equity rollover)需在条款中明确。 - -\section{IPO} - -公开市场提供流动性与品牌,但面临\textbf{锁定期、持续披露成本与市场波动}。上市地选择(本地 vs 离岸)涉及估值倍数、监管环境与外汇安排。GP 需与承销商、公司律师协调\textbf{注册权}与减持节奏。 - -\section{二级份额转让} - -基金到期或 LP 流动性需求可能触发\textbf{基金二级交易}(LP 份额转让)或\textbf{投资组合二级出售}(continuation fund)。定价依赖 NAV 与尽职调查;利益冲突(GP 同时代表买卖双方)须严格程序化并披露。 - -\section{基金期限与延期} - -LPA 规定的基金到期后,未退出资产可通过\textbf{延期}(通常需一定比例 LP 同意)、\textbf{捆绑出售}或\textbf{接续基金}处理。延期费率与 GP 激励常重新谈判;透明沟通可减少纠纷。 diff --git a/pe-zero-to-one/chapter/ch13.tex b/pe-zero-to-one/chapter/ch13.tex deleted file mode 100644 index 5cc154c..0000000 --- a/pe-zero-to-one/chapter/ch13.tex +++ /dev/null @@ -1,46 +0,0 @@ -\chapter{合规、内控与声誉风险} - -\section{合规在私募中的含义} - -「合规」不仅是应对监管检查,更是\textbf{保护 LP 资产、降低民事与刑事责任概率、维护品牌}的基础设施。对管理人而言,核心模块通常包括:反洗钱与客户尽职调查、利益冲突管理、内幕信息与市场滥用防范、宣传与销售适当性、记录保存与监管报送。各法域细节见本书合规篇;本章提供\textbf{内控搭建}的通用框架。 - -\section{反洗钱(AML)与客户尽职调查(KYC)} - -Know Your Customer 要求识别最终受益所有人(UBO)、资金来源与制裁名单筛查。对机构 LP 与个人 LP 的尽调深度不同;高风险司法辖区或政治公众人物(PEP)需强化措施。交易环节须警惕\textbf{结构化分拆}规避门槛的行为。AML 政策应书面化并定期培训,异常交易有内部升级路径。 - -\section{利益冲突(COI)} - -典型冲突包括:基金 A 与基金 B 竞争同一标的、GP 关联方提供服务收费、个人跟投与基金跟投机会分配不均、顾问同时服务卖方与买方。管理措施包括:\textbf{事前披露}、投资委员会回避、独立委员表决、side letter 台账与公平分配政策。未妥善处理的冲突是监管处罚与 LP 诉讼的高频来源。 - -\section{内幕信息与防火墙} - -投研人员可能接触未公开重大信息(尤其临近上市或并购标的)。需建立\textbf{信息分级}、限制名单(restricted list)、墙(Chinese wall)与「清洁团队」程序。个人交易与礼品申报政策应明确。量化团队若与上市公司或卖方顾问共享物理或逻辑环境,更需日志与权限隔离。 - -\section{记录保存与对外披露} - -电子通信、模型版本、投委会材料、定价依据与 LP 沟通记录应在保留期限内\textbf{可检索备份}。对外路演、网站与社交媒体发布应有双人复核与版本存档。监管检查与民事诉讼中,「找不到记录」往往被推定不利。 - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[font=\footnotesize] - \node[compliance=gray!80!black, minimum width=2.4cm] (core) {内控核心}; - \node[compliance=red!70!black, above left=0.9cm and 1.1cm of core] (aml) {AML/KYC\\客户尽调}; - \node[compliance=orange!80!black, above right=0.9cm and 1.1cm of core] (coi) {利益冲突\\Chinese wall}; - \node[compliance=blue!70!black, below left=0.9cm and 1.1cm of core] (mn) {材料留痕\\宣传口径}; - \node[compliance=teal!70!black, below right=0.9cm and 1.1cm of core] (rep) {监管报送\\重大事项}; - - \foreach \x in {aml,coi,mn,rep} - \draw[compliance arrow] (core) -- (\x); - - \begin{scope}[on background layer] - \node[draw=violet!40, rounded corners=14pt, inner sep=12pt, fill=violet!3, - fit=(core)(aml)(coi)(mn)(rep)] {}; - \end{scope} -\end{tikzpicture} -\caption{私募管理人内控与合规常见支柱(示意)} -\label{fig:compliance-pillars} -\end{figure} - -\section{声誉与「架构」的边界} - -多层控股或离岸主体不能消除对\textbf{真实业务、适当性、非公开募集}等实质要求;监管与司法机关在特定情形下可否认法律人格独立性(刺破面纱)。合规篇各章所述境外牌照亦仅覆盖\textbf{获准司法辖区内的活动},与本书前文所述中国大陆登记备案相互独立,须分别论证。\textbf{声誉风险}往往在监管正式行动之前即通过 allocator 尽调、媒体报道与人才招聘受挫体现——内控投入是长期品牌的一部分。 diff --git a/pe-zero-to-one/chapter/ch14.tex b/pe-zero-to-one/chapter/ch14.tex deleted file mode 100644 index faeb435..0000000 --- a/pe-zero-to-one/chapter/ch14.tex +++ /dev/null @@ -1,53 +0,0 @@ -\chapter{集团架构思维:控股、运营主体与风险隔离} - -\section{为何采用控股—子公司结构} - -商业动机通常包括:\textbf{品牌与合同主体分离}(运营风险不直接波及控股层持股)、\textbf{区域业务分拆}(不同法域雇佣与税务)、\textbf{融资与股权激励}(在子公司层面设期权池)、以及\textbf{未来资产剥离或引入战略投资人}时的清晰边界。对私募股权基金而言,GP、管理公司、顾问实体与特殊目的载体(SPV)的叠层亦属同类思维,但受监管披露与利益冲突规则约束更强。 - -\section{有限责任的有限性} - -子公司原则上以自身资产对外承担责任,股东以出资为限承担风险。但若存在\textbf{人格混同}(账目、人员、业务、办公场所混用)、\textbf{资本显著不足}或\textbf{不当控制}损害债权人利益,法院可能刺破面纱,令集团内其他实体或股东担责。因此「隔离」是\textbf{可争取的法律效果},不是仅靠注册多一张纸就自动实现。 - -\section{关联交易与转让定价} - -集团内服务协议(IT、人力、品牌许可)、资金池与交叉计费须符合\textbf{独立交易原则}(arm's length),并留存可比分析与董事会决议。税务机关与监管机构均可挑战\textbf{无商业实质}的腾挪。跨境支付还涉及代扣税与外汇合规。 - -\section{基金架构与管理人架构的区分} - -\textbf{基金}作为投资载体有其独立寿命与 LP 关系;\textbf{管理公司}收取管理费并承担团队成本。混淆二者账户或费用分摊,易触发 LP 审计质疑与监管关注。量化策略若由「技术子公司」开发再许可给管理人,须明确 IP 归属、许可费率与披露路径。 - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[ - holding/.style args={#1}{ - rounded corners=8pt, - minimum width=3.5cm, - minimum height=1.1cm, - align=center, - draw=#1!65!black, - thick, - fill=#1!10, - font=\small, - drop shadow={shadow xshift=1pt, shadow yshift=-1pt, fill=black!18}, - }, -] - \node[holding=violet] (parent) at (0,2.1) {控股 / 投资主体\\(持股、分红、再投资)}; - \node[holding=blue] (op) at (-2.6,0) {运营子公司 A\\合同、品牌、日常业务}; - \node[holding=teal] (tech) at (2.6,0) {运营子公司 B\\技术、IP、研发外包等}; - - \draw[compliance arrow] (parent) -- (op) node[midway, left, font=\scriptsize, xshift=-2pt] {股权}; - \draw[compliance arrow] (parent) -- (tech) node[midway, right, font=\scriptsize, xshift=2pt] {股权}; - - \draw[dashed, gray!55, thick] (op.east) -- node[above, font=\scriptsize, sloped] {服务协议 / 许可} (tech.west); - - \node[font=\scriptsize, text width=9.2cm, align=center, below=0.65cm of op, xshift=1.3cm, text=red!55!black] { - \textbf{有限性:}人格混同、不当控制、掏空公司时,可能被刺破面纱;\\ - 证券/资管「牌照」与募集合规\textbf{不因多一层公司}而自动满足。}; -\end{tikzpicture} -\caption{典型控股—运营分层与内部交易(示意)} -\label{fig:holding-structure} -\end{figure} - -\section{与合规篇的衔接} - -母公司通过\textbf{合法分红}或具有商业实质与定价依据的\textbf{服务费}向上游转移利润时,须留存转让定价文档并接受税务与金融监管双重审视。量化团队若以子公司形式存在,须与本书「合规与全球展业」篇中的管理人资格要求一并设计,避免「仅有壳公司、无持牌主体」的展业真空。架构讨论应始终与\textbf{持牌律师与会计师}同步,本书仅提供对话框架。 diff --git a/pe-zero-to-one/chapter/ch15.tex b/pe-zero-to-one/chapter/ch15.tex deleted file mode 100644 index f97ffef..0000000 --- a/pe-zero-to-one/chapter/ch15.tex +++ /dev/null @@ -1,36 +0,0 @@ -\chapter{从零到一检查清单与常见坑} - -\section{募资前检查清单} - -\begin{itemize} - \item 策略陈述与 PPM、DDQ、路演材料是否\textbf{版本一致},且经合规/律师审阅(若适用)。 - \item 管理团队简历、过往业绩披露是否\textbf{可验证},无夸大或遗漏重大纪律处分。 - \item 基金载体、LPA 核心条款与管理人登记状态(或时间表)是否向首轮 LP 透明。 - \item 行政:银行账户、KYC 流程、认购书模板、费用与里程碑是否就绪。 -\end{itemize} - -\section{首单投资前检查清单} - -\begin{itemize} - \item 立项备忘录、投委会决议、利益冲突审查是否归档。 - \item 财务/法律/商业尽调结论与\textbf{红线问题}关闭状态;CP 与划款路径确认。 - \item Term Sheet 与最终协议的关键经济条款\textbf{差异说明}。 - \item 投后 100 日计划初稿与报告节奏是否通知被投方。 -\end{itemize} - -\section{年度复盘清单} - -\begin{itemize} - \item 组合层面:IRR、MOIC、DPI/TVPI 与可比基金基准;单一项目减值测试。 - \item 合规与运营:监管报送、税务、审计、数据安全与业务连续性演练。 - \item 团队:招聘、培训、激励与关键人备份;文化与健康度(尤其远程团队)。 - \item 战略:赛道假设是否仍成立,下一支基金或延续基金是否进入筹备窗口。 -\end{itemize} - -\section{常见失败模式与改进} - -\textbf{条款理解偏差:}投资团队未吃透清算优先与反稀释的数值后果——改进:建模培训与双人复核。\textbf{尽调流于形式:}过度依赖管理层 PPT——改进:独立来源与现场走访清单。\textbf{投后失联:}交割后数月无董事会材料——改进:强制 CRM 与季度投后评审会。\textbf{募资与投资脱节:}承诺的策略与实际项目类型漂移——改进:投资委员会章程与 LP 沟通纪律。 - -\section{与全书其他部分的衔接} - -冷启动与 Networking 解决「人与信任从哪来」;合规篇解决「能否合法做」;本清单解决「落地时别漏项」。建议将清单电子化为可勾选项,并在每年审计前更新一版。 diff --git a/pe-zero-to-one/chapter/ch16.tex b/pe-zero-to-one/chapter/ch16.tex deleted file mode 100644 index fe12a31..0000000 --- a/pe-zero-to-one/chapter/ch16.tex +++ /dev/null @@ -1,112 +0,0 @@ -\chapter{冷启动:从策略掌握者到最小可行团队} - -本章讨论:在已具备可验证交易策略或组合的前提下,如何跨越「只有一个人、没有品牌、没有合规壳」的冷启动期,通过\textbf{Networking}与\textbf{有节制的触达}组建团队、积累信任,并与本书\textbf{合规篇}(第十七章起)所述合规路径衔接。\textbf{未获必要许可前,任何对外募资或投资顾问表述须严格遵守当地法律};下文中的「触达」包含人才、合作方与\textbf{未来}资本关系,不代表可绕过监管。 - -\section{冷启动的三类约束} - -\begin{itemize} - \item \textbf{可信度:}同类策略供给过剩, allocator 与联合创始人默认怀疑;需要\textbf{可复核}的过程记录(回测假设、实盘滑点、版本管理),而非仅口头「稳定盈利」。 - \item \textbf{合规壳:}在多数司法辖区,面向外部资金开展管理或募集前须具备相应资格(参见\textbf{合规篇})。冷启动阶段常见做法是:\textbf{自有/极窄关系资金}验证、或\textbf{入职持牌机构}输出策略、或与已持牌方\textbf{投顾/白标}合作——具体路径须律师确认。 - \item \textbf{资本与时间:}团队现金跑道与机会成本;过早扩张固定人力往往比「外包+里程碑」更危险。 -\end{itemize} - -\section{阶段模型:从单人到最小团队} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[node distance=0.75cm, font=\small] - \node[compliance=purple] (s0) {0. 策略持有人\\回测/仿真/小资金实盘}; - \node[compliance=violet, below=of s0] (s1) {1. 可展示记录\\文档化、可重复运行、风险指标}; - \node[compliance=blue, below=of s1] (s2) {2. 第一个同类\\联创 / 资深兼职 / 顾问}; - \node[compliance=teal, below=of s2] (s3) {3. 最小 pods\\研究+工程 或 工程+运维}; - \node[compliance=green!50!black, below=of s3] (s4) {4. 公司化与分工\\合规、运营、市场/IR}; - - \foreach \a/\b in {s0/s1,s1/s2,s2/s3,s3/s4} - \draw[compliance arrow] (\a) -- (\b); - - \begin{scope}[on background layer] - \node[rounded corners=12pt, inner sep=11pt, fill=gray!6, draw=gray!45, dashed, fit=(s0)(s4)] {}; - \end{scope} -\end{tikzpicture} -\caption{从「掌握策略」到「可运转组织」的常见阶段(非严格线性,可回退迭代)} -\label{fig:coldstart-stages} -\end{figure} - -\textbf{阶段 0--1:}重点不是扩张人头,而是把策略变成\textbf{他人可接手}的流水线:代码仓库规范、参数与数据版本、失败案例与最大回撤说明。此阶段 Networking 的目标多是\textbf{同行切磋与找漏洞},而非直接募资。 - -\textbf{阶段 2:}第一个关键合作者应补齐你最弱的一环:若你强研究弱工程,优先找能\textbf{工程化与上线}的人;若你强开发弱市场,可先找\textbf{行业顾问}(兼职)帮对接资源,再考虑全职。 - -\textbf{阶段 3--4:}出现固定交易时段运维、对手方对接、估值与报表需求时,再拆出\textbf{运营/风控合规};市场与投资者关系(IR)通常在\textbf{真有产品或持牌主体}后加重,避免过早「销售驱动」导致合规风险。 - -\section{团队角色清单(精简版)} - -\begin{description} - \item[投资/研究负责人] 策略逻辑、组合与风险预算;对外投资叙事与 allocator 对话(须在合规框架内)。 - \item[量化工程] 回测框架、执行系统、低延迟与稳定性;与经纪商/交易所 API 对接。 - \item[交易运维] 盘中监控、故障切换、日志与事故复盘;常与工程合并由小团队兼任。 - \item[合规与法务] 持牌后常需专职或外包律所;冷启动期至少要有\textbf{固定外部律师}审阅对外材料。 - \item[运营与财务] 基金会计、估值、投资者报告模板;公司日常账务。 - \item[市场/IR] 募资材料、路演排期、数据室维护;与「公开宣传」边界强相关,需合规双人复核。 -\end{description} - -早期不必一人一岗:常见「2+1」是 \textbf{PM+工程} 加 \textbf{外包财务/律师};或 \textbf{PM+运营} 加 \textbf{外包开发}。原则是\textbf{不可外包的核心}(投资决策权、风控哲学)留在内部。 - -\section{Networking:去哪里、见谁、谈什么} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[font=\footnotesize] - \node[ellipse, draw=teal!70, fill=teal!6, minimum width=3.6cm, minimum height=1.5cm, align=center] (hub) {你\\(策略与记录)}; - \node[reg node=blue, above left=1.2cm and 1.8cm of hub] (alumni) {校友与\\前同事}; - \node[reg node=orange, above right=1.2cm and 1.8cm of hub] (broker) {经纪商/\\期货商活动}; - \node[reg node=violet, left=2.5cm of hub] (conf) {行业会议\\与闭门沙龙}; - \node[reg node=purple, right=2.5cm of hub] (online) {线上社群\\(筛选质量)}; - \node[reg node=green!60!black, below left=1.2cm and 1.5cm of hub] (vendor) {数据商/\\云厂商生态}; - \node[reg node=red!65!black, below right=1.2cm and 1.5cm of hub] (intro) {介绍链\\(warm intro)}; - - \foreach \x in {alumni,broker,conf,online,vendor,intro} - \draw[compliance arrow, shorten <=2pt, shorten >=2pt] (hub) -- (\x); -\end{tikzpicture} -\caption{Networking 渠道示意(优先 warm intro 与高质量闭门场景)} -\label{fig:networking-hub} -\end{figure} - -\begin{itemize} - \item \textbf{Warm intro 优先:}同样一封邮件,经共同信任人转发,回复率远高于陌生冷信。可维护简易表格:姓名、机构、关注点、上次联系日期、可提供的价值(非收益承诺)。 - \item \textbf{经纪商/期货商/主经纪会议:}偏执行与基础设施,适合找\textbf{运维与对手方}人脉,不宜在无证时当作募资场合。 - \item \textbf{会议与沙龙:}目标应是\textbf{学习监管口径、认识服务方、找潜在联合创始人},而非群发「代客理财」类话术。 - \item \textbf{线上社群:}质量参差;可贡献可验证的技术内容建立声誉,避免在公开频道讨论\textbf{具体客户资金与收益保证}。 - \item \textbf{校友网络:}律所、审计、投行背景校友常能在\textbf{公司设立与合规路径}上提供高质量引荐。 -\end{itemize} - -\section{Cold call 与 Cold email:原则与节奏} - -\textbf{对象区分:} -\begin{description} - \item[人才/技术合作] 邮件宜短:你是谁、策略领域(统计套利/CTA/做市等)、当前阶段、对方为何相关、明确\textbf{一次性}请求(15 分钟通话/咖啡)。附件可给\textbf{一页 Teaser(不含违规承诺)}。 - \item[Allocator/家办/FOF] 须事先研究其\textbf{策略容量、历史偏好、最低投资线}。首封邮件忌长 PDF;可附\textbf{合规审查过的}一页摘要与数据室链接(若有)。跟进间隔以周计,避免日催。 - \item[服务采购(数据、托管、系统)] 明确技术栈与接口需求,便于对方判断是否匹配。 -\end{description} - -\textbf{共同禁忌:}保本保收益、公开招揽不特定对象、借用他人牌照名义、夸大未经审计的业绩。此类表述在多国可能同时触发\textbf{证券法与刑事风险}。 - -\textbf{可执行习惯:}每周固定数量\textbf{高质量触达}(如 5--10 封定制邮件)优于百封群发;每次对话后写三行纪要(对方痛点、下一步、承诺事项)。 - -\section{从交易执行者到「团队负责人」} - -角色转变要点: -\begin{enumerate} - \item \textbf{决策透明:}研究日志、策略变更审批、仓位与风险限额书面化,减少「只有创始人脑子里有」的单点风险。 - \item \textbf{招聘顺序:}先\textbf{标准与文档},再扩人;否则新人只能当「第二个你」,无法放大杠杆。 - \item \textbf{激励:}早期现金有限时,可用里程碑奖金、虚拟股或期权,但须\textbf{律师起草}并与未来持牌主体股权结构一致。 - \item \textbf{冲突处理:}联合创始人间事先约定\textbf{股权兑现、退出、竞业},避免策略分歧时无法拆伙。 -\end{enumerate} - -\section{与本书其他章节的衔接} - -\begin{itemize} - \item 募资与条款设计见前文各章;\textbf{冷启动期}更强调「可验证记录 + 合规路径 + 小步团队」,而非一步到位的大基金结构。 - \item 集团架构与跨境展业见第十四章(图 \ref{fig:holding-structure})及\textbf{合规篇};Networking 获得的外资意向须在\textbf{具体辖区规则}下重新评估。 -\end{itemize} - -本章不提供「话术模板」式的募资脚本;若需要,应在持牌律师与合规审查后定制。冷启动的本质是:用\textbf{可审计的进步}替代\textbf{不可验证的叙事},用\textbf{精准触达}替代\textbf{噪音式群发},用\textbf{最小团队}撑到\textbf{合规壳与首关资金}同时就绪的那一刻。 diff --git a/pe-zero-to-one/chapter/ch17.tex b/pe-zero-to-one/chapter/ch17.tex deleted file mode 100644 index 4ac8e48..0000000 --- a/pe-zero-to-one/chapter/ch17.tex +++ /dev/null @@ -1,54 +0,0 @@ -\chapter{量化开发者合规路径:从灰色地带到持牌展业} - -本章面向已具备相对稳定盈利策略组合的量化开发者,梳理从「借贷式资管」「代客理财」等非正规安排,过渡到在主要司法辖区合法管理外部资金的典型阶梯。\textbf{本书不构成法律意见};具体能否展业须由当地持牌律师结合资金性质、募集方式、客户类型与跨境因素认定。 - -\section{为何「借贷 / 配资 / 代客理财」本身风险高} - -中国证监会投资者教育案例明确指出:证券从业人员\textbf{私下代客理财、约定收益分成},违反《证券法》第143--145条及经纪人相关规则;纠纷中投资者往往只能向个人追责。参见官方案例:\url{http://www.csrc.gov.cn/csrc/c100211/c1452037/content.shtml}。 - -实务中常与下列风险标签一并讨论(是否构成违法或犯罪须个案认定):面向\textbf{不特定对象}、公开或变相公开宣传、\textbf{保本保收益}承诺,可能触及非法集资类刑事风险;场外配资长期为监管打击重点——\textbf{结构违法则策略再稳也不安全}。 - -\section{对外资管的合规阶梯(概念模型)} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[node distance=1.15cm and 0.9cm] - \node[compliance=purple] (A) {A. 自有或极窄关系户\\范围与账户出借、税务等仍须个案评估}; - \node[compliance=violet, below=of A] (B) {B. 入职持牌机构\\券商资管、公募、期货资管、银行理财子等}; - \node[compliance=blue!70!cyan, below=of B] (C) {C. 证券投资咨询机构\\证监会许可范围内;咨询 $\neq$ 代客全权委托}; - \node[compliance=teal, below=of C] (D) {D. 私募基金管理人\\中基协登记 + 产品备案(证券类)}; - \node[compliance=green!50!black, below=of D] (E) {E. 投顾输出(如 MOM)\\满足条件后向银行、信托、券商资管提供投顾服务}; - - \draw[compliance arrow] (A) -- (B); - \draw[compliance arrow] (B) -- (C); - \draw[compliance arrow] (C) -- (D); - \draw[compliance arrow] (D) -- (E); - - \begin{scope}[on background layer] - \node[fill=gray!5, rounded corners=14pt, inner sep=14pt, yshift=-2pt, - fit=(A)(E), draw=gray!40, dashed] {}; - \end{scope} -\end{tikzpicture} -\caption{量化开发者常见合规演进阶梯(示意,非唯一路径)} -\label{fig:quant-ladder} -\end{figure} - -对已能稳定盈利的策略组合,实务上常见顺序是:\textbf{B} 验证规模与合规耐受 $\rightarrow$ 有出资人与团队后再上 \textbf{D};若主要输出「研究/模型」而非直接管账,可重点评估 \textbf{C/E} 与合同边界。 - -\section{中国大陆:私募登记与系统入口} - -根据证监会公开的流程说明,私募基金管理人应向\textbf{基金业协会}办理登记,基金募集完毕后办理备案;系统为 \textbf{AMBERS}:\url{https://ambers.amac.org.cn}。流程索引:\url{http://www.csrc.gov.cn/csrc/c101939/c1045416/content.shtml}。《私募投资基金监督管理暂行办法》第九条明确:协会登记备案\textbf{不构成}对管理人投资能力、持续合规的认可,\textbf{也不保证}基金财产安全。 - -《私募投资基金登记备案办法》(中基协发〔2023〕5号)及配套指引下,市场常讨论的硬性方向包括(以协会\textbf{最新材料清单}为准):私募基金管理人实缴货币资本不低于\textbf{1000万元人民币}(或等值可自由兑换货币)等;证券类负责投资的高管常需满足\textbf{最近5年内连续2年以上}担任基金经理或投资决策负责人等,且单只产品管理规模不低于\textbf{2000万元}等证明要求;合规风控负责人须具备合规、风控、法律、会计等相关经验;近年内监管处罚、重大风险机构任职等构成负面情形。 - -\section{美国(简要锚点)} - -管理外部客户资产(含多数对冲基金架构)常需注册为 \textbf{Investment Adviser},提交 \textbf{Form ADV},通过 \textbf{IARD}。SEC 与州管辖取决于 AUM 等(\textbf{Rule 203A-1} 等)。入口参考:\url{https://www.sec.gov/divisions/investment/iaregulation/regia.htm}。策略以期货/互换为主时可能叠加 \textbf{CFTC/NFA}。 - -\section{新加坡(简要锚点)} - -从事《证券与期货法》(SFA)项下基金管理,须申请持有 \textbf{CMS} 牌照的 \textbf{LFMC};仅管理风投基金可申请简化 \textbf{VCFM}。MAS 官方说明含豁免情形、Form 1、eLicensing、审批约6个月、年费 S\$4{,}000 等:\url{https://www.mas.gov.sg/regulation/capital-markets/apply-for-licensing-or-registration-of-capital-market-entities/fund-management-licensing}。 - -\section{与集团架构、分工条款的衔接} - -「母公司—子公司」主要服务治理、合同主体与税务筹划讨论,\textbf{不能替代}管理人登记/产品备案或相应辖区资管牌照。「技术方只写策略、资金方承担一切」在协会材料中,投资或高管岗位仍可能被审核;任职与对外披露须由律师设计。 diff --git a/pe-zero-to-one/chapter/ch18.tex b/pe-zero-to-one/chapter/ch18.tex deleted file mode 100644 index b36dce0..0000000 --- a/pe-zero-to-one/chapter/ch18.tex +++ /dev/null @@ -1,43 +0,0 @@ -\chapter{中国大陆:私募登记、代客理财边界与系统流程} - -\section{监管依据与流程入口} - -《私募投资基金监督管理暂行办法》第七条、第八条要求各类私募基金管理人根据\textbf{基金业协会}规定申请\textbf{登记},私募基金募集完毕后办理\textbf{备案}。证监会办事说明:\url{http://www.csrc.gov.cn/csrc/c101939/c1045416/content.shtml}。资产管理综合报送平台(\textbf{AMBERS}):\url{https://ambers.amac.org.cn}。 - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[ - font=\small, - box/.style={compliance=#1, minimum width=3.6cm, minimum height=1.05cm}, -] - \node[box=orange] (law) {行政法规与证监会规章\\《暂行办法》等}; - \node[box=blue, right=1.8cm of law] (amac) {基金业协会\\管理人登记 + 基金备案}; - \node[box=teal, right=1.8cm of amac] (amber) {AMBERS 报送平台\\材料提交与公示}; - - \draw[compliance arrow] (law) -- node[above, font=\scriptsize] {授权/自律} (amac); - \draw[compliance arrow] (amac) -- node[above, font=\scriptsize] {电子化} (amber); - - \node[below=0.55cm of amac, text width=8.5cm, align=center, font=\scriptsize, text=gray!70!black] {第九条:登记备案不构成对投资能力的认可,不构成对基金财产安全的保证。}; -\end{tikzpicture} -\caption{中国私募:法律依据、协会职能与报送系统关系(示意)} -\label{fig:chn-amac-flow} -\end{figure} - -\section{与「代客理财」的区分} - -正规证券公司资产管理业务以\textbf{公司}为主体签署资管合同;从业人员个人与客户私下签约或全权操作账户,属违规代客理财。投资者教育案例:\url{http://www.csrc.gov.cn/csrc/c100211/c1452037/content.shtml}。 - -\section{登记备案办法下的常见硬性方向} - -以下摘自公开解读与协会配套规则中常被引用的方向,\textbf{具体数字与表格以协会最新《登记申请材料清单》及有效规则文本为准}: - -\begin{itemize} - \item 私募基金管理人实缴货币资本不低于 \textbf{1000万元人民币}(或等值可自由兑换货币)等要求; - \item 证券类私募:负责投资的高管常需 \textbf{最近5年内连续2年以上} 相关投资管理经验,单只产品管理规模不低于 \textbf{2000万元} 等证明材料; - \item \textbf{合规风控负责人} 应具备合规、风控、法律、会计等相关工作经验; - \item 近年内被采取行政监管措施、协会纪律处分、重大负面机构任职等,可能构成障碍。 -\end{itemize} - -\section{证券投资咨询与私募管理人的关系} - -两者为不同监管线条:投资咨询机构从事证监会许可的咨询业务;私募基金管理人在中基协登记后管理私募基金。向银行理财子、信托、券商资管等提供\textbf{投资顾问}服务,需满足另行规定的条件(如备案年限、人员「3+3」等,以当时有效规则为准)。两类业务人员兼任限制须严格遵守监管规定。 diff --git a/pe-zero-to-one/chapter/ch19.tex b/pe-zero-to-one/chapter/ch19.tex deleted file mode 100644 index 07e4d4a..0000000 --- a/pe-zero-to-one/chapter/ch19.tex +++ /dev/null @@ -1,54 +0,0 @@ -\chapter{全球区域合规总览:CHN、IND、EMEA、AMER 与亚太} - -对外管理客户资金或设立基金时,须先厘清:\textbf{谁在决策}(全权委托 / 建议 / 纯软件)、\textbf{是否集合投资}、\textbf{客户是否零售}、\textbf{募集与销售是否跨境}、\textbf{是否涉及衍生品或高杠杆}。下列为各区域\textbf{框架性}摘要,实施须结合当地律师意见。 - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[scale=0.98, every node/.style={transform shape}] - % 装饰性背景 - \begin{scope}[on background layer] - \fill[blue!4] (-5.6,-3.2) rectangle (5.6,3.4); - \draw[decorate, decoration={snake, amplitude=0.6pt, segment length=8pt}, gray!30] - (-5.3,0) -- (5.3,0); - \end{scope} - - \node[fancy ring=red!75!black, fill=red!10, minimum size=2.9cm] (CHN) at (-3,1.6) {CHN\\\footnotesize 中基协登记}; - \node[fancy ring=orange!80!black, fill=orange!8, minimum size=2.9cm] (IND) at (3,1.6) {IND\\\footnotesize SEBI AIF}; - \node[fancy ring=blue!70!black, fill=blue!6, minimum size=2.9cm] (EMEA) at (-3,-1.5) {EMEA\\\footnotesize AIFMD / FCA}; - \node[fancy ring=teal!70!black, fill=teal!6, minimum size=2.9cm] (AMER) at (3,-1.5) {AMER\\\footnotesize SEC RIA / IFM}; - - \draw[compliance arrow, shorten >=2pt, shorten <=2pt] (CHN) -- (EMEA); - \draw[compliance arrow, shorten >=2pt, shorten <=2pt] (IND) -- (AMER); - \draw[dashed, gray!50, thick] (CHN) -- (IND); - \draw[dashed, gray!50, thick] (EMEA) -- (AMER); - - \node[font=\scriptsize, text=gray!60!black, align=center] at (0,3.05) - {跨境募集时,四象限规则可能\textbf{同时}适用 $\Rightarrow$ 须逐司法辖区确认}; -\end{tikzpicture} -\caption{主要区域监管锚点示意(非地理比例;中东、非洲、拉美须单列国别)} -\label{fig:global-quad} -\end{figure} - -\section{欧盟(EU):AIFMD 与 AIFMD II} - -管理欧盟内另类投资基金(AIF)或向欧盟投资者营销,通常需取得成员国主管机关(NCA)授权的 \textbf{AIFM},并遵守资本、托管、杠杆、流动性、报告及委托管理等要求。\textbf{AIFMD II} 已于2024年生效,成员国转置与全面适用存在过渡期(公开材料常见表述约至2026年中,以各国立法为准)。授权材料趋向更细:人员、委托/再委托、技术资源、尽调程序等。欧盟委员会立法索引:\url{https://finance.ec.europa.eu/regulation-and-supervision/financial-services-legislation/implementing-and-delegated-acts/alternative-investment-fund-managers-directive_en}。 - -\section{英国(UK)} - -脱欧后适用 \textbf{UK AIFM} 制度:\textbf{full-scope authorised}、\textbf{small authorised}、\textbf{small registered UK AIFM} 等路径门槛与义务不同。FCA 入口:\url{https://www.fca.org.uk/firms/aifmd-uk}。另:\textbf{MiFID} 投资业务、FCA 其他授权与「仅做 AIFM」为不同维度。 - -\section{印度(IND):SEBI AIF} - -另类投资基金依 \textbf{SEBI (AIF) Regulations, 2012} 及后续 \textbf{Master Circular}、年度 \textbf{Circular} 更新;申请通过 \textbf{SIPortal} 等提交。2024 年起市场关注要点包括:Category I/II AIF 对参股公司股权设立负担的框架、关键投资团队\textbf{认证要求}等——以 \url{https://www.sebi.gov.in} 现行文件为准。证券类量化策略须与 \textbf{FPI/PMS} 等路径是否竞合一并论证。 - -\section{美国与加拿大(AMER 核心)} - -\textbf{美国:} 管理外部客户资产常需 \textbf{RIA} 注册与 \textbf{Form ADV}(\textbf{IARD});联邦与州管辖取决于 AUM(\textbf{Rule 203A-1} 等)。\textbf{加拿大:} \textbf{NI 31-103} 协调各省注册,基金管理常涉及 \textbf{Investment Fund Manager (IFM)} 等类别,除非适用豁免。 - -\section{新加坡、香港、澳大利亚、日本(亚太摘录)} - -\textbf{新加坡:} \textbf{CMS} 牌照下 \textbf{LFMC};\textbf{VCFM} 针对风投基金;\textbf{SFA 第99条} 等豁免情形见 MAS 页面。\textbf{香港:} 组合资产管理常见证监会 \textbf{第9类}牌照,通常至少两名 \textbf{RO}。\textbf{澳大利亚:} 面向客户的 \textbf{AFSL};批发基金常配合 \textbf{Responsible Entity / MIS}。\textbf{日本:} \textbf{金商法} 下第二类登记等,投信/投助为另一线条。 - -\section{中东与非洲(示例)} - -\textbf{迪拜 DIFC:} \textbf{DFSA} 监管,常见 \textbf{Fund Manager} 类别,可设面向合格投资者的 \textbf{QIF、Exempt Fund} 等(规则见 DFSA Rulebook)。\textbf{阿布扎比 ADGM、沙特 CMA} 等为独立框架。\textbf{非洲} 各国差异大(如南非 \textbf{FSCA} 体系),须国别附录,不可与欧盟或美国规则混用。 diff --git a/pe-zero-to-one/chapter/ch20.tex b/pe-zero-to-one/chapter/ch20.tex deleted file mode 100644 index f72912e..0000000 --- a/pe-zero-to-one/chapter/ch20.tex +++ /dev/null @@ -1,47 +0,0 @@ -\chapter{EMEA 深度:AIFMD 栈、英国路径与中东枢纽} - -\section{欧盟 AIFM 典型结构} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[node distance=0.85cm] - \node[reg node=blue] (nca) {NCA\\成员国主管机关}; - \node[reg node=purple, below=of nca] (aifm) {AIFM\\另类投资管理人}; - \node[reg node=teal, below left=of aifm, xshift=-0.2cm] (aif) {AIF\\基金载体}; - \node[reg node=orange, below right=of aifm, xshift=0.2cm] (dep) {托管等\\(依规则)}; - \node[reg node=gray, below=2.1cm of aifm, minimum width=6.2cm] (inv) {合格/专业投资者(依基金类型与营销规则)}; - - \draw[compliance arrow] (nca) -- (aifm) node[midway, right, font=\scriptsize] {授权}; - \draw[compliance arrow] (aifm) -- (aif); - \draw[compliance arrow] (aifm) -- (dep); - \draw[compliance arrow] (aif) -- (inv); - \draw[compliance arrow] (dep) -- (inv); - - \begin{scope}[on background layer] - \node[fill=blue!3, rounded corners=16pt, inner sep=16pt, - fit=(nca)(aifm)(aif)(dep)(inv), draw=blue!25] {}; - \end{scope} -\end{tikzpicture} -\caption{欧盟语境下 AIFM--AIF--投资者关系(高度简化;不含 NPPR、护照等营销细节)} -\label{fig:aifmd-stack} -\end{figure} - -\section{AIFMD II 动向(摘要)} - -授权申请须提供更充分的人员、委托链、技术资源与尽调安排描述;部分规则对\textbf{流动性管理工具、杠杆披露、监管报告}等提出强化要求。实施日期以各成员国完成转置后的适用日为准。 - -\section{英国:注册与授权 AIFM} - -\textbf{Small registered UK AIFM} 适用于特定窄类情形(如部分封闭式投资信托、小型房地产 AIFM、社会企业/风险资本标签基金等),监管负担轻于 full-scope,但仍须遵守 AIFMD 第3条等核心义务(报告等)。具体资格见 FCA「Apply to be a registered / authorised AIFM」页面。 - -\section{瑞士、卢森堡、爱尔兰} - -瑞士 \textbf{CISA}、卢森堡/爱尔兰的 \textbf{AIF/UCITS} 载体常与欧盟营销路径(反向邀约、NPPR、护照)结合设计,须基金律师与税务顾问联合建模。 - -\section{中东:DIFC 与 DFSA} - -迪拜国际金融中心(DIFC)由 \textbf{DFSA} 监管。市场常见表述包括:面向合格投资者的 \textbf{Qualified Investor Fund (QIF)}、\textbf{Exempt Fund} 等类型,以及 \textbf{Category 3C Fund Manager} 等牌照维度;最低认购额、资本与快速通道审批等以 \textbf{DFSA Rulebook} 与当时政策为准。\textbf{ADGM(阿布扎比)}、\textbf{沙特 CMA} 等为平行但独立的监管环境。 - -\section{非洲} - -南非等国存在集合投资计划与金融服务提供商许可体系;其余国家规则分散。EMEA 报告中的「非洲」应做\textbf{国别表},不宜套用欧盟或英国条款。 diff --git a/pe-zero-to-one/chapter/ch21.tex b/pe-zero-to-one/chapter/ch21.tex deleted file mode 100644 index 5f9b064..0000000 --- a/pe-zero-to-one/chapter/ch21.tex +++ /dev/null @@ -1,36 +0,0 @@ -\chapter{AMER:美国 RIA、商品池与加拿大 IFM} - -\section{美国:投资顾问注册} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture} - \node[compliance=teal, minimum width=4.2cm] (adv) {Form ADV\\IARD 电子申报}; - \node[compliance=blue, right=2.2cm of adv, minimum width=4.2cm] (sec) {SEC 或州监管\\视 AUM 与规则 203A-1}; - \path (adv) -- node[coordinate, midway] (midadvsec) {} (sec); - \node[compliance=green!50!black, below=1.5cm of midadvsec, minimum width=8cm] (pf) {私募基金管理人:Schedule A/B 等披露\\对冲基金顾问额外信息(历史规则演进,以现行表格为准)}; - - \draw[compliance arrow] (adv) -- (sec) node[midway, above, font=\scriptsize] {注册/审查}; - \draw[compliance arrow] (adv.south) -- ++(0,-0.35) -| (pf.north); - \draw[compliance arrow] (sec.south) -- ++(0,-0.35) -| (pf.north); - - \node[font=\scriptsize, text width=9cm, align=center, below=0.35cm of pf] - {持续义务:账簿记录、宣传材料、合规政策、年检与修正案等。}; -\end{tikzpicture} -\caption{美国投资顾问注册与私募披露关系(概念图)} -\label{fig:us-ria} -\end{figure} - -\textbf{要点:} 管理外部客户资产(含多数对冲基金架构)通常须注册为 \textbf{Investment Adviser};\textbf{仅管理自有资产}或符合 \textbf{Exempt Reporting Adviser} 等情形可能减轻部分披露,但不等于无监管。\textbf{CFTC/NFA:} 策略以期货、商品池为主时可能需另行注册。 - -官方入口示例:\url{https://www.sec.gov/divisions/investment/iaregulation/regia.htm};AUM 门槛与联邦/州切换见 \textbf{17 CFR §275.203A-1} 等(以现行有效文本为准)。 - -\section{加拿大:NI 31-103} - -\textbf{National Instrument 31-103} 协调各省证券监管,涵盖投资交易商、顾问、\textbf{Portfolio Manager}、\textbf{Investment Fund Manager} 等类别。新设基金管理人通常须在开展业务前完成相应注册或确认豁免适用。各省证监会网站提供非官方汇编与政策更新。 - -示例索引:\url{https://www.osc.ca/en/securities-law/instruments-rules-policies/3/31-103/unofficial-consolidation-national-instrument-31-103-registration-requirements-exemptions-and}。 - -\section{拉丁美洲(摘要)} - -\textbf{巴西 CVM:} 各类 \textbf{Fundo de Investimento} 须按类型注册并遵守治理与披露。\textbf{墨西哥} 等对基金与另类载体另有规定。\textbf{结论:} 拉美须\textbf{国别附录},不可与美国 RIA 路径混为一谈。 diff --git a/pe-zero-to-one/chapter/ch22.tex b/pe-zero-to-one/chapter/ch22.tex deleted file mode 100644 index 4ccd3ee..0000000 --- a/pe-zero-to-one/chapter/ch22.tex +++ /dev/null @@ -1,63 +0,0 @@ -\chapter{亚太与印度细则、跨境三角与误区} - -\section{新加坡 MAS} - -\begin{itemize} - \item 从事 SFA 项下\textbf{基金管理}:申请 \textbf{LFMC},持有 \textbf{CMS} 牌照。 - \item 仅管理\textbf{风投基金}:可考虑 \textbf{VCFM} 简化路径。 - \item \textbf{豁免:} 如仅为关联公司或关联家族管理资产、仅为合格/机构投资者管理不动产或非资本市场产品池等(见 SFA 第99条及《证券期货(牌照与业务操守)规例》附表二第5段等)。 - \item 官方:\url{https://www.mas.gov.sg/regulation/capital-markets/apply-for-licensing-or-registration-of-capital-market-entities/fund-management-licensing} -\end{itemize} - -页面载明:完整且符合条件的申请审查约 \textbf{6个月};持牌基金管理公司年费 \textbf{S\$4{,}000} 起(另加代表费用规则);须\textbf{专用安全办公场所}。 - -\section{香港证监会} - -证券/期货组合资产管理通常需 \textbf{第9类(提供资产管理)}牌照;常见要求包括\textbf{两名负责人员(RO)}、香港公司或注册非香港公司、实体办公等。详见 \url{https://www.sfc.hk}。 - -\section{澳大利亚 ASIC} - -面向客户提供金融产品建议或发行管理投资计划权益,通常需 \textbf{AFSL} 相应授权。\textbf{批发}基金面向批发投资者时,披露义务与零售不同,但仍须结构合规(如 \textbf{Responsible Entity} 角色)。具体授权范围由律师与 ASIC 指南对齐。 - -\section{日本} - -\textbf{金融商品交易法}下第二类金融商品交易业登记等;公募投信、投资助言、私募领域线条各异,须日文合规资料与本地律师。 - -\section{印度 SEBI AIF(补充)} - -\textbf{Category I / II / III} 在杠杆、投资范围、披露上不同;2024 年前后市场关注:股权负担框架、关键投资团队\textbf{认证}过渡期等。申请费、表格与 First Schedule 要求以 SEBI 现行规则与 \textbf{SIPortal} 流程为准。 - -\section{跨境:三地司法辖区三角} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[scale=1.02, every node/.style={transform shape}] - \coordinate (top) at (90:2.5); - \coordinate (lr) at (-30:2.5); - \coordinate (ll) at (210:2.5); - - \fill[teal!8] (top) -- (lr) -- (ll) -- cycle; - \draw[thick, teal!60!black] (top) -- (lr) -- (ll) -- cycle; - - \node[compliance=teal, minimum width=3.4cm] at (top) {管理人\\注册地法律}; - \node[compliance=blue, minimum width=3.4cm] at (lr) {基金载体\\注册地}; - \node[compliance=orange, minimum width=3.4cm] at (ll) {投资者\\国籍/所在地}; - - \node[font=\scriptsize, text width=7.8cm, align=center] at (0,-0.15) - {仅在一地拿牌 \textbf{不自动}覆盖向他国居民募资或远程下单;\\欧盟护照、NPPR、私募配售等均为\textbf{程序工具},非「全球免牌」。}; -\end{tikzpicture} -\caption{跨境资管常须分别评估的三类连接点} -\label{fig:cross-border-triangle} -\end{figure} - -\section{常见误区} - -\begin{enumerate} - \item \textbf{技术中立:} 代码与回测本身通常不单独触发牌照;一旦绑定\textbf{客户资金、下单权或基金份额募集},即进入各辖区证券/基金法。 - \item \textbf{合同规避:} 名为「借贷」「合作」「分成」但实质为面向不特定对象的保本或全权委托,仍可能被重新定性。 - \item \textbf{集团架构:} 母公司--子公司可服务治理与税务讨论,\textbf{不能替代}管理人资格与产品注册/备案。 -\end{enumerate} - -\section{维护与更新} - -规则持续变化(如 \textbf{AIFMD II}、\textbf{SEBI AIF} 年度通函、\textbf{SEC} 对顾问门槛的审议等)。本书内容反映整理时的公开材料;正式展业前须以\textbf{监管机构官网与律师备忘录}为准并标注检索日期。 diff --git a/pe-zero-to-one/chapter/ch23.tex b/pe-zero-to-one/chapter/ch23.tex deleted file mode 100644 index fe4a817..0000000 --- a/pe-zero-to-one/chapter/ch23.tex +++ /dev/null @@ -1,48 +0,0 @@ -\chapter{Web3 技术纵深:账本、共识、智能合约与市场原语} - -\section{分布式账本与密码学基础} - -\textbf{分布式账本技术(DLT)}指多节点共同维护、通过密码学与协议规则达成一致的数据结构,不必依赖单一中心化记账方。\textbf{公链}(如比特币、以太坊及众多 Layer~1)向任意满足规则的参与者开放验证与交易广播;\textbf{联盟链/私有链}则限制节点集合,更贴近机构间清算与供应链场景。密码学工具包括:哈希链保证篡改可检测、非对称签名保证授权与不可否认、默克尔树支撑轻客户端验证、零知识证明(ZKP)在隐私与扩容方案中日益重要。理解这些构件有助于区分「真正链上结算」与仅借用区块链品牌营销的中心化数据库。 - -\section{共识、结算与最终性} - -\textbf{工作量证明(PoW)}通过算力竞争出块,能源与安全假设明确;\textbf{权益证明(PoS)}以质押与罚没(slashing)约束验证者行为,资本效率与委托结构不同。\textbf{最终性(finality)}指交易被撤销的概率足够低的时间点——不同链的确认数与重组风险不同,跨链与交易所入账规则必须与之对齐。\textbf{Layer~2(Rollup 等)}将执行从主链外移,通过欺诈证明或有效性证明(ZK-Rollup)向 L1 提交状态承诺,在吞吐与费用上折中,但引入排序器(sequencer)中心化与桥接风险等新攻击面。 - -\section{账户模型、钱包与托管} - -以太坊等采用\textbf{账户模型}(EOA 合约账户);比特币为\textbf{UTXO} 模型。钱包按密钥控制方式分为\textbf{自托管}(用户持有私钥或助记词)与\textbf{托管钱包}(交易所/银行代持)。机构场景下常见 \textbf{MPC}(多方计算)、\textbf{HSM} 与策略引擎组合,以满足职责分离与交易审批。链上地址不等于实名身份;合规上的「谁最终控制资产」须结合托管协议与链下 KYC 映射。 - -\section{智能合约与可组合性} - -\textbf{智能合约}是在链上虚拟机中执行的确定性程序;升级机制(代理合约、多签治理)与\textbf{权限角色}(owner、admin、pause)直接决定资产安全。以太坊生态的\textbf{可组合性}允许协议在无许可情况下相互调用,加速创新也放大\textbf{级联清算}与漏洞传染风险。常见攻击类型包括:重入、预言机操纵、闪电贷辅助套利、跨链桥逻辑错误、治理劫持等——技术尽调须阅读审计报告与链上权限而不仅看白皮书。 - -\section{Token 标准与资产表示} - -\textbf{同质化代币}(如 ERC-20)适合份额与积分式权利;\textbf{NFT}(如 ERC-721/1155)适合唯一凭证与 RWA(实物资产)映射中的编号权利。\textbf{包装资产}(如封装 BTC)依赖托管方与铸造/销毁规则,信用风险回到链下对手方。\textbf{治理代币}的经济与法律属性高度情境化:可能仅投票工具,也可能因募资方式被认定为证券(见下一章)。 - -\section{DeFi 核心原语(金融市场视角)} - -\textbf{自动做市商(AMM)}用曲线函数替代订单簿,流动性由 LP 提供,承担无常损失与智能合约风险。\textbf{超额抵押借贷}(如稳定币铸造、循环杠杆)依赖清算机器人与预言机价格;参数(LTV、清算罚金)决定系统性压力下的级联。\textbf{稳定币机制}包括法币储备型、加密抵押型、算法型(历史波动极大);各自脱锚与储备透明度是监管焦点。\textbf{预言机}将链外价格与事件喂入合约,是操纵与 MEV(最大可提取价值)争夺的关键环节——排序器、区块构建者与搜索者之间的利益结构,使「链上公平」成为工程与经济学交叉问题。 - -\section{跨链桥与互操作性} - -桥将资产或消息在链间转移,技术路径包括锁定-铸造、流动性网络、轻客户端验证等。\textbf{桥}历史上是高损事件集中区:合约漏洞、多签私钥泄露、经济攻击(虚假消息)均可导致巨额盗取。机构参与跨链头寸须单独进行风险限额与应急演练。 - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[font=\footnotesize, node distance=0.55cm] - \node[reg node=violet, minimum width=6.8cm] (app) {应用层:钱包、聚合器、RWA 门户、游戏}; - \node[reg node=blue, below=of app, minimum width=6.8cm] (defi) {DeFi:DEX、借贷、稳定币、收益聚合、衍生品协议}; - \node[reg node=teal, below=of defi, minimum width=6.8cm] (l2) {执行与互操作:L2 / Rollup、桥、预言机、MEV 基础设施}; - \node[reg node=orange, below=of l2, minimum width=6.8cm] (l1) {结算层:L1 共识与数据可用性}; - \draw[compliance arrow] (app) -- (defi); - \draw[compliance arrow] (defi) -- (l2); - \draw[compliance arrow] (l2) -- (l1); -\end{tikzpicture} -\caption{Web3 协议栈简化分层(示意;各项目实际架构可能跨层)} -\label{fig:web3-stack} -\end{figure} - -\section{与本书其他部分的衔接} - -技术理解是阅读监管与市场章节的前提:同一「代币」在不同层(支付工具、治理凭证、收益权、抵押品)上的功能组合,会改变法律定性。量化与系统化团队若参与链上策略,还需将\textbf{节点延迟、Gas、回滚、预言机刷新频率}纳入与传统资产不同的执行模型。 diff --git a/pe-zero-to-one/chapter/ch24.tex b/pe-zero-to-one/chapter/ch24.tex deleted file mode 100644 index f7f2bb9..0000000 --- a/pe-zero-to-one/chapter/ch24.tex +++ /dev/null @@ -1,54 +0,0 @@ -\chapter{加密资产监管与政策:法域逻辑与执法难点} - -\textbf{本章不构成法律意见。}加密规则演进极快,正式展业须以各辖区\textbf{成文法、监管规则与律师意见}为准,并标注检索日期。 - -\section{欧盟 MiCA:统一框架与稳定币分层} - -欧盟《加密资产市场监管条例》(Markets in Crypto-Assets, \textbf{MiCA},条例编号如 2023/1114)将加密资产定义为可用分布式账本或类似技术以电子方式转移或存储的价值或权利的数字表示,并针对\textbf{其他金融服务立法未涵盖}的加密资产与服务建立统一规则。欧盟委员会概述与立法时间线见:\url{https://finance.ec.europa.eu/digital-finance/crypto-assets_en};全文见 EUR-Lex:\url{https://eur-lex.europa.eu/legal-content/EN/ALL/?uri=CELEX:32023R1114}。 - -监管逻辑上,MiCA 对\textbf{资产参考代币(ART)}与\textbf{电子货币代币(EMT)}类稳定币发行人设定更严格的授权、储备、赎回与治理义务;对\textbf{其他加密资产}的发行与营销设定信息披露与白皮书制度;对\textbf{加密资产服务提供商(CASP)}(交易、托管、撮合、顾问等)设定许可与运营要求,并由 ESMA 与各国主管机关协调监督。MiCA 与支付服务、反洗钱(AML)及\textbf{DORA}(数字运营韧性)等规则在机构层面交叉——持牌金融机构参与链上业务时,常需同时满足多条欧盟立法。 - -\section{美国:证券与商品的「双头监管」叙事} - -在美国,同一数字资产是否构成\textbf{证券}(归 SEC 管辖的投资合同分析,常引用 \textbf{Howey} 判例标准:金钱投资、共同事业、对他人努力的合理期待利润)与是否属于\textbf{商品}(CFTC 对特定虚拟货币的界定与衍生品监管)长期存在事实与法律争议。\textbf{现货}加密交易平台、经纪与托管是否需注册为经纪交易商、交易所或适用州级\textbf{货币传输(money transmission)}许可,取决于具体商业模式与资产分类。近年立法与执法动向频繁(包括稳定币专项立法讨论、ETF 批准条件、执法和解与规则提案),本书无法逐条固化;读者应订阅 SEC、CFTC、FinCEN、OCC、美联储与州监管机构更新,并由美国证券律师出具产品备忘录。 - -\section{稳定币与支付稳定币:政策焦点} - -稳定币连接\textbf{链上 DeFi}与\textbf{链下法币体系},政策关切集中在:储备资产质量与透明度、赎回压力下的流动性、发行人破产时持有人顺位、系统性重要性(多链与多应用共用同一稳定币)、以及 AML/制裁合规。欧盟 MiCA 对 ART/EMT 的强化规则即体现该思路。美国层面是否存在联邦统一框架及与州法的优先关系,以\textbf{当时已签署生效的联邦法与实施细则}为准——设计产品者须做「双轨」合规评估而非依赖单一博客解读。 - -\section{FATF 与「旅行规则」} - -金融行动特别工作组(FATF)对虚拟资产服务提供商(VASP)提出与银行类似的\textbf{AML/CFT} 期望,包括\textbf{旅行规则(Travel Rule)}:在转账超过阈值时交换并记录发起方与受益方信息。各国转化程度不同,但机构级托管、交易所与链上分析工具已广泛部署交易监控与地址标注。DeFi 无许可接口与自托管钱包使\textbf{合规边界}模糊,成为国际讨论中的难点。 - -\section{亚太摘录} - -\textbf{香港:}虚拟资产交易平台(VATP)等事项由证监会(SFC)等机关规管;规则与持牌名单以官网为准:\url{https://www.sfc.hk/en/Rules-and-standards/Virtual-assets/Virtual-asset-trading-platforms-operators}。实务上常同时涉及证券型代币与非证券型代币业务线条,申请与持续合规成本较高。 - -\textbf{新加坡:}支付型数字代币服务可能落入\textbf{PSA} 下牌照与豁免框架;证券型代币仍适用《证券期货法》。MAS 对零售加密营销与稳定币监管持续收紧,须查阅现行指南。 - -\textbf{中国大陆:}对虚拟货币交易炒作、代币发行融资等采取严格限制立场;境内机构与个人参与境外平台与代币发行仍可能涉及多重法律风险。本书读者若以人民币区为主要基地,须单独取得境内律师书面意见。 - -\section{DeFi、DAO 与「无许可」执法难题} - -协议可匿名部署,治理代币可全球分发,物理运营团队可分散司法辖区——监管机构可能选择\textbf{对可识别主体}(前端运营者、核心开发者、营销方、稳定币发行人、托管入口)执法,或通过\textbf{制裁与域名/基础设施封锁}施加压力。产品设计若假设「链上无监管」,常与\textbf{入口合规}(法币出入金、应用商店、API 供应商)冲突。 - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[font=\scriptsize] - \node[ellipse, draw=blue!70, fill=blue!5, minimum width=3.6cm, minimum height=2.2cm, align=center] (eu) {\textbf{欧盟}\\MiCA/CASP\\ART/EMT}; - \node[ellipse, draw=teal!70, fill=teal!5, minimum width=3.6cm, minimum height=2.2cm, align=center, right=1.8cm of eu] (us) {\textbf{美国}\\SEC/CFTC\\州法/FinCEN}; - \path (eu) -- node[coordinate, midway] (midewus) {} (us); - \node[ellipse, draw=orange!70, fill=orange!5, minimum width=3.6cm, minimum height=2.2cm, align=center, below=1.1cm of midewus] (ap) {\textbf{亚太}\\MAS/SFC 等\\VASP/PSA}; - \draw[compliance arrow, dashed] (eu) -- (us); - \draw[compliance arrow, dashed] (eu.south) -- (ap.north west); - \draw[compliance arrow, dashed] (us.south) -- (ap.north east); - \node[below=0.15cm of ap, text width=8.5cm, align=center, text=gray!55!black] - {跨境业务常触发\textbf{多法域并行适用};代币「标签」不改变经济实质认定。}; -\end{tikzpicture} -\caption{监管地理示意(高度简化;非穷举)} -\label{fig:reg-geo-web3} -\end{figure} - -\section{与私募、资管业务的接口} - -若基金或管理人计划:配置加密现货/衍生品、投资代币化基金份额、运行节点或质押策略、或向 LP 提供链上收益产品,须在 LPA 与侧信中披露\textbf{策略边界与风险},并完成本书合规篇所述\textbf{管理人资格与产品注册/备案}在加密场景下的增量论证。代币化证券若属于「证券」,通常须遵循传统证券发行与交易平台规则,而非仅依赖「链上自治」叙事。 diff --git a/pe-zero-to-one/chapter/ch25.tex b/pe-zero-to-one/chapter/ch25.tex deleted file mode 100644 index 70605f7..0000000 --- a/pe-zero-to-one/chapter/ch25.tex +++ /dev/null @@ -1,58 +0,0 @@ -\chapter{加密金融市场:价格形成、机构参与与 RWA} - -\section{现货、衍生品与价格发现} - -加密市场\textbf{7×24}交易,现货价格由中心化交易所(CEX)订单簿与链上 DEX 共同发现;二者常存在\textbf{基差}与延迟套利空间。\textbf{永续合约}通过资金费率(funding)平衡多空,使价格锚定指数;极端行情下可能出现插针、清算瀑布与交易所风控停机。\textbf{期权与结构化产品}在机构参与度上升后逐步深化,但流动性仍集中于少数标的。量化策略须将\textbf{提币限制、API 限速、合约乘数、标记价格与指数成分}纳入与传统市场不同的回测假设。 - -\section{ETF、托管与主经纪} - -部分司法辖区已批准与现货或期货挂钩的\textbf{上市基金产品},使传统经纪账户可获得敞口,但底层持有结构、申赎机制与税务处理与直接持币不同。\textbf{机构托管}分冷/温/热存储与保险安排;托管证明与链上储备证明(PoR)成为透明度竞争点。\textbf{主经纪/场外借贷}市场连接对冲基金与做市商,信用与抵押品估值(haircut)在波动期快速重定价——与 2008 年回购市场类似的\textbf{流动性螺旋}在加密周期中已多次出现。 - -\section{与宏观风险资产的相关性} - -比特币等曾被叙事为「宏观独立」;实证上在部分阶段与\textbf{纳斯达克、流动性预期、美元实际利率}呈现阶段性正相关,在危机时刻亦可能同步下跌。稳定币市值与链上活动可作为\textbf{风险偏好与杠杆载体}的代理变量之一,但因果解读需谨慎。资产配置模型若引入加密,应明确\textbf{再平衡频率、最大回撤约束与杠杆上限}。 - -\section{链上数据与科学} - -公开账本带来\textbf{链上分析}(地址聚类、交易所流入流出、矿工行为、质押队列、MEV 占比)新维度;与传统订单流结合可构建因子。挑战包括:地址标签噪声、混币与跨链剥离、以及重组与预言机异常。研究型团队常自建节点与延迟优化基础设施,成本与运维纳入管理费模型。 - -\section{稳定币在支付与链上金融中的角色} - -稳定币在跨境汇款、新兴市场美元化工具、以及 DeFi 抵押与交易对中占据核心位置;其\textbf{利率传导}与\textbf{链下货币市场}(美债、回购)通过储备资产相连。监管对储备与赎回的要求将改变发行方盈利模式与 DeFi 可组合性——策略团队须跟踪主要稳定币的\textbf{储备披露与黑名单冻结能力}(合规需求与去中心化叙事的张力)。 - -\section{代币化现实世界资产(RWA)} - -债券、货币基金、房地产与私人信贷等\textbf{上链}可缩短结算周期、扩大分销半径,但法律上须明确:代币持有人权利是\textbf{直接所有权}还是\textbf{信托/ SPV 份额},破产隔离如何实现,以及信息披露适用证券法抑或另类框架。机构试点常与\textbf{许可链 + 持牌托管 + 白名单投资者}组合,与公链无许可 DeFi 的融合度因法域而异。 - -\section{风险管理清单(机构视角)} - -\begin{itemize} - \item \textbf{对手方:}交易所、托管方、稳定币发行人、借贷对手、桥与预言机——集中度与信用限额。 - \item \textbf{操作:}私钥流程、链上多签、内部作恶、钓鱼与供应链攻击。 - \item \textbf{市场:}波动、流动性枯竭、负费率极端、稳定币脱锚。 - \item \textbf{合规:}制裁名单、旅行规则、税务申报、跨境营销限制。 - \item \textbf{模型:}回测过拟合、链上结构突变(协议升级、硬分叉、参数治理投票)。 -\end{itemize} - -\begin{figure}[htbp] -\centering -\begin{tikzpicture}[font=\footnotesize] - \node[reg node=blue] (spot) {现货 CEX/DEX}; - \node[reg node=teal, right=1.2cm of spot] (der) {衍生品\\永续/期权}; - \node[reg node=violet, right=1.2cm of der] (cust) {托管/ETF\\PoR/保险}; - \path (spot) -- node[coordinate, midway] (midspotder) {} (der); - \node[reg node=orange, below=1.1cm of midspotder] (defi) {链上 DeFi\\借贷/AMM}; - \node[reg node=purple, below=1.1cm of cust] (rwa) {RWA/代币化}; - \draw[compliance arrow] (spot) -- (der); - \draw[compliance arrow] (der) -- (cust); - \draw[compliance arrow] (spot.south) -- ++(0,-0.35) -| (defi.north); - \draw[compliance arrow] (cust.south) -- ++(0,-0.35) -| (rwa.north); - \draw[dashed, gray!50] (defi.east) -- (rwa.west); -\end{tikzpicture} -\caption{加密金融市场主要模块与资金流联系(示意)} -\label{fig:crypto-mkt-map} -\end{figure} - -\section{小结} - -Web3 同时是\textbf{技术运动、监管对象与资本市场板块}:技术层决定攻击面与可组合性,政策层决定准入与营销边界,市场层决定流动性与风险溢价。本书合规篇的传统私募规则在「代币化募资、链上管理账户、跨境稳定币」等场景下均需\textbf{增量分析};建议在基金 PPM 与 DDQ 中单独设置\textbf{数字资产附录},并在冷启动触达材料中避免与技术白皮书相矛盾的收益承诺。 diff --git a/pe-zero-to-one/macros/tikz-compliance.tex b/pe-zero-to-one/macros/tikz-compliance.tex deleted file mode 100644 index 1286ac0..0000000 --- a/pe-zero-to-one/macros/tikz-compliance.tex +++ /dev/null @@ -1,41 +0,0 @@ -% TikZ 样式与颜色 — 合规章节共用 -\tikzset{ - compliance/.style args={#1}{ - rounded corners=10pt, - draw=#1!70!black, - thick, - fill=#1!12, - align=center, - inner sep=10pt, - font=\small, - drop shadow={shadow xshift=1.2pt, shadow yshift=-1.2pt, fill=black!20}, - }, - compliance arrow/.style={ - -{Stealth[length=3mm]}, - thick, - draw=gray!70, - }, - reg node/.style args={#1}{ - rectangle, - rounded corners=6pt, - minimum width=2.8cm, - minimum height=1cm, - align=center, - draw=#1!65!black, - fill=#1!8, - font=\footnotesize, - }, - fancy ring/.style args={#1}{ - circle, - draw=#1, - line width=1.6pt, - inner sep=6pt, - align=center, - font=\scriptsize\bfseries, - }, -} - -\newcommand{\ComplianceColorCHN}{red} -\newcommand{\ComplianceColorIND}{orange} -\newcommand{\ComplianceColorEMEA}{blue} -\newcommand{\ComplianceColorAMER}{teal} diff --git a/pe-zero-to-one/main.tex b/pe-zero-to-one/main.tex deleted file mode 100644 index b51614d..0000000 --- a/pe-zero-to-one/main.tex +++ /dev/null @@ -1,80 +0,0 @@ -% 私募:从零到一 — 主文件(分章见 chapter/) -% 编译:XeLaTeX 或 LuaLaTeX(需 ctex、tikz、hyperref) -\documentclass[UTF8,openany]{ctexbook} - -\usepackage{geometry} -\geometry{a4paper, margin=2.4cm} - -\usepackage{xcolor} -\usepackage{hyperref} -\hypersetup{ - colorlinks=true, - linkcolor=teal!60!black, - urlcolor=blue!60!black, - citecolor=gray!60!black, -} - -\usepackage{tikz} -\usetikzlibrary{ - arrows.meta, - positioning, - shapes.geometric, - calc, - backgrounds, - fit, - shadows, - decorations.pathmorphing, -} - -\input{macros/tikz-compliance} - -\title{私募:从零到一} -\author{} -\date{\today} - -\begin{document} - -\frontmatter -\maketitle -\tableofcontents - -\mainmatter - -\include{chapter/ch01} -\include{chapter/ch02} -\include{chapter/ch03} -\include{chapter/ch04} -\include{chapter/ch05} -\include{chapter/ch06} -\include{chapter/ch07} -\include{chapter/ch08} -\include{chapter/ch09} -\include{chapter/ch10} -\include{chapter/ch11} -\include{chapter/ch12} -\include{chapter/ch13} -\include{chapter/ch14} -\include{chapter/ch15} - -\part{冷启动、团队与触达} - -\include{chapter/ch16} - -\part{合规与全球展业} - -\include{chapter/ch17} -\include{chapter/ch18} -\include{chapter/ch19} -\include{chapter/ch20} -\include{chapter/ch21} -\include{chapter/ch22} - -\part{Web3 与加密金融市场} - -\include{chapter/ch23} -\include{chapter/ch24} -\include{chapter/ch25} - -\backmatter - -\end{document} diff --git a/polymarket/.env.example b/polymarket/.env.example new file mode 100644 index 0000000..545370c --- /dev/null +++ b/polymarket/.env.example @@ -0,0 +1,3 @@ +# Copy to .env (never commit .env) +POLYMARKET_PRIVATE_KEY= +POLYMARKET_FUNDER_ADDRESS= diff --git a/scripts/prepare_public_upload.py b/scripts/prepare_public_upload.py new file mode 100644 index 0000000..8349c09 --- /dev/null +++ b/scripts/prepare_public_upload.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Pre-upload checks: scan for secrets and list ignored artifact types.""" +from __future__ import annotations + +import re +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] + +PATTERNS = [ + (r"C:\\Users\\[^\\<]+", "Windows user path"), + (r"/Users/[^/\s]+", "macOS user path"), + (r"D0E8209F[A-F0-9]{24}", "MT5 terminal data hash"), + (r"ReportTester-\d{6,}\.html", "MT5 account id in report name"), + (r"(?i)(api[_-]?key|private[_-]?key|password)\s*=\s*\S+", "credential assignment"), + (r"(?i)POLYMARKET_PRIVATE_KEY=\S+", "Polymarket private key"), +] + +SKIP_DIRS = {".git", ".venv", "venv", "node_modules", "__pycache__"} +SKIP_SUFFIXES = {".pdf", ".png", ".jpg", ".jpeg", ".ex5", ".onnx", ".pkl", ".htm", ".html", ".log"} +SKIP_PATH_PARTS = ( + "cluster_audit/reports/", + "optimization_results/", + "lab/EAs/SimpleEMA/best_run/", +) +SKIP_FILES = { + "SECURITY.md", + "CONTRIBUTING.md", + ".env.example", + "polymarket/.env.example", + "polymarket/README.md", + "scripts/prepare_public_upload.py", +} + + +def iter_files() -> list[Path]: + out: list[Path] = [] + for path in ROOT.rglob("*"): + if not path.is_file(): + continue + if any(part in SKIP_DIRS for part in path.parts): + continue + rel = path.relative_to(ROOT).as_posix() + if rel in SKIP_FILES: + continue + if any(part in rel for part in SKIP_PATH_PARTS): + continue + if path.suffix.lower() in SKIP_SUFFIXES: + continue + out.append(path) + return out + + +def scan() -> list[str]: + hits: list[str] = [] + for path in iter_files(): + try: + text = path.read_text(encoding="utf-8", errors="ignore") + except OSError: + continue + rel = path.relative_to(ROOT) + for pat, label in PATTERNS: + for m in re.finditer(pat, text): + hits.append(f"{rel}: {label} → {m.group(0)[:80]}") + return hits + + +def git_ignored(path: Path) -> bool: + r = subprocess.run( + ["git", "check-ignore", "-q", str(path)], + cwd=ROOT, + capture_output=True, + ) + return r.returncode == 0 + + +def main() -> int: + print("=== Sensitive-data scan ===") + hits = scan() + if hits: + print("FAIL — possible secrets (fix before upload):") + for h in hits[:40]: + print(" ", h) + if len(hits) > 40: + print(f" ... and {len(hits) - 40} more") + return 1 + print("OK — no known secret patterns in text sources.") + + print("\n=== Tracked files that should be gitignored ===") + tracked_bad: list[str] = [] + r = subprocess.run( + ["git", "ls-files", "-z"], + cwd=ROOT, + capture_output=True, + check=True, + ) + for raw in r.stdout.split(b"\0"): + if not raw: + continue + p = ROOT / raw.decode("utf-8", errors="replace") + if p.suffix.lower() in {".pdf", ".png", ".jpg", ".jpeg"} or p.name == "mt5_results.json": + if git_ignored(p) or p.suffix.lower() in {".pdf", ".png", ".jpg", ".jpeg"}: + tracked_bad.append(str(p.relative_to(ROOT))) + + if tracked_bad: + print("Remove from git index (files stay on disk):") + for t in tracked_bad[:30]: + print(" ", t) + print("\n git rm -r --cached ") + return 2 + print("OK — no PDF/image/mt5_results.json tracked.") + + print("\nReady to push source-only repo.") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/self-coding-agent/__pycache__/main.cpython-312.pyc b/self-coding-agent/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 25092de..0000000 Binary files a/self-coding-agent/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/self-coding-agent/agent/__pycache__/__init__.cpython-312.pyc b/self-coding-agent/agent/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 08daaf7..0000000 Binary files a/self-coding-agent/agent/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/self-coding-agent/agent/__pycache__/config.cpython-312.pyc b/self-coding-agent/agent/__pycache__/config.cpython-312.pyc deleted file mode 100644 index 4ab3e92..0000000 Binary files a/self-coding-agent/agent/__pycache__/config.cpython-312.pyc and /dev/null differ diff --git a/self-coding-agent/agent/__pycache__/loop.cpython-312.pyc b/self-coding-agent/agent/__pycache__/loop.cpython-312.pyc deleted file mode 100644 index ac22562..0000000 Binary files a/self-coding-agent/agent/__pycache__/loop.cpython-312.pyc and /dev/null differ diff --git a/self-coding-agent/agent/__pycache__/memory.cpython-312.pyc b/self-coding-agent/agent/__pycache__/memory.cpython-312.pyc deleted file mode 100644 index 6abba61..0000000 Binary files a/self-coding-agent/agent/__pycache__/memory.cpython-312.pyc and /dev/null differ diff --git a/self-coding-agent/agent/__pycache__/ollama_client.cpython-312.pyc b/self-coding-agent/agent/__pycache__/ollama_client.cpython-312.pyc deleted file mode 100644 index 748735b..0000000 Binary files a/self-coding-agent/agent/__pycache__/ollama_client.cpython-312.pyc and /dev/null differ diff --git a/self-coding-agent/agent/__pycache__/tools.cpython-312.pyc b/self-coding-agent/agent/__pycache__/tools.cpython-312.pyc deleted file mode 100644 index 33654ec..0000000 Binary files a/self-coding-agent/agent/__pycache__/tools.cpython-312.pyc and /dev/null differ diff --git a/self-coding-agent/tests/__pycache__/test_smoke.cpython-312.pyc b/self-coding-agent/tests/__pycache__/test_smoke.cpython-312.pyc deleted file mode 100644 index 35dc464..0000000 Binary files a/self-coding-agent/tests/__pycache__/test_smoke.cpython-312.pyc and /dev/null differ diff --git a/strategy-tester/README.md b/strategy-tester/README.md new file mode 100644 index 0000000..e4a0628 --- /dev/null +++ b/strategy-tester/README.md @@ -0,0 +1,63 @@ +# Factor Strategy Tester (MT5-style workflow) + +Python app scaffold that mirrors the **MT5 Strategy Tester flow** for **factor investing**: + +- Single run backtest +- Parameter optimization (grid search) +- Inputs panel + report panel +- Custom factor expressions with safe operators +- Pluggable strategy engines + +## Quick start + +```bash +cd strategy-tester +python -m venv .venv +.venv\Scripts\activate +pip install -r requirements.txt +streamlit run app.py +``` + +## Current capabilities + +- Upload CSV with at least: + - `date` + - `asset` + - `close` + - feature columns (e.g. `pe`, `momentum_12m`, `quality`) +- Define factor score expression, e.g.: + - `(z(momentum_12m) + z(quality) - z(volatility_20d)) / 3` +- Rebalance by period and choose top/bottom quantiles +- Long-only or long-short portfolio simulation +- Optimize selected parameters and rank by Sharpe/Return/Drawdown + +## Expression language + +Supported: + +- Arithmetic: `+ - * / **` +- Comparisons: `> >= < <= == !=` +- Boolean: `and or not` +- Parentheses +- Functions: + - `abs(x)`, `log(x)`, `sqrt(x)` + - `z(x)` (cross-sectional z-score per date) + - `rank(x)` (cross-sectional percentile rank per date) + - `clip(x, lo, hi)` + +The parser is AST-validated (no raw `eval`). + +## Architecture + +- `factor_tester/expressions.py`: safe expression compiler/evaluator +- `factor_tester/engine.py`: backtest engine API + default cross-sectional factor engine +- `factor_tester/optimize.py`: optimization runner +- `factor_tester/data.py`: CSV loading and validation +- `app.py`: Streamlit UI + +## Next steps + +- Walk-forward optimization +- Transaction costs/slippage model +- Multi-factor blend templates (value/size/momentum/quality/low-vol) +- Job queue / parallel optimization workers diff --git a/strategy-tester/app.py b/strategy-tester/app.py new file mode 100644 index 0000000..403e8c1 --- /dev/null +++ b/strategy-tester/app.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import pandas as pd +import streamlit as st + +from factor_tester.data import load_prices_csv +from factor_tester.engine import EngineConfig, run_factor_engine, summary_metrics +from factor_tester.optimize import optimize_grid + +st.set_page_config(page_title="Factor Strategy Tester", layout="wide") +st.title("Factor Strategy Tester") +st.caption("MT5-style workflow for factor investing with custom expressions") + +with st.sidebar: + st.header("Inputs") + uploaded = st.file_uploader("Upload prices/factors CSV", type=["csv"]) + expr = st.text_area( + "Factor expression", + value="(z(momentum_12m) + z(quality) - z(volatility_20d)) / 3", + height=110, + ) + freq = st.selectbox("Rebalance", ["D", "W", "M", "Q"], index=2) + long_q = st.slider("Long quantile", 0.05, 0.50, 0.20, 0.05) + long_short = st.checkbox("Long-short", value=True) + short_q = st.slider("Short quantile", 0.05, 0.50, 0.20, 0.05, disabled=not long_short) + run_btn = st.button("Run Single Test", type="primary", use_container_width=True) + + st.divider() + st.subheader("Optimization") + freq_grid = st.multiselect("Freq grid", ["D", "W", "M", "Q"], default=["W", "M"]) + long_grid = st.text_input("Long quantiles", value="0.1,0.2,0.3") + short_grid = st.text_input("Short quantiles", value="0.1,0.2") + ls_grid = st.multiselect("Long-short options", [True, False], default=[True]) + opt_btn = st.button("Run Optimization", use_container_width=True) + +if uploaded is None: + st.info("Upload a CSV to start. Required columns: `date`, `asset`, `close` + factor columns.") + st.stop() + +try: + df = load_prices_csv(uploaded) +except Exception as e: + st.error(f"Failed to load CSV: {e}") + st.stop() + +st.write("### Data Preview") +st.dataframe(df.head(20), use_container_width=True) + +col1, col2, col3, col4 = st.columns(4) + +if run_btn: + try: + cfg = EngineConfig( + factor_expression=expr, + rebalance_frequency=freq, + long_quantile=float(long_q), + short_quantile=float(short_q if long_short else 0.0), + long_short=bool(long_short), + ) + curve, detail = run_factor_engine(df, cfg) + m = summary_metrics(curve) + + col1.metric("CAGR", f"{m['cagr']:.2%}") + col2.metric("Sharpe", f"{m['sharpe']:.2f}") + col3.metric("Max Drawdown", f"{m['max_dd']:.2%}") + col4.metric("Total Return", f"{m['total_return']:.2%}") + + st.write("### Equity Curve") + st.line_chart(curve.set_index("date")["equity"]) + + st.write("### Daily Returns") + st.line_chart(curve.set_index("date")["portfolio_ret"]) + + st.write("### Engine Detail (tail)") + st.dataframe(detail.tail(50), use_container_width=True) + except Exception as e: + st.error(f"Backtest failed: {e}") + +if opt_btn: + try: + lq = [float(x.strip()) for x in long_grid.split(",") if x.strip()] + sq = [float(x.strip()) for x in short_grid.split(",") if x.strip()] + results = optimize_grid( + df=df, + factor_expression=expr, + freqs=freq_grid or ["M"], + long_qs=lq or [0.2], + short_qs=sq or [0.2], + long_short_options=ls_grid or [True], + ) + st.write("### Optimization Results") + st.dataframe(results, use_container_width=True) + except Exception as e: + st.error(f"Optimization failed: {e}") + diff --git a/strategy-tester/factor_tester/__init__.py b/strategy-tester/factor_tester/__init__.py new file mode 100644 index 0000000..bda5626 --- /dev/null +++ b/strategy-tester/factor_tester/__init__.py @@ -0,0 +1,2 @@ +"""Factor tester package.""" + diff --git a/strategy-tester/factor_tester/data.py b/strategy-tester/factor_tester/data.py new file mode 100644 index 0000000..6396942 --- /dev/null +++ b/strategy-tester/factor_tester/data.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +import pandas as pd + + +REQUIRED_COLUMNS = {"date", "asset", "close"} + + +def load_prices_csv(file) -> pd.DataFrame: + df = pd.read_csv(file) + missing = REQUIRED_COLUMNS - set(df.columns) + if missing: + raise ValueError(f"Missing required columns: {sorted(missing)}") + + df["date"] = pd.to_datetime(df["date"]) + df = df.sort_values(["date", "asset"]).reset_index(drop=True) + return df + diff --git a/strategy-tester/factor_tester/engine.py b/strategy-tester/factor_tester/engine.py new file mode 100644 index 0000000..3cf3179 --- /dev/null +++ b/strategy-tester/factor_tester/engine.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +from dataclasses import dataclass + +import numpy as np +import pandas as pd + +from .expressions import compile_expression + + +@dataclass +class EngineConfig: + factor_expression: str + rebalance_frequency: str = "M" # D/W/M/Q + long_quantile: float = 0.2 + short_quantile: float = 0.2 + long_short: bool = True + + +def run_factor_engine(df: pd.DataFrame, cfg: EngineConfig) -> tuple[pd.DataFrame, pd.DataFrame]: + data = df.copy() + data = data.sort_values(["date", "asset"]).reset_index(drop=True) + data["ret_1d"] = data.groupby("asset")["close"].pct_change().fillna(0.0) + + expr = compile_expression(cfg.factor_expression) + data["score"] = expr.eval(data).replace([np.inf, -np.inf], np.nan) + + rebalance_key = data["date"].dt.to_period(cfg.rebalance_frequency).astype(str) + data["rebalance_key"] = rebalance_key + + weights = [] + for _, bucket in data.groupby("rebalance_key"): + last_day = bucket["date"].max() + snap = bucket[bucket["date"] == last_day].copy() + snap = snap.dropna(subset=["score"]) + if snap.empty: + continue + + q_long = snap["score"].quantile(1.0 - cfg.long_quantile) + longs = snap[snap["score"] >= q_long][["asset"]].copy() + longs["w"] = 1.0 / max(len(longs), 1) + + if cfg.long_short and cfg.short_quantile > 0: + q_short = snap["score"].quantile(cfg.short_quantile) + shorts = snap[snap["score"] <= q_short][["asset"]].copy() + shorts["w"] = -1.0 / max(len(shorts), 1) + snap_w = pd.concat([longs, shorts], ignore_index=True) + else: + snap_w = longs + + snap_w["effective_date"] = last_day + weights.append(snap_w) + + if not weights: + empty = pd.DataFrame(columns=["date", "portfolio_ret", "equity"]) + return empty, data + + wdf = pd.concat(weights, ignore_index=True) + data = data.merge(wdf, how="left", left_on=["date", "asset"], right_on=["effective_date", "asset"]) + data["w"] = data.groupby("asset")["w"].ffill().fillna(0.0) + data["contrib"] = data["w"] * data["ret_1d"] + + daily = data.groupby("date", as_index=False)["contrib"].sum().rename(columns={"contrib": "portfolio_ret"}) + daily["equity"] = (1.0 + daily["portfolio_ret"]).cumprod() + return daily, data + + +def summary_metrics(equity_curve: pd.DataFrame) -> dict: + if equity_curve.empty: + return {"cagr": 0.0, "sharpe": 0.0, "max_dd": 0.0, "total_return": 0.0} + + rets = equity_curve["portfolio_ret"] + total_return = equity_curve["equity"].iloc[-1] - 1.0 + + n = len(rets) + ann = 252 + cagr = (equity_curve["equity"].iloc[-1] ** (ann / max(n, 1))) - 1.0 + vol = rets.std(ddof=0) * np.sqrt(ann) + sharpe = (rets.mean() * ann) / vol if vol > 1e-12 else 0.0 + + rolling_max = equity_curve["equity"].cummax() + dd = equity_curve["equity"] / rolling_max - 1.0 + max_dd = dd.min() + + return { + "cagr": float(cagr), + "sharpe": float(sharpe), + "max_dd": float(max_dd), + "total_return": float(total_return), + } + diff --git a/strategy-tester/factor_tester/expressions.py b/strategy-tester/factor_tester/expressions.py new file mode 100644 index 0000000..62bd321 --- /dev/null +++ b/strategy-tester/factor_tester/expressions.py @@ -0,0 +1,160 @@ +from __future__ import annotations + +import ast +from dataclasses import dataclass +from typing import Callable + +import numpy as np +import pandas as pd + + +ALLOWED_BINOPS = (ast.Add, ast.Sub, ast.Mult, ast.Div, ast.Pow) +ALLOWED_UNARY = (ast.UAdd, ast.USub, ast.Not) +ALLOWED_BOOLOPS = (ast.And, ast.Or) +ALLOWED_CMPOPS = (ast.Gt, ast.GtE, ast.Lt, ast.LtE, ast.Eq, ast.NotEq) +ALLOWED_FUNCS = {"abs", "log", "sqrt", "z", "rank", "clip"} + + +@dataclass +class CompiledExpression: + raw: str + tree: ast.AST + + def eval(self, df: pd.DataFrame) -> pd.Series: + return _eval_node(self.tree, df) + + +def compile_expression(expr: str) -> CompiledExpression: + tree = ast.parse(expr, mode="eval") + _validate(tree) + return CompiledExpression(raw=expr, tree=tree.body) + + +def _validate(node: ast.AST) -> None: + if isinstance(node, ast.Expression): + _validate(node.body) + return + if isinstance(node, ast.Constant): + return + if isinstance(node, ast.Name): + return + if isinstance(node, ast.BinOp): + if not isinstance(node.op, ALLOWED_BINOPS): + raise ValueError("Operator not allowed") + _validate(node.left) + _validate(node.right) + return + if isinstance(node, ast.UnaryOp): + if not isinstance(node.op, ALLOWED_UNARY): + raise ValueError("Unary operator not allowed") + _validate(node.operand) + return + if isinstance(node, ast.BoolOp): + if not isinstance(node.op, ALLOWED_BOOLOPS): + raise ValueError("Boolean op not allowed") + for v in node.values: + _validate(v) + return + if isinstance(node, ast.Compare): + _validate(node.left) + for op in node.ops: + if not isinstance(op, ALLOWED_CMPOPS): + raise ValueError("Comparison op not allowed") + for c in node.comparators: + _validate(c) + return + if isinstance(node, ast.Call): + if not isinstance(node.func, ast.Name) or node.func.id not in ALLOWED_FUNCS: + raise ValueError("Function not allowed") + for a in node.args: + _validate(a) + return + raise ValueError(f"Unsupported expression node: {type(node).__name__}") + + +def _as_series(x, df: pd.DataFrame) -> pd.Series: + if isinstance(x, pd.Series): + return x + return pd.Series(x, index=df.index, dtype="float64") + + +def _zscore_cross(x: pd.Series, df: pd.DataFrame) -> pd.Series: + grouped = x.groupby(df["date"]) + return grouped.transform(lambda s: (s - s.mean()) / (s.std(ddof=0) + 1e-12)) + + +def _rank_cross(x: pd.Series, df: pd.DataFrame) -> pd.Series: + return x.groupby(df["date"]).rank(pct=True) + + +def _eval_node(node: ast.AST, df: pd.DataFrame): + if isinstance(node, ast.Constant): + return node.value + if isinstance(node, ast.Name): + if node.id not in df.columns: + raise ValueError(f"Unknown column: {node.id}") + return df[node.id] + if isinstance(node, ast.BinOp): + l = _as_series(_eval_node(node.left, df), df) + r = _as_series(_eval_node(node.right, df), df) + if isinstance(node.op, ast.Add): + return l + r + if isinstance(node.op, ast.Sub): + return l - r + if isinstance(node.op, ast.Mult): + return l * r + if isinstance(node.op, ast.Div): + return l / (r.replace(0, np.nan)) + if isinstance(node.op, ast.Pow): + return l**r + if isinstance(node, ast.UnaryOp): + x = _as_series(_eval_node(node.operand, df), df) + if isinstance(node.op, ast.UAdd): + return x + if isinstance(node.op, ast.USub): + return -x + if isinstance(node.op, ast.Not): + return ~x.astype(bool) + if isinstance(node, ast.BoolOp): + vals = [_as_series(_eval_node(v, df), df).astype(bool) for v in node.values] + out = vals[0] + for v in vals[1:]: + out = out & v if isinstance(node.op, ast.And) else out | v + return out + if isinstance(node, ast.Compare): + left = _as_series(_eval_node(node.left, df), df) + out = pd.Series(True, index=df.index) + current = left + for op, comp in zip(node.ops, node.comparators): + right = _as_series(_eval_node(comp, df), df) + if isinstance(op, ast.Gt): + out &= current > right + elif isinstance(op, ast.GtE): + out &= current >= right + elif isinstance(op, ast.Lt): + out &= current < right + elif isinstance(op, ast.LtE): + out &= current <= right + elif isinstance(op, ast.Eq): + out &= current == right + elif isinstance(op, ast.NotEq): + out &= current != right + current = right + return out + if isinstance(node, ast.Call): + fn = node.func.id + args = [_as_series(_eval_node(a, df), df) for a in node.args] + if fn == "abs": + return args[0].abs() + if fn == "log": + return np.log(args[0].replace(0, np.nan)) + if fn == "sqrt": + return np.sqrt(args[0].clip(lower=0)) + if fn == "z": + return _zscore_cross(args[0], df) + if fn == "rank": + return _rank_cross(args[0], df) + if fn == "clip": + return args[0].clip(lower=float(args[1].iloc[0]), upper=float(args[2].iloc[0])) + raise ValueError("Expression evaluation failed") + diff --git a/strategy-tester/factor_tester/optimize.py b/strategy-tester/factor_tester/optimize.py new file mode 100644 index 0000000..8874788 --- /dev/null +++ b/strategy-tester/factor_tester/optimize.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from itertools import product + +import pandas as pd + +from .engine import EngineConfig, run_factor_engine, summary_metrics + + +def optimize_grid( + df: pd.DataFrame, + factor_expression: str, + freqs: list[str], + long_qs: list[float], + short_qs: list[float], + long_short_options: list[bool], +) -> pd.DataFrame: + rows = [] + for freq, lq, sq, ls in product(freqs, long_qs, short_qs, long_short_options): + cfg = EngineConfig( + factor_expression=factor_expression, + rebalance_frequency=freq, + long_quantile=lq, + short_quantile=sq, + long_short=ls, + ) + curve, _ = run_factor_engine(df, cfg) + m = summary_metrics(curve) + rows.append( + { + "rebalance_frequency": freq, + "long_quantile": lq, + "short_quantile": sq, + "long_short": ls, + **m, + } + ) + out = pd.DataFrame(rows) + if out.empty: + return out + return out.sort_values(["sharpe", "cagr"], ascending=[False, False]).reset_index(drop=True) + diff --git a/strategy-tester/requirements.txt b/strategy-tester/requirements.txt new file mode 100644 index 0000000..6fe0514 --- /dev/null +++ b/strategy-tester/requirements.txt @@ -0,0 +1,3 @@ +streamlit +pandas +numpy