//+----------------------------------------------------------------------------+ //| 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