Adwizard/Virtual/VirtualStrategyGroup.mqh

111 lines
10 KiB
MQL5
Raw Permalink Normal View History

2025-04-11 13:28:40 +03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| VirtualStrategyGroup.mqh |
//| 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/users/antekov"
#property version "1.03"
#include "VirtualStrategy.mqh"
//+------------------------------------------------------------------+
//| ;0AA 3@C??K B>@3>2KE AB@0B5389 8;8 3@C?? B>@3>2KE AB@0B5389 |
//+------------------------------------------------------------------+
class CVirtualStrategyGroup : public CFactorable {
protected:
double m_scale; // >MDD8F85=B <0AHB018@>20=8O
void Scale(double p_scale); // 0AHB018@>20=85 =>@<8@>20==>3> 10;0=A0
CVirtualStrategyGroup(string p_params); // >=AB@C:B>@
public:
STATIC_CONSTRUCTOR(CVirtualStrategyGroup);
virtual string operator~() override; // @5>1@07>20=85 >1J5:B0 2 AB@>:C
CVirtualStrategy *m_strategies[]; // 0AA82 AB@0B5389
CVirtualStrategyGroup *m_groups[]; // 0AA82 3@C?? AB@0B5389
string ToStringNorm(double p_scale);
};
REGISTER_FACTORABLE_CLASS(CVirtualStrategyGroup);
//+------------------------------------------------------------------+
//| >=AB@C:B>@ |
//+------------------------------------------------------------------+
CVirtualStrategyGroup::CVirtualStrategyGroup(string p_params) {
// 0?><8=05< AB@>:C 8=8F80;870F88
m_params = p_params;
// '8B05< AB@>:C 8=8F80;870F88 <0AA820 AB@0B5389 8;8 3@C??
string items = ReadArrayString(p_params);
// >:0 AB@>:0 =5 >?CAB5;0
while(items != NULL) {
// '8B05< AB@>:C 8=8F80;870F88 >4=>3> >1J5:B0 AB@0B5388 8;8 3@C??K
string itemParams = ReadObject(items);
// A;8 MB> 3@C??0 AB@0B5389, B>
if(IsObjectOf(itemParams, "CVirtualStrategyGroup")) {
// !>740Q< 3@C??C AB@0B5389 8 4>102;O5< 5Q 2 <0AA82 3@C??
CREATE(CVirtualStrategyGroup, group, itemParams);
APPEND(m_groups, group);
} else {
// =0G5 A>740Q< AB@0B538N 8 4>102;O5< 5Q 2 <0AA82 AB@0B5389
CREATE(CVirtualStrategy, strategy, itemParams);
APPEND(m_strategies, strategy);
}
}
// '8B05< <0AHB018@CNI89 <=>68B5;L
m_scale = ReadDouble(p_params);
// A?@02;O5< 53> ?@8 =5>1E>48<>AB8
if(m_scale <= 0.0) {
m_scale = 1.0;
}
if(ArraySize(m_groups) > 0 && ArraySize(m_strategies) == 0) {
// A;8 <K =0?>;=8;8 <0AA82 3@C??, 0 <0AA82 AB@0B5389 ?CAB>9, B>
PrintFormat(__FUNCTION__" | Scale = %.2f, total groups = %d", m_scale, ArraySize(m_groups));
// 0AHB018@C5< 2A5 3@C??K
Scale(m_scale / ArraySize(m_groups));
} else if(ArraySize(m_strategies) > 0 && ArraySize(m_groups) == 0) {
// A;8 <K =0?>;=8;8 <0AA82 AB@0B5389, 0 <0AA82 3@C?? ?CAB>9, B>
PrintFormat(__FUNCTION__" | Scale = %.2f, total strategies = %d", m_scale, ArraySize(m_strategies));
// 0AHB018@C5< 2A5 AB@0B5388
Scale(m_scale / ArraySize(m_strategies));
} else {
// =0G5 A>>1I05< >1 >H81:5 2 AB@>:5 8=8F80;870F88
//SetInvalid(__FUNCTION__, StringFormat("Groups or strategies not found in Params:\n%s", p_params));
PrintFormat(__FUNCTION__" | Groups or strategies not found in Params:\n%s", p_params);
}
}
//+------------------------------------------------------------------+
//| @5>1@07>20=85 >1J5:B0 2 AB@>:C |
//+------------------------------------------------------------------+
string CVirtualStrategyGroup::operator~() {
return StringFormat("%s(%s)", typename(this), m_params);
}
//+------------------------------------------------------------------+
//| @5>1@07>20=85 >1J5:B0 2 AB@>:C A =>@<8@>2:>9 |
//+------------------------------------------------------------------+
string CVirtualStrategyGroup::ToStringNorm(double p_scale) {
return StringFormat("%s([%s],%f)", typename(this), ReadArrayString(m_params), p_scale);
}
//+------------------------------------------------------------------+
//| 0AHB018@>20=85 =>@<8@>20==>3> 10;0=A0 |
//+------------------------------------------------------------------+
void CVirtualStrategyGroup::Scale(double p_scale) {
//int totalGroups = ArraySize(m_groups);
//int totalStrategies = ArraySize(m_strategies);
//int total = totalGroups + totalStrategies;
//PrintFormat(__FUNCTION__" | Scale = %.4f, total groups = %d, total strategies = %d, total = %d", p_scale, totalGroups, totalStrategies, total);
FOREACH(m_groups) m_groups[i].Scale(p_scale);
FOREACH(m_strategies) m_strategies[i].Scale(p_scale);
}
//+------------------------------------------------------------------+