﻿//+------------------------------------------------------------------+
//|                                                  CustomOrder.mqh |
//|                                  Copyright 2026,MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//| этот файл должен подключаться самым первым в коде советника      |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026,MetaQuotes Ltd."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| класс для маршрутизации приказов                                 |
//| назначение: подмена пользовательского символа на реальный        |
//+------------------------------------------------------------------+
class CustomOrder
  {
private:
   static string     workSymbol;// имя реального символа

public:
   //--- установка символа-заменителя
   static void       setReplacementSymbol(const string replacement)
     {
      workSymbol=replacement;
     }

   //--- отправка торгового запроса
   static bool       OrderSend(MqlTradeRequest &request,MqlTradeResult &result)
     {
      //--- подмена символа в запросе
      if(request.symbol==_Symbol && workSymbol != "")
        {
         request.symbol=workSymbol;

         //--- корректировка цены,если она берется от кастом-символа
         if(request.type==ORDER_TYPE_BUY)
            request.price=SymbolInfoDouble(workSymbol,SYMBOL_ASK);
         else
            if(request.type==ORDER_TYPE_SELL)
               request.price=SymbolInfoDouble(workSymbol,SYMBOL_BID);
        }

      //--- вызов оригинальной функции
      return ::OrderSend(request,result);
     }

   //--- расчет прибыли
   static bool       OrderCalcProfit(ENUM_ORDER_TYPE action,string symbol,double volume,
                                     double price_open,double price_close,double &profit)
     {
      if(symbol==_Symbol && workSymbol != "")
         symbol=workSymbol;

      return ::OrderCalcProfit(action,symbol,volume,price_open,price_close,profit);
     }

   //--- получение строкового свойства позиции
   static string     PositionGetString(ENUM_POSITION_PROPERTY_STRING property_id)
     {
      string res=::PositionGetString(property_id);
      //--- если запрашивается символ позиции,возвращаем имя графика,а не реальный
      if(property_id==POSITION_SYMBOL && res==workSymbol)
         return _Symbol;
      return res;
     }

   //--- получение строкового свойства ордера
   static string     OrderGetString(ENUM_ORDER_PROPERTY_STRING property_id)
     {
      string res=::OrderGetString(property_id);
      if(property_id==ORDER_SYMBOL && res==workSymbol)
         return _Symbol;
      return res;
     }

   //--- выбор позиции по символу
   static bool       PositionSelect(string symbol)
     {
      if(symbol==_Symbol && workSymbol != "")
         return ::PositionSelect(workSymbol);
      return ::PositionSelect(symbol);
     }
  };

//+------------------------------------------------------------------+
//| статическая инициализация                                        |
//+------------------------------------------------------------------+
string CustomOrder::workSymbol="";

//+------------------------------------------------------------------+
//| макроcы для прозрачной интеграции                                |
//| важно: эти макросы переопределяют стандартные вызовы
//+------------------------------------------------------------------+
#define OrderSend(request,result) CustomOrder::OrderSend(request,result)
#define OrderCalcProfit(action,symbol,volume,open,close,profit) CustomOrder::OrderCalcProfit(action,symbol,volume,open,close,profit)
#define PositionGetString(prop) CustomOrder::PositionGetString(prop)
#define OrderGetString(prop) CustomOrder::OrderGetString(prop)
#define PositionSelect(symbol) CustomOrder::PositionSelect(symbol)
//+------------------------------------------------------------------+
