//+------------------------------------------------------------------+
//| OnTrade_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
input int days=7; // profondeur de l'historique de trading en jours
//--- définit les limites de l'historique de trading au niveau global
datetime start; // date de début de l'historique de trading dans le cache
datetime end; // date de fin de l'historique de trading dans le cache
//--- compteurs globaux
int orders; // nombre d'ordres actifs
int positions; // nombre de positions ouvertes
int deals; // nombre de transactions dans le cache de l'historique des trades
int history_orders; // nombre d'ordres dans le cache de l'historique de trading
bool started=false; // flag de pertinence du compteur
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int OnInit()
{
//---
end=TimeCurrent();
start=end-days*PeriodSeconds(PERIOD_D1);
PrintFormat("Limites du chargement de l'historique à charger : début - %s, fin - %s",
TimeToString(start),TimeToString(end));
InitCounters();
//---
retourne(0);
}
//+------------------------------------------------------------------+
//| initialisation de la position, de l'ordre et du compteur |
//+------------------------------------------------------------------+
void InitCounters()
{
ResetLastError();
//--- chargement de l'historique
bool selected=HistorySelect(start,end);
if(!selected)
{
PrintFormat("%s. Echec du chargement de l'historique de %s à %s vers le cache. Code d'erreur : %d",
__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
return;
}
//--- récupère la valeur courante
orders=OrdersTotal();
positions=PositionsTotal();
deals=HistoryDealsTotal();
history_orders=HistoryOrdersTotal();
started=true;
Print("Les compteurs des ordres, des positions et des transactions ont été initialisés avec succès");
}
//+------------------------------------------------------------------+
//| Fonction de tick de l'Expert |
//+------------------------------------------------------------------+
void OnTick()
{
if(started) SimpleTradeProcessor();
else InitCounters();
}
//+------------------------------------------------------------------+
//| appelé lorsqu'un évènement Trade arrive |
//+------------------------------------------------------------------+
void OnTrade()
{
if(started) SimpleTradeProcessor();
else InitCounters();
}
//+------------------------------------------------------------------+
//| ex de traitement des changements dans le trade et l'historique |
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
{
end=TimeCurrent();
ResetLastError();
//--- téléchargement de l'historique de trading dans l'intervalle spécifié dans le cache du programme
bool selected=HistorySelect(start,end);
if(!selected)
{
PrintFormat("%s. Echec du chargement de l'historique de %s à %s vers le cache. Code d'erreur : %d",
__FUNCTION__,TimeToString(start),TimeToString(end),GetLastError());
return;
}
//--- récupère les valeurs courantes
int curr_orders=OrdersTotal();
int curr_positions=PositionsTotal();
int curr_deals=HistoryDealsTotal();
int curr_history_orders=HistoryOrdersTotal();
//--- vérifie si le nombre d'ordres actifs a été changé
if(curr_orders!=orders)
{
//--- le nombre d'ordres actifs a changé
PrintFormat("Le nombre d'ordres a changé. La valeur précédente était %d, la valeur actuelle est %d",
orders,curr_orders);
//--- mets à jour la valeur
orders=curr_orders;
}
//--- changements du nombre de positions ouvertes
if(curr_positions!=positions)
{
//--- le nombre de positions ouvertes a changé
PrintFormat("Le nombre de positions a changé. La valeur précédente était %d, la valeur actuelle est %d",
positions,curr_positions);
//--- mets à jour la valeur
positions=curr_positions;
}
//--- changements du nombre de transactions dans le cache de l'historique des trades
if(curr_deals!=deals)
{
//--- le nombre de transactions dans le cache de l'historique de trading a changé
PrintFormat("Le nombre de transactions a changé. La valeur précédente était %d, la valeur actuelle est %d",
deals,curr_deals);
//--- mets à jour la valeur
deals=curr_deals;
}
//--- changements dans le nombre d'ordres dans le cache de l'historique
if(curr_history_orders!=history_orders)
{
//--- le nombre d'ordres dans le cache de l'historique a été changé
PrintFormat("Le nombre d'ordres dans l'historique a été changé. La valeur précédente était %d, la valeur actuelle est %d",
history_orders,curr_history_orders);
//--- mets à jour la valeur
history_orders=curr_history_orders;
}
//--- vérification s'il est nécessaire de changer les limites de l'historique de trades à demander dans le cache
CheckStartDateInTradeHistory();
}
//+------------------------------------------------------------------+
//| changement de la date de début pour demander l'historique |
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
{
//--- intervalle initial, si nous commencions dès maintenant
datetime curr_start=TimeCurrent()-days*PeriodSeconds(PERIOD_D1);
//--- on s'assure que la limite de début de l'historique de trading n'a pas disparu
//--- plus d'un jour par rapport à la date prévue
if(curr_start-start>PeriodSeconds(PERIOD_D1))
{
//--- corrige la date de début de l'historique à charger dans le cache
start=curr_start;
PrintFormat("Nouvelle limite de début de l'historique à charger : début => %s",
TimeToString(start));
//--- recharge maintenant l'historique de trading pour l'intervalle mis à jour
HistorySelect(start,end);
//--- corrige les compteurs de transactions et d'ordres dans l'historique pour les comparaisons futures
history_orders=HistoryOrdersTotal();
deals=HistoryDealsTotal();
}
}
//+------------------------------------------------------------------+
/* Exemple de sortie :
Limites du chargement de l'historique à charger : début - 2018.07.16 18:11, fin - 2018.07.23 18:11
Les compteurs des ordres, des positions et des transactions ont été initialisés avec succès
Le nombre d'ordres dans l'historique a été changé. Valeur précédente 0, valeur actuelle 1
Le nombre d'ordres dans l'historique a été changé. Valeur précédente 1, valeur actuelle 0
Le nombre de positions dans l'historique a été changé. Valeur précédente 0, valeur actuelle 1
Le nombre de transactions a changé. Valeur précédente 0, valeur actuelle 1
Le nombre d'ordres dans l'historique a été changé. Valeur précédente 0, valeur actuelle 1
*/
|