Fare un sistema di trading Python per la MT. - pagina 3

 
Yuriy Asaulenko:

Questo è un altro argomento).

Non metto insieme una squadra. Cammino per conto mio, faccio quello che penso sia giusto e interessante, e non prendo impegni.

Se qualcuno vuole uscire con me, non ci sono obiezioni e nemmeno impegni.

Non sto parlando della squadra, ma del motore sotto forma di un'applicazione EXE per collegare Python e R con MQL, che ho suggerito in quel thread.
 
Ivan Negreshniy:
Non sto parlando del comando ma del motore sotto forma di applicazione EXE per collegare Python e R con MQL che ho suggerito in quel thread.

Avrete i vostri EXE - nessun problema in Python. R, mi dispiace, non lo uso - imho, una grande discarica di tutto e niente. Se ci sono diamanti in questa discarica, la loro ricerca è problematica. A meno che non me lo dica SanSanych).

Mi occupo soprattutto di reti neurali, e ce ne sono abbastanza senza R.

Ma, in realtà, la metodologia di interazione è progettata per essere universale, e probabilmente si può usare anche per R.

 
Ora che abbiamo un'applicazione precostruita, è il momento di scambiare dati tra il terminale e Python.
Per cominciare, sceglieremo il tipo di scambio più semplice: lo scambio di dati tramite file.
Ora molte persone ridacchieranno nei loro calamai, e invano. Quindi lasciateli).
1. Durante la costruzione e il debug dell'applicazione, la condivisione dei file è più efficiente, poiché non richiede alcuno sforzo per l'aggiornamento. E una volta che l'applicazione è costruita, può essere sostituita da qualcos'altro.
2. Nella maggior parte dei TC già pronti, la velocità di scambio dei file è più che sufficiente. 50-100 ms. Non è abbastanza per te?
3. Quando si scambiano file via RAM-Disk il tasso di scambio raggiunge 1,5 GByte/s. È impossibile misurare la latenza.
Tutto sommato, sputa il rospo e dimentica gli avversari).
Beh, in realtà, un altro scambio è previsto per l'ultima fase, se noi o l'argomento saranno all'altezza).

Scambieremo con il terminale tramite file CSV. Finora un modo - dal terminale all'applicazione.
Per evitare conflitti di interesse, useremo file semaforici.
Quindi, lasciamo che DataTS.csv sia il file di dati, e STS.s sia il file di semafori.
Il terminale scrive i dati in DataTS.csv e, dopo la scrittura, crea un file semaforico vuoto STS.s.
L'applicazione controlla la presenza del file semaforico STS.s, poi legge il file DataTS.csv, poi cancella il file semaforico STS.s.
Poi il terminale rileva la scomparsa del file semaforico STS.s e solo allora scrive i nuovi dati nel file DataTS.csv.
Possibili variazioni, a seconda delle funzioni dei file Phyton e MT - non ho ancora guardato.
Tuttavia, non tutto in una volta, prima abbiamo bisogno di lavorare con Python, e determinare le sue capacità.
Questo è quello che faremo.
 
Ci sono stati alcuni cambiamenti dalla mia ultima visita. L'applicazione è ora completamente funzionale - tutto ciò che è stato descritto nel post precedente è stato implementato. Tutti i pulsanti ora funzionano e lo scambio di file è implementato.
- Il pulsante Clear cancella la finestra di output,
- Il pulsante Send invia la linea della finestra di input alla finestra di output,
- il pulsante Start attiva lo scambio di file,
- Il pulsante Stop ferma lo scambio di file.
Questo è facile da controllare. Creiamo la cartella C:\PyTS, mettiamo il file di dati - DFile.csv, mettiamo il file semaforo - SFile.tx. Il nostro programma Python rileva il file semaforico, legge il file di dati, lo visualizza nella finestra di output e cancella il file semaforico.
Ora puoi cambiare i dati in DFile.csv e creare un nuovo file semaforico, e il programma leggerà e mostrerà i nuovi dati.
Si può scrivere un semplice programma MQL, cambiare la cartella di lettura nel nostro programma nella cartella dove MT scrive, e poi si può stimare indipendentemente la velocità di scambio, i possibili salti di dati e molte altre cose.
L'unica funzione responsabile dello scambio di file è FileExchange(). È implementato in un thread aggiuntivo - il thread del timer. Possiamo avere decine di questi thread e funzioni e non influiranno in alcun modo sull'applicazione - cioè possiamo avere decine di canali di scambio dati paralleli e indipendenti a nostra disposizione.
In questo momento il timer è impostato a 10.0s - puoi impostarlo a 0.001s, vedi documentazione.
Bene, se volete davvero misurare la velocità e altre caratteristiche - rimuovete le funzioni di debug print() nel percorso di scambio - riducono significativamente la velocità.
Il codice del programma Python è nell'allegato. Come al solito, rinominatelo in .py
File:
PyTS_1.0.txt  3 kb
 

Abbiamo parlato dello scambio di file CSV, ma la versione 1.0 (vedi post precedente) si limita ad aprire e leggere i file. La versione successiva - 1.01, dopo alcune modifiche, legge i file CSV e li memorizza nella variabile InData.

