Final EA modified

Price Data Components
Series array that contains close prices for each barSeries array that contains open time of each bar
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It automatically opens orders when conditions are reached
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites

Profitability Reports

GBP/USD Oct 2024 - Jan 2025
3.00 %
Total Trades 171
Won Trades 57
Lost trades 114
Win Rate 0.33 %
Expected payoff -23.61
Gross Profit 104.60
Gross Loss -4142.26
Total Net Profit -4037.66
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
9.00 %
Total Trades 352
Won Trades 133
Lost trades 219
Win Rate 0.38 %
Expected payoff -21.06
Gross Profit 742.62
Gross Loss -8156.68
Total Net Profit -7414.06
-100%
-50%
0%
50%
100%
Final EA modified
//+--------------------------------------------------+
//|Final EA
//+--------------------------------------------------+


#property link      " "
#include  <stdlib.mqh>
#define   NL    "\n"

// Regular Variables
extern double Lots          =  0.01;      
extern double Increment     =  0.01;
extern int    BasketLoss=2000;        // if equity reaches this negative level, close trades
extern int    Orders        =  1;    
extern int    PipTarget     =  20;
extern int    Step          =  1;
extern int    Spacing       =  4;
extern double CloseDelay    =  5;
extern bool   CloseBuys     =  false;  
extern bool   CloseSells    =  false;  
extern bool   CloseBuysInProfit     =  false;  
extern bool   CloseSellsInProfit    =  false;  
extern bool   EndTrading    =  false;  
extern bool   Boost         =  true;
extern bool TimeFilter=false; //time filter
extern int StartHour=8;
extern int EndHour=21;
extern bool CloseFriday=false; //the orders are closed before the week end
extern double CloseFridayHour=22; //friday end hour
extern bool OpenMonday=false; //the orders are open only after this time
extern double OpenMondayHour=2; //friday end hour

// ixternal settings
int      Slippage      = 0;                   
int      MagicNumber   = 12345;     
string   TradeComment  = "Final EA";   
datetime bartime       = 0;                    
bool     TradeAllowed  = true;             
double   BoostTrack    = 0;        
double minEquity;        

//+-------------+
//| Custom init |
//|-------------+
int init()
  {

  }

//+----------------+
//| Custom DE-init |
//+----------------+

int deinit()
  {

  }
    
//+------------------------------------------------------------------------+
//| cancels all pending orders and closes open positions                   |
//+------------------------------------------------------------------------+
void CloseAllThisSymbolBuy()
{
  double LastBuyTime;

   for(int i = OrdersTotal()-1; i >=0; i--)
       {
       OrderSelect(i, SELECT_BY_POS);
       bool result = false;
       if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY)  
         {
           if (OrderOpenTime()>LastBuyTime) LastBuyTime=OrderOpenTime();
           if (TimeCurrent()-LastBuyTime >= CloseDelay) result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, Red );
         }
       }
     
  return; 
}
   
//+-----------------------------------------------------+
//| Closes all Sells this symbol only                   
//+-----------------------------------------------------+
void CloseAllThisSymbolSell()
{
  double LastSellTime;

   for(int i = OrdersTotal()-1; i >=0; i--)
      {
      OrderSelect(i, SELECT_BY_POS);
      bool result = false;
      if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL) 
       {
         if (OrderOpenTime()>LastSellTime) LastSellTime=OrderOpenTime();
         if (TimeCurrent()-LastSellTime >= CloseDelay) result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, Red );
       }
     }
 
  return; 
}

//+----------------------------------------------+
//| Closes all Buys in Profit                   
//+----------------------------------------------+
void CloseBuysinProfit()
{
  double OrdersBUY, BuyProfit, LastBuyTime;
 
   for(int i = OrdersTotal()-1; i >=0; i--)
       {
       OrderSelect(i, SELECT_BY_POS);
       bool result = false;
       if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY)  
         {
           BuyProfit = OrderProfit() + OrderSwap() + OrderCommission();
           if (OrderOpenTime()>LastBuyTime) LastBuyTime=OrderOpenTime();
           if (TimeCurrent()-LastBuyTime >= CloseDelay && (OrderProfit()+OrderSwap()+OrderCommission())>0)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
         }
       }
  return; 
}
   
//+-----------------------------------------------+
//| Closes all Sells in Profit                   
//+-----------------------------------------------+
void CloseSellsinProfit()
{
  double OrdersSELL, SellProfit, LastSellTime;
 
   for(int i = OrdersTotal()-1; i >=0; i--)
      {
      OrderSelect(i, SELECT_BY_POS);
      bool result = false;
      if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL)  
       {
         SellProfit = OrderProfit() + OrderSwap() + OrderCommission();
         if (OrderOpenTime()>LastSellTime) LastSellTime=OrderOpenTime();
         if (TimeCurrent()-LastSellTime >= CloseDelay && (OrderProfit()+OrderSwap()+OrderCommission())>0) result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);
       }
     }
 
  return; 
}
      

//+------------------------------------------------------------------+
//| Check for BUY order conditions                                   |
//+------------------------------------------------------------------+
void CheckForBuy()
  {
   double   BuyOrders, LowestBuy=1000;
   int      cnt=0;
   int      gle=0;
   
   if(bartime!=Time[0]) 
     {
      bartime=Time[0];
      BoostTrack=0;
      TradeAllowed=true;
     }
     
   for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if( OrderSymbol()==Symbol() && OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber)
        {
            if (OrderOpenPrice()<LowestBuy) LowestBuy=OrderOpenPrice();
            BuyOrders++;
        }
     }
     
   if(TradeAllowed && Ask < LowestBuy-(Spacing*Point))
     {
        for(int i=1;i<Orders+1;i++) {
        OrderSend(Symbol(),OP_BUY,Lots+(BuyOrders*Increment),Ask,Slippage,0,0,TradeComment,MagicNumber,Blue);
           }
         gle=GetLastError();
         if(gle==0)
           {
            BoostTrack=Close[0];
            TradeAllowed=false;
           }
       }
   }
    
//+------------------------------------------------------------------+
//| Check for SELL order conditions                                   |
//+------------------------------------------------------------------+
void CheckForSell()
  {
   double   SellOrders, HighestSell;
   int      cnt=0;
   int      gle=0;
      
   if(bartime!=Time[0]) 
     {
      bartime=Time[0];
      BoostTrack=0;
      TradeAllowed=true;
     }
     
   for(cnt=OrdersTotal();cnt>=0;cnt--)
     {
     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if( OrderSymbol()==Symbol() && OrderType() == OP_SELL && OrderMagicNumber()==MagicNumber)
        {
            if (OrderOpenPrice()>HighestSell) HighestSell=OrderOpenPrice();
            SellOrders++;
        }
     } 
    
   if(TradeAllowed && Bid > HighestSell+(Spacing*Point))
     {
        for(int i=1;i<Orders+1;i++) {
        OrderSend(Symbol(),OP_SELL,Lots+(SellOrders*Increment),Bid,Slippage,0,0,TradeComment,MagicNumber,Red);
           }
         gle=GetLastError();
         if(gle==0)
           {
           BoostTrack=Close[0];
           TradeAllowed=false;
           }
       }
   }

//+-----------+
//| Main      |
//+-----------+
int start()
  {
  
/*   if (Period() == 1)
      {
         Alert("5 Minute Chart or higher...");
         return;
      }
*/   
// Regular count
 
   double CurrentBasket=0;
   
   CurrentBasket=AccountEquity()-AccountBalance();
   if(CurrentBasket<minEquity) minEquity=CurrentBasket;
   
   double   i, Profit, OrdersSELL, OrdersBUY, BuyPips, SellPips;
   double   HighestSell, LowestBuy=1000, BuyLots, SellLots, BuyProfit, SellProfit, BuyProfitTarget, SellProfitTarget;
   double   LowestBuyTicket, LowestBuyProfit, HighestSellTicket, HighestSellProfit;
   double   CurrentTime = (TimeHour(CurTime()+TimeMinute(CurTime())));
   bool     SELLme=false;
   bool     BUYme=false;
  
   string CLFR="false";
   string OPMO="false";
   string TIFI="false";
   if(CloseFriday==true&&DayOfWeek()==5&&Hour()>=CloseFridayHour){CLFR="true";}
   if(OpenMonday==true&&((DayOfWeek()==7)||(DayOfWeek()==1&&Hour()<=OpenMondayHour))){OPMO="true";}
   if(TimeFilter){if(!(Hour()>=StartHour && Hour()<=EndHour)){TIFI="true";}}

   string CUBA="false";
   if(CurrentBasket<=(BasketLoss*(-1))){CUBA="true";}
   
   for(i = 0; i < OrdersTotal(); i++)
     {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
       if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
        {
           Profit = OrderProfit() + OrderSwap() + OrderCommission();

           if (OrderType()==OP_BUY && OrderOpenPrice() < LowestBuy)
               {
                  LowestBuy = OrderOpenPrice();
                  LowestBuyTicket = OrderTicket();
                  LowestBuyProfit = Profit;
               }

           if (OrderType()==OP_SELL && OrderOpenPrice() > HighestSell)
               {
                  HighestSell = OrderOpenPrice();
                  HighestSellTicket = OrderTicket();
                  HighestSellProfit = Profit;
               }

           if(OrderType()==OP_BUY)  OrdersBUY++;
           if(OrderType()==OP_SELL) OrdersSELL++;
           if(OrderType()==OP_BUY)  BuyLots += OrderLots();
           if(OrderType()==OP_SELL) SellLots += OrderLots();
           if (OrderType() == OP_BUY)  BuyProfit += OrderProfit() + OrderCommission() + OrderSwap();
           if (OrderType() == OP_SELL) SellProfit += OrderProfit() + OrderCommission() + OrderSwap();
        }
     }
   
    BuyPips   = (PipTarget * BuyLots); 
    SellPips  = (PipTarget * SellLots); 
    BuyProfitTarget = BuyPips + (BuyPips * OrdersBUY * 0.1);
    SellProfitTarget = SellPips + (SellPips * OrdersSELL * 0.1);
    
    if(BuyProfit > BuyProfitTarget && HighestSellProfit > 0) CloseAllThisSymbolBuy(); 
    if(SellProfit > SellProfitTarget && LowestBuyProfit > 0) CloseAllThisSymbolSell();
    
//Manual Close Options

    if (CloseBuys||CLFR=="true"||OPMO=="true"||TIFI=="true"||CUBA=="true") CloseAllThisSymbolBuy();
    if (CloseSells||CLFR=="true"||OPMO=="true"||TIFI=="true"||CUBA=="true") CloseAllThisSymbolSell();
    if (CloseBuysInProfit) CloseBuysinProfit();
    if (CloseSellsInProfit) CloseSellsinProfit();
      
// BUY Trade Criteria

    if (Bid<=(Open[0]-(Step*Point)))   
       {
       BUYme=true;  
       if(Boost && BoostTrack>0 && Close[0]<BoostTrack)
         {
         BUYme=true;
         TradeAllowed=true;
         }
      }
    if (CUBA=="true")return(0);
    if (EndTrading == true && OrdersBUY == 0) BUYme = false;
    if (BUYme == true && CLFR=="false" && OPMO=="false" && TIFI=="false") CheckForBuy();

// SELL Trade Criteria

    if (Bid>=(Open[0]+(Step*Point)))  
       {
       SELLme=true; 
       if(Boost && BoostTrack>0 && Close[0]>BoostTrack)
        {
         SELLme=true; 
         TradeAllowed=true;
        }
     } 
    if (EndTrading == true && OrdersSELL == 0) SELLme = false;
    if (SELLme == true && CLFR=="false" && OPMO=="false" && TIFI=="false") CheckForSell();

   Comment("                    Final EA", NL,
           "                    Sells ", OrdersSELL, NL,
           "                    SellLots ", SellLots, NL,
           "                    HighestSell ", HighestSell, NL,
           "                    Buys ", OrdersBUY, NL,
           "                    BuyLots ", BuyLots, NL,
           "                    LowestBuy ", LowestBuy, NL,
           "                    Current Time is  ",TimeHour(CurTime()),":",TimeMinute(CurTime()),".",TimeSeconds(CurTime()));

      string BuyProf = DoubleToStr(BuyProfit, 2);
      string SellProf = DoubleToStr(SellProfit, 2);
      string BuyProfTarget = DoubleToStr(BuyProfitTarget, 2);
      string SellProfTarget = DoubleToStr(SellProfitTarget, 2);
      
      string AcctBalance = DoubleToStr(AccountBalance(), 2);

      if (ObjectFind("MarginPercent") != 0)
      {
         ObjectCreate("MarginPercent", OBJ_LABEL, 0, 0, 0);
      	ObjectSet("MarginPercent", OBJPROP_CORNER, 3);
      	ObjectSet("MarginPercent", OBJPROP_XDISTANCE, 10);
         ObjectSet("MarginPercent", OBJPROP_YDISTANCE, 5);       
      }
      else
      {
         ObjectSetText("MarginPercent", "Buy $" + BuyProf + "   Sell $" + SellProf + "   $" + AcctBalance, 24, "Arial", White);
      }
      
      if (ObjectFind("MarginPercent2") != 0)
      {
         ObjectCreate("MarginPercent2", OBJ_LABEL, 0, 0, 0);
      	ObjectSet("MarginPercent2", OBJPROP_CORNER, 3);
      	ObjectSet("MarginPercent2", OBJPROP_XDISTANCE, 10);
         ObjectSet("MarginPercent2", OBJPROP_YDISTANCE, 60);       
      }
      else
      {
         ObjectSetText("MarginPercent2", "BuyP $" + BuyProfTarget + "   SellP $" + SellProfTarget + "                 ", 24, "Arial", White);
      }
    
 } // end start()

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---