csv_margin_tracker

Download script
csv_margin_tracker

This script is designed to act as an automated monitoring tool for your trading account, specifically focusing on tracking your financial health by recording margin and balance data into a file and sending notifications when risk thresholds are exceeded.

Core Functionality

1. Automated Data Logging The script systematically monitors your account's performance at regular intervals (customizable by the user). Every time a specific amount of time passes, it captures a snapshot of your current trading status, including:

  • The current date and time.
  • Your account balance.
  • Your account equity.
  • Your current margin usage.

This information is automatically saved into a CSV file named specifically for your account number. Because this happens on a set schedule, it creates a historical record that you can review later to analyze how your margin fluctuated over time.

2. Real-Time Margin Monitoring & Alerts Beyond just recording data, the script acts as a "watchdog" for your risk management. It continuously calculates your margin relative to your equity. You can set specific percentage thresholds (for example, 60% or 80%) that define high-risk zones.

If your margin usage exceeds these pre-set levels, the script is programmed to send an email alert directly to you. To prevent your inbox from being flooded with messages during a volatile market period, the script includes a "cool-down" logic; it will only send one alert per specified time window (e.g., once every 6 hours), ensuring you are notified of the danger without receiving constant spam.

3. Initial Account Overview When you first run the script, it provides a summary in the terminal window. It identifies your account number and automatically calculates your "Stopout" point—the critical level at which the broker will begin closing your positions. This helps you understand exactly how much "breathing room" your account has before hitting a critical limit.

Summary of Benefits

  • Transparency: Maintains a clean, organized history of your account’s margin and equity in a spreadsheet-ready format.
  • Proactive Risk Management: Provides immediate email notifications if your account reaches risky levels, allowing for faster intervention.
  • Smart Notifications: Includes built-in timers to ensure alerts are meaningful and organized rather than repetitive.
Miscellaneous
Uses files from the file systemIt writes information to fileIt issuies visual alerts to the screenIt sends emails
12 Views
0 Downloads
0 Favorites
csv_margin_tracker
//+------------------------------------------------------------------+
//|                                           csv_margin_tracker.mq4 |
//|                                                 Copyright © 2013 |
//|                                               r.michelsen@gmx.de |
//+------------------------------------------------------------------+






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/(AccountStopoutLevel()*0.01), "% of Equity");
   else Print("stopout for account ", AccountNumber()," will be triggered at: ", AccountStopoutLevel(), " ", AccountCurrency());
  }

Comments