Executer_AC





//+------------------------------------------------------------------+
//|                                                  Executer_AC.mq4 |
//|                           Copyright © 2006, Alex Sidd (Executer) |
//|                                           mailto:work_st@mail.ru |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  Äàííûé ñîâåòíèê  íàïèñàí íà îñíîâå ñîâåòíèêà  MACD Sample.      |
//+------------------------------------------------------------------+
extern double TakeProfit = 120;  //ïðîôèò
extern double Lots = 0.9;        //êîë-âî âûñòàâëÿåìûõ ëîòîâ
extern double TrailingStop = 30; //òðåéëèíã ñòîï
extern double StopLoss = 70;
extern double DecreaseFactor = 80;
extern double MaximumRisk    = 0.014;
extern double MaximumLots    = 100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetSizeLot() //îïòèìèçàöèÿ ëîòîâ
  {
   double Lot = Lots;
   int cycle;
   int prof = 0;
   int orders = HistoryTotal();     // history orders total
   int losses = 0;                  // number of losses orders without a break
   int vinn = 0;
   int i = orders;
//---- select lot size
  Lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk / 100, 1);
//----
   if(AccountFreeMargin() <= 14) 
       DecreaseFactor = 14;
//----
   if(AccountFreeMargin() > 10000) 
       DecreaseFactor = 60;
//----
   if(DecreaseFactor > 0 && orders > DecreaseFactor)
     {
       //----
       for(cycle = 1; cycle < DecreaseFactor; cycle++)
         {
           i--;
           //----
           if(OrderSelect(i, SELECT_BY_TICKET, MODE_HISTORY) == false) 
             { 
               Print("Error in history!"); 
               break; 
             } 
           //----
           if(OrderCloseTime()>0)
             {
               prof = prof + OrderProfit(); 
               if(OrderProfit() <= 0 ) 
                   losses++;
               else 
                   vinn++;
             }
         }  
       if(prof <= 0 && losses > vinn) 
           Lot = 0.1;
       if(prof <=0 && vinn > losses) 
           Lot = Lot - (0.1*losses);
       if(prof > 0 && losses > vinn) 
         {
           Lot = Lot + (0.1*NormalizeDouble(vinn / 4, 0.1));
         }
       if(prof > 0 && losses <= vinn )
         {
           Lot = Lot + (0.1*NormalizeDouble(vinn / 2, 0.1));
         }
     } 
   if(AccountFreeMargin() < 300 || Lot < 0.1) 
       Lot = 0.1;
   if(Lot*1275 >= AccountFreeMargin()) 
       Lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk / 100, 1);
   if(MaximumLots != 0 && Lot > MaximumLots) 
       Lot = MaximumLots;
   if(DecreaseFactor > orders) 
       Lot = Lots;
   return(Lot);
  }  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+  
