Как правильно определить данные конкретной позиции на истории? - страница 3

 
prostotrader:

Если есть метод дающий 100% результат, так зачем применять другой метод,

у кторого вероятность правильного результата 99,9% ? 

Ничего в жизни нельзя гарантировать на 100%.
 
Alexey Kozitsyn:
Ничего в жизни нельзя гарантировать на 100%.
Понятно, ВАШЕ ПРАВО
 
prostotrader:

Совершенно верно.

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

Если тикет ордера > 0, то это боевая сделка.

ulong order_ticket = ulong(HistoryDealGetInteger(deal_ticket, DEAL_ORDER));
        
          if(order_ticket > 0)
          {
            ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY(HistoryDealGetInteger(deal_ticket, DEAL_ENTRY));
За это особое спасибо...Очень полезная инфа.
 
prostotrader:

Совершенно верно.

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

Если тикет ордера > 0, то это боевая сделка.

ulong order_ticket = ulong(HistoryDealGetInteger(deal_ticket, DEAL_ORDER));
        
          if(order_ticket > 0)
          {
            ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY(HistoryDealGetInteger(deal_ticket, DEAL_ENTRY));

Т.Е. функция для расчета профита по позиции приобретает вот такой вид....да? Правильно?

  if(id!=0)
  {
    double profit=0;
    if(HistorySelectByPosition(id))
    {
      int deals=HistoryDealsTotal();
      for(int i=0;i<deals; i++)
      {
        ulong order_ticket = (ulong)HistoryDealGetInteger(deals, DEAL_ORDER);
        if(order_ticket > 0)
        {
          ulong deal_ticket=HistoryDealGetTicket(i);
          if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
          {
            profit+=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
          }
        }
      }
    }
  }
 
Gennady Mazur:

Т.Е. функция для расчета профита по позиции приобретает вот такой вид....да? Правильно?

  if(id!=0)
  {
    double profit=0;
    if(HistorySelectByPosition(id))
    {
      int deals=HistoryDealsTotal();
      for(int i=0;i<deals; i++)
      {
        ulong order_ticket = (ulong)HistoryDealGetInteger(deals, DEAL_ORDER);
        if(order_ticket > 0)
        {
          ulong deal_ticket=HistoryDealGetTicket(i);
          if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
          {
            profit+=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
          }
        }
      }
    }
  }

Похоже на то. Только делайте перебор с конца - будет экономия:)

Конечно, если предварительно добавить условие, что при встрече с IN сделкой выйти из цикла. 

Не, нужно вначале выбрать сделку, а только потом с ней манипулировать...
 
Alexey Kozitsyn:

Похоже на то. Только делайте перебор с конца - будет экономия:)

Конечно, если предварительно добавить условие, что при встрече с IN сделкой выйти из цикла. 

Не, нужно вначале выбрать сделку, а только потом с ней манипулировать...
Дело в том, что меня интересует иногда не последяя позиция, а конкретная, со своим ID, поэтому перебор в пределах этой позиции все равно откуда начинать, да и позиция может набираться из множества ордеров, и закрываться может по частям....поэтому выбран такой перебор.
По идее, в этой функции, я выбираю нужную позицию(ID) на истории, подгружаю все связанные с ней ордера и сделки, перебираю их и если ордер не нулевой, выбираю сделку по номеру и там уже выбираю тот параметр который мне нужен.
 
Gennady Mazur:
Дело в том, что меня интересует иногда не последяя позиция, а конкретная, со своим ID, поэтому перебор в пределах этой позиции все равно откуда начинать, да и позиция может набираться из множества ордеров, и закрываться может по частям....поэтому выбран такой перебор.
По идее, в этой функции, я выбираю нужную позицию(ID) на истории, подгружаю все связанные с ней ордера и сделки, перебираю их и если ордер не нулевой, выбираю сделку по номеру и там уже выбираю тот параметр который мне нужен.
Можно, конечно, для определения профита просто просуммировать профит всех сделок(актуально если суммировать и комиссию) и не искать сделку выходную, т.к. входная сделка будет иметь 0 профита.
 
Gennady Mazur:
Дело в том, что меня интересует иногда не последяя позиция, а конкретная, со своим ID, поэтому перебор в пределах этой позиции все равно откуда начинать, да и позиция может набираться из множества ордеров, и закрываться может по частям....поэтому выбран такой перебор.
По идее, в этой функции, я выбираю нужную позицию(ID) на истории, подгружаю все связанные с ней ордера и сделки, перебираю их и если ордер не нулевой, выбираю сделку по номеру и там уже выбираю тот параметр который мне нужен.
Про позицию нет разговора. Вы ее выбрали - все отлично. По поводу перебора сделок. Тут да, если Вы закрыли часть позиции, потом еще отправили ордера и потом закрыли всю позицию - нужно обойти все сделки. Но сейчас Вы обход делаете не правильно. 

ulong order_ticket = (ulong)HistoryDealGetInteger(deals, DEAL_ORDER);

Тут нужно deals заменить на deal_ticket, но сначала нужно выбрать сделку!

 
Alexey Kozitsyn:
Про позицию нет разговора. Вы ее выбрали - все отлично. По поводу перебора сделок. Тут да, если Вы закрыли часть позиции, потом еще отправили ордера и потом закрыли всю позицию - нужно обойти все сделки. Но сейчас Вы обход делаете не правильно. 

ulong order_ticket = (ulong)HistoryDealGetInteger(deals, DEAL_ORDER);

Тут нужно deals заменить на deal_ticket, но сначала нужно выбрать сделку!

Вот так?

  if(id!=0)
  {
    double profit=0;
    if(HistorySelectByPosition(id))
    {
      int deals=HistoryDealsTotal();
      for(int i=0;i<deals;i++)
      {
        ulong deal_ticket=HistoryDealGetTicket(i);
        ulong order_ticket=(ulong)HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
        if(order_ticket>0)
        {
          if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
          {
            profit+=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
          }
        }
      }
    }
  }
 
Gennady Mazur:
Вот так?

  if(id!=0)
  {
    double profit=0;
    if(HistorySelectByPosition(id))
    {
      int deals=HistoryDealsTotal();
      for(int i=0;i<deals;i++)
      {
        ulong deal_ticket=HistoryDealGetTicket(i);
        ulong order_ticket=(ulong)HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
        if(order_ticket>0)
        {
          if(HistoryDealGetInteger(deal_ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT)
          {
            profit+=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
          }
        }
      }
    }
  }
Да, теперь больше похоже на правду. Но, не мешало бы еще проверить результат выбора сделки. С выводом сообщений пользователю в случае неудачи. А также тикеты объявить вне цикла.
Причина обращения: