Domande da un "manichino" - pagina 111

 
openlive:

Ora mi sta dando...

2012.02.26 15:47:46 Tester file C:-Usersopenlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DD286B60B1DB9B9989A2FFC701\MQL5\Files\signal10000.csv open error [32]

Per prima cosa, controlla cosa hai nella cartella C:-Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDD286B60B1DB9B989A2FFC701\MQL5Files\

Secondo: non c'è nessun errore 32 in MQL5. Strano... Controllate l'handle dopo aver provato ad aprire il file e l'ultimo codice di errore dopo aver provato ad aprirlo?

 
DenisR:
Cos'è la "modalità matematica"?
Nella modalità dei calcoli matematici non ci sono corse della storia - a causa di questo la velocità massima è raggiunta quando è necessario fare calcoli matematici senza utilizzare operazioni di trading. In questa modalità, se ottimizzi un Expert Advisor di trading , dovrai modellare da solo l'ambiente di mercato (dati storici, spread, ecc.). In questo caso, è possibile utilizzare qualsiasi dato storico, prenderlo da un file pre-preparato.
 
DenisR:
Cos'è la "modalità di calcolo matematico"?

In questa modalità, solo OnTester() viene chiamato; tuttavia, la complessità e il volume dei calcoli in OnTester() non è limitato. Se si calcola il profitto del vostro Expert Advisor per i parametri di input dati, è possibile utilizzare l'algoritmo genetico del tester per l'ottimizzazione.
 

Per favore aiutatemi a capire, il mio cervello sta bollendo.

1. Capisco che il passaggio al sistema operativo x64 è legato al fatto che è impossibile "partizionare" più di 4 GB di RAM su 4 byte. Ho il sistema operativo x64, perché i puntatori occupano 4 byte (non riguarda solo mql, ma anche C++))?

2. Domanda su MT4: perché quando chiamo la funzione dll:

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

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

La variabile dll può essere presa normalmente in queste varianti:

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

Anche se presumo che puntatore e riferimento, per idea non dovrebbero essere compatibili, per esempio perché il puntatore al doppio prende 4 byte nel mio caso.

Funziona così:

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

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

Non funziona:

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

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

Almeno come funzionerebbe (voglio passare più array)? Non voglio farlo via backtracking.

 
220Volt:

Almeno come farlo correttamente (voglio passare diversi array)? Perché non voglio passare dalla porta di servizio.

E in MQL, chi metterà & nella dichiarazione di funzione?
 
sergeev:
E in MQL, chi metterà & nella dichiarazione di funzione?

Sì, probabilmente sarebbe la cosa giusta da fare. Ma non è che MQL funzioni comunque in C (potrei sbagliarmi).

 
220Volt:

Sì, probabilmente sarebbe la cosa giusta da fare. Solo MKL non funziona in qualche modo da C comunque (posso sbagliarmi).

c'è una differenza nel passaggio - tutto deve essere passato solo per riferimento &, per puntatore ' * ' solo gli oggetti di classe possono essere passati

 

Pensavo che un'area di memoria elementare fosse composta da due parti: un indirizzo e un valore. Se un indirizzo viene trasmesso, deve essere in qualche variabile con l'indirizzo dell'area da trasmettere nel campo "valore". Ecco perché non capisco come queste varianti possano funzionare correttamente allo stesso tempo:

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

Possiamo provare a trovare una spiegazione come - viene trasferita l'area di memoria "così com'è" e il lato ricevente decide cosa fare con essa (scrivere l'indirizzo al valore o copiare l'indirizzo). Ma questa ipotesi è distrutta dal fatto che non funziona così:

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

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

Si potrebbe di nuovo cercare una spiegazione - nei primi duplicati, l'indirizzo nel campo "valore" è dato come input, e la parte ricevente decide cosa fare con esso. In contrasto con questo, il fatto che in C++ il compilatore dice di non farlo, a suo parere o così:

fn(int *x)
{
}

int i;
fn(&i);

o questo:

fn(int &x)
{
}

int i;
fn(i); 
Tutto sommato, non vedo altro che contraddizioni.
 

Tu chiedi, io rispondo.

Sono giunto alla conclusione che un link e un puntatore sono essenzialmente la stessa cosa. Ci sono leggere differenze:

  • Si può scrivere un indirizzo in un riferimento solo una volta, in un puntatore molte volte.
  • Sintassi diversa

Un punto molto importante è: se la funzione chiamata ha un riferimento o un puntatore come argomento, l'indirizzo viene effettivamente passato. Questo è molto importante da capire quando si chiama da dll.

 

Puoi dirmi come trovare il valore esatto dell'incrocio della linea stocastica principale e dell'indicatore?

Visivamente è facile, ma come implementarlo programmaticamente?

Motivazione: