Crea la tua estensione MetaTrader (dll) - pagina 9

 

DLL non si aggiorna con i nuovi tick

Come seguito al mio precedente post sulla DLL (#81), ora ho un ulteriore problema; quando la DLL viene chiamata così

int start()

{

double Rates[][6];

int MaximumRecords = ArrayCopyRates( Rates, Symbol(), 0 );

for( int zz = MaximumRecords; zz >= 0; zz-- ) { OutPut[zz] = EMPTY; }

GetSMAArray( Rates, MaximumRecords, Periods, OutPut );

return(0);

}

funziona bene in quanto traccia come previsto sul grafico, ma sfortunatamente non si aggiorna con i nuovi tick in arrivo - traccia solo sulla sua chiamata iniziale. Quale ulteriore codice posso aggiungere per far sì che la DLL si aggiorni con i tick in arrivo? Quasi tutte le mie ricerche hanno portato a variazioni sull'uso di

ExtCountedBars = IndicatorCounted();

per forzare un ciclo while a calcolare, ma tutte queste si applicano ai calcoli contenuti nel file .mq4 stesso. Voglio forzare la DLL a ricalcolare. In secondo luogo, vorrei che questo ricalcolo avvenisse solo al completamento di una barra e non all'arrivo di tutti i tick.

 

Per il ciclo dovrebbe essere

for(int zz=MaximumRecords-1;.................

10 I record prendono le posizioni da 0 a 9 in un array

 
Tzuman:
Il ciclo for dovrebbe essere

for(int zz=MaximumRecords-1;.................

10 I record prendono le posizioni da 0 a 9 in un array

Temo che questo non abbia aiutato, la DLL ancora non si aggiorna con i nuovi tick.

 

Il video di esempio di Mistigri non è disponibile

Ciao a tutti,

Qualcuno potrebbe rendere disponibile su internet il video campione di Mistigri?

 
jocinet:
Ciao a tutti, qualcuno potrebbe rendere disponibile su internet il video campione di Mistigri?

Mistigri l'ha reso nuovamente disponibile su:

Progetti | PsNouvion

 

Un percorso per sviluppatori C#: MT4/5 -> C# DLL

Gli sviluppatori C# che vorrebbero scrivere una DLL in C# per Metatrader invece che in C++ ora hanno un percorso per farlo. C'è un articolo molto interessante intitolato "Exposing C# code to MQL5 using unmanaged exports" che ho appena letto.

Leggi/scorri l'articolo e leggi la sezione 2.5 in avanti.

Esporre codice C# a MQL5 usando esportazioni non gestite - Articoli MQL5

Leggere le indicazioni, poi scaricare il Template per C# "Unmanaged Export Library" e mettere il file zip nella giusta directory (seguendo le indicazioni in quella pagina):

Template del progetto C# per le esportazioni non gestite

Caricate VS e selezionate il template "Unmanaged Export Library". Segui gli esempi di codice. Spero che questo aiuti qualcuno!

 

errore critico ma nessun crash e questo è come scrivere dll

Finalmente sono riuscito a scrivere la mia dll usando MistigriFX Sample Debug (MFX_SD in breve) su Visual Studio 2008 Express.

Tuttavia sto avendo uno strano problema:

Non c'è nessun problema quando eseguo tre MFX_SD al grafico con input di periodo diversi. Tuttavia quando collego altri tre al secondo grafico con input di periodo diverso, sto avendo due messaggi di errore (funzione 'GetSMAArray' chiamata dalla dll 'Mistigri FX Sample 1.dll' errore critico') e l'esperto smette di funzionare.

Così vedo due grafici, in un grafico tutti e tre gli MFX_SD che girano bene ogni tick, in un altro vedo solo un MFX_SD che gira ogni tick e gli altri due no.

qualche consiglio ragazzi?

In allegato c'è come scrivo la dll in visual studio 2008. Lo scrivo in un documento di testo così potete leggerlo dal vostro Visual Studio.

Se avete qualche errore vi prego di maledire voi stessi dal seguire i consigli di un programmatore principiante come me .

Molte grazie in anticipo.

 

errore critico risolto

Dopo aver provato diverse volte, ho finalmente risolto i messaggi di 'errore critico' (leggi il mio post precedente).

Non ha niente a che fare con il modo in cui ho creato la .dll, ma ha a che fare con la logica miss nella funzione GetSMAArray nei codici MFX_SD.

Ecco i codici MFX_SD che evidenziano la logica miss.

for ( int i = 0; i < MaximumRecords; i++)

{

doppio Somma = 0.0;

for ( int k = 0; k < Periodo ; k++ )

{

Sum += Rates[MaximumRecords-i-1-k].close;

}

Risultato[MaximumRecords-i-1] = Somma / Periodo ;

}

Per esempio supponiamo di avere Periodo = 2, MaximumRecord = 75, e i = 74. Questo fa un errore nel calcolo:

Sum += Rates[MaximumRecords-i-1-k].close;

perché il risultato di MaximumRecord - i - 1 - k è uguale a -1. L'unico valore di Rates [-1] è zero, il che rende anche il valore di Sum uguale a zero. E siccome calcoliamo la SMA dobbiamo dividere la somma con Periodo, che è zero diviso 2, e c'è l'"errore critico" e l'esperto si ferma.

Se non ci credi, collega diversi MFX_SD a un grafico a 1 minuto con diversi periodi di ingresso, ma uno dei MFX_SD deve avere periodo di ingresso = 1. Guardate la finestra del terminale MT e cliccate sulla scheda esperto. Vedrete un messaggio di errore critico e l'esperto smette di funzionare. Tuttavia, se si guarda il grafico, solo MFX_SD con periodo = 1 è ancora in esecuzione.

Penso che quello che MistigriFX cercava di mostrare nel suo video era come fare la dll e passare gli array alla dll. Se deve correggere nella sua logica SMA, sarebbe un video che seriamente mal di testa a guardare. Ecco perché ci mostra un esempio non corretto ma semplice di una semplice MA.

Felice creazione di dll.

 

estensione MT4 - il tuo corso

Ciao codersguru,

potresti per favore darmi qualche link al tuo corso

o manuale pdf.

Avrei bisogno di qualsiasi letteratura per saperne di più.

Molte grazie.

I migliori saluti

Ivan

 

...

Nella cartella experts\samples\DLLSample di metatrader (ogni metatrader lo installa lì) c'è un esempio (mql e sorgente C++, con progetto e file def) che è tutto quello che devi sapere sulle chiamate dll (tutti i possibili tipi di parametri supportati da metatrader a dll e la "comunicazione" di ritorno sono coperti lì) Il resto sta alla tua conoscenza del C/C++.

holesovsky:
Ciao codersguru,

potresti per favore darmi qualche link al tuo corso,

o un manuale in pdf.

Avrei bisogno di qualsiasi letteratura per saperne di più.

Molte grazie.

I migliori saluti

Ivan
Motivazione: