Adwizard/Virtual/VirtualStrategyGroup.mqh
2025-04-11 13:28:40 +03:00

110 lines
10 KiB
MQL5

//+------------------------------------------------------------------+
//| 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"
//+------------------------------------------------------------------+
//| Класс группы торговых стратегий или групп торговых стратегий |
//+------------------------------------------------------------------+
class CVirtualStrategyGroup : public CFactorable {
protected:
double m_scale; // Коэффициент масштабирования
void Scale(double p_scale); // Масштабирование нормированного баланса
CVirtualStrategyGroup(string p_params); // Конструктор
public:
STATIC_CONSTRUCTOR(CVirtualStrategyGroup);
virtual string operator~() override; // Преобразование объекта в строку
CVirtualStrategy *m_strategies[]; // Массив стратегий
CVirtualStrategyGroup *m_groups[]; // Массив групп стратегий
string ToStringNorm(double p_scale);
};
REGISTER_FACTORABLE_CLASS(CVirtualStrategyGroup);
//+------------------------------------------------------------------+
//| Конструктор |
//+------------------------------------------------------------------+
CVirtualStrategyGroup::CVirtualStrategyGroup(string p_params) {
// Запоминаем строку инициализации
m_params = p_params;
// Читаем строку инициализации массива стратегий или групп
string items = ReadArrayString(p_params);
// Пока строка не опустела
while(items != NULL) {
// Читаем строку инициализации одного объекта стратегии или группы
string itemParams = ReadObject(items);
// Если это группа стратегий, то
if(IsObjectOf(itemParams, "CVirtualStrategyGroup")) {
// Создаём группу стратегий и добавляем её в массив групп
CREATE(CVirtualStrategyGroup, group, itemParams);
APPEND(m_groups, group);
} else {
// Иначе создаём стратегию и добавляем её в массив стратегий
CREATE(CVirtualStrategy, strategy, itemParams);
APPEND(m_strategies, strategy);
}
}
// Читаем масштабирующий множитель
m_scale = ReadDouble(p_params);
// Исправляем его при необходимости
if(m_scale <= 0.0) {
m_scale = 1.0;
}
if(ArraySize(m_groups) > 0 && ArraySize(m_strategies) == 0) {
// Если мы наполнили массив групп, а массив стратегий пустой, то
PrintFormat(__FUNCTION__" | Scale = %.2f, total groups = %d", m_scale, ArraySize(m_groups));
// Масштабируем все группы
Scale(m_scale / ArraySize(m_groups));
} else if(ArraySize(m_strategies) > 0 && ArraySize(m_groups) == 0) {
// Если мы наполнили массив стратегий, а массив групп пустой, то
PrintFormat(__FUNCTION__" | Scale = %.2f, total strategies = %d", m_scale, ArraySize(m_strategies));
// Масштабируем все стратегии
Scale(m_scale / ArraySize(m_strategies));
} else {
// Иначе сообщаем об ошибке в строке инициализации
//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);
}
}
//+------------------------------------------------------------------+
//| Преобразование объекта в строку |
//+------------------------------------------------------------------+
string CVirtualStrategyGroup::operator~() {
return StringFormat("%s(%s)", typename(this), m_params);
}
//+------------------------------------------------------------------+
//| Преобразование объекта в строку с нормировкой |
//+------------------------------------------------------------------+
string CVirtualStrategyGroup::ToStringNorm(double p_scale) {
return StringFormat("%s([%s],%f)", typename(this), ReadArrayString(m_params), p_scale);
}
//+------------------------------------------------------------------+
//| Масштабирование нормированного баланса |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+