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

 
Andrey Sokolov:

вот

Нет тика - нет цен, значит время не торговое.

Такое бывает на праздники, во время ролловера и ещё некоторых факторах, к примеру форс-мажор, когда в спецификации инструмента стоит котировочное время и торговое 00:01 -> 23:59, но реально тики начинают поступать в 00:03.

Что делать эти 2 минуты? Торговать? Как вы будете торговать, если время торговое, но нет котировок и нет торговли!

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Для получения текущей рыночной информации служат функции SymbolInfoInteger(), SymbolInfoDouble() и SymbolInfoString(). В качестве второго параметра этих функций допустимо передавать один из идентификаторов из перечислений ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE и ENUM_SYMBOL_INFO_STRING соответственно. Некоторые символы (как правило...
 
Vitaly Muzichenko:

Нет тика - нет цен, значит время не торговое.

Такое бывает на праздники, во время ролловера и ещё некоторых факторах, к примеру форс-мажор, когда в спецификации инструмента стоит котировочное время и торговое 00:01 -> 23:59, но реально тики начинают поступать в 00:03.

Что делать эти 2 минуты? Торговать? Как вы будете торговать, если время торговое, но нет котировок и нет торговли!

SYMBOL_START_TIME

Я так понял это для текущей сессии, время и дата начала и окончания торговой сессии.

Для торгового времени кстати, если время внутри, можно использовать как идентификатор. А вот можно ли использовать их в не торговое время, не понял. Надо пробовать.)

 
Valeriy Yastremskiy:

Я так понял это для текущей сессии, время и дата начала и окончания торговой сессии.

Для торгового времени кстати, если время внутри, можно использовать как идентификатор. А вот можно ли использовать их в не торговое время, не понял. Надо пробовать.)

не работало - пробовал. Всё работает только от тика и его времени

 
Vitaly Muzichenko:

Нет тика - нет цен, значит время не торговое.

Такое бывает на праздники, во время ролловера и ещё некоторых факторах, к примеру форс-мажор, когда в спецификации инструмента стоит котировочное время и торговое 00:01 -> 23:59, но реально тики начинают поступать в 00:03.

Что делать эти 2 минуты? Торговать? Как вы будете торговать, если время торговое, но нет котировок и нет торговли!

SYMBOL_START_TIME

Тики есть и во время котировочной сессии, советчик даже отправляет ордера но в ответ -> рынок закрыт. не нашёл идентификатор сессии, но проще можно ограничить время торговли как сказал выше Валерий

 

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

У меня есть вопрос по работе функции 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);