HTH





//+------------------------------------------------------------------+
//|                                                          HTH.mq4 |
//|                                                             c0d3 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "c0d3"
#property link      ""

extern bool trade=true;
extern string C1="EURUSD";
extern string C2="USDCHF";
extern string C3="GBPUSD";
extern string C4="AUDUSD";
extern bool show_profit=true;
extern bool enable_profit=false;
extern bool enable_loss=false;
extern bool enable_emergency_trading=true;
extern int emergency_loss=60;
extern int profit=80;
extern int loss=40;
extern int MagicNumber1=243;
extern int MagicNumber2=244;
extern int MagicNumber3=245;
extern int MagicNumber4=256;
extern int E_MagicNumber=257;
extern double lot=0.01;


void verifyorder(string symbol, int MN, string direction)//function which is used to verify that the orders have been placed
{
Sleep(1000);
int ord_cnt=OrdersTotal();
for (int start=0;start<ord_cnt;start++)   
   {
      OrderSelect(start, SELECT_BY_POS, MODE_TRADES);
      if(OrderMagicNumber()==MN)
         {return;}
   }
if(direction=="LONG"){OrderSend(symbol,OP_BUY,lot,MarketInfo(symbol,MODE_ASK),3,0,0,"Hedge"+symbol,MN);}
if(direction=="SHORT"){OrderSend(symbol,OP_SELL,lot,MarketInfo(symbol,MODE_BID),3,0,0,"Hedge"+symbol,MN);}   
return;
}


void closeorders()
   {
      int close_ord1=OrdersTotal();
         for (int qe1=0;qe1<close_ord1;qe1++)
            {
               OrderSelect(qe1, SELECT_BY_POS, MODE_TRADES);
                 if( OrderMagicNumber()==MagicNumber1  || 
                     OrderMagicNumber()==MagicNumber2  || 
                     OrderMagicNumber()==MagicNumber3  || 
                     OrderMagicNumber()==E_MagicNumber || 
                     OrderMagicNumber()==MagicNumber4)
                     {
                     if(OrderType()==OP_BUY) {RefreshRates();OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3);Sleep(2000);}
                     if(OrderType()==OP_SELL){RefreshRates();OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3);Sleep(2000);}
                     }
            }
   closeordersverify();         
   return;         
   }
   
   
void closeordersverify()
   {
      int close_ord11=OrdersTotal();
         for (int qe11=0;qe11<close_ord11;qe11++)
            {
               OrderSelect(qe11, SELECT_BY_POS, MODE_TRADES);
                 if( OrderMagicNumber()==MagicNumber1  || 
                     OrderMagicNumber()==MagicNumber2  || 
                     OrderMagicNumber()==MagicNumber3  || 
                     OrderMagicNumber()==E_MagicNumber || 
                     OrderMagicNumber()==MagicNumber4)
                     {closeorders();}
                     //if(OrderType()==OP_BUY) {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3);Sleep(2000);}
                     //if(OrderType()==OP_SELL){OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3);Sleep(2000);}
            }
   return;         
   }   
   


void doubleorders()
   {
      int ord_t=OrdersTotal();
         for (int y=0;y<ord_t;y++)
            {
            OrderSelect(y, SELECT_BY_POS, MODE_TRADES);
                              if(OrderMagicNumber()==MagicNumber1 || 
                                 OrderMagicNumber()==MagicNumber2 || 
                                 OrderMagicNumber()==MagicNumber3 || 
                                 OrderMagicNumber()==MagicNumber4)
                                    {
                                       if(OrderProfit()>0)
                                          {
                                             if(OrderType()==OP_BUY) {OrderSend(OrderSymbol(),OP_BUY,OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3,0,0,"Emergency Double",E_MagicNumber);}
                                             if(OrderType()==OP_SELL){OrderSend(OrderSymbol(),OP_SELL,OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,0,0,"Emergency Double",E_MagicNumber);}
                                          }
                                    }
            }
   enable_emergency_trading=false;         
   }

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----(100 * Close[0] / iClose(NULL,PERIOD_D1,1)) - 100
double d_c1,d_c2,d_c3,d_c4,d_c11,d_c22,d_c33,d_c44;
d_c1=(100*iClose(C1,NULL,0)/iClose(C1,PERIOD_D1,1))-100;
d_c2=(100*iClose(C2,NULL,0)/iClose(C2,PERIOD_D1,1))-100;
d_c3=(100*iClose(C3,NULL,0)/iClose(C3,PERIOD_D1,1))-100;
d_c4=(100*iClose(C4,NULL,0)/iClose(C4,PERIOD_D1,1))-100;

