<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forex Software — 8-Phase Automated Validation Pipeline]]></title>
	<link rel="self" href="https://forexsb.com/forum/feed/atom/topic/10046/" />
	<updated>2026-02-16T15:49:46Z</updated>
	<generator>PunBB</generator>
	<id>https://forexsb.com/forum/topic/10046/8phase-automated-validation-pipeline/</id>
		<entry>
			<title type="html"><![CDATA[Re: 8-Phase Automated Validation Pipeline]]></title>
			<link rel="alternate" href="https://forexsb.com/forum/post/83123/#p83123" />
			<content type="html"><![CDATA[<p>Hani,</p><p>Thank you very much for sharing your experience and code, and for the excellent explanation of your workflow!</p>]]></content>
			<author>
				<name><![CDATA[Popov]]></name>
				<uri>https://forexsb.com/forum/user/2/</uri>
			</author>
			<updated>2026-02-16T15:49:46Z</updated>
			<id>https://forexsb.com/forum/post/83123/#p83123</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: 8-Phase Automated Validation Pipeline]]></title>
			<link rel="alternate" href="https://forexsb.com/forum/post/83122/#p83122" />
			<content type="html"><![CDATA[<p><strong># Live Pipeline Dashboard for Express Generator</strong></p><p>After building the [8-phase validation pipeline], I wanted a way to monitor what&#039;s happening across all instruments without digging through JSON files. So I built a browser-based dashboard that reads the collection folders in real-time and shows everything in one view.</p><p>===============================================</p><p><strong>## What It Does</strong></p><p>The dashboard is a single Node.js file (`dashboard.js`) that runs a local web server on port 3000. It scans your `collections/phase1` through `collections/phase8` folders every 60 seconds and displays:</p><p>- **Pipeline Funnel** — strategy counts per instrument across all 8 phases, with survival rates<br />- **Phase Drop-off** — visual bars showing where strategies get eliminated and the drop percentage at each phase<br />- **Summary Cards** — total generated, total survivors, in-pipeline count, and best Return/Drawdown<br />- **Phase 8 Survivors** — detailed cards for each instrument that made it through all 8 phases, showing average Profit, PF, R², R/DD, Win Rate, Drawdown, Trades, and validation tags (TF2/2, MI5/5)</p><p>It auto-refreshes every 60 seconds with a countdown timer, so you can leave it open in a browser tab while the pipeline runs.</p><p>===============================================</p><p><strong>## Setup</strong></p><p><strong>### File Structure</strong></p><p>Place both files in your `multi_stage_processing` folder (same folder as your pipeline scripts):</p><p>-----------------------<br />express-generator/<br />&nbsp; multi_stage_processing/<br />&nbsp; &nbsp; dashboard.js&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;-- the dashboard<br />&nbsp; &nbsp; dashboard.cmd&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;-- launcher<br />&nbsp; &nbsp; workflow.cmd&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; runner.cmd&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; phase1-generate.ini&nbsp; &nbsp;<br />&nbsp; &nbsp; ...<br />&nbsp; &nbsp; phase8-forward.ini&nbsp; &nbsp; <br />&nbsp; collections/<br />&nbsp; &nbsp; phase1/<br />&nbsp; &nbsp; phase2/<br />&nbsp; &nbsp; ...<br />&nbsp; &nbsp; phase8/<br />-----------------------</p><p><strong>### dashboard.cmd</strong></p><div class="codebox"><pre><code>cmd
@echo off
TITLE Quant-Bot Pipeline Dashboard
cd /d %~dp0
echo Starting dashboard server...
node dashboard.js
PAUSE</code></pre></div><p><strong>### Running It</strong></p><p>1. Double-click `dashboard.cmd`<br />2. Open `http://localhost:3000` in your browser<br />3. Leave it open — it auto-refreshes every 60 seconds</p><p>The console will show:</p><div class="codebox"><pre><code>  +=========================================================+
  |                  QUANT-BOT.COM                           |
  |           Pipeline Dashboard Running                     |
  +=========================================================+

  Open:  http://localhost:3000
  Auto-refreshes every 60s | Press Ctrl+C to stop</code></pre></div><p>===============================================</p><p><strong>## How It Works</strong></p><p>The dashboard reads collection JSON files from each phase folder and counts the strategies inside. It handles both raw EA Studio format (`backtestStats`) and internal format (`stat`). For Phase 8 survivors, it also parses the validation tags from the filename (e.g., `P8_USDJPY_H1_TF2of2_MI5of5.json`) to show how many timeframes and instruments each strategy passed.</p><p>===============================================</p><p><strong>## dashboard.js — Full Code</strong></p><p>The file is about 500 lines (inline HTML/CSS/JS + Node.js server). </p><p>The full `dashboard.js` file is available for download in this thread. Just save it to your `multi_stage_processing` folder and run with `node dashboard.js`.</p><p>===============================================</p><p><strong>## Features</strong></p><p>- **Funnel table** with per-instrument breakdown across all 8 phases<br />- **Survival rate bars** with percentage per instrument<br />- **Drop-off chart** showing exactly where strategies fail<br />- **Phase 8 survivor cards** with full stats and validation tags (TF/MI)<br />- **Summary cards** — total generated, survivors, in-pipeline, best R/DD<br />- **Auto-refresh** every 60 seconds with countdown timer<br />- **Responsive** — works on any screen size<br />- **Zero dependencies** — runs on plain Node.js, no npm install needed</p><p>===============================================</p><p><strong>## Combining with the Pipeline</strong></p><p>The typical workflow is:</p><p>1. Run `runner.cmd` to launch the pipeline across multiple instruments<br />2. Open `dashboard.cmd` in a separate window<br />3. Browse to `http://localhost:3000` and watch strategies flow through the phases<br />4. When the pipeline finishes, the dashboard shows your final survivors with full stats</p><p>It&#039;s been very useful for spotting patterns — for example, I noticed that MC Parameter Sensitivity (Phase 4) was my biggest bottleneck, eliminating 85%+ of strategies. That told me my initial generation criteria might need tightening, or that many strategies were overfitting to specific indicator values.</p><p>===============================================</p><p>Hope this is useful for anyone running multi-phase pipelines. If you&#039;re only using 3-4 phases, you can easily modify the `PHASES` array at the top of the file to match your setup.</p><p>Cheers,<br />Hani</p>]]></content>
			<author>
				<name><![CDATA[quantbot]]></name>
				<uri>https://forexsb.com/forum/user/14524/</uri>
			</author>
			<updated>2026-02-16T14:31:31Z</updated>
			<id>https://forexsb.com/forum/post/83122/#p83122</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: 8-Phase Automated Validation Pipeline]]></title>
			<link rel="alternate" href="https://forexsb.com/forum/post/83121/#p83121" />
			<content type="html"><![CDATA[<p>The remaining files are attached here.</p>]]></content>
			<author>
				<name><![CDATA[quantbot]]></name>
				<uri>https://forexsb.com/forum/user/14524/</uri>
			</author>
			<updated>2026-02-16T11:33:35Z</updated>
			<id>https://forexsb.com/forum/post/83121/#p83121</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: 8-Phase Automated Validation Pipeline]]></title>
			<link rel="alternate" href="https://forexsb.com/forum/post/83120/#p83120" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>footon wrote:</cite><blockquote><p>Great post, thank you for sharing and especially detailing your steps, Hani! </p><p>I have a question: you have your workflow sorted, it is fully automated and reaching the goals you have set so to speak, but why do you still need to know &quot;exactly&quot; why a strat has failed? Does this provide you with further data to refine the process?</p></blockquote></div><p><strong>All workflows may work and generate some good strategies, but I care about the higher percentages, so yes I need to modify, or sometimes drop most of the phases based on what I am building. I don&#039;t generate strategies blindly.&nbsp; </strong></p><div class="quotebox"><cite>footon wrote:</cite><blockquote><p>=Another one: this is about multimarket. You say that you&#039;re using structurally related pairs that share market dynamics, but the first example for EURUSD shows correlation to EURUSD that is all across the board! Average daily correlation for GBPUSD is high, for USDCHF it is high (oppositely moving), for EURGBP there&#039;s no correlation, for EURJPY it is very low, for EURCAD it is low. Have you taken actual correlation into account by choosing the pairings?</p></blockquote></div><p><strong>This step is very basic to my actual operating workflow, and my aim was to show the capabilities of automation specialy in express-generator because I had tough times in the beginning to create this, and wanted to shortcut the road somehow on the new comers, and a direct answer to your question, &quot;NO&quot; I didn&#039;t take the actual correlation, I do this somewhere else <img src="https://forexsb.com/forum/img/smilies/wink.png" width="15" height="15" alt="wink" /></strong></p>]]></content>
			<author>
				<name><![CDATA[quantbot]]></name>
				<uri>https://forexsb.com/forum/user/14524/</uri>
			</author>
			<updated>2026-02-16T11:28:22Z</updated>
			<id>https://forexsb.com/forum/post/83120/#p83120</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: 8-Phase Automated Validation Pipeline]]></title>
			<link rel="alternate" href="https://forexsb.com/forum/post/83119/#p83119" />
			<content type="html"><![CDATA[<p><strong># Utility Scripts — Managing the Pipeline</strong></p><p>After running the 8-phase pipeline for a while, I found myself repeating two tedious tasks: clearing old collections before a fresh run, and updating settings like stop loss ranges across all 8 INI files. So I built a few small scripts to make life easier.</p><p>==========================================================</p><p><strong>## The Problem with 8 INI Files</strong></p><p>There are 24 settings that must stay identical across all 8 phase files — account settings, strategy structure (stop loss, take profit, entry/exit slots), session times, and indicator options. If you change `stop_loss_range_max` in Phase 1 but forget Phase 7, you&#039;ll get unexpected behavior or silent failures.</p><p>The solution: one shared file, one sync script.</p><p>==========================================================</p><p><strong>## shared-settings.ini</strong></p><p>This file contains every setting that should be the same across all phases. Edit this one file instead of touching 8 files manually:</p><div class="codebox"><pre><code>ini
; +=========================================================+
; |                      QUANT-BOT.COM                      |
; |       Shared Settings Across All Pipeline Phases        |
; |          8 Phases. Multiple Markets. One Goal.          |
; |                                                         |
; |          by Hani | Powered by Express Generator         |
; +=========================================================+
;
; Edit values here, then run sync-settings.cmd to push
; changes to all 8 phase INI files automatically.
;
; Only settings that MUST be identical across phases belong here.
; Phase-specific settings (acceptance criteria, Monte Carlo
; parameters, server, etc.) stay in their own phase files.

; Account
account_currency = USD
initial_account = 10000
leverage = 100
entry_lots = 0.1

; Strategy structure
trade_direction_mode = LongAndShort
opposite_entry_signal = IgnoreOrReverse
stop_loss_usage = AlwaysUse
stop_loss_type = FixedOrTrailing
stop_loss_range_min = 10
stop_loss_range_max = 200
take_profit_usage = MayUse
take_profit_range_min = 10
take_profit_range_max = 350
max_entry_slots = 4
max_exit_slots = 2

; Backtester
exit_trade_at = Open
close_at_backtest_end = true

; Trading session
session_open = 00:00
session_close = 24:00
friday_close = 20:40
trade_on_sunday = false
close_at_session_close = false
close_at_friday_close = true

; Indicator options
max_indicator_period = 200</code></pre></div><p>==========================================================</p><p><strong>## sync-settings.cmd</strong></p><p>Run this after editing shared-settings.ini. It reads each `key = value` pair and updates the matching key in all 8 phase files. Phase-specific settings (like `min_profit`, `enable_monte_carlo`, `server`, etc.) are never touched — only keys that exist in both the shared file and the phase file get updated.</p><div class="codebox"><pre><code>cmd
@echo off
REM +=========================================================+
REM |                      QUANT-BOT.COM                      |
REM |         Sync Shared Settings to All Phases              |
REM |          8 Phases. Multiple Markets. One Goal.          |
REM |                                                         |
REM |          by Hani | Powered by Express Generator         |
REM +=========================================================+

cd /d %~dp0

if not exist &quot;shared-settings.ini&quot; (
    echo ERROR: shared-settings.ini not found
    pause
    exit /b 1
)

echo Syncing shared-settings.ini to all phase files...
echo.

powershell -Command ^
    &quot;$shared = @{}; &quot; ^
    &quot;Get-Content &#039;shared-settings.ini&#039; | ForEach-Object { &quot; ^
    &quot;  if ($_ -match &#039;^\s*([a-z_]+)\s*=\s*(.+)$&#039;) { &quot; ^
    &quot;    $shared[$Matches[1].Trim()] = $Matches[2].Trim() &quot; ^
    &quot;  } &quot; ^
    &quot;}; &quot; ^
    &quot;Write-Host (&#039;Loaded &#039; + $shared.Count + &#039; settings from shared-settings.ini&#039;); &quot; ^
    &quot;Write-Host &#039;&#039;; &quot; ^
    &quot;foreach ($f in (Get-ChildItem &#039;phase*.ini&#039;)) { &quot; ^
    &quot;  $lines = Get-Content $f.FullName; &quot; ^
    &quot;  $updated = 0; &quot; ^
    &quot;  $newLines = $lines | ForEach-Object { &quot; ^
    &quot;    if ($_ -match &#039;^\s*([a-z_]+)\s*=&#039;) { &quot; ^
    &quot;      $key = $Matches[1].Trim(); &quot; ^
    &quot;      if ($shared.ContainsKey($key)) { &quot; ^
    &quot;        $updated++; &quot; ^
    &quot;        $key + &#039; = &#039; + $shared[$key] &quot; ^
    &quot;      } else { $_ } &quot; ^
    &quot;    } else { $_ } &quot; ^
    &quot;  }; &quot; ^
    &quot;  $newLines | Set-Content $f.FullName; &quot; ^
    &quot;  Write-Host (&#039;  &#039; + $f.Name + &#039;: &#039; + $updated + &#039; settings updated&#039;) &quot; ^
    &quot;}&quot;

echo.
echo Done.
pause</code></pre></div><br /><p><strong>Example output:</strong></p><p>Loaded 24 settings from shared-settings.ini</p><p>&nbsp; phase1-generate.ini: 24 settings updated<br />&nbsp; phase2-oos.ini: 23 settings updated<br />&nbsp; phase3-mc-execution.ini: 23 settings updated<br />&nbsp; phase4-mc-params.ini: 23 settings updated<br />&nbsp; phase5-multi-tf.ini: 23 settings updated<br />&nbsp; phase6-multi-instr.ini: 23 settings updated<br />&nbsp; phase7-crossbroker.ini: 23 settings updated<br />&nbsp; phase8-forward.ini: 23 settings updated</p><p>Done.</p><p>==========================================================</p><p><strong>## clear-collections.cmd</strong></p><p>Before starting a fresh pipeline run, you want to clear old JSON files from all collection folders. This script does it with one click and a confirmation:</p><div class="codebox"><pre><code>cmd
@echo off
REM +=========================================================+
REM |                      QUANT-BOT.COM                      |
REM |            Clear All Pipeline Collections               |
REM |          8 Phases. Multiple Markets. One Goal.          |
REM |                                                         |
REM |          by Hani | Powered by Express Generator         |
REM +=========================================================+

echo WARNING: This will delete ALL .json files from collection folders:
echo.
echo   collections\phase1\
echo   collections\phase2\
echo   collections\phase3\
echo   collections\phase4\
echo   collections\phase5\
echo   collections\phase6\
echo   collections\phase7\
echo   collections\phase8\
echo.

set /p CONFIRM=Are you sure? (Y/N): 
if /i not &quot;%CONFIRM%&quot;==&quot;Y&quot; (
    echo Cancelled.
    pause
    exit /b
)

cd /d %~dp0\..

for /L %%P in (1,1,8) do (
    if exist &quot;collections\phase%%P\*.json&quot; (
        del /q &quot;collections\phase%%P\*.json&quot;
        echo Cleared phase%%P
    ) else (
        echo phase%%P already empty
    )
)

echo.
echo Done - all collections cleared.
pause</code></pre></div><p>==========================================================</p><p><strong>## Summary</strong></p><p>The full pipeline folder structure looks like this:</p><p>multi_stage_processing\<br />&nbsp; shared-settings.ini&nbsp; &nbsp; &nbsp; &nbsp; &lt;-- edit this for structure changes<br />&nbsp; sync-settings.cmd&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;-- pushes shared settings to all phases<br />&nbsp; clear-collections.cmd&nbsp; &nbsp; &nbsp; &lt;-- clears all JSON collections<br />&nbsp; workflow.cmd&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;-- main 8-phase pipeline<br />&nbsp; runner.cmd&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;-- launches multiple instruments<br />&nbsp; phase1-generate.ini<br />&nbsp; phase2-oos.ini<br />&nbsp; phase3-mc-execution.ini<br />&nbsp; phase4-mc-params.ini<br />&nbsp; phase5-multi-tf.ini<br />&nbsp; phase6-multi-instr.ini<br />&nbsp; phase7-crossbroker.ini<br />&nbsp; phase8-forward.ini</p><p><strong>Typical workflow:</strong><br />1. Edit `shared-settings.ini` if you need to change structure/account settings<br />2. Run `sync-settings.cmd` to push changes to all phases<br />3. Run `clear-collections.cmd` to start fresh<br />4. Run `runner.cmd` to launch the pipeline</p><p>Hope this saves you some time!</p><p>Cheers,<br />Hani</p>]]></content>
			<author>
				<name><![CDATA[quantbot]]></name>
				<uri>https://forexsb.com/forum/user/14524/</uri>
			</author>
			<updated>2026-02-16T11:13:12Z</updated>
			<id>https://forexsb.com/forum/post/83119/#p83119</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: 8-Phase Automated Validation Pipeline]]></title>
			<link rel="alternate" href="https://forexsb.com/forum/post/83118/#p83118" />
			<content type="html"><![CDATA[<p>Great post, thank you for sharing and especially detailing your steps, Hani! </p><p>I have a question: you have your workflow sorted, it is fully automated and reaching the goals you have set so to speak, but why do you still need to know &quot;exactly&quot; why a strat has failed? Does this provide you with further data to refine the process?</p><p>Another one: this is about multimarket. You say that you&#039;re using structurally related pairs that share market dynamics, but the first example for EURUSD shows correlation to EURUSD that is all across the board! Average daily correlation for GBPUSD is high, for USDCHF it is high (oppositely moving), for EURGBP there&#039;s no correlation, for EURJPY it is very low, for EURCAD it is low. Have you taken actual correlation into account by choosing the pairings?</p>]]></content>
			<author>
				<name><![CDATA[footon]]></name>
				<uri>https://forexsb.com/forum/user/1242/</uri>
			</author>
			<updated>2026-02-16T11:12:32Z</updated>
			<id>https://forexsb.com/forum/post/83118/#p83118</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[8-Phase Automated Validation Pipeline]]></title>
			<link rel="alternate" href="https://forexsb.com/forum/post/83117/#p83117" />
			<content type="html"><![CDATA[<p><strong>8-Phase Automated Validation Pipeline</strong></p><p>Hi everyone,</p><p>I&#039;ve been using EA Studio and Express Generator for years now, and after a long journey of trial and error — testing different robustness approaches, losing money to overfitted strategies, and slowly figuring out what actually works — I&#039;ve finally built a fully automated validation pipeline that I&#039;m genuinely happy with.</p><p>I wanted to share it with the community because this forum and Mr. Popov&#039;s continuous work on Express Generator have been instrumental in getting me here. The speed, the scriptability, the constant updates — Express Generator is truly a lovely system, and I owe a big thank you to Mr. Popov for making it all possible. Every new version brings something useful, and the tool just keeps getting better.</p><p>So here&#039;s my complete workflow. I hope it helps some of you avoid the mistakes I made along the way.</p><p>---</p><p><strong>The Problem: Overfitting is the Silent Killer</strong></p><p>We all know the story. You generate a beautiful strategy with a perfect equity curve, put it on a demo or live account, and within weeks, it&#039;s underwater. The strategy was curve-fitted to historical data and had no real edge.</p><p>I spent a long time trying simple IS/OOS splits and basic Monte Carlo tests, but strategies kept failing in live trading. The turning point was realizing that <strong>one robustness test is not enough</strong>. You need multiple independent tests that challenge the strategy from completely different angles. If a strategy survives all of them, the probability that it&#039;s genuinely capturing a market pattern goes up dramatically.</p><p>---</p><p><strong>The 8-Phase Pipeline Overview</strong></p><p>Here&#039;s the full pipeline. Each phase tests a different dimension of robustness:</p><div class="codebox"><pre><code>+---+---------------------------------+----------+---------+----------------------------------------------+
| # | Test                            |Data Range| Server  | Purpose                                      |
+---+---------------------------------+----------+---------+----------------------------------------------+
| 1 | Generate In-Sample              |  0%– 50% | Premium | Strategy discovery                           |
| 2 | Out-of-Sample Validation        | 50%– 80% | Premium | Overfit filter                               |
| 3 | Monte Carlo — Execution Stress  |  0%– 80% | Premium | Survives real-world execution?               |
| 4 | Monte Carlo — Param Sensitivity |  0%– 80% | Premium | Overfit to specific indicator values?        |
| 5 | Multi-Timeframe Validation      |  0%–100% | Premium | Captures a real pattern, not timeframe noise?|
| 6 | Multi-Instrument Validation     |  0%–100% | Premium | Works on related markets?                    |
| 7 | Cross-Broker Validation         |  0%– 80% | Eightcap| Real pattern or data artifact?               |
| 8 | Forward Test                    | 80%–100% | Premium | Performs on completely unseen data?          |
+---+---------------------------------+----------+---------+----------------------------------------------+</code></pre></div><p>The key insight: <strong>Phases 1–4 use 80% of the data maximum, reserving 20% that the strategy has NEVER seen for the final forward test.</strong> Phases 5 and 6 use 100% data because they test on different timeframes/instruments entirely — the strategy has never been optimized on those markets.</p><p>---</p><p><strong>Phase 1: Generate In-Sample (0%–50%)</strong></p><p>Generation uses only the first half of the available data. This is deliberate — it gives us three more independent data segments to validate against.</p><p>I typically run this for 24 hours per instrument using `max_working_minutes = 1440`. The more strategies generated, the better the chances of finding genuinely robust ones.</p><p>---</p><p><strong>Phase 2: Out-of-Sample Validation (50%–80%)</strong></p><p>Feed the Phase 1 collection into Express Generator with <em>data_start_percent = 50</em> and <em>data_end_percent = 80</em>. No generation, pure validation.</p><p>This 30% data window is completely unseen during generation. Strategies that were curve-fitted to the first 50% will typically fail here. This is your first major filter.</p><p>Settings are slightly relaxed compared to Phase 1 because the data window is smaller.</p><p>---</p><p><strong>Phase 3: Monte Carlo — Execution Stress (0%–80%)</strong></p><p>This is where I learned an important lesson. I used to combine all Monte Carlo tests into one phase, and it was eliminating 99.8% of strategies. <strong>Separating execution stress from parameter sensitivity into distinct phases was a game-changer</strong> — it gives you much better diagnostics about WHY a strategy failed.</p><p>Phase 3 tests execution robustness only — what happens when real-world conditions degrade?</p><p>---</p><p><strong>Phase 4: Monte Carlo — Parameter Sensitivity (0%–80%)</strong></p><p>Now test the opposite dimension: are the indicator parameters fragile?</p><p>Criteria are more lenient here than in Phase 3:</p><p><strong>Why more lenient?</strong> Because parameter changes can legitimately shift a strategy&#039;s behavior more than execution noise does. A strategy using RSI(14) that still works at RSI(12) or RSI(16) is robust. It doesn&#039;t need to be equally profitable — just not broken.</p><p><strong>Important lesson:</strong> I initially used 5% parameter variation, and it was too small to be meaningful. Use 15–20% for real stress testing. If a strategy breaks with 15% parameter variation, it&#039;s dangerously overfit.</p><p>---</p><p><strong>Phase 5: Multi-Timeframe Validation (0%–100%)</strong></p><p>This is where it gets interesting. A strategy generated on H1 should show <em>some</em> viability on adjacent timeframes (M30 and H4). If it completely falls apart, it&#039;s likely exploiting timeframe-specific noise rather than a real market pattern.</p><p>The workflow automatically maps adjacent timeframes:<br /></p><div class="codebox"><pre><code>- M5 → M1, M15
- M15 → M5, M30
- M30 → M15, H1
- H1 → M30, H4
- H4 → H1, D1
- D1 → H4</code></pre></div><p><strong>Criteria are very lenient</strong> — we&#039;re not expecting profitability, just &quot;not catastrophic&quot;:</p><p>- Must pass at least <strong>1 of 2</strong> adjacent timeframes (50% pass rate)</p><p>The workflow automatically fetches data for adjacent timeframes before testing. This uses 100% of data since it&#039;s a completely different timeframe — there&#039;s no &quot;seen/unseen&quot; concern.</p><p>---</p><p><strong>Phase 6: Multi-Instrument Validation (0%–100%)</strong></p><p>Same idea but across related currency pairs. A EURUSD strategy should show some viability on structurally related pairs that share market dynamics.</p><p>The workflow has a hardcoded mapping of related instruments:<br /></p><div class="codebox"><pre><code>- EURUSD → GBPUSD, USDCHF, EURGBP, EURJPY, EURCAD
- USDJPY → EURJPY, GBPJPY, AUDJPY, CHFJPY, CADJPY
- GBPUSD → EURUSD, EURGBP, GBPJPY, GBPAUD, GBPCAD
- AUDUSD → NZDUSD, AUDJPY, AUDCAD, AUDCHF, AUDNZD</code></pre></div><br /><p><strong>Pass requirement is percentage-based:</strong> <em>min_pass = max(1, floor(count / 3))</em> — roughly 33%:<br />- 3 related instruments → minimum 1 must pass<br />- 6 related instruments → minimum 2 must pass</p><p><strong>Tagging system:</strong> The results get tracked as tags like <em>MI4of5</em> (passed 4 out of 5 instruments). These tags flow through to the final output filename, so at the end you can see at a glance:<br />- <em>P8_EURUSD_H1_TF2of2_MI5of5.json</em> = fully validated, strong<br />- <em>P8_EURUSD_H1_TF1of2_MI2of6.json</em> = passed minimums, borderline</p><p>---</p><p><strong>Phase 7: Cross-Broker Validation (0%–80%)</strong></p><p>Test the strategy against a different broker&#039;s data feed. I use Eightcap as the cross-broker (ECN with tight spreads, which makes it a slightly tougher test).</p><p>This answers: is the strategy capturing a real market pattern, or is it an artifact of Premium&#039;s specific price feed?</p><p>---</p><p><strong>Phase 8: Forward Test (80%–100%)</strong></p><p>The final boss. The last 20% of data that the strategy has <strong>never seen</strong> in any form. No generation, no optimization, no Monte Carlo — just pure validation on unseen data.</p><p>This is the closest simulation to what will happen when you go live. If a strategy survives all 7 previous phases and still performs well on completely unseen forward data, you can have much higher confidence it has a genuine edge.</p><p>Settings are moderate (the 20% data window is smaller, so absolute metrics will be lower)</p><p>---</p><p><strong>Real Results: USDJPY H1 Through All 8 Phases</strong></p><p>Here&#039;s an actual strategy that made it through the entire pipeline:</p><div class="codebox"><pre><code>+---------------+-----------------------+------------------------+-----------------------+
| Metric        | Phase 3 (80% Premium) | Phase 7 (80% Eightcap) | Phase 8 (20% Forward) |
+---------------+-----------------------+------------------------+-----------------------+
| Profit        | $3,939                | $4,528                 | $3,763                |
| Profit/day    |  $0.84                |  $0.96                 |  $3.22                |
| Profit Factor |   1.43                |   1.13                 |   1.33                |
| R-squared     |  86.21                |  37.61                 |  72.22                |
| Return/DD     |   4.87                |   2.41                 |   3.66                |
| Max Drawdown  |   6.6%                |  18.5%                 |  8.31%                |
| Stagnation    |  19.3%                |  42.6%                 | 16.15%                |
| Trades        |    517                |    907                 |    346                |
+---------------+-----------------------+------------------------+-----------------------+</code></pre></div><p>The strategy actually <strong>improved</strong> on forward data — profit per day jumped from $0.84 to $3.22 and drawdown stayed low at 8.3%. It also passed all adjacent timeframes (M30, H4) and all 5 related JPY instruments (EURJPY, GBPJPY, AUDJPY, CADJPY, CHFJPY).</p><p>Final output: <em>P8_USDJPY_H1_TF2of2_MI5of5.json</em></p><p>---</p><p><strong>How It All Runs: Automation</strong></p><p>The entire pipeline is a single Windows batch script.</p><p>The script:<br />1. Fetches data for the main instrument<br />2. Runs all 8 phases sequentially<br />3. Automatically fetches data for adjacent timeframes before Phase 5<br />4. Automatically fetches data for related instruments before Phase 6<br />5. Prints statistics after each phase<br />6. Tags the final output with TF and MI results</p><p>---</p><p><strong>Lessons Learned the Hard Way</strong></p><p>&nbsp; 1. <strong>Separate your Monte Carlo tests.</strong> Combined MC (execution + parameters) was killing 99.8% of strategies. Separated, I get much better survival rates AND know exactly why a strategy failed.</p><p>&nbsp; 2. <strong>Don&#039;t be too strict too early.</strong> I spent months with overly tight criteria and getting zero strategies through. Better to have moderate filters across many phases than one impossibly strict filter.</p><p>&nbsp; 3. <strong>5% parameter variation is useless.</strong> Use 15–20% to actually stress test. If your strategy breaks at 15% variation, it WILL break in live trading.</p><p>&nbsp; 4.<strong><em>valid_tests_percent = 80</em> is too strict for initial discovery.</strong> Start with 65–75% and only tighten later if needed.</p><p>&nbsp; 5. <strong>Reserve 20% of data for forward testing.</strong> Never touch it during any other phase. This is your reality check.</p><p>&nbsp; 6. <strong>Multi-instrument testing reveals a lot.</strong> A strategy that works on 5+ related pairs is much more likely to capture a real pattern than one that only works on a single instrument.</p><p>---</p><p><strong>Final Thoughts</strong></p><p>This pipeline isn&#039;t magic — no system can guarantee profitable strategies. But it dramatically reduces the probability of deploying an overfitted strategy. The philosophy is simple: <strong>test from every angle, and only trust what survives everything.</strong></p><p>A huge thank you again to Mr. Popov for Express Generator. The speed, the command-line interface, the INI configuration system, and the data percentage splits — all of these features made this kind of automated pipeline possible. And the continuous updates keep making it better. This community and this tool have been invaluable.</p><p>Let&#039;s build robust strategies together!</p><p>Cheers,</p><p>Hani</p>]]></content>
			<author>
				<name><![CDATA[quantbot]]></name>
				<uri>https://forexsb.com/forum/user/14524/</uri>
			</author>
			<updated>2026-02-16T10:22:26Z</updated>
			<id>https://forexsb.com/forum/post/83117/#p83117</id>
		</entry>
</feed>
