Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Хорошо, я вижу, что вы написали советник для этих целей, и он написан без учета рекомендаций, которые я разместил в статье.
Итак, давайте двигаться шаг за шагом: 1.
1. вызов функции " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " должен быть сделан внутри OnInit() вместо стандартной функции OnTick(). 2.
2. Вы используете cMySqlConnect - это импортированная функция из DLL, вы должны использовать функцию MySqlConnect вместо cMySqlConnect !
3. Вы должны вызвать функцию MySqlDisconnect внутри функции OnDeinit() stundard.
4. необходимо проверить идентификатор подключения к базе данных в стандартной функции OnTick(), чтобы убедиться, что подключение было успешным.
В итоге это будет выглядеть следующим образом.
Хорошо, я вижу, что вы написали советник для этих целей, и он написан без учета рекомендаций, которые я разместил в статье.
Итак, давайте двигаться шаг за шагом: 1.
1. вызов функции " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " должен быть сделан внутри OnInit() вместо стандартной функции OnTick(). 2.
2. Вы используете cMySqlConnect - это импортированная функция из DLL, вы должны использовать функцию MySqlConnect вместо cMySqlConnect !
3. Вы должны вызвать функцию MySqlDisconnect внутри функции OnDeinit() stundard.
4. необходимо проверить идентификатор подключения к базе данных в стандартной функции OnTick(), чтобы убедиться, что подключение было успешным.
В итоге все будет выглядеть так.
Хорошо, я вижу, что вы написали советник для этих целей, и он написан без учета рекомендаций, которые я разместил в статье.
Итак, давайте двигаться шаг за шагом: 1.
1. вызов функции " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " должен быть сделан внутри OnInit() вместо стандартной функции OnTick(). 2.
2. Вы используете cMySqlConnect - это импортированная функция из DLL, вы должны использовать функцию MySqlConnect вместо cMySqlConnect !
3. Вы должны вызвать функцию MySqlDisconnect внутри функции OnDeinit() stundard.
4. необходимо проверить идентификатор подключения к базе данных в стандартной функции OnTick(), чтобы убедиться, что подключение было успешным.
В итоге это будет выглядеть так.
Я изменил шаг за шагом, но проблема все еще существует при использовании эксперта в одном mt4 для четырех или более символов. он печатает " Access violation read to 0x0000000B в '... .MQLMySQL.dll'
"
код приведен ниже
<--
#include <MQLMySQL.mqh
int MySqlErrorNumber; // номер последней ошибки MySQL
string MySqlErrorDescription; // описание ошибки
//+------------------------------------------------------------------+
//| Функция инициализации эксперта & nbsp; |
//+------------------------------------------------------------------+
int OnInit()
OnInit(); int OnInit()
EventSetTimer(timeSeconds);
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 )
if( DB == -1 )
{
Print("База данных не подключена..."); if( DB == -1 ) { print("База данных не подключена... "); }
}
return(INIT_SUCCEEDED); }
}
//+------------------------------------------------------------------+
//| Функция деинициализации эксперта |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MySqlDisconnect(DB);
EventKillTimer();
ObjectsDeleteAll();
}
void OnTimer()
{
//Alert(TimeCurrent());
OnTick();
}
//+------------------------------------------------------------------+
//| Экспертная функция тика & nbsp; |
//+------------------------------------------------------------------+
void OnTick()
{
if( DB == -1 )
{
Alert("База данных не подключена ... "); return; { Alert("База данных не подключена ...")
return; }
}
if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB ! = -1 )
{
int account = AccountNumber();
string symbol = Symbol(); if( cmd !
if( cmd ! = "" && cmd ! = NULL )
{
symbol = cmd; }
}
symbolOrder = symbol + "_table";
double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }
прием = 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)Ask
+ ", Spread = " + DoubleToStr(spread, Digits)
+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + "', где AccountNumber = "
+ (string)account; // + + "' and Symbol = '" + symbol + "'".
MySqlExecute(DB, Query);
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, Query);
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, Query);
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, Query);
}
}
MySqlCursorClose(Cursor1); // НИКОГДА НЕ ЗАБУДЬТЕ ЗАКРЫТЬ КУРСОР !!!!
}
}
}
-->
Хорошо, я вижу, что вы написали советник для этих целей, и он написан без учета рекомендаций, которые я разместил в статье.
Итак, давайте двигаться шаг за шагом: 1.
1. вызов функции " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " должен быть сделан внутри OnInit() вместо стандартной функции OnTick(). 2.
2. Вы используете cMySqlConnect - это импортированная функция из DLL, вы должны использовать функцию MySqlConnect вместо cMySqlConnect !
3. Вы должны вызвать функцию MySqlDisconnect внутри функции OnDeinit() stundard.
4. необходимо проверить идентификатор подключения к базе данных в стандартной функции OnTick(), чтобы убедиться, что подключение было успешным.
В итоге это будет выглядеть так.
Проблема в том, что он не может использовать в одном mt4 более двух символов, если использовать только один символ, это нормально. При использовании четырех или более, он работает нормально, но через несколько минут, он печатает проблему "OnTick()". Через несколько минут выдает проблему "Access violation read to 0x0000000B in '...MQLMySQL.db'". .MQLMySQL.dll'".
Это все скрипты, они запускаются только один раз, вы можете попробовать один эксперт вызвать dll в четыре или более символов в одном или двух mt4, вы можете найти проблему.
Может быть, dll нуждается в выпуске memeoy или garbe collection?
CRT сбросит утечки после статического уничтожения данных, и это приводит к ο ложным сообщениям об утечках для объектов, которые выделили память до инициализации MFC и которые таким образом уничтожаются после выхода MFC nbsp;
ложные сообщения об утечках для объектов, которые выделили память до инициализации MFC
и которые, таким образом, уничтожаются после выхода из MFC. Это
обычно наблюдается при использовании библиотеки MFC DLL в программе, которая также использует
библиотеку времени выполнения C++.
Еще раз здравствуйте.
Судя по предоставленному вами коду, я предполагаю, что вы новичок в MQL.
Извините, у меня нет времени учить вас, но у меня есть время на тестирование разработанного мной программного обеспечения.
Извините, у меня нет времени учить вас, но у меня есть время для тестирования программного обеспечения, которое я разработал. Итак, вот журналы прилагаются.
Построил для вас тестовый советник, основанный на вашей логике: каждая таблица определена для каждой валютной пары и может хранить данные онлайн рынка для разных счетов.
Вы можете просмотреть логи, ни одной ошибки "Access violation..." не возникло. Вы можете просмотреть журналы, ни одной ошибки "Access violation..." не возникло.
Проблема не в библиотеке MQLMySQL.
Тестируем советника.
Это правильная логика использования библиотеки.
В целях оптимизации можно даже не использовать оператор SELECT, а просто выполнить оператор UPDATE, а затем проверить, что (MySqlRowsAffected()==0) означает, что не было ни одной строки. У вас ~100% обновлений, поэтому примените оператор INSERT.
У вас ~100% обновлений, поэтому этот обходной путь может увеличить производительность и уменьшить сетевой трафик.
И в конце, к статье приложены полные исходные коды проекта (включая разработку DLL), вы можете изменить их по своему усмотрению.
Если вы все же обнаружили, что проблема в MqlMySQL.DLL, вы можете отладить ее и исправить самостоятельно.
С наилучшими пожеланиями, Евгений
Евгений
Отличная работа, спасибо большое Евгению.
Ваши коды мне очень помогают, я могу сэкономить так много времени. Я попытался сделать INSERT, SELECT, UPDATE и DELETE запросы успешно. Если я не ошибаюсь, то "Курсор" нужен только для SELECT запроса ?
= pedma
Отличная работа, спасибо большое Евгению.
Ваши коды мне очень помогают, я могу сэкономить так много времени. Я попытался сделать INSERT, SELECT, UPDATE и DELETE запросы успешно. Если я не ошибаюсь, то "Курсор" нужен только для SELECT запроса ?
= pedma
Именно так!
Курсоры используются только для выбора данных, потому что мы должны получать данные из БД в переменную MQL, а не просто отправлять sql-команду в БД.
Я рад, что мое решение помогло вам.
Удачи,
Евгений
Привет, Евгений,
Мне просто интересно, занимаетесь ли вы еще платными проектами по разработке, так как я хочу создать копировщик удаленной торговли, который будет интегрирован в советник, который я буду продавать?
Я посмотрел на Upwork, и, похоже, вы не выполняли никаких проектов для фрилансеров в последнее время.
Я попробовал сам, используя созданную вами библиотеку, но получилось не очень хорошо. Хотя я уверен, что для человека с вашими способностями к программированию это не составит труда!
Заранее спасибо,
Джеймс
Привет, Евгений,
Мне просто интересно, занимаетесь ли вы еще платными проектами по разработке, так как я хочу создать копировщик удаленной торговли, который будет интегрирован в советник, который я буду продавать?
Я посмотрел на Upwork, и, похоже, вы не выполняли никаких проектов для фрилансеров в последнее время.
Я попробовал сам, используя созданную вами библиотеку, но получилось не очень хорошо. Хотя я уверен, что для человека с вашими способностями к программированию это не составит труда!
Заранее спасибо,
Джеймс
Здравствуйте, Джеймс,
В настоящее время я работаю на Upwork только над одним большим проектом. Поэтому сейчас у меня нет много свободного времени. Какие у вас проблемы с либами? Чем я могу вам помочь?