class CXMCBasketManager
Класс управления корзиной торговых позиций
Сообщите нам, если считаете, что материал размещён без разрешения.
Обращение по товару «xmcbasketmanager.mqh» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
Библиотека XMCBasketManager — это модуль для управления корзиной торговых позиций в MetaTrader 4. Она отслеживает состояние корзины, текущую прибыль, количество слоёв покупок и продаж, а также реализует логику выходов по синтетическому доллар-трейлу и развороту адаптивного SuperTrend.
Класс CXMCBasketManager предоставляет методы инициализации, обновления состояния по открытым ордерам, определения системного состояния (разведка, тренд, восстановление, локдаун) и проверки условий выхода. Поддерживается закрытие всех управляемых ордеров или только свинг-сделок.
Библиотека работает в связке с AdaptiveSuperTrendEngine, OrderExecution и XMCTradeUtils. Данные считываются из открытых ордеров с фильтрацией по magic number и управляемым символам.
Классов: 1 · методов: 16 · конструкторов: 0 · деструкторов: 0 · отдельных функций: 0
class CXMCBasketManager
Класс управления корзиной торговых позиций
void Init(string &symbols[], int count, int magic)
Инициализация корзины: список символов, количество и magic number
void SetTradeSymbol(string symbol)
Установка текущего торгового символа
void Refresh()
Обновление состояния корзины по открытым ордерам
ENUM_SYSTEM_STATE GetSystemState(int maxLayers, double maxVolFactor, double atrValue, int atrPeriod, int atrSmoothing, int adxPeriod, int adxStrength)
Определение системного состояния на основе количества слоёв и волатильности
bool CheckSyntheticExit(double trailStart, double trailDist, bool astExitEnabled, bool astExitRequireProfit, double astExitMinProfit, CAdaptiveSuperTrend &ast[], int astCount, ENUM_TIMEFRAMES astTF)
Проверка условий синтетического выхода по доллар-трейлу и развороте SuperTrend
void CloseAll()
Закрытие всех управляемых ордеров
void CloseSwingTrades()
Закрытие свинг-сделок в корзине
void LogExit(string reason)
Запись информации о выходе в лог
void ResetState()
Сброс всех параметров состояния корзины
int GetBuyLayers()
Получение количества слоёв покупок
int GetSellLayers()
Получение количества слоёв продаж
double GetLastBuyPrice()
Получение цены последней покупки
double GetLastSellPrice()
Получение цены последней продажи
double GetCurrentProfit()
Получение текущей прибыли корзины
double GetSwingProfit()
Получение прибыли свинг-сделок
int GetSwingCount()
Получение количества свинг-сделок
#ifndef __XMCBASKETMANAGER_MQH__
#define __XMCBASKETMANAGER_MQH__
#include <AdaptiveSuperTrendEngine.mqh>
#include <OrderExecution.mqh>
#include <XMCTradeUtils.mqh>
enum ENUM_SYSTEM_STATE
{
STATE_SCOUT,
STATE_TREND,
STATE_RECOVERY,
STATE_LOCKDOWN
};
class CXMCBasketManager
{
private:
string m_symbols[6];
int m_count;
int m_magic;
string m_tradeSymbol;
int m_buyLayers;
int m_sellLayers;
double m_lastBuyPrice;
double m_lastSellPrice;
double m_currentProfit;
double m_swingProfit;
int m_swingCount;
double m_peakProfit;
bool m_trailingActive;
public:
void Init(string &symbols[], int count, int magic)
{
m_count = MathMin(count, 6);
m_magic = magic;
for(int i = 0; i < 6; i++)
{
if(i < m_count)
m_symbols[i] = symbols[i];
else
m_symbols[i] = "";
}
ResetState();
}
void SetTradeSymbol(string symbol) { m_tradeSymbol = symbol; }
void Refresh()
{
m_buyLayers = 0;
m_sellLayers = 0;
m_lastBuyPrice = 0.0;
m_lastSellPrice = 0.0;
m_currentProfit = 0.0;
m_swingProfit = 0.0;
m_swingCount = 0;
datetime latest_buy_time = 0;
datetime latest_sell_time = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS))
continue;
if(OrderMagicNumber() != m_magic)
continue;
if(!XMC_IsManagedSymbol(OrderSymbol(), m_symbols, m_count))
continue;
double profit =
OrderProfit() +
OrderSwap() +
OrderCommission();
m_currentProfit += profit;
if(StringFind(OrderComment(), "SWING") >= 0)
{
m_swingProfit += profit;
m_swingCount++;
}
if(OrderSymbol() != m_tradeSymbol)
continue;
if(OrderType() == OP_BUY)
{
m_buyLayers++;
if(OrderOpenTime() > latest_buy_time)
{
latest_buy_time = OrderOpenTime();
m_lastBuyPrice = OrderOpenPrice();
}
}
else if(OrderType() == OP_SELL)
{
m_sellLayers++;
if(OrderOpenTime() > latest_sell_time)
{
latest_sell_time = OrderOpenTime();
m_lastSellPrice = OrderOpenPrice();
}
}
}
}
ENUM_SYSTEM_STATE GetSystemState(
int maxLayers,
double maxVolFactor,
double atrValue = 0.0,
int atrPeriod = 14,
int atrSmoothing = 20,
int adxPeriod = 14,
int adxStrength = 25)
{
if(m_buyLayers >= maxLayers || m_sellLayers >= maxLayers)
return STATE_LOCKDOWN;
double atr = atrValue;
if(atr <= 0.0)
atr = iATR(m_tradeSymbol, 0, atrPeriod, 0);
double avg_atr = iATR(m_tradeSymbol, 0, atrSmoothing, 1);
if(avg_atr > 0.0 && atr > avg_atr * maxVolFactor)
return STATE_LOCKDOWN;
if(m_buyLayers > 1 || m_sellLayers > 1)
return STATE_RECOVERY;
if(m_buyLayers == 1 || m_sellLayers == 1)
{
if(iADX(m_tradeSymbol, 0, adxPeriod, PRICE_CLOSE, MODE_MAIN, 0) >
adxStrength)
{
return STATE_TREND;
}
}
return STATE_SCOUT;
}
bool CheckSyntheticExit(
double trailStart,
double trailDist,
bool astExitEnabled,
bool astExitRequireProfit,
double astExitMinProfit,
CAdaptiveSuperTrend &ast[],
int astCount,
ENUM_TIMEFRAMES astTF)
{
if(m_currentProfit > m_peakProfit)
m_peakProfit = m_currentProfit;
if(m_currentProfit >= trailStart)
m_trailingActive = true;
if(m_trailingActive &&
m_currentProfit < m_peakProfit - trailDist)
{
LogExit("DollarTrail");
Показано первые 50% кода (символов: 4993)
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.