TSD-v11-MT4-JB-MACD

Profit factor:
423.36

This script is designed to automate trading on the MetaTrader 4 platform, using a strategy inspired by Alexander Elder's Triple Screen system. It's intended to be run on a weekly chart and focuses on identifying potential entry points and managing trades.

Here's the breakdown of how it works:

  1. Initialization and Configuration: The script starts by setting up various parameters that control its behavior. These include:

    • Lot Size: The amount of currency to trade in each transaction.
    • Take Profit: The profit level at which the trade will automatically close to secure gains (measured in points).
    • Stop Loss: The loss level at which the trade will automatically close to limit potential losses (set to 0 in this script, so it will not be used).
    • Trailing Stop: A feature that automatically adjusts the stop loss level as the trade moves in a favorable direction, helping to protect profits.
    • Slippage: The acceptable difference between the requested price and the actual price at which the trade is executed.
    • Trading Time Windows: The script divides the hour in slots and only performs actions in those slots this is done for all configured currency pairs and it is intended to avoid collisions.
  2. Data Collection and Analysis (Weekly Chart): The script gathers information from the weekly chart to determine the overall trend:

    • MACD (Moving Average Convergence Divergence): This is a trend-following momentum indicator. The script compares the current and previous values of the MACD line. If the current value is higher, it suggests an upward trend. If the current value is lower, it suggests a downward trend.
    • OsMA (Oscillator of Moving Average): Similar to MACD, OsMA is an oscillator that measures the difference between a price and its moving average. The script checks whether OsMA is trending up or down, similar to the MACD.
  3. Data Collection and Analysis (Daily Chart): The script also uses information from the daily chart for more immediate signals:

    • Force Index: This indicator measures the strength of a price movement by combining price change and volume. A positive Force Index suggests an upward trend, while a negative one suggests a downward trend.
  4. Trading Logic: The core of the script's decision-making process:

    • Entry Conditions: The script looks for opportunities to enter trades based on the weekly and daily analyses.
      • If the weekly MACD and OsMA indicate an upward trend AND the daily Force Index is negative (meaning a temporary pullback in the daily chart), the script places a "buy stop" order. This means it will automatically buy if the price rises to a certain level, with the intention of catching an upward breakout.
      • Conversely, if the weekly MACD and OsMA indicate a downward trend AND the daily Force Index is positive (meaning a temporary rally in the daily chart), the script places a "sell stop" order. This will automatically sell if the price falls to a certain level, aiming to profit from a downward breakout.
      • The entry price for these orders is based on the high or low of the previous day's candle, with a small adjustment to ensure the order is triggered. The script considers a minimum distance of 16 pips from the current price before placing the order.
  5. Order Management:

    • Cancellation: If the weekly trend changes (e.g., from upward to downward), the script will cancel any pending buy or sell stop orders.
    • Modification: The script tries to adjust pending orders based on recent price movements, specifically by monitoring if the high or low of the current day are higher or lower than those of the previous day. It also makes sure orders don't fall inside the 16 pips threshold.
    • Trailing Stop Implementation: Once a trade is open (either a buy or sell position), the script will manage the stop loss. If the price moves favorably, the stop loss will be moved to a higher level (for buy positions) or a lower level (for sell positions), based on the "Trailing Stop" parameter. This aims to lock in profits as the trade progresses.
  6. Time-Based Restrictions: The script incorporates a time-based filtering mechanism. This means it only executes trading logic during specific minutes of each hour. This feature appears to be designed to avoid conflicts when running the script on multiple currency pairs simultaneously.

In essence, this script attempts to identify potential trades by combining long-term trend analysis (weekly chart) with short-term momentum (daily chart). It places pending orders to catch breakouts and then manages those orders with trailing stops. It also implements time-based restrictions to prevent order placing collisions.

Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
Indicators Used
MACD HistogramMoving Average of OscillatorForce index
15 Views
4 Downloads
0 Favorites
TSD-v11-MT4-JB-MACD
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

/*[[
	Name := TDSGlobal
	Author := Copyright © 2005 Bob O'Brien / Barcode
	Link := 
	Notes := Based on Alexander Elder's Triple Screen system. To be run only on a Weekly chart.
	Lots := 1
	Stop Loss := 0
	Take Profit := 100
	Trailing Stop := 60
]]*/
//+------------------------------------------------------------------+
//|  External Variables                                              |
//+------------------------------------------------------------------+

extern double Lots = 1;
extern int TakeProfit = 100;
extern int Stoploss = 0;
extern int TrailingStop = 60;	
extern int Slippage=5;			// Slippage
extern int StopYear=2005;
extern int MM=0,Leverage=1,AcctSize=10000;

int BuyEntryOrderTicket=0,SellEntryOrderTicket=0,cnt=0,total=0;

double MacdCurrent=0, MacdPrevious=0, MacdPrevious2=0, Direction=0, OsMAPrevious=0, OsMAPrevious2=0, OsMADirection=0;

double newbar=0,PrevDay=0,PrevMonth=0,PrevYear=0,PrevCurtime=0;

double PriceOpen=0;								// Price Open


bool First=True;

double TradesThisSymbol=0;
double ForcePos=0, ForceNeg=0, Force=0,NewPrice=0;
double StartMinute1=0,EndMinute1=0,StartMinute2=0,EndMinute2=0,StartMinute3=0,EndMinute3=0;
double StartMinute4=0,EndMinute4=0,StartMinute5=0,EndMinute5=0,StartMinute6=0,EndMinute6=0;
double StartMinute7=0,EndMinute7=0,DummyField=0;

