Ошибки, баги, вопросы - страница 3505

 
Aleksandr Slavskii #:

делаю запрос за год, сделок предпоследней позиции нет.

Раз воспроизводится - нужно показывать разработчикам.

Aleksandr Slavskii #:

Сайбер об этом писал два с половиной года назад.

Там о другом. И несколько раз после менялось.
 
Aleksey Vyazmikin #:

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

Согласен, без обратной связи очень грустно. Как будто в пустоту орёшь.

Предлагаю сделать тему "Баги" в которой могут писать только модераторы и админы.

Если пользователь выявил баг и его смогли воспроизвести ещё пара пользователей, то модератор переносит пост в эту тему и ссылки на подтверждающие посты.

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

Например выявлены баги.

1. Не работает функция на ObjectGetInteger сервере.

2. Не работает как надо функция  HistorySelect 

3. Не работает ещё что то.


Заходим в эту тему и читаем ответы админов:

1. Да нафига вам эти серверы.

2. Мы эту функцию всё равно собрались убрать, поэтому исправлять ничего не будем.

3. А вы видели какие у нас сейчас возможности по нейросетям!

)))

 
fxsaber #:

Раз воспроизводится - нужно показывать разработчикам.

А как? Я хз. Вряд ли она воспроизводится. Думаю проблема именно в большом перерыве между сделками.

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


Сейчас посмотрел. Только последняя позиция сделанная 2024 году попадает в конец истории при запросе с 01.01.2023, а все что были до неё в 2024 году не понятно где находятся.

HistorySelect возвращает все сделки 2023 года и в конце как вишенка на торте сделки последней позиции из 2024 года)))

Сортировка по тикетам тут не при чём, тикеты все идут по порядку, я проверил. Видимо сортировка происходит по другому принципу.

 
Aleksandr Slavskii #:

А как? Я хз. Вряд ли она воспроизводится.

Инвест-доступ к счету и код, показывающий проблему на этом счете.
 
Aleksandr Slavskii #:

Если пользователь выявил баг и его смогли воспроизвести ещё пара пользователей, то модератор переносит пост в эту тему и ссылки на подтверждающие посты.

Поддерживаю. Свои баг-репорты по "хеш-тегу" ищу.
 
Aleksandr Slavskii #:
Если пользователь выявил баг и его смогли воспроизвести ещё пара пользователей, то модератор переносит пост в эту тему и ссылки на подтверждающие посты.

Задумка интересная.

Что скажет модератор по поводу реализации?

 
fxsaber #:
Инвест-доступ к счету и код, показывающий проблему на этом счете.

Не получается. Счёт MetaQuotes-Demo, пароль от него я забыл, его теперь ни передать ни изменить, а инвесторский пароль без основного пароля не установить.

Но судя по всему ошибка должна быть на любом счёте.

А код для воспроизведения написан в вашей HistoryPosition, если в вашем примере изменить from_date=0 на любую дату, то распечатывается только последняя позиция

//+------------------------------------------------------------------+
// Создаем структуру некоторых свойств закрытой позиции.
struct POSITION_HISTORY
  {
   ulong             ticket;
   int               type;
   datetime          timeOpen;
   datetime          timeClose;
   double            priceOpen;
   double            priceClose;
   // Заполнение структуры соответствующими данными закрытой позиции.
   bool              Set(const ulong lTicket)
     {
      const bool Res = HistoryPositionSelect(lTicket); // https://www.mql5.com/ru/blogs/post/755007

      if(Res)
        {
         this.ticket = HistoryPositionGetInteger(POSITION_HISTORY_TICKET);
         this.type = (ENUM_POSITION_TYPE)HistoryPositionGetInteger(POSITION_HISTORY_TYPE);
         this.timeOpen = (datetime)HistoryPositionGetInteger(POSITION_HISTORY_TIME_OPEN);
         this.timeClose = (datetime)HistoryPositionGetInteger(POSITION_HISTORY_TIME_CLOSE);
         this.priceOpen = HistoryPositionGetDouble(POSITION_HISTORY_PRICE_OPEN);
         this.priceClose = HistoryPositionGetDouble(POSITION_HISTORY_PRICE_CLOSE);
        }
      return(Res);
     }
  };
POSITION_HISTORY Positions[];// Сюда будем собирать данные обо всех закрытых позициях.
//+------------------------------------------------------------------+
bool PositionHistori(datetime from_date = 0, datetime  to_date = INT_MAX)
  {
   if(m_TF.flagCustom)
     {
      int Amount = 0; // Количество закрытых позиций.

      if(HistorySelect(from_date, to_date))  // Запросили интервал торговой истории.
         for(uint i = ArrayResize(Positions, HistoryDealsTotal()); (bool)i--;)  // Бежим по всем сделкам в обратной хронологии.
           {
            const ulong DealTicket = HistoryDealGetTicket(i); // Тикет сделки.
            if(HistoryDealGetString(DealTicket, DEAL_SYMBOL) == _Symb && (HistoryDealGetInteger(DealTicket, DEAL_MAGIC) == Magic || Magic == 0))
               if((HistoryDealGetInteger(DealTicket, DEAL_ENTRY) != DEAL_ENTRY_IN) &&  // Если сделка не является открывающей,
                  Positions[Amount].Set(DealTicket))                                  // записываем данные позиции, закрытой этой сделкой.
                  Amount++;
           }
      if(Amount <= 0)
         return false;

      ArrayResize(Positions, Amount); // Определили количество закрытых позиций.
      ArrayReverse(Positions); // Расположили закрытые позиции по хронологии закрытия.
      ArrayPrint(Positions); // Распечатали информацию обо всех закрытых позициях.      
     }

   return true;
  }
 
Aleksandr Slavskii #:

