Fehler, Irrtümer, Fragen - Seite 1525

 
Yuri Evseenkov:

MT4. Ich möchte Sie noch einmal auf die Besonderheiten der Initialisierung globaler Programmvariablen aufmerksam machen.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Slawa, 2016.02.24 07:34

Warteschlange. Die Anwendung ist erst zwei Stunden alt.

Im Allgemeinen sollten solche Fragen im Forum gestellt werden. Weil viele davon betroffen sein können. Ich erlaube mir, Sie zu zitieren und sofort zu antworten

Dies ist ein geplantes Verhalten. Dies wird in der Dokumentation sogar ausdrücklich beschrieben

Das Hoch- und Herunterladen erfordert eine vollständige Neuinitialisierung aller Daten.

In fünf Ländern ist die Situation, wie Sie richtig festgestellt haben, ähnlich.

Es ist wahr, es war historisch in vier, und wir änderten dieses Verhalten zunächst bei der Umstellung auf neue MQL4 (damit es sich wie in Experten verhalten, d.h. wie Sie erwarten). Bei den alten Indikatoren, die auf dieser Initialisierung basierten, ergaben sich jedoch eine Menge Fragen. Wir waren gezwungen, zurückzukehren

Bei den fünf war dies aufgrund der Architektur sofort der Fall. Wenn Sie die Parameter ändern, wird der alte Indikator mit den alten Parametern zerstört und ein neuer Indikator mit geänderten Parametern angelegt.


 
Alexey Kozitsyn:

Danke. Fazit - ein Zitat aus der Dokumentation: "... vordefinierte Funktion OnInit(), deren Zweck die korrekte Initialisierung aller globalen und statischen Variablen des Programms ist."

So Null oder Standard alle globalen Variablen oder Arrays zuOnInit().

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
События клиентского терминала - Программы MQL4 - Справочник MQL4
 

1. Ich erstelle ein Array der Form:

CArrayString list[5];

2. Ich versuche, die Methodenliste über <Strg+Leertaste> aufzurufen.

list[0].
Die Liste der Methoden wird nicht angezeigt. Ist das so gewollt?
 
Andrey Voytenko:

1. Ich erstelle ein Array der Form:

2. Ich versuche, die Liste der Methoden im Code über <Strg+Leertaste> aufzurufen.

Die Liste der Methoden wird nicht angezeigt. Ist das so gewollt?

Lassen Sie mich versuchen, eine Vermutung anzustellen. Wenn der Code neben der Tatsache, dass die Methode/das Mitglied nicht angegeben ist, noch andere Fehler enthält, wird die Liste nicht immer angezeigt.

Ich habe es ausprobiert. Nein, falsche Annahme. Aber ein paar wiederholte Betätigungen der Kombination halfen.

 

Alexey Kozitsyn:

Aber ein paar wiederholte Betätigungen der Kombination halfen.

Leider funktioniert Ihr Rezept bei mir nicht.
 
Andrey Voytenko:
Leider funktioniert Ihr Rezept bei mir nicht.
Nein, das ist richtig, wenn es einen Fehler im Code gibt, erscheint die Liste der offenen Mitglieder/Methoden nicht. Aber wenn es keinen Fehler gibt... dann Ärger.
 

1. Einfacher Code:

uint a=50;
int b=-20;
Print(fmax(a,b));

Ergebnis: 50

2. Hinzufügen von Modifikatoreingaben:

input uint  a=50;
int b=-20;
Print(fmax(a,b));

Ergebnis: 4294967276

Erwartet wurde ein Ergebnis von 50. Wo liege ich falsch?

 
Andrey Voytenko:

1. Einfacher Code:

Ergebnis: 50

2. Wir fügen einen Modifier-Eingang hinzu:

Ergebnis: 4294967276

Ich hatte ein Ergebnis von 50 erwartet. Wo liege ich falsch?

fmax vergleicht zwei doppelte Zahlen. Es geht also folgendermaßen:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.01"
#property script_show_inputs
//---
input uint a=50;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//uint a=50;
   int b=-20;
   Print("\"uint a=50\" as double:",DoubleToString((double)a,8));
   Print("\"int b=-20\" as double:",DoubleToString((double)b,8));
   Print(DoubleToString(fmax((double)b,(double)a),8));
  }
//+------------------------------------------------------------------+

und das Ergebnis:

2016.03.03 16:00:24.821 Test (EURUSD,D1)        "uint a=50" as double:50.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        "int b=-20" as double:-20.00000000
2016.03.03 16:00:24.821 Test (EURUSD,D1)        50.00000000
Dateien:
Test.mq5  2 kb
 
Karputov Vladimir:

fmax vergleicht zwei doppelte Zahlen. Es geht also folgendermaßen:

In MQL wird eine implizite Typumwandlung deklariert und durchgeführt. Insbesondere uint -> double.

Die Frage ist, warum es mit den Eingabevariablen nicht richtig funktioniert.

 
Andrey Voytenko:

1. Einfacher Code:

Ergebnis: 50

2. Hinzufügen des Eingabemodifikators:

Ergebnis: 4294967276.

Ich hatte ein Ergebnis von 50 erwartet. Wo liege ich falsch?

Bitte geben Sie mir den vollständigen Code.

Hier gibt es 2 Möglichkeiten, und beide sind falsch.

1. Der Code wird außerhalb aller Funktionen ausgeführt.

2. die Eingangsvariable wird innerhalb der Funktion deklariert