интересная ошибка...

 

попыласся перегрузить фукцию, вот она согласно документации

double  MarketInfo(
   string           symbol,     // символ инструмента
   int              type        // тип информации
   );

описал ее в своем классе, как положено, как выше написано.

но обнаружил, что при вызове

   md_LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);


вызывается штатная фннкция !

оказалось реально надо такое определение:

double cFunctions::MarketInfo(string s_Symbol,ENUM_MARKETINFO e_Mode)

так, просто, кому-нибудь может пригодиться...



 

"Перегрузить" — это с другим возвращаемым типом или набором параметров. А что изменилось у вас?

И чего ожидали от вызова?

 
Andrey Khatimlianskii:

"Перегрузить" — это с другим возвращаемым типом или набором параметров. А что изменилось у вас?

И чего ожидали от вызова?


да, да, не перегрузил, а overridden,

т.е. я  ввел такую функцию в свой класс  и теперь

ввместо штатной функции MQL4 будет вызыватся эта моя функция...

точно так же overridden функцию OrderSend(...) и теперь приказ с нужными модификациями будут посылаться

прямо на FIX broker... ну, вы понимаете о чем речь...

 
Denis Sartakov:

да, да, не перегрузил, а overridden,

т.е. я  ввел такую функцию в свой класс  и теперь

ввместо штатной функции MQL4 будет вызыватся эта моя функция...

точно так же overridden функцию OrderSend(...) и теперь приказ с нужными модификациями будут посылаться

прямо на FIX broker... ну, вы понимаете о чем речь...


Андрей говорит о том, что это не перегрузка. Чтобы перегрузить функцию, нужно, чтобы ее аргументы или возвращаемое значение отличались от имеющейся версии. Вы же этого не сделали. Поэтому и получили такой результат. Вот перегрузка функции:

int MarketInfo(int a, int b)
{
   return a * b;
}

При ее вызове возвращается результат умножения a на b, а не штатная MarketInfo.

 
Ihor Herasko:

Андрей говорит о том, что это не перегрузка. Чтобы перегрузить функцию, нужно, чтобы ее аргументы или возвращаемое значение отличались от имеющейся версии. Вы же этого не сделали. Поэтому и получили такой результат. Вот перегрузка функции:

При ее вызове возвращается результат умножения a на b, а не штатная MarketInfo.


игорь, я же и не возвражаю, я штатную функцию просто замещаю своей, вот и все...

 
Denis Sartakov:

да, да, не перегрузил, а overridden,

Я понял. Именно для избежания подобных "ошибок", такие функции лучше вызывать, прямо указывая контекст.

В случае с перегрузкой такой проблемы быть не может, т.к. компилятор сам выберет нужную реализацию.

 
Andrey Khatimlianskii:

Я понял. Именно для избежания подобных "ошибок", такие функции лучше вызывать, прямо указывая контекст.

В случае с перегрузкой такой проблемы быть не может, т.к. компилятор сам выберет нужную реализацию.


подожди, андрей, что-то запутали вы меня.

вот у меня мой класс:

class cFunctions
{
public:
   cFunctions();  
   ~cFunctions();
   
   void Run();
   string ms_EA_Name;
   bool   mb_InitSucceeded;
//+------------------------------------------------------------------+
   //
   int    AccountNumber();
   string AccountName();
   int    AccountLeverage();
   double AccountBalance();
   double AccountEquity();
   //
   datetime TimeCurrent();
   double   MarketInfo(string s_Symbol,ENUM_MARKETINFO e_Mode);
   double   Ask;
   double   Bid;
   double   Point;
   int      Digits;
   bool     RefreshRates();
   //
   int  OrdersTotal();
   int  OrderSend(string      symbol,              
                  int         cmd,                 
                  double      volume,              
                  double      price,               
                  int         slippage,            
                  double      stoploss,            
                  double      takeprofit,          
                  string      comment,        
                  int         magic,             
                  datetime    expiration,        
                  color       arrow_color, 
                  int         TTL, 
                  TimeInForce tf,
                  double      stoplimitPrice
                  );
   bool  OrderModify(int        ticket,  
                     double     price,       
                     double     stoploss,    
                     double     takeprofit,  
                     datetime   expiration,  
                     color      arrow_color 
                    );   
   bool  OrderDelete(int        ticket,     
                     color      arrow_color 
                    );
   bool  OrderClose(int ticket,      
                    double     lots,        
                    double     price,       
                    int        slippage,    
                    color      arrow_color  
                   );
   //               
}

вот  вызовы:

