ð ELDRA ããã¯ãã¹ãã»æé©åå®å šã¬ã€ããç§åŠçæ€èšŒææ³ã
æèŠã§ã¯ãªãæ°å€ã§åã€ãELDRAã®ç§åŠçæ€èšŒã·ã¹ãã ã§ãããŒã¿ã«åºã¥ããæåŒ·æŠç¥ãæ§ç¯
ð¯ ãªãããã¯ãã¹ãã»æé©åãéèŠãªã®ã
ããã®EAã¯åãŠãã®ãïŒããšããçåã«å¯Ÿããçãã¯ãç§åŠçãªæ€èšŒã«ãããããŸãããELDRAã¯é«åºŠãªããã¯ãã¹ãã»æé©åæ©èœãæèŒããæèŠã«é ŒããªãããŒã¿ããªãã³ãªãã¬ãŒãæŠç¥ã®æ§ç¯ãå¯èœã«ããŸãã
ð ç§åŠçæ€èšŒã®åšå
ð¬ ç§åŠçã¢ãããŒãã®å¹æ
âââ åçäºæž¬ç²ŸåºŠïŒ95%以äž
âââ ãªã¹ã¯ç®¡ç粟床ïŒ90%åäž
âââ æèŠç倿ãã¹ïŒ85%åæž
âââ é·æå®å®æ§ïŒ70%åäž
𧪠ELDRAã®ããã¯ãã¹ãæ©èœ
ããã¯ãã¹ãã®åºæ¬æŠå¿µ
ããã¯ãã¹ããšã¯ãéå»ã®äŸ¡æ ŒããŒã¿ã䜿ã£ãŠæŠç¥ã®æå¹æ§ãæ€èšŒããããšã§ããELDRAã§ã¯1åè¶³ããæè¶³ãŸã§ããããæé軞ã§ã®æ€èšŒãå¯èœã§ãã
// ELDRAããã¯ãã¹ãèšå®
input datetime BacktestStartDate = D'2020.01.01'; // éå§æ¥
input datetime BacktestEndDate = D'2024.12.31'; // çµäºæ¥
input bool UseEveryTick = true; // å
šãã£ãã¯ã¢ãŒã
input int BacktestSpread = 15; // åºå®ã¹ãã¬ãã
input double BacktestCommission = 0.0; // ææ°æèšå®
é«ç²ŸåºŠããã¯ãã¹ãå®è¡
ð¯ ELDRAããã¯ãã¹ãç¹åŸŽ
âââ ãã£ãã¯ã¬ãã«ã®ç²Ÿå¯ã·ãã¥ã¬ãŒã·ã§ã³
âââ ãªã¢ã«ã¹ãã¬ããã»ææ°æãå®å
šåçŸ
âââ æ»ãïŒã¹ãªãããŒãžïŒãèæ
®ããçŽå®
âââ è€æ°é貚ãã¢åææ€èšŒå¯Ÿå¿
âââ ã¯ã©ãŠãããŒã¹é«éæŒç®ã·ã¹ãã
ãããã¯ãã¹ãå®è¡æé ã
// ããã¯ãã¹ãå®è¡ã·ã¹ãã
void RunBacktest() {
Print("=== ELDRAããã¯ãã¹ãéå§ ===");
// 1. ããŒã¿å質ãã§ãã¯
if(!CheckDataQuality()) {
Print("ããŒã¿å質ãšã©ãŒïŒããã¯ãã¹ã忢");
return;
}
// 2. æŠç¥ãã©ã¡ãŒã¿ãŒèšå®
SetupStrategyParameters();
// 3. ãªã¹ã¯ç®¡çèšå®
ConfigureRiskManagement();
// 4. ããã¯ãã¹ãå®è¡
for(int bar = BacktestStartBar; bar >= 0; bar--) {
ProcessBar(bar);
UpdateStatistics();
}
// 5. çµæã¬ããŒãçæ
GenerateBacktestReport();
Print("=== ããã¯ãã¹ãå®äº ===");
}
ð ããã©ãŒãã³ã¹åæææš
åºæ¬ããã©ãŒãã³ã¹ææš
ELDRAã¯30çš®é¡ä»¥äžã®åæææšãèªåç®åºããŸãã
ð äž»èŠããã©ãŒãã³ã¹ææš
âââ ç·å©çïŒGross ProfitïŒ
âââ çŽå©çïŒNet ProfitïŒ
âââ ãããã£ãããã¡ã¯ã¿ãŒïŒPFïŒ
âââ åçïŒWin RateïŒ
âââ å¹³ååã¡é¡ïŒAverage WinïŒ
âââ å¹³åè² ãé¡ïŒAverage LossïŒ
âââ æå€§ãããŒããŠã³ïŒMax DDïŒ
âââ æå€§é£ååæ°ïŒMax Consecutive WinsïŒ
âââ æå€§é£æåæ°ïŒMax Consecutive LossesïŒ
âââ ååŸ©ä¿æ°ïŒRecovery FactorïŒ
ãåæã¬ããŒãäŸã
ð ELDRA ããã¯ãã¹ãçµæã¬ããŒã
================================
æ€èšŒæéïŒ2020/01/01 - 2024/12/31
é貚ãã¢ïŒUSD/JPYïŒ1æéè¶³ïŒ
åæè³éïŒ1,000,000å
â åºæ¬æçžŸ
ç·å©çïŒ1,850,000åïŒ+85.0%ïŒ
çŽå©çïŒ1,650,000åïŒ+65.0%ïŒ
ãããã£ãããã¡ã¯ã¿ãŒïŒ2.31
åçïŒ68.5%ïŒ542å/249æïŒ
â ãªã¹ã¯ææš
æå€§ãããŒããŠã³ïŒ-125,000åïŒ-12.5%ïŒ
ã·ã£ãŒãã¬ã·ãªïŒ1.87
ã«ã«ããŒã¬ã·ãªïŒ5.2
ååŸ©ä¿æ°ïŒ13.2
â ååŒçµ±èš
ç·ååŒåæ°ïŒ791å
å¹³ååã¡é¡ïŒ+4,850å
å¹³åè² ãé¡ïŒ-2,150å
æå€§åã¡é¡ïŒ+28,500å
æå€§è² ãé¡ïŒ-8,200å
é«åºŠãªçµ±èšåæ
// é«åºŠçµ±èšåæã·ã¹ãã
double CalculateAdvancedStatistics() {
// ã·ã£ãŒãã¬ã·ãªèšç®
double avgReturn = GetAverageReturn();
double stdDev = GetStandardDeviation();
double sharpeRatio = avgReturn / stdDev;
// ã«ã«ããŒã¬ã·ãªèšç®
double maxDD = GetMaxDrawdown();
double calmarRatio = (avgReturn * 252) / MathAbs(maxDD);
// ãœã«ãã£ãŒãã¬ã·ãªèšç®
double downstdDev = GetDownsideDeviation();
double sortinoRatio = avgReturn / downstdDev;
// VaRïŒValue at RiskïŒèšç®
double var95 = CalculateVaR(0.95);
double var99 = CalculateVaR(0.99);
return sharpeRatio;
}
ð§ ãã©ã¡ãŒã¿ãŒæé©åã·ã¹ãã
éºäŒçã¢ã«ãŽãªãºã æé©å
ELDRAã¯**éºäŒçã¢ã«ãŽãªãºã ïŒGAïŒ**ã䜿çšããé«åºŠãªæé©åãå®è¡ããŸãã
// éºäŒçã¢ã«ãŽãªãºã èšå®
input int GA_PopulationSize = 100; // åäœæ°
input int GA_Generations = 50; // äžä»£æ°
input double GA_MutationRate = 0.05; // çªç¶å€ç°ç
input double GA_CrossoverRate = 0.8; // 亀åç
input ENUM_OPTIMIZATION_CRITERION GA_Criterion = BALANCE; // æé©ååºæº
ãæé©å察象ãã©ã¡ãŒã¿ãŒäŸã
ð¯ æé©åãã©ã¡ãŒã¿ãŒç¯å²
âââ RSIæéïŒ5-50ïŒã¹ããã1ïŒ
âââ MACD FastïŒ5-20ïŒã¹ããã1ïŒ
âââ MACD SlowïŒ15-50ïŒã¹ããã1ïŒ
âââ ã¹ããããã¹ïŒ10-100pipsïŒã¹ããã5ïŒ
âââ ãã€ã¯ãããã£ããïŒ10-200pipsïŒã¹ããã5ïŒ
âââ ããããµã€ãºïŒ0.01-1.0ïŒã¹ããã0.01ïŒ
âââ ãã³ãã³ééïŒ10-100pipsïŒã¹ããã5ïŒ
âââ æå€§ãã³ãã³æ°ïŒ1-10ïŒã¹ããã1ïŒ
å€ç®çæé©å
âïž æé©åç®æšã®éžæ
âââ å©çæå€§åïŒBalanceæå€§ïŒ
âââ ãããŒããŠã³æå°åïŒMaxDDæå°ïŒ
âââ ã·ã£ãŒãã¬ã·ãªæå€§åïŒSRæå€§ïŒ
âââ ãããã£ãããã¡ã¯ã¿ãŒæå€§åïŒPFæå€§ïŒ
âââ è€åææšæé©åïŒã«ã¹ã¿ã 颿°ïŒ
ãè€åæé©å颿°ã®äŸã
// ã«ã¹ã¿ã æé©å颿°
double CustomOptimizationFunction() {
double balance = GetNetProfit();
double maxDD = GetMaxDrawdown();
double winRate = GetWinRate();
double pf = GetProfitFactor();
// éã¿ä»ãè€åææš
double score =
(balance * 0.3) + // å©ç30%
(-maxDD * 0.2) + // DDæå°20%
(winRate * 0.2) + // åç20%
(pf * 1000 * 0.3); // PF30%
return score;
}
ð ãŠã©ãŒã¯ãã©ã¯ãŒãåæ
ãŠã©ãŒã¯ãã©ã¯ãŒããã¹ãã®æŠå¿µ
ãŠã©ãŒã¯ãã©ã¯ãŒãåæã¯ãéå»ããŒã¿ã§æé©åâæªæ¥ããŒã¿ã§æ€èšŒãç¹°ãè¿ããå®éçšæã®ããã©ãŒãã³ã¹ãããæ£ç¢ºã«äºæž¬ããææ³ã§ãã
// ãŠã©ãŒã¯ãã©ã¯ãŒãèšå®
input int WF_OptimizationPeriod = 6; // æé©åæéïŒæïŒ
input int WF_TestPeriod = 3; // ãã¹ãæéïŒæïŒ
input int WF_StepPeriod = 1; // ã¹ãããæéïŒæïŒ
input bool WF_ReoptimizeEnabled = true; // åæé©åæå¹
ããŠã©ãŒã¯ãã©ã¯ãŒãå®è¡äŸã
ð
ãŠã©ãŒã¯ãã©ã¯ãŒãåæã¹ã±ãžã¥ãŒã«
æé1ïŒ2020/01-2020/06ïŒæé©åïŒâ 2020/07-2020/09ïŒãã¹ãïŒ
æé2ïŒ2020/02-2020/07ïŒæé©åïŒâ 2020/08-2020/10ïŒãã¹ãïŒ
æé3ïŒ2020/03-2020/08ïŒæé©åïŒâ 2020/09-2020/11ïŒãã¹ãïŒ
...
æé48ïŒ2023/01-2023/06ïŒæé©åïŒâ 2023/07-2023/09ïŒãã¹ãïŒ
ç·åçµæïŒ48åã®ãã¹ãçµæãçµ±åè©äŸ¡
ã¢ãŠããªããµã³ãã«æ€èšŒ
𧪠æ€èšŒããŒã¿ã®åå²
âââ ã€ã³ãµã³ãã«æéïŒ60%ïŒæé©åçšïŒ
âââ ã¢ãŠããªããµã³ãã«æéïŒ40%ïŒæ€èšŒçšïŒ
âââ æªæ¥ããŒã¿ïŒå®å
šã«æªç¥ã®ããŒã¿ã§æçµç¢ºèª
ð¯ å®è·µçæé©åæŠç¥
æŠç¥1: ã¹ãã£ã«ãã³ã°æé©å
// 1åè¶³ã¹ãã£ã«ãã³ã°æé©åèšå®
input int RSI_Period = 5; // Start=3, Stop=15, Step=1
input double RSI_Overbought = 80; // Start=70, Stop=90, Step=2
input double RSI_Oversold = 20; // Start=10, Stop=30, Step=2
input int StopLoss = 10; // Start=5, Stop=25, Step=2
input int TakeProfit = 15; // Start=8, Stop=30, Step=2
ãã¹ãã£ã«ãã³ã°æé©åçµæäŸã
ð ã¹ãã£ã«ãã³ã°æé©åçµæ
æé©ãã©ã¡ãŒã¿ãŒïŒ
âââ RSIæéïŒ7
âââ RSIäžéïŒ85
âââ RSIäžéïŒ18
âââ SLïŒ12pips
âââ TPïŒ18pips
ããã©ãŒãã³ã¹ïŒ
âââ 幎å©ïŒ+285%
âââ æå€§DDïŒ-8.5%
âââ åçïŒ72%
âââ PFïŒ2.8
âââ æ¥æ¬¡å¹³åååŒïŒ15å
æŠç¥2: ãã€ãã¬ãŒãæé©å
// 15åè¶³ãã€ãã¬ãŒãæé©åèšå®
input int MACD_Fast = 12; // Start=8, Stop=20, Step=2
input int MACD_Slow = 26; // Start=20, Stop=40, Step=2
input int MACD_Signal = 9; // Start=5, Stop=15, Step=1
input int BB_Period = 20; // Start=15, Stop=30, Step=1
input double BB_Deviation = 2.0; // Start=1.5, Stop=3.0, Step=0.1
æŠç¥3: ã¹ã€ã³ã°ãã¬ãŒãæé©å
â° æéè»žå¥æé©åã®ã³ã
çæïŒ1-5åè¶³ïŒïŒ
âââ ãã©ã¡ãŒã¿ãŒã¯å°ãããæåºŠé«ã
âââ ã¹ãããã¯çããå©é£ãã¯æ©ã
âââ ãã€ãºãã£ã«ã¿ãŒã匷å
äžæïŒ15å-1æéè¶³ïŒïŒ
âââ ãã¬ã³ããã©ããŒãéèŠ
âââ é©åºŠãªã¹ãããã»å©é£ãå¹
âââ ãã©ãã£ãªãã£èª¿æŽæ©èœ
é·æïŒ4æé-æ¥è¶³ïŒïŒ
âââ 倧å±çãªãã¬ã³ãéèŠ
âââ 倧ããªã¹ãããã»å©é£ãå¹
âââ ãã¡ã³ãã¡ã³ã¿ã«èŠçŽ èæ
®
ð ããã¯ãã¹ãã®èœãšã穎ãšå¯Ÿç
ããããããã¯ãã¹ããšã©ãŒ
â ïž ããã¯ãã¹ã倱æãã¿ãŒã³
âââ ã«ãŒããã£ããã£ã³ã°ïŒéå°æé©åïŒ
âââ æªæ¥ããŒã¿ã®æ··å
¥ïŒã«ãã¯ã¢ãããïŒ
âââ ãµãã€ããŒã·ãããã€ã¢ã¹
âââ äžé©åãªããŒã¿å質
âââ ã¹ãã¬ããã»ææ°æã®æªèæ
®
ELDRAã®å¯Ÿçã·ã¹ãã
// ã«ãŒããã£ããã£ã³ã°é²æ¢ã·ã¹ãã
bool CheckOverfitting() {
// ã€ã³ãµã³ãã« vs ã¢ãŠããªããµã³ãã«æ¯èŒ
double inSampleProfit = GetInSampleProfit();
double outOfSampleProfit = GetOutOfSampleProfit();
// æ§èœå£åãã§ãã¯
double degradationRate = (inSampleProfit - outOfSampleProfit) / inSampleProfit;
if(degradationRate > 0.3) { // 30%以äžã®å£å
Print("èŠåïŒã«ãŒããã£ããã£ã³ã°ã®å¯èœæ§");
return false;
}
return true;
}
ð ãã©ã¯ãŒããã¹ãå®è£
ãªã¢ã«ã¿ã€ã æ€èšŒã·ã¹ãã
// ãã©ã¯ãŒããã¹ãèšé²ã·ã¹ãã
void RecordForwardTestData() {
// ååŒèšé²
string record =
TimeToString(TimeCurrent()) + "," +
DoubleToString(AccountBalance(), 2) + "," +
DoubleToString(AccountEquity(), 2) + "," +
IntegerToString(GetTotalPositions()) + "," +
DoubleToString(GetCurrentProfit(), 2);
// CSVãã¡ã€ã«ã«èšé²
int fileHandle = FileOpen("ELDRA_ForwardTest.csv", FILE_WRITE|FILE_CSV);
if(fileHandle != INVALID_HANDLE) {
FileWrite(fileHandle, record);
FileClose(fileHandle);
}
}
ããã©ãŒãã³ã¹ç£èŠ
ð ãã©ã¯ãŒããã¹ãç£èŠé
ç®
âââ ãªã¢ã«ã¿ã€ã æçæšç§»
âââ ãããŒããŠã³èŠæã¬ãã«
âââ åçã®æšç§»ã¢ãã¿ãªã³ã°
âââ ããã¯ãã¹ããšã®ä¹é¢åºŠ
âââ ç·æ¥åæ¢æ¡ä»¶ã®ç£èŠ
ð¯ æé©åæåäºäŸ
äºäŸ1: RSIæŠç¥ã®æé©å
ð RSIæŠç¥æé©åçµæ
æé©ååïŒããã©ã«ãèšå®ïŒïŒ
âââ RSIæéïŒ14
âââ äžé/äžéïŒ70/30
âââ 幎å©ïŒ+15%
âââ æå€§DDïŒ-25%
âââ åçïŒ52%
æé©ååŸïŒGAæé©åïŒïŒ
âââ RSIæéïŒ9
âââ äžé/äžéïŒ75/28
âââ 幎å©ïŒ+38%ïŒ+153%åäžïŒ
âââ æå€§DDïŒ-12%ïŒ-52%æ¹åïŒ
âââ åçïŒ64%ïŒ+12%åäžïŒ
äºäŸ2: è€åæŠç¥ã®æé©å
ð è€åæŠç¥æé©åçµæ
åäœæŠç¥å¹³åïŒ
âââ RSIæŠç¥ïŒå¹Žå©+25%
âââ MACDæŠç¥ïŒå¹Žå©+18%
âââ BBæŠç¥ïŒå¹Žå©+22%
æé©åè€åæŠç¥ïŒ
âââ éã¿ä»ãçµ±åïŒå¹Žå©+52%
âââ ã·ããžãŒå¹æïŒ+87%ã®è¿œå å©ç
âââ ãªã¹ã¯åæ£ïŒDD-40%æ¹å
âââ å®å®æ§åäžïŒåç+15%åäž
ð ãŸãšãïŒç§åŠçæ€èšŒãã¹ã¿ãŒãžã®é
ããã¯ãã¹ãã»æé©åæåã®éå
ð ç§åŠçæ€èšŒæåã®åå
âââ 1. ååãªããŒã¿éã§ã®æ€èšŒïŒæäœ3幎ïŒ
âââ 2. è€æ°ã®æ€èšŒææ³ã®çµã¿åãã
âââ 3. ã«ãŒããã£ããã£ã³ã°ã®åŸ¹åºåé¿
âââ 4. ã¢ãŠããªããµã³ãã«ãã¹ãå¿
é å®è¡
âââ 5. ãã©ã¯ãŒããã¹ãã§ã®æçµç¢ºèª
ELDRA ããã¯ãã¹ãç¿åŸæ®µé
ð ç¿åŸããŒãããã
âââ åçŽïŒåºæ¬ããã¯ãã¹ãã®å®è¡ãšçè§£
âââ äžçŽïŒãã©ã¡ãŒã¿ãŒæé©åã®æŽ»çš
âââ äžçŽïŒãŠã©ãŒã¯ãã©ã¯ãŒãåæã®å®è·µ
âââ å°éïŒã«ã¹ã¿ã æé©å颿°ã®éçº
âââ ãšãã¹ããŒãïŒç¬èªæ€èšŒã·ã¹ãã ã®æ§ç¯
ç¶ç¶çæ¹åããã»ã¹
ð æ¹åãµã€ã¯ã«
âââ 仮説èšå®ïŒæŠç¥ã¢ã€ãã¢ïŒ
âââ ããã¯ãã¹ãå®è¡ïŒéå»ããŒã¿æ€èšŒïŒ
âââ æé©å宿œïŒãã©ã¡ãŒã¿ãŒèª¿æŽïŒ
âââ ã¢ãŠããªããµã³ãã«æ€èšŒ
âââ ãã©ã¯ãŒããã¹ãïŒãªã¢ã«ç°å¢ïŒ
âââ çµæåæãšæ¬¡ææ¹åç¹æœåº
次åã®èšäºã§ã¯ãELDRAã®ãå®è·µçæŽ»çšæ¹æ³ãã«ã€ããŠè©³ãã解説ããŸããæŠç¥å¥ã®å ·äœçèšå®äŸãšéçšãã¯ããã¯ããå±ãããŸãã