EMA_CROSS_2_v1

Author: Coders Guru
Profit factor:
5.24

This automated trading script is designed to execute trades based on the relationship between two moving averages—specifically, a Short Exponential Moving Average (EMA) and a Long Exponential Moving Average (EMA). The logic focuses on identifying momentum shifts where these two lines intersect to determine when to enter the market.

Core Trading Logic

The system monitors the price action through two different lenses: a fast-moving average (Short EMA) and a slow-moving average (Long EMA). It identifies trading opportunities by detecting "crosses":

  • Buy Signals: When the Short EMA moves above the Long EMA, the script interprets this as upward momentum and initiates a "Buy" order.
  • Sell Signals: When the Short EMA moves below the Long EMA, the script interprets this as downward momentum and initiates a "Sell" order.

To ensure stability, the script includes a safeguard that prevents it from triggering on the very first moment it is loaded; it waits for a definitive change in the relationship between the two lines before taking action.

Trade Management

Once a trade is opened, the script manages the position using three primary components:

  1. Entry Validation: Before performing any actions, the script verifies that there is sufficient historical data (at least 100 price bars) and that the profit targets are set to a logical minimum. It will only open a new trade if there are no current positions active on the specific currency pair.
  2. Risk Controls: Every trade is automatically equipped with a predefined Stop Loss (to limit potential losses) and a Take Profit (to lock in gains at a specific price target).
  3. Trailing Stop functionality: The script features an intelligent "Trailing Stop" mechanism. As the market moves in your favor, the script can automatically move the Stop Loss order closer to the current price. This allows the trade to remain open as long as the profit continues to grow, while protecting a significant portion of those gains if the market suddenly reverses.

Summary of Behavior

In essence, this is a momentum-based strategy. It looks for "breakouts" where short-term price trends overpower long-term averages to enter trades, then uses a dynamic trailing stop to ride the winning trend as far as possible while maintaining a safety net for the account.

Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategy
Indicators Used
Moving average indicator
15 Views
0 Downloads
0 Favorites
EMA_CROSS_2_v1
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                    EMA_CROSS.mq4 |
//|                                                      Coders Guru |
//|                                         http://www.forex-tsd.com |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| TODO: Add Money Management routine                               |
//+------------------------------------------------------------------+

#property copyright "Coders Guru"
#property link      "http://www.forex-tsd.com"

//---- input parameters
extern double    TakeProfit=130;
extern double    StopLoss = 100;
extern double    Lots=1;
extern double    TrailingStop=20;

extern int ShortEma = 10;
extern int LongEma = 80;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }

int Crossed (double line1 , double line2)
   {
      static int last_direction = 0;
      static int current_direction = 0;
      
      //Don't work in the first load, wait for the first cross!
      static bool first_time = true;
      if(first_time == true)
      {
         first_time = false;
         return (0);
      }
      
      if(line1>line2)current_direction = 1; //up
      if(line1<line2)current_direction = 2; //down

      if(current_direction != last_direction) //changed 
      {
            last_direction = current_direction;
            return (last_direction);
      }
      else
      {
            return (0); //not changed
      }
   }

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---- 

   int cnt, ticket, total;
   double SEma, LEma;
   
   
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
     
     
   SEma = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,0);
   LEma = iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,0);
   
   
   static int isCrossed  = 0;
   isCrossed = Crossed (LEma,SEma);
   
   total  = OrdersTotal(); 
   if(total < 1) 
     {
       if(isCrossed == 1)
         {
            //ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"EMA_CROSS",12345,0,Green);
            ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"EMA_CROSS",12345,0,Green);
            if(ticket>0)
              {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
              }
            else Print("Error opening BUY order : ",GetLastError()); 
            return(0);
         }
         if(isCrossed == 2)
         {

            //ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"EMA_CROSS",12345,0,Red);
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"EMA_CROSS",12345,0,Red);
            if(ticket>0)
              {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
              }
            else Print("Error opening SELL order : ",GetLastError()); 
            return(0);
         }
         return(0);
     }
     
     
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      //OrderPrint();
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
           
           /* REMOVED - Trailling stop only close
           if(isCrossed == 2)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
           */
           
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            
            /* REMOVED - Trailling stop only close
            if(isCrossed == 1)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            */
            
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }

   return(0);
  }
//+------------------------------------------------------------------+

Profitability Reports

EUR/USD Jul 2025 - Sep 2025
81.32
Total Trades 2583
Won Trades 2543
Lost trades 40
Win Rate 98.45 %
Expected payoff 124.38
Gross Profit 325262.00
Gross Loss -4000.00
Total Net Profit 321262.00
-100%
-50%
0%
50%
100%
AUD/USD Oct 2025 - Feb 2026
0.86
Total Trades 143
Won Trades 103
Lost trades 40
Win Rate 72.03 %
Expected payoff -3.94
Gross Profit 3437.00
Gross Loss -4000.00
Total Net Profit -563.00
-100%
-50%
0%
50%
100%
AUD/USD Oct 2024 - Jan 2025
0.75
Total Trades 45
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -6.64
Gross Profit 901.00
Gross Loss -1200.00
Total Net Profit -299.00
-100%
-50%
0%
50%
100%
EUR/USD Oct 2025 - Feb 2026
0.70
Total Trades 135
Won Trades 94
Lost trades 41
Win Rate 69.63 %
Expected payoff -9.15
Gross Profit 2865.00
Gross Loss -4100.00
Total Net Profit -1235.00
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
0.68
Total Trades 79
Won Trades 52
Lost trades 27
Win Rate 65.82 %
Expected payoff -10.95
Gross Profit 1835.00
Gross Loss -2700.00
Total Net Profit -865.00
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
0.66
Total Trades 100
Won Trades 64
Lost trades 36
Win Rate 64.00 %
Expected payoff -15.47
Gross Profit 2953.87
Gross Loss -4500.98
Total Net Profit -1547.11
-100%
-50%
0%
50%
100%
USD/JPY Jul 2025 - Sep 2025
0.59
Total Trades 114
Won Trades 65
Lost trades 49
Win Rate 57.02 %
Expected payoff -11.87
Gross Profit 1971.01
Gross Loss -3324.15
Total Net Profit -1353.14
-100%
-50%
0%
50%
100%
USD/CAD Jul 2025 - Sep 2025
0.54
Total Trades 71
Won Trades 47
Lost trades 24
Win Rate 66.20 %
Expected payoff -11.39
Gross Profit 936.43
Gross Loss -1744.94
Total Net Profit -808.51
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
0.49
Total Trades 62
Won Trades 39
Lost trades 23
Win Rate 62.90 %
Expected payoff -18.92
Gross Profit 1127.00
Gross Loss -2300.00
Total Net Profit -1173.00
-100%
-50%
0%
50%
100%
USD/CAD Oct 2024 - Jan 2025
0.48
Total Trades 41
Won Trades 27
Lost trades 14
Win Rate 65.85 %
Expected payoff -12.77
Gross Profit 479.28
Gross Loss -1002.68
Total Net Profit -523.40
-100%
-50%
0%
50%
100%
GBP/USD Jul 2025 - Sep 2025
0.47
Total Trades 87
Won Trades 46
Lost trades 41
Win Rate 52.87 %
Expected payoff -25.17
Gross Profit 1910.00
Gross Loss -4100.00
Total Net Profit -2190.00
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
0.43
Total Trades 73
Won Trades 43
Lost trades 30
Win Rate 58.90 %
Expected payoff -23.60
Gross Profit 1277.00
Gross Loss -3000.00
Total Net Profit -1723.00
-100%
-50%
0%
50%
100%
GBP/AUD Oct 2025 - Feb 2026
0.38
Total Trades 261
Won Trades 120
Lost trades 141
Win Rate 45.98 %
Expected payoff -23.82
Gross Profit 3755.11
Gross Loss -9971.03
Total Net Profit -6215.92
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
0.33
Total Trades 41
Won Trades 25
Lost trades 16
Win Rate 60.98 %
Expected payoff -25.98
Gross Profit 535.00
Gross Loss -1600.00
Total Net Profit -1065.00
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
0.29
Total Trades 106
Won Trades 41
Lost trades 65
Win Rate 38.68 %
Expected payoff -28.42
Gross Profit 1210.09
Gross Loss -4222.12
Total Net Profit -3012.03
-100%
-50%
0%
50%
100%
GBP/CAD Oct 2025 - Feb 2026
0.13
Total Trades 198
Won Trades 50
Lost trades 148
Win Rate 25.25 %
Expected payoff -46.66
Gross Profit 1324.30
Gross Loss -10562.22
Total Net Profit -9237.92
-100%
-50%
0%
50%
100%
GBP/CAD Jul 2025 - Sep 2025
0.00
Total Trades 0
Won Trades 0
Lost trades 0
Win Rate 0.0 %
Expected payoff 0.00
Gross Profit 0.00
Gross Loss 0.00
Total Net Profit 0.00
-100%
-50%
0%
50%
100%

Comments