Chiamare funzioni dalla dll e restituire risultati - pagina 6

 
Che f1-forum
Mike = Terranin = me :) E ti ho già dato l'emulatore sul forum Alpari. MTS non mi interessa molto, se sapessi quanti di loro si sono schiantati sul mio emulatore... :)
 
2 mike
:)) Questo è quello che ho pensato. Se siete interessati, potete vedere il mio sistema qui
http://forum.alpari-idc.ru/viewtopic.php?t=45555
È un po' un casino, naturalmente...
Se vuoi, ti descrivo il sistema, visto che mi hai aiutato con l'emulatore.
 
OK, se vuoi condividere, allora a murdoc (at) newmail.ru. Lo eseguirò sul mio tester e vi farò sapere i risultati.
 
Renat:<br / translate="no"> Per _default_ qualsiasi importazione da una DLL è _completamente_ vietata_. Questa è la protezione.
Se volete usare una DLL esterna, basta attivare il pulsante "Confirm each DLL function call" e vedere cosa viene chiamato lì. Anche questa è una protezione. Così come la protezione di tutte le operazioni sui file incorporati con accesso solo alle directory /history e /files.

Se una persona offre l'Expert Advisor al pubblico con la sua DLL, l'utente si fida o no di questa DLL. Se non si fida, non lo scaricherà. Se si fida, dovrà spuntare la casella "Allow import of DLL functions", altrimenti l'esperto non funzionerà. Anche i nomi delle funzioni che stai chiamando non saranno utili all'Expert Advisor, perché per sapere cosa fa una funzione, dovrai smontare la DLL, e non tutti sono in grado di farlo. E in questa DLL si possono fare un sacco di cose brutte, e il terminale MT non può impedirlo. Quindi la "protezione" è molto relativa e non è una vera protezione in questo contesto. Penso che questo sia ciò che Mike intendeva.

La possibilità di chiamare funzioni da DLL utente in MT 4 Expert Advisors è posizionata come una sostituzione di API che è presente in MT 3. Quindi, tutto sommato, c'è la possibilità di trasformare il terminale MT 4 in un datafeed e di piazzare ordini, che era una delle ragioni (a giudicare da vari argomenti sul forum) per cui l'API è stata rimossa. Ma l'API è rimasta, è molto scomoda, molti utenti ne parlano, e ricorda la situazione dello scherzo: ".... Non mi interessa, basta che ti stanchi". E questo argomento ne è una conferma. L'autore non ha ricevuto alcuna risposta specifica e informativa alle sue domande. Queste domande sono rilevanti anche per me, le risposte sono ancora più rilevanti :-).
Forse nemmeno io sono un programmatore esperto, ma nell'attuale sistema Expert Advisor<->DLL, non si può, per definizione, avere una soluzione semplice e bella. Per essere più precisi, nell'ambito di MQL4 ci può essere una bella soluzione, ma nell'ambito dell'integrazione del terminale MT4 con il software personalizzato non è niente, per usare un eufemismo. Ci sono altre soluzioni più funzionali, bisogna solo trovarle :-). Per esempio, possiamo creare una DLL con funzioni come in mtapi.dll, ma interagirà non con il server del centro dealing, ma con il terminale client. In questo caso sia gli interessi dello sviluppatore saranno preservati (senza il terminale MT4 la DLL non sarà in grado di funzionare) e le persone che sono in grado di creare qualcosa di più complesso di MQL4 Expert Advisors, avranno una buona opportunità di integrare il loro software (compresa la loro gui) con il sistema di trading. Se una tale variante è stata considerata e discussa, per favore datemi un link (non mi sono imbattuto in una tale variante). In caso contrario, mi piacerebbe conoscere l'opinione degli sviluppatori su questo argomento.

P.S. La stringa "possibilità di usare il client API" nella descrizione del terminale di trading è molto attraente. Questo è ciò che mi ha attratto di MetaTrader, e sono rimasto molto deluso dalla mancanza di API nella versione 4 del terminale. Spero che gli sviluppatori da una parte e gli utenti API dall'altra arrivino a un compromesso. Lo stato attuale delle cose (chiamare funzioni DLL da ekperts) è insoddisfacente.
 
Mi sono imbattuto in un problema, ovviamente potrei essere troppo lento e non ho capito bene.....

Ho una dll compilata per VC++
c'è una funzione:

void __stdcall process_arr(double *in, double *out, int size);

c'è una tale dichiarazione nell'Expert Advisor:
#importare "some.dll"
void process_arr(double in[], double& out[], int size);

Gli array sono dichiarati dopo:

doppio arr1[100];
doppio arr2[100];

poi inizializzo il primo array e li passo entrambi nella funzione
process_arr(arr1,arr2,100);

tutto viene passato, ma la funzione si rifiuta di restituirlo

Dopo il ritorno dalla funzione, emetto il valore del test:
Stampa(arr2[1]);
e la seguente voce appare nel log
2005.09.19 18:30:03 arrtest EURUSD,H1: 2147483647
Non è questo il punto, cosa c'entra 2^31....?
funziona allo stesso modo con qualsiasi altro elemento dell'array.
anche se sotto il debugger prima di uscire dalla funzione i valori nell'array out sono come dovrebbero essere (vicino al prezzo - ~1.2)
 
Il numero 2147483647 è molto vicino allo zero, sembra.
2^31-1 per essere esatti, che dovrebbe essere come zero.
 
void __stdcall process_arr(double *in, double *out, int size); <br / translate="no">
Ecco la dichiarazione nell'Expert Advisor:
#importare "some.dll"
void process_arr(double in[], double& out[], int size);


Solo un suggerimento (perché non ho familiarità con MQL): è davvero necessario & per il secondo parametro?
void process_arr(double in[], double& out[], int size);
 
a Rosh, è vero, ma stiamo parlando del tipo doppio, e lì la rappresentazione dei numeri è "leggermente" diversa, e 2^31 è abbastanza lontano da 0.... :(

a VicK, l'ampersand è l'intero punto, grazie ad esso posso effettivamente cambiare il contenuto dell'array...
il secondo array è un array con valori di ritorno
 
a VicK, l'ampersand è l'intero punto, è l'unico modo in cui posso cambiare il contenuto dell'array... <br / translate="no"> il secondo array è un array con valori di ritorno


In questo caso non c'è essenza nell'ampersand (l'ho appena provato io stesso), e si può cambiare il contenuto dell'array grazie a qualcos'altro :-). Hai guardato l'esempio di DLL nella directory? Lì tutto funziona bene. Fatelo nello stesso modo.
 
sembra che l'ampersand non faccia alcuna differenza se si tratta di array di tipo double[]
ma tutto funziona bene con int[]. Ho il sospetto che qui cominci a puzzare di bug.... :(
Mi piacerebbe conoscere i commenti degli sviluppatori

se questa cosa venisse con il codice sorgente, nessuno si preoccuperebbe, ma... Vai avanti, sto chiedendo aiuto.