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

143 lines
11 KiB
MQL5

//+------------------------------------------------------------------+
//| VirtualStrategy.mqh |
//| Copyright 2019-2025, Yuriy Bykov |
//| https://www.mql5.com/ru/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019-2025, Yuriy Bykov"
#property link "https://www.mql5.com/ru/users/antekov"
#property version "1.09"
#include <Generic/HashMap.mqh>
#include "../Base/Strategy.mqh"
#include "VirtualOrder.mqh"
#include "../Database/Storage.mqh"
//+------------------------------------------------------------------+
//| Класс торговой стратегии с виртуальными позициями |
//+------------------------------------------------------------------+
class CVirtualStrategy : public CStrategy {
protected:
CVirtualOrder *m_orders[]; // Массив виртуальных позиций (ордеров)
int m_ordersTotal; // Общее количество открытых позиций и ордеров
double m_fittedBalance; // Нормированный баланс стратегии
double m_fixedLot; // Фиксированный размер стратегии
double m_baseFittedBalance; // Начальный нормированный баланс стратегии
virtual void CountOrders(); // Подсчет количества открытых виртуальных позиций и ордеров
public:
CVirtualStrategy(); // Конструктор
virtual void OnOpen(CVirtualOrder *o); // Обработчик события открытия виртуальной позиции (ордера)
virtual void OnClose(CVirtualOrder *o); // Обработчик события закрытия виртуальной позиции (ордера)
virtual double Profit() const;
virtual double ClosedProfit() const;
virtual void Close();
virtual void Save(); // Сохранение состояния
virtual bool Load(); // Загрузка состояния
// Установка начального нормированного баланса стратегии
void FittedBalance(double fittedBalance) {
m_fittedBalance = fittedBalance;
m_baseFittedBalance = fittedBalance;
}
// Нормированный баланс стратегии
double FittedBalance() const {
return m_fittedBalance;
}
// Масштабирование нормированного баланса
void Scale(double p_scale) {
m_fittedBalance /= p_scale;
}
// Масштабный множитель стратегии
double Scale() const {
return m_baseFittedBalance / m_fittedBalance;
}
// Замена названий символов
virtual bool SymbolsReplace(CHashMap<string, string> &p_symbolsMap) {
return true;
}
};
//+------------------------------------------------------------------+
//| Конструктор |
//+------------------------------------------------------------------+
CVirtualStrategy::CVirtualStrategy() :
m_fixedLot(0.01),
m_ordersTotal(0) {
FittedBalance(10000);
}
//+------------------------------------------------------------------+
//| Подсчет количества открытых виртуальных позиций и ордеров |
//+------------------------------------------------------------------+
void CVirtualStrategy::CountOrders() {
m_ordersTotal = 0;
FOREACH(m_orders) m_ordersTotal += m_orders[i].IsOpen();
}
//+------------------------------------------------------------------+
//| Обработчик события открытия виртуальной позиции (ордера) |
//+------------------------------------------------------------------+
void CVirtualStrategy::OnOpen(CVirtualOrder *o) {
CountOrders();
}
//+------------------------------------------------------------------+
//| Обработчик события закрытия виртуальной позиции (ордера) |
//+------------------------------------------------------------------+
void CVirtualStrategy::OnClose(CVirtualOrder *o) {
CountOrders();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double CVirtualStrategy::Profit() const {
double profit = 0;
FOREACH(m_orders) profit += m_orders[i].Profit();
return profit;
}
double CVirtualStrategy::ClosedProfit() const {
double profit = 0;
FOREACH(m_orders) profit += m_orders[i].ClosedProfit();
return profit;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CVirtualStrategy::Close(void) {
FOREACH(m_orders) m_orders[i].Close();
}
//+------------------------------------------------------------------+
//| Сохранение состояния |
//+------------------------------------------------------------------+
void CVirtualStrategy::Save() {
// Сохраняем виртуальные позиции (ордера) стратегии
FOREACH(m_orders) CStorage::Set(i, m_orders[i]);
}
//+------------------------------------------------------------------+
//| Загрузка состояния |
//+------------------------------------------------------------------+
bool CVirtualStrategy::Load() {
bool res = true;
// Загружаем виртуальные позиции (ордера) стратегии
res = CStorage::Get(this.Hash(), m_orders);
return res;
}
//+------------------------------------------------------------------+