forked from mnbvc188199/Warrior_EA
Recovered live config (z20 <= -1.5, exit SMA20 / 10 bars, 3xATR) plus a Garman-Klass vol-regime gate. Expectancy is monotone in the vol regime in IS, OOS and full sample, 4/4 indices; the gate reverses on USDJPY/XAUUSD. D1 2008-2026 survives 2008/2020/2022 (maxDD 2.8%, ret/DD 7.74); the gate halves trades, so it belongs on H4, never D1. reconcile.py matches the EA to the backtest trade by trade; combine_charts.py rebuilds the account curve from per-chart tester runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
87 lines
3.8 KiB
MQL5
87 lines
3.8 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| ExportAll.mq5 - bars (per timeframe list) to Common\Files |
| |
//| Throwaway research tool. Opens no trades. |
| |
//| |
| |
//| Run via the strategy tester with an ini whose tested symbol has |
| |
//| the DEEPEST history (EURUSD D1 from 1995): the tester only |
| |
//| serves history from ~1 year before FromDate, so the tested |
| |
//| symbol's range sets the ceiling for every CopyRates below. |
| |
//| |
| |
//| NOTE: H4 requests for symbols other than the tested one failed |
| |
//| with err=4401 (history not ready) on a D1 pass. Export H4 in a |
| |
//| SEPARATE H4 pass rather than expecting one run to do both. |
| |
//| The calendar is NOT exportable here at all - see ExportCalendar. |
| |
//+------------------------------------------------------------------+
| |
#property copyright "claude"
| |
#property version "1.10"
| |
| |
input string ExportTag = "bars";
| |
input string SymbolsD1 = "SP500,NAS100,US30,DAX40,UK100,ESXEUR,F40EUR,JPN225,ASXAUD,HSIHKD,IBXEUR,EURUSD,GBPUSD,USDJPY,USDCHF,USDCAD,AUDUSD,NZDUSD,EURJPY,EURGBP,GBPJPY,AUDJPY,XAUUSD,XAGUSD,XTIUSD,XBRUSD,BTCUSD,ETHUSD";
| |
input string SymbolsH4 = "";
| |
input bool DoCalendar = false;
| |
| |
bool DumpBars(const string sym, const ENUM_TIMEFRAMES tf)
| |
{
| |
MqlRates r[];
| |
ArraySetAsSeries(r, false); // oldest -> newest, matches numpy
| |
int got = CopyRates(sym, tf, 0, 500000, r);
| |
if(got <= 0)
| |
{
| |
PrintFormat("ExportAll: %s %s CopyRates failed (err=%d)", sym, EnumToString(tf), GetLastError());
| |
return false;
| |
}
| |
string name = StringFormat("%s_%s_%s.csv", ExportTag, sym, EnumToString(tf));
| |
int h = FileOpen(name, FILE_WRITE | FILE_CSV | FILE_ANSI | FILE_COMMON, ',');
| |
if(h == INVALID_HANDLE)
| |
return false;
| |
FileWrite(h, "time", "open", "high", "low", "close", "tick_volume", "spread");
| |
int digits = (int)SymbolInfoInteger(sym, SYMBOL_DIGITS);
| |
if(digits <= 0)
| |
digits = 5;
| |
for(int i = 0; i < got; i++)
| |
FileWrite(h, TimeToString(r[i].time, TIME_DATE | TIME_MINUTES),
| |
DoubleToString(r[i].open, digits), DoubleToString(r[i].high, digits),
| |
DoubleToString(r[i].low, digits), DoubleToString(r[i].close, digits),
| |
(string)r[i].tick_volume, (string)r[i].spread);
| |
FileClose(h);
| |
PrintFormat("ExportAll: %s %s -> %d bars (%s .. %s)", sym, EnumToString(tf), got,
| |
TimeToString(r[0].time, TIME_DATE), TimeToString(r[got - 1].time, TIME_DATE));
| |
return true;
| |
}
| |
| |
void DumpList(const string list, const ENUM_TIMEFRAMES tf, int &ok, int &fail)
| |
{
| |
string syms[];
| |
int n = StringSplit(list, ',', syms);
| |
for(int i = 0; i < n; i++)
| |
{
| |
string s = syms[i];
| |
StringTrimLeft(s);
| |
StringTrimRight(s);
| |
if(StringLen(s) == 0)
| |
continue;
| |
//--- without SymbolSelect an unlisted symbol reads back as zero bars and
| |
//--- looks like missing history rather than an unselected symbol.
| |
if(!SymbolSelect(s, true))
| |
PrintFormat("ExportAll: SymbolSelect(%s) failed (err=%d)", s, GetLastError());
| |
if(DumpBars(s, tf))
| |
ok++;
| |
else
| |
fail++;
| |
}
| |
}
| |
| |
//--- OnDeinit, not OnInit: by then the tester has walked the whole range, so
| |
//--- CopyRates returns every bar of the pass rather than only the warm-up.
| |
void OnDeinit(const int reason)
| |
{
| |
int ok = 0, fail = 0;
| |
if(StringLen(SymbolsD1) > 0)
| |
DumpList(SymbolsD1, PERIOD_D1, ok, fail);
| |
if(StringLen(SymbolsH4) > 0)
| |
DumpList(SymbolsH4, PERIOD_H4, ok, fail);
| |
PrintFormat("ExportAll: DONE bars ok=%d fail=%d", ok, fail);
| |
}
| |
| |
int OnInit(void) { return(INIT_SUCCEEDED); }
| |
void OnTick(void) { }
|