3 Bar Reversal

Author: Copyright � 2007, fxid10t@yahoo.com
Profit factor:
0.94
Price Data Components
Series array that contains close prices for each barSeries 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 ordersIt automatically opens orders when conditions are reached
13 Views
0 Downloads
0 Favorites
3 Bar Reversal
//+------------------------------------------------------------------+
//| 3 Bar Reversal.mq4
//| Copyright © 2007, fxid10t@yahoo.com
//| "Gordon Gibson" <gibsonmail@shaw.ca> 
//+------------------------------------------------------------------+

#property copyright "Copyright © 2007, fxid10t@yahoo.com"
#property link      "Gordon Gibson <gibsonmail@shaw.ca> "
#include <stdlib.mqh>

extern double Lots=0.1;

string pairs[] = { "EURUSDm","USDJPYm","GBPUSDm","USDCHFm","EURCHFm","AUDUSDm","USDCADm",
                   "NZDUSDm","EURGBPm","EURJPYm","GBPJPYm","CHFJPYm","GBPCHFm","EURAUDm",
                   "EURCADm","AUDCADm","AUDJPYm","NZDJPYm","AUDNZDm" };
int periods[] = { 1,5,15,30,60,240,1440,10080,43200 };

string TradeSymbol, CommentHeader, CommentsPairs[];
int      TradePeriod,MagicNumber;
int      Pair = -1;
int      PPeriod = -1;
double   bid,ask,point,spread,ticket,bSL,sSL,btp,stp;
int b1,s1;

//initialize
int init(){
   if ( IsTesting() ) { if ( ArrayResize(pairs,1) != 0 )  pairs[0] = Symbol();   } 
   if ( IsTesting() ) { if ( ArrayResize(periods,1) != 0 )  periods[0] = Period(); }
return(0);  }
//deinitialize
int deinit()   {return(0);}

int start() {
b1=0;s1=0;
//Select Pair from Array
Pair = (Pair+1) % ArraySize(pairs);
TradeSymbol = pairs[Pair];
//Identify ibfx mini trade symbol
if(iClose(TradeSymbol,1440,0)==0) { TradeSymbol=StringSubstr(TradeSymbol,0,6);  }

//TradeSymbol MagicNumber Assignment
if (TradeSymbol=="AUDCADm" || TradeSymbol=="AUDCAD") {MagicNumber=200001;}
if (TradeSymbol=="AUDJPYm" || TradeSymbol=="AUDJPY") {MagicNumber=200002;}
if (TradeSymbol=="AUDNZDm" || TradeSymbol=="AUDNZD") {MagicNumber=200003;}
if (TradeSymbol=="AUDUSDm" || TradeSymbol=="AUDUSD") {MagicNumber=200004;}
if (TradeSymbol=="CHFJPYm" || TradeSymbol=="CHFJPY") {MagicNumber=200005;}
if (TradeSymbol=="EURAUDm" || TradeSymbol=="EURAUD") {MagicNumber=200006;}
if (TradeSymbol=="EURCADm" || TradeSymbol=="EURCAD") {MagicNumber=200007;}
if (TradeSymbol=="EURCHFm" || TradeSymbol=="EURCHF") {MagicNumber=200008;}
if (TradeSymbol=="EURGBPm" || TradeSymbol=="EURGBP") {MagicNumber=200009;}
if (TradeSymbol=="EURJPYm" || TradeSymbol=="EURJPY") {MagicNumber=200010;}
if (TradeSymbol=="EURUSDm" || TradeSymbol=="EURUSD") {MagicNumber=200011;}
if (TradeSymbol=="GBPCHFm" || TradeSymbol=="GBPCHF") {MagicNumber=200012;}   
if (TradeSymbol=="GBPJPYm" || TradeSymbol=="GBPJPY") {MagicNumber=200013;}
if (TradeSymbol=="GBPUSDm" || TradeSymbol=="GBPUSD") {MagicNumber=200014;}
if (TradeSymbol=="NZDJPYm" || TradeSymbol=="NZDJPY") {MagicNumber=200015;}
if (TradeSymbol=="NZDUSDm" || TradeSymbol=="NZDUSD") {MagicNumber=200016;}
if (TradeSymbol=="USDCHFm" || TradeSymbol=="USDCHF") {MagicNumber=200017;}
if (TradeSymbol=="USDJPYm" || TradeSymbol=="USDJPY") {MagicNumber=200018;}
if (TradeSymbol=="USDCADm" || TradeSymbol=="USDCAD") {MagicNumber=200019;}
if (MagicNumber==0) {MagicNumber = 200999;}  

//Assign Symbol Bid/Ask, Point & Spread values
bid=MarketInfo(TradeSymbol,MODE_BID);
ask=MarketInfo(TradeSymbol,MODE_ASK);
point=MarketInfo(TradeSymbol,MODE_POINT);
spread=MarketInfo(TradeSymbol,MODE_SPREAD); 
if(IsTesting()) { if(spread > 13*point) {spread=13*point;}}

//Pair Chart Period Setup check loop
/*for(int p=0;p<9;p++) {
      PPeriod = (PPeriod+1) % ArraySize(periods);
      TradePeriod = periods[PPeriod]; */
      TradePeriod = Period();
//Orders counter
int cnt,total=OrdersTotal();
if(TotalTradesThisSymbol(TradeSymbol)==0) {  b1=0;s1=0;   }
if(TotalTradesThisSymbol(TradeSymbol)>0)  {
   for(cnt=0;cnt<total;cnt++) {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==TradeSymbol) {
      if(OrderComment()==StringConcatenate(TradeSymbol," ",TradePeriod," 3BR Long") )  {b1=OrderTicket(); }
      if(OrderComment()==StringConcatenate(TradeSymbol," ",TradePeriod," 3BR Short") )  {s1=OrderTicket(); }
      }  }  }

//Buy Setup   
   if(   iHigh(TradeSymbol,TradePeriod,5)<iHigh(TradeSymbol,TradePeriod,4) &&
         iHigh(TradeSymbol,TradePeriod,4)<iHigh(TradeSymbol,TradePeriod,3) &&//3 is swing high
         iHigh(TradeSymbol,TradePeriod,3)>iHigh(TradeSymbol,TradePeriod,2) &&
         iHigh(TradeSymbol,TradePeriod,2)>iHigh(TradeSymbol,TradePeriod,1) )  {
//modify open buystop order
      if(OrderSelect(b1,SELECT_BY_TICKET)==true && OrderType()==OP_BUYSTOP)   {
         if(iHigh(TradeSymbol,TradePeriod,3)+spread < OrderOpenPrice()) {
         OrderModify(b1,iHigh(TradeSymbol,TradePeriod,3)+spread,//swing high
                     OrderStopLoss(),OrderTakeProfit(),OrderExpiration(),Orchid);   }  }
//sell order modify initial/trailing stoploss
      if(OrderSelect(s1,SELECT_BY_TICKET)==true && OrderType()==OP_SELL)   {
         if( (iHigh(TradeSymbol,TradePeriod,3)+spread+(1*point) < OrderStopLoss() &&
              iHigh(TradeSymbol,TradePeriod,3)+spread+(1*point) < OrderOpenPrice() ) ||
            OrderStopLoss()==0)  {
         OrderModify(s1,OrderOpenPrice(),iHigh(TradeSymbol,TradePeriod,3)+spread+(1*point),//swing high
                     OrderTakeProfit(),OrderExpiration(),LightSalmon);  }  }  
//Buy Execution
      if(b1==0)   {
         ticket=OrderSend(TradeSymbol,
                          OP_BUYSTOP,
                          Lots,
                          iHigh(TradeSymbol,TradePeriod,3)+spread,//swing high
                          0,//slippage
                          0,//stoploss set when stop order is executed
                          0,//no tp defined
                          StringConcatenate(TradeSymbol," ",TradePeriod," 3BR Long"),
                          MagicNumber,
                          0,//time expire,
                          Aqua);
                          if(ticket>0)   {
                              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  {Print(ticket);}
                              else Print("Error Opening BuyStop Order: ",GetLastError());
                          return(0);   }}
}
//Sell Setup
   if(   iLow(TradeSymbol,TradePeriod,5)>iLow(TradeSymbol,TradePeriod,4) &&
         iLow(TradeSymbol,TradePeriod,4)>iLow(TradeSymbol,TradePeriod,3) &&//3 is swing low
         iLow(TradeSymbol,TradePeriod,3)<iLow(TradeSymbol,TradePeriod,2) &&
         iLow(TradeSymbol,TradePeriod,2)<iLow(TradeSymbol,TradePeriod,1) )  {
//modify open sellstop order
      if(OrderSelect(s1,SELECT_BY_TICKET)==true && OrderType()==OP_SELLSTOP)  {
         if(iLow(TradeSymbol,TradePeriod,3)-spread > OrderOpenPrice())  {
         OrderModify(s1,iLow(TradeSymbol,TradePeriod,3)-spread,//swing low
                     OrderStopLoss(),OrderTakeProfit(),OrderExpiration(),HotPink);  }  }
//buy order modify initial/trailing stoploss
      if(OrderSelect(b1,SELECT_BY_TICKET)==true && OrderType()==OP_BUY)  {
         if( (iLow(TradeSymbol,TradePeriod,3)-spread-(1*point) > OrderStopLoss() &&
              iLow(TradeSymbol,TradePeriod,3)-spread-(1*point) > OrderOpenPrice() ) ||
         OrderStopLoss()==0)   {
         OrderModify(b1,OrderOpenPrice(),iLow(TradeSymbol,TradePeriod,3)-spread-(1*point),//swing low
                     OrderTakeProfit(),OrderExpiration(),Orchid); }  }  
//Sell Execution
      if(s1==0)   {
         ticket=OrderSend(TradeSymbol,
                          OP_SELLSTOP,
                          Lots,
                          iLow(TradeSymbol,TradePeriod,3)-spread,//3 is swing low
                          0,//slippage
                          0,//stoploss set when stop order is executed
                          0,//no tp defined
                          StringConcatenate(TradeSymbol," ",TradePeriod," 3BR Short"),
                          MagicNumber,
                          0,//time expire,
                          HotPink);
                          if(ticket>0)   {
                              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))   {Print(ticket);}
                              else Print("Error Opening SellStop Order: ",GetLastError());
                          return(0);   }}
}
//   }//end period loop
return(0);}//end start()
//+------------------------------------------------------------------+
int TotalTradesThisSymbol(string TradeSymbol) {
   int i, TradesThisSymbol=0;
   for(i=0;i<OrdersTotal();i++)  {
      OrderSelect(i,SELECT_BY_POS);
      if(OrderSymbol()==TradeSymbol &&
         OrderComment()==StringConcatenate(TradeSymbol," ",TradePeriod," 3BR Long") ||
         OrderComment()==StringConcatenate(TradeSymbol," ",TradePeriod," 3BR Short"))   
         {  TradesThisSymbol++;  }   }
return(TradesThisSymbol);  }//end TotalTradesThisSymbol

Profitability Reports

USD/CAD Jul 2025 - Sep 2025
1.28
Total Trades 40
Won Trades 20
Lost trades 20
Win Rate 50.00 %
Expected payoff 2.80
Gross Profit 511.43
Gross Loss -399.27
Total Net Profit 112.16
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
0.74
Total Trades 47
Won Trades 20
Lost trades 27
Win Rate 42.55 %
Expected payoff -4.16
Gross Profit 546.70
Gross Loss -742.20
Total Net Profit -195.50
-100%
-50%
0%
50%
100%
GBP/USD Jul 2025 - Sep 2025
2.09
Total Trades 41
Won Trades 21
Lost trades 20
Win Rate 51.22 %
Expected payoff 19.75
Gross Profit 1554.30
Gross Loss -744.50
Total Net Profit 809.80
-100%
-50%
0%
50%
100%
GBP/CAD Jul 2025 - Sep 2025
0.95
Total Trades 52
Won Trades 21
Lost trades 31
Win Rate 40.38 %
Expected payoff -0.97
Gross Profit 922.28
Gross Loss -972.74
Total Net Profit -50.46
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
1.20
Total Trades 45
Won Trades 18
Lost trades 27
Win Rate 40.00 %
Expected payoff 3.68
Gross Profit 1013.28
Gross Loss -847.57
Total Net Profit 165.71
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
1.00
Total Trades 41
Won Trades 20
Lost trades 21
Win Rate 48.78 %
Expected payoff 0.00
Gross Profit 544.50
Gross Loss -544.60
Total Net Profit -0.10
-100%
-50%
0%
50%
100%
USD/JPY Jan 2025 - Jul 2025
0.87
Total Trades 105
Won Trades 42
Lost trades 63
Win Rate 40.00 %
Expected payoff -3.81
Gross Profit 2644.86
Gross Loss -3045.14
Total Net Profit -400.28
-100%
-50%
0%
50%
100%
USD/CHF Jan 2025 - Jul 2025
0.63
Total Trades 114
Won Trades 43
Lost trades 71
Win Rate 37.72 %
Expected payoff -10.53
Gross Profit 2011.41
Gross Loss -3211.71
Total Net Profit -1200.30
-100%
-50%
0%
50%
100%
USD/CAD Jan 2025 - Jul 2025
0.96
Total Trades 104
Won Trades 49
Lost trades 55
Win Rate 47.12 %
Expected payoff -0.80
Gross Profit 1767.73
Gross Loss -1850.62
Total Net Profit -82.89
-100%
-50%
0%
50%
100%
NZD/USD Jan 2025 - Jul 2025
1.17
Total Trades 99
Won Trades 45
Lost trades 54
Win Rate 45.45 %
Expected payoff 2.63
Gross Profit 1792.40
Gross Loss -1532.00
Total Net Profit 260.40
-100%
-50%
0%
50%
100%

Comments