"Перегрузить" — это с другим возвращаемым типом или набором параметров. А что изменилось у вас?
И чего ожидали от вызова?
"Перегрузить" — это с другим возвращаемым типом или набором параметров. А что изменилось у вас?
И чего ожидали от вызова?
да, да, не перегрузил, а overridden,
т.е. я ввел такую функцию в свой класс и теперь
ввместо штатной функции MQL4 будет вызыватся эта моя функция...
точно так же overridden функцию OrderSend(...) и теперь приказ с нужными модификациями будут посылаться
прямо на FIX broker... ну, вы понимаете о чем речь...
да, да, не перегрузил, а overridden,
т.е. я ввел такую функцию в свой класс и теперь
ввместо штатной функции MQL4 будет вызыватся эта моя функция...
точно так же overridden функцию OrderSend(...) и теперь приказ с нужными модификациями будут посылаться
прямо на FIX broker... ну, вы понимаете о чем речь...
Андрей говорит о том, что это не перегрузка. Чтобы перегрузить функцию, нужно, чтобы ее аргументы или возвращаемое значение отличались от имеющейся версии. Вы же этого не сделали. Поэтому и получили такой результат. Вот перегрузка функции:
int MarketInfo(int a, int b) { return a * b; }
При ее вызове возвращается результат умножения a на b, а не штатная MarketInfo.
Андрей говорит о том, что это не перегрузка. Чтобы перегрузить функцию, нужно, чтобы ее аргументы или возвращаемое значение отличались от имеющейся версии. Вы же этого не сделали. Поэтому и получили такой результат. Вот перегрузка функции:
При ее вызове возвращается результат умножения a на b, а не штатная MarketInfo.
игорь, я же и не возвражаю, я штатную функцию просто замещаю своей, вот и все...
да, да, не перегрузил, а overridden,
Я понял. Именно для избежания подобных "ошибок", такие функции лучше вызывать, прямо указывая контекст.
В случае с перегрузкой такой проблемы быть не может, т.к. компилятор сам выберет нужную реализацию.
Я понял. Именно для избежания подобных "ошибок", такие функции лучше вызывать, прямо указывая контекст.
В случае с перегрузкой такой проблемы быть не может, т.к. компилятор сам выберет нужную реализацию.
подожди, андрей, что-то запутали вы меня.
вот у меня мой класс:
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...
подожди, андрей, что-то запутали вы меня.
вот у меня мой класс:
вот вызовы:
вы хотите сказать, что вызваться могут не мои функции, а штатные MQL4 ?
пока что я вижу, что вызываются именно мои функции, хотя, к примеру, OrderModify(...) определена один к одному с OrderModify(...) MQL4...
Согласно справке, все будет работать, как вы хотели.
Но посторонний человек (или вы сами через пол года), посмотрев на этот код, не сможет сказать однозначно, что и откуда вызывается. Зачем писать в таком стиле?
Согласно справке, все будет работать, как вы хотели.
Но посторонний человек (или вы сами через пол года), посмотрев на этот код, не сможет сказать однозначно, что и откуда вызывается. Зачем писать в таком стиле?
Иногда это удобно использовать для полезных сайд-эффектов, например, на этом построена моя библиотека автооптимизации экспертов.
Иногда это удобно использовать для полезных сайд-эффектов, например, на этом построена моя библиотека автооптимизации экспертов.
да, да, удобно и полезно ! практически любая MT4 EA без каких-либо существенных изменений
будет у меня работать с FIX брокером ! можно считать, что это моя реклама..
Иногда это удобно использовать для полезных сайд-эффектов, например, на этом построена моя библиотека автооптимизации экспертов.
да, да, удобно и полезно ! практически любая 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 — своя, кастумная. И в рамках библиотеки (которая, по идее, должна в будущем изучаться и использоваться), как по мне, это очень правильно.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
попыласся перегрузить фукцию, вот она согласно документации
double MarketInfo(
string symbol, // символ инструмента
int type // тип информации
);
описал ее в своем классе, как положено, как выше написано.
но обнаружил, что при вызове
md_LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
вызывается штатная фннкция !
оказалось реально надо такое определение:
double cFunctions::MarketInfo(string s_Symbol,ENUM_MARKETINFO e_Mode)
так, просто, кому-нибудь может пригодиться...