From b7c018d49735dc48d04f2ca4a10852e32ad71a66 Mon Sep 17 00:00:00 2001 From: JQSakaJoo Date: Tue, 28 Apr 2026 00:29:35 +0400 Subject: [PATCH] Add BOA(Bull) and Test_AO_AntiCheat --- .../Math/AOs/PopulationAO/#C_AO_enum.mqh | Bin 37308 -> 37676 bytes .../AO_BOA_BullOptimizationAlgorithm.mqh | Bin 0 -> 15180 bytes MQL5/Include/Math/AOs/PopulationAO/links.html | 1 + MQL5/Include/Math/AOs/TestStand3D.mqh | Bin 53562 -> 54400 bytes MQL5/Scripts/Testing AOs/Test_AO_All.mq5 | 262 ++++++++++++++++++ .../Scripts/Testing AOs/Test_AO_AntiCheat.mq5 | 121 ++++++++ MQL5/Scripts/Testing AOs/Testing AOs.mq5 | Bin 13934 -> 0 bytes README.md | 1 + 8 files changed, 385 insertions(+) create mode 100644 MQL5/Include/Math/AOs/PopulationAO/AO_BOA_BullOptimizationAlgorithm.mqh create mode 100644 MQL5/Scripts/Testing AOs/Test_AO_All.mq5 create mode 100644 MQL5/Scripts/Testing AOs/Test_AO_AntiCheat.mq5 delete mode 100644 MQL5/Scripts/Testing AOs/Testing AOs.mq5 diff --git a/MQL5/Include/Math/AOs/PopulationAO/#C_AO_enum.mqh b/MQL5/Include/Math/AOs/PopulationAO/#C_AO_enum.mqh index c9002bafc66276fbb2fae3048237fa5c89080a37..27b73837d2e6ad42396191a3b9ec3cf7bd0339d2 100644 GIT binary patch delta 200 zcmdn9m}$*2rVR?ro1ZXm66AGa@Mmyjh-YwOC}qf*>?kfhc>|x-=4qm5geFhml$mU$ zDKvSNQqbf!W|zrH8Yec(Y3&mgMA5^L!=N)+*IAi42dKYLQ-AUVN1@I4>`#bIjTjBSLz8E6pDEYmOPW5DmxayRToEB9J$YR@8zrrpoo z&p^$6_fMC+f3bf%^=jUH8hpz`PyI&fT9e|F2g}53vtG&8b`P9DnWjx#teu->~;K?)sqi5YJBB z8Gg?&a|idQxc>{D97XipB>njm+G}#6V$jKZGcBlLnz(so91_K8N0K!)B@T%lO_I`m{T4(X7ichjVEg zr=BM|SN+}wcs2mP4)Og5X7m0Cu<4f$;JJ>x2OGeH9Rf!gY;yaR_gMmaQg5>j48%$~ zlgj(>jx9Iq9>P~D#=r^6n4Wdh)2q90V{S}a&wYbEgb!((fu~F7JsW%8W;B!VnjT&g za8ulS&cdym`x-O1-QP!)>f972=aJ94Bb~>H5-6~I>VmH)fc*w^ldqKTj%$E-{Nprla9`8&kUP@N5DKCn6Wu?W- zRrT0frPwIPAHyaqEjF&I$2MDmjanAtOL;0QV{BYik8iFNUk`Sj?l8qCD=j`rK0IsC!m_(f*xbNns&)}~u zMfGs3hR1MJ^Au}69ILr89Mz}s;8=Yu!b!byHJ`1PSvav?eFwcd^8Qk(E4w~{Ztg>~ z8i<>W*QdD8p^Znw42Y5OkKWI}LKNQ_Mvt$(wr)Y*pG8?h8HTE{aq%&#y+3@L*#8bJ zgcz@Gf0QlxsvlxF0>}5jZ(^eUHAnGtGSBb~kj}krzl0QR3?9$3FsgGsBRe%9z)(6^ z>0Eb>L;Olltewi!^eT~BN4bX_96!MxSp$$~tW9&T+myM^9Pi3(<{m!ud6Us4F*M!tZBB~mv=&*J1Ni9Uo$t%AxV+t9(Z)*dDh41#d&x++B61O+TPuI4tgXXzn$l9 z37qL>UuJ8#&VWNpS)mz%{Q%kR&d@KZFShiHC9vYKqudpJUlU(?#q=3{pzS4w=Mtf`h6!F$qe`$m z;tbi6^-+=?px=Nh=g$_l1yi0o=qN~C0rnYxe?O1ItSTXy$jOIMA-}G5< zmF1^4OrNFj(q~e6mf5~W5?!g*|G~1WG&LRnaN3@7B>q2{WtVjyt##9b3Vbxp#Q4(OseC|s%)Q^+uK#|NA^ZNvHIFVmX^EUK-084^c8wU zcq3xi8%nz;%yw<(@ZX>4fARI@+F2Y`eNA(8W|~3vAwRcyc@Ar1{;hes{MTOM6rTOb zKaaaLQ>I?fdVoFJ>RG3daiB%CAyC9jIpEa&PD1} zbbJ?^Jx`HT+k2UXVSg*fJCCqT^aJTxo??ym2HELT{Ho(}oyQY)?4ID-M%TCNs}*+4 z=Y0k9)OUi{0C5TMiYFA)h0ZpmP?WkIQA+fhyI*F%&3>JIoc+RIKgy_UE9g&BH>r{I zm1~{{de+SN7V<(TWfs@pGAb#F&K0^+w`f?7I*vD@HT4>5_Fzz(ZKGio7s zMVV0RgoBhA_b8E!ooB0+_!t(*Gd=A=(IdrOtQpuy4sVdV z&oPfamU(J>=(XtE_)N}K7)ZTLJFVP|KR)X)(^-Z--p-k@rhpJ?6PXtJz`l-53k7m@VRD^TC@-}FFOp#~x?{Ne_#e8cPUW`_q zV!ODF^8J%~ZrvSeWQw)QJBj7mQ)W3=z6^g=%e7}F|AW@rNHI680d4*&x)`$8y4DA(Duelist)duelist algorithm ECOieco-inspired evolutionary algorithm BFO-GAbacterial foraging optimization - genetic algorithm + BOA(Bull)bull optimization algorithm SOAsimple optimization algorithm ABHAartificial bee hive algorithm DOdandelion optimizer diff --git a/MQL5/Include/Math/AOs/TestStand3D.mqh b/MQL5/Include/Math/AOs/TestStand3D.mqh index 1933f413c603be951e84156c9ffbdda485ef6507..76fb1adf7cb90c081aa3581db490433ac01b6e90 100644 GIT binary patch delta 4711 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 h +#include +#include +#include +#include + + + +//+------------------------------------------------------------------+ +input string AOparam = "----------------"; //AO parameters----------- +input E_AO AOexactly_P = NONE_AO; + +input string TestStand_1 = "----------------"; //Test stand-------------- +input double ArgumentStep_P = 0.0; //Argument Step + +input string TestStand_2 = "----------------"; //------------------------ +input int Test1FuncRuns_P = 5; //Test #1: Number of functions in the test +input int Test2FuncRuns_P = 25; //Test #2: Number of functions in the test +input int Test3FuncRuns_P = 500; //Test #3: Number of functions in the test + +input string TestStand_3 = "----------------"; //------------------------ +input EFunc Function1 = Hilly; +input EFunc Function2 = Forest; +input EFunc Function3 = Megacity; + +input string TestStand_4 = "----------------"; //------------------------ +input int NumbTestFuncRuns_P = 10000; //Number of test function runs +input int NumberRepetTest_P = 10; //Test repets number + +input string TestStand_5 = "----------------"; //------------------------ +input int DelayInMS_P = 0; +input bool Video_P = true; //Show video +input bool Use3D_P = true; //Показывать 3D-визуализацию +input int Grid3D_P = 80; //Разрешение 3D-сетки (10..200) +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnStart() + { + C_AO *AO = SelectAO(AOexactly_P); + + if(AO == NULL) + { + Print("AO is not selected..."); + return; + } + + Print(AO.GetName(), "|", AO.GetDesc(), "|", AO.GetParams()); + +//--- 2D стенд + C_TestStand ST; + ST.Init(750, 375); + +//--- 3D стенд + C_TestStand3D *ST3 = NULL; + if(Use3D_P) + { + ST3 = new C_TestStand3D(); + if(!ST3.Init("__3DView__", 5, 30, ST.H, ST.H)) + { + Print("C_TestStand3D: Init failed — 3D-режим отключён"); + delete ST3; + ST3 = NULL; + } + } + + double allScore = 0.0; + double allTests = 0.0; + + C_Function *F1 = SelectFunction(Function1); + C_Function *F2 = SelectFunction(Function2); + C_Function *F3 = SelectFunction(Function3); + + if(F1 != NULL) + { + Print("============================="); + ST.CanvasErase(); + if(ST3 != NULL) + {ST3.BuildSurface(*F1, Grid3D_P); ST3.Show(true); } + + FuncTests(AO, ST, ST3, *F1, Test1FuncRuns_P, clrLime, allScore, allTests); + FuncTests(AO, ST, ST3, *F1, Test2FuncRuns_P, clrAqua, allScore, allTests); + FuncTests(AO, ST, ST3, *F1, Test3FuncRuns_P, clrOrangeRed, allScore, allTests); + delete F1; + } + + if(F2 != NULL) + { + Print("============================="); + ST.CanvasErase(); + if(ST3 != NULL) + {ST3.BuildSurface(*F2, Grid3D_P); ST3.Show(true); } + + FuncTests(AO, ST, ST3, *F2, Test1FuncRuns_P, clrLime, allScore, allTests); + FuncTests(AO, ST, ST3, *F2, Test2FuncRuns_P, clrAqua, allScore, allTests); + FuncTests(AO, ST, ST3, *F2, Test3FuncRuns_P, clrOrangeRed, allScore, allTests); + delete F2; + } + + if(F3 != NULL) + { + Print("============================="); + ST.CanvasErase(); + if(ST3 != NULL) + {ST3.BuildSurface(*F3, Grid3D_P); ST3.Show(true); } + + FuncTests(AO, ST, ST3, *F3, Test1FuncRuns_P, clrLime, allScore, allTests); + FuncTests(AO, ST, ST3, *F3, Test2FuncRuns_P, clrAqua, allScore, allTests); + FuncTests(AO, ST, ST3, *F3, Test3FuncRuns_P, clrOrangeRed, allScore, allTests); + delete F3; + } + + Print("============================="); + if(allTests > 0.0) + Print("All score: ", DoubleToString(allScore, 5), " (", DoubleToString(allScore * 100.0 / allTests, 2), "%)"); + + if(ST3 != NULL) + {ST3.Show(false); delete ST3; } + ST.Canvas.Destroy(); + delete AO; + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void FuncTests(C_AO &ao, + C_TestStand &st, + C_TestStand3D *st3, + C_Function &f, + const int funcCount, + const color clrConv, + double &allScore, + double &allTests) + { + if(funcCount <= 0) + return; + + allTests++; + + if(Video_P) + { + st.DrawFunctionGraph(f); + st.SendGraphToCanvas(); + st.MaxMinDr(f); + st.Update(); + } + + int xConv = 0.0; + int yConv = 0.0; + double aveResult = 0.0; + int params = funcCount * 2; + int epochCount = NumbTestFuncRuns_P / (int)ao.params [0].val; + +//---------------------------------------------------------------------------- + double rangeMin [], rangeMax [], rangeStep []; + ArrayResize(rangeMin, params); + ArrayResize(rangeMax, params); + ArrayResize(rangeStep, params); + + for(int i = 0; i < funcCount; i++) + { + rangeMax [i * 2] = f.GetMaxRangeX(); + rangeMin [i * 2] = f.GetMinRangeX(); + rangeStep [i * 2] = ArgumentStep_P; + + rangeMax [i * 2 + 1] = f.GetMaxRangeY(); + rangeMin [i * 2 + 1] = f.GetMinRangeY(); + rangeStep [i * 2 + 1] = ArgumentStep_P; + } + + double ag3D []; + + for(int test = 0; test < NumberRepetTest_P; test++) + { + //-------------------------------------------------------------------------- + if(!ao.Init(rangeMin, rangeMax, rangeStep, epochCount)) + break; + + int agCnt = ArraySize(ao.a); + if(st3 != NULL) + {ArrayResize(ag3D, agCnt * funcCount * 2); st3.ResetTrail(); } + + // Optimization------------------------------------------------------------- + for(int epochCNT = 1; epochCNT <= epochCount && !IsStopped(); epochCNT++) + { + if(DelayInMS_P > 0) + Sleep(DelayInMS_P); + Comment(epochCNT); + + ao.Moving(); + + for(int set = 0; set < ArraySize(ao.a); set++) + { + ao.a [set].f = f.CalcFunc(ao.a [set].c); + } + + ao.Revision(); + + //--- 2D визуализация ------------------------------------------- + if(Video_P) + { + //drawing a population-------------------------------------------------- + st.SendGraphToCanvas(); + + for(int i = 0; i < agCnt; i++) + { + st.PointDr(ao.a [i].c, f, 1, 1, funcCount, false); + } + st.PointDr(ao.cB, f, 1, 1, funcCount, true); + + st.MaxMinDr(f); + + //drawing a convergence graph------------------------------------------- + xConv = (int)st.Scale(epochCNT, 1, epochCount, st.H + 2, st.W - 3, false); + yConv = (int)st.Scale(ao.fB, f.GetMinFunValue(), f.GetMaxFunValue(), 2, st.H - 2, true); + st.Canvas.FillCircle(xConv, yConv, 1, COLOR2RGB(clrConv)); + + st.Update(); + } + + //--- 3D визуализация ------------------------------------------- + if(st3 != NULL) + { + for(int i = 0; i < agCnt; i++) + for(int j = 0; j < funcCount; j++) + { + ag3D [(i * funcCount + j) * 2] = ao.a [i].c [j * 2]; + ag3D [(i * funcCount + j) * 2 + 1] = ao.a [i].c [j * 2 + 1]; + } + + st3.OnTimer(0.033); + st3.SetAgents(ag3D, agCnt, funcCount, f, ao.cB); + st3.Redraw(); + } + } + + aveResult += ao.fB; + } + + aveResult /= (double)NumberRepetTest_P; + + double score = aveResult; + + Print(funcCount, " ", f.GetFuncName(), "'s; Func runs: ", NumbTestFuncRuns_P, "; result: ", aveResult); + allScore += score; + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+ diff --git a/MQL5/Scripts/Testing AOs/Test_AO_AntiCheat.mq5 b/MQL5/Scripts/Testing AOs/Test_AO_AntiCheat.mq5 new file mode 100644 index 0000000..6906a7f --- /dev/null +++ b/MQL5/Scripts/Testing AOs/Test_AO_AntiCheat.mq5 @@ -0,0 +1,121 @@ +//+------------------------------------------------------------------+ +//| Copyright 2007-2026, Andrey Dik | +//| https://www.mql5.com/ru/users/joo | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2007-2026, JQS aka Joo." +#property link "https://www.mql5.com/ru/users/joo" +#property version "1.00" +#property script_show_inputs + +#include +#include +#include + +//———————————————————————————————————————————————————————————————————— +input string AOparam = "----------------"; //AO parameters----------- +input E_AO AOexactly_P = NONE_AO; + +input string TestStand_P = "----------------"; //Test stand--------------- +input int NumbTestFuncRuns_P = 1e4; // Количество вычислений функции +input int NumberRepetTest_P = 10; // Количество повторных прогонов +//———————————————————————————————————————————————————————————————————— + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnStart() + { + C_AO *AO = SelectAO(AOexactly_P); + + if(AO == NULL) + { + Print("AO is not selected..."); + return; + } + + Print(AO.GetName(), "|", AO.GetDesc(), "|", AO.GetParams()); + +//--- создаём 5 функций +#define NFUNCS 5 + C_Function *funcs [NFUNCS]; + funcs [0] = new C_Hilly(); + funcs [1] = new C_Forest(); + funcs [2] = new C_Megacity(); + funcs [3] = new C_Peaks(); + funcs [4] = new C_Skin(); + +//--- 10 координат: пара 0-1 = Hilly, 2-3 = Forest, 4-5 = Megacity, +// 6-7 = Peaks, 8-9 = Skin + int params = NFUNCS * 2; + + double rangeMin []; + double rangeMax []; + double rangeStep []; + ArrayResize(rangeMin, params); + ArrayResize(rangeMax, params); + ArrayResize(rangeStep, params); + + for(int i = 0; i < NFUNCS; i++) + { + rangeMin [i * 2] = funcs [i].GetMinRangeX(); + rangeMax [i * 2] = funcs [i].GetMaxRangeX(); + rangeStep [i * 2] = 0.0; + + rangeMin [i * 2 + 1] = funcs [i].GetMinRangeY(); + rangeMax [i * 2 + 1] = funcs [i].GetMaxRangeY(); + rangeStep [i * 2 + 1] = 0.0; + } + +//--- запуск тестов + int epochCount = NumbTestFuncRuns_P / (int)AO.params [0].val; + double aveResult = 0.0; + + Print("============================="); + Print("Composite test: Hilly + Forest + Megacity + Peaks + Skin"); + Print("Coordinates: ", params, "; Epochs: ", epochCount, + "; Repeats: ", NumberRepetTest_P); + Print("============================="); + + for(int test = 0; test < NumberRepetTest_P; test++) + { + if(!AO.Init(rangeMin, rangeMax, rangeStep, epochCount)) + break; + + for(int epochCNT = 1; epochCNT <= epochCount && !IsStopped(); epochCNT++) + { + AO.Moving(); + + //--- расчёт fitness для каждого агента + for(int set = 0; set < ArraySize(AO.a); set++) + { + double sum = 0.0; + for(int i = 0; i < NFUNCS; i++) + { + sum += funcs [i].Core(AO.a [set].c [i * 2], + AO.a [set].c [i * 2 + 1]); + } + AO.a [set].f = sum / NFUNCS; + } + + AO.Revision(); + } + + Print("Run ", test + 1, "/", NumberRepetTest_P, ": ", AO.fB); + aveResult += AO.fB; + } + + aveResult /= (double)NumberRepetTest_P; + + Print("============================="); + Print("Average result: ", DoubleToString(aveResult, 10), + " (", DoubleToString(aveResult * 100.0, 2), "%)"); + Print("============================="); + +//--- освобождение + for(int i = 0; i < NFUNCS; i++) + delete funcs [i]; + delete AO; + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+ diff --git a/MQL5/Scripts/Testing AOs/Testing AOs.mq5 b/MQL5/Scripts/Testing AOs/Testing AOs.mq5 deleted file mode 100644 index a773518be0c0bc1846ed318039b30e9032408b1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13934 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