Ошибки, баги, вопросы - страница 1978

 
fxsaber:

Хром.

в FireFox еще обновленные темы вверху

    и синие слева. попробуйте тот браузер, что был в смартфоне

 
STARIJ:
в FireFox еще обновленные темы вверху

    и синие слева

Все так же и в Хроме. У меня не получается заставить себя автоматически видеть эти сине/серые иконки. А жирный шрифт непрочитанных тем настолько впечатлил, что даже написал об этом.

 
Кто-нибудь уже писал заявку в сервис-деск или может в курсе планов MQ по добавлению friend-ов в MQL? Сильно не хватает.
 

Интересный случай на AcePrime-Demo счетах.

Запускаем советник

// Советник возвращает полностью сформированные торговые запросы (включая ручные)
#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) + 
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) + 
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
         TOSTRING(Result.retcode_external));
}

void OnTradeTransaction(   const MqlTradeTransaction&, const MqlTradeRequest& Request, const MqlTradeResult& Result )
{
  if (Request.action)
  {
    Print(ToString(Request));
    Print(ToString(Result));    
  }
}

И руками пытаемся открыть позицию на любом bo-символе (бинарные опционы). В логе терминала получаем

'3182780': market sell 1.00 XAUUSDbo
'3182780': failed market sell 1.00 XAUUSDbo [Invalid data]

В логе же эксперта такое

Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = XAUUSDbo
Request.volume = 1.0
Request.price = 0.0
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0

Result.retcode = 4
Result.deal = 0
Result.order = 0
Result.volume = 0.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = 
Result.request_id = 9
Result.retcode_external = 0

Проверял, OrderCheck возвращает true. Торговая сессия открыта и т.д. Но MT5 ругается и на ручные и на автоматические запросы одинаково, выдавая retcode = 4. Почему возникает такая ситуация, когда терминал говорит, что все в порядке, а пробуешь и ничего не выходит? Как понять без запросов, что открыть не получится? И что это за четвертый код возврата?

GetLastError() возвращает

ERR_TRADE_SEND_FAILED

4756

Не удалось отправить торговый запрос


Воспроизводится все без проблем.
 

Добрый день.

Мне одному кажется что вот такой код не должен компилироваться (должна быть private member access error)?

class cA;
class cB;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
   //====================
private:
   //====================
   //===============
   //===============
   cB               *B;
   //===============
   //===============
   void              testfunc(void){::Print(__FUNCSIG__);}
   //====================
public:
   //====================
   //===============
   //===============
   void              test(void)
     {
      ::Print(__FUNCSIG__);

      if(::CheckPointer(::GetPointer(this.B))==POINTER_INVALID)return;

      this.B.testfunc();   // Здесь идет вызов private метода объекта B, что вроде как не должно быть возможным
     }
   //===============
   //===============
   void              SetB(cB *const b){this.B=b;}
   //===============
   //===============
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cB  : public cA
  {

  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   cA A;
   cB B;

   A.SetB(&B);
   A.test();

//---
   return(INIT_SUCCEEDED);
  }

В СД говорят что все ок, и так можно... 

 
Andrey Barinov:

Добрый день.

Мне одному кажется что вот такой код не должен компилироваться (должна быть private member access error)?

В СД говорят что все ок, и так можно... 

Согласно правилам MQL экземпляр класса может свободно обращаться к закрытым полям и методам другого экземпляра, если он принадлежит тому же классу, что и первый. Так-как сB наследуется от cA, то cB и есть cA, а следовательно cA может обращаться к любым закрытым методам и полям экземпляра cB, не зависимо от того, где он объявлен.

 
Vasiliy Sokolov:

Согласно правилам MQL экземпляр класса может свободно обращаться к закрытым полям и методам другого экземпляра, если он принадлежит тому же классу, что и первый. Так-как сB наследуется от cA, то cB и есть cA, а следовательно cA может обращаться к любым закрытым методам и полям экземпляра cB, не зависимо от того, где он объявлен.

Спасибо. В документации об этом не встречал. Можете ткнуть носом?
 
Andrey Barinov:
Спасибо. В документации об этом не встречал. Можете ткнуть носом?
В документации этого нет, т.к. является такой своеобразной недокументированной "фичей" языка. Фича очень странная и противоречивая, но тем не менее так сложилось.
 
Andrey Barinov:
Спасибо. В документации об этом не встречал. Можете ткнуть носом?

Это и в C++ так (а MQL строится по образу и подобию C++). Как говорят, приватность C++ - на уровне класса, а не объекта. Иначе было бы невозможно сделать, например, copy-конструктор, без специальных методов getter-ов для всех приватных полей.

 
Stanislav Korotky:

Это и в C++ так

А вы пробовали этот пример в С++ компилировать - или это общие теоретические рассуждения?
Причина обращения: