TSD_MT4_MR_Trade_0_102

Author: Copyright � 2005 Bob O\'Brien / Barcode
Profit factor:
1.14
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
Orders Execution
Checks for the total of open orders
Indicators Used
Larry William percent range indicator
2 Views
0 Downloads
0 Favorites
TSD_MT4_MR_Trade_0_102
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                   TSD_MR_Trade_MACD_WPR_0_10.mq4 |
//|                           Copyright ® 2005 Bob O'Brien / Barcode |
//|             TSD v1.2 rewritten to MQL4 and enhanced by Mindaugas |
//|                   magic number and backtesting mod by Nick Bilak |
//|                                           TSD Trade version 0.10 |
//+------------------------------------------------------------------+
#property copyright "Copyright ® 2005 Bob O\'Brien / Barcode"

#include <stdlib.mqh>

#define MAGICNUM  20050720

#define  DIRECTION_MACD 1
#define  DIRECTION_OSMA 2

#define  FILTER_WPR     1
#define  FILTER_FORCE   2

// which indicators to use
int DirectionMode = DIRECTION_MACD, FilterMode = FILTER_WPR;
// trading periods
int PeriodDirection = PERIOD_W1, PeriodTrade = PERIOD_D1, PeriodTrailing = PERIOD_H4, CandlesTrailing = 3;
// currency pairs to trade

// parameters for iWPR and iForce indicators
int WilliamsP = 24, WilliamsL = -75, WilliamsH = -25;
int ForceP = 2;

int TakeProfit = 100, TrailingStop = 60;
int Slippage = 5, LotsMax = 50;
double Lots = 0.1;
int MM = 0, Leverage = 1, MarginChoke = 200;

string TradeSymbol;
int Pair = 0;
datetime LastTrade = 0;
double Spread, SPoint;

//+------------------------------------------------------------------+

int init()   { return(0); }
int deinit() { return(0); }

//+------------------------------------------------------------------+

int start() {
   int TradesThisSymbol, Direction;
   int i, ticket;
   
   bool okSell, okBuy;
   
   double PriceOpen, Buy_Sl, Buy_Tp, LotMM, WilliamsValue;
   string ValueComment;
   
   if ( (LastTrade + 15) > CurTime() )  return(0);
   
   TradeSymbol = Symbol();
   
   Spread = MarketInfo (TradeSymbol, MODE_SPREAD)*Point;
   SPoint = Point;
   
   TradesThisSymbol = TotalTradesThisSymbol (TradeSymbol);
   
   Direction = Direction (TradeSymbol, PeriodDirection, DirectionMode);
   ValueComment = Filter(TradeSymbol, PeriodTrade, FilterMode, okBuy, okSell);
   
   //Comment ("\nSymbol: ", TradeSymbol, "\nMACD Direction: ", Direction, "\n", ValueComment);

   /////////////////////////////////////////////////
   //  Place new order
   /////////////////////////////////////////////////
   if ( IsNewDayBar() ) {  
      if ( TradesThisSymbol < 1 ) {

         LotMM = CalcMM(MM);
         if ( LotMM < 0 )  return(0);

         ticket = 0;

         if ( Direction == 1 && okBuy ) {
            MarkTrade();
	         //Print ("TSD BuyStop: ", TradeSymbol, " ", LotMM, " ", CalcOpenBuy(), " ", CalcSlBuy(), " ", CalcTpBuy());
            ticket = OrderSend (TradeSymbol, OP_BUYSTOP, LotMM, CalcOpenBuy(), Slippage, CalcSlBuy(), CalcTpBuy(),
		                          "TSD BuyStop", MAGICNUM, 0, Blue);
		   }
		   
         if ( Direction == -1 && okSell ) {
            MarkTrade();
	         //Print ("TSD SellStop: ", TradeSymbol, " ", LotMM, " ", CalcOpenSell(), " ", CalcSlSell(), " ", CalcTpSell());
	         ticket = OrderSend (TradeSymbol, OP_SELLSTOP, LotMM, CalcOpenSell(), Slippage, CalcSlSell(), CalcTpSell(),
	                             "TSD SellStop", MAGICNUM, 0, Red);
	      }
 
	      if ( ticket == -1 )  ReportError ();
	      if ( ticket != 0 )   return(0);
	   } // End of TradesThisSymbol < 1
		
      /////////////////////////////////////////////////
      //  Pending Order Management
      /////////////////////////////////////////////////
      for (i = 0; i < OrdersTotal(); i++) {
         if ( OrderSelect (i, SELECT_BY_POS) == false )  continue;
         if ( OrderSymbol() != TradeSymbol || OrderMagicNumber() != MAGICNUM)  continue;

         if ( OrderType () == OP_BUYSTOP ) {
            if ( Direction != 1 ) {
               MarkTrade();
               OrderDelete ( OrderTicket() );
               return(0);
            }
            if ( iHigh(TradeSymbol, PeriodTrade, 1) < iHigh(TradeSymbol, PeriodTrade, 2) &&
                 ( !CompareDoublesMy (CalcSlBuy(), OrderStopLoss()) ||
                   !CompareDoublesMy (CalcTpBuy(), OrderTakeProfit()) ) ) {
               MarkTrade();
     		      OrderModify (OrderTicket(), CalcOpenBuy(), CalcSlBuy(), CalcTpBuy(), 0, White);
               return(0);
            }
         }

         if ( OrderType () == OP_SELLSTOP ) {
            if ( Direction != -1 ) {
               MarkTrade();
               OrderDelete ( OrderTicket() );
               return(0);
            }
            if ( iLow(TradeSymbol, PeriodTrade, 1) > iLow(TradeSymbol, PeriodTrade, 2) &&
                 ( !CompareDoublesMy (CalcSlSell(), OrderStopLoss()) ||
                   !CompareDoublesMy (CalcTpSell(), OrderTakeProfit()) ) ) {
               MarkTrade();
     		      OrderModify (OrderTicket(), CalcOpenSell(), CalcSlSell(), CalcTpSell(), 0, Gold);
               return(0);
            }
         }
      } // End of Pending Order Management
   } //new day bar
   
   /////////////////////////////////////////////////
   //  Stop Loss Management
   /////////////////////////////////////////////////
   if ( TrailingStop > 0 ) {
      for (i = 0; i < OrdersTotal(); i++) {
         if ( OrderSelect (i, SELECT_BY_POS) == false )  continue;
         if ( OrderSymbol() != TradeSymbol || OrderMagicNumber() != MAGICNUM )  continue;
         if ( TrailStop (i, TrailingStop) )  return(0);
      }
   }

   return(0);
}
//+------------------------------------------------------------------+
/*
double CalcOpenBuy  () { return (dMax (iHigh(TradeSymbol, PeriodTrade, 1) + 1*SPoint + Spread,
                                       Ask + 16*SPoint)); }
double CalcOpenSell () { return (dMin (iLow(TradeSymbol, PeriodTrade, 1) - 1*SPoint,
                                       Bid - 16*SPoint)); }
*/

double CalcOpenBuy() { return (iHigh(TradeSymbol, PeriodTrade, 1) + 1*SPoint + Spread); }
double CalcOpenSell() { return (iLow(TradeSymbol, PeriodTrade, 1) - 1*SPoint); }

double CalcSlBuy() { return (iLow(TradeSymbol, PeriodTrade, 1) - 1*SPoint); }
double CalcSlSell() { return (iHigh(TradeSymbol, PeriodTrade, 1) + 1*SPoint + Spread); }

double CalcTpBuy() {
   double PriceOpen = CalcOpenBuy(), SL = CalcSlBuy();
   return (PriceOpen + dMax(TakeProfit*SPoint, (PriceOpen - SL)*2));
}

double CalcTpSell  () {
   double PriceOpen = CalcOpenSell(), SL = CalcSlSell();
   return (PriceOpen - dMax(TakeProfit*SPoint, (SL - PriceOpen)*2));
}
//+------------------------------------------------------------------+
bool TrailStop (int i, int TrailingStop) {
   double StopLoss;

   if ( OrderType() == OP_BUY ) {
      if ( Bid < OrderOpenPrice () )  return;
      StopLoss = iLow(TradeSymbol, PeriodTrailing, Lowest (TradeSymbol, PeriodTrailing, MODE_LOW, CandlesTrailing+1, 0)) - 1*Point;
      StopLoss = dMin (Bid-TrailingStop*SPoint, StopLoss);
      if ( StopLoss > OrderStopLoss() ) {
         MarkTrade();
         OrderModify (OrderTicket(), OrderOpenPrice(), StopLoss, OrderTakeProfit(), 0, White);
         return(true);
      }
   }
   
   if ( OrderType() == OP_SELL ) {
      if ( Ask > OrderOpenPrice () )  return;
      StopLoss = iHigh(TradeSymbol, PeriodTrailing, Highest (TradeSymbol, PeriodTrailing, MODE_HIGH, CandlesTrailing+1, 0)) + 1*Point
                 + Spread;
      StopLoss = dMax (Ask+TrailingStop*SPoint, StopLoss);
      if ( StopLoss < OrderStopLoss() ) {
         MarkTrade();
         OrderModify (OrderTicket(), OrderOpenPrice(), StopLoss, OrderTakeProfit(), 0, Gold);
         return(true);
      }
   }
}
//+------------------------------------------------------------------+
int Direction (string TradeSymbol, int PeriodDirection, int Mode) {
   double Previous, Previous2;

   if (Mode == DIRECTION_MACD ) {
	   Previous  = iMACD (TradeSymbol, PeriodDirection, 5, 34, 5, PRICE_MEDIAN, MODE_MAIN, 1);
	   Previous2 = iMACD (TradeSymbol, PeriodDirection, 5, 34, 5, PRICE_MEDIAN, MODE_MAIN, 2);
	}
	else {
	   Previous  = iOsMA (TradeSymbol, PeriodDirection, 5, 34, 5, PRICE_MEDIAN, 1);
	   Previous2 = iOsMA (TradeSymbol, PeriodDirection, 5, 34, 5, PRICE_MEDIAN, 2);
	}

   if ( Previous > Previous2 )
      return(1);
   if ( Previous < Previous2 )
      return(-1);
   return(0);
}
//+------------------------------------------------------------------+
string Filter (string TradeSymbol, int PeriodTrade, int Mode, bool &okBuy, bool &okSell) {
   double Value;
   
   okBuy = false; okSell = false;
   
   if (Mode == FILTER_WPR) {
      Value = iWPR(TradeSymbol, PeriodTrade, WilliamsP, 1);
	   if (Value < WilliamsH)  okBuy = true;
   	if (Value > WilliamsL)  okSell = true;
   	return ("iWPR: " + DoubleToStr(Value, 2));
   }
   else if (Mode == FILTER_FORCE) {
      Value = iForce (TradeSymbol, PeriodTrade, ForceP, MODE_EMA, PRICE_CLOSE, 1);
      if (Value < 0)  okBuy = true;
      if (Value > 0)  okSell = true;
   	return ("iForce: " + DoubleToStr(Value, 2));
   }
}
//+------------------------------------------------------------------+
double CalcMM (int MM) {
   double LotMM;

   if ( MM < -1) {
      if ( AccountFreeMargin () < 5 )  return(-1);
		LotMM = MathFloor (AccountBalance()*Leverage/1000);
		if ( LotMM < 1 )  LotMM = 1;
		LotMM = LotMM/100;
   }
	if ( MM == -1 ) {
		if ( AccountFreeMargin() < 50 )  return(-1);
		LotMM = MathFloor(AccountBalance()*Leverage/10000);
		if ( LotMM < 1 )  LotMM = 1;
		LotMM = LotMM/10;
   }
	if ( MM == 0 ) {
		if ( AccountFreeMargin() < MarginChoke ) return(-1); 
		LotMM = Lots;
	}
	if ( MM > 0 ) {
      if ( AccountFreeMargin() < 500 )  return(-1);
		LotMM = MathFloor(AccountBalance()*Leverage/100000);
 		if ( LotMM < 1 )  LotMM = 1;
	}
	if ( LotMM > LotsMax )  LotMM = LotsMax;
	return(LotMM);
}
//+------------------------------------------------------------------+
int TotalTradesThisSymbol (string TradeSymbol) {
   int i, TradesThisSymbol = 0;
   
   for (i = 0; i < OrdersTotal(); i++)
      if ( OrderSelect (i, SELECT_BY_POS) )
         if ( OrderSymbol() == TradeSymbol && OrderMagicNumber() == MAGICNUM)
            TradesThisSymbol++;

   return (TradesThisSymbol);
}

//+------------------------------------------------------------------+
void ReportError () {
   int err = GetLastError();
   Print("Error(",err,"): ", ErrorDescription(err));
}
//+------------------------------------------------------------------+
double dMax (double val1, double val2) {
  if (val1 > val2)  return(val1);
  return(val2);
}
//+------------------------------------------------------------------+
double dMin (double val1, double val2) {
  if (val1 < val2)  return(val1);
  return(val2);
}
//+------------------------------------------------------------------+
void MarkTrade () {
   LastTrade = CurTime();
}

bool CompareDoublesMy(double number1,double number2)
  {
   if( NormalizeDouble(number1,4)-NormalizeDouble(number2,4)==0.0 ) return(true);
   else return(false);
  }

bool IsNewDayBar() {
   if ( TimeDay(Time[0]) != TimeDay(Time[1]) )
      return (true);
   else
      return (false);
}

Profitability Reports

EUR/USD Jul 2025 - Sep 2025
1.41
Total Trades 16
Won Trades 6
Lost trades 10
Win Rate 37.50 %
Expected payoff 6.97
Gross Profit 386.00
Gross Loss -274.50
Total Net Profit 111.50
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
0.65
Total Trades 13
Won Trades 6
Lost trades 7
Win Rate 46.15 %
Expected payoff -5.28
Gross Profit 124.90
Gross Loss -193.50
Total Net Profit -68.60
-100%
-50%
0%
50%
100%
USD/JPY Jan 2025 - Jul 2025
1.12
Total Trades 24
Won Trades 11
Lost trades 13
Win Rate 45.83 %
Expected payoff 2.12
Gross Profit 485.38
Gross Loss -434.57
Total Net Profit 50.81
-100%
-50%
0%
50%
100%
USD/CHF Jan 2025 - Jul 2025
1.00
Total Trades 22
Won Trades 9
Lost trades 13
Win Rate 40.91 %
Expected payoff -0.05
Gross Profit 471.51
Gross Loss -472.57
Total Net Profit -1.06
-100%
-50%
0%
50%
100%
USD/CAD Jan 2025 - Jul 2025
0.70
Total Trades 22
Won Trades 5
Lost trades 17
Win Rate 22.73 %
Expected payoff -6.38
Gross Profit 321.73
Gross Loss -462.06
Total Net Profit -140.33
-100%
-50%
0%
50%
100%
NZD/USD Jan 2025 - Jul 2025
1.15
Total Trades 24
Won Trades 10
Lost trades 14
Win Rate 41.67 %
Expected payoff 1.76
Gross Profit 331.20
Gross Loss -288.90
Total Net Profit 42.30
-100%
-50%
0%
50%
100%
GBP/USD Jan 2025 - Jul 2025
2.29
Total Trades 15
Won Trades 6
Lost trades 9
Win Rate 40.00 %
Expected payoff 23.99
Gross Profit 638.70
Gross Loss -278.80
Total Net Profit 359.90
-100%
-50%
0%
50%
100%
GBP/CAD Jan 2025 - Jul 2025
0.35
Total Trades 26
Won Trades 7
Lost trades 19
Win Rate 26.92 %
Expected payoff -24.08
Gross Profit 337.88
Gross Loss -963.85
Total Net Profit -625.97
-100%
-50%
0%
50%
100%
GBP/AUD Jan 2025 - Jul 2025
0.68
Total Trades 26
Won Trades 5
Lost trades 21
Win Rate 19.23 %
Expected payoff -10.74
Gross Profit 605.77
Gross Loss -885.00
Total Net Profit -279.23
-100%
-50%
0%
50%
100%
AUD/USD Jan 2025 - Jul 2025
0.66
Total Trades 20
Won Trades 8
Lost trades 12
Win Rate 40.00 %
Expected payoff -6.35
Gross Profit 245.40
Gross Loss -372.50
Total Net Profit -127.10
-100%
-50%
0%
50%
100%

Comments