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:
-
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.
-
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.
-
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.
-
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.
-
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.
//+------------------------------------------------------------------+
//| 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