Creazione di una GUI per MQL in modalità grafica. - pagina 5

 

Ecco un esempio di una semplice forma disegnata in Sharpe in 10 minuti con un EA. Il modulo riceve i tick dal grafico, direttamente dall'EA come dalla dll nativa, senza socket, file e altre cose. E il modulo è allegato al grafico. C'è qualche problema con l'allegato che deve essere risolto. Ma è possibile non attaccarlo, come si vuole.

 
Алексей Барбашин:

Ecco un esempio di un semplice modulo disegnato in Sharp in 10 minuti con l'EA. Il modulo riceve i tick dal grafico, direttamente dall'EA come dalla dll nativa, senza socket, file e altre cose. E il modulo è allegato al grafico. C'è qualche problema con l'allegato che deve essere risolto. Ma non può essere attaccato - qualsiasi cosa ti piaccia.

Dimmi quale compilatore da GitHub hai usato. O hai editato sharp compilato a mano? Non ne ho bisogno. È più facile scrivere DLL C++ in codice misto (managed + unmanaged).

 
Yuriy Asaulenko:

Dimmi quale compilatore da GitHub hai usato. O hai modificato la compilazione sharded a mano? Non è una buona idea. È più facile scrivere DLL C++ in codice misto (managed + unmanaged).

Ho scritto nel post precedente: tutto è fatto con gli strumenti interni di VS. Sto usando VS 2017 Community. Proprio all'inizio del progetto è collegata la libreria DllExport con Nuget. Nulla deve essere finalizzato manualmente dopo la compilazione del progetto, dalla parola TOTALMENTE.

Non raccomando il modello diR.Giesecke. Qui con esso c'è un vero tamburello, se mai sarà possibile iniziare. Con questa libreria non sentirete nemmeno la differenza. Il vostro dll stesso "diventa nativo" durante la normale compilazione.

 
Алексей Барбашин:

Ho scritto nel post precedente: tutto è fatto con gli strumenti interni di VS. Sto usando VS 2017 Community. Proprio all'inizio del progetto, la libreria DllExport con Nuget è collegata ad esso. Niente deve essere finalizzato manualmente dopo la compilazione del progetto, per niente.

Sì, sì, esattamente con Nuget. Non ha funzionato per me, ma c'era una DLL non standard per l'interazione con la C-API, + altre funzioni di callback. Non so, per qualche motivo me lo ricordavo come un compilatore, o era una soluzione diversa.

E in questo caso, la soluzione è davvero buona e semplice.

 
Алексей Барбашин:

Perché quello di sinistra? Tutto è fatto con i mezzi interni di VS. Nuget ha la libreria DllExport, che modifica la classe System.Runtime.InteropServices una volta, e poi tutto si compila normalmente. Quindi non è necessario ballare il tamburello, non sono necessari involucri. Creare moduli è molto più facile in c# che scriverli in un file aggiuntivo, come suggerisce Maxim. Rispetto Maxim e il suo lavoro, ma in questo caso il mondo della Rete è aperto a noi senza difficoltà aggiuntive.

È interessante, hai controllato tu stesso? Facevo una connessione MT4 - C++dll - C#dll, non potevo caricare direttamente la C#dll.

https://www.nuget.org/packages/DllExport/ è?

DllExport 1.6.0
DllExport 1.6.0
  • www.nuget.org
The open implementation of unmanaged exports for .NET ( DllExport )        Source code and all details here: https://github.com/3F/DllExport                To configure projects via current package:        ========================================================        DllExport -action Configure -dxp-version 1.6.0...
 
Алексей Барбашин:

Ho scritto nel post precedente: tutto è fatto con gli strumenti interni di VS. Sto usando VS 2017 Community. Proprio all'inizio del progetto, la libreria DllExport con Nuget è collegata ad esso. Nulla deve essere finalizzato manualmente dopo la compilazione del progetto, la parola TOTALMENTE.

Non raccomando il modello diR.Giesecke. Qui con esso c'è un vero tamburello, se mai sarà possibile iniziare. Con questa libreria non sentirete nemmeno la differenza. La vostra dll "diventerà nativa" durante la normale compilazione.

Tzek, puoi spiegarti meglio? Il compito dell'esempio è di fare un pannello in C# che riceva informazioni dall'EA e gli invii dei comandi. Come usare dllexport per questo?

Non c'è bisogno di dirlo esplicitamente, solo passi, cosa e come reagisce l'uno all'altro?

 
Alexey Volchanskiy:

È interessante, hai controllato tu stesso? Facevo il collegamento MT4 - C++dll - C#dll, non potevo caricare direttamente la C#dll.

https://www.nuget.org/packages/DllExport/ è?

Naturalmente ho controllato. Ho dato un esempio di creazione di dll con modulo sopra.

 
Алексей Барбашин:

Certo che l'ho fatto. Ho dato un esempio di dll con un modulo sopra.

Questa foto è un esempio?

Va bene, me ne occuperò io stesso.

 
Alexey Volchanskiy:

Tezka, puoi spiegarti meglio? Il compito dell'esempio è di fare un pannello in C#, che riceve informazioni dall'EA e gli invia comandi. Come usare dllexport per questo?

Non c'è bisogno di dirlo chiaramente, solo i passi, cosa e come reagiscono tra loro?

1. Creare un progetto in c# Class Library (net Framework)

2. Aggiungere la libreria DllExport da NuGet al progetto. È meglio scaricarlo dal server. Mettete il file batch nella cartella del progetto.

3. Abbiamo lanciato la libreria attraverso la linea di comando (c'è un video sull'hub) e modificato la classe System.Runtime.InteropServices.

A questo punto tutti i preparativi sono completati. Riavviare il progetto

4. Creare una funzione di esportazione e aggiungere il modificatore [DllExport]y prima di essa. Se il passo 3 viene eseguito correttamente, il compilatore non si lamenterà del modificatore

5. Aggiungere il modulo al progetto e comporlo come richiesto.

6. Aggiungere alla classe di funzioni esportate (creata al passo 1) la funzione di apertura del modulo, per esempio, Start

7. Creare la funzione per aprire il modulo, per esempio OpenDialog, come si fa nella funzione principale quando si crea un'applicazione su modulo Windows

8. Nella funzione Start, creiamo un thread per il quale specifichiamo la funzione OpenDialog come metodo eseguibile

9. Creare un EA/indicatore/script e collegare la dll come al solito. ))

10. Chiamare la funzione Start da mql

Il modulo sarà avviato in un thread separato e non fermerà il processo in mql come farebbe un normale dialogo modale.

Il trasferimento di dati da mql a un modulo è fatto allo stesso modo del trasferimento di dati tra classi e thread dell'applicazione stessa.

1. Creare una funzione in una classe da esportare che sarà chiamata da mql per trasferire dati; per esempio, SendTick.

Ricordate che mql vedrà solo i metodi di classe (funzioni) che hanno il modificatore [DllExport] installato.

2. Creare un delegato all'evento in questa classe con parametri

3. Nel modulo abbiamo bisogno di sottoscrivere l'evento della classe esportata

4. Quando chiamiamo il metodo SendTick da mql, chiamiamo l'evento creato e passiamo i parametri

5. Nel modulo, creiamo un gestore di eventi che intercetta l'evento e invia i dati al modulo, o fa qualcos'altro.

Questo è tutto. Non è richiesto nient'altro.

Solo nel caso in cui il modulo e la classe di esportazione stiano lavorando in thread diversi, quindi per mettere le informazioni sul modulo abbiamo bisogno di un delegato all'elaborazione dei dati dal thread adiacente.

Se ci riuscite, per favore condividete il "risultato" e le impressioni sulla semplicità. )))

Il più "difficile" in tutto questo sarà l'installazione della biblioteca. )))

 
Alexey Volchanskiy:

Questa foto è un esempio?

Capisco, lo capirò da solo.

Alexey, ho dettagliato l'immagine. )) Se avete altre domande, chiedetemi pure, cercherò di rispondere!