Не получается. Счёт MetaQuotes-Demo, пароль от него я забыл, его теперь ни передать ни изменить, а инвесторский пароль без основного пароля не установить.

Но судя по всему ошибка должна быть на любом счёте.

А код для воспроизведения написан в вашей HistoryPosition, если в вашем примере изменить from_date=0 на любую дату, то распечатывается только последняя позиция

Странно.

Должно воспроизводиться и в таком виде

void OnStart()
  {
   _HistorySelect(0, INT_MAX);
   Print("-----------");
   _HistorySelect(D'2024.01.01 17:32:47', INT_MAX);
  }
//+------------------------------------------------------------------+
void _HistorySelect(datetime from_date, datetime to_date)
  {
   if(HistorySelect(from_date, to_date))  // Запросили интервал торговой истории.
      for(uint i =  HistoryDealsTotal(); (bool)i--;) // Бежим по всем сделкам в обратной хронологии.
         Print(HistoryDealGetTicket(i)); // Тикет сделки.
  }
//+------------------------------------------------------------------+

А нет. Так всё нормально.

Нужно разбираться с вашим кодом, что то в нём не так.(но это не точно)

 
Aleksandr Slavskii #:

Предлагаю сделать тему "Баги" в которой могут писать только модераторы и админы.

Если пользователь выявил баг и его смогли воспроизвести ещё пара пользователей, то модератор переносит пост в эту тему и ссылки на подтверждающие посты.

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

Aleksey Vyazmikin #:

Задумка интересная.

Что скажет модератор по поводу реализации?

Если нашли воспроизводимый баг, то тот кто его нашел - дает ссылки на посты в официальную ветку по релизу (сейчас это эта ветка Новая версия платформы MetaTrader 5 build 4230: больше встроенных приложений и расширение поддержки ONNX ), и в ней админы отвечают (например - сегодня отвечали - ), так как это - их ветка.
Если долго не отвечают - то у админов есть группа (на английском), и некоторые пишут туда как ссылки на посты или ветку с просьбой обратить внимание (на английском).

Тоже самое и на англоязычном форуме: есть ветка по багам, и если баг воспроизводится - то дают ссылки или повторяют пост(ы) уже в релизную ветку (на англоязычную или сюда).

Остальные схемы - не рабочие. Потому что за баг "отвечает" и знает о нем тот, кто сказал что это баг и что он воспроизводится, а админы отвечают в ветке, которую они и создали для таких воспроизводимых багов, и отвечают (и исправляют) согласно приоритетности, которую задают сами.

Новая версия платформы MetaTrader 5 build 4230: больше встроенных приложений и расширение поддержки ONNX - В бета-режиме выпущена обновленная версия платформы MetaTrader 5 в бета-режиме.
Новая версия платформы MetaTrader 5 build 4230: больше встроенных приложений и расширение поддержки ONNX - В бета-режиме выпущена обновленная версия платформы MetaTrader 5 в бета-режиме.
  • 2024.02.21
  • MetaQuotes
  • www.mql5.com
Призываем всех трейдеров присоединиться к тестированию новой версии платформы. Для обновления на новый билд платформы MetaTrader 5 достаточно нажать После окончания данного этапа бета-тестирования будет выпущен финальный билд новой платформы MetaTrader 5. Terminal Добавлено 28 новых советников и 12 новых индикаторов в стандартную поставку платформы
 
Aleksandr Slavskii #:

Нужно разбираться с вашим кодом, что то в нём не так.(но это не точно)

Вот сделали HistorySelect(From, To), где DEAL_ENTRY_OUT присутствует в списке, а DEAL_ENTRY_IN - нет: From больше времени этой сделки.

И вот вызываете для DEAL_ENTRY_OUT  HistoryPositionSelect. Откуда возьмутся данные о DEAL_ENTRY_IN? Правильно, будет сделан HistorySelect для получения недостающей информации.

Получилось, что после HistoryPositionSelect таблица история пересобрана (например, изменился HistoryDealsTotal). Как следствие, в коде HistoryDealGetTicket внутри цикла будет возвращать совсем не то, что задумали.


Перепишите так.

int GetDeals( ulong &Deals[] )
{
  for (uint i = ArrayResize(Deals, HistoryDealsTotal()); (bool)i--;)
    Deals[i] = HistoryDealGetTicket(i);
    
  return(ArraySize(Deals));
}

bool PositionHistori(datetime from_date = 0, datetime  to_date = INT_MAX)
  {
   if(m_TF.flagCustom)
     {
      int Amount = 0; // Количество закрытых позиций.
      ulong Deals[];
      
      if(HistorySelect(from_date, to_date))  // Запросили интервал торговой истории.
         for(uint i = ArrayResize(Positions, GetDeals(Deals)); (bool)i--;)  // Бежим по всем сделкам в обратной хронологии.
           {
            const ulong DealTicket = Deals[i]; // Тикет сделки.
            if(HistoryDealGetString(DealTicket, DEAL_SYMBOL) == _Symb && (HistoryDealGetInteger(DealTicket, DEAL_MAGIC) == Magic || Magic == 0))
               if((HistoryDealGetInteger(DealTicket, DEAL_ENTRY) != DEAL_ENTRY_IN) &&  // Если сделка не является открывающей,
                  Positions[Amount].Set(DealTicket))                                  // записываем данные позиции, закрытой этой сделкой.
                  Amount++;
           }
      if(Amount <= 0)
         return false;

      ArrayResize(Positions, Amount); // Определили количество закрытых позиций.
      ArrayReverse(Positions); // Расположили закрытые позиции по хронологии закрытия.
      ArrayPrint(Positions); // Распечатали информацию обо всех закрытых позициях.      
     }

   return true;
  }  
Причина обращения: