AutoKdj_v2





//+------------------------------------------------------------------+
//|                                                      AutoKdj.mq4 |
//|                                                        senlin ge |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "senlin ge"
#property link      "http://www.metaquotes.net"
#define MAGICKDJ    20080220
//---- input parameters
extern int whichmethod = 2;//1;//4;    //1: no S/L,no T/P ²»ÉèÖ¹Ó®Ò²²»ÉèÖ¹Ëð
                                       //2: no S/L,has T/P ÉèÖ¹Ó®£¬µ«²»ÉèÖ¹Ëð
                                       //3: has S/L,no T/P //²»ÉèÖ¹Ó®£¬ÉèÖ¹Ëð
                                       //4: has T/P has S/L,ÉèÖ¹Ó®Ò²ÉèÖ¹Ëð

extern double    Lots=0.1;             //×îµÍ±ê×¼ÊÖ
extern double    MaximumRisk=0.4;      //¿ª²ÖÕ¼¿ÉÓÃ×ʽð±ÈÀý
extern double    DecreaseFactor=0.3;   //¿ª²Ö¿÷Ëð¼õÉÙϵ¥ÊÖÊý
extern  int      tp=200;               //×î´óÓ®Àû Ö¹Ó®µãÊý 
extern  int      sl=100;               //×î´óËðʧ Ö¹ËðµãÊý
extern int       Leverage=100;         //½»Ò×±¶Êý1:100
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----

//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----


//----
   return(0);
  }
  //+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICKDJ)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   //double ma;
   int    res;
   double point =MarketInfo(Symbol(),MODE_POINT);
 Print("point=",point);
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
  
//---- get Moving Average 
   double valKDCCurrent=iCustom(NULL, 0, "kdj",5,0);   //µ±Ç°Ò»ÖÜÆÚµÄKDCÖµ 
   double valKDCPrevious=iCustom(NULL, 0, "kdj",5,1);  //Ç°Ò»ÖÜÆÚµÄKDCÖµ 
   double valKCurrent=iCustom(NULL, 0, "kdj",2,0);     //µ±Ç°ÖÜÆÚµÄKÖµ
   double valKPrevious=iCustom(NULL, 0, "kdj",2,1);    //Ç°Ò»ÖÜÆÚµÄKÖµ
   double valDCurrent=iCustom(NULL, 0, "kdj",3,0);     //µ±Ç°ÖÜÆÚµÄDÖµ
   double valDPrevious=iCustom(NULL, 0, "kdj",3,1);    //Ç°Ò»ÖÜÆÚµÄDÖµ 
   Print("valKCurrent=",valKCurrent);
   Print("valDCurrent=",valDCurrent);
   Print("valKPrevious=",valKPrevious);
   Print("valDPrevious=",valDPrevious);
//---- sell conditions
    if(valKDCPrevious>0 && valKDCCurrent<0|| (valKDCCurrent<0 && valKPrevious-valKCurrent>0))  //kÏ´©D K<d do short 
     {
      switch (whichmethod)
         {
         case 1:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"¿ª¿Õ²Ö",MAGICKDJ,0,Red); break;
         case 2:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+sl*point,0,"¿ª¿Õ²Ö",MAGICKDJ,0,Red);     break;
         case 3:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,Bid-tp*point,"¿ª¿Õ²Ö",MAGICKDJ,0,Red); break;
         case 4:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,0,Bid+sl*point,Bid-tp*point,"¿ª¿Õ²Ö",MAGICKDJ,0,Red); break;
         default : res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICKDJ,0,Red); break;
          }
        if (res <=0)
          {
          int error=GetLastError();
          if(error==134) Print("Received 134 Error after OrderSend() !! ");         // not enough money
          if(error==135) RefreshRates();                                            // prices have changed
          if(error==131) Print("Received 131 Error after OrderSend() !! ");         // not enough money

         }
   //Sleep(5000);
      return;
     }
//---- buy conditions
   if(valKDCPrevious<0 && valKDCCurrent>0|| valKDCCurrent>0&& valKPrevious-valKCurrent<0)//kÉÏ´©D  k>d ×ö¶à
     {
      switch (whichmethod)
       {
         case 1:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"¿ª¶à²Ö",MAGICKDJ,0,Blue);break;
         case 2:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-sl*point,0,"¿ª¶à²Ö",MAGICKDJ,0,Blue);   break;
         case 3:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,Ask+tp*point,"¿ª¶à²Ö",MAGICKDJ,0,Blue);break;
         case 4:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,0,Ask-sl*point,Ask+tp*point,"¿ª¶à²Ö",MAGICKDJ,0,Blue);break;
         default : res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"¿ª¶à²Ö",MAGICKDJ,0,Blue);break;
    }
       
       if (res <=0)
      {
       error=GetLastError();
       if(error==134) Print("Received 134 Error after OrderSend() !! ");         // not enough money
       if(error==135) RefreshRates();   // prices have changed
       }
       Sleep(5000);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get K[1],k[0],d[1],d[0] 
   double valKDCCurrent=iCustom(NULL, 0, "kdj",5,0);  //µ±Ç°Ò»ÖÜÆÚµÄKDCÖµ 
   double valKDCPrevious=iCustom(NULL, 0, "kdj",5,1); //Ç°Ò»ÖÜÆÚµÄKDCÖµ 
   double valKCurrent=iCustom(NULL, 0, "kdj",2,0);    //µ±Ç°ÖÜÆÚµÄKÖµ
   double valKPrevious=iCustom(NULL, 0, "kdj",2,1);   //Ç°Ò»ÖÜÆÚµÄKÖµ
   double valDCurrent=iCustom(NULL, 0, "kdj",3,0);    //µ±Ç°ÖÜÆÚµÄDÖµ
   double valDPrevious=iCustom(NULL, 0, "kdj",3,1);   //Ç°Ò»ÖÜÆÚµÄDÖµ 
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICKDJ || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)                          //¶Ô¶à·½ÅÌƽ²Ö 
        {
         if(valKDCPrevious>0 && valKDCCurrent<0|| valKPrevious>valKCurrent)  //kÏ´©D »òÕßÊÇK ÔÚDÏÂÏÂÐÐ K<d do short 
         OrderClose(OrderTicket(),OrderLots(),Bid,3,White); Sleep(5000);
         break;
        }
      if(OrderType()==OP_SELL)                         //¶Ô¿Õ·½ÅÌƽ²Ö 
         {
         if(valKDCPrevious<0 && valKDCCurrent>0||valKPrevious<valKCurrent)//kÉÏ´©D or k>d ×ö¶à
         OrderClose(OrderTicket(),OrderLots(),Ask,3,White); Sleep(5000);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
  lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk*Leverage/100000.0,1);
//---- calcuulate number of losses orders without a break
   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-lot*losses*DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+





Sample





Analysis



Market Information Used:

Series array that contains tick volumes of each bar


Indicator Curves created:


Indicators Used:




Custom Indicators Used:
kdj

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.72 Total Net Profit:-2351.03

BackTest : USDCHF on H1

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

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.77 Total Net Profit:-2386.70

BackTest : EURUSD on H1

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

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.33 Total Net Profit:-5570.50

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 AutoKdj_v2


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

Pair: Period: