CCI_TRADER_2.2_Nail_Saby






#property copyright "Copyright © 2009, Victor Chebotariov"
#property link      "http://www.chebotariov.com"

#define magic      1052009
#define MAGICNUM  14052009
//+------------------------------------------------------------------+
//|                                                           SU.mq4 |
//|                                        Copyright © 2009, murnail |
//|                                         mailto:murnail@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, murnail"
#property link      "mailto:murnail@yandex.ru"

//Ïîïûòêà îáúåäåíèòü ÑÑI_TRADER è ñâîé ïåðâûé âàðèàíò, ãäå Ñåëë è Áàé îòä. ñîâåòíèêè...


//---- input parameters
extern double OpenT      = 50;
extern double Lot        = 0.6;
extern double Lot2       = 0.5;
extern double TakeProfit = 410;
extern int    StopLoss   = 150; 
extern int    N_MaxBar   = 1000;
extern double Delta      = 50000;
extern string   t="Íàñòðîéêè èíäèêàòîðîâ";
extern int period = 580;
extern int L1     = 100;
extern int L2     = 240;
extern int L3     = 300;
extern int L4     = 250;
extern int L5     = 270;
extern int L6     = 280;

extern int slippage=3;

//extern int TakeProfit_L = 70; // Óðîâåíü òåéêïðîôèò â ïóíêòàõ
//extern int StopLoss_L = 147;  // óðîâåíü ñòîïëîññ â ïóíêòàõ
//extern int TakeProfit_S = 50; // Óðîâåíü òåéêïðîôèò â ïóíêòàõ
//extern int StopLoss_S = 257;  // óðîâåíü ñòîïëîññ â ïóíêòàõ
//+------------------------------------------------------------------+
//| CCI_TRADER expert start function                                 |
//+------------------------------------------------------------------+

//********************
//ïîäñ÷åò òåêóùåãî êîëè÷åñòâà îòêðûòûõ ïîçèöèé íà ïîêóïêó
int CalcNumLongs()
{
   int nLongs = 0;
   for (int i = 0; i < OrdersTotal(); i++) {
      int resL = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (resL == 0) {
         Print ("Îøèáêà ïðè âûáîðå îðäåðà: ", GetLastError()); 
         return;
      }
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICNUM 
            && OrderType() == OP_BUY) nLongs++;
   }
   return (nLongs);
  } 
//ïîäñ÷åò òåêóùåãî êîëè÷åñòâà îòêðûòûõ ïîçèöèé íà ïðîäàæó
int CalcNumShorts()
{
   int nShorts = 0;
   for (int iS = 0; iS < OrdersTotal(); iS++) {
      int resS = OrderSelect(iS, SELECT_BY_POS, MODE_TRADES);
      if (resS == 0) {
         Print ("Îøèáêà ïðè âûáîðå îðäåðà: ", GetLastError()); 
         return;
      }
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICNUM 
            && OrderType() == OP_SELL) nShorts++;
   }
   return (nShorts);
}  
   
//ïîïûòêà îòêðûòü íîâûé îðäåð
void CheckForOpen()
{  
   bool found = false;
   //ïîèñê ïîñëåäíåãî îòêðûòîãî îðäåðà íà ïîêóïêó  
   for (int i = OrdersTotal() - 1; i >= 0; i--) {
      int res = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (res == 0) {
         Print ("Îøèáêà ïðè âûáîðå îðäåðà: ", GetLastError()); 
         return;
      }
      if (OrderMagicNumber() == MAGICNUM && 
            OrderSymbol() == Symbol() && OrderType() == OP_BUY) {                                      
         found = true; //...íàøëè ïîñëåäíèé îòêðûòûé îðäåð íà ïîêóïêó     
         break;
   //ïîèñê ïîñëåäíåãî îòêðûòîãî îðäåðà íà ïðîäàæó   
      }
      if (OrderMagicNumber() == MAGICNUM && 
            OrderSymbol() == Symbol() && OrderType() == OP_SELL) {                                      
         found = true; //...íàøëè ïîñëåäíèé îòêðûòûé îðäåð íà ïðîäàæó      
         break;
      }
   if (!found) {
      Print ("Îøèáêà: íå ñìîãëè íàéòè îæèäàåìîãî îòêðûòîãî îðäåðà íà ïîêóïêó: ", GetLastError()); 
      return;   
    }   
   //åñëè óáûòîê ïðåâûøàåò çíà÷åíèå ïåðåìåííîé OpenT, îòêðûâàåì îðäåð íà ïîêóïêó
   if (OrderProfit() <= OpenT)
      Print ("Óáûòîê ïðåâûñèë çíà÷åíèå, îòêðûâàåì íîâûé îðäåð");
    { 
      double Min = Close[ArrayMinimum(Close, N_MaxBar, 1)]; 
      Print (Bid, " ", Min - Delta * Point);
      res = OrderSend (Symbol(), OP_BUY, Lot, Ask, 3, Min - Delta * Point, Ask + TakeProfit * Point, "", MAGICNUM, 0, Blue);
      if (res == 0) {         
         Print ("Îøèáêà îòêðûòèÿ îðäåðà íà ïîêóïêó: ",GetLastError()); 
         return;
      }        
    if (!found) {
     Print ("Îøèáêà: íå ñìîãëè íàéòè îæèäàåìîãî îòêðûòîãî îðäåðà íà ïðîäàæó: ", GetLastError()); 
      return;   
    }
  }  
} 
 //åñëè óáûòîê ïðåâûøàåò çíà÷åíèå ïåðåìåííîé OpenT, îòêðûâàåì îðäåð íà ïðîäàæó
   if (OrderProfit() <= OpenT) {
      Print (OrderProfit());
      double Max = Close[ArrayMaximum(Close, N_MaxBar, 1)]; 
      Print (Bid, " ", Max + Delta * Point);
      res = OrderSend (Symbol(), OP_SELL, Lot, Bid, 3, Max + Delta * Point, Bid - TakeProfit * Point, "", MAGICNUM, 0, Red);
      if (res == 0) {         
         Print ("Îøèáêà îòêðûòèÿ îðäåðà íà ïðîäàæó: ",GetLastError()); 
         return;
   }
   if (!found) {
      Print ("Îøèáêà: íå ñìîãëè íàéòè îæèäàåìîãî îòêðûòîãî îðäåðà íà ïîêóïêó: ", GetLastError()); 
      return;   
      }         
   }        
}

//********************
//ÍÀ×ÀËÎ ÐÀÁÎÒÛ
int start()
  {
//----
   double val = iCCI(NULL ,0,period,PRICE_TYPICAL,0);
   int ticket, cnt, total=OrdersTotal();     
   if(total<1)
      {
         if(val>L1)
            {
               ticket=OrderSend(Symbol(),OP_BUY,Lot2,Ask,slippage,Ask-StopLoss*Point,
                      Ask+TakeProfit*Point,"CCI_TRADER",magic,0,Green);
               if(ticket>0)
                  {
                     if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
//*****************
                      {
   //ïðîâåðêà íåîáõîäèìûõ óñëîâèé äëÿ òîðãîâëè
   if (Bars < N_MaxBar || IsTradeAllowed() == false) return;
         Print ("Îòêðûòûõ îðäåðîâ Áàé íåò "); 
   //åñëè íåò îòêðûòûõ ïîçèöèé, îòêðûâààåì ïîçèöèþ íà ïîêóïêó
   if (CalcNumLongs() == 0) {
      double Min = Close[ArrayMinimum(Close, N_MaxBar, 1)]; 
      Print (Bid, " ", Min - Delta * Point);
      int resL = OrderSend (Symbol(), OP_BUY, Lot, Ask, 3, Min - Delta * Point, Ask + TakeProfit * Point, "", MAGICNUM, 0, Blue);
          Print ("Îòêðûëè îðäåð Ñåëë");      
      if (resL == 0) {         
         Print ("Îøèáêà îòêðûòèÿ îðäåðà íà ïîêóïêó: ",GetLastError()); 
         return;
      }           
   }
   else CheckForOpen();
   return;
}
//*****************                     
                     
                     
                  }
               else
                  {
                     Print("Error opening BUY order : ",GetLastError());
                     return(0);
                  }
            }
         else if(val<-L2)
            {
               ticket=OrderSend(Symbol(),OP_SELL,Lot2,Bid,slippage,Bid+StopLoss*Point,
                      Bid-TakeProfit*Point,"CCI_TRADER",magic,0,Red);
               if(ticket>0)
                  {
                     if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
//*************
{
   //ïðîâåðêà íåîáõîäèìûõ óñëîâèé äëÿ òîðãîâëè
   if (Bars < N_MaxBar || IsTradeAllowed() == false) return;
          Print ("Îòêðûòûõ îðäåðîâ Ñåëë íåò ");   
   //åñëè íåò îòêðûòûõ ïîçèöèé, îòêðûâààåì ïîçèöèþ íà ïðîäàæó
   if (CalcNumShorts() == 0) {
      double Max = Close[ArrayMaximum(Close, N_MaxBar, 1)]; 
      Print (Bid, " ", Max + Delta * Point);
      int resS = OrderSend (Symbol(), OP_SELL, Lot, Bid, 3, Max + Delta * Point, Bid - TakeProfit * Point, "", MAGICNUM, 0, Red);
          Print ("Îòêðûëè îðäåð Ñåëë");      
      if (resS == 0) {         
         Print ("Îøèáêà îòêðûòèÿ îðäåðà íà ïðîäàæó: ",GetLastError()); 
         return;
      }      
   }
   else CheckForOpen();
   return;
}
//*************                     
                  }
               else
                  {
                     Print("Error opening SELL order : ",GetLastError());
                     return(0);
                  }
            }
      }
if (OrderMagicNumber()==magic)
         {
         if(OrderType()<=OP_SELL &&   // check for opened position 
            OrderSymbol()==Symbol())  // check for symbol
           {
            if(OrderType()==OP_BUY)   // long position is opened
              {
               // should it be closed?
               if(val<-L3)
                   {
                    OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                    return(0); // exit
                   }
              }
            else // go to short position
              {
               // should it be closed?
               if(val>L4)
                 {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
                  return(0); // exit
                 }
              }
           }
        }
for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(val<-L5)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
           }
         else // go to short position
           {
            // should it be closed?
            if(val>L6)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
           }
        }
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

Commodity channel index


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It Closes Orders by itself

Other Features: