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를 기반으로 버튼, 입력 필드 및 레이블이 있는 패널을 만들었습니다.

고객이 Windows 개인화 설정을 통해 확대할 때 글꼴만 확대된다는 불만을 제기했습니다,

패널에서 글꼴만 확대되지만 컨트롤 자체는 확대되지 않아서 비문이 컨트롤 테두리를 넘어간다고 불평했습니다.

글꼴뿐만 아니라 패널 요소의 크기와 패널 자체의 크기가 조정되도록 문제를 해결하려면 어떻게해야합니까?

물론, 나는 작은 예비가 있고 요소의 크기를 약간 늘릴 수 있으며 화면 매개 변수를 125 %로 늘리면 모든 것이 맞을 것입니다.

모든 것이 맞을 것이지만 150 %로 늘리면 아무것도 맞지 않습니다.

그래서 저는 문제를 근본적으로 해결하여 패널의 요소와 패널 자체도 규모에 비례하여 증가하도록하고 싶습니다. 어떻게 해야 하나요?

100%, 125% 또는 150%와 같은 스케일 수치를 얻으려면 아마도 WIN IP를 통해 어떻게 든 필요하다는 것을 알고 있습니다. 문제는 EA 코드에서이를 구현하는 방법입니다.



추신 : 설명을 위해. 이 프로그램은 표준 MQL5 라이브러리를 사용하지만 MQL4로 작성되었습니다.


응답 해 주실 모든 분들께 미리 감사드립니다....

 
Vitaliy Davydov 표준 라이브러리의 AppDialog를 기반으로 버튼, 입력 필드 및 레이블이있는 패널을 만들었습니다.

고객이 Windows 개인 설정 설정을 통해 확대할 때 문제가 발생한다고 불평했습니다,

패널에서 글꼴만 확대되지만 컨트롤 자체는 확대되지 않아 비문이 컨트롤 테두리를 넘어간다고 불평했습니다.

글꼴뿐만 아니라 패널 요소의 크기와 패널 자체의 크기가 조정되도록 문제를 해결하려면 어떻게 해야 하나요?

물론, 나는 작은 예비가 있고 요소의 크기를 약간 늘린 다음 화면 매개 변수를 125 %로 늘리면 요소의 크기를 약간 늘릴 수 있습니다.

모든 것이 맞을 것이지만 150 %로 늘리면 아무것도 맞지 않습니다.

그래서 저는 문제를 근본적으로 해결하여 패널의 요소와 패널 자체도 규모에 비례하여 증가하도록하고 싶습니다. 어떻게 할까요?

100%, 125% 또는 150%와 같은 스케일 수치를 얻으려면 아마도 WIN IP를 통해 어떻게 든 필요하다는 것을 알고 있습니다. 문제는 EA 코드에서 이를 구현하는 방법입니다.



추신 : 설명을 위해. 이 프로그램은 표준 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.
}

코드 설명 : 처음으로 요소를 선택한 다음 여러 번 수행합니다. 그리고 처음에 선택한 요소를 가져와야합니다.


이 작업을 수행하려면 어떻게 든 DB 클래스를 추가해야합니다. 동시에 요소(DATA*)에 대한 포인터에 대한 액세스 권한을 부여하는 것은 불가능합니다.

 
fxsaber #:

코드 설명: 처음으로 요소를 선택한 다음 여러 번 수행했습니다. 그리고 처음 선택한 항목을 가져와야 합니다.

이를 가능하게하려면 어떻게 든 데이터베이스 클래스를 추가해야합니다. 동시에 요소(DATA*)에 대한 포인터에 대한 액세스 권한을 부여하는 것은 불가능합니다.

해결책은 DB 클래스에 몇 줄을 추가하는 것입니다.

// БД.
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 언어의 결함이 아니라 편리한 표준(기능)이기를 바랍니다.

C++와 비유하자면. 중첩 클래스는 포함 클래스의 친구입니다. 그것은 거기에 표준으로 작성되었습니다. 여기 도움말에도 작성하는 것이 좋을 것입니다.)
사유: