Fragen von einem "Dummy" - Seite 111

 
openlive:

Jetzt gibt er mir...

2012.02.26 15:47:46 Prüfdatei C:\Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDD286B60B1DB9B9989A2FFC701\MQL5\Files\signal10000.csv open error [32]

Prüfen Sie zunächst, was Sie im Ordner C:\Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDD286B60B1DB9B989A2FFC701\MQL5Files\ haben.

Zweitens: Es gibt keinen Fehler 32 in MQL5. Seltsam... Überprüfen Sie das Handle nach dem Versuch, die Datei zu öffnen, und den letzten Fehlercode nach dem Versuch, sie zu öffnen?

 
DenisR:
Was ist der "Mathe-Modus"?
Im Modus für mathematische Berechnungen gibt es keine Verlaufsläufe - dadurch wird die maximale Geschwindigkeit erreicht, wenn Sie mathematische Berechnungen durchführen müssen, ohne Handelsoperationen zu verwenden. Wenn Sie in diesem Modus einen Expert Advisor für den Handel optimieren, müssen Sie das Marktumfeld (historische Daten, Spread usw.) selbst modellieren. In diesem Fall können Sie beliebige historische Daten verwenden oder sie aus einer vorbereiteten Datei übernehmen.
 
DenisR:
Was ist der "Modus für mathematische Berechnungen"?

In diesem Modus wird nur OnTester() aufgerufen; die Komplexität und der Umfang der Berechnungen in OnTester() sind jedoch nicht begrenzt. Wenn Sie den Gewinn Ihres Expert Advisors für die gegebenen Eingabeparameter berechnen, können Sie den genetischen Algorithmus des Testers zur Optimierung verwenden.
 

Bitte helfen Sie mir zu verstehen, mein Gehirn kocht.

1. Ich verstehe, dass der Wechsel zu x64 OS mit der Tatsache verbunden ist, dass es unmöglich ist, mehr als 4 GB RAM auf 4 Bytes zu "partitionieren". Ich habe die x64 OS, warum die Zeiger belegen 4 Bytes (es betrifft nicht nur mql, aber C++ als gut))?

2. Frage zu MT4: Warum kann ich, wenn ich die dll-Funktion aufrufe:

#import "MemoryDLL.dll"
void fn(double j[]);           // Подозреваю что так отдается адрес?
#import

int start()
{
   double dVal[1];
   fn(dVal);
   retutn(0);
} 

Die Variable dll kann in diesen Varianten normal verwendet werden:

extern "C" __declspec(dllexport) void fn(double &j);       // Почему так работает????
// и так
extern "C" __declspec(dllexport) void fn(double *j);       // Думаю что должно работать только так

Obwohl ich davon ausgehe, dass Zeiger und Verweis, von der Idee sollte nicht kompatibel sein, zum Beispiel, weil der Zeiger auf double nimmt 4 Bytes in meinem Fall.

Es funktioniert folgendermaßen:

#import "MemoryDLL.dll"
void fn(double j);           
#import
                                                  // Согласен

extern "C" __declspec(dllexport) void fn(double j);  

Funktioniert nicht:

#import "MemoryDLL.dll"
void fn(double j);           
#import
                                                  // Почему нет???

extern "C" __declspec(dllexport) void fn(double &j);  

Zumindest wie würde es funktionieren (ich möchte mehrere Arrays übergeben)? Ich möchte das nicht durch Rückverfolgung erreichen.

 
220Volt:

Zumindest, wie man es richtig zu tun (Ich möchte mehrere Arrays übergeben)? Denn ich möchte nicht durch die Hintertür gehen.

Und in MQL, wer setzt & in die Funktionsdeklaration?
 
sergeev:
Und in MQL, wer setzt & in die Funktionsdeklaration?

Ja, das wäre wahrscheinlich die richtige Entscheidung. Aber es ist ja nicht so, dass MQL in C funktioniert (ich könnte mich irren).

 
220Volt:

Ja, das wäre wahrscheinlich die richtige Entscheidung. Nur MKL funktioniert bei C sowieso nicht irgendwie (ich kann mich irren).

es gibt einen Unterschied bei der Übergabe - alles muss nur per Referenz übergeben werden &, per Zeiger ' * ' können nur Klassenobjekte übergeben werden

 

Ich dachte, dass ein elementarer Speicherbereich aus zwei Teilen besteht - einer Adresse und einem Wert. Wird eine Adresse übermittelt, muss sie in einer Variablen stehen, wobei die Adresse des zu übertragenden Bereichs im Feld "Wert" steht. Deshalb verstehe ich auch nicht, wie solche Varianten gleichzeitig richtig funktionieren können:

extern "C" __declspec(dllexport) void fn(double &j);  
// и так
extern "C" __declspec(dllexport) void fn(double *j);  
// Прототип для MQL - void fn(&s[]);

Wir können versuchen, eine Erklärung zu finden, wie z.B. - es wird ein Speicherbereich "wie er ist" übertragen und die empfangende Seite entscheidet, was damit zu tun ist (die Adresse in den Wert zu schreiben oder die Adresse zu kopieren). Diese Hypothese wird jedoch durch die Tatsache zerstört, dass es so nicht funktioniert:

extern "C" __declspec(dllexport) void fn(double j);  

// Прототип для MQL - void fn(&s[]);

Man könnte wieder versuchen, eine Erklärung zu finden - bei den ersten Duplikaten wird die Adresse im Feld "Wert" als Eingabe angegeben, und die empfangende Seite entscheidet, was damit zu tun ist. Im Gegensatz dazu steht die Tatsache, dass der Compiler in C++ sagt, dies nicht zu tun, seiner Meinung nach oder so:

fn(int *x)
{
}

int i;
fn(&i);

oder dies:

fn(int &x)
{
}

int i;
fn(i); 
Alles in allem sehe ich nichts als Widersprüche.
 

Sie fragen, ich antworte.

Ich bin zu dem Schluss gekommen, dass ein Link und ein Zeiger im Wesentlichen das Gleiche sind. Es gibt leichte Unterschiede:

  • Sie können eine Adresse nur einmal in einen Verweis schreiben, in einen Zeiger dagegen mehrmals.
  • Unterschiedliche Syntax

Ein sehr wichtiger Punkt ist: Wenn die aufgerufene Funktion eine Referenz oder einen Zeiger als Argument hat, wird die Adresse tatsächlich übergeben. Dies ist sehr wichtig, wenn Sie von dll aus anrufen.

 

Können Sie mir sagen, wie ich den genauen Wert der Kreuzung zwischen der Hauptlinie und der Indikatorlinie der Stochastik ermitteln kann?

Optisch ist es einfach, aber wie setzt man es programmatisch um?