EMA-CROSS
Download scriptThis automated trading script is designed to navigate the financial markets by identifying specific momentum shifts using two moving averages. It acts as a systematic way to enter and manage trades based on the interaction between short-term and long-term price trends.
Core Trading Logic
The primary "engine" of this script relies on the EMA Cross methodology. It calculates two different Exponential Moving Averages (EMAs):
- Short-term EMA: Tracks recent price fluctuations closely.
- Long-term EMA: Represents the broader trend over a longer period.
The script monitors the relationship between these two lines. When the short-term line crosses over the long-term line, it signals a change in momentum. Specifically:
- Buy Signal: Triggered when the short-term average moves above the long-term average, suggesting upward momentum.
- Sell Signal: Triggered when the short-term average moves below the long-term average, suggesting downward momentum.
Trade Execution and Management
Once a cross is detected, the script manages the lifecycle of a trade based on several predefined rules:
- Entry Rules: The script will only open a new trade if there are currently no active positions. This prevents the system from over-leveraging or opening multiple simultaneous trades. It automatically places a "Buy" order when an upward cross occurs and a "Sell" order when a downward cross occurs.
- Risk Protection: Every trade is automatically equipped with two essential safety features:
- Take Profit: A pre-set target where the script will automatically close a winning trade to lock in gains.
- Stop Loss: A protective limit that automatically closes a trade if the market moves against the position, preventing significant losses.
- Trailing Stop: To maximize profit during favorable market movements, the script includes a "Trailing Stop" feature. If a trade moves into a profitable state beyond a certain threshold, the script will dynamically move the Stop Loss closer to the current price. This allows the trade to "breathe" while ensuring that if the market suddenly reverses, the gains are preserved.
Operational Safeguards
Before beginning any operations, the script performs basic health checks to ensure it has enough historical data to calculate the averages accurately and verifies that your profit targets are set to realistic values. It is designed to run autonomously, constantly scanning for these moving average intersections and adjusting its active trades in real-time.
//+------------------------------------------------------------------+
//| 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 = 12;
extern int LongEma = 20;
//+------------------------------------------------------------------+
//| 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
Expected payoff
Average expected payoff across the available backtests for each symbol.
Comments