positionschangeinformer

Author: Copyright 2013, Rone.
Miscellaneous
It plays sound alertsIt sends emailsIt issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
positionschangeinformer
//+------------------------------------------------------------------+
//|                                                      ForMQL5.mq5 |
//|                                            Copyright 2013, Rone. |
//|                                            rone.sergey@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, Rone."
#property link      "rone.sergey@gmail.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Includes                                                         |
//+------------------------------------------------------------------+
#include <Translator.mqh>
//+------------------------------------------------------------------+
//| Enums                                                            |
//+------------------------------------------------------------------+
enum ENUM_ALERT_TYPE {
   ALERT,         // Alert
   SOUND,         // Sound
   EMAIL          // e-mail
};
//+------------------------------------------------------------------+
//| Input parameters                                                 |
//+------------------------------------------------------------------+
input ENUM_ALERT_TYPE   InpAlertType = ALERT;         // Alert type
input string            InpSoundName = "alert.wav";   // Sound filename
input ENUM_LANGUAGES    InpToLanguage = RU;           // Language
//+------------------------------------------------------------------+
//| Global variables                                                 |
//+------------------------------------------------------------------+
string            fileName;
ENUM_ALERT_TYPE   alertType;
CTranslator       toLang;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
//---
   toLang.init(MQL5InfoString(MQL5_PROGRAM_NAME), InpToLanguage);
//---
   if ( InpAlertType == EMAIL ) {
      if ( !(bool)TerminalInfoInteger(TERMINAL_EMAIL_ENABLED) ) {
         alertType = ALERT;
         Print(toLang.tr("Email is not enabled. EA will use alerts"));
      }
   } else {
      alertType = InpAlertType;
   }
//---
   if ( alertType == SOUND && FileIsExist(InpSoundName, 0) == false ) {
      fileName = "alert.wav";
      Print(InpSoundName, ": ", toLang.tr("file does not exist"), ". ", toLang.tr("EA will use"), " ", fileName);
   } else {
      fileName = "\\Files\\" + InpSoundName;
   }   
//---
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---

//---   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
//---

//---   
}
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
//---
   CheckPositionsChange(trans);   
//---   
}
//+------------------------------------------------------------------+
//| Check positions changs function                                  |
//+------------------------------------------------------------------+
void CheckPositionsChange(const MqlTradeTransaction &trans) {
//---
   if ( (ENUM_TRADE_TRANSACTION_TYPE)trans.type == TRADE_TRANSACTION_DEAL_ADD ) {
      datetime end = TimeCurrent();
      datetime start = end - end % PeriodSeconds(PERIOD_D1);
      
      ResetLastError();
      if ( !HistorySelect(start, end) ) {
         Print(toLang.tr("Getting deals history failed"), ". ", toLang.tr("Error"), " #", GetLastError());
         return;
      }
      
      ulong ticket = HistoryDealGetTicket(HistoryDealsTotal()-1);
      
      if ( ticket == trans.deal ) {
         string type, comm;
         string msg = trans.symbol + ": ";
         double result;
         
         switch ( trans.deal_type ) {
            case DEAL_TYPE_BUY:
               type = toLang.tr("buy");
               break;
            case DEAL_TYPE_SELL:
               type = toLang.tr("sell");
               break;
            default:
               Print(msg, toLang.tr("Other operation"));
               return;
         }
         
         switch ( (int)HistoryDealGetInteger(ticket, DEAL_ENTRY) ) {
            case DEAL_ENTRY_IN:
                  msg += type + " " + toLang.tr("Opened at") + " " + getDealPrices(trans);
               break;
               
            case DEAL_ENTRY_OUT:
                  result = HistoryDealGetDouble(ticket, DEAL_PROFIT);
                  comm = HistoryDealGetString(ticket, DEAL_COMMENT);
                  if ( StringFind(comm, "sl") != -1 ) {
                     msg += toLang.tr("closed by Stop Loss at");
                  } else if ( StringFind(comm, "tp") != -1 ) {
                     msg += toLang.tr("closed by Take Profit at");
                  } else {
                     msg += toLang.tr("closed at");
                  }
                  msg += " " + DoubleToString(trans.price, _Digits) + ". " + 
                     toLang.tr("Result") + ": " + DoubleToString(result, 2) +
                     " " + AccountInfoString(ACCOUNT_CURRENCY);
               break;
               
            case DEAL_ENTRY_INOUT:
                  msg += " " + toLang.tr("reverse") + "-" + type + " " + getDealPrices(trans);
               break;
               
            default:
               Print(msg, "Other operation");
               return;
         }
         RaiseAlert(msg);
      }
   }
//---
}
//+------------------------------------------------------------------+
//| Get deal prices function                                         |
//+------------------------------------------------------------------+
string getDealPrices(const MqlTradeTransaction &trans) {
//---
   string str = DoubleToString(trans.price, _Digits) +
      ". " + toLang.tr("Stop Loss") + ": " + DoubleToString(trans.price_sl, _Digits) +
      ". " + toLang.tr("Take Profit") + ": " + DoubleToString(trans.price_tp, _Digits) +
      ". " + toLang.tr("Volume") + ": " + DoubleToString(trans.volume, 2);
//---
   return(str);
}
//+------------------------------------------------------------------+
//| Raise alert function                                             |
//+------------------------------------------------------------------+
void RaiseAlert(string msg) {
//---
   switch ( alertType ) {
      case SOUND:
         PlaySound(fileName);
         Print(msg);
         break;
      case EMAIL:
         if ( !SendMail(MQL5InfoString(MQL5_PROGRAM_NAME), msg) ) {
            Print(toLang.tr("Sending email failed"), ". ",  toLang.tr("Error"), " #", GetLastError());
         }
         break;
      case ALERT:
      default:
         Alert(msg);
   }
//---
}
//+------------------------------------------------------------------+

Comments