Características del lenguaje mql5, sutilezas y técnicas - página 228

 
fxsaber #:
Añadido.

Los que solían escribir sin usar const no pueden hacerlo ahora. De lo contrario, se producirá un error.

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 la novedad promete graves errores en los códigos escritos anteriormente.

 

Lo siento."TRADE_EVENT_POSITION_OPEN =0x1" x1 es el primer bit de la lista de eventos???? Es decir, en esa parte de eventos enum, ¿se pueden tener todos los bits disponibles así?


Por favor, hágamelo saber.

 

Hay dos tipos de corredores, que traducen el tiempo de EE.UU. / Europa. Debido a esto, en particular, el tiempo de rollover se desplaza.

El tipo de broker se puede determinar automáticamente.

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


Lanzamiento de resultados en algunos corredores.

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

¡Hola!

No sé si estoy haciendo mi pregunta en el hilo correcto o no ...

La esencia de la pregunta - Hice un panel con botones, campos de entrada y etiquetas basadas en AppDialog de la biblioteca estándar.

El cliente se ha quejado de que al hacer zoom a través de la configuración de personalización de Windows,

sólo se escalan las fuentes en el panel, pero los propios controles no se escalan, como resultado, las inscripciones sobrepasan los bordes de los controles.

¿Cómo puedo solucionar el problema para que no sólo se escalen las fuentes, sino también los tamaños de los elementos del panel y del propio panel?

Por supuesto, tengo una pequeña reserva y puedo aumentar ligeramente el tamaño de los elementos, entonces si aumento los parámetros de la pantalla al 125%

todo cabrá, pero si lo aumento al 150%, entonces no cabrá nada.

Así que quiero resolver el problema radicalmente, para que los elementos del panel y el propio panel también aumenten en proporción a la escala. ¿Cómo hacerlo?

Entiendo que es necesario de alguna manera, probablemente a través de WIN IP para obtener esta cifra de escala - 100%, o 125% o 150%. La pregunta es ¿cómo implementarlo en el código de EA?



P.D. Para aclarar. El programa utiliza la biblioteca estándar MQL5, pero está escrito en MQL4.


Agradezco de antemano a todos los que respondan....

 
Vitaliy Davydov biblioteca estándar.

El cliente se quejó de que al hacer zoom a través de la configuración de personalización de Windows,

sólo las fuentes se escalan en el panel, pero los propios controles no se escalan, como resultado las inscripciones van más allá de los bordes del control.

¿Cómo puedo solucionar el problema para que no sólo se escalen las fuentes, sino también los tamaños de los elementos del panel y del propio panel?

Por supuesto, tengo una pequeña reserva y puedo aumentar ligeramente el tamaño de los elementos, entonces cuando aumente los parámetros de la pantalla al 125%.

todo cabrá, pero si lo aumento al 150%, entonces no cabrá nada.

Así que quiero resolver el problema radicalmente, para que los elementos del panel y el propio panel también aumenten en proporción a la escala. ¿Cómo hacerlo?

Entiendo que es necesario de alguna manera, probablemente a través de WIN IP para obtener esta cifra de escala - 100%, o 125% o 150%. La pregunta es ¿cómo implementarlo en el código EA?



P.D. Para aclarar. El programa utiliza la biblioteca estándar MQL5, pero está escrito en MQL4.


Agradezco de antemano a todos los que respondan....

Intenta definir el tamaño del texto antes de crear los objetos usando TextSetFont() y TextGetSize()

 
Alexey Viktorov #:

Intente definir el tamaño del texto mediante TextSetFont() y TextGetSize() antes de crear objetos.

TextGetSize() ayudó, gracias.
 

Conseguí montar una construcción de bicicleta, que puse en práctica. Intentaré contároslo brevemente.

Se trabaja con una base de datos.

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

Cada vez que se selecciona un elemento de la base de datos, se mezclan sus elementos. Artificialmente, pero es necesario explicarlo.


Y aquí tenemos que hacer lo siguiente.

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

Explicación del código: se selecciona un elemento por primera vez, luego se hace muchas veces. Y necesitamos obtener el elemento que fue seleccionado la primera vez.


Necesitamos añadir de alguna manera una clase DB para poder hacer esto. Al mismo tiempo es imposible dar acceso al puntero al elemento (DATA*).

 
fxsaber #:

Explicación del código: seleccionamos un elemento por primera vez, y luego lo hacemos muchas veces. Y necesitamos obtener el elemento que fue seleccionado la primera vez.

Necesitamos añadir de alguna manera una clase de base de datos para que sea posible hacer esto. Al mismo tiempo es imposible dar acceso al puntero al elemento (DATA*).

La solución es añadir unas líneas a la clase DB.

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

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


Después de eso OnStart se parece a esto.

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

Es posible hacer esto porque la clase definida en el cuerpo de la clase principal tiene acceso a los miembros estáticos ocultos de esta clase principal.

 
fxsaber #:

definida en el cuerpo de una clase principal tiene acceso a los miembros estáticos ocultos de esa clase principal.

Espero que esto no es un defecto de la lengua MQL, pero una norma conveniente (característica).

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 esto no sea un defecto en el lenguaje MQL, sino un estándar conveniente (característica).

Por analogía con C ++. Una clase anidada es un amigo para la clase que incluye. Está escrito en el estándar de allí. Sería bueno escribirlo en la ayuda aquí también)
Razón de la queja: