SimpleCandles/Optimization/CreateProject.mq5

171 lines
14 KiB
MQL5
Raw Permalink Normal View History

2025-04-11 13:29:20 +03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| CreateProject.mq5 |
//| Copyright 2024-2025, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024-2025, Yuriy Bykov"
#property link "https://www.mql5.com/ru/articles/17328"
#property description "!>25B=8: A>740QB ?@>5:B A MB0?0<8, @01>B0<8 8 7040G0<8 >?B8<870F88."
2025-04-11 15:19:04 +03:00
#property version "1.03"
2025-04-24 22:18:33 +03:00
#include "../Include/Adwizard/Optimization/OptimizationProject.mqh"
2025-04-11 13:29:20 +03:00
//+------------------------------------------------------------------+
//| E>4=K5 ?0@0<5B@K |
//+------------------------------------------------------------------+
sinput group "::: 070 40==KE"
sinput string fileName_ = "article.17328.db.sqlite"; // - $09; 107K 40==KE >?B8<870F88
sinput group "::: 0@0<5B@K ?@>5:B0 - A=>2=K5"
sinput string projectName_ = "SimpleCandles"; // - 0720=85
sinput string projectVersion_ = "1.00"; // - 5@A8O
sinput string symbols_ = "GBPUSD,EURUSD,EURGBP"; // - !8<2>;K
sinput string timeframes_ = "H1,M30"; // - "09<D@59<K
sinput group "::: 0@0<5B@K ?@>5:B0 - =B5@20; >?B8<870F88"
sinput datetime fromDate_ = D'2022-09-01'; // - 0B0 =0G0;0
sinput datetime toDate_ = D'2023-01-01'; // - 0B0 >:>=G0=8O
sinput group "::: 0@0<5B@K ?@>5:B0 - !GQB"
sinput string mainSymbol_ = "GBPUSD"; // - A=>2=>9 A8<2>;
sinput int deposit_ = 10000; // - 0G0;L=K9 45?>78B
sinput group "::: -B0? 1. >8A:"
sinput string stage1ExpertName_ = "Stage1.ex5"; // - !>25B=8: MB0?0
sinput string stage1Criterions_ = "6,6,6"; // - @8B5@88 >?B8<870F88 4;O 7040G
sinput group "::: -B0? 2. @C??8@>2:0"
sinput string stage2ExpertName_ = "Stage2.ex5"; // - !>25B=8: MB0?0
sinput string stage2Criterion_ = "6"; // - @8B5@89 >?B8<870F88 4;O 7040G
//sinput bool stage2UseClusters_= false; // - A?>;L7>20BL :;0AB5@870F8N?
sinput double stage2MinCustomOntester_ = 500; // - 8=. 7=0G5=85 =>@<. ?@81K;8
sinput uint stage2MinTrades_ = 20; // - 8=. :>;-2> A45;>:
sinput double stage2MinSharpeRatio_ = 0.7; // - 8=. :>MDD. (0@?0
sinput uint stage2Count_ = 8; // - >;-2> AB@0B5389 2 3@C??5 (1 - 16)
sinput group "::: -B0? 3. B>3"
sinput string stage3ExpertName_ = "Stage3.ex5"; // - !>25B=8: MB0?0
sinput ulong stage3Magic_ = 27183; // - Magic
sinput bool stage3Tester_ = true; // - ;O B5AB5@0?
class COptimizationProject;
// (01;>= ?0@0<5B@>2 >?B8<870F88 =0 ?5@2>< MB0?5
string paramsTemplate1(COptimizationProject *p) {
string params = StringFormat(
"symbol_=%s\n"
"period_=%d\n"
"; === 0@0<5B@K A83=0;0 : >B:@KB8N\n"
"signalSeqLen_=4||2||1||8||Y\n"
"periodATR_=21||7||2||48||Y\n"
"; === 0@0<5B@K >B;>65==KE >@45@>2\n"
"stopLevel_=2.34||0.01||0.01||5.0||Y\n"
"takeLevel_=4.55||0.01||0.01||5.0||Y\n"
"; === 0@0<5B@K C?@02;5=85 :0?8B0;><\n"
"maxCountOfOrders_=15||1||1||30||Y\n",
p.m_symbol, p.StringToTimeframe(p.m_timeframe));
return params;
}
// (01;>= ?0@0<5B@>2 >?B8<870F88 =0 2B>@>< MB0?5
string paramsTemplate2(COptimizationProject *p) {
// 0E>48< 845=B8D8:0B>@ @>48B5;LA:>9 @01>BK 4;O B5:CI59 @01>BK
// ?> A>2?045=8N A8<2>;0 8 B09<D@59<0 =0 B5:CI5< 8 @>48B5;LA:>< MB0?5
int i;
SEARCH(p.m_stage.parent_stage.jobs,
(p.m_stage.parent_stage.jobs[i].symbol == p.m_symbol
&& p.m_stage.parent_stage.jobs[i].timeframe == p.m_timeframe),
i);
ulong parentJobId = p.m_stage.parent_stage.jobs[i].id_job;
string params = StringFormat(
"idParentJob_=%I64u\n"
"useClusters_=%s\n"
"minCustomOntester_=%f\n"
"minTrades_=%u\n"
"minSharpeRatio_=%.2f\n"
"count_=%u\n",
parentJobId,
(string) false, //(string) stage2UseClusters_,
stage2MinCustomOntester_,
stage2MinTrades_,
stage2MinSharpeRatio_,
stage2Count_
);
return params;
}
// (01;>= ?0@0<5B@>2 >?B8<870F88 =0 B@5BL5< MB0?5
string paramsTemplate3(COptimizationProject *p) {
string params = StringFormat(
"groupName_=%s\n"
"advFileName_=%s\n"
"passes_=\n",
StringFormat("%s_v.%s_%s",
p.name, p.version, TimeToString(toDate_, TIME_DATE)),
StringFormat("%s-%I64u%s.db.sqlite",
p.name, stage3Magic_, (stage3Tester_ ? ".test" : "")));
return params;
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
// !>740Q< >1J5:B ?@>5:B0 >?B8<870F88 4;O 7040==>9 107K 40==KE
COptimizationProject p(fileName_);
// !>740Q< =>2K9 ?@>5:B 2 1075 40==KE
p.Create(projectName_, projectVersion_,
StringFormat("%s - %s",
TimeToString(fromDate_, TIME_DATE),
TimeToString(toDate_, TIME_DATE)));
// >102;O5< ?5@2K9 MB0?
p.AddStage(NULL, "First", stage1ExpertName_, mainSymbol_, "H1", 2, 2,
fromDate_, toDate_, 0, 0, deposit_);
// >102;O5< @01>BK ?5@2>3> MB0?0
p.AddJobs(symbols_, timeframes_, paramsTemplate1);
// >102;O5< 7040G8 4;O @01>B ?5@2>3> MB0?0
p.AddTasks(stage1Criterions_);
// >102;O5< 2B>@>9 MB0?
p.AddStage(p.m_stages[0], "Second", stage2ExpertName_, mainSymbol_, "H1", 2, 2,
fromDate_, toDate_, 0, 0, deposit_);
// >102;O5< @01>BK 2B>@>3> MB0?0
p.AddJobs(symbols_, timeframes_, paramsTemplate2);
// >102;O5< 7040G8 4;O @01>B 2B>@>3> MB0?0
p.AddTasks(stage2Criterion_);
// >102;O5< B@5B89 MB0?
p.AddStage(p.m_stages[1], "Save to library", stage3ExpertName_, mainSymbol_,
"H1", 0, 2, fromDate_, toDate_, 0, 0, deposit_);
// >102;O5< @01>BC B@5BL53> MB0?0
p.AddJobs(mainSymbol_, "H1", paramsTemplate3);
// >102;O5< 7040GC 4;O @01>BK B@5BL53> MB0?0
p.AddTasks("0");
// !B028< ?@>5:B 2 >G5@54L =0 2K?>;=5=85
p.Queue();
// #40;O5< A>25B=8:
ExpertRemove();
// #A?5H=0O 8=8F80;870F8O
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+