MT5 e trans2quik.dll - pagina 6

 
prostotrader:

No, ho solo bisogno di sincronizzare 3 thread (fondamentalmente scrivere un Synchronizer), ma

Non so come.

Beh, rimangono solo le bandiere. Mettiamo una bandiera, aspettiamo che gli altri finiscano le attività, ci fermiamo e togliamo le loro bandiere, facciamo delle cose, togliamo la bandiera. Beh, e la logica della priorità della bandiera, ovviamente.

Non fermerei il DDE, ma lo lascerei scrivere nel buffer in modo che non si perda nulla.

 
Yuriy Asaulenko:

Beh, rimangono solo le bandiere. Mettere una bandiera, aspettare che gli altri completino le loro attività, fermarsi e togliere le loro bandiere, fare gli affari, togliere la bandiera. Beh, e la logica della priorità della bandiera, ovviamente.

Non fermerei DDE, però, lasciandolo scrivere nel buffer in modo che nulla vada perso.

In altre parole, il Synchronizer dovrebbe fare un buffer di funzioni in arrivo che saranno eseguite a seconda della priorità?

 
prostotrader:

Quindi il Synchronizer ha bisogno di bufferizzare le funzioni in entrata che saranno eseguite a seconda della priorità?

No, basta sospendere il o i thread secondo le relative bandiere e la loro priorità. In questa variante, non è necessario nient'altro.

La seconda opzione è quella di aspettare che la funzione del thread termini, e poi fermarla tramite il suo flag. Questo può essere necessario, per esempio, per aggiornare l'asc-bid, gli indicatori e qualsiasi altra cosa di cui abbiamo bisogno.

Per esempio, i valori delle bandiere.

0 - il thread è inattivo,

1 - il filo è acceso,

2 - richiesta di fermare tutti i thread con priorità inferiore.

Impostatelo a 2 e aspettate che tutti i thread diventino 0, eseguite il programma e impostatelo a 0 o 1. Con questa bandiera, tutti gli altri thread riprendono il loro lavoro.

 
Yuriy Asaulenko:

No, basta sospendere il thread (o i thread) secondo le relative bandiere e la loro priorità. Questa opzione non richiede nient'altro.

La seconda opzione è quella di aspettare che la funzione del thread finisca e poi fermarla tramite il suo flag. Questo può essere necessario, per esempio, per aggiornare l'asc-bid, gli indicatori e qualsiasi altra cosa di cui abbiamo bisogno.

Per esempio, i valori delle bandiere.

0 - il thread è inattivo,

1 - il filo è acceso,

2 - richiesta di fermare tutti i thread con priorità inferiore.

Impostatelo a 2 e aspettate che tutti i thread diventino 0, eseguite il programma e impostatelo a 0 o 1. Con questa bandiera, tutti gli altri thread riprendono il loro lavoro.

Tu stesso hai scritto che non è bene sospendere DDE

 
prostotrader:

Lei stesso ha scritto che non è bene sospendere un DDE

Proprio non ti capisco.

Quello che faccio è questo.

1.Il server (ho TCP-server) nel suo thread scrive costantemente dati nella collezione come last in first out. Non c'è bisogno di fermarlo.

I dati vengono letti/cancellati dalla collezione in un altro thread e scritti in DataTable (è l'analogo della tabella del database, ma in memoria). Questo thread può essere messo in pausa, se è d'intralcio.

3. Un altro thread legge i dati da DataTable per l'analisi. Questo thread non interferisce con il thread 2 poiché viene recuperato da select e nessuno tranne il 2 sta scrivendo in questa tabella. Puoi anche interrompere questo thread se ti intralcia.

Non devo mettere in pausa niente, perché lavoro con un solo strumento e il filo 3 è commutato per inviare-eseguire gli ordini e seguire le offerte.

 
Yuriy Asaulenko:

Proprio non ti capisco.

Quello che faccio è questo.

1.Il server (ho un server TCP) nel suo thread scrive costantemente dati nella collezione come last in first out. Non c'è bisogno di fermarlo.

I dati vengono letti/cancellati dalla collezione in un altro thread e scritti in DataTable (è l'analogo della tabella del database, ma in memoria). Questo thread può essere sospeso, se è d'intralcio.

3. Un altro thread legge i dati da DataTable per l'analisi. Questo thread non interferisce con il thread 2 poiché viene recuperato da select e nessuno tranne il 2 esegue scritture su questa tabella. Puoi anche interrompere questo thread se ti intralcia.

Non devo mettere in pausa niente perché lavoro con uno strumento e il filo 3 è passato a inviare-eseguire gli ordini e seguire le offerte.

Beato te, io ho 52 strumenti, quindi devo cambiare

 
prostotrader:

Sei fortunato, ho 52 strumenti, quindi devo cambiare

Immagino che l'analisi di tutti i 52 strumenti sia fatta in un unico thread? O lo è?

Cosa viene usato come deposito? Nel mio caso, con accesso multiutente, il locking non è necessario e la lettura non interferisce con la scrittura.

L'unica cosa che deve essere bloccata è l'accesso condiviso di Child a trans2quik. E solo nel caso di set di fili bambino. Potete farlo organizzando trans2quik in un thread separato e chiamarlo su un evento e contemporaneamente bloccare il gestore dell'evento fino a quando la richiesta è finita. Il resto non può raggiungere).

 
prostotrader:

Abbandonata completamente l'idea di collegare MT5 e Kvik, si è deciso di usare solo Kvik (DEE server + trans2quik.dll)

Che peccato. Qual è la ragione di questa decisione, ci sono seri ostacoli nella ricezione/trasmissione dei dati tra i due programmi?

 
Yuriy Asaulenko:

Immagino che l'analisi di tutti i 52 strumenti sia fatta in un unico flusso? O non lo è?

Cosa viene usato come deposito? Nel mio caso, con accesso multiutente, il locking non è necessario e la lettura non interferisce con la scrittura.

L'unica cosa da bloccare è l'accesso condiviso di Child a trans2quik. E solo nel caso di set di fili bambino. Potete farlo organizzando trans2quik in un thread separato e chiamarlo su un evento e contemporaneamente bloccare il gestore dell'evento fino a quando la richiesta è finita. Il resto non ci arriva).

No, l'analisi stessa avviene in Child (separatamente, per ogni strumento) Selector(1,2) sceglie quale robot inviare i dati e colbacks

Memorizzazione - solo le tabelle che sono conservate in memoria

 
Aleksey Vyazmikin:

Che peccato. Qual è la ragione di questa decisione, c'è un serio ostacolo alla ricezione/trasmissione di dati tra i due programmi?

Non ha senso fare confusione.

Usando MT5 abbiamo bisogno di un codice nell'Expert Advisor e di una DLL, che riceverà i dati.

Usando solo Quick, abbiamo solo un'applicazione (vedi figura con diagramma)