d_c11=(100*iClose(C1,PERIOD_D1,1)/iClose(C1,PERIOD_D1,2))-100;
d_c22=(100*iClose(C2,PERIOD_D1,1)/iClose(C2,PERIOD_D1,2))-100;
d_c33=(100*iClose(C3,PERIOD_D1,1)/iClose(C3,PERIOD_D1,2))-100;
d_c44=(100*iClose(C4,PERIOD_D1,1)/iClose(C4,PERIOD_D1,2))-100;

//check for profit in PIP, and close if the goal is reached
if(show_profit==true)
   {
   double profit1,profit2,profit3,profit4;
   int totalprofit;
   int profitcheck=OrdersTotal();
      for (int tr=0;tr<profitcheck;tr++)
         {
         OrderSelect(tr, SELECT_BY_POS, MODE_TRADES);
            if(OrderMagicNumber()==MagicNumber1)
               {
               if(OrderType()==OP_BUY) {profit1=(MarketInfo(OrderSymbol(),MODE_BID)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);}
               if(OrderType()==OP_SELL){profit1=(OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_ASK))/MarketInfo(OrderSymbol(),MODE_POINT);}
               }
               
            if(OrderMagicNumber()==MagicNumber2)
               {
               if(OrderType()==OP_BUY) {profit2=(MarketInfo(OrderSymbol(),MODE_BID)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);}
               if(OrderType()==OP_SELL){profit2=(OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_ASK))/MarketInfo(OrderSymbol(),MODE_POINT);}
               } 
                 
            if(OrderMagicNumber()==MagicNumber3)
               {
               if(OrderType()==OP_BUY) {profit3=(MarketInfo(OrderSymbol(),MODE_BID)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);}
               if(OrderType()==OP_SELL){profit3=(OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_ASK))/MarketInfo(OrderSymbol(),MODE_POINT);}
               }
               
            if(OrderMagicNumber()==MagicNumber4)
               {
               if(OrderType()==OP_BUY) {profit4=(MarketInfo(OrderSymbol(),MODE_BID)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);}
               if(OrderType()==OP_SELL){profit4=(OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_ASK))/MarketInfo(OrderSymbol(),MODE_POINT);}
               } 
             
             //check profit of emergency trades
             int u_orders=OrdersTotal();
             double e_profit=0;
             for (int h=0;h<=u_orders;h++)  
               {
                 OrderSelect(h, SELECT_BY_POS, MODE_TRADES);
                   if(OrderMagicNumber()==E_MagicNumber)
                     {
                       if(OrderType()==OP_BUY) {e_profit+=(MarketInfo(OrderSymbol(),MODE_BID)-OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT);}
                       if(OrderType()==OP_SELL){e_profit+=(OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_ASK))/MarketInfo(OrderSymbol(),MODE_POINT);}
                      }
               } 
                    
         }
         totalprofit=profit1+profit2+profit3+profit4+e_profit;
         if(enable_emergency_trading==true && totalprofit<=-emergency_loss){doubleorders();}
         if(enable_profit==true && totalprofit>=profit){closeorders();}
         if(enable_loss==true && totalprofit<=-loss){closeorders();}
   }
//end check for profit



Comment("\n",
C1+" Deviation: "+d_c1+" | Previous Deviation: "+d_c11,
"\n",C2+" Deviation: "+d_c2+" | Previous Deviation: "+d_c22,
"\n",C3+" Deviation: "+d_c3+" | Previous Deviation: "+d_c33,
"\n",C4+" Deviation: "+d_c4+" | Previous Deviation: "+d_c44,
"\n",
"\n",C1+"   "+C2+" Pair Deviation: "+(d_c1+d_c2),
"\n",C1+"   "+C3+" Pair Deviation: "+(d_c1-d_c3),
"\n",C1+"   "+C4+" Pair Deviation: "+(d_c1-d_c4),
"\n",C2+"   "+C3+" Pair Deviation: "+(d_c2+d_c3),
"\n",C3+"   "+C4+" Pair Deviation: "+(d_c3-d_c4),
"\n",C2+"   "+C4+" Pair Deviation: "+(d_c2+d_c4),
"\n",
"\n",C1+"/"+C2+" vs. "+C3+"/"+C4+" Pair Deviation: "+((d_c1+d_c2)+(d_c3-d_c4)),
"\n","PIP Profit: "+totalprofit ); 


