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:
-
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.
- The script starts by defining several settings that can be adjusted by the user, such as:
-
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.
-
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.
- 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:
-
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.
- The script continuously monitors any open trades and does two things:
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.
/*-----------------------------+
| |
| 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);
}
//+------------------------------------------------------------------+
Comments