Типичные ошибки и способы их устранения при работе с торговым окружением - страница 9

 
Algotrader18:

Добрый день!

У меня аналогичный вопрос ко всем и , в первую очередь, к fxsaber.
На первый взгляд, вопрос примитивный, но никак не могу найти на него ответ.
Вот здесь https://www.mql5.com/ru/forum/6343/page939 мне сказали "Попробуй поискать, fxsaber когда-то бился над этой проблемой. Что получилось я не знаю, не интересовался." поэтому решил спросить Вас.

Вопрос такой. Открываю позицию и хочу вывести на печать содержание MqlTradeResult вот так:

retcode, order и volume выводятся, а deal и price всегда нули.
Подскажите, пожалуйста, что делаю не так и как получить доступ (для начала хотя бы вывести через Print) к содержимому структуры  result?

Может так?

//+------------------------------------------------------------------+
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//---
   request.action   = TRADE_ACTION_DEAL;    // type of trade operation
   request.symbol   = Pair1;                // symbol
   request.volume   = lots;                 // volume of lot
   request.type     = oper;                 // order type
   request.price    = priceOpen;            // price for opening
   request.deviation= Slippage;             // allowed deviation from the price
   request.magic    = magic;   
//---
   if(OrderSend(request,result))
     {
      Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
      Print ("deal = " +IntegerToString (result.deal) + "; ");
      Print ("order = " +IntegerToString (result.order) + "; "); 
      Print ("volume = " +DoubleToString (result.volume) + "; ");  
      Print ("price = " +DoubleToString (result.price) + "; ");
     }
   else
     {
      // Здесь действия при ошибке открытия
     }
//+------------------------------------------------------------------+
 
Algotrader18:

Открываю позицию и хочу вывести на печать содержание MqlTradeResult вот так:

retcode, order и volume выводятся, а deal и price всегда нули.
Подскажите, пожалуйста, что делаю не так и как получить доступ (для начала хотя бы вывести через Print) к содержимому структуры  result?

Нули и прописаны в result.

 
Artyom Trishkin:

Может так?

Спасибо, но результат тотже...
 
fxsaber:

Нули и прописаны в result.

Ну тогда совсем непонятно - я думал делаю что-то не так, а если там нули, то в чем смысл result?
Я вижу открытый ордер, получаю result.retcode 10009, а result.price = 0 ?
Объясните, пожалуйста, в чем смысл result, если он не содержит результат?
 
Algotrader18:
Объясните, пожалуйста, в чем смысл result, если он не содержит результат?

Это особенность MT5, когда результат - только ордер (тикет и без цены), но не сделка. У Вас есть несколько путей

  1. Разобраться самостоятельно, как все устроено.
  2. Использовать уже готовые более высокоуровневые (низкий уровень скрыт) наработки, где почти все подводные камни обойдены.
 
fxsaber:

Это особенность MT5, когда результат - только ордер (тикет и без цены), но не сделка. У Вас есть несколько путей

  1. Разобраться самостоятельно, как все устроено.
  2. Использовать уже готовые более высокоуровневые (низкий уровень скрыт) наработки, где почти все подводные камни обойдены.
Спасибо.

В MQL4 не было структуры result и мы, получив ticket, выбирали соответствующий ордер и запрашивали необходимые данные. В MQL5 есть структура result, в которой присутствуют многие необходимые данные, и было бы нелогично этим не воспользоваться.

1. Прежде чем задавать вопрос на форуме, я пытался "Разобраться самостоятельно, как все устроено." и что я вижу - в структуре result:

struct MqlTradeResult
  {
   uint     retcode;          // Operation return code
   ulong    deal;             // Deal ticket, if it is performed
   ulong    order;            // Order ticket, if it is placed
   double   volume;           // Deal volume, confirmed by broker
   double   price;            // Deal price, confirmed by broker
   double   bid;              // Current Bid price
   double   ask;              // Current Ask price
   string   comment;          // Broker comment to operation (by default it is filled by description of trade server return code)
   uint     request_id;       // Request ID set by the terminal during the dispatch
   uint     retcode_external; // Return code of an external trading system
  };


присутствует double price; // Deal price, confirmed by broker.

В примере кода от разработчика

//--- send the request
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- information about the operation
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
выводится result.deal, т.е. предполагается, что это имеет смысл и он не всегда представлен нулём в структуре result. Можно привести и другие примеры, которые указывают на то, что result.price, как и result.deal можно получить из MqlTradeResul, что я и пытался сделать.


Нигде не видел информации,  что "Это особенность MT5, когда результат - только ордер (тикет и без цены), но не сделка". Будьте добры, скажите, на основании какой информации Вы пришли к такому выводу.

2. Если Вам известны какие-то "уже готовые более высокоуровневые (низкий уровень скрыт) наработки,", которые позволяют получить параметры позиции сразу после её открытия (появления кода 10009), без предварительного выбора по ticket, пожалуйста, приведите пример или дайте на него ссылку.

 
Algotrader18:
Спасибо.

В MQL4 не было структуры result и мы, получив ticket, выбирали соответствующий ордер и запрашивали необходимые данные. В MQL5 есть структура result, в которой присутствуют многие необходимые данные, и было бы нелогично этим не воспользоваться.

1. Прежде чем задавать вопрос на форуме, я пытался "Разобраться самостоятельно, как все устроено." и что я вижу - в структуре result:


присутствует double price; // Deal price, confirmed by broker.

В примере кода от разработчика

выводится result.deal, т.е. предполагается, что это имеет смысл и он не свегда представлен нулём в структуре result. Можно привести и другие примеры, которые указывают на то, что result.price, как и result.deal можно получить из MqlTradeResul, что я и пытался сделать.


