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

 
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;
  }  
 
Sergey Golubev #:

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

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

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

Ну, я явно и писал изначально в ветку бро бэтку - но реакции ноль.

 
fxsaber #:
Deals[i]

Отлично! Заработало!!!

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

 
Aleksandr Slavskii #:

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

В скрипте не вызывалась HistoryPositionSelect.

 

Sergey Golubev #:

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

Так вопрос то не в том куда писать.

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

Вопрос в том, чтоб была обратная связь.

Какой смысл, что админ потратил время  ответив на вопрос, на который могли ответить другие пользователи?

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

 
fxsaber #:

В скрипте не вызывалась HistoryPositionSelect.

Я не понял. Что значит не вызывалась?

Я скопировал код из советника с в скрипт.

Вот скрипт. Он работает правильно. Этот же код в советнике работает не правильно.

Не понятно почему так происходит.

#include "HistoryPosition.mqh" // https://www.mql5.com/ru/blogs/post/755007
//+------------------------------------------------------------------+
void OnStart()
  {
//PositionHistori(0, INT_MAX);
   Print("-----------");
   PositionHistori(D'2024.01.01 00:00:00', INT_MAX);
  }
//+------------------------------------------------------------------+
// Создаем структуру некоторых свойств закрытой позиции.
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)
  {
   int Amount = 0; // Количество закрытых позиций.

   if(HistorySelect(from_date, to_date))  // Запросили интервал торговой истории.
     {
      Print(HistoryDealsTotal());
      for(uint i = ArrayResize(Positions, HistoryDealsTotal()); (bool)i--;)  // Бежим по всем сделкам в обратной хронологии.
        {
         const ulong DealTicket = HistoryDealGetTicket(i); // Тикет сделки.
         //Print(DealTicket);
         if(HistoryDealGetString(DealTicket, DEAL_SYMBOL) == _Symbol)
            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 #:

Вот скрипт. Он работает правильно. Этот же код в советнике работает не правильно.

Не понятно почему так происходит.

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

Попробуйте распечатывать HistoryDealsTotal еще и там, где Amount++. Увидите, что значение меняется.

 
Aleksandr Slavskii #:

Вопрос в том, чтоб была обратная связь.

Все так.