[MT4-EA]csv_margin_tracker
//+------------------------------------------------------------------+
//| csv_margin_tracker.mq4 |
//| Copyright ? 2013 |
//| [email protected] |
//+------------------------------------------------------------------+
extern int IntervalSeconds = 900;
extern bool MailAlert = false;
extern int MailAlertIntervalSeconds = 21600;
extern double MailAlertMarginLevel1 = 0.6; // Margin as percentage of Equity
extern double MailAlertMarginLevel2 = 0.8; // Margin as percentage of Equity
int Handle;
int Qnt_Symb;
int i;
datetime CurrentIntervalStart;
datetime CurrentMailAlertIntervalStart[2];
datetime CurrentTime;
string DataString[3];
double DataDouble[3];
double MailAlertMarginLevel[2];
int init()
{
OpenFile();
WelcomeMessage();
MailAlertMarginLevel[1] = MailAlertMarginLevel1;
MailAlertMarginLevel[2] = MailAlertMarginLevel2;
CurrentTime = TimeCurrent();
SetNewInterval();
SetNewMailAlertInterval(1);
SetNewMailAlertInterval(2);
}
int start()
{
CurrentTime = TimeCurrent();
UpdateData();
if (IntervalEndCheck())
{
WriteData();
SetNewInterval();
}
for(i=1;i<=2;i++)
{
if (MailAlertCheck(i))
{
SendMailAlert(i);
SetNewMailAlertInterval(i);
}
}
}
int deinit()
{
FileClose(Handle);
}
void OpenFile() // opens file
{
Handle=FileOpen("margintracker_"+AccountNumber()+".csv",FILE_CSV|FILE_READ|FILE_WRITE,';');
if(Handle<1) Alert ("File error: ",GetLastError());
}
bool IntervalEndCheck() // checks if the end of the interval is reached
{
if(CurrentTime - CurrentIntervalStart >= IntervalSeconds) return(true);
return(false);
}
void WriteData() // writes data to file
{
Qnt_Symb=FileWrite(Handle,DataString[0],DataString[1],DataString[2],DataDouble[0],DataDouble[1],DataDouble[2]);
if(Qnt_Symb < 0)
{
Alert("Error writing to the file",GetLastError());
FileClose(Handle);
}
FileFlush(Handle);
}
void SetNewInterval() // clears data from memory and sets start of new time interval
{
DataDouble[0] = 1000000000;
DataDouble[1] = 1000000000;
DataDouble[2] = 0;
CurrentIntervalStart = CurrentTime - (CurrentTime % IntervalSeconds);
}
void UpdateData() // updates data in memory
{
DataString[0] = CurrentTime;
DataString[1] = TimeToStr(CurrentTime,TIME_DATE);
DataString[2] = TimeToStr(CurrentTime,TIME_MINUTES);
if(AccountBalance() < DataDouble[0]) DataDouble[0] = AccountBalance();
if(AccountEquity() < DataDouble[1]) DataDouble[1] = AccountEquity();
if(AccountMargin() > DataDouble[2]) DataDouble[2] = AccountMargin();
}
bool MailAlertCheck(int x) // checks for conditions to send mail alert
{
if(MailAlert == true && AccountMargin() / AccountEquity() >= MailAlertMarginLevel[x] && CurrentTime - CurrentMailAlertIntervalStart[x] >= MailAlertIntervalSeconds) return(true);
return(false);
}
void SendMailAlert(int x) // sends mail alert
{
SendMail("Account "+AccountNumber()+" Margin reached "+MailAlertMarginLevel[x]*100+" %", "Balance: "+AccountBalance()+". Equity: "+AccountEquity()+". Margin: "+AccountMargin()+".");
}
void SetNewMailAlertInterval(int x) // sets start of new time interval for mail alert
{
CurrentMailAlertIntervalStart[x] = CurrentTime;
}
void WelcomeMessage() // displays welcome message
{
Print("tracking Margins for account ", AccountNumber());
if(AccountStopoutMode() == 0) Print("stopout for account ", AccountNumber()," will be triggered at Margin level < ", AccountStopoutLevel(), "%, i.e. when Margin reaches ", 100/(AccountStopou