Нигде не видел информации,  что "Это особенность MT5, когда результат - только ордер (тикет и без цены), но не сделка". Будьте добры, скажите, на основании какой информации Вы пришли к такому выводу.

2. Если Вам известны какие-то "уже готовые более высокоуровневые (низкий уровень скрыт) наработки,", которые позволяют получить параметры позиции сразу после её открытия (появления кода 10009), без предварительного выбора по ticket, пожалуйта, приведите пример или дайте на него ссылку.

В результате торгового запроса имеется либо отказ, либо маркет-оредр. Это не сделка, и не позиция, порождённая сделкой.

  1. Отсылается на сервер торговый приказ на открытие позиции (приказ = ордер)
  2. Если ордер принят, возвращается результат принятия ордера и постановки его в очередь.
  3. Если ордер был исполнен, появляется сделка - результат исполнения ордера.
  4. Результатом сделки будет либо новая позиция, либо увеличение/уменьшение объёма существующей позиции, либо закрытие позиции, либо переворот. Либо новая позиция (при хеджинг-счёте)
 
Artyom Trishkin:

В результате торгового запроса имеется либо отказ, либо маркет-оредр. Это не сделка, и не позиция, порождённая сделкой.

  1. Отсылается на сервер торговый приказ на открытие позиции (приказ = ордер)
  2. Если ордер принят, возвращается результат принятия ордера и постановки его в очередь.
  3. Если ордер был исполнен, появляется сделка - результат исполнения ордера.
  4. Результатом сделки будет либо новая позиция, либо увеличение/уменьшение объёма существующей позиции, либо закрытие позиции, либо переворот. Либо новая позиция (при хеджинг-счёте)
Спасибо - скажите, пожалуйста:
- как Вы думаете, после какого шага, из перечисленных Вами, появляется Структура результата торгового запроса (MqlTradeResult)?

- Согласно описанию MQL5:
"Структура результата торгового запроса (MqlTradeResult)
В ответ на торговый запрос постановки ордера в торговую систему, торговый сервер возвращает данные, содержащие информацию о результате обработки торгового запроса в виде специальной предопределенной структуры MqlTradeResult." , а "10009 TRADE_RETCODE_DONE Заявка выполнена"

Т.о. код возврата торгового сервера 10009 означает, что запрос OrderSend был успешно выполнен т.е., если я запрашиваю данные из MqlTradeResult, после получения кода 10009, то как объяснить, что result.price = 0 ?
 
Algotrader18:
Спасибо - скажите, пожалуйста:
- после какого шага, из перечисленных Вами, появляется Структура результата торгового запроса (MqlTradeResult)?

- Согласно описанию MQL5:
"Структура результата торгового запроса (MqlTradeResult)
В ответ на торговый запрос постановки ордера в торговую систему, торговый сервер возвращает данные, содержащие информацию о результате обработки торгового запроса в виде специальной предопределенной структуры MqlTradeResult." , а "10009 TRADE_RETCODE_DONE Заявка выполнена"

Т.о. код возврата торгового сервера 10009 означает, что запрос OrderSend был успешно выполнен т.е., если я запрашиваю данные из MqlTradeResult, после получения кода 10009, то как объяснить, что result.price = 0 ?

10009 TRADE_RETCODE_DONE - вы же сами и описали - заявка выполнена. Это просто факт успешной постановки ордера на сервер в очередь на исполнение.

Далее, если данная заявка будет исполнена (ведь она может быть и отклонена сервером), то появляется сделка - вот в результате сделки появится позиция с ценой открытия.

Почитайте об

OnTradeTransaction

Вызывается в экспертах при наступлении события TradeTransaction. Функция предназначена для обработки результатов выполнения торгового запроса.

void  OnTradeTransaction()
   const MqlTradeTransaction&    trans,     // структура торговой транзакции
   const MqlTradeRequest&        request,   // структура запроса
   const MqlTradeResult&         result     // структура ответа
   );

Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
При обрабокте транзакций типа TRADE_TRANSACTION_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для...
 
Algotrader18:

Нигде не видел информации,  что "Это особенность MT5, когда результат - только ордер (тикет и без цены), но не сделка". Будьте добры, скажите, на основании какой информации Вы пришли к такому выводу.

Собственный опыт.

2. Если Вам известны какие-то "уже готовые более высокоуровневые (низкий уровень скрыт) наработки,", которые позволяют получить параметры позиции сразу после её открытия (появления кода 10009), без предварительного выбора по ticket, пожалуйста, приведите пример или дайте на него ссылку.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void Variant1()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0), SELECT_BY_TICKET))
    OrderPrint();
}

void Variant2()
{
  OrderSend(_Symbol, OP_SELL, 0.1, Bid, 100, 0, 0);
  MqlTradeResult result = MT4ORDERS::LastTradeResult;
  
  Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
  Print ("deal = " +IntegerToString (result.deal) + "; ");
  Print ("order = " +IntegerToString (result.order) + "; "); 
  Print ("volume = " +DoubleToString (result.volume) + "; ");  
  Print ("price = " +DoubleToString (result.price) + "; ");
}

void OnStart()
{
  Variant1();
  Variant2();
}
#2212868739 2018.11.02 21:09:33 buy 0.10 EURUSD 1.13895 0.00000 0.00000 1.13892 -0.18 0.00 -0.26 0
retcode = 10009; 
deal = 2210317244; 
order = 2212868740; 
volume = 0.10000000; 
price = 1.13892000; 


Есть и другой вариант, но он "продвинутый".

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