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

 

Ieri sono stato improvvisamente affascinato dal databaseSQLite. C'è un'interfaccia Python già pronta per questo -https://docs.python.org/3.6/library/sqlite3.html.

Di conseguenza, fino a tarda notte ho letto la documentazione sia sul database stesso che sull'interfaccia Python. Per scoprire un po' di confusione, ho pasticciato con un paio di programmi completamente inutili per SQLite. In generale, affascinato. Sprecato prima di essere trascurato. Quello che ho imparato per la prima volta è che SQLite DB può essere organizzato in memoria - con un comando: conn = sqlite3.connect(":memory:") - questo in Python. Questo è tutto ciò che serve. Poi in poche query, creare tabelle e lavorare.

Io usavo MS SQL Server o BD Access per lo stesso scopo, e organizzavo il database in memoria tramite le tabelle DataTable delle librerie NET. E qui, una DLL lunga 1,5 MB e un comando,))), e non devi fare nulla.

Ora, a cosa serve? Non è necessario, è necessario. Mentre il tuo sistema sta contando qualcosa lì, nuovi dati arrivano dalla borsa - il mercato, gli affari, le quotazioni, e tu li spingi nel database in memoria. E quando il sistema ha bisogno di nuovi dati, sono tutti qui, a portata di mano, nella memoria. Lo prendi e lo usi. Non c'è bisogno di aspettare zecche o altro. Inoltre, quando succede qualcosa, si può sempre togliere la mente dai calcoli e gestirla. Di nuovo, tutte le informazioni sono già lì, nella vostra memoria. Certo, avete bisogno di eventi e thread dell'utente, ma non è un problema da nessuna parte.

Bene, allora, le informazioni del database della memoria vengono salvate nel database principale in background.

Oh, e SQLite, anche se piccolo, supporta l'accesso in lettura/scrittura multiutente. E in generale, quasi tutto è come gli adulti - ci sono alcune limitazioni, ma nella maggior parte dei casi, sono insignificanti o non interferiscono affatto.

 

Ho iniziato a fare database SQLite, non è male fare qualcosa di utile. Cominciamo importando un file CSV nel database.

Ecco un frammento del file stesso, circa 55 mila linee in totale.

<TICKER>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
SPFB.SBRF-12.17,1,01/09/17,10:01:00,18828.0000000,18838.0000000,18792.0000000,18838.0000000,25
SPFB.SBRF-12.17,1,01/09/17,10:02:00,18848.0000000,18858.0000000,18848.0000000,18858.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:03:00,18828.0000000,18828.0000000,18828.0000000,18828.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:04:00,18868.0000000,18868.0000000,18868.0000000,18868.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:05:00,18865.0000000,18879.0000000,18856.0000000,18879.0000000,10
SPFB.SBRF-12.17,1,01/09/17,10:06:00,18841.0000000,18851.0000000,18841.0000000,18851.0000000,3
SPFB.SBRF-12.17,1,01/09/17,10:07:00,18864.0000000,18864.0000000,18864.0000000,18864.0000000,1

Abbiamo descritto in precedenza come importare file CSV in Python, non ci fermeremo qui. Come risultato, abbiamo una stringa di titolo CSV e una stringa di dati.

Ora il programma Python stesso:

# строка заголовка CSV
title=csv.title
# строки данных CSV
data=csv.InData
# подсоединяемся к БД. Если БД отсутствует, создается новая с эти именем - наш случай.
con=sql.connect('csvdb.db')
# создаем курсор
cur=con.cursor()
# выполняем запрос создания таблицы SBER и ее полей (для упрощения все поля текстовые)
cur.execute("""create table SBER ('%s' text, '%s' text,
                                  '%s' text, '%s' text, '%s' text,
                                   '%s' text, '%s' text, '%s' text,
                                    '%s' text)""" % tuple(title))

#заполняем таблицу данными из CSV строк
cur.executemany("insert into SBER values (?,?,?,?,?,?,?,?,?)", data)
#Записываем данные в таблицу БД
con.commit()
#если БД больше не нужна, закрываем соединение.
con.close()

Guardiamo la tabella SBER in SQLiteStudio:

Sì, tutto il divertimento è 3-4s dall'avvio del programma, compresa l'apertura e la lettura del file CSV. A proposito, la dimensione del file del database è più piccola di un simile file CSV. L'intero database è di 4,3 MB, la dimensione del CSV è di 5,2 MB.

Bene, il resto è fatto allo stesso modo)).

 

Continuiamo il nostro argomento impopolare con i nativi.

Ci sono thread regolari sul forum sulla lettura di dati da file CSV. Solo nell'ultima settimana ce ne sono già stati due - avevamo bisogno di leggere le ultime due righe.

L'ultima volta abbiamo scritto dati da un file CSV nel database, oggi risolveremo il problema di leggere le righe dal database.

Ci sono circa 55 mila righe nella nostra tabella di database. Cerchiamo di leggere non l'ultimo, ma qualche 27568°. Per fare questo scriviamo una query SQL e mandiamola al database:

#отметка времени начала 
Tb=dt.datetime.today()
#готовим и передаем в БД SQL запрос
cur.execute('select * from SBER where id=27568')
#читаем ответ, одну строку
s=cur.fetchone()
#отметка времени конца
Te=dt.datetime.today()
#все распечатываем.
print('Tb=' + str(Tb) +', Te=' + str(Te))
print('Te-Tb='+str(Te-Tb))
print(s)

Questo è tutto. Abbiamo il risultato:

Tb=2018-10-05 21:53:11.185492, Te=2018-10-05 21:53:11.188496
Te-Tb=0:00:00.003004
(27568, 'SPFB.SBRF-12.17', '1', '27/10/17', '10:55:00', '19692.0', '19708.0', '19691.0', '19704.0', '1123')

Tempo di esecuzione ~0.003004 sec.

Rendiamo il compito più difficile. Trova le linee, dove Close=22730.0000000

Tutto è lo stesso ma la query sembra diversa.

#это значение точно есть в строке №55420

cur.execute('select * from SBER where CLOSE=22730.0000000')
# читаем все строки, возвращаемые запросом.
s=cur.fetchall()

Il risultato:

Tb=2018-10-05 22:03:09.797261, Te=2018-10-05 22:03:09.859763
Te-Tb=0:00:00.062502
[(38393, 'SPFB.SBRF-12.17', '1', '16/11/17', '18:16:00', '22708.0', '22734.0', '22707.0', '22730.0', '673'),
 (38932, 'SPFB.SBRF-12.17', '1', '17/11/17', '13:47:00', '22713.0', '22730.0', '22707.0', '22730.0', '194'), (38962,
 'SPFB.SBRF-12.17', '1', '17/11/17', '14:22:00', '22725.0', '22736.0', '22725.0', '22730.0', '362'),
 ...
 ...
 ...
 (55288, 'SPFB.SBRF-12.17', '1', '15/12/17', '21:18:00', '22723.0', '22732.0', '22723.0', '22730.0', '87'), 
(55289, 'SPFB.SBRF-12.17', '1', '15/12/17', '21:19:00', '22727.0', '22730.0', '22726.0', '22730.0', '17'),
 (55382, 'SPFB.SBRF-12.17', '1', '15/12/17', '23:05:00', '22731.0', '22731.0', '22730.0', '22730.0', '322'),
 (55420, 'SPFB.SBRF-12.17', '1', '15/12/17', '23:48:00', '22735.0', '22741.0', '22727.0', '22730.0', '315')]

Sono state restituite 20 righe. Tempo di esecuzione ~0.0625c.

Infine, troviamo il prezzo più alto nella colonna (campo) CLOSE

cur.execute('select max(CLOSE) from SBER')

Risposta B:

Tb=2018-10-05 22:11:28.979472, Te=2018-10-05 22:11:29.014472
Te-Tb=0:00:00.035000
('23540.0',) //это самая высокая цена.

Bene, e un tempo di esecuzione di -0.035s

Come vedete, tutto è molto semplice e veloce. Se fossi un consumatore di file CSV, penserei, perché non dovrei scrivere un DL con 5-6 funzioni sotto MT, e usare DB invece di file CSV.

PS Il file CSV su cui è stato manipolato il database è nell'archivio allegato qualche post fa.
 

Sì, la vita non è facile per gli sviluppatori MQL4-5. Ho cercato su Google se ci sono soluzioni per collegare MT a SQLite. L'articolo SQL5.com SQL AND MQL5: WORKING WITH SQLITE DATABASE direttamente da MQ e alcuni materiali di terze parti. Il database SQLite è troppo complicato, e i programmi non sono così semplici, a differenza di quelli simili in Python.

Infatti, per lavorare con SQLite la prima volta è sufficiente importare solo 7-8 funzioni SQLite di alto livello in MQL. Il resto, per la maggior parte, se sarà necessario, lo sarà in un futuro lontano. Questo lavoro può essere fatto da un programmatore C++ nel peggiore dei casi in un paio di giorni. Ma potete anche provare soluzioni già pronte.

PS Date un'occhiata più da vicino all'articoloSQL E MQL5: LAVORARE CON IL DATABASE SQLITE. In realtà, forse funzionerà. Usa solo x86 DLL per preparare x64 DLL per MT. L'articolo è del 2014, dopo tutto. Ma se non mi sbaglio, c'è già una DLL x64 di SQLite. Potete provare a compilare con esso.

 

Yuriy Asaulenko:

Sì, non è una vita facile per gli sviluppatori MQL4-5...... Penso che sia troppo complicato, e i programmi, a differenza di quelli simili in Python, non sono semplici.

Imho, in Python i problemi non sono minori: hai bisogno di uno storico, hai bisogno di un grafico a barre, hai bisogno di indicatori tecnici... Penserei anche a un tester e al trading too....

Beh, come dice il proverbio: tutti i pennarelli sono diversi per ogni gusto!

 
Igor Makanu:

imho avete altrettanti problemi con Python: avete bisogno di uno storico, di un grafico a barre, di indicatori tecnici... Penserei anche a un tester e al trading....

Beh, come dice il proverbio: tutti i pennarelli sono diversi per ogni gusto!

La storia non è un problema e lo è anche il pompaggio. Gli indicatori tecnici non sono un problema, inoltre ho solo i miei indicatori. Se ne avete bisogno, ci sono semplici algoritmi.

Ho uno strumento di disegno di barre in Python. Ne ho davvero bisogno per il mio autosistema? - Non sto scrivendo un terminale).

E non è il primo sistema del genere, ci sono stati prima su VB Excel, e su C++, e su C#. In realtà Python è stato scelto per l'estensività delle librerie e la mancanza di desiderio di moltiplicare lo zoo per una miscela di diversi linguaggi e interfacce per ottenere un accesso a queste librerie. Inoltre, Python permette la modellazione - è ciò per cui è progettato, ed è molto importante nello sviluppo di sistemi. Diciamo che è un concorrente diretto di MathLab).

 
Yuriy Asaulenko:

Domanda.

È possibile scambiare mql-kim e python kanvas attraverso un link?

È facile da fare in C++, ma non so in Python.

 
Nikolai Semko:

Domanda.

È possibile scambiare mql-kim e python kanvas attraverso un link?

È facile da fare in C++, ma non so in Python.

Non è così.

 

Buone notizie))) -BetaMetaTrader 5 build 1910: Free Drag & Drop di grafici e libreria .Net in MQL5 . Ora, quando la beta funziona, non c'è bisogno di scrivere nulla per connettersi a SQLite (così come molte altre librerie). Non avrete bisogno di sarà DLL.

SQLite Net-libraries sono già disponibili -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Ora (o piuttosto più tardi, quando apparirà la versione funzionante di MT) possiamo dimenticare la comunicazione di MT con il sistema di trading tramite scambio di file e comunicare tramite database. All'inizio di questo thread è stato dimostrato che è molto veloce e più che sufficiente per la maggior parte dei sistemi.

System.Data.SQLite: Home
  • system.data.sqlite.org
For the most recent news and developments, please see the news page. About System.Data.SQLite System.Data.SQLite is an ADO.NET provider for SQLite. System.Data.SQLite was started by Robert Simpson. Robert still has commit privileges on this repository but is no longer an active contributor. Development and maintenance work is now mostly...
 
Yuriy Asaulenko:

Buone notizie.))) -BetaMetaTrader 5 build 1910: Free Drag & Drop di grafici e librerie .Net in MQL5. Ora, quando la beta sarà funzionante, non è necessario scrivere nulla per connettersi a SQLite (così come molte altre librerie). Non avrete bisogno di sarà DLL.

SQLite Net-libraries sono già disponibili -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Ora (o piuttosto più tardi, quando apparirà la versione funzionante di MT) possiamo dimenticare la comunicazione di MT con il sistema di trading tramite lo scambio di file e comunicare tramite database. All'inizio di questo thread è stato dimostrato che questo è molto veloce e più che sufficiente per la maggior parte dei sistemi.

Hai frainteso la notizia.

Il supporto per le librerie .NET non significa che i controlli di sicurezza sulle DLL siano disabilitati. I controlli DLL hanno sempre funzionato e funzioneranno sempre.

Noi vi lasciamo semplicemente caricare .NET senza alcun armeggio. O meglio, abbiamo preso tutto il lavoro disordinato e non banale di comunicare con la macchina virtuale .NET e abbiamo nascosto tutti gli inconvenienti.


Tuttavia, abbiamo pianificato da tempo di aggiungere il supporto SQlite in MQL5. Molto probabilmente lo faremo.