В справочнике MQL5 ошибка или как это следует понимать? - страница 2

 
prostotrader:

И будет ошибка.

Но будут ли исправлять справочник?

Лучше уж поправить и справочник и тип возвращаемого значения функций на ulong. Они не возвращают таких свойств, для которых требуются отрицательные значения.

 
Oleg Remizov:

Лучше уж поправить и справочник и тип возвращаемого значения функций на ulong. Они не возвращают таких свойств, для которых требуются отрицательные значения.

Нет, нельзя ulong т.к могут возвращаться отрицательные числа.

Нужно исправить на 64-битные данные.

 
prostotrader:

Нет, нельзя ulong т.к могут возвращаться отрицательные числа.

Нужно исправить на 64-битные данные.

В каком свойстве?

Там все свойства - это или тикеты, которые строго положительны или ноль если ошибка, либо время, которое тоже положительно, либо перечисления, где члены по умолчанию тоже нумеруются с нуля. 

Список свойств для OrderGetInteger():

ENUM_ORDER_PROPERTY_INTEGER

Идентификатор

Описание

Тип

ORDER_TICKET

Тикет ордера. Уникальное число, которое присваивается каждому ордеру

long

ORDER_TIME_SETUP

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

datetime

ORDER_TYPE

Тип ордера

ENUM_ORDER_TYPE

ORDER_STATE

Статус ордера

ENUM_ORDER_STATE

ORDER_TIME_EXPIRATION

Время истечения ордера

datetime

ORDER_TIME_DONE

Время исполнения или снятия ордера

datetime

ORDER_TIME_SETUP_MSC

Время установки ордера на исполнение в миллисекундах с 01.01.1970

long

ORDER_TIME_DONE_MSC

Время исполнения/снятия ордера в миллисекундах с 01.01.1970

long

ORDER_TYPE_FILLING

Тип исполнения по остатку

ENUM_ORDER_TYPE_FILLING

ORDER_TYPE_TIME

Время жизни ордера

ENUM_ORDER_TYPE_TIME

ORDER_MAGIC

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

long

ORDER_REASON

Причина или источник выставления ордера

ENUM_ORDER_REASON

ORDER_POSITION_ID

Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию. Идентификатор этой позиции и устанавливается исполненному ордеру в этот момент.

long

ORDER_POSITION_BY_ID

Идентификатор встречной позиции для ордеров типа ORDER_TYPE_CLOSE_BY.

long


Список свойств PositionGetInteger():

ENUM_POSITION_PROPERTY_INTEGER

Идентификатор

Описание

Тип

POSITION_TICKET

Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта позиция, следует использовать свойство POSITION_IDENTIFIER.
 

Значение POSITION_TICKET соответствует MqlTradeRequest::position.

long

POSITION_TIME

Время открытия позиции

datetime

POSITION_TIME_MSC

Время открытия позиции в миллисекундах с 01.01.1970

long

POSITION_TIME_UPDATE

Время изменения позиции

datetime

POSITION_TIME_UPDATE_MSC

Время изменения позиции в миллисекундах с 01.01.1970

long

POSITION_TYPE

Тип позиции

ENUM_POSITION_TYPE

POSITION_MAGIC

Magic number для позиции (смотри ORDER_MAGIC)

long

POSITION_IDENTIFIER

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

 

Идентификатор позиции указывается в каждом ордере (ORDER_POSITION_ID) и сделке (DEAL_POSITION_ID), которая ее открыла, изменила или закрыла. Используйте это свойство для поиска ордеров и сделок, связанных с позицией.

 

При развороте позиции в режиме неттинга (единой сделкой in/out) идентификатор позиции POSITION_IDENTIFIER не изменяется. Однако при этом POSITION_TICKET изменяется на тикет ордера, в результате которого произошел разворот. В режиме хеджинга разворот позиции не предусмотрен.

long

POSITION_REASON

Причина открытия позиции

ENUM_POSITION_REASON

 
Магик можно сделать отрицательным, насколько помню... 
 
Denis Kirichenko:
Магик можно делать отрицательным насколько помню... 

Так его возможно установить только в момент отправки торгового запроса. А структура торгового запроса для поля magic имеет тип ulong.

 
Oleg Remizov:

Так его возможно установить только в момент отправки торгового запроса. А структура торгового запроса для поля magic имеет тип ulong.

А дальше зависит от приведение типа при получении значения функцией OrderGetInteger(ORDER_MAGIC).

 
Oleg Remizov:

Так его возможно установить только в момент отправки торгового запроса. А структура торгового запроса для поля magic имеет тип ulong.

Разработчик ответил ведь так:

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

В справочнике MQL5 ошибка или как это следует понимать?

Renat Fatkhullin, 2021.01.21 15:23

Это вы сами делаете приведение, а в наших функциях мы без преобразований записываем и отдаем сырые 64 битные данные.

Поэтому у нас ничего не портится.

 
void OnStart()
  {


   OrdSet(1.20995,(long)-2);
   OrdSet(1.20995,(ulong)25);
   
  }

ulong ticket;

void OrdSet(const double price, long magic){
  ResetLastError();
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  //--- Fill structure
  request.action = TRADE_ACTION_PENDING;
  request.magic  = (ulong)magic;
  request.symbol = Symbol();
  request.volume = 1;
  request.price  = price;
  request.type = ORDER_TYPE_BUY_LIMIT;
  request.comment = "Отложенный ордер...";      
  request.type_filling = ORDER_FILLING_RETURN;
  request.type_time = ORDER_TIME_DAY;
  if(OrderSend(request, result) == true)
  {
    if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE)) 
    {
      ticket = result.order;
      if(OrderSelect(ticket) == true)
      {
        long cur_magic = (long)OrderGetInteger(ORDER_MAGIC);
        Print("Cur magic is: ", cur_magic);
      }  
    } else Print(__FUNCTION__, ": Error: ", GetLastError());
  }
  else Print(__FUNCTION__, ": Order not send! Error: ", GetLastError());
}


void OrdSet(const double price, ulong magic){
  ResetLastError();
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  //--- Fill structure
  request.action = TRADE_ACTION_PENDING;
  request.magic  = (ulong)magic;
  request.symbol = Symbol();
  request.volume = 1;
  request.price  = price;
  request.type = ORDER_TYPE_BUY_LIMIT;
  request.comment = "Отложенный ордер...";      
  request.type_filling = ORDER_FILLING_RETURN;
  request.type_time = ORDER_TIME_DAY;
  if(OrderSend(request, result) == true)
  {
    if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE)) 
    {
      ticket = result.order;
      if(OrderSelect(ticket) == true)
      {
        ulong cur_magic = (ulong)OrderGetInteger(ORDER_MAGIC);
        Print("Cur magic is: ", cur_magic);
      }  
    } else Print(__FUNCTION__, ": Error: ", GetLastError());
  }
  else Print(__FUNCTION__, ": Order not send! Error: ", GetLastError());
}

В одном варианте магик long, в другом - ulong. В обеих случаях заполнение структуры выполняется приведение к типу ulong, а при получения значения функцией  OrderGetInteger(ORDER_MAGIC) выполняется обратное приведение к изначальному типу. И все данные на месте в том виде, в каком были.   
 
Dmitry Fedoseev:
В одном варианте магик long, в другом - ulong. В обеих случаях заполнение структуры выполняется приведение к типу ulong, а при получения значения функцией  OrderGetInteger(ORDER_MAGIC) выполняется обратное приведение к изначальному типу. И все данные на месте в том виде, в каком были.   

Попробуйте подставить магик = 18446744073709551615, там, где Вы берете long

 
prostotrader:

Попробуйте подставить магик = 18446744073709551615, там, где Вы берете long

long не может быть таким большим. Надо изначально определиться, каким магиком хотите пользоваться, в соответствующем диапазоне и использоваться значения.

Тем не менее, если пытаетесь загонят ulong  в long, чтобы потом получить исходное значение надо сделать обратное приведение, -1 как раз преобразуется в ULONG_MAX