#property copyright "Copyright © 2010, Õëûñòîâ Âëàäèìèð"
#property link      "cmillion@narod.ru"
#property show_inputs
//--------------------------------------------------------------------
extern int     stoploss    = 1300,        //óðîâåíü âûñòàâëåíèÿ SL, åñëè 0, òî SL íå âûñòàâëÿåòñÿ
               takeprofit  = 20000,        //óðîâåíü âûñòàâëåíèÿ TP, åñëè 0, òî TP íå âûñòàâëÿåòñÿ
               key       = 0;   //óíèêàëüíûé íîìåð îðäåðà
extern bool    SELL        = false,    //îòêðûòü îðäåð SELL
               BUY         = false;    //îòêðûòü îðäåð BUY
extern double  lot         = 0.01;      //îáúåì îðäåðà
extern int     slippage    = 30;        //Ìàêñèìàëüíî äîïóñòèìîå îòêëîíåíèå öåíû äëÿ ðûíî÷íûõ îðäåðîâ
extern double _percentProfit=1.2;///// - Ïðîôåöèò
//----------- Alen_T 2011 http://fxgeneral.com
extern bool Close_ON = false;      //çàêðûòèå ïîçèöèè ïî îáðàòíîìó ñèãíàëó
extern int MaxBuyCount  =  1;    // Ìàêñ äîïóñòèìîå êîë. îòêðûòûõ îðäåðîâ áàé, -1 - íå íîãðàíè÷åíî 
extern int MaxSellCount  =  1;   // Ìàêñ äîïóñòèìîå êîë. îòêðûòûõ îðäåðîâ ñåëë, -1 - íå îãðàíè÷åíî
//-----------
datetime   BARflag  = 0; //--Äëÿ ïîáàðîâîãî ðåæèìà
//--------------------------------------------------------------------
double SL,TP;
//--------------------------------------------------------------------
int start()
{
 datetime now = Time[0];//--Äëÿ ïîáàðîâîãî ðåæèìà
  if(BARflag >= now) return(0);//--Äëÿ ïîáàðîâîãî ðåæèìà
   BARflag = now;//--Äëÿ ïîáàðîâîãî ðåæèìà
 
  int nLots; //--Ìàê.îòê.îðäåðîâ
   if(totalO(-1,key)==0) GlobalVariableSet(StringConcatenate(key," eq"),AccountEquity());//- % ïî "Òåêóùåå ýêâèòè "
   Comment("Êîíòðîëüíîå ýêâèòè ",GlobalVariableGet(StringConcatenate(key," eq")),"\n",//- % ïî "Òåêóùåå ýêâèòè "
           "Òåêóùåå ýêâèòè ",AccountEquity(),"\n",  //- % ïî "Òåêóùåå ýêâèòè "
   "Òåêóùèé ïðîöåíò ðîñòà Ýêâèòè ",100*(AccountEquity()-GlobalVariableGet(StringConcatenate(key," eq")))/GlobalVariableGet(StringConcatenate(key," eq"))," %");//- % ïî "Òåêóùåå ýêâèòè "
   _CheckProfit();///// - Ïðîôåöèò- % ïî "Òåêóùåå ýêâèòè "  
   if ((Close[3]>Close[2]) && (Close[1]<Close[2])){
   {
   if(Close_ON) CloseOrders(OP_SELL, Ask, key);// --Ìàê.îòê.îðäåðîâ
   nLots = ExistPositionsN(NULL,OP_BUY, key);// --Ìàê.îòê.îðäåðîâ
   if(MaxSellCount != -1 && nLots >= MaxSellCount) return(0); //--Ìàê.îòê.îðäåðîâ
   if (BUY)
   
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy");
      }
   }
   if ((Close[3]>Close[2]) && (Close[2]<Close[1])){
   {
   if(Close_ON) CloseOrders(OP_BUY, Bid, key);// --Ìàê.îòê.îðäåðîâ
   nLots = ExistPositionsN(NULL,OP_SELL, key);// --Ìàê.îòê.îðäåðîâ
   if(MaxSellCount != -1 && nLots >= MaxSellCount) return(0);// --Ìàê.îòê.îðäåðîâ
   if (SELL)
     
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell");
      }
   }
return(0);
}
//--------------------------------------------------------------------
void OPENORDER(string ord)
{
   int error,err;
   while (true)
   {  error=true;
      if (ord=="Buy" ) error=OrderSend(Symbol(),OP_BUY, getlotlast(key),NormalizeDouble(Ask,Digits),slippage,SL,TP,"BUY",key,0,Blue);
      if (ord=="Sell") error=OrderSend(Symbol(),OP_SELL,getlotlast(key),NormalizeDouble(Bid,Digits),slippage,SL,TP,"SELL",key,0,Red);
      if (error==-1) //íåóäà÷íàÿ ïîêóïêà OK
      {  
         ShowERROR();
         err++;Sleep(2000);RefreshRates();
      }
      if (error || err >10) return;
   }
return;
}                  
//--------------------------------------------------------------------
void ShowERROR()
{
   int err=GetLastError();
   switch ( err )
   {                  
      case 1:   return;
      case 2:   Alert("Íåò ñâÿçè ñ òîðãîâûì ñåðâåðîì ",Symbol());return;
      case 3:   Alert("Error íåïðàâèëüíûå ïàðàìåòðû ",Symbol());return;
      case 130: Alert("Error áëèçêèå ñòîïû   Ticket ",Symbol());return;
      case 134: Alert("Íåäîñòàòî÷íî äåíåã   ",Symbol());return;
      case 146: Alert("Error Ïîäñèñòåìà òîðãîâëè çàíÿòà ",Symbol());return;
      case 129: Alert("Error Íåïðàâèëüíàÿ öåíà ",Symbol());return;
      case 131: Alert("Error Íåïðàâèëüíûé îáúåì ",Symbol());return;
      case 4200:Alert("Error Îáúåêò óæå ñóùåñòâóåò ",Symbol());return;
      default:  Alert("Error  " ,err," ",Symbol());return;
   }
}
//----------------------------------------++++
//------ Åñëè ,, ëîñü,, òî + Ëîò ---------------------
//èùåì ïîñëåäíèé çàêðûòûé îáúåì 
double  getlotlast(int _key)
 {
   double _lot = lot ;  
   for(int i=OrdersHistoryTotal(); i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)&&OrderSymbol()==Symbol()) {
         if((OrderMagicNumber()==_key || _key == 0) && OrderType()<=1){
            if(OrderProfit()<0){
               int kol=getLastType(_key)*(-1);
               _lot=((kol-MathMod(kol,2))/2+1)*lot;       // -- +1 ýòî + ËÎÒ
               break;
            }
            if(OrderProfit()>=0) break;
         }
      }
   }
   return(_lot); 
}
//êàêîé òèï îðäåðà çàêðûëñÿ ïîñëåäíèé è ñêîëüêî îðäåðîâ â ñåðèè
int getLastType(int _key)
{
 int KolType=0;
 int j=1;       
   for(int i=OrdersHistoryTotal() ; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY ) && OrderSymbol()==Symbol()) {
         if((OrderMagicNumber()==_key || _key == 0) && OrderType()<=1) {
            if(j==1 && OrderProfit()>=0)KolType++;
            if(j==1 && OrderProfit()<0)KolType--;
            if(j!=1 && OrderProfit()>=0 && KolType>0)KolType++;
            if(j!=1 && OrderProfit()>=0 && KolType<0)break;
            if(j!=1 && OrderProfit()<0 && KolType<0)KolType--;
            if(j!=1 && OrderProfit()<0 && KolType>0)break;
            j++;                 
         }
      }
   } 
   return(KolType); 
}
//+-------------------------- Ïðîôåöèò    ---------------------------+
void _CheckProfit(){//- % ïî "Òåêóùåå ýêâèòè "
   
   if (100*(AccountEquity()-GlobalVariableGet(StringConcatenate(key," eq")))/GlobalVariableGet(StringConcatenate(key," eq"))>=_percentProfit)
   
   _OrderClose();//- % ïî "Òåêóùåå ýêâèòè "
   return;//- % ïî "Òåêóùåå ýêâèòè "
}
//+--------------------------------+//- % ïî "Òåêóùåå ýêâèòè "
void _OrderClose(){
   int i;
   double _price=0.0;
   _OrderDelete();
   if (OrdersTotal()>0){
      for (i=OrdersTotal()-1; i>=0; i--){
         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
            if (OrderSymbol()==Symbol()){
               RefreshRates();
               if (OrderType()==OP_SELL) _price=Ask;
               if (OrderType()==OP_BUY) _price=Bid;
               OrderClose(OrderTicket(),OrderLots(),_price,5,0);
            }
         }
      }
   }
   return;
}
//+--------------------------------+//- % ïî "Òåêóùåå ýêâèòè "
void _OrderDelete(){//- % ïî "Òåêóùåå ýêâèòè "
   int i;
   if (OrdersTotal()>0){
      for (i=OrdersTotal()-1; i>=0; i--){
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if (OrderSymbol()==Symbol()){
               if (OrderType()>1 && OrderType()<6) OrderDelete(OrderTicket());
            }
         }
      }
   }
   return;
}//- % ïî "Òåêóùåå ýêâèòè "
//+-----------------//- % ïî "Òåêóùåå ýêâèòè "------------------------+++
/*Ñ÷èòàåì êîëè÷åñòâî îðäåðîâ
âõîäÿùèå 
int type (if -1 all type)
OP_BUY 0 Ïîêóïêà 
OP_SELL 1 Ïðîäàæà 
OP_BUYLIMIT 2 Îòëîæåííûé îðäåð BUY LIMIT 
OP_SELLLIMIT 3 Îòëîæåííûé îðäåð SELL LIMIT 
OP_BUYSTOP 4 Îòëîæåííûé îðäåð BUY STOP 
OP_SELLSTOP 5 Îòëîæåííûé îðäåð SELL STOP 
int _key MagicNumber
*/
int totalO(int type,int _key)
 {
       int TotalNumber = 0;  
              for(int i=0; i<OrdersTotal(); i++)
                {  
                  if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)||OrderSymbol() !=Symbol()|| OrderMagicNumber()!=_key) continue; 
                  if (OrderType()==type||type==-1){
                  TotalNumber++;}
                } 
              return(TotalNumber); 
 }
//+------------------- Êîíåö ôóíêöèè ----------------------------------+++
// ------- Îãðàíå÷åíèè îòêðûòûõ îðäåðîâ ----------
//+----------------------------------------------------------------------------+
//|  Îïèñàíèå : Çàêðûòèå îòêðûòûõ îðäåðîâ                                   |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    TipOrder - òèï îðäåðà ( OP_BUY || OP_SELL )                             |
//|    Price    - óñòàíàâëèâàåìûé TP                                           |
//|    Magic    - MagicNumber      (-1   - ëþáîé ìàãèê)                        |
//+----------------------------------------------------------------------------+
bool CloseOrders(int TipOrder, double Price, int mn=-1)
{
int Norder;
int total = OrdersTotal(); 
            
   //---- ïîèñê äëèííîé îòêðûòîé ïîçèöèè
   for(int cnt = total - 1; cnt >= 0; cnt--)      // Ïåðåáèðàåì âñå îðäåðà
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);//îðäåð âûáèðàåòñÿ ñðåäè îòêðûòûõ è îòëîæåííûõ îðäåðîâ
      if( OrderSymbol()==Symbol())// Ñîâïàäàåò ëè ñèìâîë îðäåðà( Çäåñü ïî íàäîáíîñòè åù¸ ìàãèê ìîæíî ïðîâåðèòü)
      {
         if(OrderType()==TipOrder)//Îòáèðàåì ïîçèöèþ áàé/ñåë
         {
            if (mn<0 || OrderMagicNumber()==mn) 
            {
               if(TipOrder == OP_BUY) Price = NormalizeDouble(Bid,Digits);
               if(TipOrder == OP_SELL) Price = NormalizeDouble(Ask,Digits);
               Norder = OrderTicket();
               OrderClose(OrderTicket(),OrderLots(),Price,3,Violet); //çàêðûâàåì îðäåð
               Print("======= Óäàëåí îðäåð=",Norder);
               //âðåìÿ çàäåðæêè
            }
         }
      }
   }
   
}
// ------- Îãðàíå÷åíèè îòêðûòûõ îðäåðîâ ----------
//+----------------------------------------------------------------------------+
//|  Îïèñàíèå : Âîçâðàùàåò êîëè÷åñòâî îðäåðîâ                                  |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ îòêðûòèÿ)           |
//+----------------------------------------------------------------------------+
int ExistPositionsN(string sy="", int op=-1, int mn=-1, datetime ot=0) 
{
  int i, k=OrdersTotal(), rez=0;
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) 
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
    {
      if (OrderSymbol()==sy || sy=="") 
      {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) 
        {
          if (op<0 || OrderType()==op) 
          {
            if (mn<0 || OrderMagicNumber()==mn)
            {
              if (ot<=OrderOpenTime()) rez = rez+1;
            }
          }
        }
      }
    }
  }
  
  return(rez);
}
//------------------------------------------------------------------------------------------------------+
             
            
            
            
Comments