In realtà tutte le modifiche:

def FileExchange():
    global Change
    if Change==True:
        if os.path.exists(SFile):
            print("SFile.txt is")
            if os.path.exists(DFile):
                print("DFile.csv is")
                InData = csv.reader(open(DFile, 'r'))
                data_read = [row for row in InData]
                print(data_read)
                os.remove(SFile)
            else:
                print("DFile.csv no")
        else:
            print("SFile.txt no")
        print('Вывод таймера')
        timer =threading.Timer(10.0,FileExchange)
        timer.start()

Solo 3 linee cambiate + collegamento alla libreria csv.

E anche controllare l'output del contenuto CSV dalla variabile InData:

In [18]: [['04.08.2018 14:00', ' 1300', ' 1295', '1310', '1305', '100'], ['04.08.2018 14:10', ' 1307', ' 1297', '1320', '1315', '150']]

Ora i valori delle righe sono disponibili per indici, tipo - riga, colonna.

Bene, e il codice stesso - vedi allegato.

File:
PyTS_1.01.txt  3 kb
 
Yuriy Asaulenko:

Abbiamo parlato dello scambio di file CSV, ma la versione 1.0 (vedi post precedente) si limita ad aprire e leggere i file. La versione successiva - 1.01, dopo alcune modifiche, legge i file CSV e li memorizza nella variabile InData.

In realtà tutte le modifiche:

Solo 3 linee cambiate + collegamento alla libreria csv.

E anche controllare l'output del contenuto CSV dalla variabile InData:

Ora i valori delle righe sono disponibili per indici, tipo - riga, colonna.

Bene, e il codice stesso - vedi allegato.

Usare la condivisione dei file non è la soluzione migliore. Le operazioni sui file sono molto lente. È necessario collegare un disco RAM per tale scambio.
 
Grigoriy Chaunin:
Usare i file per lo scambio non è la soluzione migliore. Le operazioni sui file sono molto lente. È necessario collegare un disco RAM per tale scambio.
Puoi dare le caratteristiche di performance dello scambio di file (cosa c'è) e i compiti richiesti (cosa serve)?


E io, per esempio, dirò che sono estremamente veloci, non lenti. Senza caratteristiche numeriche, sia le tue che le mie affermazioni sono basate sul nulla, e quindi non hanno alcun senso nel compito da svolgere. Avete bisogno di caratteristiche sia dello scambio di file che delle esigenze del problema, e solo dopo averle confrontate potete arrivare a conclusioni valide. Dal momento che Yuri Asaulenko ha deciso che i file sono adatti, penso che conosca meglio il volume previsto di trasferimento dei dati e il tempo di elaborazione.

In generale, i file su disco hanno un grande vantaggio rispetto alla memoria volatile - sono memorizzati sul disco di spegnimento e sono accessibili dopo una settimana o un anno. Per controllare, analizzare, verificare, solo per osservare.

 
Grigoriy Chaunin:
Usare i file per scambiare non è la soluzione migliore. Le operazioni sui file sono molto lente. È necessario collegare un disco RAM per tale scambio.

Questo problema è già stato discusso in questo thread, in post precedenti, incluso il possibile uso di RAM-Disk, se necessario:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Come fare trading system per MT usando Python.

Yuriy Asaulenko, 2018.08.01 19:33

Ora che abbiamo il blueprint dell'applicazione, è il momento di impegnarsi nello scambio di dati del terminale con Python.
Per prima cosa sceglieremo il tipo di scambio più semplice: lo scambio di dati tramite file.
Ora molte persone ridacchieranno nei loro calamai, e invano. Quindi lasciateli).
1. Durante la costruzione e il debug dell'applicazione, la condivisione dei file è più efficiente, poiché non richiede alcuno sforzo per l'aggiornamento. E una volta che l'applicazione è costruita, può essere sostituita da qualcos'altro.
2. Nella maggior parte dei TC già pronti, la velocità di scambio dei file è più che sufficiente. 50-100 ms. Non è abbastanza per te?
3. Quando si scambiano file via RAM-Disk il tasso di scambio raggiunge 1,5 GByte/s. È impossibile misurare la latenza.
Tutto sommato, sputa il rospo e dimentica gli avversari).
Beh, in realtà, un altro scambio è previsto per l'ultima fase, se noi o l'argomento saranno all'altezza).
Anche in uno dei primi post del thread.
 

Vi presento una nuova versione di PyTS 1.02. Questa versione è funzionalmente equivalente alla versione 1.01, ma gli inutili controlli print() sono stati rimossi dal codice e l'approccio di classe ha cominciato ad essere implementato (Lenin ha scritto - l'approccio deve essere basato sulla classe) - l'elaborazione dei file CSV è completamente assegnata alla classe - cCSVJob.

Zip-file in allegato, dove troverete anche tutte le versioni precedenti del programma, così come, nella cartella PyTS, i file necessari con i dati sorgente per i test.

File:
PyTS.zip  6 kb