//+------------------------------------------------------------------+ //| DemoTradeEventProcessing.mq5 | //| Copyright 2011, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2011, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" input int days=7; // depth of trade history in days int orders; // number of active orders int positions; // number of open positions int deals; // number of deals in the trade history cache int history_orders; // number of orders in the trade history cache bool started=false; // flag of initialization of the counters //--- let's set the limits of the trade history on the global scope datetime start; // start date for trade history in cache datetime end; // end date for trade history in cache //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- end=TimeCurrent(); start=end-days*PeriodSeconds(PERIOD_D1); PrintFormat("Limits of the history to be loaded: start - %s, end - %s", TimeToString(start),TimeToString(end)); InitCounters(); //--- return(0); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(started) SimpleTradeProcessor(); else InitCounters(); } //+------------------------------------------------------------------+ //| Called when a Trade event comes | //+------------------------------------------------------------------+ void OnTrade() { if(started) SimpleTradeProcessor(); else InitCounters(); } //+------------------------------------------------------------------+ //| initialization of the counters of positions, orders and deals | //+------------------------------------------------------------------+ void InitCounters() { ResetLastError(); //--- load history bool selected=HistorySelect(start,end); if(!selected) { PrintFormat("%s. Failed to load the history from %s to %s to the cache. Error code: %d", __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError()); return; } //--- get current value orders=OrdersTotal(); positions=PositionsTotal(); deals=HistoryDealsTotal(); history_orders=HistoryOrdersTotal(); started=true; Print("The counters of orders, positions and deals are successfully initialized"); } //+------------------------------------------------------------------+ //| a simple example of processing changes in trade and history | //+------------------------------------------------------------------+ void SimpleTradeProcessor() { end=TimeCurrent(); ResetLastError(); //--- load history bool selected=HistorySelect(start,end); if(!selected) { PrintFormat("%s. Failed to load the history from %s to %s to the cache. Error code: %d", __FUNCTION__,TimeToString(start),TimeToString(end),GetLastError()); return; } //--- get current value int curr_orders=OrdersTotal(); int curr_positions=PositionsTotal(); int curr_deals=HistoryDealsTotal(); int curr_history_orders=HistoryOrdersTotal(); //--- check if the number of active orders has been changed if(curr_orders!=orders) { //--- number of active orders has been changed PrintFormat("Number of orders has been changed. Previous value is %d, current value is %d", orders,curr_orders); /* other actions connected with change of orders */ //--- update value orders=curr_orders; } //--- changes in the number of open positions if(curr_positions!=positions) { //--- number of open positions has been changed PrintFormat("Number of positions has been changed. Previous value is %d, current value is %d", positions,curr_positions); /* other actions connected with change of positions */ //--- update value positions=curr_positions; } //--- changes in the number of deals in the trade history cache if(curr_deals!=deals) { //--- number of deals in the trade history cache has been changed PrintFormat("Number of deals has been changed. Previous value is %d, current value is %d", deals,curr_deals); /* other actions connected with change of deals */ //--- update value deals=curr_deals; } //--- changes in the number of history orders in the trade history cache if(curr_history_orders!=history_orders) { //--- number of history orders in the trade history cache has been changed PrintFormat("Number of orders in the history has been changed. Previous value is %d, current value is %d", history_orders,curr_history_orders); /* other actions connected with change of the number of orders in the trade history cache */ //--- update value history_orders=curr_history_orders; } //--- checking if it is necessary to change the limits of th trade history to be requested in cache CheckStartDateInTradeHistory(); } //+------------------------------------------------------------------+ //| changing the start date for requesting of the trade history | //+------------------------------------------------------------------+ void CheckStartDateInTradeHistory() { //--- initial interval, as if we started working right now datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1); //--- make sure that the start limit of the trade history has not gone //--- more than 1 day over intended date if(curr_start-start>PeriodSeconds(PERIOD_D1)) { //--- we should correct the start date of history to be loaded in the cache start=curr_start; PrintFormat("New start limit of the trade history to be loaded: start => %s", TimeToString(start)); //--- now load the trade history for the corrected period again HistorySelect(start,end); //--- correct the number of deals and orders in the history for further comparison history_orders=HistoryOrdersTotal(); deals=HistoryDealsTotal(); } } //+------------------------------------------------------------------+