i-SignalOfTrade





//+----------------------------------------------------------------------------+
//|                                                       i-SignalOfTrade.mq4  |
//|                                                    Êèì Èãîðü Â. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  05.12.2007  Ñèãíàëèçàòîð âûïîëíåíèÿ òîðãîâûõ îïåðàöèé.                    |
//|  13.05.2008  Ñèãíàëèçàöèÿ ñðàáàòûâàíèÿ îòëîæåííîãî îðäåðà.                 |
//|  29.12.2008  Èñïðàâëåíà îøèáêà ñèãíàëèçàöèè óäàëåíèÿ îðäåðà.               |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"
#property indicator_chart_window

//------- Âíåøíèå ïàðàìåòðû èíäèêàòîðà ----------------------------------------+
extern string _P_WhatOutput    = "---------- ×òî âûâîäèòü";
extern bool   OutAccountNumber = True;      // Âûâîäèòü íîìåð ñ÷¸òà
extern bool   OutAccountServer = True;      // Âûâîäèòü èìÿ àêòèâíîãî ñåðâåðà
extern bool   OutNameExpert    = True;      // Âûâîäèòü èìÿ ýêñïåðòà
extern bool   OutDateTime      = True;      // Âûâîäèòü äàòó è âðåìÿ
extern bool   UseTimeLocal     = True;      // Èñïîëüçîâàòü ëîêàëüíîå âðåìÿ
extern bool   OutTicket        = False;     // Âûâîäèòü òèêåò
extern bool   OutMagic         = True;      // Âûâîäèòü ìàãèê
extern bool   OutComment       = True;      // Âûâîäèòü êîììåíòàðèé
extern string _P_WhereOutput = "---------- Êóäà âûâîäèòü";
extern bool   UseAlert    = True;           // Èñïîëüçîâàòü äèàëîãîâîå îêíî
extern bool   UseComment  = True;           // Âûâîäèòü êîììåíòàðèé
extern bool   UsePrint    = False;          // Çàïèñûâàòü â æóðíàë
extern bool   UseSendMail = False;          // Èñïîëüçîâàòü ïåðåäà÷ó ñîîáùåíèé
extern bool   UseSound    = True;           // Èñïîëüçîâàòü çâóê
extern string sotFileName = "expert.wav";   // Íàèìåíîâàíèå çâóêîâîãî ôàéëà

//------- Ãëîáàëüíûå ïåðåìåííûå èíäèêàòîðà ------------------------------------+
int    sotOTI[];             // òèêåò   OrderTicket()
int    sotOTY[];             // òèï     OrderType()
double sotOOP[];             // öåíà    OrderOpenPrice()
double sotOSL[];             // ñòîï    OrderStopLoss()
double sotOTP[];             // òåéê    OrderTakeProfit()
bool   sotFirstRun=True;     // Ôëàã ïåðâîãî ïðîãîíà


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ÏÐÅÄÎÏÐÅÄÅ˨ÍÍÛÅ ÔÓÍÊÖÈÈ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
void init() {
  sotFirstRun=True;     // Ôëàã ïåðâîãî ïðîãîíà
  Comment("");
}

//+----------------------------------------------------------------------------+
//|  Custom indicator deinitialization function                                |
//+----------------------------------------------------------------------------+
void deinit() { Comment(""); }

