This script is designed to automate trading based on support and resistance levels in the market, while also considering the overall trend. Here's a breakdown of what it does:
-
Setup:
- When the script starts, it creates visual aids on the chart:
- A blue line represents the "support" level, which is generally a price level where the price tends to stop falling.
- A red line represents the "resistance" level, which is generally a price level where the price tends to stop rising.
- A label on the chart displays whether the script believes the market trend is "bullish" (generally rising) or "bearish" (generally falling).
- When the script starts, it creates visual aids on the chart:
-
Market Analysis:
- The script continuously analyzes the market to determine the support and resistance levels. It looks at the lowest and highest prices over a certain number of past time periods (defined by the 'numBars' setting). The lowest price found becomes the support level, and the highest price becomes the resistance level.
- It also determines the overall market trend. It does this by comparing the current market opening price to a moving average (a way of smoothing out price fluctuations over time, using the 'maPeriod' setting). If the opening price is above the moving average, the trend is considered "bullish"; otherwise, it's "bearish".
-
Opening Trades:
- If there are no open trades, the script checks whether it should open a new trade based on the analyzed support/resistance levels and the trend:
- Bullish Trend: If the script believes the market is in a bullish trend and the current market asking price (the price you'd pay to buy) is above the resistance level, it opens a "buy" order, anticipating the price will continue to rise.
- Bearish Trend: If the script believes the market is in a bearish trend and the current market bidding price (the price you'd get to sell) is below the support level, it opens a "sell" order, anticipating the price will continue to fall.
- The script uses a pre-defined lot size ('Lots' setting) for its trades.
- If there are no open trades, the script checks whether it should open a new trade based on the analyzed support/resistance levels and the trend:
-
Closing Trades:
- If there are open trades, the script checks if they should be closed:
- If a profitable "buy" order is open, it closes the order if the current bidding price falls below the support level.
- If a profitable "sell" order is open, it closes the order if the current asking price rises above the resistance level.
- If there are open trades, the script checks if they should be closed:
-
Trailing Stop Loss:
- The script also implements a "trailing stop" mechanism to protect profits and limit losses. This adjusts the stop-loss order (an order to automatically close the trade if the price moves against you) as the price moves favorably:
- Buy Order: If the market price rises a certain distance above the opening price of a buy order (defined by the 'TrailingStop' setting), the stop-loss order is moved up to a new level that locks in some profit. The stop-loss will only move up, never down, to ensure any gains are protected.
- Sell Order: If the market price falls a certain distance below the opening price of a sell order (defined by the 'TrailingStop' setting), the stop-loss order is moved down to a new level that locks in some profit. The stop-loss will only move down, never up, to ensure any gains are protected.
- The script also implements a "trailing stop" mechanism to protect profits and limit losses. This adjusts the stop-loss order (an order to automatically close the trade if the price moves against you) as the price moves favorably:
In essence, the script tries to automatically buy when the price breaks above resistance during an uptrend and sell when the price breaks below support during a downtrend, aiming to profit from these movements while using stop-loss orders to manage risk.
//+------------------------------------------------------------------+
//| SupportResistTrade.mq4 |
//| Copyright © 2008, Gryb Alexander |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Gryb Alexander"
#property link ""
extern int numBars = 55;
extern int maPeriod = 500;
extern int Lots = 1;
extern double TrailingStop = 50;
double support;
double resist;
string trendType;
int timeFrame = 1;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
ObjectCreate("lineSupport",OBJ_HLINE,0,0,0);
ObjectSet("lineSupport",OBJPROP_COLOR,Blue);
ObjectCreate("lineResist",OBJ_HLINE,0,0,0);
ObjectSet("lineResist",OBJPROP_COLOR,Red);
ObjectCreate("lblTrendType",OBJ_LABEL,0,0,0,0,0);
ObjectSet("lblTrendType",OBJPROP_XDISTANCE,50);
ObjectSet("lblTrendType",OBJPROP_YDISTANCE,50);
ObjectSetText("lblTrendType","TrendType",14,"Tahoma",Red);
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectsDeleteAll();
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
MarketAnalize();
if(OrdersTotal()==0)
CheckForOpen();
else
CheckForClose();
//----
return(0);
}
void MarketAnalize()
{
// ---------------------------------------
support = 10000;
resist = 0;
for(int k = 1;k<=numBars;k++)
{
if(support>iLow(Symbol(),timeFrame,k))
support = iLow(Symbol(),timeFrame,k);
if(resist<iHigh(Symbol(),timeFrame,k))
resist = iHigh(Symbol(),timeFrame,k);
}
ObjectSet("lineSupport",OBJPROP_PRICE1,support);
ObjectSet("lineResist",OBJPROP_PRICE1,resist);
//-----------------------------------------------------------
double ma = iMA(Symbol(),0,maPeriod,0,MODE_EMA,PRICE_OPEN,0);
if(Open[0]>ma)
{
trendType = "bullish";
}
if(Open[0]<ma)
{
trendType = "bearish";
}
ObjectSetText("lblTrendType",trendType);
}
void CheckForOpen()
{
if(trendType=="bullish")
{
if(Ask>resist) OrderSend(Symbol(),OP_BUY,Lots,Ask,3,support,0,"Support & Resistance trader",0,0,Green);
}
if(trendType=="bearish")
{
if(Bid<support) OrderSend(Symbol(),OP_SELL,Lots,Bid,3,resist,0,"Support & Resistance trader",0,0,Red);
}
}
void CheckForClose()
{
OrderSelect(0,SELECT_BY_POS);
if(OrderProfit()>0)
{
if(OrderType()==OP_BUY)
{
if(Bid<support) OrderClose(OrderTicket(),OrderLots(),Bid,3);
}
if(OrderType()==OP_SELL)
{
if(Ask>resist) OrderClose(OrderTicket(),OrderLots(),Ask,3);
}
}
//Trailing
if(OrderType()==OP_BUY)
{
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
// if((Ask>OrderOpenPrice()+Point*20)&&(OrderStopLoss()<(OrderOpenPrice()+Point*10)))
// OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+Point*10,OrderTakeProfit(),0,Blue);
// if((Ask>OrderOpenPrice()+Point*40)&&(OrderStopLoss()<(OrderOpenPrice()+Point*20)))
// OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+Point*20,OrderTakeProfit(),0,Blue);
// if((Ask>OrderOpenPrice()+Point*60)&&(OrderStopLoss()<(OrderOpenPrice()+Point*30)))
// OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+Point*30,OrderTakeProfit(),0,Blue);
// }
if(OrderType()==OP_SELL)
{
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);
}
}
}
// if((Bid<OrderOpenPrice()-Point*20)&&(OrderStopLoss()>(OrderOpenPrice()-Point*10)))
// OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-Point*10,OrderTakeProfit(),0,Blue);
// if((Bid<OrderOpenPrice()-Point*40)&&(OrderStopLoss()>(OrderOpenPrice()-Point*20)))
// OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-Point*20,OrderTakeProfit(),0,Blue);
// if((Bid<OrderOpenPrice()-Point*60)&&(OrderStopLoss()>(OrderOpenPrice()-Point*30)))
// OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-Point*30,OrderTakeProfit(),0,Blue);
}
}
Comments