Новая версия платформы MetaTrader 5 build 3490: мобильная версия веб-терминала и новые методы матриц в MQL5 - страница 11

 
A100 #:

В этом смысле согласен - как есть оставлять нельзя:

Либо все разрешить (в ущерб другим операциям) - либо все запретить

+1
 
Календарь возвращает несортированные по времени события.
void OnStart()
{
  MqlCalendarValue Values[];

  if (::CalendarValueHistory(Values, 0)) // Взяли весь календарь
    for (int i = ArraySize(Values) - 1; i > 0; i--)
      if (Values[i].time < Values[i - 1].time) // Если время предыдущего события опережает следующее
      {
        Print("Values[i].time < Values[i - 1].time"); // Сообщаем.
        
        break;
      }
}

Принтует. Причина в AllDay-событиях.

Строка для поискаOshibka 051.

Библиотеки: Calendar
Библиотеки: Calendar
  • 2022.11.04
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: Calendar
 

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

Только при этом игнорировать возможные операторы присваивания. Т.е. делать сортировку на уровне памяти, как это сделано с ArraySwap для массивов.

Строка для поиска: Uluchshenie 050.
 

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


Пример, демонстрирующий проблему обмена, который работает в некоторых случаях.

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& ) {}
};

void OnStart()
{
  STRUCT Value1;
  STRUCT Value2;
  
  Value1.i = 1;
  Value2.i = 2;
  
  // Пробуем делать swap.
  {
    STRUCT Tmp = Value1;

    Value1 = Value2;
    Value2 = Tmp;
  }

  // Не получился обмен.
  Print(Value1.i); // 1
  Print(Value2.i); // 2

// Альтернатива.

  STRUCT ArrValue1[];
  STRUCT ArrValue2[];
  
  ArrayResize(ArrValue1, 1);
  ArrayResize(ArrValue2, 1);
  
  ArrValue1[0].i = 1;
  ArrValue2[0].i = 2;
  
  ArraySwap(ArrValue1, ArrValue2);

  // Получился обмен.
  Print(ArrValue1[0].i); // 2
  Print(ArrValue2[0].i); // 1
}
Строка для поиска: Uluchshenie 051.
 

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

Пример, когда свой вариант не всегда работает.

template <typename T>
void Print2( const T &Value )
{
  T Array[1]; Array[0] = Value;
  
  ArrayPrint(Array);
}

struct MqlTick2 : public MqlTick { void operator =( const MqlTick2& ) { this.time = 0; } };

void OnStart()
{
  MqlTick Tick = {};
  MqlTick2 Tick2 = {};
  
  Tick.time = TimeCurrent();
  Tick2.time = Tick.time;
  
  Print2(Tick);
  Print2(Tick2);
}


Результат.

                 [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real]
[0] 2022.11.04 11:33:29 0.000 0.000 0.0000        0          0       0       0.00000
                 [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real]
[0] 1970.01.01 00:00:00 0.000 0.000 0.0000        0          0       0       0.00000

Свой подобный подход мог бы работать, если бы была реализована универсальная возможность обмена переменными.

Строка для поиска: Uluchshenie 052.
 
fxsaber #:

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

Только при этом игнорировать возможные операторы присваивания. Т.е. делать сортировку на уровне памяти, как это сделано с ArraySwap для массивов.

Строка для поиска: Uluchshenie 050.
Так нельзя, массив структур это не массив указателей на области памяти с данными. Так можно с классами...
 
Aliaksandr Hryshyn #:
Так нельзя, массив структур это не массив указателей на области памяти с данными. Так можно с классами...

Написал же, что на уровне памяти.

 
fxsaber #:

Написал же, что на уровне памяти.

Это как?
 

А я все о своих "баранах". Хочется еще раз попросить разработчиков увеличить количество градаций масштаба. 

Спасибо.

 
Aliaksandr Hryshyn #:
Это как?

Обмен кусками памяти.

Причина обращения: