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:
-
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.
-
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.
-
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.
-
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.
- Entry Conditions: The script looks for opportunities to enter trades based on the weekly and daily analyses.
-
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.
-
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.
/*-----------------------------+
| |
| 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
Comments