//+----------------------------------------------------------------------------+ //| e-MoveSLTPbyMouse.mq4 | //| | //| Êèì Èãîðü Â. aka KimIV | //| http://www.kimiv.ru | //| | //| 31.03.2008 Ñîâåòíèê äëÿ ïåðåìåùåíèÿ óðîâíåé SL è TP ñ ïîìîùüþ ìûøè. | //| 08.04.2008 Íîðìèðîâàíèå óðîâíåé SL è TP ïîä ðàçìåð òèêà. | //+----------------------------------------------------------------------------+ #property copyright "Êèì Èãîðü Â. aka KimIV" #property link "http://www.kimiv.ru" //------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà -----------------------------------------+ extern string _P_Expert = "---------- Parameters of e-MoveSL&TPbyMouse"; extern int Language = 0; // ßçûê: 0-English, 1-Ðóññêèé extern double IntUpdate = 0.371; // Èíòåðâàë îáíîâëåíèÿ â ñåêóíäàõ extern bool PrintEnable = True; // Ðàçðåøèòü ïå÷àòü â æóðíàë extern string _P_Graphics = "---------- Parameters of Graphic Objects"; extern color StopColor = Red; // Öâåò ëèíèè óðîâíÿ StopLoss extern int StopStyle = 3; // Ñòèëü ëèíèè óðîâíÿ StopLoss extern int StopWidth = 0; // Òîëùèíà ëèíèè óðîâíÿ StopLoss extern color TakeColor = Red; // Öâåò ëèíèè óðîâíÿ TakeProfit extern int TakeStyle = 3; // Ñòèëü ëèíèè óðîâíÿ TakeProfit extern int TakeWidth = 0; // Òîëùèíà ëèíèè óðîâíÿ TakeProfit //------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+ color clModifyBuy = Aqua; // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè color clModifySell = Tomato; // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè string msg[4][2]; //------- Ïîäêëþ÷åíèå âíåøíèõ ìîäóëåé -----------------------------------------+ #include <stdlib.mqh> // Ñòàíäàðòíàÿ áèáëèîòåêà //+----------------------------------------------------------------------------+ //| | //| ÏÐÅÄÎÏÐÅÄÅ˨ÍÍÛÅ ÔÓÍÊÖÈÈ | //| | //+----------------------------------------------------------------------------+ //| expert initialization function | //+----------------------------------------------------------------------------+ void init() { msg[0][0]="Adviser will is started by next tick"; msg[0][1]="Ñîâåòíèê áóäåò çàïóùåí ñëåäóþùèì òèêîì"; msg[1][0]="Button is not pressed \"Enable experts for running\""; msg[1][1]="Îòæàòà êíîïêà \"Ðàçðåøèòü çàïóñê ñîâåòíèêîâ\""; msg[2][0]="IS ABSENT relationship with trade server\n"+ "Adviser is STOPPED"; msg[2][1]="ÎÒÑÓÒÑÒÂÓÅÒ ñâÿçü ñ òîðãîâûì ñåðâåðîì\n"+ "Ñîâåòíèê ÎÑÒÀÍÎÂËÅÍ"; msg[3][0]="Button is not pressed \"Enable experts for running\"\n"+ "Expert Adviser is STOPPED"; msg[3][1]="Îòæàòà êíîïêà \"Ðàçðåøèòü çàïóñê ñîâåòíèêîâ\"\n"+ "Ñîâåòíèê ÎÑÒÀÍÎÂËÅÍ"; if (Language<0 || Language>1) Message("Language is invalid"); if (IsExpertEnabled()) { if (IntUpdate>0) start(); else Message(msg[0][Language]); } else Message(msg[1][Language]); Print("init"); } //+----------------------------------------------------------------------------+ //| expert deinitialization function | //+----------------------------------------------------------------------------+ void deinit() { int i, k=ObjectsTotal(); string on; // óäàëåíèå ëèíèé for (i=0; i<k; i++) { on=ObjectName(i); if (StringSubstr(on, 0, 2)=="sl") ObjectDelete(on); if (StringSubstr(on, 0, 2)=="tp") ObjectDelete(on); } Comment(""); } //+----------------------------------------------------------------------------+ //| expert start function | //+----------------------------------------------------------------------------+ void start() { if (IntUpdate<=0) ManageLines(); else { while (IsExpertEnabled() && !IsStopped()) { if (IsConnected()) ManageLines(); else { Comment(msg[2][Language]); return; } Sleep(1000*IntUpdate); } Message(msg[3][Language]); } } //+----------------------------------------------------------------------------+ //| | //| ÏÎËÜÇÎÂÀÒÅËÜÑÊÈÅ ÔÓÍÊÖÈÈ | //| | //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 01.09.2005 | //| Îïèñàíèå : Âûïîëíÿåò ïîèñê ýëåìåíòà ìàññèâà ïî çíà÷åíèþ | //| è âîçâðàùàåò èíäåêñ íàéäåííîãî ýëåìåíòà èëè -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); } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 30.03.2008 | //| Îïèñàíèå : Ïðîðèñîâêà ãîðèçîíòàëüíîé ëèíèè | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| cl - öâåò ëèíèè | //| nm - íàèìåíîâàíèå ("" - âðåìÿ îòêðûòèÿ òåêóùåãî áàðà) | //| p1 - öåíîâîé óðîâåíü (0 - Bid) | //| st - ñòèëü ëèíèè (0 - ïðîñòàÿ ëèíèÿ) | //| wd - øèðèíà ëèíèè (0 - ïî óìîë÷àíèþ) | //+----------------------------------------------------------------------------+ void DrawHLine(color cl, string nm="", double p1=0, int st=0, int wd=0) { if (p1==0) p1=Bid; if (ObjectFind(nm)<0) { ObjectCreate(nm, OBJ_HLINE, 0, 0,0); ObjectSet(nm, OBJPROP_PRICE1, p1); ObjectSet(nm, OBJPROP_COLOR , cl); ObjectSet(nm, OBJPROP_STYLE , st); ObjectSet(nm, OBJPROP_WIDTH , wd); } } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. 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("Buy Limit"); case OP_SELLLIMIT: return("Sell Limit"); case OP_BUYSTOP : return("Buy Stop"); case OP_SELLSTOP : return("Sell Stop"); 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 ManageLines() { double ms=MarketInfo(Symbol(), MODE_STOPLEVEL); double ts=MarketInfo(Symbol(), MODE_TICKSIZE); double pp; // öåíîâîé óðîâåíü StopLoss/TakeProfit double np; // íåíîðìèðîâàííûé öåíîâîé óðîâåíü StopLoss/TakeProfit int i, k; // ñ÷¸ò÷èê è êîëè÷åñòâî îáúåêòîâ/îðäåðîâ int r; // òèêåò èñêîìîé ïîçèöèè int t[]; // ìàññèâ òèêåòîâ ñóùåñòâóþùèõ ïîçèöèé string on; // íàèìåíîâàíèå îáúåêòà string st; // ñòðîêà êîììåíòàðèÿ // çàïîëíåíèå ìàññèâà òèêåòîâ ñóùåñòâóþùèõ ïîçèöèé ArrayResize(t, 0); k=OrdersTotal(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (OrderStopLoss()>0 || OrderTakeProfit()>0) { r=ArraySize(t); ArrayResize(t, r+1); t[r]=OrderTicket(); } } } } } // óäàëåíèå ëèøíèõ (íåíóæíûõ) ëèíèé, ìîäèôèêàöèÿ óðîâíåé k=ObjectsTotal(); for (i=0; i<k; i++) { on=ObjectName(i); if (StringSubstr(on, 0, 2)=="sl") { // òèêåò ïîçèöèè r=StrToInteger(StringSubstr(on, 2)); if (ArraySearchInt(t, r)<0) ObjectDelete(on); else { if (OrderSelect(r, SELECT_BY_TICKET)) { if (OrderStopLoss()>0) { np=NormalizeDouble(ObjectGet(on, OBJPROP_PRICE1), Digits); if (ts>0) pp=NormalizeDouble(np/ts, 0)*ts; else pp=np; if (pp!=np) ModifyHLine(on, pp); if (OrderType()==OP_BUY && pp>Bid-(ms+1)*Point) pp=Bid-(ms+1)*Point; if (OrderType()==OP_SELL && pp<Ask+(ms+1)*Point) pp=Ask+(ms+1)*Point; ModifyOrder(-1, NormalizeDouble(pp, Digits), -1); } else ObjectDelete(on); } } } if (StringSubstr(on, 0, 2)=="tp") { // òèêåò ïîçèöèè r=StrToInteger(StringSubstr(on, 2)); if (ArraySearchInt(t, r)<0) ObjectDelete(on); else { if (OrderSelect(r, SELECT_BY_TICKET)) { if (OrderTakeProfit()>0) { np=NormalizeDouble(ObjectGet(on, OBJPROP_PRICE1), Digits); if (ts>0) pp=NormalizeDouble(np/ts, 0)*ts; else pp=np; if (pp!=np) ModifyHLine(on, pp); if (OrderType()==OP_BUY && pp<Bid+(ms+1)*Point) pp=Bid+(ms+1)*Point; if (OrderType()==OP_SELL && pp>Ask-(ms+1)*Point) pp=Ask-(ms+1)*Point; ModifyOrder(-1, -1, NormalizeDouble(pp, Digits)); } else ObjectDelete(on); } } } } // óñòàíîâêà íåäîñòàþùèõ ëèíèé k=OrdersTotal(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (OrderStopLoss()>0) { DrawHLine(StopColor, "sl"+OrderTicket(), OrderStopLoss(), StopStyle, StopWidth); } if (OrderTakeProfit()>0) { DrawHLine(TakeColor, "tp"+OrderTicket(), OrderTakeProfit(), TakeStyle, TakeWidth); } } } } } st="Language="+IIFs(Language==0, "English", "Ðóññêèé") +" IntUpdate="+DoubleToStr(IntUpdate, 4) +" "+IIFs(PrintEnable, "PrintEnable", ""); Comment(st); } //+----------------------------------------------------------------------------+ //| Âûâîä ñîîáùåíèÿ â êîììåíò è â æóðíàë | //| Ïàðàìåòðû: | //| m - òåêñò ñîîáùåíèÿ | //+----------------------------------------------------------------------------+ void Message(string m) { Comment(m); if (StringLen(m)>0 && PrintEnable) Print(m); } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 08.04.2008 | //| Îïèñàíèå : Ìîäèôèêàöèÿ öåíîâîãî óðîâíÿ ãîðèçîíòàëüíîé ëèíèè | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| nm - íàèìåíîâàíèå ("" - âðåìÿ îòêðûòèÿ òåêóùåãî áàðà) | //| p1 - öåíîâîé óðîâåíü (0 - Bid) | //+----------------------------------------------------------------------------+ void ModifyHLine(string nm="", double p1=0) { if (p1==0) p1=Bid; if (ObjectFind(nm)>=0) ObjectSet(nm, OBJPROP_PRICE1, p1); } //+----------------------------------------------------------------------------+ //| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Âåðñèÿ : 28.03.2008 | //| Îïèñàíèå : Ìîäèôèêàöèÿ îðäåðà. Âåðñèÿ ôóíêöèè äëÿ òåñòîâ íà èñòîðèè. | //+----------------------------------------------------------------------------+ //| Ïàðàìåòðû: | //| pp - öåíà îòêðûòèÿ ïîçèöèè, óñòàíîâêè îðäåðà | //| sl - öåíîâîé óðîâåíü ñòîïà | //| tp - öåíîâîé óðîâåíü òåéêà | //| ex - äàòà èñòå÷åíèÿ | //+----------------------------------------------------------------------------+ void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) { int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er; double op=NormalizeDouble(OrderOpenPrice() , dg); double os=NormalizeDouble(OrderStopLoss() , dg); double ot=NormalizeDouble(OrderTakeProfit(), dg); color cl; if (pp<=0) pp=OrderOpenPrice(); if (sl<0 ) sl=OrderStopLoss(); if (tp<0 ) tp=OrderTakeProfit(); pp=NormalizeDouble(pp, dg); sl=NormalizeDouble(sl, dg); tp=NormalizeDouble(tp, dg); if (pp!=op || sl!=os || tp!=ot) { if (MathMod(OrderType(), 2)==0) cl=clModifyBuy; else cl=clModifySell; if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) { er=GetLastError(); Print("Error(",er,") modifying order: ",ErrorDescription(er)); Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(), " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp); } } } //+----------------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy
Other Features: