3 строки кода MQL4 не получается переписать в MQL5

 

собственно сабж:

if(OrderSelect(ticket, SELECT_BY_TICKET))
   {
      all_profit = +OrderProfit();
      if(OrderCloseTime() > 0) OpenPosition();
   }


если по шагам, то такие вопросы:

1. как узнать, что ранее открытая позиция уже закрылась?

2. как зная POSITION_TICKET или POSITION_IDENTIFIER максимально простым способом узнать прибыль позиции по закрытии?



PS: интересует реализация для тестера (максимально простой и быстрый код), варианты с OnTradeTransaction пока не хочу использовать

когда позиция открыта, все работает - вопросов, пока не возникло , только не решил только проблемы  вопросов 1 и 2


UPD: нужна реализация (код) для хэдж-счета

 
Igor Makanu:

собственно сабж:


если по шагам, то такие вопросы:

1. как узнать, что ранее открытая позиция уже закрылась?

2. как зная POSITION_TICKET или POSITION_IDENTIFIER максимально простым способом узнать прибыль позиции по закрытии?



PS: интересует реализация для тестера (максимально простой и быстрый код), варианты с OnTradeTransaction пока не хочу использовать

когда позиция открыта, все работает - вопросов, пока не возникло , кока не решил только проблемы  вопросов 1 и 2

1. полностью закрыта позиция тогда, когда  а) позиции нет среди открытых б) сумма лотов сделок DEAL OUT равна сумме лотов DEAL IN, на хедже просто, на неттинге чуть замороченней, ещё надо учитывать перевороты.

2. просуммировать прибыль всех  DEAL OUT по этой позиции.

 
Aleksey Mavrin:

1. полностью закрыта позиция тогда, когда  а) позиции нет среди открытых б) сумма лотов сделок DEAL OUT равна сумме лотов DEAL IN, на хедже просто, на неттинге чуть замороченней, ещё надо учитывать перевороты.

2. просуммировать прибыль всех  DEAL OUT по этой позиции.

код нужен, логику представляю, но в код за сутки так и не смог превратить

поиском по форуму, много обсуждений более 5-тилетней давности. в кодобазе все с использованием СБ и  OnTradeTransaction 

 
datetime dt=TimeCurrent();   
if(HistorySelect(OnInit_time,dt))
           for(int i=HistoryDealsTotal()-1; i>=0; i--)
              {
               CDealInfo Deal;
               CPositionInfo Position;
               if(!Deal.SelectByIndex(i))
                  continue;
                  ulong ticket=Deal.Ticket();
                  ulong ordticket=HistoryDealGetInteger(ticket,DEAL_ORDER);
                  long type=Deal.DealType(); 
                  Position.SelectByTicket(Deal.PositionId());
                  int entry=Deal.Entry();       

                  if(entry==DEAL_ENTRY_OUT && Deal.Symbol()==Symbol() && (Deal.Magic()==MagicNo || Position.Magic()==MagicNo) && DealsTicketArray.SearchLinear(ticket)<0 && DealsTicketArray.Add(ticket) )
                     {                        
                        profit+=Deal.Profit();  
                     }
            }
можно и попроще, у Сабера видел через выбор истории по позиции   HistorySelectByPosition

HistorySelectByPosition

 
Чем не подходит https://www.mql5.com/ru/docs/trading/historyselectbyposition ?
Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 
Rashid Umarov:
Чем не подходит https://www.mql5.com/ru/docs/trading/historyselectbyposition ?

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

вот набросал по схеме, что @Aleksey Mavrin предложил , не уверен, что все правильно сделал

if(HistorySelectByPosition(pos_id))       // если позиция закрыта
   {
      for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
      {
         ulong ticket = HistoryDealGetTicket(i);
         if(HistoryDealGetInteger(ticket, DEAL_TYPE) == DEAL_ENTRY_OUT) profit += HistoryDealGetDouble(ticket, DEAL_PROFIT);
      }
   }
   else                                      // если позиция открыта
   {
      if(!PositionSelectByTicket(pos_ticket))
      {
         Print("Err : ", GetLastError());
         return;
      }
      profit+=PositionGetDouble(POSITION_PROFIT);
   }



Aleksey Mavrin:
можно и попроще, у Сабера видел через выбор истории по позиции   HistorySelectByPosition

HistorySelectByPosition

ОК, хоть что то, с чего начать!

 
Igor Makanu:

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

вот набросал по схеме, что @Aleksey Mavrin предложил , не уверен, что все правильно сделал



ОК, хоть что то, с чего начать!

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

что именно в этом случае покажет

PositionGetDouble(POSITION_PROFIT);

 , я не поверял . но у тебя одна ветка if только отработает

p/s/ вспомнил - покажет прибыль текущую открытой позиции, части что закрыты не покажет, т.е. тебе else надо заменить на if чтобы считалось и там и там
 
Aleksey Mavrin:

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

исключено, это конечный автомат у меня - открыть/закрыть ордер

и группа ордеров - группа конечных автоматов

изучаю вариант исключительно для тестера

в МТ4-style все работает как часы, структура примерно такая:

 for(int i = ArraySize(WORKORDERS) - 1; i >= 0; i--)
   {
//--- O_STATUS_CLOSE
      if(WORKORDERS[i].status == O_STATUS_CLOSE)
      {
        
      }
//--- O_STATUS_READY
      if(WORKORDERS[i].status == O_STATUS_READY)
      {
         
      }
//--- O_STATUS_OPEN
      if(WORKORDERS[i].status == O_STATUS_OPEN && OrderSelect(WORKORDERS[i].ticket, SELECT_BY_TICKET))
      {
         WORKORDERS[i].profit = OrderProfit();// + OrderCommission() + OrderSwap();
         if(OrderCloseTime() > 0) WORKORDERS[i].status = O_STATUS_CLOSE;
      }
//--- calc profit
      profit += WORKORDERS[i].profit;
   }


но решил уже "добить"  изучение MQL5 - хочу оценить скорость/возможности, да и только ордерную систему МТ5 не изучил до конца - спать не дает спокойно )))

 
всё же поправить надо, т.к. сделки -ин в истории есть когда позиция еще открыта
 
Aleksey Mavrin:
всё же поправить надо, т.к. сделки -ин в истории есть когда позиция еще открыта

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

с открытием позиции (с помощью справки), разобрался - открывает и возвращает тикет позиции, с закрытием (как отложенных ордеров, так и позиции) - тоже проблем нет


одна не решенная проблема - первый пост

 
Igor Makanu:

собственно сабж:


если по шагам, то такие вопросы:

1. как узнать, что ранее открытая позиция уже закрылась?

2. как зная POSITION_TICKET или POSITION_IDENTIFIER максимально простым способом узнать прибыль позиции по закрытии?



PS: интересует реализация для тестера (максимально простой и быстрый код), варианты с OnTradeTransaction пока не хочу использовать

когда позиция открыта, все работает - вопросов, пока не возникло , только не решил только проблемы  вопросов 1 и 2


UPD: нужна реализация (код) для хэдж-счета

Подключить библиотеку fxsibera mt4orders
Причина обращения: