Fehler, Irrtümer, Fragen - Seite 2654

 

Kann uns jemand die folgende Frage beantworten?

Ich habe eine in C# geschriebene, aber kompilierte DLL:

- für MT5 übliches C# Projekt - Net Framework dll - 64 bit

- MT4 - Net Framework dll - 32 Bit, aber in verwaltete C-Aufrufe verpackt

Sources dll sind 100% identisch, außer MT4 Wrapper natürlich,

Betriebssystem Win10-64

Nun, die Frage ist, warum MT4 ruft Funktionen genau 4 mal schneller, die Zahlen sind etwa 100 000 dll Anrufe auf MT4 für 7,5 Sekunden, MT5 für 30 Sekunden

 
Igor Makanu:

Kann uns jemand die folgende Frage beantworten?

Ich habe eine in C# geschriebene, aber kompilierte DLL:

- für MT5 übliches C# Projekt - Net Framework dll - 64 bit

- MT4 - Net Framework dll - 32 Bit, aber in verwaltete C-Aufrufe verpackt

Sources dll sind 100% identisch, außer MT4 Wrapper natürlich,

Betriebssystem Win10-64

Nun, die Frage ist, warum MT4 ruft Funktionen genau 4 mal schneller, die Zahlen sind etwa 100 000 dll Anrufe auf MT4 für 7,5 Sekunden, MT5 für 30 Sekunden

IMHO. C-Runtime in einem Fall und eine virtuelle Maschine im anderen.

 
vermisst eine neue Funktion auf dem Forum, wo der Vorname, Nachname, Datum und neben der Schaltfläche Übersetzungen, Zahlen - 1 2 3, nicht jeder hat es, gestern ich glaube, ich hatte es auch nicht, warum nicht jeder, und was ist die Seite Definition?
 

Im Expert Advisor ist eine grafische Schnittstelle implementiert. Auch Benutzerereignisse sind implementiert (z. B. GUI-Änderungsereignisse). Ich führe die Fehlersuche an echten Daten durch (F5). Sobald ich einen Breakpoint auf ein Benutzerereignis setze - hält der Debugger an, aber das anschließende Drücken von F5 (Fortsetzen des Debuggens) führt nicht zu Änderungen in der GUI selbst. Frage: Sollte dies der Fall sein, oder ist dies ein Debugger-Fehler?

Wenn ich den Haltepunkt entferne (das Debugging geht weiter), sind die Änderungen in der GUI normal.

MT5, Build 2340.

 
Vladimir Simakov:

IMHO. C-Runtime in einem Fall und eine virtuelle Maschine im anderen.

in beiden DLLs ist ein virtuelles .Net enthalten

ich habe den Unterschied im Code gefunden, ich habe sogar die 32-Bit-Basisklasse in einen separaten Thread geworfen, weil es keine andere Möglichkeit gibt, zu arbeiten

Ich habe die gleichen Manipulationen für MT5 vorgenommen, die Ergebnisse sind mehr oder weniger die gleichen (jeweils drei Tests):

MT5: cycle 100000 , time 8.482981 sec , cycle 100000 , time 8.638789 sec , cycle 100000 , time 8.390046 sec

MT4: Zyklus 100000 , Zeit 7.128857 sec , Zyklus 100000 , Zeit 7.176361 sec , Zyklus 100000 , Zeit 7.205439 sec


OK, nehmen wir an, es ist eine Art Schnaps von Microsoft
 

Grüße! Schöne Feiertage für alle Männer !!!!
Ich verstehe nicht, woher der seltsame Fehler mit der Zickzack-Anzeige des Eigenkapitals im Testgerät kommt. Ich verstehe den seltsamen Fehler mit der Zickzack-Anzeige der Aktien im Tester nicht. Wenn ich die Einstellung "Abrechnungsmethode" von "Tauschbörse" auf "Forex" ändere, wird das Eigenkapital normal angezeigt. Ich habe vor einigen Jahren die gleiche Erfahrung gemacht: Ich wollte versuchen, MT5 mit einem Fonds zu verbinden, testete es, bekam Angst und gab auf. Jetzt habe ich es noch einmal versucht, und es ist dasselbe. Ist das seltsam?

 
Warum gibt es keine Möglichkeit, eine Funktion mit einem "universellen" Argument zu implementieren, das jede Variable unabhängig von ihrem "Ursprung" übergeben kann: lvalue, rvalue, literal oder temporäre Variable?
Das Problem ist lösbar für Methoden von "typisierten" Containerklassen, aber nicht für normale Funktionen.

Der Hauptwiderspruch besteht darin, dass für die Übertragung von Strukturen die Übertragung per Referenz und für Literale und temporäre Variablen die Übertragung per Wert verwendet werden muss.
Als Ergebnis erhalten wir einen Kompilierungsfehler für normale lvalue-Typen, da beide überladenen Funktionen für den Aufruf geeignet sind.
Als Teillösung und nur für "primitive" Typen können Sie 12 überladene Funktionen erstellen:
#define  CREATE_LITERAL_PARAMETER_CALL_HANDLERS_VOID_T1_P2_L2(current_func_name, main_func_name, param_1)          \
   template<typename T> void current_func_name(param_1 p1, const string  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const long    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const int     value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const short   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const char    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ulong   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uint    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ushort  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uchar   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const double  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const float   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const bool    value){ main_func_name(p1, value);}    
Wenn aber eine Funktion zwei "universelle" Argumente akzeptieren soll, dann werden nur 144 überladene Funktionen benötigt, um sie zu implementieren, während im Falle von drei solchen Argumenten die ganzen 1728 überladenen Funktionen benötigt werden.


Anregung:
Schließlich können die Benutzer Literale und temporäre Variablen als const ref Funktionsargumente übergeben.
Lassen Sie es eine separate # Richtlinie sein - was auch immer...
 

Defekte in der Template-Funktion/Klassen-Cache-Operation:
(nicht behoben durch MT5(build 2340)) ** Undefiniertes Verhalten, Sie erstellen ein komplexes umhülltes Objekt mit internem Typ "C" mehrmals und es stellt sich heraus, dass es ein völlig anderer Datentyp ist, vielleicht "B", vielleicht "int", was immer Sie wollen...
(nicht behoben durch MT5(build 2340)) * Kompilierfehler, Fehler bei der Übergabe eines Funktionszeigers als const ref Template-Argument.
(nicht behoben durch MT5(build 2340)) * Kompilierfehler, B<int> Objekt kann nach dem B<void*> Klassenobjekt erstellt werden, aber wenn dies vorher geschieht, tritt ein Kompilierfehler auf.


Defekte in der Funktion/Klasse der Vorlage:
(nicht behoben durch MT5(build 2340)) ** Kompilierfehler, Fehler innerhalb der Template-Funktion, übergebener Zeiger innerhalb einerexpliziten Typkonvertierungsoperation verhält sich wie eine Klasse, sonst wie ein Zeiger.
(nicht behoben durch MT5(build 2340)) ** Kompilierfehler, Fehler bei der Generierung von Template-Klassencode bei Verwendung einer internen Klasse.
(nicht behoben durch MT5(build 2340)) ** Kompilierfehler, Fehler beim Versuch, auf eine interne Klasse für einen Template-Parameter einer Template-Funktion zuzugreifen.
(nicht behoben durch MT5(build 2340)) ** Kompilierfehler, Fehler bei der Erzeugung von Template-Methoden/Klassen, der Prozess der "automatischen Ersetzung" des Template-Parameters geht außerhalb des Scops in den Hauptprogrammcode.
(nicht behoben durch MT5(build 2340)) * Compile Error, der Fehler mit der Template-Klasse, die nicht automatisch Code generiert, wenn die Template-Klasse als Rückgabewert für die Template-Methode fungiert.
(nicht behoben durch MT5(build 2340)) * Kompilierfehler, Fehler in der internen Klassendefinition - es gibt keine Möglichkeit, bei der Angabe der Basisklasse explizit auf den globalen Namespace zu verweisen.


Defekte bei überladenen Funktionsaufrufen, die in MQL im Vergleich zu C++ nicht mit der Priorität übereinstimmen:
(nicht behoben durch MT5(build 2340)) *** Kompilierfehler, wenn es eine Klassenvererbung A <= B <= C <= D gibt und zwei Überladefunktionen implementiert sind, z.B. eine mit Parameter A* und eine mit Parameter B*, dann führt die Übergabe eines Objekts C* oder D* in MQL zu einem Kompilierfehler "ambiguous call to overloaded function".
(nicht behoben durch MT5(build 2340)) ** Laufzeit, Prioritätsfehlanpassung bei überladenen Template-Funktionsaufrufen.



Vorschläge:
link- über die Möglichkeit, Literale und temporäre Variablen als const ref Funktionsargumente zu übergeben.
Link- beimVerschieben von Projektdateien in der Registerkarte Projekt, für verschobene Dateien, die geöffnet sind und sich in ME-Registerkarten befinden, um ihren Speicherortpfad automatisch zu aktualisieren.
link- zur Einführung der Funktionalität der Typdeklaration in MQL.
link- über die Möglichkeit, die Erzeugung von Standard-Kopierkonstruktoren und Zuweisungsoperatoren zu erzwingen.


 

Ich bitte um Hilfe, ich bin völlig überfordert.

In OnChartEvent kann ich durch Drücken von "C" das Preisdiagramm abbrechen bzw. wiederherstellen.

Und alles wäre in Ordnung, aber wenn das Tastaturlayout nicht ausgewählt ist Englisch - funktioniert nicht.


Wie kann man die Erkennung des Drückens von "C" unabhängig vom gewählten Layout machen?

 
fxsaber:

Ich bitte um Hilfe, ich bin völlig überfordert.

In OnChartEvent kann ich durch Drücken von "C" das Preisdiagramm abbrechen bzw. wiederherstellen.

Und alles wäre in Ordnung, aber wenn das Tastaturlayout nicht ausgewählt ist Englisch - funktioniert nicht.


Wie kann man erreichen, dass die Erkennung des Drückens von "C" unabhängig vom gewählten Layout ist?

lparam muss überprüft werden

//+------------------------------------------------------------------+
//|                                                 TranslateKey.mq5 |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
  {
   if(id==CHARTEVENT_KEYDOWN)
     {
      short sym=TranslateKey((int)lparam);
      //--- if the entered character is successfully converted to Unicode
      if(sym>0)
         Print("lparam: ",lparam,", ",sym,"'",ShortToString(sym),"'");
      else
         Print("Error in TranslateKey for key=",lparam);
     }
  }
//+------------------------------------------------------------------+

Für die Tastaturlayouts ru und en (sowohl Klein- als auch Großbuchstaben) ist lparam gleich 67:

TranslateKey (EURUSD,H1)        lparam: 67, 67'C'
TranslateKey (EURUSD,H1)        lparam: 67, 1057'С'
TranslateKey (EURUSD,H1)        Error in TranslateKey for key=20
TranslateKey (EURUSD,H1)        lparam: 67, 1089'с'
TranslateKey (EURUSD,H1)        lparam: 67, 99'c'