#property copyright "Copyright © 2009, David E. Fulton" #property link "http://www.defulton.com/forex" //************************************************************** extern string version="AccountSentry_v2.09(Profit Target)"; //* extern string Copyright="Copyright © 2009, David E. Fulton"; //* extern string ContactMe="david@defulton.com"; //* extern string BuildDate="-- 6 March 2009 --"; //* //************************************************************** double BeginningAccountEquity; double MaximumLossThisRun; double AccountMarginLevel = 0.0; double AccountCurrentBalance; bool ContinueOpening=true; string EBA; string EBSE; string UPT; string Status=""; int nTickCount; bool YesStop; extern string spacer1 = ""; extern string AS = "--ACCOUNTSENTRY SETTINGS--"; //extern double InitialDeposit; extern double EquityProtectionPercent = 70; extern bool UseProfitTarget=true; extern double ProfitTarget=30; extern double LossMitigation=-300; 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); BeginningAccountEquity = AccountEquity(); MaximumLossThisRun = 0.0; Status = "RUNNING"; return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (GlobalVariableGet("GV_CloseAllAndHalt") > 0) { ContinueOpening=false; return (0); } else nTickCount++; if (AccountProfit() <= MaximumLossThisRun) { MaximumLossThisRun = AccountProfit(); } 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); } // Check profit target if ((AccountEquity() - BeginningAccountEquity) >= ProfitTarget) { // if (UseProfitTarget && AccountEquity() - AccountProfit() >= ProfitTarget) { GlobalVariableSet("GV_CloseAllAndHalt",1.0); CloseAll(); Alert("Profit target reached!"); SendMail("Profit target reached!", "Terminal has been HALTED"); Status="HALTED Profit target reached"; DisplayComments(); return(0); } // Check loss mitigation if (MaximumLossThisRun < LossMitigation) { GlobalVariableSet("GV_CloseAllAndHalt",1.0); CloseAll(); Alert("Loss mitagation reached!"); SendMail("Loss mitagation reached!", "Terminal has been HALTED"); Status="HALTED Loss mitagation reached"; DisplayComments(); return(0); } 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"; } if (UseProfitTarget) { UPT = "True"; } else { UPT = "false"; } DisplayComments(); } return(0); } void DisplayComments() { Comment(version, "\n", "\nTick Count=",nTickCount, "\nBroker=",AccountCompany(), "\nCurrent Server Time=",TimeToStr(TimeCurrent(), TIME_SECONDS), "\nCurrent Terminal Status=",Status, // "\nInitial Deposit=",InitialDeposit, "\nAccount Leverage=1:",AccountLeverage(), "\n", // "\nBeginning Account Balance=",GlobalVariableGet("GV_AccountBeginningBalance"), "\nCurrent Account Balance=",GlobalVariableGet("GV_AccountCurrentBalance"), "\nTrailing Equity Stop Loss=",GlobalVariableGet("GV_TrailingEquityProtection"), "\n", "\nCurrent AccountEquity=",AccountEquity(), "\nCurrent AccountMargin=",AccountMargin(), "\nCurrent Account Margin Level=",MathRound(AccountMarginLevel),"%", "\nCurrent Open Orders=",OrdersTotal(), "\n", "\nMinumum Equity Level=",GlobalVariableGet("GV_MinEquityLevel"), "\nMaximum Floating Profit=",GlobalVariableGet("GV_MaxFloatingProfit"), "\nMaximum Floating Loss=",GlobalVariableGet("GV_MaxFloatingLoss"), "\nMaximum Account Margin=",GlobalVariableGet("GV_MaxAccountMargin"), "\nMinimum Margin Level=",MathRound(GlobalVariableGet("GV_MinMarginLevel")),"%", "\nMaximum Open Orders=",GlobalVariableGet("GV_MaxOpenOrders"), "\n", "\nEquity Protection = ",EquityProtectionPercent,"%", "\nUse Profit Target = ",UPT, "\nBiginning Equity = ",BeginningAccountEquity, "\nProfit Target = ",ProfitTarget, "\nP/L = ",AccountEquity() - BeginningAccountEquity, "\nLoss Mitigation = ",LossMitigation, "\nMaximum Loss This Run = ",MaximumLossThisRun); // "\n", // "\nEquity Breach Alert=",EBA, // "\nEquity 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); } //+------------------------------------------------------------------+