Questions d'un "mannequin - page 111

 
openlive:

Maintenant, ça me donne...

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

Tout d'abord, vérifiez ce que vous avez dans le dossier C:\Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDD286B60B1DB9B989A2FFC701\MQL5Files\N

Deuxièmement : il n'y a pas d'erreur 32 dans MQL5. C'est étrange... Vérifiez-vous le handle après avoir essayé d'ouvrir le fichier et le dernier code d'erreur après avoir essayé de l'ouvrir ?

 
DenisR:
Qu'est-ce que le "mode mathématique" ?
En mode de calcul mathématique, il n'y a pas d'historique, ce qui permet d'atteindre la vitesse maximale lorsque vous devez effectuer des calculs mathématiques sans utiliser d'opérations de trading. Dans ce mode, si vous optimisez un Expert Advisor de trading , vous devrez modéliser vous-même l'environnement du marché (données historiques, spread, etc.). Dans ce cas, vous pouvez utiliser n'importe quelles données historiques, les prendre dans un fichier préparé à l'avance.
 
DenisR:
Qu'est-ce que le "mode calculs mathématiques" ?

Dans ce mode, seul OnTester() est appelé ; toutefois, la complexité et le volume des calculs dans OnTester() ne sont pas limités. Si vous calculez le bénéfice de votre conseiller expert pour les paramètres d'entrée donnés, vous pouvez utiliser l'algorithme génétique du testeur pour l'optimisation.
 

Aidez-moi à comprendre, mon cerveau est en ébullition.

1. Je comprends que le passage à x64 OS est lié au fait qu'il est impossible de "partitionner" plus de 4 Go de RAM sur 4 octets. J'ai le système d'exploitation x64, pourquoi les pointeurs occupent-ils 4 octets (cela ne concerne pas seulement mql, mais aussi C++)) ?

2. Question sur MT4 : pourquoi lorsque j'appelle la fonction dll :

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

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

La variable dll peut être prise normalement dans ces variantes :

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

Bien que je suppose que le pointeur et la référence, par idée ne devraient pas être compatibles, par exemple parce que le pointeur sur le double prend 4 octets dans mon cas.

Cela fonctionne comme suit :

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

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

Ça ne marche pas :

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

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

Au moins, comment cela fonctionnerait-il (je veux passer plusieurs tableaux) ? Je ne veux pas le faire en revenant en arrière.

 
220Volt:

Au moins comment le faire correctement (je veux passer plusieurs tableaux) ? Parce que je ne veux pas passer par la porte de derrière.

Et dans MQL, qui mettra & dans la déclaration de la fonction ?
 
sergeev:
Et dans MQL, qui mettra & dans la déclaration de fonction ?

Oui, ce serait probablement la bonne chose à faire. Mais ce n'est pas comme si MQL fonctionnait en C de toute façon (je peux me tromper).

 
220Volt:

Oui, ce serait probablement la bonne chose à faire. Seulement MKL ne fonctionne pas d'une certaine manière par C de toute façon (je peux me tromper).

il y a une différence dans la transmission - tout doit être transmis uniquement par référence &, par pointeur ' * ' seuls les objets de classe peuvent être transmis.

 

Je pensais qu'une zone de mémoire élémentaire était constituée de deux parties - une adresse et une valeur. Si une adresse est transmise, elle doit être dans une variable avec l'adresse de la zone transmise dans le champ "valeur". C'est pourquoi je ne comprends pas comment de telles variantes peuvent fonctionner correctement en même temps :

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

Nous pouvons essayer de trouver une explication telle que - la zone de mémoire est transférée "telle quelle" et le côté récepteur décide de ce qu'il faut en faire (écrire l'adresse à la valeur ou copier l'adresse). Mais cette hypothèse est détruite par le fait que cela ne fonctionne pas de cette façon :

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

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

On pourrait encore essayer de trouver une explication : dans les premiers duplicatas, l'adresse du champ "valeur" est donnée en entrée, et le destinataire décide de ce qu'il doit en faire. En revanche, le fait qu'en C++ le compilateur dise de ne pas le faire, à son avis ou presque :

fn(int *x)
{
}

int i;
fn(&i);

ou ceci :

fn(int &x)
{
}

int i;
fn(i); 
En somme, je ne vois que des contradictions.
 

Vous demandez, je réponds.

J'en suis venu à la conclusion qu'un lien et un pointeur sont essentiellement la même chose. Il existe de légères différences :

  • Vous pouvez écrire une adresse dans une référence une seule fois, dans un pointeur plusieurs fois.
  • Une syntaxe différente

Un point très important : si la fonction appelée a une référence ou un pointeur comme argument, l'adresse est réellement transmise. Il est très important de comprendre cela lorsque l'on appelle depuis dll.

 

Pouvez-vous me dire comment trouver la valeur exacte du croisement de la ligne stochastique principale et de l'indicateur ?

Visuellement, c'est facile, mais comment l'implémenter de manière programmatique ?