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

 
Konstantin Seredkin:

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

Только можно упростить выражение.

datetime dtBegin=StringToTime(TimeToString(TimeCurrent(), TIME_DATE)+" "+StartTrade1);

Если преобразовывать время без даты, то будет использована текущая дата. Следовательно 

TimeToString(TimeCurrent(), TIME_DATE)

оказывается лишняя. Достаточно

input string   StartTrade1         = "08:00";
datetime dtBegin=StringToTime(StartTrade1);
 
Vladimir Karputov:

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

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

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

Ага, классика норм, прочитал по справке про все исторические приблуды, посмотрел примеры, вроде теперь все понятно стало в принципе, а вы ребята молодцы спс.

 
Alexey Viktorov:

Только можно упростить выражение.

Если преобразовывать время без даты, то будет использована текущая дата. Следовательно 

оказывается лишняя. Достаточно

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

 

Ребята, засада, радость была не долгой.

Вставил все в робота, но фишка вот в чем, если торговать одним входом, то все хорошо, но если торговать несколькими, то все плохо.

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

Вопрос, как сделать так что бы данная функция игнорировала наполнение и уменьшение объема позиции и мониторила лишь ее саму, не обращая внимание на эти приходящие уходящие ордера.

 
Konstantin Seredkin:

Ребята, засада, радость была не долгой.

Вставил все в робота, но фишка вот в чем, если торговать одним входом, то все хорошо, но если торговать несколькими, то все плохо.

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

Вопрос, как сделать так что бы данная функция игнорировала наполнение и уменьшение объема позиции и мониторила лишь ее саму, не обращая внимание на эти приходящие уходящие ордера.

Вам нужно в таком случае из торговой истории восстанавливать позицию. HistoryPositionInfo version 2. Проверка на "true" или "false" методом GetProfit - если метод GetProfit возвращает true, значит позиция полностью собрана и закрыта.

 
Vladimir Karputov:

Вам нужно в таком случае из торговой истории восстанавливать позицию. HistoryPositionInfo version 2. Проверка на "true" или "false" методом GetProfit - если метод GetProfit возвращает true, значит позиция полностью собрана и закрыта.

Попробовал предложенный вариант, сделал так

bool GetHistory()
  {
   //---
   datetime dtBegin=StringToTime(StartTrade1);
   datetime dtEnd  =StringToTime(StopTrade1);
   
   long arr_tickets[];
//--- request trade history 
   HistorySelect(dtBegin,dtEnd);
//---
   uint     total=HistoryDealsTotal();
   ulong    ticket=0;
   long     position_id=0;
//--- for all deals 
   for(uint i=0;i<total;i++)
     {
      //--- try to get deals ticket 
      if((ticket=HistoryDealGetTicket(i))>0)
        {
         //--- get deals properties 
         position_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);

         int arr_size=ArraySize(arr_tickets);
         bool search=false;
         for(int ii=0;ii<arr_size;ii++)
           {
            if(arr_tickets[ii]==position_id)
              {
               search=true;
               continue;
              }
           }
         if(!search)
           {
            ArrayResize(arr_tickets,arr_size+1,100);
            arr_tickets[arr_size]=position_id;
           }
        }
     }
//---
   int arr_size=ArraySize(arr_tickets);
   for(int i=0;i<arr_size;i++)
     {
      //Print("");
      //Print("Search deals with POSITION_IDENTIFIER ",IntegerToString(arr_tickets[i]));

      CHistoryPositionInfo HistoryPositionInfo;
      //--- init position identifier
      HistoryPositionInfo.Init(arr_tickets[i]);
      //--- los errors
      //HistoryPositionInfo.LogErrors(log_errors);
      //--- print deals
      //HistoryPositionInfo.PrintDeals(print_deals);
      //---
      double profit_in_points=0.0;
      double commission=0.0;
      double swap=0.0;
      double h_profit=0.0;

      if(HistoryPositionInfo.GetProfit(profit_in_points,commission,swap,h_profit))
      return(true);
         
     }
   return(false);       
  }               

Если робот открывает один ордер а потом закрывает его по тп или об встречную заявку, все хорошо, функция возвращает true

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

Это вот пример

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

 
Konstantin Seredkin:

Попробовал предложенный вариант, сделал так

Если робот открывает один ордер а потом закрывает его по тп или об встречную заявку, все хорошо, функция возвращает true

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

Это вот пример

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

Вы торгуете на неттинге?

 
Vladimir Karputov:

Вы торгуете на неттинге?

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

 

Я так понял нет возможности собрать все сделки и отследить закрытие позиции в промежутке выставленного временного диапазона ?

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

 
Konstantin Seredkin:

Я так понял нет возможности собрать все сделки и отследить закрытие позиции в промежутке выставленного временного диапазона ?

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

Доработайте мой код для работы не неттинге. Я ничего не могу протестировать на бирже. А раз так - значит те кто пользует неттинг счета не могут пользовать мои коды.