TSD-v11-MT4-JB-OsMA beta 0.3
Download scriptProfessional Logic Overview: TDSGlobal Script
This script is an automated trading system designed for the MetaTrader 4 platform. It is based on the "Triple Screen" concept, a multi-layered analytical approach that evaluates market trends across different timeframes. The script is specifically engineered to run on Weekly charts.
Core Trading Logic
The script operates by synthesizing three distinct technical indicators to determine the best moment to enter and manage trades:
- Weekly Trend Analysis: It monitors long-term momentum using the MACD (Moving Average Convergence Divergence) and OSMA (Oscillator Standard Moving Average) indicators on a weekly basis. It looks for shifts in direction between the most recent and previous periods.
- Daily Force Evaluation: It calculates "Force" on a daily timeframe to determine whether the current price action is showing bullish (upward) or bearish (downward) pressure.
- Time-Based Filtering: To prevent trade collisions and ensure the script operates during optimal liquidity windows, it contains a specific time filter for major currency pairs (e.g., EURUSD, GBPUSD, USDJPY, USDCHF). The script will only execute logic during designated minute intervals throughout the day for each respective pair.
Entry Strategy
The script uses Pending Orders (Buy Stop and Sell Stop) rather than entering the market instantly. This means it waits for the price to "break out" in a specific direction before committing to a trade.
- Buy Setup: Triggered when the Weekly OSMA shows a downward trend while the Daily Force indicates bearish pressure. It places a Buy Stop order slightly above the high of the previous candle (ensuring it maintains a minimum buffer from the current price).
- Sell Setup: Triggered when the Weekly OSMA shows an upward trend while the Daily Force indicates bullish pressure. It places a Sell Stop order slightly below the low of the previous candle (ensuring it maintains a minimum buffer from the current price).
Trade Management & Maintenance
Once a trade is active or a pending order is placed, the script performs continuous maintenance:
- Order Deletion: If market conditions reverse significantly (e.g., a Buy Stop is pending but the Weekly OSMA shifts to a downward trend), the script will automatically delete the pending order to avoid risky entries.
- Dynamic Modification: The script monitors price levels. If the high or low of previous candles changes in a way that improves the entry point, it will modify the pending orders to more favorable prices.
- Trailing Stop Loss: For active trades, the script manages risk using a trailing stop. As the price moves in favor of the trade, the Stop Loss is automatically moved forward to "lock in" profits while maintaining a pre-defined distance from the current market price.
Summary of Behavior
The logic follows a "Contrarian/Reversion" style where it identifies specific imbalances between weekly trends and daily force. It acts as a disciplined gatekeeper: it filters for the right time of day, waits for a price breakout confirmation, and then actively manages the risk by trailing the stop loss to protect capital.
/*-----------------------------+
| |
| 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.0;
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(OsMADirection == 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(OsMADirection == -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(OsMADirection == -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(OsMADirection == 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
Expected payoff
Average expected payoff across the available backtests for each symbol.
Comments