e-CloseByProfit

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-CloseByProfit
//+----------------------------------------------------------------------------+
//|                                                       e-CloseByProfit.mq4  |
//|                                                    Êèì Èãîðü Â. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà ------------------------------------------
extern string _P_Expert="---------- Ïàðàìåòðû ñîâåòíèêà";
extern bool   CurSymbolOnly   = True;            // Òîëüêî òåêóùèé ñèìâîë
extern int    StopLoss        = 40;              // Stop
extern int    TakeProfit      = 60;              // Òåéê
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;               // Êîëè÷åñòâî ïîïûòîê

//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà --------------------------------------
color clCloseBuy  = Blue;         // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color clCloseSell = Red;          // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
int   CurProfit;

//------- Ïîêëþ÷åíèå âíåøíèõ ìîäóëåé -------------------------------------------
#include <stdlib.mqh>


//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
void init() { if(!IsTesting()) Comment(""); }

//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() { if(!IsTesting()) Comment(""); }
//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start()
  {
   if(!IsTesting())
     {
      if(NumberAccount>0 && NumberAccount!=AccountNumber())
        {
         Message("ÇÀÏÐÅÙÅÍÀ òîðãîâëÿ íà ñ÷¸òå "+AccountNumber());
         return;
        }
      else Comment("");
     }

   CloseByProfit();
   if(ShowComment)
     {
      Comment(IIFs(CurSymbolOnly,"CurSymbolOnly  ","")
              ,"Òåêóùèé ïðîôèò=",CurProfit," ï."
              ,"  Óáûòîê çàêðûòèÿ=",StopLoss," ï."
              ,"  Ïðèáûëü çàêðûòèÿ=",TakeProfit," ï."
              );
     }
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ  : 19.02.2008                                                      |
//|  Îïèñàíèå: Çàêðûòèå îäíîé ïðåäâàðèòåëüíî âûáðàííîé ïîçèöèè                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect()
  {
   bool   fc;
   color  clClose;
   double ll,pa,pb,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();
         pa=MarketInfo(OrderSymbol(), MODE_ASK);
         pb=MarketInfo(OrderSymbol(), MODE_BID);
         if(OrderType()==OP_BUY)
           {
            pp=pb; clClose=clCloseBuy;
              } else {
            pp=pa; 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*11);
            Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
                  ErrorDescription(err),", try ",it);
            Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
            Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
                  "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
            Sleep(1000*5);
           }
        }
     }
   else Print("Íåêîððåêòíàÿ òîðãîâàÿ îïåðàöèÿ. Close ",GetNameOP(OrderType()));
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 19.02.2008                                                     |
//|  Îïèñàíèå : Çàêðûòèå ïîçèöèé ïî ðûíî÷íîé öåíå ñíà÷àëà ïðèáûëüíûõ           |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit()
  {
   int i,k=OrdersTotal();

// Ñíà÷àëà çàêðûâàåì ïðèáûëüíûå ïîçèöèè
   for(i=k-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(!CurSymbolOnly || OrderSymbol()==Symbol())
           {
            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(!CurSymbolOnly || OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Çàêðûòèå âñåõ ïîçèöèé ïî ïðîôèòó.                                         |
//+----------------------------------------------------------------------------+
void CloseByProfit()
  {
   double pa,pb,pp;
   int    i,k=OrdersTotal(),pr=0;

   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(!CurSymbolOnly || OrderSymbol()==Symbol())
           {
            pa=MarketInfo(OrderSymbol(), MODE_ASK);
            pb=MarketInfo(OrderSymbol(), MODE_BID);
            pp=MarketInfo(OrderSymbol(), MODE_POINT);
            if(pp==0) if(StringFind(OrderSymbol(),"JPY")<0) pp=0.0001; else pp=0.01;
            if(OrderType()==OP_BUY)
              {
               pr+=NormalizeDouble((pb-OrderOpenPrice())/pp,0);
              }
            if(OrderType()==OP_SELL)
              {
               pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp,0);
              }
           }
        }
     }
   CurProfit=pr;
   if(CurProfit<=-StopLoss || CurProfit>=TakeProfit) ClosePosFirstProfit();
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                      |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op)
  {
   switch(op)
     {
      case OP_BUY      : return("Buy");
      case OP_SELL     : return("Sell");
      case OP_BUYLIMIT : return("BuyLimit");
      case OP_SELLLIMIT: return("SellLimit");
      case OP_BUYSTOP  : return("BuyStop");
      case OP_SELLSTOP : return("SellStop");
      default          : return("Unknown Operation");
     }
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.02.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ.      |
//+----------------------------------------------------------------------------+
string IIFs(bool condition,string ifTrue,string ifFalse)
  {
   if(condition) return(ifTrue); else return(ifFalse);
  }
//+----------------------------------------------------------------------------+
//|  Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë                                      |
//+----------------------------------------------------------------------------+
void Message(string m)
  {
   Comment(m);
   if(StringLen(m)>0) Print(m);
  }
//+----------------------------------------------------------------------------+

Comments