e-CloseByPercentProfit

Author: ��� ����� �. aka KimIV
Orders Execution
It Closes Orders by itself Checks for the total of open orders
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites
e-CloseByPercentProfit
//+----------------------------------------------------------------------------+
//|                                                e-CloseByPercentProfit.mq4  |
//|                                                                            |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà ------------------------------------------
extern string _P_Expert="---------- Ïàðàìåòðû ñîâåòíèêà";
extern double PercentProfit   = 1.00;            // Ïðîöåíò ïðîôèòà
extern double PercentLoss     = 5.00;            // Ïðîöåíò óáûòêà
extern bool   DeleteOrders    = False;           // Óäàëÿòü îðäåðà
extern bool   CloseTerminal   = False;           // Çàêðûâàòü òåðìèíàë
extern bool   ShowComment     = True;            // Ïîêàçûâàòü êîììåíòàðèé
extern int    NumberAccount   = 0;               // Íîìåð òîðãîâîãî ñ÷¸òà
extern bool   UseSound        = False;           // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound   = "expert.wav";    // Íàèìåíîâàíèå çâóêîâîãî ôàéëà
extern int    Slippage        = 3;               // Ïðîñêàëüçûâàíèå öåíû
extern int    NumberOfTry     = 5;               // Êîëè÷åñòâî ïîïûòîê
extern int    PauseAfterError = 75;              // Ïàóçà ïîñëå îøèáêè â ñåêóíäàõ

//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà --------------------------------------
bool  gbDisabled  = False;        // Ôëàã áëîêèðîâêè ñîâåòíèêà
color clCloseBuy  = Blue;         // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color clCloseSell = Red;          // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
color clDelete    = Yellow;       // Öâåò çíà÷êà óäàëåíèÿ îðäåðîâ

//------- Ïîêëþ÷åíèå âíåøíèõ ìîäóëåé -------------------------------------------
#include <stdlib.mqh>
#include <WinUser32.mqh>
//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ÏÐÅÄÎÏÐÅÄÅ˨ÍÍÛÅ ÔÓÍÊÖÈÈ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
void init() 
  {
   gbDisabled=False;
   if(!IsTradeAllowed()) 
     {
      Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
              "Ðàçðåøèòü ñîâåòíèêó òîðãîâàòü");
      gbDisabled=True; return;
     }
   if(!IsDllsAllowed()) 
     {
      Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
              "Ðàçðåøèòü èìïîðò ôóíêöèé èç DLL");
      gbDisabled=True; return;
     }
   if(!IsLibrariesAllowed()) 
     {
      Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
              "Ðàçðåøèòü èìïîðò èç âíåøíèõ ýêñïåðòîâ");
      gbDisabled=True; return;
     }
   if(!IsTesting()) 
     {
      if(IsExpertEnabled()) Message("Ñîâåòíèê áóäåò çàïóùåí ñëåäóþùèì òèêîì");
      else Message("Îòæàòà êíîïêà \"Ðàçðåøèòü çàïóñê ñîâåòíèêîâ\"");
     }
  }

//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() { if(!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() 
  {
   if(gbDisabled) 
     {
      Message("Íå óäàëîñü èíèöèàëèçèðîâàòü ñîâåòíèê!"); return;
     }
   if(!IsTesting()) 
     {
      if(NumberAccount>0 && NumberAccount!=AccountNumber()) 
        {
         Comment("Òîðãîâëÿ íà ñ÷¸òå: "+AccountNumber()+" ÇÀÏÐÅÙÅÍÀ!");
         return;
        }
      else Comment("");
      if(ShowComment) 
        {
         string st="PercentProfit="+DoubleToStr(PercentProfit,2)
                   +"  PercentLoss="+DoubleToStr(PercentLoss,2)+"\n"
                   +"Òåêóùèå: Áàëàíñ="+DoubleToStr(AccountBalance(),2)
                   +"  Ýêâèòè="+DoubleToStr(AccountEquity(),2)
                   +"  Ïðèáûëü="+DoubleToStr((AccountEquity()/AccountBalance()-1)*100,2)+" %"
                   ;
         Comment(st);
        }
      else Comment("");
     }

   if(AccountEquity()>=AccountBalance()*(1+PercentProfit/100)
      || AccountEquity()<=AccountBalance()*(1-PercentLoss/100)) 
     {
      ClosePosFirstProfit();
      DeleteOrders();
     }
  }
//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ÏÎËÜÇÎÂÀÒÅËÜÑÊÈÅ ÔÓÍÊÖÈÈ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Çàêðûòèå îäíîé ïðåäâàðèòåëüíî âûáðàííîé ïîçèöèè                           |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() 
  {
   bool   fc;
   color  clClose;
   double ll,pAsk,pBid,pp;
   int    err,it;

   if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
     {
      for(it=1; it<=NumberOfTry; it++) 
        {
         if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
         while(!IsTradeAllowed()) Sleep(5000);
         RefreshRates();
         pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
         pBid=MarketInfo(OrderSymbol(), MODE_BID);
         if(OrderType()==OP_BUY) 
           {
            pp=pBid; clClose=clCloseBuy;
              } else {
            pp=pAsk; clClose=clCloseSell;
           }
         ll=OrderLots();
         fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
         if(fc) 
           {
            if(UseSound) PlaySound(NameFileSound); break;
              } else {
            err=GetLastError();
            if(err==146) while(IsTradeContextBusy()) Sleep(1000*PauseAfterError);
            Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
                  ErrorDescription(err),", try ",it);
            Print(OrderTicket(),"  Ask=",pAsk,"  Bid=",pBid,"  pp=",pp);
            Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
                  "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
            Sleep(1000*PauseAfterError);
           }
        }
     }
   else Print("Íåêîððåêòíàÿ òîðãîâàÿ îïåðàöèÿ. Close ",GetNameOP(OrderType()));
  }
//+----------------------------------------------------------------------------+
//|  Çàêðûòèå ïîçèöèé ïî ðûíî÷íîé öåíå ñíà÷àëà ïðèáûëüíûõ                      |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit() 
  {
   int i,k=OrdersTotal();

// Ñíà÷àëà çàêðûâàåì ïðèáûëüíûå ïîçèöèè
   for(i=k-1; i>=0; i--) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
           {
            if(OrderProfit()+OrderSwap()>0) ClosePosBySelect();
           }
        }
     }
// Ïîòîì âñå îñòàëüíûå
   k=OrdersTotal();
   for(i=k-1; i>=0; i--) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
        }
     }
   if(CloseTerminal && !ExistPositions()) CloseTerminal();
  }
//+----------------------------------------------------------------------------+
//|  Çàêðûâàåò òîðãîâûé òåðìèíàë.                                              |
//+----------------------------------------------------------------------------+
void CloseTerminal() 
  {
   Print("Ñðàáîòàëà ôóíêöèÿ CloseTerminal()");
   int hwnd=WindowHandle(Symbol(),Period());
   int hwnd_parent=0;

   while(!IsStopped()) 
     {
      hwnd=GetParent(hwnd);
      if(hwnd==0) break;
      hwnd_parent=hwnd;
     }
   if(hwnd_parent!=0) PostMessageA(hwnd_parent,WM_CLOSE,0,0);
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 28.11.2006                                                     |
//|  Îïèñàíèå : Óäàëåíèå îðäåðîâ                                               |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáîé îðäåð)                    |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="",int op=-1,int mn=-1) 
  {
   bool fd;
   int  err,i,it,k=OrdersTotal(),ot;

   if(sy=="0") sy=Symbol();
   for(i=k-1; i>=0; i--) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         ot=OrderType();
         if(ot>1 && ot<6) 
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) 
              {
               if(mn<0 || OrderMagicNumber()==mn) 
                 {
                  for(it=1; it<=NumberOfTry; it++) 
                    {
                     if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
                     while(!IsTradeAllowed()) Sleep(5000);
                     fd=OrderDelete(OrderTicket(),clDelete);
                     if(fd) 
                       {
                        if(UseSound) PlaySound(NameFileSound); break;
                          } else {
                        err=GetLastError();
                        Print("Error(",err,") delete order ",GetNameOP(ot),": ",ErrorDescription(err),", try ",it);
                        Sleep(1000*5);
                       }
                    }
                 }
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé                                     |
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="",int op=-1,int mn=-1) 
  {
   int i,k=OrdersTotal();

   if(StringLen(sy)==1 && StringGetChar(sy,0)==48) 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) return(True);
                 }
              }
           }
        }
     }
   return(False);
  }
//+----------------------------------------------------------------------------+
//|  Âîçâðàùàåò íàèìåíîâàíèå îïåðàöèè                                          |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) 
  {
   switch(op) 
     {
      case OP_BUY      : return("Buy");
      case OP_SELL     : return("Sell");
      case OP_BUYLIMIT : return("Buy Limit");
      case OP_SELLLIMIT: return("Sell Limit");
      case OP_BUYSTOP  : return("Buy Stop");
      case OP_SELLSTOP : return("Sell Stop");
      default          : return("Unknown Operation");
     }
  }
//+----------------------------------------------------------------------------+
//|  Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë                                      |
//+----------------------------------------------------------------------------+
void Message(string m) 
  {
   Comment(m);
   if(StringLen(m)>0) Print(m);
  }
//+----------------------------------------------------------------------------+

Comments