Помогите разобраться с классами

 
class Profit
  {
  
  public:
   string            sym ;
   double            profit;
   
   Profit() 
   {
      sym = "EURUSD";
      profit = 10.2;
   
   }
   
  };

class Mag 
     {
     public:
      int               mag;
      
      Mag()
      {
         mag = 102048;
      }
     };
     
     
     
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void  OnStart()
  {
   
        Profit  pr;
   //как связать эти 2 класса, чтоб вызвать типа 
        
        Print (pr.profit.mag);
        Print (pr.sym.mag);
   
   
  }

собственно вопрос в коде 

 
Dmitiry Ananiev:

собственно вопрос в коде 

Точка говорит нам буквально следующее: то, что справа от неё, является членом класса\структуры слева от неё. mag не может быть членом строки или дабла даже через перегрузку (точку нельзя перегрузить).

Поскольку множественное наследование не поддерживается в мкл, можно сделать класс Mag членом Profit (или унаследованного от Profit класса).

 
SeriousRacoon:

Точка говорит нам буквально следующее: то, что справа от неё, является членом класса\структуры слева от неё. mag не может быть членом строки или дабла даже через перегрузку (точку нельзя перегрузить).

Поскольку множественное наследование не поддерживается в мкл, можно сделать класс Mag членом Profit (или унаследованного от Profit класса).

А пример можно ?
 
class Mag{
     public:
        int               mag;
};

class Profit{
   public:
        Mag            sym ;
         Mag            profit;
};
Но кажется все должно быть совсем не так. А как- неизвестно, потому что неизвестно что нужно.
 
#property script_show_inputs

//---
input datetime from_date   = __DATE__ - 60 * 60 * 24 * 27;
input datetime to_date     = __DATE__ + 60 * 60 * 24 * 1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class Profit
  {
public:
   string            sym ;
   double            profit;
   int               mag[];
                     Profit()
     {
      sym = "";
      profit = 0 ;
     }
  };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+


Profit p[];

double sum = 0;
void OnStart()
  {

   HistorySelect(from_date, to_date);
   ulong    ticket = 0;
   long     position_id = 0;
   string sym = "";
   for(int i = HistoryDealsTotal() - 1; i >= 0 ; i--)
     {
      ticket = HistoryDealGetTicket(i);
      //Print (ticket);
      sym = HistoryDealGetString(ticket, DEAL_SYMBOL);
      long mag1 = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      bool flag = false;
      for(int y = ArraySize(p) - 1; y >= 0; y--)
        {
         if(p[y].sym == sym)
           {
            flag = true;
            p[y].profit += HistoryDealGetDouble(ticket, DEAL_COMMISSION) + HistoryDealGetDouble(ticket, DEAL_SWAP) + HistoryDealGetDouble(ticket, DEAL_PROFIT);
            break;
           }
        }
      if(!flag)
        {
         ArrayResize(p, ArraySize(p) + 1);
         p[ArraySize(p) - 1].sym = sym;
         p[ArraySize(p) - 1].profit +=  HistoryDealGetDouble(ticket, DEAL_COMMISSION) + HistoryDealGetDouble(ticket, DEAL_SWAP) + HistoryDealGetDouble(ticket, DEAL_PROFIT);
        }

     }
   double sum1 = 0;

   for(int i = 0 ; i < ArraySize(p) - 1; i++)
     {
      sum1 += p[i].profit;
      Print(p[i].sym, " -> ", DoubleToString(p[i].profit, 2)) ;
     }
   Print("<--- Profit for all Symbols --->  ", DoubleToString(sum1, 2));

  }
//+------------------------------------------------------------------+

Вообщем то весь код. 
ОН высчитывает прибыль по каждому символу. 
Хотелось бы еще по каждому символу получить детализацию по всем магикам и желательно за один проход по всем сделкам. 
Как это сделать ? 
При этом количество символов как и количество магиков неизвестное, но символов и магиков ну скажем не более 20-ти. 

 

Чтобы за один проход, надо хэш-мэп использовать, но это не рационально, вряд ли будет какой-то выигрыш, скорее наоборот. 

Рационально - написать функцию с двумя параметрами: символом и магиком. Но универсально - если символ пустой, это значит все символы, если магик -1 - то все магики.

Еще одну функцию - собирающую из истории все пары магик-символ.

***

Или так: пройти один раз по истории, собрать в массив все сделки (массив структур с полями: символ, магик, профит). Потом из этого массива выбирать по нудному символу и магику.
 

Я бы использовал структуру.

Одно поле - магик, другое - профит.

Или даже класс, содержащий эти два класса внутри.

 
Georgiy Merts:

Я бы использовал структуру.

Одно поле - магик, другое - профит.

Или даже класс, содержащий эти два класса внутри.

А как сделать класс с двумя классами внутри ? 

 
Dmitiry Ananiev:

А как сделать класс с двумя классами внутри ? 

Простая структура

struct pData{
  datetime _OpenTime;       // Время последней открытой
  int      _Count;          // Общее количество
  int      _CountComm;      // Количество по комментарию
  int      _OpenType;       // Тип последней открытой
  double   _OpenPrice;      // Цена последней открытой
  double   _StopLoss;       // Цена StopLoss
  double   _TakeProfit;     // Цена TakeProfit
  double   _Profit;         // Profit последней открытой
  double   _AllProfit;      // Общий текущий Profit
  double   _Lot;            // Лот последней открытой
  double   _Lots;           // Общий лот
  double   _NearestDist;    // Дистанция до ближайшей от цены (пп)
  double   _LongestDist;    // Дистанция до дальней от цены (пп)
  bool     _TradeToDay;     // Флаг торгов сегодня
};

struct sPos{
  pData Buy;  // Buy
  pData Sell; // Sell
  pData BS;   // Buy/Sell
};

sPos _GetP;

//==
  ...
     // BUY
     if(__Type==OP_BUY) {
       _GetP.Buy._Count++; // Количество
       _GetP.Buy._Lots+=__OL; // Общий лот BUY
       _GetP.Buy._Profit=__OPR; // Profit последней открытой позиции
       ...
 
Dmitiry Ananiev:

А как сделать класс с двумя классами внутри ? 

Рано Вам ещё это. Для начала книжки почитайте.

Причина обращения: