MT için Python'da bir ticaret sistemi yapmak. - sayfa 5

 

Dün aniden SQLite veritabanıyla ilgilenmeye başladım. Bunun için Python için hazır bir arayüz var - https://docs.python.org/3.6/library/sqlite3.html .

Sonuç olarak, gece geç saatlere kadar hem veritabanının hem de Python arayüzünün belgelerini okudum. Yol boyunca bazı yanlış anlamaları netleştirmek için SQLite için tamamen işe yaramaz birkaç program hazırladım. Genel olarak, hayran kaldım. Daha önce ihmal edilmiş boşuna. İlk kez öğrendiğim şey, bir SQLite veritabanının bellekte düzenli olarak düzenlenebileceğidir - tek bir komutla: conn = sqlite3.connect(":memory:") - bu Python'da. Tek gereken bu. Ayrıca çeşitli isteklerde tablolar oluşturuyoruz ve çalışıyoruz.

Daha önce aynı amaçlar için MS SQL Server veya BD Access kullanıyordum ve DataTable NET kitaplık tabloları aracılığıyla veritabanını bellekte organize ediyordum. Ve burada, 1.5 MB ağırlığında bir DLL ve bir komut,))) ve hiçbir şey yapmanıza gerek yok.

Şimdi ne için? Gerekli değil ama gerekli. Sisteminiz orada bir şeyi sayarken, borsadan yeni veriler gelir - sipariş defteri, fırsatlar, teklifler ve bunları bellekteki veritabanına itersiniz. Ve sistem yeni verilere ihtiyaç duyduğunda, hepsi burada, elinizin altında, bellekte. Al ve kullan. Herhangi bir kene ve malzeme için beklemenize gerek yok. Ayrıca, bir olay meydana geldiğinde, her zaman hesaplamalara ara verebilir ve işleyebilirsiniz. Yine, tüm bilgiler zaten hafızanızda. Elbette bunun için hem kullanıcı olayları hem de threadler gerekiyor ama bu artık hiçbir yerde sorun değil.

Peki, o zaman, arka planda bellek veritabanından gelen bilgiler ana veritabanına kaydedilir.

Oh, ve bir şey daha, SQLite, küçük olmasına rağmen, çok kullanıcılı okuma/yazma erişimini destekler. Genel olarak, hemen hemen her şey yetişkinlerde olduğu gibidir - bazı kısıtlamalar vardır, ancak çoğu durumda ya önemsizdirler ya da hiç karışmazlar.

 

SQLite veritabanı ile ilgilenmeye başladım, faydalı bir şeyler yapmak güzel. Veritabanına bir CSV dosyası alarak başlayalım.

İşte dosyanın bir parçası, toplamda yaklaşık 55 bin satır.

 < 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

Daha önce açıkladığımız Python'a bir CSV dosyasını içe aktarmayı durdurmayacağız. Sonuç olarak, bir CSV başlık satırımız var - başlık ve veri satırları - veri.

Şimdi Python programının kendisi:

# строка заголовка 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()

SQLiteStudio programında SBER tablosuna bakıyoruz:

Evet, bir CSV dosyasını açmak ve okumak dahil, programı başlattığınız andan itibaren 3-4 saniyelik tüm eğlence. Bu arada, veritabanı dosyasının boyutu CSV'den daha küçüktür. Tüm veritabanı - 4,3 MB, CSV boyutu - 5,2 MB

Eh, gerisi aynı şekilde yapılır.))

 

Yerliler arasında popüler olmayan konumuza devam edelim.

CSV dosyalarından veri okumayla ilgili konular forumda düzenli olarak görünür. Sadece geçen hafta iki tane vardı - sondan bir önceki birkaç satırı okumak gerekiyordu.

Bir CSV dosyasının verilerini veritabanına en son yazdığımızda, bugün veritabanından satır okuma problemini çözmeye bakacağız.

Veritabanında tablomuzda yaklaşık 55 bin satır bulunmaktadır. Sonuncuyu bile değil, 27568'i okumaya çalışalım. Bunu yapmak için bir SQL sorgusu yazın ve veritabanına gönderin:

#отметка времени начала 
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)

Herşey. Sonuç aldım:

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')

Yürütme süresi ~0.003004 s

Görevi karmaşıklaştıralım. Close=22730.000000 olan satırları bulun

Her şey aynı, sadece isteğin kendisi farklı görünüyor.

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

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

Ve sonuç:

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')]

20 satır döndürüldü. Yürütme süresi ~0.0625c

Son olarak, KAPAT sütununda (alanında) en yüksek fiyatı belirleyelim.

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

Cevap:

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

Peki, yürütme süresi -0.035 s

Gördüğünüz gibi, her şey yolunda. basit ve hızlı. CSV dosyalarının tüketicileri yerine, neden MT altında 5-6 işlevli bir DLL yazıp, CSV dosyaları yerine bir veritabanı kullanmayayım diye düşünürdüm.

PS Birkaç gönderi önce arşivdeki veri tabanı ile alıştırmaların yapıldığı CSV dosyası ektedir.
 

Hmm, MQL4-5 geliştiricilerinin hayatı kolay değil. MT'yi SQLite'a bağlamak için çözümler varsa Googled. Evet, bu tür çözümler var - MQL5.com'da bir makale - SQL VE MQL5: SQLITE VERİTABANIYLA doğrudan MQ'dan ÇALIŞMA ve birkaç üçüncü taraf materyali. IMHO, tüm bunlar gereksiz yere karmaşık ve Python'dakilerin aksine programlar basit değil.

Aslında SQLite ile ilk kez çalışmak için sadece 7-8 yüksek seviye SQLite fonksiyonunu MQL'ye aktarmak yeterlidir. Geri kalanı, çoğunlukla, gerekirse, uzak bir gelecektedir. Bir C++ programcısı bu tür bir işi en kötü ihtimalle birkaç gün içinde yapabilir. Ancak hazır çözümleri deneyebilirsiniz.

Not : SQL AND MQL5: WORKING WITH THE SQLITE DATABASE makalesine daha yakından baktım. Aslında işe yarayabilir. Orada, MT için x64 DLL dosyasını hazırlamak için yalnızca x86 DLL kullanılır. Sonuçta yazı 2014. Ama yanılmıyorsam zaten x64 SQLite DLL var. Onunla derlemeyi deneyebilirsiniz.

 

Yuriy Asaulenko :

Hmm, MQL4-5 geliştiricilerinin hayatı kolay değil. ..... IMHO, tüm bunlar gereksiz yere karmaşık ve Python'dakilerin aksine programlar basit değil.

IMHO, Python'da daha az probleminiz yok: bir tarih oluşturmanız gerekiyor, çubuklar çizmeniz gerekiyor, teknik göstergelere ihtiyacınız var ... Ayrıca test cihazı ve ticaret hakkında da düşünürdüm ....

Eh, dedikleri gibi: tüm keçeli kalemlerin tadı ve rengi farklıdır!

 
Igor Makanu :

IMHO, Python'da daha az probleminiz yok: bir tarih oluşturmanız gerekiyor, çubuklar çizmeniz gerekiyor, teknik göstergelere ihtiyacınız var ... Ayrıca test cihazı ve ticaret hakkında da düşünürdüm ....

Eh, dedikleri gibi: tüm keçeli kalemlerin tadı ve rengi farklıdır!

Tarih bir soru değildir ve onun takası da vardır. Teknik göstergeler bir soru değil, özellikle de yalnızca kendi göstergelerim olduğu için. Eh, ve gerekirse standart olanlar basit algoritmalardır.

Python'da çizim çubukları mevcuttur. Otomatik sistem için gerekli mi? - Bir terminal yazmıyorum.)

Evet ve bu tür ilk sistem değil, eskiden VB Excel'de, C ++ ve C #'daydılar. Aslında Python, kütüphanelerin genişliği ve bu kütüphanelere ulaşmak için farklı dillerin ve arayüzlerin bir karışımından bir hayvanat bahçesi üretme konusundaki isteksizliği nedeniyle seçildi. Ek olarak, Python modelleme yapmanıza izin verir - aslında bunun için tasarlanmıştır ve bir sistem geliştirirken bu çok önemlidir. Diyelim ki, MatLab'a doğrudan bir rakip.)

 
Yuriy Asaulenko :

Soru.

Bir bağlantı aracılığıyla mql ve python canvas alışverişi yapmak mümkün müdür?

C++'da bunu yapmak kolaydır, ancak python'da bilmiyorum.

 
Nikolai Semko :

Soru.

Bir bağlantı aracılığıyla mql ve python canvas alışverişi yapmak mümkün müdür?

C++'da bunu yapmak kolaydır, ancak python'da bilmiyorum.

bilmiyorum.

 

İyi haber.))) - MetaTrader 5 platformunun beta sürümü build 1910: MQL5'te çizelgeleri ve .Net kitaplıklarını ücretsiz sürükleyip bırakın . Artık beta sürümü çalışıyor ve çalışıyor, SQLite'a bağlanmak için hiçbir şey yazmanıza gerek yok (bu arada diğer birçok kitaplıkta olduğu gibi). DLL'lere gerek kalmayacak .

SQLite Net altında zaten kütüphaneler var - http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Şimdi (daha doğrusu, MT'nin çalışan sürümünün ortaya çıkmasından biraz sonra), dosya alışverişi yoluyla ticaret sistemiyle MT iletişimini unutabilir ve veritabanı üzerinden iletişim kurabilirsiniz. Daha önce, bu iş parçacığında bunun Pts olduğu gösterilmiştir. hızlı ve çoğu sistem için fazlasıyla yeterli.

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 :

İyi haber.))) - MetaTrader 5 platformunun beta sürümü build 1910: MQL5'te çizelgeleri ve .Net kitaplıklarını ücretsiz sürükleyip bırakın . Artık beta sürümü çalışıyor ve çalışıyor, SQLite'a bağlanmak için hiçbir şey yazmanıza gerek yok (bu arada diğer birçok kitaplıkta olduğu gibi). DLL'lere gerek kalmayacak .

SQLite Net altında zaten kütüphaneler var - http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Şimdi (daha doğrusu, MT'nin çalışan sürümünün ortaya çıkmasından biraz sonra), dosya alışverişi yoluyla ticaret sistemiyle MT iletişimini unutabilir ve veritabanı üzerinden iletişim kurabilirsiniz. Daha önce, bu iş parçacığında bunun Pts olduğu gösterilmiştir. hızlı ve çoğu sistem için fazlasıyla yeterli.

Haberi yanlış anladın.

.NET kitaplıkları desteği, DLL güvenlik denetimlerinin devre dışı bırakıldığı anlamına gelmez. DLL denetimi her zaman çalıştı ve çalışmaya devam edecek.

.NET'in davul çalmadan yüklenmesine izin verdik. Bunun yerine, .NET sanal makinesiyle iletişim kurmanın tüm kirli ve önemsiz olmayan işlerini üstlendik ve tüm sakıncaları gizledik.


Ancak uzun zamandır MQL5'e SQlite desteği eklemeyi planlıyorduk. Büyük olasılıkla yapacağız.
Neden: