Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1266

 

Всем доброго времени! 

У меня есть вопрос по работе функции ResultDeal() в классе CTrade.

Дело в том, что в Тестере стратегий данная функция возвращает тикет сделки без проблем, а когда бросаешь советник на График она всегда возвращает "ноль", несмотря на то, что функция ResultRetcode() всегда возвращает "TRADE_RETCODE_DONE".

Пример кода:

/////////////////////////////////////////////////////////////////////
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
/////////////////////////////////////////////////////////////////////
CTrade Trade;
CSymbolInfo SymbolInfo;

uint Retcode;
ulong TicketDeal;
bool first_calc;
bool second_calc;
bool third_calc;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   TicketDeal = 9999999;
   
   first_calc = true;
   second_calc = false;
   third_calc = false;   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(first_calc)
   {
      first_calc = false;
      second_calc = true;
      
      SymbolInfo.Name(Symbol());
      SymbolInfo.RefreshRates();
      Trade.Buy(1.0, Symbol(), SymbolInfo.Ask(), 0.0, 0.0, "BUY");
//---
      Retcode = Trade.ResultRetcode();
      if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
      
      Print("first_calc ////////////////////////////////////");
      Print("PositionsTotal(): ", PositionsTotal());
      Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
   }
   else
   {
      if(second_calc)
      {
         second_calc = false;
         third_calc = true;
//---
         Retcode = Trade.ResultRetcode();
         if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
         
         Print("second_calc ////////////////////////////////////");
         Print("PositionsTotal(): ", PositionsTotal());
         Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
      }
      else
      {
         if(third_calc)
         {
            third_calc = false;
//---
            Retcode = Trade.ResultRetcode();
            if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
            
            Print("third_calc ////////////////////////////////////");
            Print("PositionsTotal(): ", PositionsTotal());
            Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
         }
         else
         {
            //Print("TicketDeal: ", Trade.ResultDeal());
         }
      }
   }   
}
//+------------------------------------------------------------------+

Лог выполнения в Тестере: 

2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   first_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   second_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   third_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   Retcode: 10009; TicketDeal: 2

Лог выполнения на Графике:

2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) first_calc ////////////////////////////////////
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) PositionsTotal(): 0
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.026 _TestSelect (EURUSD,M1) second_calc ////////////////////////////////////
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) third_calc ////////////////////////////////////
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0


Что я делаю не так? Как получить тикет сделки в режиме реального времени

И второй вопрос (менее важный) почему сразу после совершения сделки на Графике функция PositionsTotal() возвращает "ноль"? А с приходом следующего тика показывает достоверные данные. Можно эту информацию получить как то сразу?    


Файлы:
 
ZAKST:

Всем доброго времени! 

У меня есть вопрос по работе функции ResultDeal() в классе CTrade.

Дело в том, что в Тестере стратегий данная функция возвращает тикет сделки без проблем, а когда бросаешь советник на График она всегда возвращает "ноль", несмотря на то, что функция ResultRetcode() всегда возвращает "TRADE_RETCODE_DONE".

Пример кода:

Лог выполнения в Тестере: 

Лог выполнения на Графике:


Что я делаю не так? Как получить тикет сделки в режиме реального времени

И второй вопрос (менее важный) почему сразу после совершения сделки на Графике функция PositionsTotal() возвращает "ноль"? А с приходом следующего тика показывает достоверные данные. Можно эту информацию получить как то сразу?    


Хмм.. Внезапно нужные мне данные в реалтайме возвращает функция ResultOrder() того же класса CTrade, хотя отложенными ордерами я не пользовался... 

Вопрос тот же: Что я делаю не так?  

 

Есть вот такой макрос.

#define Warning if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

Я его использую вот так.

Warning"Warnig  сработал. ");

Вопрос: Что нужно поправить в определении макроса, чтобы можно использовать его вот так ?

Warning("Warnig  сработал. ");

т.е со скобкой между Warning и "Warnig сработал. " Пытался в определении макроса использовать скобку

#define Warning( if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

но компилятор не разрешает использовать скобку.

 
ZAKST:

Хмм.. Внезапно нужные мне данные в реалтайме возвращает функция ResultOrder() того же класса CTrade, хотя отложенными ордерами я не пользовался... 

Вопрос тот же: Что я делаю не так?  

Просто разберитесь с системой ордеров МТ5, ордер- сделка- позиция.

ResultOrder - открывающий ордер. Позиция будет с POSITION_IDENTIFIER равным тикету этого ордера.

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

з.ы. тестер отличается тем, что там без задержек исполняется ордер и сразу  рождается сделка. В реале проходит время и на момент успешного создания ордера сделки еще нет, её нужно отлавливать в OnTrade событиях
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
pivomoe:

Есть вот такой макрос.

Я его использую вот так.

Вопрос: Что нужно поправить в определении макроса, чтобы можно использовать его вот так ?

т.е со скобкой между Warning и "Warnig сработал. " Пытался в определении макроса использовать скобку

но компилятор не разрешает использовать скобку.

вы хотите использовать параметрическую форму, хотя прописали безпараметрическую. надо как то так

#define Warning(CUSTOM) (if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+"",string(CUSTOM)))


Warning("Warnig  сработал. ");
 

Я плохо объяснил. Давайте сначала. Сейчас я использую макрос  вот так:

Warning,"Warnig  сработал. i=",i);

Вот сам макрос:

#define Warning if(LogWarnig)MoiLoggerWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')

В вызове макроса между  "Warning," и ");" Произвольное количество параметров произвольных типов. Это все достигается за счет много кратной перезагрузки функции Write.

Вопрос. Что нужно поправить в макросе чтобы его можно было вызывать вот так:

Warning("Warnig  сработал. i=",i);
 
pivomoe:

Я плохо объяснил. Давайте сначала. Сейчас я использую макрос  вот так:

Вот сам макрос:

В вызове макроса между  "Warning," и ");" Произвольное количество параметров произвольных типов. Это все достигается за счет много кратной перезагрузки функции Write.

Вопрос. Что нужно поправить в макросе чтобы его можно было вызывать вот так:

Ответ: также многократно перезагрузить макрос)

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

 
Aleksey Mavrin:

Просто разберитесь с системой ордеров МТ5, ордер- сделка- позиция.

ResultOrder - открывающий ордер. Позиция будет с POSITION_IDENTIFIER равным тикету этого ордера.

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

з.ы. тестер отличается тем, что там без задержек исполняется ордер и сразу  рождается сделка. В реале проходит время и на момент успешного создания ордера сделки еще нет, её нужно отлавливать в OnTrade событиях
Спасибо за ответ. Буду разбираться))
 
Здравствуйте! как получить доступ к свойствам индикатора из советника. К примеру я хочу изменить цвет линии из советника, зная хендл индикатора. По справке искал, ничего не нашел, может плохо ищу?   
 
Tango_X:
Здравствуйте! как получить доступ к свойствам индикатора из советника. К примеру я хочу изменить цвет линии из советника, зная хендл индикатора. По справке искал, ничего не нашел, может плохо ищу?   

Индикатор для этого должен иметь входной параметр цвета. То есть это должен быть пользовательский индикатор.

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