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

 

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

Вопросы по ООП в MQL5

fxsaber, 2020.05.30 10:04

Получил неожиданный результат.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

// Простая структура.
struct STRUCT1
{
  int i;  
  double j[2];
};

// Сложная структура.
struct STRUCT2
{
  int i;  
  string Str;
  
  STRUCT2() : Str("1234567 1234567")
  {
  }
};

template <typename T>
int Func( T &Array[] )
{  
  // Write
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Array[i].i = i;

  int Sum = 0;
  
  // Read
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Sum += Array[i].i;
    
  return(Sum + ArraySize(Array));    
}

void OnStart()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT2 Array2[]; // Сложная структура.
  
  const int Amount = 5e7;
  
  Print(_B(ArrayResize(Array1, Amount), 1));
  Print(_B(ArrayResize(Array2, Amount), 1));
    
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры происходит в разы дольше,
  Print(_B(Func(Array2), 1)); // чем сложной.
}


        50000000
        Alert: Time[Test6.mq5 280: ArrayResize(Array2,Amount)] = 640 ms.
        50000000
        Alert: Time[Test6.mq5 282: Func(Array1)] = 440 ms.
        1333106752
        Alert: Time[Test6.mq5 283: Func(Array2)] = 156 ms.
        1333106752
 

Почему в OBJ_TRENDBYANGLE мы не можем программно узнать угол?

Задать программно время и цены двух точек можем, а угол возвращает 0.

Если мы OBJ_TRENDBYANGLE двигаем руками, то возвращается нормальное значение угла.


Хочу на трендовой линии просто разместить текст под тем же углом что и сама трендовая.

Но трендовая не возвращает угол, а OBJ_TRENDBYANGLE имеет фиксированную вторую координату и при изменении масштабов графика в результате роста или падения цены мы получаем ложную информацию... 

 

почему предупреждение выдает компилятор ?

uchar uc[16];
ArrayInitialize(uc, 0xFF); //truncation of constant value

UPD: нет

int  ArrayInitialize( uchar array[],  uchar value );

не удобно писать 

uchar uc[16] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
[Удален]  

код 401 кто подскажет - что за ошибка ?

что такое нашёл

 

401

Наследование от данного класса невозможно, так как он объявлен со спецификатором final

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...
 
Igor Makanu:

почему предупреждение выдает компилятор ?

UPD: нет

int  ArrayInitialize( uchar array[],  uchar value );

не удобно писать 

0хFF наверное в 4 байта превращает компилятор.

Alexsandr San:

код 401 кто подскажет - что за ошибка ?

что такое нашёл

 

401

Наследование от данного класса невозможно, так как он объявлен со спецификатором final

А  в чём вопрос - по факту модификатора финал нет, а ошибка есть, или что?

 
Aleksey Mavrin:

0хFF наверное в 4 байта превращает компилятор.

нет, но инициализирует правильно

uchar uc[16];
ArrayInitialize(uc,(uchar)0xFF); // truncation of constant value        
ArrayPrint(uc);                  //     255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
 

Добрый день подскажите, как решить проблему:

При оптимизации выскакивает ошибка:

2020.05.31 15:05:32.738 Core 7 genetic pass (0, 53) tested with error "critical runtime error 503 in OnTick function (zero divide, module Experts\e1.ex5, file e1.mq5, line 826, col 73)" in 0:00:00.153

double Mix1 = NormalizeDouble((MathAbs(ZExtLevel[0] - ZExtLevel[1])), 2);

double Mix2 = NormalizeDouble((MathAbs(ZExtLevel[1] - ZExtLevel[2])), 2);

double Mix = NormalizeDouble((Mix1/Mix2),2);

Что делал:

1) умножал Mix1 и Mix2, чтобы уменьшить кол-во знаков после запятой;

2) менял кол-во знаков при нормализации;

3) Все ZExtLevel проверял, чтобы в них не было 0.


 
Igor Makanu:

нет, но инициализирует правильно

Почему уверены что нет? По умолчанию в интегер представляет. sizeof об этом и говорит

 
Aleksey Mavrin:

Почему уверены что нет? По умолчанию в интегер представляет. sizeof об этом и говорит

uint, если быть точным.

 
Aleksey Mavrin:

Почему уверены что нет? По умолчанию в интегер представляет. sizeof об этом и говорит


так же работает без предупреждений?

char c[16];
ArrayInitialize(c, 127);

потому что есть соответствующая сигнатура ArrayInitialize

int  ArrayInitialize(
   char    array[],     // инициализируемый массив
   char    value        // значение, которое будет установлено
   );

а для беззнакового uchar по неизвестной причине не сделали ArrayInitialize()