//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 파일 이름 생성
string filename=AccountInfoString(ACCOUNT_SERVER) +"_"+IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN))+".sqlite";
//--- 공용 터미널 폴더에서 데이터베이스 열기/생성
int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
if(db==INVALID_HANDLE)
{
Print("DB: ", filename, " 코드와 함께 열기 실패 ", GetLastError());
return;
}
//--- DEALS 표가 이미 있는 경우 삭제
if(!DeleteTable(db, "DEALS"))
{
DatabaseClose(db);
return;
}
//--- DEALS 표를 작성
if(!CreateTableDeals(db))
{
DatabaseClose(db);
return;
}
//--- 전체 트레이딩 내역을 요청
datetime from_date=0;
datetime to_date=TimeCurrent();
//--- 거래 내역을 지정 간격 내에 요청
HistorySelect(from_date, to_date);
int deals_total=HistoryDealsTotal();
PrintFormat("트레이딩 내역 내 거래: %d ", deals_total);
//--- DatabaseTransactionBegin/DatabaseTransactionCommit을 사용하여 트랜잭션 실행 속도를 측정
ulong start=GetMicrosecondCount();
bool fast_transactions=true;
InsertDeals(db, fast_transactions);
double fast_transactions_time=double(GetMicrosecondCount()-start)/1000;
PrintFormat("Transations WITH DatabaseTransactionBegin/DatabaseTransactionCommit: time=%.1f milliseconds", fast_transactions_time);
//--- DEALS 테이블을 삭제하고 다시 생성
if(!DeleteTable(db, "DEALS"))
{
DatabaseClose(db);
return;
}
//--- 새 DEALS 테이블 생성
if(!CreateTableDeals(db))
{
DatabaseClose(db);
return;
}
//--- 이번에는 DatabaseTransactionBegin/DatabaseTransactionCommit를 사용하지 않고 다시 테스트
fast_transactions=false;
start=GetMicrosecondCount();
InsertDeals(db, fast_transactions);
double slow_transactions_time=double(GetMicrosecondCount()-start)/1000;
PrintFormat("Transations WITHOUT DatabaseTransactionBegin/DatabaseTransactionCommit: time=%.1f milliseconds", slow_transactions_time);
//--- 시간의 증가를 보고
PrintFormat("DatabaseTransactionBegin/DatabaseTransactionCommit 를 사용하여 %.1f 배 가속 제공", double(slow_transactions_time)/fast_transactions_time);
//--- 데이터베이스 닫기
DatabaseClose(db);
}
/*
Results:
Deals in the trading history: 2737
Transations WITH DatabaseTransactionBegin/DatabaseTransactionCommit: time=48.5 milliseconds
Transations WITHOUT DatabaseTransactionBegin/DatabaseTransactionCommit: time=25818.9 milliseconds
Use of DatabaseTransactionBegin/DatabaseTransactionCommit provided acceleration by 532.8 times
*/
//+------------------------------------------------------------------+
//| 데이터베이스에서 지정된 이름의 표를 삭제 |
//+------------------------------------------------------------------+
bool DeleteTable(int database, string table_name)
{
if(!DatabaseExecute(database, "DROP TABLE IF EXISTS "+table_name))
{
Print("코드가 있는 테이블을 삭제 실패 ", GetLastError());
return(false);
}
//--- 테이블이 성공적으로 삭제되었습니다
return(true);
}
//+------------------------------------------------------------------+
//| DEALS 표 생성 |
//+------------------------------------------------------------------+
bool CreateTableDeals(int database)
{
//--- 표의 존재유무 확인
if(!DatabaseTableExists(database, "DEALS"))
//--- 표 생성
if(!DatabaseExecute(database, "CREATE TABLE DEALS("
"ID INT KEY NOT NULL,"
"ORDER_ID INT NOT NULL,"
"POSITION_ID INT NOT NULL,"
"TIME INT NOT NULL,"
"TYPE INT NOT NULL,"
"ENTRY INT NOT NULL,"
"SYMBOL CHAR(10),"
"VOLUME REAL,"
"PRICE REAL,"
"PROFIT REAL,"
"SWAP REAL,"
"COMMISSION REAL,"
"MAGIC INT,"
"REASON INT );"))
{
Print("DB: 코드로 실패한 DEALS 테이블을 작성 ", GetLastError());
return(false);
}
//--- 표가 성공적으로 생성되었습니다
return(true);
}
//+------------------------------------------------------------------+
//| 데이터베이스 표에 거래 추가 |
//+------------------------------------------------------------------+
bool InsertDeals(int database, bool begintransaction=true)
{
//--- 보조 변수
ulong deal_ticket; // 거래 티켓
long order_ticket; // 거래가 실행된 주문 티켓
long position_ticket; // 거래가 속한 포지션의 ID
datetime time; // 거래 실행 시간
long type ; // 거래 유형
long entry ; // 거래 방향
string symbol; // 거래가 실행된 심볼
double volume; // 작업 볼륨
double price; // 가격
double profit; // 재정적 결과
double swap; // 스왑
double commission; // 수수료
long magic; // 매직 넘버
long reason; // 거래 실행 이유 또는 소스
//--- 모든 거래를 검토하고 데이터베이스에 추가
bool failed=false;
int deals=HistoryDealsTotal();
//--- 빠른 트랜잭션 성능 방법을 사용하는 경우
if(begintransaction)
{
// --- 트랜잭션을 실행하기 전에 데이터베이스를 잠금
DatabaseTransactionBegin(database);
}
for(int i=0; i<deals; i++)
{
deal_ticket= HistoryDealGetTicket(i);
order_ticket= HistoryDealGetInteger(deal_ticket, DEAL_ORDER);
position_ticket=HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID);
time= (datetime)HistoryDealGetInteger(deal_ticket, DEAL_TIME);
type= HistoryDealGetInteger(deal_ticket, DEAL_TYPE);
entry= HistoryDealGetInteger(deal_ticket, DEAL_ENTRY);
symbol= HistoryDealGetString(deal_ticket, DEAL_SYMBOL);
volume= HistoryDealGetDouble(deal_ticket, DEAL_VOLUME);
price= HistoryDealGetDouble(deal_ticket, DEAL_PRICE);
profit= HistoryDealGetDouble(deal_ticket, DEAL_PROFIT);
swap= HistoryDealGetDouble(deal_ticket, DEAL_SWAP);
commission= HistoryDealGetDouble(deal_ticket, DEAL_COMMISSION);
magic= HistoryDealGetInteger(deal_ticket, DEAL_MAGIC);
reason= HistoryDealGetInteger(deal_ticket, DEAL_REASON);
//--- 다음 요청에 따ㅏ 각 거래를 추가
string request_text=StringFormat("INSERT INTO DEALS (ID,ORDER_ID,POSITION_ID,TIME,TYPE,ENTRY,SYMBOL,VOLUME,PRICE,PROFIT,SWAP,COMMISSION,MAGIC,REASON)"
"VALUES (%d, %d, %d, %d, %d, %d, '%s', %G, %G, %G, %G, %G, %d, %d)",
deal_ticket, order_ticket, position_ticket, time, type, entry, symbol, volume, price, profit, swap, commission, magic, reason);
if(!DatabaseExecute(database, request_text))
{
PrintFormat("%s: failed to insert deal #%dwith code %d", __FUNCTION__, deal_ticket, GetLastError());
PrintFormat("i=%d: deal #%d %s", i, deal_ticket, symbol);
failed=true;
break;
}
}
//--- 트랜잭션 실행 오류를 확인
if(failed)
{
//--- 빠른 트랜잭션 성능 방법을 사용하는 경우
if(begintransaction)
{
//--- 모든 트랜잭션 롤백 및 데이터베이스 잠금 해제
DatabaseTransactionRollback(database);
}
Print("%s: DatabaseExecute() failed with code ", __FUNCTION__, GetLastError());
return(false);
}
//--- 빠른 트랜잭션 성능 방법을 사용하는 경우
if(begintransaction)
{
//--- 모든 트랜잭션이 성공적으로 수행됨 - 변경사항을 기록하고 데이터베이스 잠금을 해제
DatabaseTransactionCommit(database);
}
//--- 성공적으로 완료
return(true);
}
//+------------------------------------------------------------------+
|