int start()
{

Comment("TSD for MT4 ver beta 0.3 - DO NOT USE WITH REAL MONEY YET",
        "\n",
        "\n","Weekly MacdPrevious = ",MacdPrevious,"    Weekly OsMAPrevious = ",OsMAPrevious,
        "\n","Weekly MacdPrevious2 = ",MacdPrevious2,"    Weekly OsMAPrevious2 = ",OsMAPrevious2,
        "\n","Weekly Direction = ",Direction,"    Weekly OsMADirection = ",OsMADirection,
        "\n",
        "\n","Daily Force = ",Force,
        "\n","Is Daily Force Bullish = ",ForcePos,
        "\n","Is Daily Force Bearish = ",ForceNeg,
        "\n",
        "\n","Total Orders = ",total,
        "\n","Trades this Symbol(",Symbol(),") = ",TradesThisSymbol,
        "\n",
        "\n","New Bar Time is ",TimeToStr(newbar),
        "\n",
        "\n","Daily High[1] = ",High[1],
        "\n","Daily High[2] = ",High[2],
        "\n","Daily Low[1] = ",Low[1],
        "\n","Daily Low[2] = ",Low[2],
        "\n",
        "\n","Current Ask Price + 16 pips = ",Ask+(16*Point),
        "\n","Current Bid Price - 16 pips = ",Bid-(16*Point));
        
        
total=OrdersTotal();
     TradesThisSymbol=0;
	  for(cnt=0;cnt<total;cnt++)
     { 
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
	      
	      if(OrderSymbol()==Symbol())
	      {
	        TradesThisSymbol ++;
	      } // close for if(OrderSymbol()==Symbol())
	  } // close for for(cnt=0;cnt<total;cnt++)        
        
        
        
        
        

     
	  MacdPrevious  = iMACD(NULL,10080,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
	  MacdPrevious2 = iMACD(NULL,10080,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
	  
	  OsMAPrevious  = iOsMA(NULL,10080,12,26,9,PRICE_CLOSE,1);
	  OsMAPrevious2 = iOsMA(NULL,10080,12,26,9,PRICE_CLOSE,2);

     Force = iForce(NULL,1440,2,MODE_EMA,PRICE_CLOSE,1); 
     ForcePos = iForce(NULL,1440,2,MODE_EMA,PRICE_CLOSE,1) > 0;
	  ForceNeg = iForce(NULL,1440,2,MODE_EMA,PRICE_CLOSE,1) < 0;

	  
	  if (MacdPrevious > MacdPrevious2) Direction = 1;
	  if (MacdPrevious < MacdPrevious2) Direction = -1;
	  if (MacdPrevious == MacdPrevious2) Direction = 0;
	  
	  if (OsMAPrevious > OsMAPrevious2) OsMADirection = 1;
	  if (OsMAPrevious < OsMAPrevious2) OsMADirection = -1;
	  if (OsMAPrevious == OsMAPrevious2) OsMADirection = 0;
	  
	            
     
	  
// Select a range of minutes in the day to start trading based on the currency pair.
// This is to stop collisions occurring when 2 or more currencies set orders at the same time.

if(Symbol() == "USDCHF")
{
    StartMinute1 = 0;
	EndMinute1   = 1;
    StartMinute2 = 8;
	EndMinute2   = 9;
    StartMinute3 = 16;
	EndMinute3   = 17;
    StartMinute4 = 24;
	EndMinute4   = 25;
    StartMinute5 = 32;
	EndMinute5   = 33;
    StartMinute6 = 40;
	EndMinute6   = 41;
    StartMinute7 = 48;
	EndMinute7   = 49;
} // close for if(Symbol() == "USDCHF")
if(Symbol() == "GBPUSD")
{  
    StartMinute1 = 2;
	EndMinute1   = 3;
    StartMinute2 = 10;
	EndMinute2   = 11;
    StartMinute3 = 18;
	EndMinute3   = 19;
    StartMinute4 = 26;
	EndMinute4   = 27;
    StartMinute5 = 34;
	EndMinute5   = 35;
    StartMinute6 = 42;
	EndMinute6   = 43;
    StartMinute7 = 50;
	EndMinute7   = 51;
} // close for if(Symbol() == "GBPUSD")
if(Symbol() == "USDJPY")
{
    StartMinute1 = 4;
	EndMinute1   = 5;
    StartMinute2 = 12;
	EndMinute2   = 13;
    StartMinute3 = 20;
	EndMinute3   = 21;
    StartMinute4 = 28;
	EndMinute4   = 29;
    StartMinute5 = 36;
	EndMinute5   = 37;
    StartMinute6 = 44;
	EndMinute6   = 45;
    StartMinute7 = 52;
	EndMinute7   = 53;
} //close for if(Symbol() == "USDJPY")
if(Symbol() == "EURUSD")
{
    StartMinute1 = 6;
	EndMinute1   = 7;
    StartMinute2 = 14;
	EndMinute2   = 15;
    StartMinute3 = 22;
	EndMinute3   = 23;
    StartMinute4 = 30;
	EndMinute4   = 31;
    StartMinute5 = 38;
	EndMinute5   = 39;
    StartMinute6 = 46;
	EndMinute6   = 47;
    StartMinute7 = 54;
	EndMinute7   = 59;
} // close for if(Symbol() == "EURUSD")



if( (Minute() >= StartMinute1 && Minute() <= EndMinute1) ||
   (Minute() >= StartMinute2 && Minute() <= EndMinute2) ||
   (Minute() >= StartMinute3 && Minute() <= EndMinute3) ||
   (Minute() >= StartMinute4 && Minute() <= EndMinute4) ||
   (Minute() >= StartMinute5 && Minute() <= EndMinute5) ||
   (Minute() >= StartMinute6 && Minute() <= EndMinute6) ||
   (Minute() >= StartMinute7 && Minute() <= EndMinute7) )
{
	DummyField = 0; // dummy statement because MT will not allow me to use a continue statement
} // close for LARGE if statement
else return(0);

/////////////////////////////////////////////////
//  Process the next bar details
/////////////////////////////////////////////////

if (newbar != Time[0]) 
{
	 newbar        = Time[0];
	 
	 if(TradesThisSymbol < 1) 
	 {
	   
	   if(Direction == 1 && ForceNeg)
		{
			PriceOpen = High[1] + 1 * Point;		// Buy 1 point above high of previous candle
			if(PriceOpen > (Ask + 16 * Point))  // Check if buy price is a least 16 points > Ask
			{
				BuyEntryOrderTicket=OrderSend(Symbol(),OP_BUYSTOP,Lots,PriceOpen,Slippage,Low[1] - 1 * Point,PriceOpen + TakeProfit * Point,"Buy Entry Order placed at "+CurTime(),0,0,Green);
				return(0);

			} // close for if(PriceOpen > (Ask + 16 * Point))
			else
			{
			   NewPrice = Ask + 16 * Point;
				BuyEntryOrderTicket=OrderSend(Symbol(),OP_BUYSTOP,Lots,NewPrice,Slippage,Low[1] - 1 * Point,NewPrice + TakeProfit * Point,"Buy Entry Order placed at "+CurTime(),0,0,Green);
				return(0);
			} // close for else statement
	   } // close for if(Direction == 1 && ForceNeg)
     
     
     if(Direction == -1 && ForcePos)
     {
         PriceOpen = Low[1] - 1 * Point;
			if(PriceOpen < (Bid - 16 * Point)) // Check if buy price is a least 16 points < Bid
			{
				SellEntryOrderTicket=OrderSend(Symbol(),OP_SELLSTOP,Lots,PriceOpen,Slippage,High[1] + 1 * Point,PriceOpen - TakeProfit * Point,"Sell Entry Order placed at "+CurTime(),0,0,Green);
				return(0);
			} // close for if(PriceOpen < (Bid - 16 * Point))
			else
			{
				NewPrice = Bid - 16 * Point;
				SellEntryOrderTicket=OrderSend(Symbol(),OP_SELLSTOP,Lots,NewPrice,Slippage,High[1] + 1 * Point,NewPrice - TakeProfit * Point,"Sell Entry Order placed at "+CurTime(),0,0,Green);
            return(0);			
			} // close for else statement

      } // close for if(Direction == -1 && ForcePos)
    } //Close of if(TradesThisSymbol < 1)


/////////////////////////////////////////////////
//  Pending Order Management
/////////////////////////////////////////////////

if(TradesThisSymbol > 0)
	{
      total=OrdersTotal();
      for(cnt=0;cnt<total;cnt++)
  	   { 
  	      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

         if(OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP)
         {

				if(Direction == -1)
  				{ 
  				   OrderDelete(OrderTicket());
	        		return(0); 
				} // close for if(Direction == -1)
			} // close for if(OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP)

         if(OrderSymbol()==Symbol() && OrderType()==OP_SELLSTOP)
         {

				if(Direction == 1)
  				{ 
  				   OrderDelete(OrderTicket());
	        		return(0); 
				} //close for if(Direction == 1)
			} //close for if(OrderSymbol()==Symbol() && OrderType()==OP_SELLSTOP)


         if(OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP)
   	   {
				if(High[1] < High[2])
	  			{ 
					if(High[1] > (Ask + 16 * Point))
	  				{ 
	  	   		  OrderModify(OrderTicket(),High[1] + 1 * Point,Low[1] - 1 * Point,OrderTakeProfit(),0,Cyan);
                 return(0);					
	  				} //close for if(High[1] > (Ask + 16 * Point))
	  				else
	  				{
	  				  OrderModify(OrderTicket(),Ask + 16 * Point,Low[1] - 1 * Point,OrderTakeProfit(),0,Cyan);
                 return(0);					
	  				
	  				} //close for else statement
	  			} //close for if(High[1] < High[2])
	  		} //close for if(OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP)
	  
	      if(OrderSymbol()==Symbol() && OrderType()==OP_SELLSTOP)
   		{
				if(Low[1] > Low[2])
				{ 
					if(Low[1] < (Bid - 16 * Point))
					{
		   		  OrderModify(OrderTicket(),Low[1] - 1 * Point,High[1] + 1 * Point,OrderTakeProfit(),0,Cyan);
                 return(0);					
					} // close for if(Low[1] < (Bid - 16 * Point))
					else
					{
					  OrderModify(OrderTicket(),Bid - 16 * Point,High[1] + 1 * Point,OrderTakeProfit(),0,Cyan);
                 return(0);					
      
					} //close for else statement
				} //close for if(Low[1] > Low[2])
			} //close for if(OrderSymbol()==Symbol() && OrderType()==OP_SELLSTOP)
		} // close for for(cnt=0;cnt<total;cnt++)
	} // close for if(TradesThisSymbol > 0)
} // close for if (newbar != Time[0]) 

/////////////////////////////////////////////////
//  Stop Loss Management
/////////////////////////////////////////////////
if(TradesThisSymbol > 0)
{
  total=OrdersTotal();
  for(cnt=0;cnt<total;cnt++)
  { 
     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

     if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
    	{
			if(Ask-OrderOpenPrice() > (TrailingStop * Point))
  			{ 
				if(OrderStopLoss() < (Ask - TrailingStop * Point))
				{ 
	   		   OrderModify(OrderTicket(),OrderOpenPrice(),Ask - TrailingStop * Point,Ask + TakeProfit * Point,0,Cyan);
               return(0);					

				} // close for if(OrderStopLoss() < (Ask - TrailingStop * Point))
			} // close for if(Ask-OrderOpenPrice() > (TrailingStop * Point))
		} // close for if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
	
     if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
		{
			if(OrderOpenPrice() - Bid > (TrailingStop * Point))
			{ 
				if(OrderStopLoss() > (Bid + TrailingStop * Point))
				{ 
	   		   OrderModify(OrderTicket(),OrderOpenPrice(),Bid + TrailingStop * Point,Bid - TakeProfit * Point,0,Cyan);
               return(0);					

				} // close for if(OrderStopLoss() > (Bid + TrailingStop * Point))
			} // close for if(OrderOpenPrice() - Bid > (TrailingStop * Point))
		 } // close for if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
  	  } // close for for(cnt=0;cnt<total;cnt++)
   } // close for if(TradesThisSymbol > 0)
  
	

//return(0);

} // close for start

Profitability Reports

EUR/USD Jul 2025 - Sep 2025
4228.49
Total Trades 453
Won Trades 276
Lost trades 177
Win Rate 60.93 %
Expected payoff 146664.83
Gross Profit 66454883.00
Gross Loss -15716.00
Total Net Profit 66439167.00
-100%
-50%
0%
50%
100%
USD/CAD Oct 2024 - Jan 2025
0.98
Total Trades 166
Won Trades 90
Lost trades 76
Win Rate 54.22 %
Expected payoff -0.71
Gross Profit 6213.74
Gross Loss -6330.95
Total Net Profit -117.21
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
0.80
Total Trades 211
Won Trades 134
Lost trades 77
Win Rate 63.51 %
Expected payoff -9.16
Gross Profit 7872.00
Gross Loss -9805.00
Total Net Profit -1933.00
-100%
-50%
0%
50%
100%
USD/JPY Jul 2025 - Sep 2025
0.68
Total Trades 468
Won Trades 311
Lost trades 157
Win Rate 66.45 %
Expected payoff -12.34
Gross Profit 12041.39
Gross Loss -17815.71
Total Net Profit -5774.32
-100%
-50%
0%
50%
100%
USD/CAD Jul 2025 - Sep 2025
0.65
Total Trades 200
Won Trades 82
Lost trades 118
Win Rate 41.00 %
Expected payoff -12.65
Gross Profit 4605.28
Gross Loss -7135.03
Total Net Profit -2529.75
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
0.61
Total Trades 143
Won Trades 56
Lost trades 87
Win Rate 39.16 %
Expected payoff -22.76
Gross Profit 5059.00
Gross Loss -8314.00
Total Net Profit -3255.00
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
0.57
Total Trades 371
Won Trades 186
Lost trades 185
Win Rate 50.13 %
Expected payoff -22.30
Gross Profit 11014.24
Gross Loss -19288.25
Total Net Profit -8274.01
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
0.42
Total Trades 235
Won Trades 78
Lost trades 157
Win Rate 33.19 %
Expected payoff -24.71
Gross Profit 4125.00
Gross Loss -9933.00
Total Net Profit -5808.00
-100%
-50%
0%
50%
100%
AUD/USD Oct 2024 - Jan 2025
0.19
Total Trades 129
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -74.60
Gross Profit 2226.00
Gross Loss -11849.00
Total Net Profit -9623.00
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
0.18
Total Trades 118
Won Trades 16
Lost trades 102
Win Rate 13.56 %
Expected payoff -78.60
Gross Profit 2072.03
Gross Loss -11346.28
Total Net Profit -9274.25
-100%
-50%
0%
50%
100%

Comments