//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
void start() {
  double p;                  // Ðàçìåð ïóíêòà â âàëþòå êîòèðîâêè
  int    d;                  // Êîëè÷åñòâî öèôð ïîñëå äåñÿòè÷íîé òî÷êè â öåíå
  int    i;                  // Ñ÷¸ò÷èê îïåðàöèé
  int    in;                 // Èíäåêñ ýëåìåíòà ìàññèâà îïåðàöèé
  int    k=OrdersTotal();    // Êîëè÷åñòâî òåêóùèõ îïåðàöèé
  int    ot;                 // Òèï îïåðàöèè OrderType()
  int    oti[];              // Ìàññèâ íîâûõ òèêåòîâ
  string sh="";              // Ñòðîêà çàãîëîâêà ïî÷òîâîãî ñîîáùåíèÿ
  string st;                 // Ñòðîêà òåëà ïî÷òîâîãî ñîîáùåíèÿ

  if (sotFirstRun) { MemCurrOP(); sotFirstRun=False; }
  if (OutAccountNumber) sh=DoubleToStr(AccountNumber(), 0)+" ";
  if (OutAccountServer) sh=sh+AccountServer();
  if (StringLen(sh)>0) sh=sh+"\n";
  if (OutDateTime) {
    if (UseTimeLocal) sh=sh+TimeToStr(TimeLocal(), TIME_DATE|TIME_MINUTES)+" ";
    else sh=sh+TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS)+" ";
  }
  if (OutNameExpert) sh=sh+WindowExpertName()+" ";
  if (StringLen(sh)>0) sh=sh+"\n";
  
  // Îòêðûòèå/Óñòàíîâêà íîâûõ, ìîäèôèêàöèÿ ñóùåñòâóþùèõ
  ArrayResize(oti, k);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      oti[i]=OrderTicket();
      d=MarketInfo(OrderSymbol(), MODE_DIGITS);
      p=MarketInfo(OrderSymbol(), MODE_POINT);
      in=ArraySearchInt(sotOTI, oti[i]);

      // îïåðàöèÿ ÍÅ íàéäåíà, çíà÷èò íîâàÿ
      if (in<0) {
        ot=OrderType();
        if (ot==OP_BUY || ot==OP_SELL) st="Open ";
        if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP
        ||  ot==OP_SELLLIMIT || ot==OP_SELLSTOP) st="Set ";
        if (OutTicket) st=st+DoubleToStr(OrderTicket(), 0)+" ";
        st=st+GetNameOP(ot)+" "
             +DoubleToStr(OrderLots(), 2)+" "
             +OrderSymbol()
             +" PR="+DoubleToStr(OrderOpenPrice(), d)
             +" SL="+DoubleToStr(OrderStopLoss(), d)
             +" TP="+DoubleToStr(OrderTakeProfit(), d)
             +"\n"
             +IIFs(OutMagic, "Magic="+DoubleToStr(OrderMagicNumber(), 0), "")
             +IIFs(OutMagic && OutComment, " ", "")
             +IIFs(OutComment, "Comment=\""+OrderComment()+"\"", "")
             +IIFs(OutMagic || OutComment, "\n", "");
        if (ot==OP_BUY || ot==OP_SELL) {
          st=st+"Balance="+DoubleToStr(AccountBalance(), 2)
               +" FreeMargin="+DoubleToStr(AccountFreeMargin(), 2);
        }
        if (StringLen(sh)>0) st=sh+st;
        Signal(st);

      // îïåðàöèÿ íàéäåíà, çíà÷èò ñóùåñòâîâàëà ðàíåå è âîçìîæíî èçìåíåíà
      } else {
        // ñðàáàòûâàíèå îòëîæåííîãî îðäåðà
        ot=OrderType();
        if (ot!=sotOTY[in] && (ot==OP_BUY || ot==OP_SELL)) {
          st="Open ";
          if (OutTicket) st=st+DoubleToStr(OrderTicket(), 0)+" ";
          st=st+GetNameOP(ot)+" by "+GetNameOP(sotOTY[in])+" "
               +DoubleToStr(OrderLots(), 2)+" "
               +OrderSymbol()
               +" PR="+DoubleToStr(OrderOpenPrice(), d)
               +" SL="+DoubleToStr(OrderStopLoss(), d)
               +" TP="+DoubleToStr(OrderTakeProfit(), d)
               +"\n"
               +IIFs(OutMagic, "Magic="+DoubleToStr(OrderMagicNumber(), 0), "")
               +IIFs(OutMagic && OutComment, " ", "")
               +IIFs(OutComment, "Comment=\""+OrderComment()+"\"", "")
               +IIFs(OutMagic || OutComment, "\n", "");
          if (ot==OP_BUY || ot==OP_SELL) {
            st=st+"Balance="+DoubleToStr(AccountBalance(), 2)
                 +" FreeMargin="+DoubleToStr(AccountFreeMargin(), 2);
          }
          if (StringLen(sh)>0) st=sh+st;
          Signal(st);
        }
        // ìîäèôèêàöèÿ îðäåðà èëè ïîçèöèè
        if ((MathAbs(OrderOpenPrice()-sotOOP[in])>=p)
        ||  (MathAbs(OrderStopLoss()-sotOSL[in])>=p)
        ||  (MathAbs(OrderTakeProfit()-sotOTP[in])>=p)) {
          st="Modify ";
          if (OutTicket) st=st+DoubleToStr(OrderTicket(), 0)+" ";
          st=st+GetNameOP(OrderType())+" "
            +DoubleToStr(OrderLots(), 2)+" "
            +OrderSymbol();
          // èçìåíèëàñü öåíà îòêðûòèÿ
          if (MathAbs(OrderOpenPrice()-sotOOP[in])>=p) {
            st=st+" PR="+DoubleToStr(sotOOP[in], d)+"->"+DoubleToStr(OrderOpenPrice(), d);
          }
          // èçìåíèëñÿ óðîâåíü ñòîïà
          if (MathAbs(OrderStopLoss()-sotOSL[in])>=p) {
            st=st+" SL="+DoubleToStr(sotOSL[in], d)+"->"+DoubleToStr(OrderStopLoss(), d);
          }
          // èçìåíèëñÿ óðîâåíü òåéêà
          if (MathAbs(OrderTakeProfit()-sotOTP[in])>=p) {
            st=st+" TP="+DoubleToStr(sotOTP[in], d)+"->"+DoubleToStr(OrderTakeProfit(), d);
          }
          st=st+IIFs(OutMagic || OutComment, "\n", "")
               +IIFs(OutMagic, "Magic="+DoubleToStr(OrderMagicNumber(), 0), "")
               +IIFs(OutMagic && OutComment, " ", "")
               +IIFs(OutComment, "Comment=\""+OrderComment()+"\"", "")
               +IIFs(OutMagic || OutComment, "\n", "");
          if (StringLen(sh)>0) st=sh+st;
          Signal(st);
        }
      }
    }
  }

  // Çàêðûòèå ïîçèöèé / Óäàëåíèå îðäåðîâ
  k=ArraySize(sotOTI);
  for (i=0; i<k; i++) {
    if (ArraySearchInt(oti, sotOTI[i])<0) {
      ot=sotOTY[i];
      if (ot==OP_BUY || ot==OP_SELL) st="Close ";
      if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP
      ||  ot==OP_SELLLIMIT || ot==OP_SELLSTOP) st="Delete ";
      if (OutTicket) st=st+DoubleToStr(sotOTI[i], 0)+" ";
      if (OrderSelect(sotOTI[i], SELECT_BY_TICKET)) {
        d=MarketInfo(OrderSymbol(), MODE_DIGITS);
        st=st+GetNameOP(ot)+" "
             +DoubleToStr(OrderLots(), 2)+" "
             +OrderSymbol()
             +" PR="+DoubleToStr(OrderClosePrice(), d)
             ;
        if (ot==OP_BUY || ot==OP_SELL) {
          st=st+" Profit="+DoubleToStr(OrderProfit()+OrderSwap(), 2)
               +"\n"
               +IIFs(OutMagic, "Magic="+DoubleToStr(OrderMagicNumber(), 0), "")
               +IIFs(OutMagic && OutComment, " ", "")
               +IIFs(OutComment, "Comment=\""+OrderComment()+"\"", "")
               +IIFs(OutMagic || OutComment, "\n", "")
               +"Balance="+DoubleToStr(AccountBalance(), 2)
               +" FreeMargin="+DoubleToStr(AccountFreeMargin(), 2);
        }
        if (StringLen(sh)>0) st=sh+st;
        Signal(st);
      }
    }
  }

  MemCurrOP();
}


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ÏÎËÜÇÎÂÀÒÅËÜÑÊÈÅ ÔÓÍÊÖÈÈ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Âûïîëíÿåò ïîèñê ýëåìåíòà ìàññèâà ïî çíà÷åíèþ                              |
//|  è âîçâðàùàåò èíäåêñ íàéäåííîãî ýëåìåíòà èëè -1                            |
//|  Ïàðàìåòðû:                                                                |
//|    m - ìàññèâ ýëåìåíòîâ                                                    |
//|    e - çíà÷åíèå ýëåìåíòà                                                   |
//+----------------------------------------------------------------------------+
int ArraySearchInt(int& m[], int e) {
  for (int i=0; i<ArraySize(m); i++) {
    if (m[i]==e) return(i);
  }
  return(-1);
}

