//+------------------------------------------------------------------+
//| OnTrade_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
input int days=7; // 며칠간 거래의 뎁스 내역
//--- 거래 이력의 한계를 글로벌 범위로 설정
datetime start; // 캐시 내 거래 이력 시작 날짜
datetime end; // 캐시 내 거래 이력 종료 날짜
//--- 글로벌 카운터
int orders; // 활성 주문 수
int positions; // 오픈 포지션 수
int deals; // 거래 내역 캐시의 거래 수
int history_orders; // 거래 내역 캐시의 주문 수
bool started=false; // 역관계의 플래그
//+------------------------------------------------------------------+
//| Expert 초기화 함수 |
//+------------------------------------------------------------------+
int OnInit()
{
//---
end=TimeCurrent();
start=end-days*PeriodSeconds(PERIOD_D1);
PrintFormat("로드할 기록의 제한: start - %s, end - %s",
TimeToString(start),TimeToString(end));
InitCounters();
//---
return(0);
}
//+------------------------------------------------------------------+
//| 포지션, 주문 및 거래 카운터의 초기화 |
//+------------------------------------------------------------------+
void InitCounters()
{
ResetLastError();
//--- 로드 이력
bool selected=HistorySelect(start,end);
if(!selected)
{
PrintFormat("%s. Failed to load history from %s to %s to cache. Error code: %d",
__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
return;
}
//--- 현재 값 획득
orders=OrdersTotal();
positions=PositionsTotal();
deals=HistoryDealsTotal();
history_orders=HistoryOrdersTotal();
started=true;
Print("주문, 포지션 및 거래 카운터가 초기화되었습니다");
}
//+------------------------------------------------------------------+
//| Expert 틱 함수 |
//+------------------------------------------------------------------+
void OnTick()
{
if(started) SimpleTradeProcessor();
else InitCounters();
}
//+------------------------------------------------------------------+
//| 거래 이벤트가 도착하면 호출됩니다 |
//+------------------------------------------------------------------+
void OnTrade()
{
if(started) SimpleTradeProcessor();
else InitCounters();
}
//+------------------------------------------------------------------+
//| 거래 및 내역 변경의 처리 예 |
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
{
end=TimeCurrent();
ResetLastError();
//--- 지정된 간격에서 프로그램 캐시로 거래 기록 다운로드
bool selected=HistorySelect(start,end);
if(!selected)
{
PrintFormat("%s. Failed to load history from %s to %s to cache. Error code: %d",
__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
return;
}
//--- 현재 값 획득
int curr_orders=OrdersTotal();
int curr_positions=PositionsTotal();
int curr_deals=HistoryDealsTotal();
int curr_history_orders=HistoryOrdersTotal();
//--- 활성 주문 건수가 변경되었는지 점검
if(curr_orders!=orders)
{
//--- 활성 주문 수가 변경되었습니다
PrintFormat("주문 건수가 변경되었습니다. 이전 값은 %d, 현재 값은 %d",
orders,curr_orders);
//--- 값 업데이트
orders=curr_orders;
}
//--- 오픈 포지션 수의 변화
if(curr_positions!=positions)
{
//--- 오픈 포지션 수가 변경되었습니다
PrintFormat("포지션 수가 변경되었습니다. 이전 값은 %d, 현재 값은 %d",
positions,curr_positions);
//--- 값 업데이트
positions=curr_positions;
}
//--- 거래 내역 캐시의 딜 수 변경
if(curr_deals!=deals)
{
//--- 거래 기록 캐시의 딜 수가 변경되었습니다
PrintFormat("딜 수가 변경되었습니다. 이전 값은 %d, 현재 값은 %d",
deals,curr_deals);
//--- 값 업데이트
deals=curr_deals;
}
//--- 거래 기록 캐시의 기록 주문 수 변경
if(curr_history_orders!=history_orders)
{
//--- 거래 기록 캐시의 기록 주문 수가 변경되었습니다
PrintFormat("기록 내 주문 수가 변경되었습니다. 이전 값은 %d, 현재 값은 %d",
history_orders,curr_history_orders);
//--- 값 업데이트
history_orders=curr_history_orders;
}
//--- 캐시에서 요청할 거래 기록의 한도를 변경할 필요가 있는지 확인
CheckStartDateInTradeHistory();
}
//+------------------------------------------------------------------+
//| 거래 내역 요청 시작 날짜 변경 |
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
{
//--- 초기 간격, 지금 당장 작업을 시작할 경우
datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- 거래 내역의 시작 제한이 없어지지 않도록 하십시오
//--- 예정일보다 1일 이상 경과
if(curr_start-start>PeriodSeconds(PERIOD_D1))
{
//--- 캐시에 로드할 기록 시작 날짜를 수정
start=curr_start;
PrintFormat("로드할 거래 기록의 새 시작 제한: 시작 => %s",
TimeToString(start));
//--- 이제 업데이트된 간격에 대한 거래 기록을 다시 로드합니다
HistorySelect(start,end);
//--- 그 이상의 비교를 위해 딜과 주문 카운터를 수정
history_orders=HistoryOrdersTotal();
deals=HistoryDealsTotal();
}
}
//+------------------------------------------------------------------+
/* 샘플 결과:
로드할 기록의 한계: 시작 - 2018.07.16 18:11, 끝 - 2018.07.23 18:11
주문, 포지션 및 거래 카운터가 성공적으로 초기화되었습니다.
주문 수가 변경되었습니다. 이전 값 0, 현재 값 1
주문 수가 변경되었습니다. 이전 값 0, 현재 값 1
포지션 수가 변경되었습니다. 이전 값 0, 현재 값 1
딜 수가 변경되었습니다. 이전 값 0, 현재 값 1
내역의 주문 수가 변경되었습니다. 이전 값 0, 현재 값 1
*/
|