Fehler, Irrtümer, Fragen - Seite 2460

 
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>
   void operator=(T value){                  // при замене данной строки на "void operator=(T &value){" происходит перезапись оператора присвоения в классе наследнике B (код не компилируется).
      this.data = value;   
   };
   
   void operator=(DATA_TYPE &_data){
      this.data = _data;   
   };
};

struct A{
   string data;
   
   void operator=(string value){
      data = value;
   };
};

struct B : Wrapper<A>{};


void OnStart(){  
  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:
class_name & class_name :: operator= ( const class_name & ) = default;  
class_name & class_name :: operator= ( const class_name & ) = delete;   
 

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

 
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?
 

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?

 
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?

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
  string str = "123456789";
  PRINT(str);
  PRINT(StringLen(str));
  
  
  PRINT(StringSetLength(str, StringLen(str)-1));
  PRINT(str);
  PRINT(StringLen(str));
  
  PRINT(StringSetLength(str, StringLen(str)+2));
  PRINT(str);
  PRINT(StringLen(str));
}

Ergebnis:
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:123456789
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):9
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringSetLength(str,StringLen(str)-1):true
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:12345678
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):8
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringSetLength(str,StringLen(str)+2):false
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      str:12345678
2019.05.15 01:22:08.208 StringFormat_1 (EURUSD,H1)      StringLen(str):8
 
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))

void OnStart(){  
  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.

Könnten Sie diese Idee näher erläutern?

 
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.