Englisch (Original): Ich möchte einen Antrag auf eine MQL-Sprachfunktion stellen. Wenn dies nicht der richtige Thread ist, lassen Sie es mich bitte wissen. Die ursprüngliche Anfrage befindet sich im englischen Forum ...
Russisch (Google-Übersetzung): Ich möchte einen Antrag für eine MQL-Sprachfunktion stellen.Wenn dies nicht der richtige Thread ist, lassen Sie es mich bitte wissen.Die ursprüngliche Anfrage befindet sich im englischen Forum ...
Ein weiterer Lifehack für Zugriffsrechte: Wenn Sie den unwiderstehlichen Wunsch haben, einer anderen Klasse Zugriff auf private Felder/Funktionen einer Klasse zu gewähren, können Sie mit den Standard-MQL-Werkzeugen Folgendes tun:
Wir müssen: den Zugriff auf A::f1() von B aus ermöglichen.
//--------- как былоclass A
{
int m;
int f1() {return m;} // нужно дать к нему доступ классу Bpublic:
A(int a): m(a) {}
};
class B {};
Lassen Sie uns das so umschreiben:
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;
Um (A)a.f1() innerhalb von B aufzurufen, rufen Sie CallAf1(a) auf. Wenn f1() Parameter hat, fügen wir sie zu CallAf1() hinzu.
Test:
voidOnStart()
{
A f(2);
B::_f1_test(f);
}
Sie können CallAf1() geschützt machen, aber das wird ein großes Loch in die Zugriffsrechte reißen - irgendwo im Code können Sie einen Nachkommen der Klasse B erstellen und darin eine öffentliche Methode, um CallAf1() aufzurufen - d.h. jeder wird Zugriff auf A::f1() haben.
P.S. Das Konstrukt ist sehr umständlich (wenn Sie wollen, können Sie es in Makros packen), aber es hat einen Vorteil gegenüber Friend C++: Es gibt Zugriff nicht auf alle Klassenmitglieder, sondern nur auf ausgewählte.
Ein weiterer Lifehack für Zugriffsrechte: Wenn Sie den unwiderstehlichen Wunsch haben, einer anderen Klasse Zugriff auf private Felder/Funktionen einer Klasse zu gewähren, können Sie dies mit den Standard-MQL-Werkzeugen tun
Es hat lange gedauert, bis ich das verstanden habe... guter Schritt mit der Virtualisierung, danke!
fxsaber #: Es hat lange gedauert, bis ich mich darauf eingelassen habe... guter Schritt mit der Virtualisierung, danke!
Das einzige, was ich am Anfang nicht geschrieben habe, ist, dass man keine Objekte der Klasse B::AB2 (und deren Nachkommen) mehr erstellen kann, sonst fällt alles auseinander :-)
Wenn Sie diesen Expert Advisor im Tester im Modus "Alle Symbole" ausführen
inputint inTmp = 0; // https://www.mql5.com/ru/forum/321656/page90#comment_44727856bool Res = true;
// Проверяет, нормализована ли цена по алгоритму NormalizeDouble.bool IsNDPrice( constdouble &Price )
{
return(Price == NormalizeDouble(Price, 5));
}
// Проверяет, нормализована ли цена, как при парсинге или ручном вводе.bool IsNDPrice2( constdouble &Price )
{
return(Price == (double)DoubleToString(Price, 5));
}
voidOnTick()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick))
// Res &= IsNDPrice(Tick.bid) && IsNDPrice(Tick.ask); // OnTester == 1.
Res &= IsNDPrice2(Tick.bid) && IsNDPrice2(Tick.ask); // OnTester == 0.
}
doubleOnTester()
{
return(Res);
}
zeigt, dass alle Preise mit dem Algorithmus NormalizeDouble normalisiert werden. Wenn Sie mit Preisen arbeiten, die nicht vom Terminal, sondern durch Parsing oder manuelle Eingabe erhalten wurden, müssen diese normalisiert werden, um korrekt zu funktionieren. Es gibt keinen Grund, sich zu irren.
REASON_ACCOUNT (auch wenn das Konto nicht geändert wird, sondern nur ein Re-Login erfolgt) wird der Expert Advisor komplett entladen und eine neue Kopie geladen.
Aus diesem Grund wirkt sich ExpertRemove in OnDeinit nicht auf die neue Kopie aus, da es die entladene Kopie berührt.
Nach Deinit wartet die neue EA-Kopie mehr als eine Sekunde (bis zu zwei Sekunden), um zu starten. Was sind die Gründe für eine so lange Wartezeit und ist es möglich, diese zu verkürzen?
SymbolInfoTick gibt bei jedem dieser drei Aufrufe den neuesten Tick zurück. Das heißt, die so genannte Sammlung von Ticks ohne Überspringen von Indikatoren ist gelinde gesagt fragwürdig.
Beweis für die Unmöglichkeit des Sammelns von Ticks durch einen Indikator (ohne Überspringen).
Englisch (Original): Ich möchte einen Antrag auf eine MQL-Sprachfunktion stellen. Wenn dies nicht der richtige Thread ist, lassen Sie es mich bitte wissen. Die ursprüngliche Anfrage befindet sich im englischen Forum ...
Russisch (Google-Übersetzung): Ich möchte einen Antrag für eine MQL-Sprachfunktion stellen. Wenn dies nicht der richtige Thread ist, lassen Sie es mich bitte wissen. Die ursprüngliche Anfrage befindet sich im englischen Forum ...
Wie füllt man ein Array mit einer Zeile?
clr_struct clr[] = {{0x999999}, {0x999999}};Ein weiterer Lifehack für Zugriffsrechte: Wenn Sie den unwiderstehlichen Wunsch haben, einer anderen Klasse Zugriff auf private Felder/Funktionen einer Klasse zu gewähren, können Sie mit den Standard-MQL-Werkzeugen Folgendes tun:
Wir müssen: den Zugriff auf A::f1() von B aus ermöglichen.
Lassen Sie uns das so umschreiben:
Um (A)a.f1() innerhalb von B aufzurufen, rufen Sie CallAf1(a) auf. Wenn f1() Parameter hat, fügen wir sie zu CallAf1() hinzu.
Test:
Sie können CallAf1() geschützt machen, aber das wird ein großes Loch in die Zugriffsrechte reißen - irgendwo im Code können Sie einen Nachkommen der Klasse B erstellen und darin eine öffentliche Methode, um CallAf1() aufzurufen - d.h. jeder wird Zugriff auf A::f1() haben.
P.S. Das Konstrukt ist sehr umständlich (wenn Sie wollen, können Sie es in Makros packen), aber es hat einen Vorteil gegenüber Friend C++: Es gibt Zugriff nicht auf alle Klassenmitglieder, sondern nur auf ausgewählte.
Ein weiterer Lifehack für Zugriffsrechte: Wenn Sie den unwiderstehlichen Wunsch haben, einer anderen Klasse Zugriff auf private Felder/Funktionen einer Klasse zu gewähren, können Sie dies mit den Standard-MQL-Werkzeugen tun
Es hat lange gedauert, bis ich mich darauf eingelassen habe... guter Schritt mit der Virtualisierung, danke!
REASON_ACCOUNT (auch wenn das Konto nicht geändert wird, sondern nur ein Re-Login erfolgt) wird der Expert Advisor komplett entladen und eine neue Kopie geladen.
Aus diesem Grund wirkt sich ExpertRemove in OnDeinit nicht auf die neue Kopie aus, da es die entladene Kopie berührt.
Ergebnis nach Neuanmeldung.
Nach Deinit wartet die neue EA-Kopie mehr als eine Sekunde (bis zu zwei Sekunden), um zu starten. Was sind die Gründe für eine so lange Wartezeit und ist es möglich, diese zu verkürzen?
SymbolInfoTick gibt bei jedem dieser drei Aufrufe den neuesten Tick zurück. Das heißt, die so genannte Sammlung von Ticks ohne Überspringen von Indikatoren ist gelinde gesagt fragwürdig.
Beweis für die Unmöglichkeit des Sammelns von Ticks durch einen Indikator (ohne Überspringen).
Ergebnis.
Forum über Trading, automatisierte Handelssysteme und das Testen von Handelsstrategien
Fehler, Bugs, Fragen
fxsaber, 2023.02.14 13:11
Leider zieht MQL4 diese Art von Arbeit noch nicht.