좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.
그럼 단계별로 진행해 보겠습니다.
1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.
2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !
3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.
4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.
마지막으로 다음과 같이 보입니다.
... your code
int DB = -1; // 데이터베이스 식별자//--
... your code
intOnInit()
{
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
if (DB != -1)
{
// 연결에 성공했습니다!// 여기에 테이블 생성 로직을 정의해야 합니다.
}
return(INIT_SUCCEEDED);
}
voidOnDeinit(constint reason)
{
MySqlDisconnect(DB);
}
voidOnTick()
{
// 첫 번째 명령.if (DB==-1) return; // 연결되지 않은 경우 아무 작업도 수행하지 않습니다.// 여기에 cMySqlConnect 호출이 없는 코드가 있습니다.
}
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.
좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.
그럼 단계별로 진행해 보겠습니다.
1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.
2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !
3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.
4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.
마지막으로 다음과 같이 보일 것입니다.
문제는 하나의 mt4에서 두 개 이상의 심볼에 사용할 수 없으며, 하나의 심볼에서만 사용하면 정상입니다. 4개 이상에서 사용하면 정상적으로 실행되지만 몇 분 후에 "OnTick()"이라는 문제가 인쇄됩니다. 몇 분 후에는 '...MQLMySQL.db에서 0x0000000B로 읽은 액세스 위반'이라는 문제를 출력합니다. .MQLMySQL.dll'"이라는 문제를 출력합니다.
예제는 모두 스크립트이며 한 번만 실행되며 한 명의 전문가가 하나 또는 두 개의 mt4에서 4 개 이상의 기호로 dll을 호출하면 문제를 찾을 수 있습니다.
MFC는 정적 데이터 소멸 후 CRT가 누수를 덤프할 때까지 기다리지 않고 종료 시 누수를 조기에 덤프하며, 이로 인해 MFC 가 초기화되기 전에 메모리를 할당하여 MFC 종료 후 소멸된 객체에 대한 허위 누수 보고서가 발생합니다. MFC 가 초기화되기 전에 메모리를 할당하여 MFC 종료 후 소멸된 객체에 대한 허위 누출 보고가 발생합니다. 이는 C++ 런타임 DLL을사용하는 프로그램에서 MFC DLL을 사용할 때 일반적으로 관찰되는 문제입니다 .
좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.
그럼 단계별로 진행해 보겠습니다.
1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.
2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !
3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.
4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.
마지막으로 다음과 같이 보입니다.
좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.
그럼 단계별로 진행해 보겠습니다.
1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.
2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !
3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.
4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.
마지막으로 다음과 같이 보입니다.
좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.
그럼 단계별로 진행해 보겠습니다.
1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.
2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !
3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.
4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.
마지막으로 다음과 같이 보입니다.
단계별로 변경했지만 4 개 이상의 기호에 대해 하나의 mt4에서 전문가를 사용할 때 문제가 여전히 존재합니다. " 액세스 위반이 읽었습니다. 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_SUCCEED); }
}
//+------------------------------------------------------------------+
//| 전문가 초기화 함수 ||
//+------------------------------------------------------------------+
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 = 심볼 + "_table";
double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }
입장료 = spread*MathPow(10, Digits).
//int DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그);
Query = "SELECT * FROM " + 기호 + " where AccountNumber = " + (문자열)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 " + 기호 + " set Bid = " + (문자열)Bid + ", Ask = " + ( 문자열)Ask
+ ", Spread = " + DoubleToStr(spread, Digits)
+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + "' 여기서 계정번호 = "
+ (문자열)계정; // + "' 및 기호 = '" + 기호 + "'".
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, "
+ "기호 문자(20), 입찰가 2배, 매도 2배, 스프레드 2배,"
+ "메모 문자(50), "
+ "시간 날짜 시간) 엔진=메모리 기본 문자 집합=utf8 ";
MySqlExecute(DB, Query);
Query = "INSERT INTO " + 기호 + "(계정번호, 기호, 매수, 매도, 스프레드. Memo, Time) VALUES ("
+ (문자열)계정 + ", '" + 기호 + "', "+(문자열)입찰가+","+ (문자열)질문 + ", "
+ DoubleToStr(스프레드, 숫자)
+ ", '" + (문자열)AccountCompany()
+ "', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')""";
if(MySqlExecute(DB, Query) ! = true )
{
//쿼리 = "`데이터_테이블`이 존재하면 테이블 삭제";
//MySqlExecute(DB, Query);
Query = "CREATE TABLE IF NOT EXISTS " + symbol + "(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
+ "기호 문자(20), 입찰가 2배, 매도 2배, 스프레드 double,"
+ "메모 문자(50), "
+ "시간 날짜 시간) 엔진=메모리 기본 문자 집합= utf8 ";
MySqlExecute(DB, Query);
}
}
MySqlCursorClose(Cursor1); // 절대 커서 닫는 것을 잊지 마세요 !!!!
}
}
}
-->
좋아, 나는 당신이이 목적을 위해 전문가 조언을 작성했으며, 내가 기사에 게시 한 권장 사항없이 작성된 것을 보았습니다.
그럼 단계별로 진행해 보겠습니다.
1. " DB = cMySqlConnect(호스트, 사용자, 비밀번호, 데이터베이스, 포트, 소켓, 클라이언트플래그); "의 호출은 OnInit() 내부에서 이루어져야 합니다. 표준 함수 내에서 호출해야 합니다.
2. cMySqlConnect를 사용하고 있습니다 - DLL에서 가져온 함수이므로, 대신 cMySqlConnect 함수 !
3. OnDeinit() 스턴다드 함수 내에서 MySqlDisconnect 함수를 호출해야 합니다.
4. OnTick() 표준 함수 내에서 데이터베이스 연결 식별자를 확인하여 연결이 성공했는지 확인해야 합니다.
마지막으로 다음과 같이 보일 것입니다.
문제는 하나의 mt4에서 두 개 이상의 심볼에 사용할 수 없으며, 하나의 심볼에서만 사용하면 정상입니다. 4개 이상에서 사용하면 정상적으로 실행되지만 몇 분 후에 "OnTick()"이라는 문제가 인쇄됩니다. 몇 분 후에는 '...MQLMySQL.db에서 0x0000000B로 읽은 액세스 위반'이라는 문제를 출력합니다. .MQLMySQL.dll'"이라는 문제를 출력합니다.
예제는 모두 스크립트이며 한 번만 실행되며 한 명의 전문가가 하나 또는 두 개의 mt4에서 4 개 이상의 기호로 dll을 호출하면 문제를 찾을 수 있습니다.
dll에 밈 릴리스 또는 가베 컬렉션이 필요합니까?
CRT가 누수를 덤프할 때까지 기다리지 않고 종료 시 누수를 조기에 덤프하며, 이로 인해 MFC 가 초기화되기 전에 메모리를 할당하여 MFC 종료 후 소멸된 객체에 대한 허위 누수 보고서가 발생합니다. MFC
가 초기화되기 전에 메모리를 할당하여 MFC 종료 후 소멸된 객체에 대한
허위 누출 보고가 발생합니다. 이는
C++ 런타임 DLL을사용하는 프로그램에서 MFC DLL을 사용할 때 일반적으로 관찰되는
문제입니다 .
다시 한 번 안녕하세요.
제공해주신 코드를 보니 MQL을 처음 사용하시는 것 같습니다.
죄송하지만 가르쳐 드릴 시간이 없지만 제가 개발한 소프트웨어를 테스트할 시간이 있습니다.
죄송하지만 가르쳐 드릴 시간은 없지만 제가 개발한 소프트웨어를 테스트할 시간은 있습니다. 그래서 여기에 로그가 첨부되어 있습니다.
각 통화쌍에 대해 정의된 각 테이블과 다른 계좌에 대한 온라인 시장 데이터를 보관할 수 있는 로직에 따라 테스트 EA를 빌드해 보세요.
로그를 검사할 수 있으며 "액세스 위반..."이라는 오류는 발생하지 않았습니다. 로그를 검사할 수 있으며 "액세스 위반..." 오류가 발생하지 않았습니다.
문제는 MQLMySQL 라이브러리에 있지 않습니다.
EA 테스트.
이것은 라이브러리 사용의 올바른 로직입니다.
최적화로 인해 SELECT 문을 사용하지 않고 UPDATE 문을 실행하는 것보다 (MySqlRowsAffected()==0) 행이 하나도 없는지 확인하는 것이 좋습니다. 100%의 업데이트가 있으므로 INSERT 문을 적용합니다.
업데이트가 ~100%이므로 이 해결 방법을 사용하면 성능이 향상되고 네트워크 트래픽이 감소할 수 있습니다.
그리고 마지막에 프로젝트의 전체 소스 코드(DLL 개발 포함)가 첨부되어 있으므로 직접 변경할 수 있습니다.
어쨌든 MqlMySQL.DLL에서 문제가 발생하면 디버깅하여 직접 수정할 수 있습니다.
행운을 빕니다, 유진
Eugene
수고하셨습니다, 정말 감사합니다 Eugeniy.
귀하의 코드는 저에게 많은 도움이되며 많은 시간을 절약 할 수 있습니다. 삽입, 선택, 업데이트 및 삭제 쿼리를 성공적으로 수행하려고했습니다. 내가 틀리지 않았다면 "커서"는 SELECT 쿼리에만 필요합니까 ??
= 페드마
수고하셨습니다, 정말 감사합니다 Eugeniy.
귀하의 코드는 저에게 많은 도움이되며 많은 시간을 절약 할 수 있습니다. 삽입, 선택, 업데이트 및 삭제 쿼리를 성공적으로 수행하려고했습니다. 내가 틀리지 않았다면 "커서"는 SELECT 쿼리에만 필요합니까 ??
= 페드마
정확히 맞습니다!
커서는 SQL 명령을 데이터베이스에 보내는 것이 아니라 DB에서 MQL 변수로 데이터를 수신해야하기 때문에 데이터 선택에만 사용됩니다.
제 솔루션이 도움이 되어서 다행입니다.
행운을 빕니다,
Eugene
안녕하세요 유진,
제가 판매할 EA에 통합된 원격 거래 복사기를 만들려고 하는데 여전히 유료 개발 프로젝트를 하고 계신지 궁금해서요.
Upwork를 살펴보니 최근에 프리랜서 프로젝트를 완료한 적이 없는 것 같습니다.
제가 만든 라이브러리를 사용하여 직접 시도해 보았지만 그다지 좋은 결과를 얻지 못했습니다. 프로그래밍 능력이 있는 사람이라면 쉽게 만들 수 있을 것 같지만요!
미리 감사드립니다,
James
안녕하세요 유진,
제가 판매할 EA에 통합된 원격 거래 복사기를 만들려고 하는데 여전히 유료 개발 프로젝트를 하고 계신지 궁금해서요.
Upwork를 살펴보니 최근에 프리랜서 프로젝트를 완료한 적이 없는 것 같습니다.
제가 만든 라이브러리를 사용하여 직접 시도해 보았지만 그다지 좋은 결과를 얻지 못했습니다. 프로그래밍 능력이 있는 사람이라면 쉽게 만들 수 있을 것 같지만요!
미리 감사드립니다,
James
안녕하세요 제임스,
저는 현재 Upwork에서 하나의 큰 프로젝트만 진행하고 있습니다. 그래서 요즘은 여유 시간이 별로 없어요. 라이브러리에 어떤 문제가 있나요? 어떻게 도와드릴까요?