#property copyright "Copyright © 2009, David E. Fulton" #property link "http://www.defulton.com/forex" //************************************************************** extern string version="AccountSentry_v2.08e"; //* extern string Copyright="Copyright © 2009, David E. Fulton"; //* extern string ContactMe="david@defulton.com"; //* extern string BuildDate="-- 4 March 2009 --"; //* //************************************************************** double AccountMarginLevel = 0.0; double AccountCurrentBalance; bool ContinueOpening=true; string EBA; string EBSE; string Status=""; int nTickCount; bool YesStop; extern string spacer1 = ""; extern string AS = "--ACCOUNTSENTRY SETTINGS--"; extern double InitialDeposit; extern double EquityProtectionPercent = 50; extern bool EquityBreachAlert = true; extern bool EquityBreachSendEmail = true; int deinit() { return(0); } int init() { GlobalVariableSet("GV_AccountBeginningBalance",AccountBalance()); GlobalVariableSet("GV_AccountCurrentBalance",AccountBalance()); GlobalVariableSet("GV_AccountEquityProtection",((EquityProtectionPercent/100)*AccountBalance())); GlobalVariableSet("GV_TrailingEquityProtection",GlobalVariableGet("GV_AccountEquityProtection")); GlobalVariableSet("GV_CloseAllAndHalt",0.0); GlobalVariableSet("GV_InitialDeposit",InitialDeposit); if (!GlobalVariableCheck("GV_InitialDeposit")) GlobalVariableSet("GV_InitialDeposit",0.0); if (!GlobalVariableCheck("GV_MarginLevel")) GlobalVariableSet("GV_MarginLevel",0.0); if (!GlobalVariableCheck("GV_MaxAccountMargin")) GlobalVariableSet("GV_MaxAccountMargin",0.0); if (!GlobalVariableCheck("GV_MaxFloatingLoss")) GlobalVariableSet("GV_MaxFloatingLoss",0.0); if (!GlobalVariableCheck("GV_MaxFloatingProfit")) GlobalVariableSet("GV_MaxFloatingProfit",0.0); if (!GlobalVariableCheck("GV_MaxOpenOrders")) GlobalVariableSet("GV_MaxOpenOrders",0.0); if (!GlobalVariableCheck("GV_MinMarginLevel")) GlobalVariableSet("GV_MinMarginLevel",0.0); if (!GlobalVariableCheck("GV_MinEquityLevel")) GlobalVariableSet("GV_MinEquityLevel",0.0); return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { nTickCount++; GlobalVariableSet("GV_AccountCurrentBalance",AccountBalance()); // InitialDeposit=GlobalVariableGet("GV_InitialDeposit"); // Account equity protection if (AccountEquity() <= GlobalVariableGet("GV_TrailingEquityProtection")) { GlobalVariableSet("GV_CloseAllAndHalt",1.0); CloseAll(); if (Status == "RUNNING") { Alert("Equity Protection Breached!"); SendMail("Equity Level Breached", "Terminal has been HALTED"); } Status="HALTED"; DisplayComments(); return(0); } else { GlobalVariableSet("GV_CloseAllAndHalt",0.0); ContinueOpening=true; } if (GlobalVariableGet("GV_AccountCurrentBalance") > GlobalVariableGet("GV_AccountBeginningBalance")) { GlobalVariableSet("GV_TrailingEquityProtection",GlobalVariableGet("GV_AccountEquityProtection") + GlobalVariableGet("GV_AccountCurrentBalance") - GlobalVariableGet("GV_AccountBeginningBalance")); } else { GlobalVariableSet("GV_AccountCurrentBalance",AccountBalance()); GlobalVariableSet("GV_TrailingEquityProtection",GlobalVariableGet("GV_AccountEquityProtection")); } if (AccountMargin() > 0) { // eleminate zero divide error AccountMarginLevel = AccountEquity() / AccountMargin() * 100; } if (GlobalVariableGet("GV_MinMarginLevel") == 0) { GlobalVariableSet("GV_MinMarginLevel",AccountMarginLevel); } if (AccountMarginLevel < GlobalVariableGet("GV_MinMarginLevel")) { GlobalVariableSet("GV_MinMarginLevel",AccountMarginLevel); //update minimum margin level } if (AccountMargin() > GlobalVariableGet("GV_MaxAccountMargin")) { GlobalVariableSet("GV_MaxAccountMargin",AccountMargin()); //update GV_MaxAccountMargin } if (AccountProfit() > GlobalVariableGet("GV_MaxFloatingProfit")) { GlobalVariableSet("GV_MaxFloatingProfit",AccountProfit()); } if (GlobalVariableGet("GV_MinEquityLevel") == 0) { GlobalVariableSet("GV_MinEquityLevel",AccountEquity()); } else { if (AccountEquity() < GlobalVariableGet("GV_MinEquityLevel")) GlobalVariableSet("GV_MinEquityLevel",AccountEquity()); } if (AccountProfit() < GlobalVariableGet("GV_MaxFloatingLoss")) { GlobalVariableSet("GV_MaxFloatingLoss",AccountProfit()); } if (OrdersTotal() > GlobalVariableGet("GV_MaxOpenOrders")) { GlobalVariableSet("GV_MaxOpenOrders",OrdersTotal()); //update GV_MaxOpenOrders } if (ContinueOpening>0) { Status="RUNNING"; } else { Status="HALTED"; } if (!IsTesting()) { if (EquityBreachAlert) { EBA = "True"; } else { EBA = "False"; } if (EquityBreachSendEmail) { EBSE="True"; } else { EBSE="False"; } DisplayComments(); } return(0); } void DisplayComments() { Comment(version, "\n", "\n Tick Count=",nTickCount, "\n Broker=",AccountCompany(), "\n Current Server Time=",TimeToStr(TimeCurrent(), TIME_SECONDS), "\n Current Terminal Status=",Status, "\n Initial Deposit=",InitialDeposit, "\n Account Leverage=1:",AccountLeverage(), "\n", // "\nBeginning Account Balance=",GlobalVariableGet("GV_AccountBeginningBalance"), "\n Current Account Balance=",GlobalVariableGet("GV_AccountCurrentBalance"), "\n Current Account Equity=",AccountEquity(), "\n Trailing Equity Stop Loss=",GlobalVariableGet("GV_TrailingEquityProtection"), "\n Current Usuable Equity=",(AccountEquity() - GlobalVariableGet("GV_TrailingEquityProtection")), "\n Current Floating Loss=",AccountProfit(), "\n", "\n Current AccountEquity=",AccountEquity(), "\n Current AccountMargin=",AccountMargin(), "\n Current Account Margin Level=",MathRound(AccountMarginLevel),"%", "\n Current Open Orders=",OrdersTotal(), "\n", "\n Minumum Equity Level=",GlobalVariableGet("GV_MinEquityLevel"), "\n Maximum Floating Profit=",GlobalVariableGet("GV_MaxFloatingProfit"), "\n Maximum Floating Loss=",GlobalVariableGet("GV_MaxFloatingLoss"), "\n Maximum Account Margin=",GlobalVariableGet("GV_MaxAccountMargin"), "\n Minimum Margin Level=",MathRound(GlobalVariableGet("GV_MinMarginLevel")),"%", "\n Maximum Open Orders=",GlobalVariableGet("GV_MaxOpenOrders"), "\n", "\n Equity Protection=",EquityProtectionPercent,"%", "\n Equity Breach Alert=",EBA, "\n Equity Breach Send eMail/SMS=",EBSE); } //+------------------------------------------------------------------+ //| Close all orders | //+------------------------------------------------------------------+ void CloseAll() { for (int i=0;i<5;i++) { int total_trades=OrdersTotal(); for (int j=0;j=OP_BUYLIMIT) OrderDelete(order_ticket,CLR_NONE); //close sell orders if (order_type==OP_SELL) OrderClose(order_ticket,order_volume, MarketInfo(order_symbol,MODE_ASK),3,CLR_NONE); //close buy orders if (order_type==OP_BUY) OrderClose(order_ticket,order_volume, MarketInfo(order_symbol,MODE_BID),3,CLR_NONE); } } } total_trades=OrdersTotal(); return(0); } //+------------------------------------------------------------------+