Sviluppato una libreria di funzioni API per MetaTrader 4 - pagina 7

 
Buon pomeriggio, quindi mi sono consultato con un programmatore che conosco, e mi ha spiegato che se questa DLL non è stata scritta appositamente per l'uso in Omega, non ci può essere alcuna garanzia di funzionalità. Perché Omega potrebbe non avere le risorse di cui abbiamo bisogno nei parametri di chiamata di funzione della DLL. Ecco un esempio:
int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
questa linea non supporta dati come "TDateTime *tim" in Omega.
Significa che funzionano solo le funzioni di inizio e fine del terminale dove non sono impostati parametri. Dove i parametri sono impostati, abbiamo bisogno di sapere quali parametri sono presi dalla DLL, sarebbe bello avere degli esempi.
Penso che dovrete guardare un esempio in Delphi con un programmatore che possa dirvi esattamente ciò di cui avete bisogno, e poi cercare gli strumenti Omega per fornire i parametri richiesti alla DLL. Se TU volessi rilasciare una versione della DLL specificamente per Omega, faciliterebbe immensamente il suo rapido test e utilizzo, penso che ci sarebbero molti utenti con Omega. Ci sono già alcuni utenti interessati. Ecco un piccolo estratto dall'HELP di Omega:
Un punto importante è la lista dei tipi di dati supportati, vedi sotto.



Definizione della funzione DLL

Prima di poter chiamare una funzione DLL da EasyLanguage, dovete dichiarare la DLL usando l'istruzione DLL Function Declaration.

Sintassi:

DefineDLLFunc: "DLLNAME.DLL", Return Type, "FunctionName", Parameters;

DLLNAME.DLL è il nome della DLL in cui risiede la funzione, Return Type è il tipo di espressione che la funzione restituirà, FunctionName è il nome della funzione come definito nella DLL, Parameters è l'elenco dei parametri previsti dalla funzione (ogni parametro separato da virgola).

È molto importante ricordare che le DLL a 32 bit usano funzioni dichiarate esportate, sensibili alle maiuscole e alle minuscole, usando _cdecl, stdcall o fastcall. Affinché le DLL siano compatibili con EasyLanguage, le funzioni esportate devono essere create usando lettere maiuscole e devono essere dichiarate come _stdcall. Queste funzioni di esportazione devono essere elencate nella sezione EXPORTS .DEF del file DLL. Usare "_declspec (dllexport)" dal prototipo di funzione non è sufficiente perché EasyLanguage localizzi le funzioni DLL esportate.

Per esempio, la seguente istruzione dichiara una funzione chiamata MessageBeep che si trova permanentemente in una DLL chiamata USER32.DLL. Restituisce un valore booleano (vero/falso) e si aspetta un singolo parametro, int.

DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;

Tipi di dati

EasyLanguage supporta molti tipi di dati validi che possono essere usati per inviare e ricevere informazioni alle funzioni contenute nelle DLL. Ecco una lista di tipi di dati supportati da EasyLanguage:

Tipi di dati fondamentali:

BYTE
Tipo di dati interi a 1 byte.

char
1 byte di tipo dati interi.

int
Tipo di dati interi firmati a 4 byte.

WORD
Tipo di dati interi non firmati a 2 byte.

long
Tipo di dati interi firmati a 4 byte.

DWORD
Tipo di dati interi senza segno a 4 byte.

float
4 byte in virgola mobile.

double
8 byte in virgola mobile.

BOOL
Tipo di dati booleani a 4 byte.




Varianti:


UNSIGNED LONG
Uguale a DWORD.

VOID
Significa "Nessun valore restituito".

Tipi di puntatore:


LPBYTE
Puntatore a un BYTE.

LPINT
Puntatore a un int.

LPWORD
Puntatore a una PAROLA.

LPLONG
Puntatore a un LONG.

LPDWORD
Puntatore a un DWORD.

LPFLOAT
Puntatore a un float (in float FAR).

LPDOUBLE
Puntatore a un doppio (in doppio FAR).

LPSTR
Puntatore a un carattere.


Tutti i puntatori sono puntatori a 32 bit e EasyLanguage gestisce ognuno di essi allo stesso modo.

È anche molto importante ricordare che tutti i valori in EasyLanguage sono float, tranne Open, High, Low e Close, che sono interi. Per controllare questi prezzi, dovete inviare la funzione di scala dei prezzi al simbolo che compone il grafico.

Per esempio, se un titolo ha una scala di prezzo di 1/1000 e il prezzo finale era 105,125, quel prezzo sarà inviato alla DLL come 105125. Affinché la DLL sappia leggere questo prezzo, dovete inviare il valore nella parola riservata PriceScale, che in questo caso restituisce il valore 1.000.
 
Omega potrebbe non avere le risorse necessarie nei parametri della chiamata alla funzione DLL. Ecco un esempio :<br/ translate="no"> int TikKot(char *kotx, double *bid, double *ask, TDateTime *tim);
in questa linea i dati di tipo "TDateTime *tim" non sono supportati da Omega.

Ora tutto ha un senso. Per aggirare questo problema, provate a specificare il tipo double in Omega invece di TDateTime - cioè int TikKot(char, double, double, double);
Infatti, questi tipi sono facilmente intercambiabili e usano 8 byte di memoria ciascuno. Buona fortuna!
 
OK, grazie. Che dire del tipo "char", Omega richiede Numeric, ma la DLL ha bisogno di testo? È possibile sostituirlo?
 
OK, grazie. Che dire del tipo "char", Omega richiede Numeric, ma la DLL ha bisogno di testo? Può essere sostituito con ? <br / translate="no">

Perché? È nella descrizione:
LPSTR
Puntatore a un carattere.

È la stessa cosa. Ci sono esempi per questi tipi di variabili nella documentazione di Omega? Dovete cercare lì con attenzione le varianti simili. Buona fortuna!
 
Buon pomeriggio, ho trovato il problema:
Questo è dall'aiuto della DLL:

Nota: le DLL a 32 bit usano funzioni esportate sensibili alle maiuscole dichiarate usando _cdecl, _stdcall , o fastcall. Affinché le DLL siano compatibili con EasyLanguage, le funzioni esportate dovrebbero essere create usando tutte le lettere maiuscole ed essere dichiarate come _stdcall. Queste funzioni esportate devono essere elencate nella sezione EXPORTS del file .DEF della DLL. Usare "_declspec (dllexport)" dal prototipo della funzione non è sufficiente perché EasyLanguage localizzi le funzioni esportate di una DLL.

Quindi qui si dice che Omega funziona solo con quelle Funzioni che sono scritte in lettere GRANDI. Ho controllato come è scritto in un'altra DLL, davvero solo in LETTERE GRANDI.
Se cambiate la chiamata Functions (nomi in lettere maiuscole) allora possiamo testare ulteriormente.
Personalmente sono molto interessato al vostro prodotto e la mia richiesta a voi è di adattare la DLL a Omega. Spero che funzioni... buona fortuna!
Se non lo fate allora postate qui per favore, dovrò lavorare su un'altra soluzione di automazione del commercio. Grazie.
 
<br / translate="no"> Se si cambia la chiamata di funzione (nomi in lettere maiuscole) allora si può testare ulteriormente.
Personalmente sono molto interessato al vostro prodotto e la mia richiesta a voi è di adattare la DLL a Omega. Spero che funzioni... buona fortuna!

Ho fatto una variante con grandi lettere di funzione e l'ho inviata alla tua casella di posta. Buona fortuna!
 
Grazie mille, farò dei test e posterò i risultati.
Motivazione: