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:
- 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.
- 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).
- 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.
/*-----------------------------+
| |
| 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);
}
//+------------------------------------------------------------------+
Comments