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

 
  HistorySelect(time_start,time_end);
  total=HistoryDealsTotal(); 
  for(uint i=0; i<total; i++)
    {  
      ulong ticket = HistoryDealGetTicket(i); 
   
      if(HistoryDealGetString(ticket,DEAL_SYMBOL)==_Symbol
      && HistoryDealGetInteger(ticket,DEAL_MAGIC)==Magic) 
      Profit += HistoryDealGetDouble(ticket,DEAL_PROFIT);                                    
    } 

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Сделка является отражением факта совершения торговой операции на основании ордера, содержащего торговый приказ. Каждая сделка описывается свойствами, позволяющими получить информацию о ней. Для чтения значений свойств используются функции вида Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка. Каждая...
 
Aleksei Beliakov:
Подключить библиотеку fxsibera mt4orders

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

Lazar Buga:

знаю, видел и читал в справке, но этот вариант сложнее - нужно знать тикеты сделок и хранить время когда ЕА начал выставлять первые ордера - чтобы не перебирать всю историю

с магиками в тестере не работаю - опять же перебор всех позиций - зачем? использую тикет - код же для тестера

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

 

Если имеется несколько позиций одновременно, то будут неизбежно тормоза, потому что такова архитектура Тестера.

Приведите MT4-style код тестового советника (не того, что окончательно нужно ускорить), который нужно ускорить.

 
Igor Makanu:

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

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


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

тогда может твой код сделать чуть наоборот, если нет частичных закрытий то это должно быть макс.быстро.

      if(PositionSelectByTicket(pos_ticket)) // если позиция открыта
      {
         profit+=PositionGetDouble(POSITION_PROFIT);
      }
      else 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 { Print("Err : ", GetLastError());
         return;}

 
fxsaber:

Если имеется несколько позиций одновременно, то будут неизбежно тормоза, потому что такова архитектура Тестера.

Приведите MT4-style код тестового советника (не того, что окончательно нужно ускорить), который нужно ускорить.

код выше приводил, вот еще раз

#include <MT4Orders.mqh>
struct STRUCT_ORDER_STATE
{
   enum ENUM_ORDER_STATUS {O_STATUS_READY, O_STATUS_OPEN, O_STATUS_CLOSE, O_STATUS_DUMMY};
   ENUM_ORDER_STATUS status;
   double            profit;
   TICKET_TYPE       ticket;
   int               cmd;
   double            volume;
   double            price;
   int               stoploss;
   int               takeprofit;
}WORKORDERS[5];
double all_profit=0.0;
//+------------------------------------------------------------------+
TICKET_TYPE       OpenOrder(const double _ask, const double _bid, const int _cmd)
{
   return(0);
}
//+------------------------------------------------------------------+
double GetProfit(const MqlTick &tick)
{
   double profit = 0.0;
   const double ask = tick.ask;
   const double bid = tick.bid;
   for(int i = ArraySize(WORKORDERS) - 1; i >= 0; i--)
   {
//--- O_STATUS_CLOSE
      if(WORKORDERS[i].status == STRUCT_ORDER_STATE::O_STATUS_CLOSE)
      {
         all_profit += WORKORDERS[i].profit;
         OpenOrder(ask, bid, WORKORDERS[i].cmd);
      }
//--- O_STATUS_READY
      if(WORKORDERS[i].status == STRUCT_ORDER_STATE::O_STATUS_READY)
      {
         WORKORDERS[i].ticket = OpenOrder(ask, bid, WORKORDERS[i].cmd);
         if(WORKORDERS[i].ticket >= 0) WORKORDERS[i].status = STRUCT_ORDER_STATE::O_STATUS_OPEN;
      }
//--- O_STATUS_OPEN
      if(WORKORDERS[i].status == STRUCT_ORDER_STATE::O_STATUS_OPEN && OrderSelect(WORKORDERS[i].ticket, SELECT_BY_TICKET))
      {
         WORKORDERS[i].profit = OrderProfit();// + OrderCommission() + OrderSwap();
         if(OrderCloseTime() > 0) WORKORDERS[i].status = STRUCT_ORDER_STATE::O_STATUS_CLOSE;
      }
//--- calc profit
      profit += WORKORDERS[i].profit;
   }
   return(all_profit + profit);
}
//+------------------------------------------------------------------+


торговых функций, по сути  нет, только OrderProfit() и OrderCloseTime() с выбором ордера по тикету: OrderSelect()

с открытием ордеров проблем нет

нужен код для тестера для хэдж счетов

да! забыл, в МТ4-style совершенно не важно для OrderProfit(0 - рыночный или отложенный ордер, в МТ5-ордерной системе придется немного алгоритм изменить... но пока задача из первого сообщения - переписать 3 строки кода


Aleksey Mavrin:

тогда может твой код сделать чуть наоборот, если нет частичных закрытий то это должно быть макс.быстро.

я писал код после твоего сообщения - 2 пост в топике, написал исходя из знаний по справке MQL5 , пока ничего не могу сказать
 
Igor Makanu:

код выше приводил

Нужен код советника, а не функции.

 
fxsaber:

Нужен код советника, а не функции.

брошу в ЛС,  но код рабочий вариант, много правок было, хотя структуру кода должны понять

- тестирую возможности ордерных систем, пусть сетки ордеров, в целом закончил, следующий этап "Алгоритм Ванга — Ландау"

 
Igor Makanu:


я писал код после твоего сообщения - 2 пост в топике, написал исходя из знаний по справке MQL5 , пока ничего не могу сказать

Так вот проверь мой последний вариант, если не ошибаюсь и 

PositionSelectByTicket

возвращает false когда позиция уже закрыта, то все твои задачи из 1-го поста решены

 
Aleksey Mavrin:

Так вот проверь мой последний вариант, если не ошибаюсь и 

возвращает false когда позиция уже закрыта, то все твои задачи из 1-го поста решены

спс

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

 
Igor Makanu:

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


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

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

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



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

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


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

ранее открытая...

я в 5-рке по тому же принципу как и в 4-рке обычным перебором анализирую и не парюсь никакими библиотЭками

   for(pos=PositionsTotal()-1; pos>=0; pos--)
   {
      order_ticket=PositionGetTicket(pos);                   // тикет ордера
      if(PositionGetString(POSITION_SYMBOL)==Symbol() && PositionGetInteger(POSITION_MAGIC)==MN)//
      {
         profitOr=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_COMMISSION)+PositionGetDouble(POSITION_SWAP);
         lotOr=NormalizeDouble(PositionGetDouble(POSITION_VOLUME),LS);
         priceOr=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),DGT);
         tktOr=order_ticket;
         myPipsPr=profitOr/(ltTV*lotOr);
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         {

....