MACD_v1_v1






//+------------------------------------------------------------------+
//|                                                       eurusd.mq4 |
//|                                    Copyright © 2006-2007, Daniil |
//|                      |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006 Daniil"
#property link      "npplus@mail.ru"
#property link      "http://www.fxmts.ru"

//-----------------------------------------------------------|
//  EXTERN                                                   |
//-----------------------------------------------------------|

extern string rem0="Âûáîð ëîòà ñòîïà è ïðîôèòà";
extern double TakeProfit   = 500; // îïòèìàëüíî
extern double Profit_one   = 70; // îïòèìàëüíî
extern double Stop         = 80; // îïòèìàëüíî
extern double BezUbitok    = 0;  // ÷åðåç äàííîå êîëè÷åñòâî ïóíêòîâ ïðîôèòà ñòîï ïåðåäâèãàåòñÿ â óðîâåíü áåçóáûòî÷íîñòè
extern double Lots         = 1;  // êîëè÷åñòâî ëîòîâ
extern double chapter_lots = 5;

extern string rem1="Óïðàâëåíèå êàïèòàëîì:";
extern bool   MM               = false; 
extern bool   AccountIsMicro   = false;
extern double MaximumRisk  = 0.01;
extern double DecreaseFactor = 1;


extern string rem3="Ïàðàìåòðû ñðåäíèõ:";
extern double Exp=55;
extern double Simple=69;
extern double HMA=15;
extern double FilterMA=2;


extern string rem4="Ïàðàìåòðû MACD:";
extern double a=2300;
extern double b=4000;
extern double c=800;

//2300 4000 800

bool buy = True;
bool sell =True;
bool close_buy_signal=false;  // ñèãíàë íà çàêðûòèå ïîêóïêè
bool close_sell_signal=false; // ñèãíàë íà çàêðûòèå ïðîäàæè

//int cnt; 

bool close_1=false;   // çàêðûëàñü ëè ïåðâàÿ ÷àñòü    (0.1 ëîò)
bool close_2=false;   // çàêðûëàñü ëè âòîðàÿ ÷àñòü    (0.1 ëîò)
bool close_3=false;   // çàêðûëàñü ëè òðåòüÿ ÷àñòü    (0.1 ëîò)
bool close_4=false;   // çàêðûëàñü ëè ÷åòâåðòàÿ ÷àñòü (0.1 ëîò)
bool close_5=false;   // çàêðûëàñü ëè ïÿòàÿ ÷àñòü     (0.1 ëîò)

//-----------------------------------------------------------|
//  LOT OPTIMIZATOR                                          |
//-----------------------------------------------------------|

double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();    
   int    losses=0;                 

   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);

   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses==1) lot=NormalizeDouble(lot*2,1);
        if(losses==2) lot=NormalizeDouble(lot*3,1);
          if(losses==3) lot=NormalizeDouble(lot*4,1);
            if(losses==4) lot=NormalizeDouble(lot*5,1);
              if(losses==5) lot=NormalizeDouble(lot*6,1);
                  if(losses>5) lot=NormalizeDouble(lot*7,1);
        }

   if(lot<0.1) lot=0.1;
   if(MM==false) lot=Lots;
   if(AccountIsMicro==true) lot=lot/10;
//--- for CONTEST only
 //  if(lot > 5) lot=5; 
   return(lot);
  }

//-----------------------------------------------------------|
//  START                                                    |
//-----------------------------------------------------------|


int start()
  {
   

   int cnt, ticket, total;
  
//--- 
   double FMA, FMAprev;
   double EMA,SMA;
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious;
  
  
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<2)
     {
      Print("TakeProfit less than 200");
      return(0);  // check TakeProfit
     }
     
     
//-----------------------------------------------------------|
// ÔÓÍÊÖÈÈ:                                                  |
//-----------------------------------------------------------|

//--- ôèëüòð

   FMA=iMA(NULL,0,FilterMA,0,MODE_LWMA,PRICE_CLOSE,0);
   FMAprev=iMA(NULL,0,FilterMA,0,MODE_LWMA,PRICE_CLOSE,2);

//--- ñðåäíèå
   EMA=iMA(NULL,0,Exp,0,MODE_EMA,PRICE_CLOSE,0);
   SMA=iMA(NULL,0,Simple,0,MODE_SMA,PRICE_CLOSE,0);
   
   
   
//--- MACD
   MacdCurrent=iMACD(NULL,0,a,b,c,PRICE_CLOSE,MODE_MAIN,2);
   MacdPrevious=iMACD(NULL,0,a,b,c,PRICE_CLOSE,MODE_MAIN,4);
   SignalCurrent=iMACD(NULL,0,a,b,c,PRICE_CLOSE,MODE_SIGNAL,2);
   SignalPrevious=iMACD(NULL,0,a,b,c,PRICE_CLOSE,MODE_SIGNAL,4);   
   

 
           
 //---------------------\\
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*LotsOptimized()))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
        

        
//-----------------------------------------------------------|
//  OPEN BUY                                                 |  
//-----------------------------------------------------------|

if(1==1) 
 {
 //   if( MacdCurrent>MacdPrevious && MacdPrevious<0 && MacdCurrent>0 )
 
     
        if (MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious)
        {                                     
         ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,5,Ask-Stop*Point,Ask+TakeProfit*Point,"priceEX",16384,0,Green);
         sell=true;
         buy=false;
          
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); //MODE_TRADES
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
         }
        }
        
//-----------------------------------------------------------|
//  OPEN SELL                                                |
//-----------------------------------------------------------|



if (1==1) 
    {  
   
 //  if( MacdCurrent<MacdPrevious && MacdPrevious>0 && MacdCurrent<0 )
       if (MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious) 
       
        
        {                                      
         ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,5,Bid+Stop*Point,Bid-TakeProfit*Point,"priceEX",16384,0,Red);
         buy=true;
         sell=false;
        
         if(ticket>0)
           {                                    
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); //,MODE_TRADES
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
        }
      return(0);
    }

//-----------------------------------------------------------|
//  CLOSE ORDER                                              |
//-----------------------------------------------------------|



 if (OrdersTotal()>0 && 1==1)
      {
         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    
//--- çàêðûòèå ïîëíîãî îðäåðà ïî îáëàêàì (ñèëüíåéøåìó ñèãíàëó)

         if (OrderType()==OP_BUY)
           {
        
  //     if( MacdCurrent<MacdPrevious && MacdPrevious>0 && MacdCurrent<0  )
    if (MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious) 
         
                {
         
                  OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
                  
                  close_1=false;
                  close_2=false;
                                    
                  Print("Çàêðûëè îðäåð íà ïîêóïêó ïîëíîñòüþ ïî ïðîòèâîïîëîæíîìó ñèãíàëó");
                  //buy=false; 
           //       return(0);
                }
           }
         
         if (OrderType()==OP_SELL ) // çàêðûâàåì îðäåð íà ïîêóïêó òàê êàê åñòü ñèãíàë 
           {
      
     //               if(MacdCurrent>MacdPrevious && MacdPrevious<0 && MacdCurrent>0 )
                if (MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious)
                
         
               {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,White);    
                  close_1=false;
                  close_2=false;
         
                  Print("Çàêðûëè îðäåð íà ïðîäàæó ïîëíîñòüþ ïî ïðîòèâîïîëîæíîìó ñèãíàëó"); 
                  // sell=false;
         //         return(0);
               }
            }
  
//--- çàêðûòèå ëîòà ïî ÷àñòÿì:


// ---1--- ïåðâàÿ ÷àñòü  


         if (OrderType()==OP_BUY && Profit_one>0)
           {
// çàêðûâàåì ÷àñòü îðäåðà íà ïîêóïêó åñëè ïðîáèâàåòñÿ ëèíèÿ Kijun_sen
              if (Ask>OrderOpenPrice()+Profit_one*Point)          
//            if (Open[1]>Kijun_sen && Close[1]>Kijun_sen && Open[2]>Kijun_sen && Close[2]>Kijun_sen && Ask<Kijun_sen )
                {
                  OrderClose(OrderTicket(),OrderLots()/2,Bid,3,White);
                  close_1=true;
                  Print("Çàêðûëè ïåðâîé ÷àñòè íà ïîêóïêó");
                  //buy=false; 
//                  return(0);
                }
           }
         
         if (OrderType()==OP_SELL && Profit_one>0) // çàêðûâàåì îðäåð íà ïîêóïêó òàê êàê åñòü ñèãíàë 
           {
// çàêðûâàåì ÷àñòü îðäåðà íà ïðîäàæó åñëè ïðîáèâàåòñÿ ëèíèÿ Kijun_sen 
               if (Ask<OrderOpenPrice()-Profit_one*Point)
//            if (Open[1]<Kijun_sen && Close[1]<Kijun_sen && Open[2]<Kijun_sen && Close[2]<Kijun_sen && Ask>Kijun_sen)
               {
                  OrderClose(OrderTicket(),OrderLots()/2,Ask,3,White);    
                  close_1=true;
                  Print("Çàêðûëè ïåðâîé ÷àñòè íà ïðîäàæó"); 
                  // sell=false;
//                  return(0);
               }
            }


/*
// ---2--- âòîðàÿ ÷àñòü


         if (OrderType()==OP_BUY  && 1==2 && close_2==false && OrderProfit()>0)
           {
// çàêðûâàåì ÷àñòü îðäåðà íà ïîêóïêó åñëè ïðîáèâàåòñÿ ëèíèÿ Kijun_sen
            if (Open[1]>Hull && Close[1]>Hull && Open[2]>Hull && Close[2]>Hull && Ask<Hull )
                {
                  OrderClose(OrderTicket(),0.4,Bid,3,White);
                  close_2=true;
                  Print("Çàêðûëè ïåðâîé ÷àñòè íà ïîêóïêó");
                  //buy=false; 
//                  return(0);
                }
           }
         
         if (OrderType()==OP_SELL && 1==2 && close_2==false && OrderProfit()>0) // çàêðûâàåì îðäåð íà ïîêóïêó òàê êàê åñòü ñèãíàë 
           {
// çàêðûâàåì ÷àñòü îðäåðà íà ïðîäàæó åñëè ïðîáèâàåòñÿ ëèíèÿ Kijun_sen 
            if (Open[1]<Hull && Close[1]<Hull && Open[2]<Hull && Close[2]<Hull && Ask>Hull)
               {
                  OrderClose(OrderTicket(),0.4,Ask,3,White);    
                  close_2=true;
                  Print("Çàêðûëè ïåðâîé ÷àñòè íà ïðîäàæó"); 
                  // sell=false;
//                  return(0);
               }
            }
*/
//-----------------------------------------------------------|
//  BEZUBITOK                                                |
//-----------------------------------------------------------|


if (OrderType()==OP_BUY && BezUbitok>0)  
               {
                if(OrderStopLoss()>0) //|| OrderStopLoss()-OrderOpenPrice()<2*Point)
                  {
                   if (Bid-OrderOpenPrice()>BezUbitok*Point)
                     {
                       OrderModify (OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Gold);
                      }
                   }    
               }       
               
               
                if (OrderType()==OP_SELL && BezUbitok>0)
                  {
                      if (OrderStopLoss()>0)// || OrderOpenPrice()-OrderStopLoss()<2*Point)
                        {
                         if (OrderOpenPrice()-Ask>BezUbitok*Point)
                          {
                       OrderModify (OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Gold);
                   }
                 }
                 }


    
       }


 

        
   return(0);
  }
  
//-----------------------------------------------------------|
//  THE END                                                  |
//-----------------------------------------------------------|  



Sample





Analysis



Market Information Used:

Series array that contains open prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

MACD Histogram
Moving average indicator


Custom Indicators Used:

Order Management characteristics:

It Closes Orders by itself
Checks for the total of open orders
It automatically opens orders when conditions are reached

Other Features:

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.92 Total Net Profit:-6.79

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 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 : USDJPY on H1

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

Request Backtest for MACD_v1_v1


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

Pair: Period: