Adwizard/Optimization/Optimizer.mqh

208 lines
15 KiB
MQL5
Raw Permalink Normal View History

2025-04-11 13:28:40 +03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Optimizer.mqh |
//| Copyright 2024, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Yuriy Bykov"
#property link "https://www.mql5.com/ru/users/antekov"
#property version "1.03"
#include "OptimizerTask.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O <5=5465@0 02B><0B8G5A:>9 >?B8<870F88 ?@>5:B>2 |
//+------------------------------------------------------------------+
class COptimizer {
string m_fileName;
// "5:CI0O 7040G0 >?B8<870F88
COptimizerTask *m_task;
// >;CG5=85 :>;8G5AB20 7040G 2 >G5@548
int TotalTasks();
// >;CG5=85 845=B8D8:0B>@0 A;54CNI59 7040G8 >?B8<870F88 87 >G5@548
ulong GetNextTaskId();
public:
COptimizer(string p_fileName, string p_pythonPath = NULL); // >=AB@C:B>@
~COptimizer();
void Process(); // A=>2=>9 <5B>4 >1@01>B:8
};
//+------------------------------------------------------------------+
//| >=AB@C:B>@ |
//+------------------------------------------------------------------+
COptimizer::COptimizer(string p_fileName, string p_pythonPath = NULL) :
m_fileName(p_fileName) {
// 5@540Q< ?CBL : 8=B5@?@5B0B>@C >1J5:BC 7040G8 >?B8<870F88
m_task = new COptimizerTask(p_fileName, p_pythonPath);
}
//+------------------------------------------------------------------+
//| >=AB@C:B>@ |
//+------------------------------------------------------------------+
COptimizer::~COptimizer() {
// 5@540Q< ?CBL : 8=B5@?@5B0B>@C >1J5:BC 7040G8 >?B8<870F88
if (!!m_task) delete m_task;
Comment("");
}
//+------------------------------------------------------------------+
//| >;CG5=85 :>;8G5AB20 7040G A 7040==K< AB0BCA>< |
//+------------------------------------------------------------------+
int COptimizer::TotalTasks() {
// 57C;LB0B
int res = 0;
// 0?@>A =0 ?>;CG5=85 :>;8G5AB20 7040G A 7040==K< AB0BCA><
string query = "SELECT COUNT(*)"
" FROM tasks t"
" JOIN"
" jobs j ON t.id_job = j.id_job"
" JOIN"
" stages s ON j.id_stage = s.id_stage"
" WHERE t.status IN ('Queued', 'Process') "
" ORDER BY s.id_stage, j.id_job, t.status LIMIT 1;";
// B:@K205< 107C 40==KE
if(DB::Connect(m_fileName)) {
// K?>;=O5< 70?@>A
int request = DatabasePrepare(DB::Id(), query);
// A;8 =5B >H81:8
if(request != INVALID_HANDLE) {
// !B@C:BC@0 40==KE 4;O GB5=8O >4=>9 AB@>:8 @57C;LB0B0 70?@>A0
struct Row {
int count;
} row;
// '8B05< 40==K5 87 ?5@2>9 AB@>:8 @57C;LB0B0
if(DatabaseReadBind(request, row)) {
res = row.count;
} else {
// !>>1I05< >1 >H81:5 ?@8 =5>1E>48<>AB8
PrintFormat(__FUNCTION__" | ERROR: Reading row for request \n%s\nfailed with code %d",
query, GetLastError());
}
} else {
// !>>1I05< >1 >H81:5 ?@8 =5>1E>48<>AB8
PrintFormat(__FUNCTION__" | ERROR: Request \n%s\nfailed with code %d", query, GetLastError());
}
// 0:@K205< 107C 40==KE
DB::Close();
}
return res;
}
//+------------------------------------------------------------------+
//| >;CG5=85 845=B8D8:0B>@0 A;54CNI59 7040G8 >?B8<870F88 87 >G5@548 |
//+------------------------------------------------------------------+
ulong COptimizer::GetNextTaskId() {
// 57C;LB0B
ulong res = 0;
// 0?@>A =0 ?>;CG5=85 >G5@54=>9 7040G8 >?B8<870F88 87 >G5@548
string query = "SELECT t.id_task"
" FROM tasks t "
" JOIN "
" jobs j ON j.id_job = t.id_job "
" JOIN "
" stages s ON s.id_stage = j.id_stage "
" LEFT JOIN "
" stages ps ON ps.id_stage = s.id_parent_stage "
" JOIN "
" projects p ON p.id_project = s.id_project "
" WHERE t.id_task > 0 AND "
" t.status IN ('Queued', 'Process') AND "
" (ps.id_stage IS NULL OR "
" ps.status = 'Done') "
" ORDER BY j.id_stage, "
" j.id_job, "
" t.status, "
" t.id_task"
" LIMIT 1;";
// B:@K205< 107C 40==KE
if(DB::Connect(m_fileName)) {
// K?>;=O5< 70?@>A
int request = DatabasePrepare(DB::Id(), query);
// A;8 =5B >H81:8
if(request != INVALID_HANDLE) {
// !B@C:BC@0 40==KE 4;O GB5=8O >4=>9 AB@>:8 @57C;LB0B0 70?@>A0
struct Row {
ulong id_task;
} row;
// '8B05< 40==K5 87 ?5@2>9 AB@>:8 @57C;LB0B0
if(DatabaseReadBind(request, row)) {
res = row.id_task;
} else {
// !>>1I05< >1 >H81:5 ?@8 =5>1E>48<>AB8
PrintFormat(__FUNCTION__" | ERROR: Reading row for request \n%s\nfailed with code %d",
query, GetLastError());
}
} else {
// !>>1I05< >1 >H81:5 ?@8 =5>1E>48<>AB8
PrintFormat(__FUNCTION__" | ERROR: request \n%s\nfailed with code %d", query, GetLastError());
}
// 0:@K205< 107C 40==KE
DB::Close();
}
return res;
}
//+------------------------------------------------------------------+
//| A=>2=>9 <5B>4 >1@01>B:8 |
//+------------------------------------------------------------------+
void COptimizer::Process() {
PrintFormat(__FUNCTION__" | Current Task ID = %d", m_task.Id());
// A;8 A>25B=8: >AB0=>2;5=, B> C40;O5< B09<5@ 8 A0<>3> A>25B=8:0 A 3@0D8:0
if (IsStopped()) {
EventKillTimer();
ExpertRemove();
return;
}
// A;8 B5:CI0O 7040G0 7025@H5=0, B>
if (m_task.IsDone()) {
// A;8 B5:CI0O 7040G0 =5 ?CAB0O, B>
if(m_task.Id()) {
// 25@H05< B5:CICN 7040GC
m_task.Finish();
}
// >;CG05< :>;8G5AB2> 7040G 2 >G5@548
int totalTasks = TotalTasks();
// A;8 7040G8 5ABL, B>
if(totalTasks) {
// >;CG05< 845=B8D8:0B>@ >G5@54=>9 B5:CI59 7040G8
ulong taskId = GetNextTaskId();
// 03@C605< ?0@0<5B@K 7040G8 >?B8<870F88 87 107K 40==KE
m_task.Load(taskId);
// 0?CA:05< B5:CICN 7040GC
m_task.Start();
// K2>48< =0 3@0D8: :>;8G5AB2> >AB02H8EAO 7040G 8 B5:CICN 7040GC
Comment(StringFormat(
"Total tasks in queue: %d\n"
"Current Task ID: %d",
totalTasks, m_task.Id()));
} else {
// A;8 7040G =5B, B> C40;O5< A>25B=8: A 3@0D8:0
PrintFormat(__FUNCTION__" | Finish.", 0);
ExpertRemove();
}
}
}
//+------------------------------------------------------------------+