Общайтесь с разработчиками через Сервисдеск! - страница 171

 

В справочнике MQL5 в качестве примера приводится

MqlTradeRequest request={0};

При компиляции получаю ошибку "cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'"

Смысл ошибки мне понятен, но раньше (до билда от 04/06/20121) такая конструкция работала. Или это только у меня так?

 
Malik Arykov:

В справочнике MQL5 в качестве примера приводится

но при компиляции получаю ошибку "cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'"

Смысл ошибки мне понятен, но раньше (до билда от 04/06/20121) такая конструкция работала. Или это только у меня так?

у всех так.

 
Malik Arykov:

В справочнике MQL5 в качестве примера приводится

но при компиляции получаю ошибку "cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'"

Смысл ошибки мне понятен, но раньше (до билда от 04/06/20121) такая конструкция работала. Или это только у меня так?

Справка немного устарела

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

Ilyas, 2021.05.28 18:18

Мы расширяем инициализирующие последовательности "{ ... }", в ближайшем билде будет разрешено использовать любое выражение, а не только константное.

Вместо с этим изменением, появится и граничение на использование констант для перечислений (как для обычного выражения): если константа не входит в перечисление, то будет выдана соответствующая ошибка.

Анализ существующих кодов показал, что часто неправильно используется последовательность из одного нуля - "{0}"

Например так:

MqlTradeRequest request={0};


Такая запись означает, выставить значение ноль для первого поля структуры и обнулить остальные поля.

Для приведённой выше строки кода, по новым правилам, будет выдана ошибка, т.к. первое поле имеет тип ENUM_TRADE_REQUEST_ACTIONS, перечисление, в котором отсутствует значение "0"

cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'


Правильно будет так:

MqlTradeRequest request={};

 
Анализ существующих кодов показал, что часто неправильно используется последовательность из одного нуля - "{0}"
Если источник кодов - кодебаза, то она не репрезентативна. Имхо.
 
Vladimir Karputov:

MqlTradeRequest request={};

Не катит, поскольку значения полей - случайные числа (абракадабра). Из-за этого запрос на сервер не проходит или возвращается с ошибкой. Пришлось приделать костыли

void UTrade::ResetStruct(MqlTradeRequest &request) {
    request.magic = 0;
    request.order = 0;
    request.stoplimit = 0;
    request.sl = 0;
    request.tp = 0;
    request.deviation = 0;
    request.type = 0;
    request.type_filling = 0;
    request.type_time = 0;
    request.position = 0;
    request.position_by = 0;
    request.expiration = 0;
}
Мне только интересно, почему так мало было шума. Если многие торговали бы на МТ5, то ор подняли бы такой, что правка пришла бы моментально. А так ждем очередного билда.
 
Malik Arykov:

Не катит, поскольку значения полей - случайные числа (абракадабра). Из-за этого запрос на сервер не проходит или возвращается с ошибкой. Пришлось приделать костыли

Мне только интересно, почему так мало было шума. Если многие торговали бы на МТ5, то ор подняли бы такой, что правка пришла бы моментально. А так ждем очередного билда.
Потратить пол дня на изготовление костылей, это жесть……… А надо-то всего лишь прочесть документацию.
Документация по MQL5: Общие функции / ZeroMemory
Документация по MQL5: Общие функции / ZeroMemory
  • www.mql5.com
ZeroMemory - Общие функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Malik Arykov:

Не катит, поскольку значения полей - случайные числа (абракадабра).

Пример, пожалуйста.

 
fxsaber:

Пример, пожалуйста.

Шайтан, сейчас все работает как надо ;-)
Но сейчас торги закрыты, проверю когда начнутся.
Однако с какого перепуга я приделывал костыли. Копнул логи  от 07.06.2021 и вот доказательства
У меня все ходы записаны (с) 12 стульев ;-)

GK      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     // UTrade::Dump / ExecuteTradeAction / MqlTradeRequest
FI      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     action= TRADE_ACTION_PENDING
PR      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     type= ORDER_TYPE_SELL_STOP
RD      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     symbol= EURGBP
HS      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     volume= 0.01
PF      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     price= 0.85845
RQ      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     SL= 0.0
PI      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     TP= 0.85745
OM      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     deviation= 5
GI      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     comment= SOP/M5/SS/C2/Br/Br/Br
FM      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     magic= 17856396970583687158
EK      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     order= 10312962290177016427
HN      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     position= 140725102556237
NI      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     position_by= 2662605455360
DM      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     stoplimit= 1.313556840344213e-311
LN      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     type_filling= ORDER_FILLING_FOK
HG      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     type_time= ORDER_TIME_DAY
NQ      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     expiration= wrong datetime
EJ      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     // UTrade::Dump / ExecuteTradeAction / MqlTradeCheckResult
JG      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     retcode= 10013
IN      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     balance= 0.0
PI      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     equity= 0.0
GP      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     profit= 0.0
MK      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     margin= 0.0
NN      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     margin_free= 0.0
LH      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     margin_level= 0.0
DN      0       14:02:55.854    SendOrderByPlan (EURGBP,M5)     comment= Invalid request
IE      3       14:02:55.854    Message EURGBP SellStop 
PH      3       14:02:55.854    Message volume=0.01
RN      3       14:02:55.854    Message price=0.85845
ND      3       14:02:55.854    Message SL=0.00000
RJ      3       14:02:55.854    Message TP=0.85745
GL      3       14:02:55.854    Message comment=SOP/M5/SS/C2/Br/Br/Br
KH      3       14:02:55.854    Message OrderCheck rcode=10013 Invalid request
 

В стандартной библиотеке обнаружил архаичный и приводящий к неверному результату метод преобразования ENUM to String.

//| Converting value of ENUM_APPLIED_PRICE into string               |
//+------------------------------------------------------------------+
string CIndicator::PriceDescription(const int val) const
  {
   string str;
//--- array for conversion of ENUM_APPLIED_PRICE to string
   static string _a_str[]={"Close","Open","High","Low","Median","Typical","Weighted"};
//--- check
   if(val<0)
      return("Unknown");
//---
   if(val<7)
      str=_a_str[val];
   else
     {
      if(val<10)
         str="PriceUnknown="+IntegerToString(val);
      else
         str="AppliedHandle="+IntegerToString(val);
     }
//---
   return(str);
  }