e-MoveSLTPbyMouse_v1

Author: ��� ����� �. aka KimIV
Orders Execution
It Closes Orders by itself Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategy
0 Views
0 Downloads
0 Favorites
e-MoveSLTPbyMouse_v1
//+----------------------------------------------------------------------------+
//|                                                     e-MoveSLTPbyMouse.mq4  |
//|                                                                            |
//|                                                    Êèì Èãîðü Â. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ñîâåòíèêà -----------------------------------------+
extern string _P_Expert="---------- Parameters of e-MoveSL&TPbyMouse";
extern int    Language    = 1;         // ßçûê: 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 = Gold;         // Öâåò ëèíèè óðîâíÿ TakeProfit
extern int   TakeStyle = 3;            // Ñòèëü ëèíèè óðîâíÿ TakeProfit
extern int   TakeWidth = 0;            // Òîëùèíà ëèíèè óðîâíÿ TakeProfit

//------- Ãëîáàëüíûå ïåðåìåííûå ñîâåòíèêà -------------------------------------+
int    Slippage     = 3;               // Ïðîñêàëüçûâàíèå öåíû
color  clModifyBuy  = Aqua;            // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè
color  clModifySell = Tomato;          // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè
color  clCloseBuy   = Blue;            // Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color  clCloseSell  = Red;             // Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
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]);
  }
//+----------------------------------------------------------------------------+
//|  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                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ  : 19.02.2008                                                      |
//|  Îïèñàíèå: Çàêðûòèå îäíîé ïðåäâàðèòåëüíî âûáðàííîé ïîçèöèè                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() 
  {
   bool   fc;
   color  clClose;
   double ll,pa,pb,pp;
   int    dg=MarketInfo(OrderSymbol(),MODE_DIGITS),err,it;

   if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
     {
      if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) 
        {
         Print("ClosePosBySelect(): Îñòàíîâêà ðàáîòû ôóíêöèè");
        }
      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();
      pp=NormalizeDouble(pp, dg);
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if(!fc) 
        {
         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                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 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);
                  // 09.01.2013 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;
                  if(OrderType()==OP_BUY && pp>Bid-(ms+1)*Point) ClosePosBySelect();
                  if(OrderType()==OP_SELL && pp<Ask+(ms+1)*Point) ClosePosBySelect();
                  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);
                  // 09.01.2013 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;
                  if(OrderType()==OP_BUY && pp<Bid+(ms+1)*Point) ClosePosBySelect();
                  if(OrderType()==OP_SELL && pp>Ask-(ms+1)*Point) ClosePosBySelect();
                  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);
        }
     }
  }
//+----------------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---