int start()
  {
   double ACCur, ACPrev, ACPrev2, ACPrev3;
   int cnt, ticket, total;
// iAC - îñöèëëÿòîð óñêîðåíèÿ-çàìåäëåíèÿ.
// Ñèíòàêñèñ: iAC( shift ) 
// Ïàðàìåòð: shift - ñìåùåíèå îòíîñèòåëüíî òåêóùåãî áàðà (êîëè÷åñòâî ïåðèîäîâ 
// íàçàä), îòêóäà íóæíî áðàòü äàííûå.
   if(Bars < 100)
     {
       Print("Áàðîâ ìåíüøå 100");
       return(0);  
     }
   if(TakeProfit < 10)
     {
       Print("TakeProfit ìåíüøå ÷åì 10");
       return(0);  // check TakeProfit
     }
   ACCur = iAC(NULL, 0, 1);
   ACPrev = iAC(NULL, 0, 2);
   ACPrev2 = iAC(NULL, 0, 3);
   ACPrev3 = iAC(NULL, 0, 4);
   total = OrdersTotal();  // ïðîâåðÿåì åñòü ëè îòêðûòûå ïîçèöèè
   if(total < 1) 
     {
       if(AccountFreeMargin() < (500*Lots))  // ïðîâåðÿåì äåíåæêè íà ñ÷åòó
         {
           Print("Äåíåã ïî÷òè íåò, îñòàëîñü âñåãî: ", AccountFreeMargin());
           return(0);  
         }
       // ïðîâåðÿåì îòêðûòèå ïîçèöèè íà ïîêóïêó
       if(ACCur > 0 && ACPrev > 0)
         {
           // ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ íà ïîêóïêó
           if(ACCur > ACPrev && ACPrev > ACPrev2)
             {
               OrderSend(Symbol(), OP_BUY, GetSizeLot(), Ask, 3, Ask - StopLoss*Point, 
                         Ask + TakeProfit*Point, "AC expert", 16384, 0, Green);
               return(0); 
             }
           // ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ íà ïðîäàæó
           if(ACCur < ACPrev && ACPrev < ACPrev2 && ACPrev2 < ACPrev3)
             {
               OrderSend(Symbol(), OP_SELL, GetSizeLot(), Bid, 3, Bid + StopLoss*Point, 
                         Bid - TakeProfit*Point, "AC expert", 16384, 0, Red);
               return(0); 
             }
         }
       if(ACCur < 0 && ACPrev < 0)
         {
           // ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ íà ïîêóïêó
           if(ACCur > ACPrev && ACPrev > ACPrev2 && ACPrev2 > ACPrev3)
             {
               OrderSend(Symbol(), OP_BUY, GetSizeLot(), Ask, 3, Ask - StopLoss*Point, 
                         Ask + TakeProfit*Point, "AC expert", 16384, 0, Green);
               return(0); 
             }
           // ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ íà ïðîäàæó
           if(ACCur < ACPrev && ACPrev < ACPrev2)
             {
               OrderSend(Symbol(), OP_SELL, GetSizeLot(), Bid, 3, Bid + StopLoss*Point, 
                         Bid - TakeProfit*Point, "AC expert", 16384, 0, Red);
               return(0); 
             }
         }
       if(ACCur > 0 && ACPrev < 0)
         {
           OrderSend(Symbol(), OP_BUY, GetSizeLot(), Ask, 3, Ask - StopLoss*Point, 
                     Ask + TakeProfit*Point, "AC expert", 16384, 0, Green);
           return(0); 
         }
       if(ACCur < 0 && ACPrev > 0)
         {
           OrderSend(Symbol(), OP_SELL, GetSizeLot(), Bid, 3, Bid + StopLoss*Point, 
                     Bid - TakeProfit*Point, "AC expert", 16384, 0, Red);
           return(0); 
         }
       return(0);
     }
   for(cnt = 0; cnt < total; cnt++)
     {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if(OrderType() <= OP_SELL &&   // ïðîâåðêà îòêðûòîé ïîçèöèè 
          OrderSymbol() == Symbol())  // ïðîâåðêà ñ íàøåãî ëè îíà ãðàôèêà
         {
           if(OrderType() == OP_BUY)    // åñëè îòêðûòà ïîçèöèÿ íà ïîêóïêó
             {
               // íàäî ëè åå çàêðûòü?
               if(ACCur < ACPrev)
                 {
                   OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet); // çàêðûëè
                   return(0);  // ñâàëèâàåì
                 }
               // íóæíî ëè äâèãàòü òðåéëèíã ñòîï
               if(TrailingStop > 0)  
                 {                 
                   if(Bid - OrderOpenPrice() > Point*TrailingStop)
                     {
                       if(OrderStopLoss() < Bid - Point*TrailingStop)
                         {
                           OrderModify(OrderTicket(), OrderOpenPrice(), 
                                       Bid - Point*TrailingStop, OrderTakeProfit(), 
                                       0, Green);
                           return(0);
                         }
                     }
                 }
             }
           else // åñëè ýòà ïîçèöèÿ íà ïðîäàæó
             {
               // íàäî ëè çàêðûòü?
               if(ACCur > ACPrev)
                 {
                   OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet); // çàêðûëè
                   return(0); // âûõîä
                 }
               // íóæîí ëè òðåéëèíãñòîïèíã
               if(TrailingStop > 0)  
                 {                 
                   if((OrderOpenPrice() - Ask) > (Point*TrailingStop))
                     {
                       if((OrderStopLoss() > (Ask + Point*TrailingStop)) || 
                          (OrderStopLoss() == 0))
                         {
                           OrderModify(OrderTicket(), OrderOpenPrice(), 
                                       Ask + Point*TrailingStop, OrderTakeProfit(),
                                       0, Red);
                           return(0);
                         }
                     }
                 }
             }
         }
     }
   return(0);
  }
//+------------------------------------------------------------------+





Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:

Bill Williams Accelerator/Decelerator oscillator


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy

Other Features: