액세스 권한에 대한 또 하나의 라이프핵입니다: 한 클래스의 비공개 필드/함수에 대한 액세스 권한을 다른 클래스에게 부여하고 싶은 경우 표준 MQL 도구를 사용하여 다음과 같이 할 수 있습니다:
B에서 A::f1()에 액세스해야 합니다.
//--------- как былоclass A
{
int m;
int f1() {return m;} // нужно дать к нему доступ классу Bpublic:
A(int a): m(a) {}
};
class B {};
다음과 같이 다시 작성해 보겠습니다:
class A;
class B
{
private:
class AB
{
public:
virtualint CallAf1(A&) const = 0;
AB() {ABptr = &this;}
} static *ABptr;
// внутри B используем этот метод для получения доступа к A::f1()staticint CallAf1(A & obj)
{
return ABptr.CallAf1(obj);
}
public:
class AB2: AB {};
// вспомогательный метод - только для проверкиstaticvoid _f1_test(A & obj)
{
Print("test ", CallAf1(obj));
}
};
B::AB *B::ABptr = NULL;
class A
{
int m;
int f1() {return m;}
public:
A(int a): m(a) {}
//-- добавленоprivate:
class AB3: B::AB2
{
int CallAf1(A &obj) const {return obj.f1();}
} staticconst ABlink;
};
const A::AB3 A::ABlink;
B 내에서 (A)a.f1()을 호출하려면 CallAf1(a)를 호출합니다. f1()에 매개변수가 있는 경우 CallAf1()에 매개변수를 추가합니다.
테스트:
voidOnStart()
{
A f(2);
B::_f1_test(f);
}
CallAf1()을 보호할 수는 있지만, 코드의 어느 곳에서나 B 클래스의 하위 클래스를 만들고 그 안에 CallAf1()을 호출하는 공용 메서드를 만들 수 있으므로 접근 권한에 큰 구멍이 생기게 됩니다 - 즉, 모든 사람이 A::f1()에 접근할 수 있게 됩니다.
추신 이 구조는 매우 번거롭지만(원한다면 매크로에 넣을 수 있습니다), 친구 C++에 비해 한 가지 장점이 있습니다: 모든 클래스 멤버가 아니라 선택한 멤버에게만 액세스 권한을 부여한다는 점입니다.
영어(원문): MQL 언어 기능 요청을 하고 싶습니다. 이 스레드가 올바른 스레드가 아닌 경우 알려주세요. 원래 요청은 영어 포럼에 있습니다...
러시아어(Google 번역): MQL 언어 기능 요청을 하고 싶습니다. 이 스레드가 올바른 스레드가 아니라면 알려주세요. 원래 요청은 영어 포럼에 있습니다...
배열을 한 줄로 채우는 방법은 무엇인가요?
액세스 권한에 대한 또 하나의 라이프핵입니다: 한 클래스의 비공개 필드/함수에 대한 액세스 권한을 다른 클래스에게 부여하고 싶은 경우 표준 MQL 도구를 사용하여 다음과 같이 할 수 있습니다:
B에서 A::f1()에 액세스해야 합니다.
다음과 같이 다시 작성해 보겠습니다:
B 내에서 (A)a.f1()을 호출하려면 CallAf1(a)를 호출합니다. f1()에 매개변수가 있는 경우 CallAf1()에 매개변수를 추가합니다.
테스트:
CallAf1()을 보호할 수는 있지만, 코드의 어느 곳에서나 B 클래스의 하위 클래스를 만들고 그 안에 CallAf1()을 호출하는 공용 메서드를 만들 수 있으므로 접근 권한에 큰 구멍이 생기게 됩니다 - 즉, 모든 사람이 A::f1()에 접근할 수 있게 됩니다.
추신 이 구조는 매우 번거롭지만(원한다면 매크로에 넣을 수 있습니다), 친구 C++에 비해 한 가지 장점이 있습니다: 모든 클래스 멤버가 아니라 선택한 멤버에게만 액세스 권한을 부여한다는 점입니다.
액세스 권한에 대한 또 하나의 라이프핵입니다: 한 클래스의 비공개 필드/함수에 대한 액세스 권한을 다른 클래스에 부여하고 싶은 경우, 표준 MQL 도구를 사용하여 이를 수행할 수 있습니다.
오랜 시간이 걸렸습니다... 가상화에 대한 좋은 움직임, 감사합니다!
이유_계정이 변경되지 않고 재로그인만 완료된 경우에도 Expert Advisor가 완전히 언로드되고 새 사본이 로드됩니다 .
따라서 OnDeinit의 ExpertRemove는 언로드된 복사본을 건드리기 때문에 새 복사본에는 영향을 미치지 않습니다.
재로그인 후 결과.
Deinit 후 새 EA 복사본이 시작될 때까지 1초 이상(최대 2초) 대기합니다. 이렇게 오래 기다리는 이유는 무엇이며 속도를 높일 수 있나요?
SymbolInfoTick은이 세 번의 호출 각각에서 최신 틱을 반환합니다. 즉, 지표를 건너 뛰지 않고 소위 틱을 수집하는 것은 가볍게 말하면 의심 스럽습니다.
지표로 틱을 수집 할 수 없다는 증거 (건너 뛰지 않음).
결과.
트레이딩, 자동매매 시스템 및 트레이딩 전략 테스트 포럼
오류, 버그, 질문
fxsaber, 2023.02.14 13:11
안타깝게도 MQL4는 아직 이런 종류의 작업을 지원하지 않습니다.