//+----------------------------------------------------------------------------+
//|  Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                                 |
//|  Ïàðàìåòðû:                                                                |
//|    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");
	}
}

//+----------------------------------------------------------------------------+
//|  Âîçâðàùàåò îäíî èç äâóõ çíà÷åíèé âçàâèñèìîñòè îò óñëîâèÿ.                 |
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//|  Çàïîìèíàåò òåêóùèå îïåðàöèè â ìàññèâå.                                    |
//+----------------------------------------------------------------------------+
void MemCurrOP() {
  int i, k=OrdersTotal();

  ArrayResize(sotOTI, k);
  ArrayResize(sotOTY, k);
  ArrayResize(sotOOP, k);
  ArrayResize(sotOSL, k);
  ArrayResize(sotOTP, k);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      sotOTI[i]=OrderTicket();
      sotOTY[i]=OrderType();
      sotOOP[i]=OrderOpenPrice();
      sotOSL[i]=OrderStopLoss();
      sotOTP[i]=OrderTakeProfit();
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Ïîäà÷à ñèãíàëà.                                                           |
//|  Ïàðàìåòðû:                                                                |
//|    st - ñòðîêà ñîîáùåíèÿ                                                   |
//+----------------------------------------------------------------------------+
void Signal(string st) {
  if (UseAlert) Alert(st);
  if (UseComment) Comment(st);
  if (UseSendMail) SendMail(WindowExpertName(), st);
  if (UsePrint) Print(st);
  if (UseSound) PlaySound(sotFileName);
}
//+----------------------------------------------------------------------------+





Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

Other Features:


It issuies visual alerts to the screen
It sends emails
It plays sound alerts