Bitten Sie ME-Entwickler, STRG+SHIFT+F zu drücken und "MQL5Info" einzugeben. Korrigieren Sie die in den resultierenden SB-Dateien gefundenen Unzulänglichkeiten.
Ich habe 2 Stunden gebraucht, um das Problem aus dem Projektcode zu isolieren.
#define PRINT(x) Print(#x, ":", string(x))
template<typename DATA_TYPE>
struct Wrapper{
uchar type;
DATA_TYPE data;
template<typename T>
voidoperator=(T value){ // при замене данной строки на "void operator=(T &value){" происходит перезапись оператора присвоения в классе наследнике B (код не компилируется).this.data = value;
};
voidoperator=(DATA_TYPE &_data){
this.data = _data;
};
};
struct A{
string data;
voidoperator=(string value){
data = value;
};
};
struct B : Wrapper<A>{};
voidOnStart(){
B b;
string str_value;
b = str_value;
A a;
b = a;
B b1;
b = b1;
}
Mit dem obigen Code alles funktioniert wie erwartet, jedoch, wenn wir versuchen, Funktionalität zu erweitern und Unterstützung nicht nur für einfache Typen wie (String) von Klasse A, sondern auch für Strukturen hinzufügen, es stellt sich heraus, dass Vorlage Zuweisung Operator von Basisklasse beginnt überschreiben Standard-Zuweisung Operatoren von nachgeordneten Klassen, alle Funktionalität zu töten. Andere Operatoren können als Umgehung verwendet werden, wie z. B. "operator*=", aber das ist ein Chaos.
An Entwickler: Bitte fügen Sie die Möglichkeit hinzu, erzwungene Codegenerierung für den Standard-Zuweisungsoperator (Kopierkonstruktor) anzugeben:
Wissende Menschen, ein Tipp! Ich habe ein benutzerdefiniertes Symbol, das auf einem echten Symbol basiert. Wie kann ich einen Handel im Chart dieses Symbols verfügbar machen? Oder gibt es diese Funktion im MT5 nicht?
In neueren Versionen von MT wird als Teil des Paradigmenwechsels bei der Behandlung von Zeichenketten die Verwendung von Zeichenketten mit NULL-Terminierung aufgegeben. Die Funktionsweise der Funktion StringSetLength wirft jedoch eine Reihe von Fragen auf.
Mit StringSetLength kann man die Länge einer Zeichenkette nur abschneiden, aber nicht erhöhen, was irgendwie keinen Sinn macht. Ist dieses Verhalten beabsichtigt?
Der Benutzer würde sich lieber selbst erschießen, als ein "vollwertiges"StringSetLength zu implementieren, bei dem "neue" Zeichen mit 0x0000 initialisiert werden.
#define PRINT(x) Print(#x, ":", string(x))
voidOnStart(){
string str = "123\x0000\x0000\x0000\x0000456789";
PRINT(str);
PRINT(StringLen(str)); // StringLen(str):13 StringLen поддерживает работу с 0х0000 short value
PRINT(StringSetLength_using_StringInit(str, 100)); // false StringInit не поддерживает работу с 0х0000 short value
PRINT(StringSetLength_using_ShortArrayToString(str, 100)); // false ShortArrayToString не поддерживает работу с 0х0000 short value
PRINT(StringSetLength_using_StringInit_with_StringFill(str, 100)); // false StringFill не поддерживает работу с 0х0000 short value
}
bool StringSetLength_using_StringInit(string &string_var, int new_length){
bool result = false;
int prev_length = StringLen(string_var);
if(new_length == prev_length){
result = true;
return result;
}
string data = string_var;
if(new_length < prev_length){
StringSetLength(data, new_length);
}else{
string string_tail;
StringInit(string_tail, new_length - prev_length, 0x0000);
data += string_tail;
}
if(StringLen(data) == new_length){
string_var = data;
result = true;
}
return result;
}
bool StringSetLength_using_ShortArrayToString(string &string_var, int new_length){
bool result = false;
int prev_length = StringLen(string_var);
if(new_length == prev_length){
result = true;
return result;
}
string data = string_var;
if(new_length < prev_length){
StringSetLength(data, new_length);
}else{
short data_array[];
StringToShortArray(data, data_array);
ArrayResize(data_array, new_length);
ArrayFill(data_array, prev_length, new_length - prev_length, 0x0000);
data = ShortArrayToString(data_array, 0, new_length);
}
if(StringLen(data) == new_length){
string_var = data;
result = true;
}
return result;
}
bool StringSetLength_using_StringInit_with_StringFill(string &string_var, int new_length){
bool result = false;
int prev_length = StringLen(string_var);
if(new_length == prev_length){
result = true;
return result;
}
string data = string_var;
if(new_length < prev_length){
StringSetLength(data, new_length);
}else{
string string_tail;
StringInit(string_tail, new_length - prev_length, 0x1111);
StringFill(string_tail, 0x0000);
data += string_tail;
}
if(StringLen(data) == new_length){
string_var = data;
result = true;
}
return result;
}
Sergey Dzyublik: In neueren Versionen von MT wird im Rahmen des Paradigmenwechsels bei der Behandlung von Strings die Verwendung von Strings mit NULL-Terminierung abgelehnt.
rsrozhkov: Erfahrene Leute, könnt ihr mir einen Tipp geben! Ich habe ein benutzerdefiniertes Symbol auf der Grundlage eines echten Symbols erstellt. Wie kann ich einen Handel über den Chart dieses Symbols verfügbar machen? Oder gibt es diese Funktion im MT5 nicht?
Die Antwort ist selbsterklärend. Ein benutzerdefiniertes Symbol wird durch eine Art von Transformation aus realen Symbolen gewonnen. Jemand (EA, Skript oder manuell) muss die umgekehrte Transformation durchführen und Aufträge für die echten Symbole senden.
Mit dem obigen Code alles funktioniert wie erwartet,
jedoch, wenn wir versuchen, Funktionalität zu erweitern und Unterstützung nicht nur für einfache Typen wie (String) von Klasse A, sondern auch für Strukturen hinzufügen,
es stellt sich heraus, dass Vorlage Zuweisung Operator von Basisklasse beginnt überschreiben Standard-Zuweisung Operatoren von nachgeordneten Klassen, alle Funktionalität zu töten.
Andere Operatoren können als Umgehung verwendet werden, wie z. B. "operator*=", aber das ist ein Chaos.
An Entwickler:
Bitte fügen Sie die Möglichkeit hinzu, erzwungene Codegenerierung für den Standard-Zuweisungsoperator (Kopierkonstruktor) anzugeben:
Können Sie mir sagen, ob ich Standard-Indikatoren in meinem EA verwenden kann, z. B. iMA,
Wie stelle ich ihre Zeichenstile so ein, dass sie im Visualisierungsfenster korrekt angezeigt werden?
Können Sie mir sagen, ob ich Standard-Indikatoren in meinem EA verwenden kann, z. B. iMA,
Wie kann ich die Zeichenstile so einstellen, dass sie im Visualisierungsfenster korrekt angezeigt werden?
So geht's:Benutzerdefinierte gleitender Durchschnitt Eingabefarbe
So geht's:Benutzerdefinierte gleitender Durchschnitt Eingabefarbe
Sie müssen sogar Ihren eigenen Indikator schreiben. Die Umschreibung der Standardindikatoren ist keine Lösung.
Die Frage war, wie man den Stil für den Standard-Indikator genau festlegt.
Gibt es einen anderen Weg?
Die Funktionsweise der Funktion StringSetLength wirft jedoch eine Reihe von Fragen auf.
Mit StringSetLength kann man die Länge einer Zeichenkette nur abschneiden, aber nicht erhöhen, was irgendwie keinen Sinn macht.
Ist dieses Verhalten beabsichtigt?
Ergebnis:
In neueren Versionen von MT wird im Rahmen des Paradigmenwechsels bei der Behandlung von Strings die Verwendung von Strings mit NULL-Terminierung abgelehnt.
Könnten Sie diese Idee näher erläutern?
Erfahrene Leute, könnt ihr mir einen Tipp geben! Ich habe ein benutzerdefiniertes Symbol auf der Grundlage eines echten Symbols erstellt. Wie kann ich einen Handel über den Chart dieses Symbols verfügbar machen? Oder gibt es diese Funktion im MT5 nicht?
Die Antwort ist selbsterklärend. Ein benutzerdefiniertes Symbol wird durch eine Art von Transformation aus realen Symbolen gewonnen. Jemand (EA, Skript oder manuell) muss die umgekehrte Transformation durchführen und Aufträge für die echten Symbole senden.