"SQL ve MQL5: SQLite Veritabanı ile Çalışmak" makalesi için tartışma

 

Yeni makale SQL ve MQL5: SQLite Veritabanı ile Çalışmak yayınlandı:

Bu makale, projelerinde SQL kullanmak isteyen geliştiricilere yöneliktir. SQLite'ın işlevselliğini ve avantajlarını açıklar. Makale, SQLite işlevleri hakkında özel bilgi gerektirmez, ancak SQL'in minimum düzeyde anlaşılması faydalı olacaktır.

Script dosyası hesaba uygulandıktan sonra, hesap anlaşmalarını anında tabloya ekler.

İstatistikler terminal günlüğünde görüntülenir

Komut dosyasıyla oynayabilirsiniz: BEGIN, ROLLBACK ve COMMIT içeren satırları yorumlayın. Hesabınızda yüzlerce fırsat varsa farkı hemen göreceksiniz. Bu arada some tests adresine göre, SQLite işlemleeri MySQL veya PostgreSQL'den daha hızlı çalışıyor.


Yazar: ---

 

Birkaç önemli ekleme var (ve iyileştirme önerileri:))

1. Yazar sqlite_open() işlevini kullanıyor, ancak açılış bayraklarıyla çalışabilen daha esnek bir sqlite_open_v2() işlevi var, bu da şu anlama geliyor: - veritabanı dosyasına erişim sınırlamasını kontrol etmek; - geçici bellek içi veritabanları oluşturmak; - veritabanıyla yalnızca yerel dosya sisteminde değil, URI ile çalışmak vb.

#define  SQLITE_OPEN_READONLY         0x00000001  /* sqlite3_open_v2() için tamam */
#define  SQLITE_OPEN_READWRITE        0x00000002  /* sqlite3_open_v2() için tamam */
#define  SQLITE_OPEN_CREATE           0x00000004  /* sqlite3_open_v2() için tamam */
#define  SQLITE_OPEN_DELETEONCLOSE    0x00000008  /* Yalnızca VFS */
#define  SQLITE_OPEN_EXCLUSIVE        0x00000010  /* Yalnızca VFS */
#define  SQLITE_OPEN_AUTOPROXY        0x00000020  /* Yalnızca VFS */
#define  SQLITE_OPEN_URI              0x00000040  /* sqlite3_open_v2() için tamam */
#define  SQLITE_OPEN_MEMORY           0x00000080  /* sqlite3_open_v2() için tamam */
#define  SQLITE_OPEN_MAIN_DB          0x00000100  /* Yalnızca VFS */
#define  SQLITE_OPEN_TEMP_DB          0x00000200  /* Yalnızca VFS */
#define  SQLITE_OPEN_TRANSIENT_DB     0x00000400  /* Yalnızca VFS */
#define  SQLITE_OPEN_MAIN_JOURNAL     0x00000800  /* Yalnızca VFS */
#define  SQLITE_OPEN_TEMP_JOURNAL     0x00001000  /* Yalnızca VFS */
#define  SQLITE_OPEN_SUBJOURNAL       0x00002000  /* Yalnızca VFS */
#define  SQLITE_OPEN_MASTER_JOURNAL   0x00004000  /* Yalnızca VFS */
#define  SQLITE_OPEN_NOMUTEX          0x00008000  /* sqlite3_open_v2() için tamam */
#define  SQLITE_OPEN_FULLMUTEX        0x00010000  /* sqlite3_open_v2() için tamam */
#define  SQLITE_OPEN_SHAREDCACHE      0x00020000  /* sqlite3_open_v2() için tamam */
#define  SQLITE_OPEN_PRIVATECACHE     0x00040000  /* sqlite3_open_v2() için tamam */
#define  SQLITE_OPEN_WAL              0x00080000  /* Yalnızca VFS */

2. Hesaplamalarda "ağır" bir gösterge kullandığında EA optimizasyonunu hızlandırma sorununu çözmek için sqlite kullanıyorum. Böyle bir durumda mantıksal çözüm, ilk çalıştırma sırasında veritabanındaki optimizasyon dönemi için gösterge okumalarını kaydetmek ve sonraki çalıştırmalar sırasında - zaten hesaplanmış okumaları doğrudan veritabanından çıkarmaktır. Dolayısıyla, sqlite motorunu "varsayılan biçimde" kullanırsanız, çok sayıda INSERT ve SELECT sorgusu gönderme işlemi çok zaman almaya başlar. Pratik olarak, çıkış yolunun 1) bellek içi veritabanı kullanmak olduğu bulunmuştur, ancak verileri daha sonra bırakmak istiyorsak bu her zaman iyi değildir ve 2) SQL motorunun #pragma-directives.

İkinci seçenek daha çok tercih edilir, çünkü veritabanını RAM'den diske dökme ihtiyacını ortadan kaldırır. Bu şu şekilde yapılır: veritabanında ilk tabloyu oluşturmadan önce aşağıdaki sorguları göndermek gerekir:

"PRAGMA temp_store = MEMORY;"
"PRAGMA page_size = 65536;"
"PRAGMA cache_size = 16384;"
"PRAGMA journal_mode = OFF;"
"PRAGMA locking_mode = EXCLUSIVE;"
"PRAGMA synchronous = OFF;"

Peki, ve bundan sonra şunları yapabilirsiniz

"CREATE TABLE IF NOT EXISTS"

vs.

Herkese iyi şanslar!

 
alsu:

Birkaç önemli ekleme var (ve iyileştirme önerileri:))

1. Yazar sqlite_open() işlevini kullanmaktadır, ancak açılış bayraklarıyla çalışabilen daha esnek bir sqlite_open_v2() işlevi vardır, bu da şu anlama gelir: - veritabanı dosyasına erişim sınırlamasını kontrol etmek; - geçici bellek içi veritabanları oluşturmak; - veritabanıyla yalnızca yerel dosya sisteminde değil, URI ile çalışmak vb.

2. Hesaplamalarda "ağır" bir gösterge kullandığında EA optimizasyonunu hızlandırma sorununu çözmek için sqlite kullanıyorum. Böyle bir durumda mantıksal çözüm, ilk çalıştırma sırasında veritabanındaki optimizasyon dönemi için gösterge okumalarını kaydetmek ve sonraki çalıştırmalar sırasında - zaten hesaplanmış okumaları doğrudan veritabanından çıkarmaktır. Dolayısıyla, sqlite motorunu "varsayılan biçimde" kullanırsanız, çok sayıda INSERT ve SELECT sorgusu gönderme işlemi çok zaman almaya başlar. Pratikte, çözümün 1) bellek içi veritabanı kullanmak olduğu bulunmuştur, ancak bu, verileri daha sonra bırakmak istiyorsak her zaman iyi değildir ve 2) SQL motorunun #pragma-directives'i.

İkinci seçenek daha çok tercih edilir, çünkü veritabanını RAM'den diske dökme ihtiyacını ortadan kaldırır. Bu şu şekilde yapılır: veritabanında ilk tabloyu oluşturmadan önce aşağıdaki sorguları göndermelisiniz:

Peki, ondan sonra da

vs.

Herkese iyi şanslar!

Test cihazını çalıştırırken gösterge okumalarının verileri doğası gereği basit bir dizidir, sıralı erişime sahip bir akış, bu nedenle SQL tabanında kaydetmek ve okumak gereksizdir ve mantıklı değildir.

Aynı şey, makalenin yazarı tarafından SQLite uygulamasının bir örneği olarak önerilen ticari işlemlerin listesi için de söylenebilir.

Bu nedenle, ilişkisel, çok bağlantılı veri modellerini kullanmanın verimliliğinin öncelikle çözülmekte olan görevlere bağlı olduğunu ve bu örneklerde IMHO'nun yalnızca "kulaklarından çekilebileceğini" fark etmeliyiz.
.

 
MonetDB adında bir sütunlu SQL DBMS vardır. Bu, sütunlarda veri depolamak için tasarlanmış ücretsiz bir DBMS'dir, bu veritabanı iyi bir hıza ve güvenilirliğe sahiptir. Yanılmıyorsam, herhangi bir SQL DBMS, konuda sunulan şekilde MT'ye bağlanabilir.
 
revers45:

Test cihazı çalışması sırasında okunan gösterge verileri doğası gereği basit bir dizidir, seri erişime sahip bir akımdır, bu nedenle SQL tabanına kaydedilmesi ve okunması gereksizdir ve mantıklı değildir.

Gereksiz ve mantıklı olmasa da tekrar okuyun: Uzman Danışmanı optimize etmek için


 

Kullanmak mümkündür ve iyidir. Başka bir şey de SQLite 'ın ciddi projeler için kullanılmaması gerektiğidir. Her halükarda tavsiye etmem. Ben kendim birden fazla kez çarpışma sorunuyla karşılaştım. Örneğin, bir ticaret robotu farklı grafiklere bağlıysa, ancak aynı tabanı kullanıyorsa ve erişim genel amaçlı bir tabloya (örneğin kayıt / değiştirme oturumları, hesaplar) ise, her durumda "tablo kilitli" gibi bir hata alırsınız. Ve tüm işlemlerin tamamlanmış, imleçlerin kapatılmış ve veritabanının paylaşımlı modda açılmış olması önemli değildir. Bu sorun SQLite geliştiricileri tarafından da bilinmektedir.

Bence MS Access, SQL destekli dosya veritabanlarının en iyisidir. Küçük yazılımcıları ne kadar azarlarsanız azarlayın, ben SQLite'ı MS Access için bıraktım ve bundan hiç pişman değilim. OleDB sürücüsü Jet 4.0 Win98'de bile yüklüdür, böylece projeler tüm OC Windows'larda çalışır.

 
Harika bir fikir ve makale, bunu düşünmemiştim. Bununla birlikte, mql5'te yerel bir desteğe sahip olmak harika olurdu, böylece Market'in ürününde kullanılabilirdi.
 

Öncelikle çalışmalarınız için çok teşekkürler!

Başarıyla mql4'e taşıdım! (bazı #property strict, derleme hatalarını çözdü.)

Ve 32bit platform kullandığım için 64bit ile ilgili bazı import fonksiyonlarını yorumlamak ve silmek zorunda kaldım. Terrminal erken bağlama kullanır, bu nedenle 64 bit-dll de program yüklenirken yüklen meye çalışır. (kullanılmamasına rağmen, sadece 32bit.dll.).Bu hata yaptı.

Ama her neyse, uygulamanızı beğendim! (Keşke ben de sizinki kadar iyi bir program yazabilseydim)

 
MetaTrader 5'in 64 bit sürümünü kullanıyorum ve kodun çalışmasını sağlayamıyorum. Referansları 32 bit koda kaldırmayı denedim ancak yine de "Sqlite3_32.dll" yüklenemiyor hatası alıyorum. Kodun bu dll'e herhangi bir yerde referans verip vermediğini söyleyebilir misiniz? Bunu 64 bit için çalıştırmam gerekiyor.
 

Komut dosyası çalışmıyor, kutudan çıktığı gibi çalışmıyor, bu tür projeleri çöpe atıyor.

Konsolda https://s.mail.ru/9dWTNLqx6RT2/img-2015-11-10-20-15-44.png adresini verir

В таблице https://s.mail.ru/QZyK6HwhMvo9/img-2015-11-10-20-16-18.png

Код https://s.mail.ru/2ooLdMg5MrHP/img-2015-11-10-20-16-56.png

 
delphiec:

Komut dosyası çalışmıyor, kutudan çıktığı gibi çalışmıyor.

Ne yapacağınızı ve nasıl yapacağınızı anlamıyorsanız kılavuzu tüttürün.