Tamam, bu amaç için bir uzman danışman yazdığınızı görüyorum ve makalede yayınladığım öneriler olmadan yazılmış.
Öyleyse, adım adım ilerleyelim: 1.
1. " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " çağrısı OnInit() içinde yapılmalıdır OnTick() yerine standart fonksiyon.
2. cMySqlConnect kullanıyorsunuz - DLL'den içe aktarılan bir işlevdir, bunun yerine MySqlConnect işlevini kullanmanız gerekir cMySqlConnect fonksiyonu !
3. MySqlDisconnect fonksiyonunu OnDeinit() standart fonksiyonu içinde çağırmalısınız.
4. Bağlantının başarılı olduğundan emin olmak için OnTick() standart fonksiyonu içinde veritabanı bağlantı tanımlayıcısını kontrol etmeniz gerekir.
Sonunda şöyle görünecek.
... your code
int DB = -1; // veritabanı tanımlayıcısı//--
... your code
intOnInit()
{
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
if (DB != -1)
{
// bağlantı başarılı!// burada tablo oluşturma mantığını tanımlamanız gerekir
}
return(INIT_SUCCEEDED);
}
voidOnDeinit(constint reason)
{
MySqlDisconnect(DB);
}
voidOnTick()
{
// ilk komut.if (DB==-1) return; // bağlantı olmadığında herhangi bir işlem yapma// burada cMySqlConnect çağrısı olmadan kodunuz
}
You have to rebuild your code based on the requirements of project, as I see the currently there is no clear logic, everything messed up.
Tamam, bu amaç için bir uzman danışman yazdığınızı görüyorum ve makalede yayınladığım öneriler olmadan yazılmış.
Öyleyse, adım adım ilerleyelim: 1.
1. " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " çağrısı OnInit() içinde yapılmalıdır OnTick() yerine standart fonksiyon.
2. cMySqlConnect kullanıyorsunuz - DLL'den içe aktarılan bir işlevdir, bunun yerine MySqlConnect işlevini kullanmanız gerekir cMySqlConnect fonksiyonu !
3. MySqlDisconnect fonksiyonunu OnDeinit() standart fonksiyonu içinde çağırmalısınız.
4. Bağlantının başarılı olduğundan emin olmak için OnTick() standart fonksiyonu içinde veritabanı bağlantı tanımlayıcısını kontrol etmeniz gerekir.
Sonunda böyle görünecek.
Teşekkürler, tekrar deneyeceğim ve sonucu geri vereceğim.
Tamam, bu amaç için bir uzman danışman yazdığınızı görüyorum ve makalede yayınladığım öneriler olmadan yazılmış.
Öyleyse, adım adım ilerleyelim: 1.
1. " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " çağrısı OnInit() içinde yapılmalıdır OnTick() yerine standart fonksiyon.
2. cMySqlConnect kullanıyorsunuz - DLL'den içe aktarılan bir işlevdir, bunun yerine MySqlConnect işlevini kullanmanız gerekir cMySqlConnect fonksiyonu !
3. MySqlDisconnect fonksiyonunu OnDeinit() standart fonksiyonu içinde çağırmalısınız.
4. Bağlantının başarılı olduğundan emin olmak için OnTick() standart fonksiyonu içinde veritabanı bağlantı tanımlayıcısını kontrol etmeniz gerekir.
Sonunda şöyle görünecek.
Adım adım değiştirdim, ancak uzmanı dört veya daha fazla sembol için bir mt4'te kullandığımda sorun hala var. yazdırır " Erişim ihlali okundu 0x0000000B içinde '... .MQLMySQL.dll' "
Tamam, bu amaç için bir uzman danışman yazdığınızı görüyorum ve makalede yayınladığım öneriler olmadan yazılmış.
Öyleyse, adım adım ilerleyelim: 1.
1. " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " çağrısı OnInit() içinde yapılmalıdır OnTick() yerine standart fonksiyon.
2. cMySqlConnect kullanıyorsunuz - DLL'den içe aktarılan bir işlevdir, bunun yerine MySqlConnect işlevini kullanmanız gerekir cMySqlConnect fonksiyonu !
3. MySqlDisconnect fonksiyonunu OnDeinit() standart fonksiyonu içinde çağırmalısınız.
4. Bağlantının başarılı olduğundan emin olmak için OnTick() standart fonksiyonu içinde veritabanı bağlantı tanımlayıcısını kontrol etmeniz gerekir.
Sonunda şöyle görünecek.
Sorun, bir mt4'te ikiden fazla sembol için kullanılamamasıdır, yalnızca bir sembolde kullanılırsa normaldir. Dört veya daha fazla kullanıldığında, iyi çalışır, ancak birkaç dakika sonra "OnTick ()" sorununu yazdırır. dakika, "Erişim ihlali '...MQLMySQL.db' içinde 0x0000000B'ye okundu" sorununu yazdırır. .MQLMySQL.dll'"
Sınavların hepsi komut dosyasıdır, yalnızca bir kez çalıştırılır, Bir veya iki mt4'te dört veya daha fazla sembolde dll'yi çağıran bir uzman deneyebilirsiniz, sorunu bulabilirsiniz.
Dll'in bir memeoy sürümüne veya garbe koleksiyonuna ihtiyacı var mı?
MFC , statik veri imhasının ardından CRT'nin sızıntıları dökmesini beklemek yerin e, çıktığında sızıntıları erken döker ve bu da MFC başlatılmadan önce bellek ayıran ve dolayısıyla MFC'den sonra i mha edile n nesneler için ο sahte sızıntı raporlarına neden olur nbsp; MFC başlatılmadan önce bellek ayıran ve bu nedenle MFC çıktıktan sonra yok edilen nesneler için sahte sızıntı raporları . Bu durum genellikle C++ çalışma zamanı DLL' sinide kullanan bir programda MFC DLL'si kullanıldığında gözlemlenir .
Verdiğiniz koda dayanarak MQL'de yeni olduğunuzu tahmin ediyorum.
Üzgünüm, size öğretecek zamanım yok, ancak geliştirdiğim yazılımı test etmek için zamanım var.
Üzgünüm, size öğretecek zamanım yok, ancak geliştirdiğim yazılımı test etmek için zamanım var.
Mantığınıza göre sizin için test EA'sı oluşturdum: her tablo her döviz çifti için tanımlandı ve farklı hesaplar için çevrimiçi piyasa verilerini tutabilir.
//+------------------------------------------------------------------+//|& nbsp;   ; DFTest.mq4 |//|& nbsp; Telif Hakkı 2014, MetaQuotes Software Corp. |//|& nbsp;   ; http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"http://www.mql5.com"#property version"1.00"#property strict#include <MQLMySQL.mqh>
inputstring Host = "localhost";
inputstring User = "root";
inputstring Password = "ioctrl";
inputstring Database = "mysql";
inputint Port = 3306;
inputstring Socket = "";
inputint ClientFlag = 0;
inputint Timer = 1; // Zamanlayıcı (saniye) şimdi kullanılmıyorint DB;
intOnInit()
{
SQLTrace = true; // tüm sorguların veritabanına gönderileceğini görmek içinEventSetTimer(Timer);
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
if( DB == -1 )
{
Print("Database is not connected! Error: ", MySqlErrorDescription);
return (INIT_FAILED);
}
// mevcut değilse tablo oluşturstring cmd;
cmd = "CREATE TABLE IF NOT EXISTS `" + Symbol() + "` (id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
+ "Symbol char(20), Bid double, Ask double, Spread double, "
+ "Memo char(50), "
+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8";
if (!MySqlExecute(DB, cmd))
{
Print ("Table creation error: ",MySqlErrorDescription);
return (INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
voidOnDeinit(constint reason)
{
MySqlDisconnect(DB);
EventKillTimer();
}
voidOnTimer()
{
// OnTick'i asla OnTimer'dan çağırmamalısınız ya da tam tersi.// bu 2 fonksiyonun hedefi farklıdır
}
voidOnTick()
{
int account;
string symbol;
double spread;
string Query, cmd;
int Cursor;
int Rows;
if (DB == -1)
{
Comment("Database is not connected ... ");
return;
}
if ( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 )
{
account = AccountNumber();
symbol = "`"+Symbol()+"`"; // tablo adı olarak kullanmanız gerekiyorsa, MySQL veritabanı için iyi bir uygulama olarak tırnak işareti kullanmanız gerekir
spread = (Ask - Bid);
// mümkünse şöyle bir şey kullanmak daha iyi olabilir: admission = MarketInfo(symbol, MODE_SPREAD);
Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)account;
Cursor = MySqlCursorOpen(DB, Query);
if (Cursor >= 0)
{
Rows = MySqlCursorRows(Cursor);
if ( Rows > 0 )
{
cmd = "update " + symbol + " set Bid = "+(string)Bid + ", Ask = " + (string)Ask
+ ", Spread = " + DoubleToStr(spread, Digits)
+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS) +"' where AccountNumber = " + (string)account;
}
else
{
cmd = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread, Memo, Time) VALUES ("
+ (string)account + ", \'" + symbol + "\', "+DoubleToStr(Bid,Digits)+","+ DoubleToStr(Ask,Digits) + "," + DoubleToStr(spread, Digits)
+ ", \'" + AccountCompany() +"\', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')";
}
if (!MySqlExecute(DB, cmd))
{
Print("Updating error: ",MySqlErrorDescription);
Print (cmd);
}
MySqlCursorClose(Cursor);
}
}
}
Bu, kütüphaneyi kullanmanın doğru mantığıdır.
Optimizasyon nedeniyle SELECT deyimini bile kullanmayabilirsiniz, sadece UPDATE deyimini çalıştırın, daha sonra (MySqlRowsAffected()==0) olup olmadığını kontrol edin, bu bir satır olmadığı anlamına gelir Güncellemelerin ~%100'üne sahipsiniz, bu nedenle INSERT deyimini uygulayın.
Güncellemelerin ~%100'üne sahipsiniz, bu nedenle bu geçici çözüm performansı artırabilir ve ağ trafiğini azaltabilir.
Ve sonunda, projenin tam kaynak kodları (DLL geliştirme dahil) makaleye eklenmiştir, kendi yolunuzla değiştirebilirsiniz.
Eğer sorunu MqlMySQL.DLL'de bulursanız, hata ayıklama yapabilir ve kendiniz düzeltebilirsiniz.
Kodlarınız bana çok yardımcı oluyor, çok fazla zaman kazanabiliyorum. INSERT, SELECT, UPDATE ve DELETE sorgularını başarıyla yapmaya çalıştım. Yanılmıyorsam, "İmleç" yalnızca SELECT sorgusu için gereklidir ??
= pedma
//+------------------------------------------------------------------+//|MySQL-006.mq4 |//|Telif Hakkı 2014, Eugene Lugovoy |//| http://www.fxcodexlab.com |//| Select, Insert, Update & Delete Query|//| tarafından değiştirildi : pedma|//+------------------------------------------------------------------+#property copyright"Copyright 2014, Eugene Lugovoy."#property link"http://www.fxcodexlab.com"#property version"1.00"#property strict#include <MQLMySQL.mqh>
string INI;
//+------------------------------------------------------------------+//| Betik program başlatma işlevi|//+------------------------------------------------------------------+voidOnStart() {
string Host, User, Password, Database, Socket; // veritabanı kimlik bilgileriint Port,ClientFlag;
int DB; // veritabanı tanımlayıcısıPrint (MySqlVersion());
INI = "C:\\This\\Must\\be\\Real\\Path\\To\\MyConnection.ini";
// INI dosyasından veritabanı kimlik bilgilerini okuma
Host = ReadIni(INI, "MYSQL", "Host");
User = ReadIni(INI, "MYSQL", "User");
Password = ReadIni(INI, "MYSQL", "Password");
Database = ReadIni(INI, "MYSQL", "Database");
Port = StrToInteger(ReadIni(INI, "MYSQL", "Port"));
Socket = ReadIni(INI, "MYSQL", "Socket");
/// ClientFlag = StrToInteger(ReadIni(INI, "MYSQL", "ClientFlag"));
ClientFlag = CLIENT_MULTI_STATEMENTS;
Print ("Host: ",Host, ", User: ", User, ", Database: ",Database);
// veritabanı bağlantısını açPrint ("Connecting...");
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
if (DB == -1) { Print ("Connection failed! Error: "+MySqlErrorDescription); return; } else { Print ("Connected! DBID#",DB);}
// SELECT deyimi çalıştırılıyorstring Query0,Query1,Query2,Query3,Query4,Query5,Query6,Query7;
int i,Cursor1,Cursor3,Cursor5,Cursor7,Rows,total;
int vId;
string vCode;
datetime vStartTime;
Query0 = "DROP TABLE IF EXISTS `test_table`";
MySqlExecute(DB, Query0);
Query0 = "CREATE TABLE `test_table` (id int, code varchar(50), start_date datetime)";
if (MySqlExecute(DB, Query0)) {
Print ("Table `test_table` created.");
}
else {
Print ("Table `test_table` cannot be created. Error: ", MySqlErrorDescription);
}
//--- veri ekleniyor
Query0 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)AccountNumber()+",\'ACCOUNT\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')";
if (MySqlExecute(DB, Query0)) {
Print ("Succeeded: ", Query0);
}
else {
Print ("Error: ", MySqlErrorDescription);
Print ("Query: ", Query0);
}
// çoklu ekleme
Query0 = "INSERT INTO `test_table` (id, code, start_date) VALUES (1,\'EURUSD\',\'2014.01.01 00:00:01\');";
Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (2,\'EURJPY\',\'2014.01.02 00:02:00\');";
Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (3,\'USDJPY\',\'2014.01.03 03:00:00\');";
if (MySqlExecute(DB, Query0)) {
Print ("Succeeded! 3 rows has been inserted by one query.");
}
else {
Print ("Error of multiple statements: ", MySqlErrorDescription);
}
//--- select query, Cursor'a ihtiyaç var ----
Query1 = "SELECT id, code, start_date FROM `test_table`";
Print ("SQL> ", Query1);
Cursor1 = MySqlCursorOpen(DB, Query1);
if (Cursor1 >= 0) {
Rows = MySqlCursorRows(Cursor1);
Print (Rows, " row(s) selected.");
for (i=0; i<Rows; i++) {
if (MySqlCursorFetchRow(Cursor1)) {
vId = MySqlGetFieldAsInt(Cursor1, 0); // id
vCode = MySqlGetFieldAsString(Cursor1, 1); // kod
vStartTime = MySqlGetFieldAsDatetime(Cursor1, 2); // start_timePrint ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
}
total += vId;
}
//--- sorguya dayalı olarak veri ekle
Query2 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)total+",\'ABCDEF\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\'); ";
if (MySqlExecute(DB, Query2)) {
Print ("Succeeded! 1 new row has been inserted.");
}
else {
Print ("Error inserting data based on SELECT query : ", MySqlErrorDescription);
}
//---
MySqlCursorClose(Cursor1); // IMLECI KAPATMAYI ASLA UNUTMAYIN !!!
}
else {
Print ("Cursor1 opening failed. Error: ", MySqlErrorDescription);
}
//--- select için yeni Cursor ---
Query3 = "SELECT id, code, start_date FROM `test_table`";
Print ("SQL> ", Query3);
Cursor3 = MySqlCursorOpen(DB, Query3);
if (Cursor3 >= 0) {
Rows = MySqlCursorRows(Cursor3);
Print (Rows, " row(s) selected.");
for (i=0; i<Rows; i++) {
if (MySqlCursorFetchRow(Cursor3)) {
vId = MySqlGetFieldAsInt(Cursor3, 0); // id
vCode = MySqlGetFieldAsString(Cursor3, 1); // kod
vStartTime = MySqlGetFieldAsDatetime(Cursor3, 2); // start_timePrint ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
}
}
//--- verileri güncelle ----
Query4 = "UPDATE `test_table` SET id=8,code='PQRXYZ',start_date=\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\' WHERE code='ABCDEF'; ";
if (MySqlExecute(DB, Query4)) {
Print ("Succeeded! last row has been updated (code ABCDEF => PQRXYZ & new id=8.");
}
else {
Print ("Error updating data of last row : ", MySqlErrorDescription);
}
//---
MySqlCursorClose(Cursor3); // IMLECI KAPATMAYI ASLA UNUTMAYIN !!!
}
else {
Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
}
//--- güncellendikten sonra sonucu göster, yeni imleç gerekli ----
Query5 = "SELECT id, code, start_date FROM `test_table`";
Print ("SQL> ", Query5);
Cursor5 = MySqlCursorOpen(DB, Query5);
if (Cursor5 >= 0) {
Rows = MySqlCursorRows(Cursor5);
Print (Rows, " row(s) selected.");
for (i=0; i<Rows; i++) {
if (MySqlCursorFetchRow(Cursor5)) {
vId = MySqlGetFieldAsInt(Cursor5, 0); // id
vCode = MySqlGetFieldAsString(Cursor5, 1); // kod
vStartTime = MySqlGetFieldAsDatetime(Cursor5, 2); // start_timePrint ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
}
}
//--- sorguyu sil ---
Query6 = "DELETE FROM `test_table` WHERE id=3; ";
if (MySqlExecute(DB, Query6)) {
Print ("Succeeded! 1 row (id=3) has been deleted.");
}
else {
Print ("Error deleting 1 row : ", MySqlErrorDescription);
}
//---
MySqlCursorClose(Cursor5); // IMLECI KAPATMAYI ASLA UNUTMAYIN !!!
}
else {
Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
}
//--- silindikten sonra sonucu göster, başka bir imleç gereklidir ---
Query7 = "SELECT id, code, start_date FROM `test_table`";
Print ("SQL> ", Query7);
Cursor7 = MySqlCursorOpen(DB, Query7);
if (Cursor7 >= 0) {
Rows = MySqlCursorRows(Cursor7);
Print (Rows, " row(s) selected.");
for (i=0; i<Rows; i++) {
if (MySqlCursorFetchRow(Cursor7)) {
vId = MySqlGetFieldAsInt(Cursor7, 0); // id
vCode = MySqlGetFieldAsString(Cursor7, 1); // kod
vStartTime = MySqlGetFieldAsDatetime(Cursor7, 2); // start_timePrint ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
}
}
//---
MySqlCursorClose(Cursor7); // IMLECI KAPATMAYI ASLA UNUTMAYIN !!!
}
else {
Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
}
//----- sonunda ----
MySqlDisconnect(DB);
Print ("Disconnected. Script done!");
}
//+------------------------------------------------------------------+
Kodlarınız bana çok yardımcı oluyor, çok fazla zaman kazanabiliyorum. INSERT, SELECT, UPDATE ve DELETE sorgularını başarıyla yapmaya çalıştım. Yanılmıyorsam, "İmleç" yalnızca SELECT sorgusu için gereklidir ??
= pedma
Kesinlikle dostum!
İmleçler sadece veri seçimi için kullanılır çünkü db'den MQL değişkenine veri almamız gerekir, sadece sql komutunu veritabanına göndermek için değil.
Satacağım bir EA'ya entegre edilmiş bir uzaktan ticaret kopyalayıcı oluşturmak istediğim için hala ücretli geliştirme projeleri yapıp yapmadığınızı merak ediyordum?
Upwork'e baktım ve son zamanlarda herhangi bir freelancer projesi tamamlamış görünmüyorsunuz.
Oluşturduğunuz kütüphaneyi kullanarak kendim denedim, ancak çok iyi sonuç vermedi. Gerçi sizin programlama yeteneğinize sahip biri için bunun kolay olacağından eminim!
Satacağım bir EA'ya entegre edilmiş bir uzaktan ticaret kopyalayıcı oluşturmak istediğim için hala ücretli geliştirme projeleri yapıp yapmadığınızı merak ediyordum?
Upwork'e baktım ve son zamanlarda herhangi bir freelancer projesi tamamlamış görünmüyorsunuz.
Oluşturduğunuz kütüphaneyi kullanarak kendim denedim, ancak çok iyi sonuç vermedi. Gerçi sizin programlama yeteneğinize sahip biri için bunun kolay olacağından eminim!
Şimdiden teşekkürler,
James
Merhaba James,
Şu anda Upwork'te sadece bir büyük proje üzerinde çalışıyorum. Yani bugünlerde pek boş zamanım yok. Libs ile yaşadığınız sorun nedir? Size nasıl yardımcı olabilirim?
Tamam, bu amaç için bir uzman danışman yazdığınızı görüyorum ve makalede yayınladığım öneriler olmadan yazılmış.
Öyleyse, adım adım ilerleyelim: 1.
1. " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " çağrısı OnInit() içinde yapılmalıdır OnTick() yerine standart fonksiyon.
2. cMySqlConnect kullanıyorsunuz - DLL'den içe aktarılan bir işlevdir, bunun yerine MySqlConnect işlevini kullanmanız gerekir cMySqlConnect fonksiyonu !
3. MySqlDisconnect fonksiyonunu OnDeinit() standart fonksiyonu içinde çağırmalısınız.
4. Bağlantının başarılı olduğundan emin olmak için OnTick() standart fonksiyonu içinde veritabanı bağlantı tanımlayıcısını kontrol etmeniz gerekir.
Sonunda şöyle görünecek.
Tamam, bu amaç için bir uzman danışman yazdığınızı görüyorum ve makalede yayınladığım öneriler olmadan yazılmış.
Öyleyse, adım adım ilerleyelim: 1.
1. " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " çağrısı OnInit() içinde yapılmalıdır OnTick() yerine standart fonksiyon.
2. cMySqlConnect kullanıyorsunuz - DLL'den içe aktarılan bir işlevdir, bunun yerine MySqlConnect işlevini kullanmanız gerekir cMySqlConnect fonksiyonu !
3. MySqlDisconnect fonksiyonunu OnDeinit() standart fonksiyonu içinde çağırmalısınız.
4. Bağlantının başarılı olduğundan emin olmak için OnTick() standart fonksiyonu içinde veritabanı bağlantı tanımlayıcısını kontrol etmeniz gerekir.
Sonunda böyle görünecek.
Tamam, bu amaç için bir uzman danışman yazdığınızı görüyorum ve makalede yayınladığım öneriler olmadan yazılmış.
Öyleyse, adım adım ilerleyelim: 1.
1. " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " çağrısı OnInit() içinde yapılmalıdır OnTick() yerine standart fonksiyon.
2. cMySqlConnect kullanıyorsunuz - DLL'den içe aktarılan bir işlevdir, bunun yerine MySqlConnect işlevini kullanmanız gerekir cMySqlConnect fonksiyonu !
3. MySqlDisconnect fonksiyonunu OnDeinit() standart fonksiyonu içinde çağırmalısınız.
4. Bağlantının başarılı olduğundan emin olmak için OnTick() standart fonksiyonu içinde veritabanı bağlantı tanımlayıcısını kontrol etmeniz gerekir.
Sonunda şöyle görünecek.
Adım adım değiştirdim, ancak uzmanı dört veya daha fazla sembol için bir mt4'te kullandığımda sorun hala var. yazdırır " Erişim ihlali okundu 0x0000000B içinde '... .MQLMySQL.dll'
"
kod takip edilir
<--
#include <MQLMySQL.mqh
int MySqlErrorNumber; // son MySQL hata numarası
string MySqlErrorDescription; // hata açıklaması
//+------------------------------------------------------------------+
//| Uzman başlatma işlevi & nbsp; |
//+------------------------------------------------------------------+
int OnInit()
OnInit(); int OnInit()
EventSetTimer(timeSeconds);
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 )
if( DB == -1 )
{
Print("Veritabanı bağlı değil ..."); if( DB == -1 ) { print("Veritabanı bağlı değil ... "); }
}
return(INIT_SUCCEEDED); }
}
//+------------------------------------------------------------------+
//| Uzman başlangıçtan kaldırma işlevi |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MySqlDisconnect(DB);
EventKillTimer();
ObjectsDeleteAll();
}
void OnTimer()
{
//Alert(TimeCurrent());
OnTick();
}
//+------------------------------------------------------------------+
//| Uzman tik fonksiyonu & nbsp; |
//+------------------------------------------------------------------+
void OnTick()
{
if( DB == -1 )
{
Alert("Veritabanı bağlı değil ... "); return; { Alert("Veritabanı bağlı değil ...")
return; }
}
if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB ! = -1 )
{
int hesap = HesapNumarası();
string symbol = Symbol(); if( cmd !
if( cmd ! = "" && cmd ! = NULL )
{
sembol = cmd; }
}
symbolOrder = symbol + "_table";
double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }
giriş = spread*MathPow(10, Digits).
//int DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)AccountNumber();
//Print(Query);
int Cursor1 = MySqlCursorOpen(DB, Query);
if (Cursor1 >= 0)
{
int Rows1 = MySqlCursorRows(Cursor1); int Cursor1 = MySqlCursorOpen(DB, Query); if (Cursor1 >= 0)
int dataRows1 = Rows1;
//Alert(dataRows);
if( dataRows1 > 0 )
{
Query = "update " + symbol + " set Bid = " + (string)Bid + ", Ask = " + ( string)Sor
+ ", Spread = " + DoubleToStr(spread, Digits)
+ ", Zaman = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + "' where AccountNumber = "
+ (string)account; // + "' ve Symbol = '" + symbol + "'".
MySqlExecute(DB, Sorgu);
MySqlCursorClose(Cursor1);
}
else if( dataRows1 == 0 )
{
Query = "CREATE TABLE IF NOT EXISTS " + symbol + " (id int NOT NULL AUTO_ INCREMENT PRIMARY KEY, AccountNumber int, "
+ "Symbol char(20), Bid double, Ask double, Spread double,"
+ "Memo char(50), "
+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8 ";
MySqlExecute(DB, Sorgu);
Query = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread. Memo, Time) VALUES ("
+ (string)account + ", '" + symbol + "', "+(string)Bid+", "+ (string)Ask + ", "
+ DoubleToStr(spread, Digits)
+ ", '" + (string)AccountCompany()
+ "', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')"";
if(MySqlExecute(DB, Query) ! = true )
{
//Query = "DROP TABLE IF EXISTS `data_table`";
//MySqlExecute(DB, Sorgu);
Query = "CREATE TABLE IF NOT EXISTS " + symbol + "(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
+ "Symbol char(20), Bid double, Ask double, Spread double,"
+ "Memo char(50), "
+ "Zaman datetime) ENGINE=MEMORY DEFAULT CHARSET= utf8 ";
MySqlExecute(DB, Sorgu);
}
}
MySqlCursorClose(Cursor1); // ASLA CURSOR'U KAPATMAYI UNUTMAYIN !!!!
}
}
}
-->
Tamam, bu amaç için bir uzman danışman yazdığınızı görüyorum ve makalede yayınladığım öneriler olmadan yazılmış.
Öyleyse, adım adım ilerleyelim: 1.
1. " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " çağrısı OnInit() içinde yapılmalıdır OnTick() yerine standart fonksiyon.
2. cMySqlConnect kullanıyorsunuz - DLL'den içe aktarılan bir işlevdir, bunun yerine MySqlConnect işlevini kullanmanız gerekir cMySqlConnect fonksiyonu !
3. MySqlDisconnect fonksiyonunu OnDeinit() standart fonksiyonu içinde çağırmalısınız.
4. Bağlantının başarılı olduğundan emin olmak için OnTick() standart fonksiyonu içinde veritabanı bağlantı tanımlayıcısını kontrol etmeniz gerekir.
Sonunda şöyle görünecek.
Sorun, bir mt4'te ikiden fazla sembol için kullanılamamasıdır, yalnızca bir sembolde kullanılırsa normaldir. Dört veya daha fazla kullanıldığında, iyi çalışır, ancak birkaç dakika sonra "OnTick ()" sorununu yazdırır. dakika, "Erişim ihlali '...MQLMySQL.db' içinde 0x0000000B'ye okundu" sorununu yazdırır. .MQLMySQL.dll'"
Sınavların hepsi komut dosyasıdır, yalnızca bir kez çalıştırılır, Bir veya iki mt4'te dört veya daha fazla sembolde dll'yi çağıran bir uzman deneyebilirsiniz, sorunu bulabilirsiniz.
Dll'in bir memeoy sürümüne veya garbe koleksiyonuna ihtiyacı var mı?
CRT'nin sızıntıları dökmesini beklemek yerin e, çıktığında sızıntıları erken döker ve bu da MFC başlatılmadan önce bellek ayıran ve dolayısıyla MFC'den sonra i mha edile n nesneler için ο sahte sızıntı raporlarına neden olur nbsp;
MFC
başlatılmadan önce bellek ayıran ve bu nedenle MFC çıktıktan sonra yok edilen nesneler için sahte sızıntı raporları . Bu durum
genellikle
C++ çalışma zamanı DLL' sinide kullanan bir programda MFC DLL'si kullanıldığında gözlemlenir .
Tekrar merhaba.
Verdiğiniz koda dayanarak MQL'de yeni olduğunuzu tahmin ediyorum.
Üzgünüm, size öğretecek zamanım yok, ancak geliştirdiğim yazılımı test etmek için zamanım var.
Üzgünüm, size öğretecek zamanım yok, ancak geliştirdiğim yazılımı test etmek için zamanım var.
Mantığınıza göre sizin için test EA'sı oluşturdum: her tablo her döviz çifti için tanımlandı ve farklı hesaplar için çevrimiçi piyasa verilerini tutabilir.
Günlükleri inceleyebilirsiniz, "Erişim ihlali..." hatası alınmadı. Günlükleri inceleyebilirsiniz, "Erişim ihlali..." hatası alınmadı.
Sorun MQLMySQL kütüphanesinde değil.
EA'yı test ediyorum.
Bu, kütüphaneyi kullanmanın doğru mantığıdır.
Optimizasyon nedeniyle SELECT deyimini bile kullanmayabilirsiniz, sadece UPDATE deyimini çalıştırın, daha sonra (MySqlRowsAffected()==0) olup olmadığını kontrol edin, bu bir satır olmadığı anlamına gelir Güncellemelerin ~%100'üne sahipsiniz, bu nedenle INSERT deyimini uygulayın.
Güncellemelerin ~%100'üne sahipsiniz, bu nedenle bu geçici çözüm performansı artırabilir ve ağ trafiğini azaltabilir.
Ve sonunda, projenin tam kaynak kodları (DLL geliştirme dahil) makaleye eklenmiştir, kendi yolunuzla değiştirebilirsiniz.
Eğer sorunu MqlMySQL.DLL'de bulursanız, hata ayıklama yapabilir ve kendiniz düzeltebilirsiniz.
En iyi dileklerimle, Eugene
Eugene
Harika iş, çok teşekkür ederim Eugeniy.
Kodlarınız bana çok yardımcı oluyor, çok fazla zaman kazanabiliyorum. INSERT, SELECT, UPDATE ve DELETE sorgularını başarıyla yapmaya çalıştım. Yanılmıyorsam, "İmleç" yalnızca SELECT sorgusu için gereklidir ??
= pedma
Harika iş, çok teşekkür ederim Eugeniy.
Kodlarınız bana çok yardımcı oluyor, çok fazla zaman kazanabiliyorum. INSERT, SELECT, UPDATE ve DELETE sorgularını başarıyla yapmaya çalıştım. Yanılmıyorsam, "İmleç" yalnızca SELECT sorgusu için gereklidir ??
= pedma
Kesinlikle dostum!
İmleçler sadece veri seçimi için kullanılır çünkü db'den MQL değişkenine veri almamız gerekir, sadece sql komutunu veritabanına göndermek için değil.
Çözümümün size yardımcı olmasına sevindim.
İyi şanslar,
Eugene
Merhaba Eugene,
Satacağım bir EA'ya entegre edilmiş bir uzaktan ticaret kopyalayıcı oluşturmak istediğim için hala ücretli geliştirme projeleri yapıp yapmadığınızı merak ediyordum?
Upwork'e baktım ve son zamanlarda herhangi bir freelancer projesi tamamlamış görünmüyorsunuz.
Oluşturduğunuz kütüphaneyi kullanarak kendim denedim, ancak çok iyi sonuç vermedi. Gerçi sizin programlama yeteneğinize sahip biri için bunun kolay olacağından eminim!
Şimdiden teşekkürler,
James
Merhaba Eugene,
Satacağım bir EA'ya entegre edilmiş bir uzaktan ticaret kopyalayıcı oluşturmak istediğim için hala ücretli geliştirme projeleri yapıp yapmadığınızı merak ediyordum?
Upwork'e baktım ve son zamanlarda herhangi bir freelancer projesi tamamlamış görünmüyorsunuz.
Oluşturduğunuz kütüphaneyi kullanarak kendim denedim, ancak çok iyi sonuç vermedi. Gerçi sizin programlama yeteneğinize sahip biri için bunun kolay olacağından eminim!
Şimdiden teşekkürler,
James
Merhaba James,
Şu anda Upwork'te sadece bir büyük proje üzerinde çalışıyorum. Yani bugünlerde pek boş zamanım yok. Libs ile yaşadığınız sorun nedir? Size nasıl yardımcı olabilirim?