Как на MQL 5 получить данные по времени и цене открытия и времени и цене закрытия сделки? - страница 2

 

Ребята, а если такая ситуация.

Имеем временной диапазон

start=StringToTime("10:00");
stop =StringToTime("18:00");

Нужна функция которая внутри этого диапазона должна определить, была ли в истории закрытая позиция, если была, то возвращаем true, если не было то false

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Konstantin Seredkin:

Ребята, а если такая ситуация.

Имеем временной диапазон

Нужна функция которая внутри этого диапазона должна определить, была ли в истории закрытая позиция, если была, то возвращаем true, если не было то false

Вы задали время. Чтобы провести поиск в торговой истории нужна ДАТА.

 
Konstantin Seredkin:

Ребята, а если такая ситуация.

Имеем временной диапазон

Нужна функция которая внутри этого диапазона должна определить, была ли в истории закрытая позиция, если была, то возвращаем true, если не было то false

Пример работы с торговой историей в заданном диапазоне ДАТ: History Deals and Orders.

Скрипт "History Deals and Orders" выводит абсолютно все свойства для сделок и ордеров из торговой истории в заданном временном интервале.

Доступен вывод как во вкладку "Эксперты" терминала, так и в текстовой файл (текстовой файл располагается в папке [data folder]\MQL5\Files). Если вывод осуществляется в текстовый файл, то алгоритм следующий:

  1. При старте сначала удаляется файл "InpFileName";
  2. Далее создается новый файл "InpFileName";
  3. В файл "InpFileName" записывается информация.

Чтобы увидеть и открыть текстовой файл, нужно:

  • Шаг 1: выбрать меню "Файл" и пункт "Open Data Folder";
  • Шаг 2: в открывшемся Проводнике последовательно перейти в папку "MQL5\Files".

Пример текстового файла:

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|144059549           |160789141           |2017.08.02 10:35:46 |1501670146218       |DEAL_TYPE_SELL      |DEAL_ENTRY_IN       |0                   |DEAL_REASON_CLIENT  |160789141          
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|0.01                |1.18265             |0.00                |0.00                |0.00                |EURUSD              |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|160789141           |2017.08.02 10:35:46 |ORDER_TYPE_SELL     |ORDER_STATE_FILLED  |2017.08.02 10:35:46 |2017.08.02 10:35:46 |1501670146217       |1501670146218       |ORDER_FILLING_FOK  
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |160789141           |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|0.01                |0.00                |1.18265             |0.00000             |0.00000             |1.18265             |0.00000            
|Symbol              |Comment                                  |Extarnal id        
|EURUSD              |                                         |                   

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|144059588           |160789184           |2017.08.02 10:35:55 |1501670155724       |DEAL_TYPE_BUY       |DEAL_ENTRY_OUT      |0                   |DEAL_REASON_CLIENT  |160789141          
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|0.01                |1.18276             |0.00                |0.00                |-0.09               |EURUSD              |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|160789184           |2017.08.02 10:35:55 |ORDER_TYPE_BUY      |ORDER_STATE_FILLED  |2017.08.02 10:35:55 |2017.08.02 10:35:55 |1501670155724       |1501670155724       |ORDER_FILLING_FOK  
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |160789141           |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|0.01                |0.00                |1.18276             |0.00000             |0.00000             |1.18276             |0.00000            
|Symbol              |Comment                                  |Extarnal id        
|EURUSD              |                                         |
 
Vladimir Karputov:

Вы задали время. Чтобы провести поиск в торговой истории нужна ДАТА.

Дата сегодняшняя к примеру с 00:00 по 23:59

Смысл самой идеи 

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

но как только в этом диапазоне появилась закрытая позиция, то робот прекращает дальнейшую торговлю

то есть мы по сути разрешаем всего одну позицию - вход в рынок в этом временном диапазоне, открылись, закрылись - ждем следующий день или если есть второй временной диапазон, ждем его и в нем все теже действия,вход, выход, увидели в истории закрытую позу, если ее время попадает в диапазон, торговлю прекращаем.

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


За скрипт спасибо, посмотрю, может чего подойдет.

 
Konstantin Seredkin:

Дата сегодняшняя к примеру с 00:00 по 23:59

Смысл самой идеи 

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

но как только в этом диапазоне появилась закрытая позиция, то робот прекращает дальнейшую торговлю

то есть мы по сути разрешаем всего одну позицию - вход в рынок в этом временном диапазоне, открылись, закрылись - ждем следующий день или если есть второй временной диапазон, ждем его и в нем все теже действия,вход, выход, увидели в истории закрытую позу, если ее время попадает в диапазон, торговлю прекращаем.

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


За скрипт спасибо, посмотрю, может чего подойдет.

В таком случае Вам лучше работать с OnTradeTransaction - отлавливать сделки, которые записались в торговую историю. 

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

Как на MQL 5 получить данные по времени и цене открытия и времени и цене закрытия сделки?

Vladimir Karputov, 2017.02.05 15:42

Поможет функция OnTradeTransaction. Пример ниже обработает вход или выход из позиции для сделок на данном символе (m_symbol - объект торгового класса CSymbolInfo) и для данного Magic:

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      string   deal_symbol       ="";
      long     deal_magic        =0;
      long     deal_entry        =0;
      long     deal_type         =0;
      double   deal_price        =0.0;
      double   deal_profit       =0.0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_price=HistoryDealGetDouble(trans.deal,DEAL_PRICE);
         deal_profit=HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
        }
      else
         return;
      if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
        {
         if(deal_entry==DEAL_ENTRY_IN) // это вход в позицию
           {

           }
         if(deal_entry==DEAL_ENTRY_IN) // это выход из позиции
           {

           }
        }
     }
  }

здесь Вы можете получить цену "deal_price" - в зависимости от того, вход это или выход, это будет цена входа или выхода, а также можете получить значения прибыли "deal_profit".
 

Можно отлавливать сделки ENUM_DEAL_ENTRY 

ENUM_DEAL_ENTRY

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

Описание

DEAL_ENTRY_IN

Вход в рынок

DEAL_ENTRY_OUT

Выход из рынка

DEAL_ENTRY_INOUT

Разворот

DEAL_ENTRY_OUT_BY

Закрытие встречной позицией


и вести учёт количества, при необходимости.

 
Konstantin Seredkin:

Дата сегодняшняя к примеру с 00:00 по 23:59

Смысл самой идеи 

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

но как только в этом диапазоне появилась закрытая позиция, то робот прекращает дальнейшую торговлю

то есть мы по сути разрешаем всего одну позицию - вход в рынок в этом временном диапазоне, открылись, закрылись - ждем следующий день или если есть второй временной диапазон, ждем его и в нем все теже действия,вход, выход, увидели в истории закрытую позу, если ее время попадает в диапазон, торговлю прекращаем.

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


За скрипт спасибо, посмотрю, может чего подойдет.

 bool HisTrad(string TimeBegin="00:00", string TimeEnd="00:00")
  {
   datetime dtBegin=StringToTime(TimeToString(TimeCurrent(), TIME_DATE)+" "+TimeBegin);
   datetime dtEnd  =StringToTime(TimeToString(TimeCurrent(), TIME_DATE)+" "+TimeEnd);   
   bool lll = HistorySelect(dtBegin,dtEnd);
   for(int i=0;i<HistoryDealsTotal();i++)
    {
     //Print(HistoryDealGetInteger(HistoryDealGetTicket(i),DEAL_MAGIC),"  ",EXPERT_MAGIC);
     if(HistoryDealGetInteger(HistoryDealGetTicket(i),DEAL_MAGIC) == EXPERT_MAGIC)
     return(true);
    }
   return(false);
  }
 
Iurii Tokman:
Совершенно верно. Это самый подходящий вариант, только по условию надо отловить закрытую сделку, как я понял. Следовательно надо добавить проверку DEAL_ENTRY_OUT
 
Блин ребята, круто, вроде начал разбираться, просто с историей еще в mql5 не работал, сегодня буду пробовать.
 

Вот так вроде заработала как надо

input string   StartTrade1         = "08:00";
input string   StopTrade1          = "16:00";

//-------------------

bool HisTrad()
  {
   datetime dtBegin=StringToTime(TimeToString(TimeCurrent(), TIME_DATE)+" "+StartTrade1);
   datetime dtEnd  =StringToTime(TimeToString(TimeCurrent(), TIME_DATE)+" "+StopTrade1);   
   bool lll = HistorySelect(dtBegin,dtEnd);
   for(int i=0;i<HistoryDealsTotal();i++)
    {
     //Print(HistoryDealGetInteger(HistoryDealGetTicket(i),DEAL_MAGIC),"  ",EXPERT_MAGIC);
     if(OrderGetString(ORDER_SYMBOL)==MySymbol && HistoryDealGetInteger(HistoryDealGetTicket(i),DEAL_ENTRY)==DEAL_ENTRY_OUT)
     return(true);
    }
   return(false);
  }
 
Konstantin Seredkin:

Вот так вроде заработала как надо

OrderGetString(ORDER_SYMBOL)

 - неправильно.

Цикл тоже неверный: Вы будете на КАЖДОЙ итерации получать HistoryDealsTotal.

Лучше не отклоняться от классики:

bool HisTrad()
  {
   datetime dtBegin=StringToTime(TimeToString(TimeCurrent(), TIME_DATE)+" "+StartTrade1);
   datetime dtEnd  =StringToTime(TimeToString(TimeCurrent(), TIME_DATE)+" "+StopTrade1);
   if(!HistorySelect(dtBegin,dtEnd))
      return(false);
   uint total=HistoryDealsTotal();
   ulong ticket=0;
//--- for all deals 
   for(uint i=0;i<total;i++)
     {
      //--- try to get deals ticket 
      if((ticket=HistoryDealGetTicket(i))>0)
        {
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)==MySymbol) // check the symbol
            if(HistoryDealGetInteger(ticket,DEAL_MAGIC)==EXPERT_MAGIC) // check the magic
               if((ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT) // check entry
                  return(true);
        }
     }
   return(false);
  }
Причина обращения: