GoldWarrior02b_v1





/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                            GoldWarrior02bMT4.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Nick Bilak"
#property link "www.forex-tsd.com"

extern double Lots =0.1;
extern double StopLoss = 1000;
extern double TakeProfit = 150;
extern double TrailingStop = 0;
extern int ZN=1,ZM=0, per=21,d=3,depth=12,deviation=5,backstep=3,mgod=2005,porog=300,test=1,
imps=30,impb=-30,k1=30,k2=60;
double LastTradeTime;
double kors=0.30,korb=0.15,ZZ2=0,ZZ3=0,cci0=0,cci1=0,nimp =0,wpr0=0,wpr1=0,summa=0,
       down=0,imp=0,mlot=0,ZZ0=0,ssum=0,bsum=0;
int cnt=0,j=0,ssig=0,bsig=0,b=0,bsb=0,sbo=0,bloks=0,blokb=0,pm=0,s=0,blok=1;

//---------------------------------------------------------------------------------------------------------------------//
// per - period for all indicators //
// d - number of full periods when calculating //
// depth,deviation,backstep - ZigZag indicator parameters // 
// mgod - testing year //
// porog - cut-off takeprofit when closing positions out //
// test - current info output flag, 1 - output to journal //
// imps - positive impulse value for buy signal
// impb - negative impulse value for buy signal
// k1 & k2 - multiplier for sizes of hedge orders of 1st and 2nd level
//           k2/k1=2 - must be!
//---------------------------------------------------------------------------------------------------------------------//

void SetArrow(datetime t, double p, int k, color c)  {
   ObjectSet("Arrow", OBJPROP_TIME1 , t);
   ObjectSet("Arrow", OBJPROP_PRICE1 , p);
   ObjectSet("Arrow", OBJPROP_ARROWCODE, k);
   ObjectSet("Arrow", OBJPROP_COLOR , c);
}
 
int start() { 

   LastTradeTime=GlobalVariableGet("LastTradeTime");
   if (CurTime()-LastTradeTime<15) return(0); 
   
   if (mgod!=Year()) j=j+1;
   if (j==10000) j=0;
   if (k2<2*k1) {
      if (!IsTesting()) Comment("Increase K2 for normal work!",
      "\n","K2 must be not less than 2*K1");
      return(0);
   } 
   if (sbo==0 && AccountBalance()<2000) {
      if (!IsTesting()) Comment("For normal work you must have 2000$ on your account");
      return(0);
   } 
   imp=iCustom(NULL,0,"DayImpuls",per,d,0,1);
   if (imp>10000) imp=0;
   nimp=iCustom(NULL,0,"DayImpuls",per,d,0,0);
   if (nimp>10000) nimp=0;
   ZZ3=iCustom(NULL,0,"ZigZag",depth,deviation,backstep,0,1);
   ZZ2=iCustom(NULL,0,"ZigZag",depth,deviation,backstep,0,0);
   //cci1=iCCI(NULL,0,per,PRICE_CLOSE,0);
   //wpr1=iWPR(NULL,0,per,0);
   cci1=iCCI(NULL,0,per,PRICE_CLOSE,1);
   cci0=iCCI(NULL,0,per,PRICE_CLOSE,0);
   //wpr1=iWPR(NULL,0,per,1);
   //wpr0=iWPR(NULL,0,per,0);


   if ((ZZ3>0.01 || ZZ2>0.01) && ((cci0<cci1 && cci1>50 && cci0>30 && nimp<0 && imp>0) || 
      (cci0>200 && cci1>cci0 && nimp>100 && imp>nimp))) {

//   if ((ZZ3!=0 || ZZ2!=0) //sell signal
         //&& cci0 && cci1>0 
         //&& cci0>0 
         //&& nimp<0 
         //&& imp>0) { 
      SetArrow(Time[0],High[0]+5*Point,242,GreenYellow);
      ssig=1;
      //if (!IsTesting()) 
      Comment("ZZ0=",NormalizeDouble(ZZ2,Digits)," ZZ1=",NormalizeDouble(ZZ3,Digits)," CCI0=",NormalizeDouble(cci1,Digits)," Impuls=",NormalizeDouble(nimp,Digits),
      "\n","If iZigZag line is up - sell now");
   }

   if ((ZZ3>0.01 || ZZ2>0.01) && ((cci0>cci1 && cci1<-50 && cci0<-30 && nimp>0 && imp<0)) || 
      (cci0<-200 && cci1<cci0 && nimp<-100 && imp<nimp)) {
      //if ((ZZ3!=0 || ZZ2!=0) //buy signal
         //&& cci0>cci1 
         //&& cci1<0 
         //&& cci0<0 
         //&& nimp>0 
         //&& imp<0)   {
      SetArrow(Time[0],Low[0]-5*Point,241,Gold);
      bsig=1;
      //if (!IsTesting()) 
      Comment("ZZ0=",NormalizeDouble(ZZ2,Digits)," ZZ1=",NormalizeDouble(ZZ3,Digits)," CCI0=",NormalizeDouble(cci1,Digits)," Impuls=",NormalizeDouble(imp,Digits),
      "\n","If iZigZag line is down - buy now");
   }

   if ((ZZ2<0.01 && ZZ3<0.01) || sbo!=0 || (imp>imps && imp<impb)) {
   //if ((ZZ2==0 && ZZ3==0)     //signal of no position
     //    || sbo!=0            //signal of having open orders
     //    || (imp<=imps && imp>=impb))   {
      ssig=0;//disallow sell
      bsig=0; //disallow buy
      if (!IsTesting()) Comment("ZZ0=",NormalizeDouble(ZZ2,Digits)," ZZ1=",NormalizeDouble(ZZ3,Digits)," CCI0=",NormalizeDouble(cci1,Digits)," Impuls=",NormalizeDouble(imp,Digits),
      "\n"," Signals are absent");
   }



   sbo=0;s=0;b=0;summa=0;ssum=0;bsum=0;
   for (cnt=0; cnt<OrdersTotal(); cnt++) {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol()==Symbol()) sbo=sbo+1;//have open trades
         if ((OrderType()==OP_SELL && OrderSymbol()==Symbol()) || (OrderType()==OP_BUY && OrderSymbol()==Symbol())) {
            summa=summa+OrderProfit();// profit of open trade
         }
         if ((OrderType()==OP_SELL && OrderSymbol()==Symbol())) { 
            s=s+1;//open trade is sell
            ssum=ssum+OrderProfit();//sell trade profit
         }
         if (OrderType()==OP_BUY && OrderSymbol()==Symbol())  { 
            b=b+1;//have open buy
            bsum=bsum+OrderProfit();//buy trade profit
         }
      }
   }

   if (blok==0) { //add to position and set hedge order of 1st level
      if (s==1 
            && summa>30 //add to position when profit > 30
            && cci0>150 
            && nimp>50 
            && imp>nimp)   {
         mlot=k1*Lots;
         int ticket=OrderSend(Symbol(),OP_SELL,mlot,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"Sculp_Sell",1,0,Yellow);
         bsb=0; //ðàçðåøåíèå íà îòêðûòèå õåäæà âòîðîãî óðîâíÿ
         blok=1; //ðàçðåøåíèå íà îòêðûòèå õåäæà âòîðîãî óðîâíÿ
         return(0);
      }
      if (s==1 //set hedge 1st level for sell position
            && summa>0
            && cci0<-150 
            && nimp<-50 
            && imp<nimp ) {
         mlot=k1*Lots;
         ticket=OrderSend(Symbol(),OP_BUY,mlot,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Sculp_BUY",1,0,Yellow);
         //Setorder(OP_BUY,mlot,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,Gold);
         bsb=0; //allow open hedge 2nd level
         blok=1;
         return(0);
      } 
      if (s==1 //set hedge 1st level for sell position
            && summa<-30
            && cci0<-150
            && nimp<-50
            && imp<nimp ) {
         mlot=k1*Lots;
         ticket=OrderSend(Symbol(),OP_BUY,mlot,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Sculp_BUY",1,0,Yellow);
         //Setorder(OP_BUY,mlot,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,Gold);
         bsb=0; //allow open hedge 2nd level
         blok=1;
         return(0);
      } 
      // }
      if (b==1 //set hedge 1st level for buy position
            && summa<-30 
            && cci0>150 
            && nimp>50 
            && imp>nimp )    {
         mlot=k1*Lots;
         ticket=OrderSend(Symbol(),OP_SELL,mlot,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"Sculp_Sell",1,0,Yellow);
         bsb=0; //alow 2nd lev hedge
         blok=1; //alow 2nd lev hedge
         return(0);
      }
      if (b==1 //add to buy position when profit > 30
            && summa>30 
            && cci0<-150 
            && nimp<-50 
            && imp<nimp ) {
         mlot=k1*Lots;
         ticket=OrderSend(Symbol(),OP_BUY,mlot,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Sculp_BUY",1,0,Yellow);
         bsb=0;//alow 2nd lev hedge
         blok=1;//alow 2nd lev hedge
         return(0);
      }
      if (b==1 
            && summa>0 
            && cci0>150
            && nimp>50 
            && imp>nimp ) {
         mlot=k1*Lots;
         ticket=OrderSend(Symbol(),OP_SELL,mlot,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"Sculp_Sell",1,0,Yellow);
         bsb=0;//alow 2nd lev hedge
         blok=1;//alow 2nd lev hedge
         return(0);
      }
   }
   if (blok==1 // set 2nd level hedge
         && (b+s)<=2 
         && summa<-2500  //current loss
         && bsb==0 ) {   //allow open 2nd level hedge
      // set 2nd lev. hedge for buy pos.
      if ( ((b==1 && s==1) || b==2 || (b==1 && s==0)) && bsum<0 && bsum>ssum && cci0>150 && nimp>50 ) { 
         mlot=k2*Lots;
         ticket=OrderSend(Symbol(),OP_SELL,mlot,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"Sculp_Sell",1,0,Yellow);
         //Setorder(OP_SELL,mlot,Bid,3,Bid+StopLoss*Point,Bid -TakeProfit*Point,Gold);
         bsb=1; 
         //porog=100;
         return(0);
      }
      if ( ((s==1 && b==1)  || s==2  || (s==1 && b==0)) && ssum<0 && bsum<ssum && cci0<-150 && nimp<-50 )    {
         mlot=k2*Lots;
         ticket=OrderSend(Symbol(),OP_BUY,mlot,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Sculp_BUY",1,0,Yellow); 
         bsb=1; 
         //porog=100;
         return(0);
      }
   }//*/
   if (sbo==0) { //do not have open trades
      bloks=0;//alow sell
      blokb=0;//allow buy
      pm=0; //disallow closing
      bsb=1;//disallow 2nd lev. hedge once more
   }//*/

   if (summa<0 && down>summa) 
      down=(MathRound(summa)); //loss


   if (test==1) { //print to log or screen
      if (!IsTesting()) Print ("Data: ",Year(),".",Month(),".",Day()," Time ",Hour(),":",Minute(),":",Seconds(),
      " Bloks=",bloks," Blokb=",blokb, " Blok=",blok," ZZ0=",MathRound(ZZ2),
      " ZZ1=",MathRound(ZZ3)," CCI0=",MathRound(cci0)," Imp=",MathRound(nimp),
      " Prof=",MathRound(summa)," DDown=",MathRound(down/30)," BSB=",bsb);
      if (j<=2) if (!IsTesting()) Comment(" ");
   } else  {
      if (!IsTesting()) Comment ("Data: ",Year(),".",Month(),".",Day()," Time ",Hour(),":",Minute(),":",Seconds(),
      " Bloks=",bloks," Blokb=",blokb," Blok=",blok," ZZ0=",MathRound(ZZ2),
      " ZZ1=",MathRound(ZZ3)," CCI0=",MathRound(cci0)," Imp=",MathRound(nimp),
      " Prof=",MathRound(summa)," DDown=",MathRound(down/30));
   }//*/ 
     
   if (summa>porog) // profit margin
      pm=1;

   if (pm==1) { //close trades by profit
      for (cnt=0; cnt<OrdersTotal(); cnt++) {
         if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderType()==OP_SELL && OrderSymbol()==Symbol()) {
               OrderClose(OrderTicket(),OrderLots(),Ask,5,Red);
               return(0);
            }
            if (OrderType()==OP_BUY && OrderSymbol()==Symbol()) {
               OrderClose(OrderTicket(),OrderLots(),Bid,5,Red);
               return(0);
            }
         }
      } //*/
   }

   if (AccountFreeMargin()>=2000 //open new positions
         && sbo==0 //have no open positions
         && (Minute()==14 || Minute()==29 || Minute()==44 || Minute()==59) //determin end of bar
         && Seconds()>=45) { //and time of entry
      mlot=Lots; 
      if (ssig==1 && bloks==0) {
         SetArrow(Time[0],High[0]+5*Point,242,Red); 
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"Sculp_Sell",1,0,Yellow);
         blokb=1;//disallow second buy entry 
         bsb=1; //disallow second hedge of 2nd lev
         blok=0; //allow add position and hedge 1st lev.
         GlobalVariableSet("LastTradeTime",CurTime());
         return(0);
      } 
      if (bsig==1 && blokb==0) {
         SetArrow(Time[0],Low[0]-5*Point,241,Gold); 
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Sculp_Sell",1,0,Yellow); 
         bloks=1;//disallow second sell entry 
         bsb=1; //disallow second hedge of 2nd lev
         blok=0; //allow add position and hedge 1st lev.
         GlobalVariableSet("LastTradeTime",CurTime());
         return(0);
      } 
   }
   return(0);
}





Sample





Analysis



Market Information Used:

Series array that contains the highest prices of each bar
Series array that contains open time of each bar
Series array that contains the lowest prices of each bar


Indicator Curves created:


Indicators Used:


Commodity channel index


Custom Indicators Used:
DayImpuls
ZigZag

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 : USDJPY on H1

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

BackTest : USDCHF on H1

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

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:1.50 Total Net Profit:249.50

BackTest : USDCAD on H1

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

BackTest : EURUSD on H1

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

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.00 Total Net Profit:15.00

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

Request Backtest for GoldWarrior02b_v1


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

Pair: Period: