Особенности языка mql5, тонкости и приёмы работы - страница 228

 
fxsaber #:
Добавили.

Кто раньше писал без использования const, теперь это делать не могут. Иначе - будет ошибка.

template <typename T>
bool IsMqlTick( const T& ) // Без этого const будет неверно работать.
{
  return(typename(T) == "struct MqlTick");
}

void OnStart()
{
  const MqlTick Value1 = {};
  MqlTick Value2 = {};
  
  Print(IsMqlTick(Value1)); // true
  Print(IsMqlTick(Value2)); // true
}

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

 

Извините."TRADE_EVENT_POSITION_OPEN =0x1" x1 - это первый бит списка событий????. Я имею в виду, что в этой части перечисления событий, вы можете иметь каждый бит доступным, как это?


Пожалуйста, дайте мне знать.

 

Есть два типа брокеров, которые переводят время по США/Европе. Из-за этого, в частности, сдвигается время ролловера.

Тип брокера можно определять автоматически.

// Вычисление типа брокера (USA/Europe).

bool IsEuropeBroker()
{
  MqlCalendarValue Value[1];
  
  CalendarValueHistoryByEvent(840030016, Value, D'2022.11.03', D'2022.11.05');
  
  return(Value[0].time == ChartNewsTime(Value[0].time)); // https://www.mql5.com/ru/forum/357793/page5#comment_44225999
}

void OnStart()
{
  Print(AccountInfoString(ACCOUNT_SERVER) + " - " + (IsEuropeBroker() ? "Europe" : "USA"));
}


Результаты запуска на некоторых брокерах.

RannForex-Server - Europe
MetaQuotes-Demo - Europe
FXOpen-MT5 - USA
Alpari-MT5 - Europe
Tickmill-Live - USA
ICMarketsSC-MT5-2 - USA
Darwinex-Live - USA
 

Здравствуйте!

Не знаю, в нужную ветку задаю свой вопрос или нет...

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

Заказчик придрался к тому, что при увеличении масштаба через настройки персонализации Виндовс,

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

Как решить проблему, чтобы масштабировались не только шрифты, но и размеры элементов панели и сама панель?

У меня конечно есть небольшой запас и я могу немного увеличить размеры элементов, тогда при увеличении  параметров экрана до 125%

все уместится, но если увеличить до 150% то уже ничего не влезет точно.

Поэтому хочу решить проблему радикально, чтобы элементы панели и сама панель  тоже увеличивались пропорционально масштабу. Как это сделать?

Понимаю, что надо каким то образом, наверное через WIN IP получить от винды эту цифру масштаба - 100%, либо 125% либо 150%. Вопрос, как это реализовать в коде советника?



P.S. Для уточнения. Программа использует стандартную библиотеку MQL5 но сама написана на MQL4.


Заранее благодарен всем, кто откликнется...

 
Vitaliy Davydov #:

Здравствуйте!

Не знаю, в нужную ветку задаю свой вопрос или нет...

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

Заказчик придрался к тому, что при увеличении масштаба через настройки персонализации Виндовс,

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

Как решить проблему, чтобы масштабировались не только шрифты, но и размеры элементов панели и сама панель?

У меня конечно есть небольшой запас и я могу немного увеличить размеры элементов, тогда при увеличении  параметров экрана до 125%

все уместится, но если увеличить до 150% то уже ничего не влезет точно.

Поэтому хочу решить проблему радикально, чтобы элементы панели и сама панель  тоже увеличивались пропорционально масштабу. Как это сделать?

Понимаю, что надо каким то образом, наверное через WIN IP получить от винды эту цифру масштаба - 100%, либо 125% либо 150%. Вопрос, как это реализовать в коде советника?



P.S. Для уточнения. Программа использует стандартную библиотеку MQL5 но сама написана на MQL4.


Заранее благодарен всем, кто откликнется...

Попробуйте перед созданием объектов определить размер текста посредством TextSetFont() и TextGetSize()

 
Alexey Viktorov #:

Попробуйте перед созданием объектов определить размер текста посредством TextSetFont() и TextGetSize()

TextGetSize() помогла, спасибо.
 

Получилось собрать велосипед-конструкцию, которую применил на практике. Попробую кратко рассказать.

Есть вот такая работа с базой данных.

// Элемент БД.
class DATA
{
private:
  static int Count;
  
public:
  int Num;
  
  DATA() : Num(DATA::Count++) {}
};

static int DATA::Count = 0;

#define SIZE 5

// БД.
class A
{
private:  
  static DATA DataArray[SIZE]; // База данных.
  static DATA* Data;           // Выбранный элемент БД.
  
public:
  static void Set( const int Num ) // Выбор элемента и перемешение элементов БД.
  {
    A::Data = &A::DataArray[Num % SIZE];
    
    ::ArrayReverse(A::DataArray); // Перемешение элементов БД.
  }
  
  static int Get() { return(A::Data.Num); } // Получение значения элемента.
};

static DATA A::DataArray[5];
static DATA* A::Data;

Каждый раз, когда идет выбор элемента из БД, ее элементы перемешиваются. Искусственно, но так надо, чтобы объяснить.


И вот нужно сделать следующее.

void OnStart()
{  
  A::Set(2);
  Print(A::Get()); // Какое-то значение Value.

  // Перемешиваем БД.
  MathSrand((int)TimeLocal());
  for (int i = MathRand(); i >= 0; i--)
    A::Set(i);
    
  Print(A::Get()); // Что-то образовалось.  
  
  Print(A::Get()); // Здесь хочется получить Value.
}

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


Требуется как-то дописать БД-класс, чтобы можно было это сделать. При этом нельзя давать доступ к указателю на элемент (DATA*).

 
fxsaber #:

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

Требуется как-то дописать БД-класс, чтобы можно было это сделать. При этом нельзя давать доступ к указателю на элемент (DATA*).

Конструкция-решение в виде дописывания нескольких строк в БД-класс.

// БД.
class A
{
// Тело класса до решения задачи.
// .....

// В БД-класс дописываются эти строки.
public:
  class POINTER
  {
  private:
    DATA* Data;
    
  public:
    POINTER() : Data(A::Data) {}
    
    void Set() const { A::Data = this.Data; }
  };  
};


После этого OnStart выглядит так.

void OnStart()
{  
  A::Set(2);
  Print(A::Get()); // Какое-то значение Value.

  A::POINTER Pointer; // Запоминание элемента без доступа к нему.

  // Перемешиваем БД.
  MathSrand((int)TimeLocal());
  for (int i = MathRand(); i >= 0; i--)
    A::Set(i);
    
  Print(A::Get()); // Что-то образовалось.  
  
  Pointer.Set(); // Запомненный элемент становится выбранным в БД.
  Print(A::Get()); // Здесь хочется получить Value.
}

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

 
fxsaber #:

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

Надеюсь, это не недоработка MQL-языка, а удобный стандарт (особенность).

class A
{
  private: static int Num;
    
  public: struct B { static int Get() { return(A::Num); } };
};

static int A::Num = 5;

void OnStart()
{
  Print(A::B::Get()); // 5
}
 
fxsaber #:

Надеюсь, это не недоработка MQL-языка, а удобный стандарт (особенность).

По аналогии с С++. Вложенный класс является friend для включающего класса. Там это в стандарте прописано. Тут тоже в справке неплохо было бы написать)
Причина обращения: