TradersPowerExpert_v1.2

Author: Copyright � 2006, Forex-TSD.com
Profit factor:
0.92
Price Data Components
Series array that contains open time of each bar
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
3 Views
0 Downloads
0 Favorites
TradersPowerExpert_v1.2
//+------------------------------------------------------------------+
//|                                        TradersPowerExpert_v1.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by IgorAD,igorad2003@yahoo.co.uk |   
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |                                      
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"

#include <stdlib.mqh>
//#include <Tracert.mqh>

//---- input parameters
extern string     Expert_Name = "---- TradersPowerExpert_v1 ----";

extern int        Magic=2008;
extern int        Slippage=6;

extern bool       Trace = false;           // Trace Switch

extern string     Main_Parameters = " Trade Volume & Trade Method";
extern double     Lots = 0.1;
extern bool       TrailingStop   = false;     // Trailing Stop Switch   
extern bool       InitialStop    = true;      // Initial Stop Switch
extern int        TimeZone       = 0;   

extern string     Data = " Input Data ";
extern int        TradersPeriod  = 4; 
extern double     BuyPercent     = 70;      // Percent from Daily Range for BUY 	
extern double     SellPercent    = 70;      // Percent from Daily Range for SELL
extern double     StopPercent    = 50;      // Percent from Daily Range for StopLoss
extern int        TradePeriod    = 5;       // Max days in trade 
extern double     BreakEven      = 0;       // BreakEven Level in pips
extern double     BreakEvenGap   = 0;       // Pips when BreakEven will be reached

extern string     Trade   =  " Trade Days of Week";
extern int        Monday         = 1;      // Day of the Week for Trade
extern int        Tuesday        = 1;
extern int        Wednesday      = 1;
extern int        Thursday       = 1;
extern int        Friday         = 1;

extern string     MM_Parameters = " MoneyManagement by L.Williams ";
extern bool       MM=false;                 // ÌÌ Switch
extern double     MMRisk=0.15;              // Risk Factor
extern double     LossMax=1000;             // Maximum Loss by 1 Lot


int      i,k,cnt=0, ticket, mode=0, digit=0, wenum=0, OrderOpenDay, Kz;
double   high,low, close[], open, range, Bulls,Bears,
         AvgBulls,AvgBears, SumBulls,SumBears,TodayOpen,spread=0, Profit=0;
double   smin=0, smax=0, BuyStop=0, SellStop=0, Lotsi=0, rates_h1[][6];
bool     BuyInTrade=false, SellInTrade=false;
datetime StartTime, prevwe=0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 

//----
   return(0);
  }
// ---- Money Management
double MoneyManagement ( bool flag, double Lots, double risk, double maxloss)
{
   double Lotsi=Lots;
	    
   if ( flag ) Lotsi=NormalizeDouble(Lots*AccountFreeMargin()*risk/maxloss,1);   
     
   if (Lotsi<0.1) Lotsi=0.1;  
   return(Lotsi);
}   

// Closing of Pending Orders      
void PendOrdDel()
{
    int total=OrdersTotal();
    for (int cnt=total-1;cnt>=0;cnt--)
    { 
      OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES);   
      
        if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic  )     
        {
        int mode=OrderType();
        
        bool result = false;
          switch(mode)
          {
            
            case OP_BUYSTOP   : {result = OrderDelete( OrderTicket() ); Print(" PendBUY"); }
          
            case OP_SELLSTOP  : {result = OrderDelete( OrderTicket() ); Print(" PendSELL"); }
          if(!result)
            {
            Print("OrderSend failed with error #",GetLastError());
            return(0);
            }
          //Print(" cnt=",cnt, " total=",total," MODE = ",mode," Ticket=",OrderTicket()  );                       
          }
         }
      } 
  return;
  }    

// 

void CloseOrdbyTime()
{
     int total=OrdersTotal();
     
     for (cnt=0;cnt<total;cnt++)
     { 
        OrderSelect(cnt, SELECT_BY_POS);   
        mode=OrderType();
        if ( mode <= OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        { 
          datetime OpenTime=StrToTime(TimeToStr(OrderOpenTime(),TIME_DATE));
          datetime CurnTime=StrToTime(TimeToStr(CurTime(),TIME_DATE)); 
          int weekday=TimeDayOfWeek(OrderOpenTime());
          if (weekday <=5 && DayOfWeek()==1 && CurnTime > prevwe && CurnTime > OpenTime) {wenum =wenum + 1; prevwe = CurnTime;}      
          //if (OrderOpenDay <= 5 && DayOfWeek()>0) 
          int CalcBars=TradePeriod+2*wenum; 
          //else CalcBars=TradePeriod;
         
            if ((CurTime()-OpenTime)>=PERIOD_D1*CalcBars*60 || OrderProfit()>0)
            {
              if (mode==OP_BUY )
			     OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow);
			     if (mode==OP_SELL)
			     OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
            }
        }
    }

}       
 
// ---- 
void TrailStops()
{        
    int total=OrdersTotal();
    for (cnt=0;cnt<total;cnt++)
    { 
     OrderSelect(cnt, SELECT_BY_POS);   
     mode=OrderType();    
        if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic ) 
        {
            if ( mode==OP_BUY && smin > OrderStopLoss() )
            {
            Profit=0;
			   OrderModify(OrderTicket(),OrderOpenPrice(),smin,Profit,0,LightGreen);
			   return(0);
            }
           if ( mode==OP_SELL && smax < OrderStopLoss())
            {
            Profit=0;
   		   OrderModify(OrderTicket(),OrderOpenPrice(),smax,Profit,0,Yellow);	    
            return(0);
            }    
        }
    }   
} 

void SellOrdOpen()
{		     

		  double SellPrice=TodayOpen - AvgBears * SellPercent/100.0 - spread;
		  
		  if (InitialStop) SellStop=SellPrice + StopPercent*AvgBears/100.0; else SellStop=0;
        Profit=0;
	       
		  ticket = OrderSend(Symbol(),OP_SELLSTOP,Lotsi,
		                     NormalizeDouble(SellPrice,digit),
		                     Slippage,
		                     NormalizeDouble(SellStop,digit),
		                     Profit,"SELL",Magic,0,Red);
    

        OrderOpenDay  = DayOfWeek();   
        
        SellInTrade=false;            
        Kz=1;     
            if(ticket<0)
            {
            Print("OrderSend failed with error #",GetLastError());
            return(0);
            }
}

void BuyOrdOpen()
{		     

		  double BuyPrice =TodayOpen + AvgBulls*BuyPercent/100.0  + spread;
		  if (InitialStop) BuyStop = BuyPrice - StopPercent*AvgBulls/100.0; else BuyStop=0;
        Profit=0;
		 
		  ticket = OrderSend(Symbol(),OP_BUYSTOP ,Lotsi,
		                     NormalizeDouble(BuyPrice ,digit),
		                     Slippage,
		                     NormalizeDouble(BuyStop ,digit),
		                     Profit,"BUY",Magic,0,Blue);
                
        
        OrderOpenDay  = DayOfWeek();
        BuyInTrade=false;            
        Kz=1;    
            if(ticket<0)
            {
            Print("OrderSend failed with error #",GetLastError());
            return(0);
            }
}      

void ExtraOrdDel()
{
    int total = OrdersTotal();
    for (cnt=0;cnt<total;cnt++)
    { 
      OrderSelect(cnt, SELECT_BY_POS);   
      mode=OrderType();
        if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic )     
        {
            if (mode==OP_BUY  && !BuyInTrade ) BuyInTrade =true;
            if (mode==OP_SELL && !SellInTrade) SellInTrade=true;
            
            if (mode == OP_SELLSTOP && BuyInTrade )
            { OrderDelete(OrderTicket()); SellInTrade=false; Print(" ExtraSell"); }
            if (mode == OP_BUYSTOP && SellInTrade )
            { OrderDelete(OrderTicket()); BuyInTrade=false; Print(" ExtraBuy"); }
    
	     }
	 }        
}

// ---- Scan Trades
int ScanTrades()
{   
   int total = OrdersTotal();
   int numords = 0;
      
   for(cnt=0; cnt<total; cnt++) 
   {        
   OrderSelect(cnt, SELECT_BY_POS);            
   if(OrderSymbol() == Symbol() && OrderType()>=OP_BUY && OrderMagicNumber() == Magic) 
   numords++;
   }
   return(numords);
}