//close orders after one Day
if(Hour()>=23)
   {
      int close_ord=OrdersTotal();
         for (int qe=0;qe<close_ord;qe++)
            {
               OrderSelect(qe, SELECT_BY_POS, MODE_TRADES);
                 if( OrderMagicNumber()==MagicNumber1  || 
                     OrderMagicNumber()==MagicNumber2  || 
                     OrderMagicNumber()==MagicNumber3  ||
                     OrderMagicNumber()==E_MagicNumber ||  
                     OrderMagicNumber()==MagicNumber4)
                     {
                     if(OrderType()==OP_BUY) {OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3);Sleep(2000);}
                     if(OrderType()==OP_SELL){OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3);Sleep(2000);}
                     }
            }
            closeorders();
   }
//end close orders





//check for opened positions, do not continue if positions are opened
int ord_cnt1=OrdersTotal();
for (int start1=0;start1<ord_cnt1;start1++)   
   {
      OrderSelect(start1, SELECT_BY_POS, MODE_TRADES);
      if(OrderMagicNumber()==MagicNumber1  || 
         OrderMagicNumber()==MagicNumber2  || 
         OrderMagicNumber()==MagicNumber3  || 
         OrderMagicNumber()==E_MagicNumber || 
         OrderMagicNumber()==MagicNumber4)
         {return(0);}
   }

int ticket1,ticket2,ticket3,ticket4;
  //if(trade==true)
  if(Hour()>=0 && Hour()<1 && (Minute()>=5 && Minute()<=12))//start of a new day
   {

      //turn on emergency_exit
      enable_emergency_trading=true;

      if(trade==true && d_c11>0 && IsTradeAllowed()==true) //Previous Day's Deviation is Positive
         {
            //LONG EURUSD
            RefreshRates();
            ticket1=OrderSend(C1,OP_BUY,lot,MarketInfo(C1,MODE_ASK),3,0,0,"Hedge"+C1,MagicNumber1);
            if (ticket1<0){verifyorder(C1,MagicNumber1,"LONG");}Sleep(5000);

            //LONG USDCHF
            RefreshRates();
            ticket2=OrderSend(C2,OP_BUY,lot,MarketInfo(C2,MODE_ASK),3,0,0,"Hedge"+C2,MagicNumber2);
            if (ticket2<0){verifyorder(C2,MagicNumber2,"LONG");}Sleep(5000); 

            //SHORT GBPUSD
            RefreshRates();
            ticket3=OrderSend(C3,OP_SELL,lot,MarketInfo(C3,MODE_BID),3,0,0,"Hedge"+C3,MagicNumber3);
            if (ticket3<0){verifyorder(C3,MagicNumber3,"SHORT");}Sleep(5000); 

            //LONG AUDUSD
            RefreshRates();
            ticket4=OrderSend(C4,OP_BUY,lot,MarketInfo(C4,MODE_ASK),3,0,0,"Hedge"+C4,MagicNumber4);
            if (ticket4<0){verifyorder(C4,MagicNumber4,"LONG");}Sleep(5000); 
         }


      if(trade==true && d_c11<0 && IsTradeAllowed()==true) //Previous Day's Deviation is Negative
         {
            //LONG EURUSD
            RefreshRates();
            ticket1=OrderSend(C1,OP_SELL,lot,MarketInfo(C1,MODE_BID),3,0,0,"Hedge"+C1,MagicNumber1);
            if (ticket1<0){verifyorder(C1,MagicNumber1,"SHORT");}Sleep(5000);

            //LONG USDCHF
            RefreshRates();
            ticket2=OrderSend(C2,OP_SELL,lot,MarketInfo(C2,MODE_BID),3,0,0,"Hedge"+C2,MagicNumber2);
            if (ticket2<0){verifyorder(C2,MagicNumber2,"SHORT");}Sleep(5000); 

            //SHORT GBPUSD
            RefreshRates();
            ticket3=OrderSend(C3,OP_BUY,lot,MarketInfo(C3,MODE_ASK),3,0,0,"Hedge"+C3,MagicNumber3);
            if (ticket3<0){verifyorder(C3,MagicNumber3,"LONG");}Sleep(5000); 

            //LONG AUDUSD
            RefreshRates();
            ticket4=OrderSend(C4,OP_SELL,lot,MarketInfo(C4,MODE_BID),3,0,0,"Hedge"+C4,MagicNumber4);
            if (ticket4<0){verifyorder(C4,MagicNumber4,"SHORT");}Sleep(5000); 
         }
   }

  
//----
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It automatically opens orders when conditions are reached
It Closes Orders by itself

Other Features:

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.90 Total Net Profit:-10.76

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.71 Total Net Profit:-29.28

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:0.67 Total Net Profit:-23.94

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:1.26 Total Net Profit:16.30

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:1.15 Total Net Profit:18.83

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-04-16 Profit Factor:0.55 Total Net Profit:-153.88

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:1.21 Total Net Profit:7.49

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.00 Total Net Profit:0.00

Request Backtest for HTH


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: