EMA_CROSS_CONTEST_HEDGED

Author: Coders Guru
Profit factor:
0.87

This script is designed to automate trading in the Forex market (currency exchange). Here's how it works:

Core Idea:

The script's main goal is to identify potential trading opportunities based on the crossing of two Exponential Moving Averages (EMAs) and potentially the MACD indicator, and then execute trades accordingly, also manage existing trades using a trailing stop.

Key Components and How They Work Together:

  1. Setup:

    • The script starts by defining several settings that can be adjusted by the user, such as:
      • TakeProfit: The amount of profit the script aims to achieve on a trade.
      • TrailingStop: A feature that automatically adjusts the stop-loss order (a safety net to limit losses) as the price moves in a favorable direction.
      • StopLoss: The maximum amount of money the script is willing to lose on a single trade.
      • HedgeLevel: Defines the distance from the current price to place pending orders, which act as backup trades if the market moves against the initial trade.
      • ShortEma and LongEma: These define the periods for the two EMAs it will use.
      • UseClose: A setting to determine wether the script will close trades when a cross of the EMAs happens in the oposite direction.
      • UseMACD: A setting to determine wether the MACD indicator will be used to confirm the trend.
  2. Identifying Trading Signals (EMA Crossover):

    • The script calculates two EMAs: a shorter-term EMA and a longer-term EMA. EMAs are used to smooth out price data and identify trends.
    • It looks for instances where the shorter-term EMA crosses the longer-term EMA.
      • A short EMA crossing above the long EMA is interpreted as a potential "buy" signal, suggesting an upward trend.
      • A short EMA crossing below the long EMA is interpreted as a potential "sell" signal, suggesting a downward trend.
    • The script also considers the MACD indicator (if enabled) to confirm the trend.
  3. Opening Trades:

    • When a valid EMA crossover and MACD condition is detected and the script finds that there are no trades opened or there are trades opened for other currency pairs, it will open one of two possible trades:
      • Buy Order: If the signal suggests an upward trend, the script opens a "buy" order, betting that the price will rise. Also some "BuyStop" pending orders are opened, to act as a backup if the price continues to rise.
      • Sell Order: If the signal suggests a downward trend, the script opens a "sell" order, betting that the price will fall. Also some "SellStop" pending orders are opened, to act as a backup if the price continues to fall.
    • Each trade is placed with a predetermined lot size (the amount of currency being traded), a stop-loss order, and a take-profit order.
  4. Managing Existing Trades:

    • The script continuously monitors any open trades and does two things:
      • Optional Closing: If the "UseClose" parameter is enabled and the opposite EMA cross happens, the trade will be closed.
      • Trailing Stop: If the trailing stop feature is enabled, it will automatically adjust the stop-loss order of open trades as the price moves in a profitable direction. This helps to lock in profits while still allowing the trade to potentially gain further.

In Simple Terms:

Imagine you're using two different speed averages to understand a car's direction. If the short average (representing recent speed) goes above the long average (representing speed over a longer time), it's like saying the car is gaining speed and trending upwards. The script uses a similar approach with currency prices, using EMAs to detect potential upward or downward trends. When it spots a possible trend, it automatically places a bet (a trade) in that direction, with safety measures in place to limit losses and a system to automatically adjust the trade as it becomes profitable.

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 indicatorMACD Histogram
8 Views
0 Downloads
0 Favorites
EMA_CROSS_CONTEST_HEDGED
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

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

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

//---- Trades limits
extern double    TakeProfit=150;
extern double    TrailingStop=40;
extern double    StopLoss=150;
extern int       HedgeLevel=6;

extern bool UseClose = true;
extern bool UseMACD = true;

extern double Expiration = 7200;

extern int ShortEma = 4; 
extern int LongEma = 24;
extern int CurrentBar = 1;
extern double Lots = 0.10;

string ExpertName = "EMA_CROSS_CONTEST_HEDGED";
int Magic = 20060328;

//+------------------------------------------------------------------
int init() 
{  
   return(0);  
}
int deinit() 
{ 
   return(0);  
}

//+------------------------------------------------------------------
/*bool NewBar(int bar)
{
   static datetime lastbar=0;
   datetime curbar = Time[bar];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
} */ 

int Crossed()
   {
     double EmaLongPrevious = iMA(NULL,0,LongEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar+1); 
	  double EmaLongCurrent = iMA(NULL,0,LongEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar);
	  double EmaShortPrevious = iMA(NULL,0,ShortEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar+1);
	  double EmaShortCurrent = iMA(NULL,0,ShortEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar);
     
     if (EmaShortPrevious<EmaLongPrevious && EmaShortCurrent>EmaLongCurrent )     return (1); //up trend
     if (EmaShortPrevious>EmaLongPrevious && EmaShortCurrent<EmaLongCurrent )     return (2); //down trend
     
     return (0); //elsewhere
   }

bool isNewSumbol(string current_symbol)
  {
   //loop through all the opened order and compare the symbols
   int total  = OrdersTotal();
   for(int cnt = 0 ; cnt < total ; cnt++)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      string selected_symbol = OrderSymbol();
      if (current_symbol == selected_symbol)
      return (False);
    }
    return (True);
}
//+------------------------------------------------------------------+
//| 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
     }
     
     
   
   total  = OrdersTotal();
   
  
   double macd = iMACD(NULL,0,4,24,12,PRICE_CLOSE,MODE_SIGNAL,CurrentBar);
   
   if(UseMACD==false) macd=0;
  
   if(total < 1 || isNewSumbol(Symbol())) 
     {
       if(Crossed() == 1 &&  macd >= 0 )
         {
            
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*MarketInfo(Symbol(),MODE_POINT),Ask+TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,CurTime() + 3600,Green);
            if(ticket>0)
              {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
              }
            else Print("Error opening BUY order : ",GetLastError()); 
            
            OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+HedgeLevel*MarketInfo(Symbol(),MODE_POINT),3,(Ask+HedgeLevel*MarketInfo(Symbol(),MODE_POINT))-StopLoss*MarketInfo(Symbol(),MODE_POINT),(Ask+HedgeLevel*MarketInfo(Symbol(),MODE_POINT))+TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,CurTime() + Expiration,Blue);
            OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(HedgeLevel+2)*MarketInfo(Symbol(),MODE_POINT),3,(Ask+(HedgeLevel+2)*MarketInfo(Symbol(),MODE_POINT))-StopLoss*MarketInfo(Symbol(),MODE_POINT),(Ask+(HedgeLevel+2)*MarketInfo(Symbol(),MODE_POINT))+TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,CurTime() + Expiration,Blue);
            OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(HedgeLevel+3)*MarketInfo(Symbol(),MODE_POINT),3,(Ask+(HedgeLevel+3)*MarketInfo(Symbol(),MODE_POINT))-StopLoss*MarketInfo(Symbol(),MODE_POINT),(Ask+(HedgeLevel+3)*MarketInfo(Symbol(),MODE_POINT))+TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,CurTime() + Expiration,Blue);
            OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(HedgeLevel+4)*MarketInfo(Symbol(),MODE_POINT),3,(Ask+(HedgeLevel+4)*MarketInfo(Symbol(),MODE_POINT))-StopLoss*MarketInfo(Symbol(),MODE_POINT),(Ask+(HedgeLevel+4)*MarketInfo(Symbol(),MODE_POINT))+TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,CurTime() + Expiration,Blue);
          
            return(0);
         }
         if(Crossed ()==2 &&  macd <= 0  )
         {
            
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*MarketInfo(Symbol(),MODE_POINT),Bid-TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,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()); 

            OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-HedgeLevel*MarketInfo(Symbol(),MODE_POINT),3,(Bid-HedgeLevel*MarketInfo(Symbol(),MODE_POINT))+StopLoss*MarketInfo(Symbol(),MODE_POINT),(Bid-HedgeLevel*MarketInfo(Symbol(),MODE_POINT))-TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,CurTime() + Expiration,Blue);
            OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(HedgeLevel+1)*MarketInfo(Symbol(),MODE_POINT),3,(Bid-(HedgeLevel+2)*MarketInfo(Symbol(),MODE_POINT))+StopLoss*MarketInfo(Symbol(),MODE_POINT),(Bid-(HedgeLevel+2)*MarketInfo(Symbol(),MODE_POINT))-TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,CurTime() + Expiration,Blue);
            OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(HedgeLevel+2)*MarketInfo(Symbol(),MODE_POINT),3,(Bid-(HedgeLevel+3)*MarketInfo(Symbol(),MODE_POINT))+StopLoss*MarketInfo(Symbol(),MODE_POINT),(Bid-(HedgeLevel+3)*MarketInfo(Symbol(),MODE_POINT))-TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,CurTime() + Expiration,Blue);
            OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(HedgeLevel+3)*MarketInfo(Symbol(),MODE_POINT),3,(Bid-(HedgeLevel+4)*MarketInfo(Symbol(),MODE_POINT))+StopLoss*MarketInfo(Symbol(),MODE_POINT),(Bid-(HedgeLevel+4)*MarketInfo(Symbol(),MODE_POINT))-TakeProfit*MarketInfo(Symbol(),MODE_POINT),ExpertName,Magic,CurTime() + Expiration,Blue);
            return(0);
         }
         return(0);
     }
     
     
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            
            if(UseClose)
            {
               if(Crossed ()== 2)
               {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
               }
             }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>MarketInfo(Symbol(),MODE_POINT)*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-MarketInfo(Symbol(),MODE_POINT)*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-MarketInfo(Symbol(),MODE_POINT)*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
           
           if(UseClose)
            {  
               if(Crossed ()== 1)
               {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
                    return(0); // exit
               }
             }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(MarketInfo(Symbol(),MODE_POINT)*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+MarketInfo(Symbol(),MODE_POINT)*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MarketInfo(Symbol(),MODE_POINT)*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+


Profitability Reports

USD/JPY Jul 2025 - Sep 2025
2.40
Total Trades 193
Won Trades 150
Lost trades 43
Win Rate 77.72 %
Expected payoff 2.56
Gross Profit 847.74
Gross Loss -353.24
Total Net Profit 494.50
-100%
-50%
0%
50%
100%
USD/CAD Jul 2025 - Sep 2025
0.96
Total Trades 103
Won Trades 68
Lost trades 35
Win Rate 66.02 %
Expected payoff -0.11
Gross Profit 293.83
Gross Loss -305.01
Total Net Profit -11.18
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
0.87
Total Trades 98
Won Trades 63
Lost trades 35
Win Rate 64.29 %
Expected payoff -0.44
Gross Profit 280.10
Gross Loss -323.10
Total Net Profit -43.00
-100%
-50%
0%
50%
100%
GBP/USD Jul 2025 - Sep 2025
0.71
Total Trades 194
Won Trades 117
Lost trades 77
Win Rate 60.31 %
Expected payoff -1.61
Gross Profit 770.00
Gross Loss -1082.70
Total Net Profit -312.70
-100%
-50%
0%
50%
100%
GBP/CAD Jul 2025 - Sep 2025
1.15
Total Trades 161
Won Trades 115
Lost trades 46
Win Rate 71.43 %
Expected payoff 0.46
Gross Profit 571.23
Gross Loss -497.60
Total Net Profit 73.63
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
0.39
Total Trades 229
Won Trades 132
Lost trades 97
Win Rate 57.64 %
Expected payoff -2.43
Gross Profit 362.06
Gross Loss -917.47
Total Net Profit -555.41
-100%
-50%
0%
50%
100%
EUR/USD Jul 2025 - Sep 2025
0.92
Total Trades 144
Won Trades 100
Lost trades 44
Win Rate 69.44 %
Expected payoff -0.32
Gross Profit 566.80
Gross Loss -612.90
Total Net Profit -46.10
-100%
-50%
0%
50%
100%
USD/JPY Jan 2025 - Jul 2025
1.02
Total Trades 812
Won Trades 564
Lost trades 248
Win Rate 69.46 %
Expected payoff 0.05
Gross Profit 2407.71
Gross Loss -2366.58
Total Net Profit 41.13
-100%
-50%
0%
50%
100%
USD/CHF Jan 2025 - Jul 2025
0.63
Total Trades 527
Won Trades 324
Lost trades 203
Win Rate 61.48 %
Expected payoff -2.13
Gross Profit 1883.33
Gross Loss -3004.42
Total Net Profit -1121.09
-100%
-50%
0%
50%
100%
USD/CAD Jan 2025 - Jul 2025
0.86
Total Trades 630
Won Trades 424
Lost trades 206
Win Rate 67.30 %
Expected payoff -0.45
Gross Profit 1734.47
Gross Loss -2020.56
Total Net Profit -286.09
-100%
-50%
0%
50%
100%

Comments