Ema_cross_contest_hedged_v1

Author: Coders Guru
Profit factor:
0.75

This script is designed to automatically trade on the Forex market based on a few simple rules. Here's how it works:

Overall Strategy:

The script uses a combination of two indicators: Exponential Moving Averages (EMAs) and a MACD to identify potential trading opportunities. It then opens trades (either buying or selling) and sets up additional "hedging" orders that are triggered if the initial trade moves against the primary trend. The goal is to profit from price movements and potentially recover losses through the hedging strategy.

Here's a breakdown of the process:

  1. Initialization: The script starts by setting up some basic information, including trade sizes, stop-loss/take-profit levels, and parameters for the trading indicators. These parameters can be adjusted to fine-tune the script's behavior.

  2. Checking for Trading Conditions: The script continuously monitors the price data. It uses two EMAs (a shorter-term and a longer-term one) to determine the current trend. It checks when the shorter EMA crosses above the longer EMA (potentially indicating an upward trend) or crosses below (potentially indicating a downward trend). Also, MACD is used as a filter, only make buys when MACD is above 0 and sells when MACD is below 0.

  3. Opening Initial Trades: If the script detects a trend change based on the EMA crossover, and the conditions of MACD are met, it opens a trade in the corresponding direction:

    • Upward Trend: A "buy" order is placed, anticipating that the price will rise.
    • Downward Trend: A "sell" order is placed, anticipating that the price will fall. The script also checks if there are any existing orders for the same currency pair before placing a new trade. It prevents duplicate trades.
  4. Setting Up Hedging Orders: After placing the initial trade, the script immediately sets up a series of "buy stop" or "sell stop" orders. These are essentially pending orders that will automatically open if the price moves against the initial trade:

    • Buy Stop Orders: If a "buy" order was placed, a series of "buy stop" orders are created at incrementally higher price levels. If the price drops after the initial buy, these orders will trigger, creating additional buy positions at progressively worse prices (hence, "hedging").
    • Sell Stop Orders: If a "sell" order was placed, a series of "sell stop" orders are created at incrementally lower price levels. If the price rises after the initial sell, these orders will trigger, creating additional sell positions at progressively worse prices. These hedging orders have a set expiration time, meaning they will be automatically canceled if they are not triggered within a certain period.
  5. Managing Existing Trades: If the script finds existing trades, it performs two main functions:

    • Closing Trades on Opposite Signals: If the script is set to "UseClose," it monitors for the opposite EMA crossover signal. If it detects a signal that contradicts the current trade (e.g., a sell signal while a buy order is open), it will automatically close the existing trade.
    • Trailing Stop Loss: The script implements a "trailing stop loss" feature. This means that as the price moves in a favorable direction (increasing profit), the stop-loss order is automatically adjusted to lock in some of those profits. If the price reverses and hits the trailing stop loss, the trade will be closed, securing the accumulated profit.

In Summary:

The script automates a trading strategy that combines trend identification (using EMAs and MACD) with a hedging approach to manage risk and potentially profit from price fluctuations. It continuously monitors the market, opens trades, sets up hedging orders, and manages existing positions based on predefined rules.

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
9 Views
0 Downloads
0 Favorites
Ema_cross_contest_hedged_v1
//+------------------------------------------------------------------+
//|                                     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.56
Total Trades 193
Won Trades 151
Lost trades 42
Win Rate 78.24 %
Expected payoff 2.75
Gross Profit 870.58
Gross Loss -340.18
Total Net Profit 530.40
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
0.51
Total Trades 198
Won Trades 114
Lost trades 84
Win Rate 57.58 %
Expected payoff -3.01
Gross Profit 617.75
Gross Loss -1213.66
Total Net Profit -595.91
-100%
-50%
0%
50%
100%
USD/CAD Jul 2025 - Sep 2025
0.87
Total Trades 103
Won Trades 66
Lost trades 37
Win Rate 64.08 %
Expected payoff -0.42
Gross Profit 284.77
Gross Loss -328.43
Total Net Profit -43.66
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
0.89
Total Trades 98
Won Trades 64
Lost trades 34
Win Rate 65.31 %
Expected payoff -0.36
Gross Profit 270.70
Gross Loss -305.50
Total Net Profit -34.80
-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.16
Total Trades 156
Won Trades 111
Lost trades 45
Win Rate 71.15 %
Expected payoff 0.49
Gross Profit 562.74
Gross Loss -486.26
Total Net Profit 76.48
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
0.00
Total Trades 853
Won Trades 0
Lost trades 853
Win Rate 0.00 %
Expected payoff -9.87
Gross Profit 0.00
Gross Loss -8422.82
Total Net Profit -8422.82
-100%
-50%
0%
50%
100%
EUR/USD Jul 2025 - Sep 2025
1.10
Total Trades 139
Won Trades 101
Lost trades 38
Win Rate 72.66 %
Expected payoff 0.36
Gross Profit 571.80
Gross Loss -522.00
Total Net Profit 49.80
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
0.83
Total Trades 150
Won Trades 91
Lost trades 59
Win Rate 60.67 %
Expected payoff -0.70
Gross Profit 518.20
Gross Loss -623.70
Total Net Profit -105.50
-100%
-50%
0%
50%
100%
USD/JPY Jan 2025 - Jul 2025
0.95
Total Trades 819
Won Trades 559
Lost trades 260
Win Rate 68.25 %
Expected payoff -0.16
Gross Profit 2357.94
Gross Loss -2487.17
Total Net Profit -129.23
-100%
-50%
0%
50%
100%

Comments