e-VTrailingByProfit

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

//------- Êîíñòàíòû ------------------------------------------------------------
#define BEGIN_PROFIT -999999999        // Íà÷àëüíûé ïðîôèò

//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà ------------------------------------------
extern string _P_Expert = "---------- Ïàðàìåòðû ñîâåòíèêà";
extern int    NumberAccount  = 0;           // Íîìåð òîðãîâîãî ñ÷¸òà
extern string symbol         = "";          // Òîðãîâûé èíñòðóìåíò
                                            //   ""  - ëþáîé
                                            //   "0" - òåêóùèé
extern int    Operation      = -1;          // Òîðãîâàÿ îïåðàöèÿ:
                                            //   -1 - ëþáàÿ
                                            //    0 - OP_BUY
                                            //    1 - OP_SELL
extern int    MagicNumber    = -1;          // Èäåíòèôèêàòîð
                                            //   -1 - ëþáîé
extern double TrailingStart  = 0;           // Óðîâåíü ïðîôèòà - Ñòàðòîâûé óðîâåíü òðàëà
extern double TrailingStop   = 47;          // Ôèêñèðîâàííûé ðàçìåð òðàëà â âàëþòå äåïîçèòà
extern double TrailingStep   = 1.5;         // Øàã òðàëà â âàëþòå äåïîçèòà

extern string _P_Performance = "---------- Ïàðàìåòðû èñïîëíåíèÿ";
extern bool   ShowComment   = True;              // Ïîêàçûâàòü êîììåíòàðèé
extern bool   PrintEnable   = True;              // Ðàçðåøèòü ïå÷àòü â æóðíàë
extern bool   AllMessages   = True;              // Ïðîòîêîëèðîâàòü âñå ñîîáùåíèÿ
extern bool   UseSound      = False;             // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string SoundSuccess  = "ok.wav";          // Çâóê óñïåõà
extern string SoundError    = "timeout.wav";     // Çâóê îøèáêè
extern int    Slippage      = 2;                 // Ïðîñêàëüçûâàíèå öåíû
extern int    NumberOfTry   = 3;                 // Êîëè÷åñòâî ïîïûòîê

//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà --------------------------------------
bool   gbDisabled  = False;            // Ôëàã áëîêèðîâêè ñîâåòíèêà
bool   gbNoInit    = False;            // Ôëàã íåóäà÷íîé èíèöèàëèçàöèè
color  clCloseBuy  = Blue;             // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color  clCloseSell = Red;              // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
double gdProfit    = BEGIN_PROFIT;     // Ñóììàðíûé ïðîôèò âûáðàííûõ ïîçèöèé

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


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ÏÐÅÄÎÏÐÅÄÅ˨ÍÍÛÅ ÔÓÍÊÖÈÈ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
void init() {
  gbNoInit=False;
  if (!IsTradeAllowed()) {
    Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
            "Ðàçðåøèòü ñîâåòíèêó òîðãîâàòü");
    gbNoInit=True; return;
  }
  if (!IsLibrariesAllowed()) {
    Message("Äëÿ íîðìàëüíîé ðàáîòû ñîâåòíèêà íåîáõîäèìî\n"+
            "Ðàçðåøèòü èìïîðò èç âíåøíèõ ýêñïåðòîâ");
    gbNoInit=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 (gbNoInit) {
    Message("Íå óäàëîñü èíèöèàëèçèðîâàòü ñîâåòíèê!"); return;
  }
  if (!IsTesting()) {
    if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
      Message("ÇÀÏÐÅÙÅÍÀ ðàáîòà íà ñ÷¸òå "+AccountNumber());
      return;
    } else Comment("");
  }

  string sy=StringUpper(symbol);
  if (ExistPositions(sy, Operation, MagicNumber)) {
    double pr=GetProfitOpenPosInCurrency(sy, Operation, MagicNumber);
    if (pr-TrailingStop>=TrailingStart) {
      if (gdProfit<pr-TrailingStop-TrailingStep) gdProfit=pr-TrailingStop;
    }
  } else gdProfit=BEGIN_PROFIT;
  if (gdProfit>=pr) {
    for (int i=0; i<NumberOfTry; i++) ClosePosFirstProfit(sy, Operation, MagicNumber);
  }
  if (!IsTesting() && ShowComment) {
    string st="NumberAccount="+DoubleToStr(NumberAccount, 0)
             +"  Symbol="+IIFs(symbol=="", "All", IIFs(symbol=="0", Symbol(), StringUpper(symbol)))
             +"  Operation="+IIFs(Operation<0, "All", GetNameOP(Operation))
             +"  MagicNumber="+IIFs(MagicNumber<0, "All", DoubleToStr(MagicNumber, 0))
             +"\n"
             +"TrailingStart="+DoubleToStr(TrailingStart, 2)+" "+AccountCurrency()
             +"TrailingStop="+DoubleToStr(TrailingStop, 2)+" "+AccountCurrency()
             +"  TrailingStep="+DoubleToStr(TrailingStep, 2)+" "+AccountCurrency()
             +"\n"
             +"Current Stop="+IIFs(gdProfit>BEGIN_PROFIT, DoubleToStr(gdProfit, 2)+" "+AccountCurrency(), "None")
             +"  Current Profit="+DoubleToStr(pr, 2)+" "+AccountCurrency()
             ;
    Comment(st);
  } else Comment("");
}


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ÏÎËÜÇÎÂÀÒÅËÜÑÊÈÅ ÔÓÍÊÖÈÈ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. 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(SoundSuccess); break;
      } else {
        err=GetLastError();
        if (UseSound) PlaySound(SoundError);
        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                                                     |
//|  Îïèñàíèå : Çàêðûòèå ïîçèöèé ïî ðûíî÷íîé öåíå ñíà÷àëà ïðèáûëüíûõ           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Ñíà÷àëà çàêðûâàåì ïðèáûëüíûå ïîçèöèè
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Ïîòîì âñå îñòàëüíûå
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 06.03.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ôëàã ñóùåñòâîâàíèÿ ïîçèöèé                          |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//|    ot - âðåìÿ îòêðûòèÿ             ( 0   - ëþáîå âðåìÿ îòêðûòèÿ)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();

  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()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. 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                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 19.02.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ñóììàðíûé ïðîôèò îòêðûòûõ ïîçèöèé â âàëþòå äåïîçèòà |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(p);
}

//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.02.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ.      |
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë                           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    m - òåêñò ñîîáùåíèÿ                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  static string prevMessage="";
  Comment(m);
  if (StringLen(m)>0 && PrintEnable) {
    if (AllMessages || prevMessage!=m) {
      prevMessage=m;
      Print(m);
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 01.09.2005                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò ñòðîêó â ÂÅÐÕÍÅÌ ðåãèñòðå                           |
//+----------------------------------------------------------------------------+
string StringUpper(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>96 && c<123) n=c-32;    // a-z -> A-Z
    if (c>223 && c<256) n=c-32;   // à-ÿ -> À-ß
    if (c==184) n=168;            //  ¸  ->  ¨
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}
//+----------------------------------------------------------------------------+

Comments