datetime OrderOpenDate()
{
   int total = OrdersTotal();
   datetime date;
   for(cnt=0; cnt<total; cnt++) 
   {        
   OrderSelect(cnt, SELECT_BY_POS);            
   if(OrderSymbol() == Symbol() && OrderType()>=OP_BUY && OrderMagicNumber() == Magic) 
   date = StrToTime(TimeToStr(OrderOpenTime(),TIME_DATE));
   }
   return(date);
}  

void BreakEvenStop()
{        
   
    for (cnt=0;cnt<OrdersTotal();cnt++)
    { 
     OrderSelect(cnt, SELECT_BY_POS);   
     int mode=OrderType();    
        if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) 
        {
            if ( mode==OP_BUY )
            {
               if ( Bid-OrderOpenPrice() > 0 ) 
               {Kz = MathFloor((Bid-OrderOpenPrice())/(BreakEven*Point));
                if (Kz < 1) Kz=1;} 
			         else Kz = 1;
			       // Print(" Buy Kz=",Kz); 
               //BuyStop = OrderStopLoss();
			         if (Bid-OrderOpenPrice() > Kz*BreakEven*Point) 
			            {
			            BuyStop=OrderOpenPrice()+((Kz-1)*BreakEven+BreakEvenGap)*Point;
			            
			            OrderModify(OrderTicket(),OrderOpenPrice(),
			                        NormalizeDouble(BuyStop, digit),
			                        OrderTakeProfit(),0,LightBlue);
			            
			            //Kz=Kz+1;
			            return(0);
			            }
			      
			   }
            if ( mode==OP_SELL )
            {
               if ( OrderOpenPrice()-Ask > 0 ) 
               {Kz = MathFloor((OrderOpenPrice()-Ask)/(BreakEven*Point));
                if (Kz < 1) Kz=1;}  
			         else Kz = 1;
			        // Print(" Sell Kz=",Kz);
               //SellStop = OrderStopLoss();
                  if (OrderOpenPrice()-Ask > Kz*BreakEven*Point) 
			            {
			            SellStop=OrderOpenPrice()-((Kz-1)*BreakEven+BreakEvenGap)*Point;
			            
			            OrderModify(OrderTicket(),OrderOpenPrice(),
			                        NormalizeDouble(SellStop, digit),
			                        OrderTakeProfit(),0,Orange);
			            
			            //DrawStops("SellStop",SellStop,Orange);
			            //Kz=Kz+1;
			            return(0);
			            }
               
            }
        }   
    } 
}	                    
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if(Bars < 1) {Print("Not enough bars for this strategy"); return(0);}
  
   //if ( Trace ) SetTrace();
  
   string   TimeTrade = "00:00";
   StartTime  = StrToTime(TimeTrade) + TimeZone*3600;
  
   if(Hour() >= TimeZone && Hour() <= TimeZone+1)
   {
     if ( OrderOpenDate() < StrToTime(TimeToStr( StartTime,TIME_DATE))) 
     { PendOrdDel(); if( TradePeriod > 0 )CloseOrdbyTime(); }
        if(ScanTrades()<1)
        {
      
         spread= MarketInfo(Symbol(),MODE_SPREAD)*Point;
         digit  = MarketInfo(Symbol(),MODE_DIGITS);
         Lotsi = MoneyManagement ( MM, Lots, MMRisk, LossMax);
         if (TrailingStop) InitialStop=true; 
   
         ArrayCopyRates(rates_h1, Symbol(), PERIOD_H1);
         TodayOpen = rates_h1[0][1];
         SumBulls=0;SumBears=0;
            for (k=TradersPeriod;k>=1;k--)
            {
            open = rates_h1[k*24][1];
            high=0; low=10000000;
               for (i=24;i>=1;i--)
               {
               high = MathMax( high, rates_h1[i+(k-1)*24][3]);
               low  = MathMin( low , rates_h1[i+(k-1)*24][2]);      
               
               }   
               
            range =(high-low); 
            Bulls = high - open;
            Bears = open - low;
            SumBulls += Bulls;
            SumBears += Bears; 
            //Print(" Bulls=",high,"Bears=",low);
            }
      
         AvgBulls = SumBulls/TradersPeriod;
         AvgBears = SumBears/TradersPeriod;
         //Print(" high=",AvgBulls,"low=",AvgBears);
         smin = Bid - StopPercent*AvgBears/100.0;
         smax = Ask + StopPercent*AvgBulls/100.0;
      
   
         if ( Monday   == 1 ) if(DayOfWeek()==1){BuyOrdOpen(); SellOrdOpen();}
         if ( Tuesday  == 1 ) if(DayOfWeek()==2){BuyOrdOpen(); SellOrdOpen();}
         if ( Wednesday== 1 ) if(DayOfWeek()==3){BuyOrdOpen(); SellOrdOpen();} 
         if ( Thursday == 1 ) if(DayOfWeek()==4){BuyOrdOpen(); SellOrdOpen();} 
         if ( Friday   == 1 ) if(DayOfWeek()==5){BuyOrdOpen(); SellOrdOpen();}
        }
      
    }
   ExtraOrdDel();
   if (BreakEven > 0) BreakEvenStop(); 
   if (TrailingStop) TrailStops(); 
 return(0);
}//int start
//+------------------------------------------------------------------+





Profitability Reports

USD/JPY Jul 2025 - Sep 2025
1.07
Total Trades 54
Won Trades 21
Lost trades 33
Win Rate 38.89 %
Expected payoff 0.83
Gross Profit 650.93
Gross Loss -606.14
Total Net Profit 44.79
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
0.74
Total Trades 58
Won Trades 17
Lost trades 41
Win Rate 29.31 %
Expected payoff -2.79
Gross Profit 451.75
Gross Loss -613.72
Total Net Profit -161.97
-100%
-50%
0%
50%
100%
USD/CAD Jul 2025 - Sep 2025
0.98
Total Trades 54
Won Trades 17
Lost trades 37
Win Rate 31.48 %
Expected payoff -0.17
Gross Profit 369.24
Gross Loss -378.48
Total Net Profit -9.24
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
0.64
Total Trades 55
Won Trades 13
Lost trades 42
Win Rate 23.64 %
Expected payoff -2.91
Gross Profit 279.80
Gross Loss -440.10
Total Net Profit -160.30
-100%
-50%
0%
50%
100%
GBP/USD Jul 2025 - Sep 2025
1.31
Total Trades 53
Won Trades 20
Lost trades 33
Win Rate 37.74 %
Expected payoff 3.56
Gross Profit 790.70
Gross Loss -602.20
Total Net Profit 188.50
-100%
-50%
0%
50%
100%
EUR/USD Jul 2025 - Sep 2025
0.33
Total Trades 143
Won Trades 17
Lost trades 126
Win Rate 11.89 %
Expected payoff -8.13
Gross Profit 577.80
Gross Loss -1740.40
Total Net Profit -1162.60
-100%
-50%
0%
50%
100%
USD/CHF Jan 2025 - Jul 2025
1.13
Total Trades 141
Won Trades 44
Lost trades 97
Win Rate 31.21 %
Expected payoff 1.56
Gross Profit 1866.11
Gross Loss -1645.99
Total Net Profit 220.12
-100%
-50%
0%
50%
100%
USD/CAD Jan 2025 - Jul 2025
0.69
Total Trades 127
Won Trades 30
Lost trades 97
Win Rate 23.62 %
Expected payoff -2.94
Gross Profit 818.48
Gross Loss -1191.40
Total Net Profit -372.92
-100%
-50%
0%
50%
100%
NZD/USD Jan 2025 - Jul 2025
0.62
Total Trades 126
Won Trades 30
Lost trades 96
Win Rate 23.81 %
Expected payoff -3.66
Gross Profit 745.10
Gross Loss -1205.80
Total Net Profit -460.70
-100%
-50%
0%
50%
100%
GBP/USD Jan 2025 - Jul 2025
0.93
Total Trades 123
Won Trades 38
Lost trades 85
Win Rate 30.89 %
Expected payoff -0.93
Gross Profit 1628.00
Gross Loss -1742.00
Total Net Profit -114.00
-100%
-50%
0%
50%
100%

Comments