Características da linguagem mql5, subtilezas e técnicas - página 228

 
fxsaber #:
Adicionado.

Aqueles que costumavam escrever sem usar const não podem fazer isso agora. Caso contrário, haverá um erro.

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
}

Parece que a inovação promete bugs graves em códigos escritos anteriormente.

 

Desculpe-me."TRADE_EVENT_POSITION_OPEN =0x1" x1 é o primeiro bit da lista de eventos???? Quero dizer, nessa parte do evento enum, você pode ter todos os bits disponíveis dessa forma?


Por favor, me informe.

 

Há dois tipos de corretoras que traduzem o horário dos EUA para o da Europa. Devido a isso, em particular, o horário de rollover é alterado.

O tipo de corretora pode ser determinado automaticamente.

// Вычисление типа брокера (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"));
}


Resultados do lançamento em algumas corretoras.

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

Olá!

Não sei se estou fazendo minha pergunta no tópico certo ou não...

A essência da pergunta: criei um painel com botões, campos de entrada e rótulos com base no AppDialog da biblioteca padrão.

O cliente reclamou que, ao aumentar o zoom por meio das configurações de personalização do Windows,

apenas as fontes são ampliadas no painel, mas os controles em si não são ampliados, o que faz com que as inscrições ultrapassem as bordas do controle.

Como posso resolver o problema de modo que não apenas as fontes, mas também os tamanhos dos elementos do painel e o próprio painel sejam dimensionados?

É claro que tenho uma pequena reserva e posso aumentar um pouco o tamanho dos elementos; então, se eu aumentar os parâmetros da tela para 125%, tudo caberá.

tudo caberá, mas se eu aumentar para 150%, nada caberá.

Portanto, quero resolver o problema radicalmente, de modo que os elementos do painel e o próprio painel também aumentem em proporção à escala. Como fazer isso?

Entendo que é necessário, de alguma forma, provavelmente por meio do WIN IP, obter esse valor de escala - 100%, 125% ou 150%. A questão é como implementar isso no código do EA?



P.S. Para esclarecimento. O programa usa a biblioteca MQL5 padrão, mas foi escrito em MQL4.


Agradeço antecipadamente a todos que responderem....

 
Vitaliy Davydov biblioteca padrão.

O cliente reclamou que, ao aumentar o zoom por meio das configurações de personalização do Windows,

apenas as fontes são ampliadas no painel, mas os controles em si não são ampliados, o que faz com que as inscrições ultrapassem as bordas do controle.

Como posso resolver o problema de modo que não apenas as fontes, mas também os tamanhos dos elementos do painel e o próprio painel sejam dimensionados?

É claro que tenho uma pequena reserva e posso aumentar um pouco o tamanho dos elementos e, depois, quando aumentar os parâmetros da tela para 125%.

tudo caberá, mas se eu aumentar para 150%, nada caberá.

Portanto, quero resolver o problema radicalmente, de modo que os elementos do painel e o próprio painel também aumentem em proporção à escala. Como fazer isso?

Entendo que é necessário, de alguma forma, provavelmente por meio do WIN IP, obter esse valor de escala - 100%, 125% ou 150%. A questão é como implementar isso no código do EA?



P.S. Para esclarecimento. O programa usa a biblioteca MQL5 padrão, mas foi escrito em MQL4.


Agradeço antecipadamente a todos que responderem....

Tente definir o tamanho do texto antes de criar objetos usando TextSetFont() e TextGetSize()

 
Alexey Viktorov #:

Tente definir o tamanho do texto por meio de TextSetFont() e TextGetSize() antes de criar objetos

TextGetSize() ajudou, obrigado.
 

Consegui montar uma construção de bicicleta, que coloquei em prática. Vou tentar lhe contar brevemente.

Existe um trabalho desse tipo com um banco de dados.

// Элемент БД.
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;

Toda vez que um item é selecionado no banco de dados, seus elementos são misturados. Artificialmente, mas é necessário explicar.


E aqui precisamos fazer o seguinte.

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.
}

Explicação do código: você seleciona um elemento pela primeira vez e depois o faz várias vezes. E precisamos obter o elemento que foi selecionado pela primeira vez.


Precisamos, de alguma forma, adicionar uma classe DB para que possamos fazer isso. Ao mesmo tempo, é impossível dar acesso ao ponteiro para o elemento (DATA*).

 
fxsaber #:

Explicação do código: selecionou um elemento pela primeira vez e depois o fez várias vezes. E precisamos obter o item que foi selecionado na primeira vez.

Precisamos, de alguma forma, adicionar uma classe de banco de dados para que isso seja possível. Ao mesmo tempo, é impossível dar acesso ao ponteiro do elemento (DATA*).

A solução é adicionar algumas linhas à classe DB.

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

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


Depois disso, o OnStart terá a seguinte aparência.

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.
}

É possível fazer isso porque a classe definida no corpo da classe principal tem acesso aos membros estáticos ocultos dessa classe principal.

 
fxsaber #:

definida no corpo de uma classe principal tem acesso aos membros estáticos ocultos dessa classe principal.

Espero que isso não seja uma falha da linguagem MQL, mas um padrão (recurso) conveniente.

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 #:

Espero que isso não seja uma falha na linguagem MQL, mas um padrão (recurso) conveniente.

Por analogia com o C++. Uma classe aninhada é uma amiga da classe que a inclui. Isso está escrito no padrão de lá. Seria bom escrever isso na ajuda aqui também)