← К каталогу
Исходный код · ID 4374

XMCBasketManager

xmcbasketmanager.mqh
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Библиотека XMCBasketManager — это модуль для управления корзиной торговых позиций в MetaTrader 4. Она отслеживает состояние корзины, текущую прибыль, количество слоёв покупок и продаж, а также реализует логику выходов по синтетическому доллар-трейлу и развороту адаптивного SuperTrend.

Класс CXMCBasketManager предоставляет методы инициализации, обновления состояния по открытым ордерам, определения системного состояния (разведка, тренд, восстановление, локдаун) и проверки условий выхода. Поддерживается закрытие всех управляемых ордеров или только свинг-сделок.

Библиотека работает в связке с AdaptiveSuperTrendEngine, OrderExecution и XMCTradeUtils. Данные считываются из открытых ордеров с фильтрацией по magic number и управляемым символам.

Состав библиотеки

Классов: 1 · методов: 16 · конструкторов: 0 · деструкторов: 0 · отдельных функций: 0

Классы
Класс class CXMCBasketManager

Класс управления корзиной торговых позиций

Методы и конструкторы
Метод · CXMCBasketManager void Init(string &symbols[], int count, int magic)

Инициализация корзины: список символов, количество и magic number

Метод · CXMCBasketManager void SetTradeSymbol(string symbol)

Установка текущего торгового символа

Метод · CXMCBasketManager void Refresh()

Обновление состояния корзины по открытым ордерам

Метод · CXMCBasketManager ENUM_SYSTEM_STATE GetSystemState(int maxLayers, double maxVolFactor, double atrValue, int atrPeriod, int atrSmoothing, int adxPeriod, int adxStrength)

Определение системного состояния на основе количества слоёв и волатильности

Метод · CXMCBasketManager bool CheckSyntheticExit(double trailStart, double trailDist, bool astExitEnabled, bool astExitRequireProfit, double astExitMinProfit, CAdaptiveSuperTrend &ast[], int astCount, ENUM_TIMEFRAMES astTF)

Проверка условий синтетического выхода по доллар-трейлу и развороте SuperTrend

Метод · CXMCBasketManager void CloseAll()

Закрытие всех управляемых ордеров

Метод · CXMCBasketManager void CloseSwingTrades()

Закрытие свинг-сделок в корзине

Метод · CXMCBasketManager void LogExit(string reason)

Запись информации о выходе в лог

Метод · CXMCBasketManager void ResetState()

Сброс всех параметров состояния корзины

Метод · CXMCBasketManager int GetBuyLayers()

Получение количества слоёв покупок

Метод · CXMCBasketManager int GetSellLayers()

Получение количества слоёв продаж

Метод · CXMCBasketManager double GetLastBuyPrice()

Получение цены последней покупки

Метод · CXMCBasketManager double GetLastSellPrice()

Получение цены последней продажи

Метод · CXMCBasketManager double GetCurrentProfit()

Получение текущей прибыли корзины

Метод · CXMCBasketManager double GetSwingProfit()

Получение прибыли свинг-сделок

Метод · CXMCBasketManager 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 и перейдите к оплате.

Стоимость полного кода
499,30₽ ≈ $6.10