Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2724

 
Vitaly Muzichenko #:
Именно это и происходило

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

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Alexey Viktorov, 2026.03.30 13:44

Затрётся, но разве это проблема? Ведь последовательность в списке останется прежней. И соответственно начинать цикл сначала не надо.

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


 
Alexey Viktorov #:

Это панель отображения истории.

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

double PriceIn = GetPriceIn(posID); // OrderOpenPrice()

Поэтому получается вот так

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

--

P.S. А если открыть месяц назад, а закрыть сегодня, то как быть?

 
Vitaly Muzichenko #:
если открыть позицию вчера и закрыть сегодня, то нет доступа к цене  открытия
Почему? Всегда же есть
 
Vitaly Muzichenko #:

Это панель отображения истории.

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

Поэтому получается вот так

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

Виталий, я читал это в самом первом сообщении. И другого варианта не вижу, кроме как из цикла перебора позиций за сегодня вызывать функцию в которой делается выборка по идентификатору позиции, определяется цена открытия и цена закрытия в одном цикле, затем вызывается HistorySelect() и из функции выход. Дальше в цикле продолжается перебор сделок и опять в функцию…


Дополнение к 

Vitaly Muzichenko #:

--

P.S. А если открыть месяц назад, а закрыть сегодня, то как быть?

Да хоть в прошлом году… Или даже в прошлом веке, если умудрился открыть.

 
Artyom Trishkin #:
Почему? Всегда же есть

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

datetime GetHistoryInfoFromDate(datetime prevDay, datetime day, double &pips, double &profit, double &lots)
 {
  pips = 0;
  profit = 0;
  lots = 0;
  datetime res = day;
  if(!HistorySelect(0, INT_MAX))
    return 0;
  int total = HistoryDealsTotal();
  for(int i=0; i<total; i++)
   {
    if(!dealOut.SelectByIndex(i))
      continue;
    if(dealOut.Entry() != DEAL_ENTRY_OUT)
      continue;
    if(nSymb == "" || dealOut.Symbol() == _Symbol)
     {
      if(MagicNumber == -1 || dealOut.Magic() == MagicNumber)
       {
        if(CommentFilter == "" || StringFind(dealOut.Comment(), CommentFilter) != -1)
         {
          datetime OrderCloseTime = dealOut.Time();
          if(day >= OrderCloseTime && OrderCloseTime >= prevDay)
           {
            ulong posID = dealOut.PositionId();
            double PriceIn = GetPriceIn(posID); // OrderOpenPrice()
            if(PriceIn<=0)
              continue;
Файлы:
Profit_Info.mq5  16 kb
 
Vitaly Muzichenko #:

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

Я понял свою ошибку, вечером перепишу
 
Vitaly Muzichenko #:

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

Виталий, у меня нет ни одной открытой/закрытой позиции на счёте, поэтому вариант не проверенный…

Смысл должно быть понятен, а остальное дополнишь сам.

/****************Custom indicator iteration function*****************/
datetime dt;
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])

 {
  dt = iTime(NULL,PERIOD_D1,0);
  ulong dealTicket;
  long positionID;
  double priceIN=0.0, priceOUT=0.0;
  if(HistorySelect(dt, TimeCurrent()))
   {
    int total = HistoryDealsTotal();
    for(int i=0; i<total; i++)
     {
      dealTicket = HistoryDealGetTicket(i);
      if(HistoryDealGetInteger(dealTicket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
       {
        positionID = HistoryDealGetInteger(dealTicket, DEAL_POSITION_ID);
        priceOUT = HistoryDealGetDouble(dealTicket, DEAL_PRICE);
        PositionPriceIN(positionID, priceIN);
        Print("positionID ", positionID, " priceIN ", priceIN, " priceOUT ", priceOUT);
       }
     }
   }
  return rates_total;
 }/******************************************************************/
void PositionPriceIN(long posID, double & prIN)
 {
  if(HistorySelectByPosition(posID))
   {
    for(int i=0; i<HistoryDealsTotal(); i++)
     {
      ulong ticket = HistoryDealGetTicket(i);
      if(HistoryDealGetInteger(ticket, DEAL_ENTRY) == DEAL_ENTRY_IN)
        prIN = HistoryDealGetDouble(ticket, DEAL_PRICE);
     }
   }
  HistorySelect(dt, TimeCurrent());
 }/******************************************************************/

Сюда можно и комиссию вставить.

 
Alexey Viktorov #:
void PositionPriceIN(long posID, double & prIN) {   if(HistorySelectByPosition(posID))    {     for(int i=0; i<HistoryDealsTotal(); i++)      {       ulong ticket = HistoryDealGetTicket(i);       if(HistoryDealGetInteger(ticket, DEAL_ENTRY) == DEAL_ENTRY_IN)         prIN = HistoryDealGetDouble(ticket, DEAL_PRICE);      }    }   HistorySelect(dt, TimeCurrent()); }

Спасибо!

Добавил все фильтры, всё отработало чётко, буду проверять дальше.

В моём коде не хватало именно этого