bool cFunctions::_OpenOrder(int i)
{
   while(IsTradeContextBusy())
   {
   }
   ResetLastError();
   color  cl_Color       = mia_OrderType[i] == OP_BUY ? clrDodgerBlue : clrRed;
   int    i_SlippagePips = pi_SlippagePips;
   string s_Message;
   
   mia_OrderTicket[i]= OrderSend(msa_OrderSymbol    [i],
                              mia_OrderType         [i],
                              mda_OrderLots         [i],
                              mda_OrderOpenPrice    [i], i_SlippagePips,
                              mda_OrderStopLoss     [i],
                              mda_OrderTakeProfit   [i],
                              msa_OrderComment      [i],
                              mia_OrderMagicNumber  [i],
                              mdta_OrderExpiration  [i],
                              cl_Color);
   if (mia_OrderTicket[i] < 0)
   {
      int i_LastError = GetLastError();
      switch(mia_OrderType[i])
      {
         case OP_BUY:       s_Message = "Buy Order open error. Error code = "       + i_LastError + " : " + ErrorDescription(i_LastError); break;
         case OP_SELL:      s_Message = "Sell Order open error. Error code = "      + i_LastError + " : " + ErrorDescription(i_LastError); break;
         case OP_BUYSTOP:   s_Message = "BuyStop Order open error. Error code = "   + i_LastError + " : " + ErrorDescription(i_LastError); break;
         case OP_BUYLIMIT:  s_Message = "BuyLimit Order open error. Error code = "  + i_LastError + " : " + ErrorDescription(i_LastError); break;
         case OP_SELLSTOP:  s_Message = "SellStop Order open error. Error code = "  + i_LastError + " : " + ErrorDescription(i_LastError); break;
         case OP_SELLLIMIT: s_Message = "SellLimit Order open error. Error code = " + i_LastError + " : " + ErrorDescription(i_LastError); break;
      }
      Print(s_Message);
      PlaySound("alert.wav");
      
      if (i_LastError == ERR_NOT_ENOUGH_MONEY)
      {
         mb_OpenBuy  = false;;
         mb_OpenSell = false;
      }
      
      if (i_LastError == ERR_MARKET_CLOSED)
      {
         mb_OpenBuy  = false;;
         mb_OpenSell = false;
      }
      return(false);
   }
   s_Message = mia_OrderType[i] == OP_BUY ? "Buy  Order was opened. Ticket = " + mia_OrderTicket[i] + " Order comment = " + msa_OrderComment[i]
                                          : "Sell Order was opened. Ticket = " + mia_OrderTicket[i] + " Order comment = " + msa_OrderComment[i];
   PlaySound("ok.wav");
   return(true);
}  
//+------------------------------------------------------------------+
bool cFunctions::_ModifyOrder(int i)
{
  while(IsTradeContextBusy())
   {
   }
   ResetLastError();
   if (OrderModify(mia_OrderTicket   [i],
                   mda_OrderOpenPrice [i],
                   mda_OrderStopLoss  [i],
                   mda_OrderTakeProfit[i],
                   0,
                   clrWhite
                   )
      )
   {
      return(true);
   }
   
   int i_LastError = GetLastError();
   Print("Order modify error. Ticket =",mia_OrderTicket [i]," Error code = ",i_LastError," : ",ErrorDescription(i_LastError));
   return(false);
}
//+------------------------------------------------------------------+

вы хотите сказать, что вызваться могут не мои функции, а штатные MQL4  ?

пока что я вижу, что вызываются именно мои функции, хотя, к примеру, OrderModify(...) определена один к одному с OrderModify(...) MQL4...

 
Denis Sartakov:

подожди, андрей, что-то запутали вы меня.

вот у меня мой класс:

вот  вызовы:

вы хотите сказать, что вызваться могут не мои функции, а штатные MQL4  ?

пока что я вижу, что вызываются именно мои функции, хотя, к примеру, OrderModify(...) определена один к одному с OrderModify(...) MQL4...

Согласно справке, все будет работать, как вы хотели.

Но посторонний человек (или вы сами через пол года), посмотрев на этот код, не сможет сказать однозначно, что и откуда вызывается. Зачем писать в таком стиле?

 
Andrey Khatimlianskii:

Согласно справке, все будет работать, как вы хотели.

Но посторонний человек (или вы сами через пол года), посмотрев на этот код, не сможет сказать однозначно, что и откуда вызывается. Зачем писать в таком стиле?

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

 
Stanislav Korotky:

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


да, да, удобно и полезно !  практически любая MT4 EA  без каких-либо существенных изменений

будет у меня работать с FIX брокером ! можно считать, что это моя реклама..

 
Stanislav Korotky:

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

Denis Sartakov:

да, да, удобно и полезно !  практически любая MT4 EA  без каких-либо существенных изменений

Я имел в виду лишь явное указание контекста вызова внутри библиотеки, как это делает fxsaber:

      if (time > 0)
      {
        this.TextPrices.SetProperty(OBJPROP_TIME, (int)time);
        this.TextPrices.SetProperty(OBJPROP_PRICE, (Tick.bid + Tick.ask) / 2);

        const double point = ::SymbolInfoDouble(::ChartSymbol(this.Chart), SYMBOL_POINT);

        this.TextPrices = CHARTOBJECT::TimeToString(Tick.time, TIME_SECONDS) + " (" + ::DoubleToString((Tick.ask - Tick.bid) / point, 0) + ")";
      }


По такому коду сразу видно, что вызываемая TimeToString — своя, кастумная. И в рамках библиотеки (которая, по идее, должна в будущем изучаться и использоваться), как по мне, это очень правильно.

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