Trailing_By_Object_Block

Author: Roll
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategy
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
Trailing_By_Object_Block
//+------------------------------------------------------------------+
//|                                     Trailing_By_Object_Block.mq4 |
//|                                                             Roll |
//+------------------------------------------------------------------+
#property copyright "Roll"
#property link      "http://www.mql4.com/ru/users/Roll"
#include <Block_err_130.mqh>
//Sources: 1)Trailing_By_Object.mq4/author Evgeniy Trofimov/http://codebase.mql4.com/ru/6349
//2)Block_err_130/http://codebase.mql4.com/ru/7438 
extern int    Ticket=1;//Åñëè 1,òî ðàáîòà ñî âñåìè ïîçèöèÿìè èëè Ìàãèê-îðäåðàìè ïî òåêóùåìó èíñòðóìåíòó;åñëè Ticket>1,òî äëÿ îðäåðà ñ îïðåäåëåííûì òèêåòîì;åñëè Ticket=0,òî -STOP expert
extern int    Magic=0;//Ìàãèê îðäåðà ïðè Ticket=1
extern bool   OunlyPendOrders=true;//Åñëè false-ðàáîòà ñ ðûíî÷íûìè îðäåðàìè,åñëè true-ñ îòëîæåííûìè.
extern bool   MarketSL_TP=true;//ïîñò.ðàáîòà ñ SL è TP ðûíî÷íûõ îðäåðîâ 
extern bool   DeleteObjectSL_TP_cross=true;//ðàçðåøåíèå íà óäàëåíèå cîîòâ.ëèíèè (SL èëè TP) ïîñëå ïåðåñå÷åíèÿ  
extern int    SleepPage=2;//ïðîñêàëüçûâàíèå â ïóíêòàõ
extern string m1="/==========OP===========/";
extern string NameObject_TREND="MyTrend_OP";//Íàèìåíîâàíèå ëèíèè äëÿ(OP)îòëîæåííîãî(ûõ)îðäåðà(îâ) 
extern int    SparePips_TREND=8;//Ðàññòîÿíèå îò ñîîòâ.ëèíèè äî ÎÐ îòëîæåííîãî(ûõ)îðäåðà(îâ)â ïóíêòàõ
extern string m2="/==========SL===========/";
extern string NameObject_SL="MyTrend_SL";//Íàèìåíîâàíèå ëèíèè äëÿ SL ðûíî÷íûõ îðäåðîâ
extern int    SparePips_SL=8;//Ðàññòîÿíèå îò ñîîòâ.ëèíèè äî SL â ïóíêòàõ
extern bool   CloseExtern_SL=false;//Çàêðûâàòü îòêðûòóþ ïîçèöèþ ïîñëå ïåðåñå÷åíèÿ ëèíèè NameObject_SL
extern string m3="/==========TP===========/";
extern string NameObject_TP="MyTrend_TP";//Íàèìåíîâàíèå ëèíèè äëÿ TakeProfit ðûíî÷íûõ îðäåðîâ  
extern int    SparePips_TP=8;//Ðàññòîÿíèå îò ñîîòâ.ëèíèè äî TakeProfit â ïóíêòàõ
extern bool   CloseExtern_TP=false;//Çàêðûâàòü îòêðûòóþ ïîçèöèþ ïîñëå ïåðåñå÷åíèÿ ëèíèè NameObject_TP
double Spare_SL,Spare_TREND,Spare_TP,point,Spread;int digits;string Symb;
//+------------------------------------------------------------------+
int init(){Comment("");Symb=Symbol();point=MarketInfo(Symb,MODE_POINT);Spread=MarketInfo(Symb,MODE_SPREAD)*point;
 digits=Digits;if(digits==3||digits==5){SleepPage=SleepPage*10;SparePips_TREND=SparePips_TREND*10;
 SparePips_SL=SparePips_SL*10;SparePips_TP=SparePips_TP*10;}return(0);} 
int deinit(){Comment("");return(0);} 
int start() 
{Comment("");if(Ticket==0||OrdersTotal()==0||Bars<200){Comment("STOP expert");return(0);}
 double Price_TREND,Price_TP,Price_SL;string txt="";
 Spare_TREND=SparePips_TREND*point;Spare_TP=SparePips_TP*point;Spare_SL=SparePips_SL*point;
 if(ObjectFind(NameObject_TREND)==0||ObjectFind(NameObject_TP)==0)
 {if(Ticket==1&&Magic==0){txt="All tickets";
  for(int i=0;i<OrdersTotal();i++) 
  {if(OrderSelect(i,SELECT_BY_POS))
   {Price_TREND=ObjectGetValueByShift(NameObject_TREND,0);Price_TP=ObjectGetValueByShift(NameObject_TP,0);
    Price_SL=ObjectGetValueByShift(NameObject_SL,0);
    if(OrderSymbol()==Symb)Move(OrderTicket(),Price_TREND,Price_TP,Price_SL);}}}
  else if(Ticket==1&&Magic>0){txt="Magic = "+Magic;
  for(i=0;i<OrdersTotal();i++) 
  {if(OrderSelect(i,SELECT_BY_POS))
   {Price_TREND=ObjectGetValueByShift(NameObject_TREND,0);Price_TP=ObjectGetValueByShift(NameObject_TP,0);
    Price_SL=ObjectGetValueByShift(NameObject_SL,0);
    if(OrderSymbol()==Symb&&OrderMagicNumber()==Magic)Move(OrderTicket(),Price_TREND,Price_TP,Price_SL);}}
  }else if(Ticket>1){txt="Ticket= "+Ticket;
    if(OrderSelect(Ticket,SELECT_BY_TICKET))
    {Price_TREND=ObjectGetValueByShift(NameObject_TREND,0);Price_TP=ObjectGetValueByShift(NameObject_TP,0);
     Price_SL=ObjectGetValueByShift(NameObject_SL,0);Move(OrderTicket(),Price_TREND,Price_TP,Price_SL);}} 
  else txt="\nTicket "+Ticket+" not found";
  Comment("\nLine Price TREND = "+DoubleToStr(Price_TREND,digits),"\n","Line Price TP = "+DoubleToStr(Price_TP,digits),
  "\n","Line Price SL = "+DoubleToStr(Price_SL,digits),"\n",txt);}else Comment("Object not found");return(0);}
//+------------------------------------------------------------------+
int Move(int myTicket,double Price_TREND=0,double Price_TP=0,double Price_SL=0)
{bool err;double Delta,tp,sl,Closepos,PriceM=Price_TREND,PriceProfity=Price_TP,PriceSL=Price_SL,
 StopLevel=MarketInfo(Symb,MODE_STOPLEVEL)*point;
 if(OrderSelect(myTicket,SELECT_BY_TICKET)){int Tip=OrderType();double new_tp=0,new_Pos=0,
   OPos=OrderOpenPrice(),SLpos=ND(OrderStopLoss()),TPpos=ND(OrderTakeProfit());
 switch(Tip)
 {case OP_BUY:if(OunlyPendOrders==false||MarketSL_TP==true)
  {if(PriceSL!=0&&CloseExtern_SL)
   {if(IsTradeAllowed()&&(PriceSL-Spare_SL>Bid)&&Block_err_130(1,Tip,OPos,SLpos,TPpos,0,0,0)) 
    {Closepos=ND(OrderClosePrice());err=OrderClose(myTicket,OrderLots(),Closepos,SleepPage,White);
     if(!err)Print(OrderError());
     else{if(DeleteObjectSL_TP_cross){if(ObjectDelete(NameObject_SL))Alert(Symb," ëèíèÿ SL ",NameObject_SL," óäàëåíà! ",
     " : ñðàáîòàëî ïåðåñå÷åíèå BUY!"," Ticket:  ",myTicket);}Sleep(1000);break;}}}
    if(PriceProfity!=0&&CloseExtern_TP)     
    {if(IsTradeAllowed()&&PriceProfity<Bid&&Block_err_130(1,Tip,OPos,SLpos,TPpos,0,0,0))     
     {Closepos=ND(OrderClosePrice());err=OrderClose(myTicket,OrderLots(),Closepos,SleepPage,White);
      if(!err)Print(OrderError());
      else{if(DeleteObjectSL_TP_cross){if(ObjectDelete(NameObject_TP))Alert(Symb," ëèíèÿ TP ",NameObject_TP," óäàëåíà! ",
      " : ñðàáîòàëî ïåðåñå÷åíèå BUY!"," Ticket:  ",myTicket);} Sleep(1000);break;}}}
    if(PriceSL!=0&&(PriceSL<Bid-StopLevel)&&err==false)
    {sl=ND(PriceSL-Spare_SL);if(PriceSL>SLpos+Spare_SL)sl=ND(PriceSL-Spare_SL);
     if(PriceSL<SLpos+Spare_SL+2*Spread)sl=ND(PriceSL-Spare_SL);
     if(IsTradeAllowed()&&(sl!=0)&&(MathAbs(sl-SLpos)>point)&&Block_err_130(3,Tip,OPos,SLpos,TPpos,OPos,sl,TPpos))
     {err=OrderModify(myTicket,OPos,sl,TPpos,0);if(!err)Print(OrderError());else{Sleep(1000);break;}}}
    if(PriceProfity!=0&&err==false)
    {new_tp=ND(PriceProfity-Spare_TP);if(PriceProfity>TPpos+Spare_TP)new_tp=ND(PriceProfity-Spare_TP);
     if(PriceProfity<TPpos+Spare_TP+2*Spread)new_tp=ND(PriceProfity-Spare_TP);
     if(IsTradeAllowed()&&(new_tp!=0)&&(MathAbs(new_tp-TPpos)>point)&&Block_err_130(3,Tip,OPos,SLpos,TPpos,OPos,SLpos,new_tp))
     {err=OrderModify(myTicket,OPos,SLpos,new_tp,0);if(!err)Print(OrderError());else{Sleep(1000);break;}}}}break;
 case OP_SELL:if(OunlyPendOrders==false||MarketSL_TP==true)
  {if(PriceSL!=0&&CloseExtern_SL)
   {if(IsTradeAllowed()&&(Bid>PriceSL+Spare_SL)&&Block_err_130(1,Tip,OPos,SLpos,TPpos,0,0,0))
    {Closepos=ND(OrderClosePrice());err=OrderClose(myTicket,OrderLots(),Closepos,SleepPage,White);
     if(!err)Print(OrderError());
     else{if(DeleteObjectSL_TP_cross){if(ObjectDelete(NameObject_SL))Alert(Symb," ëèíèÿ SL ",NameObject_SL," óäàëåíà! ",
     " : ñðàáîòàëî ïåðåñå÷åíèå SELL!"," Ticket:  ",myTicket);}Sleep(1000);break;}}}
   if(PriceProfity!=0&&CloseExtern_TP)
    {if(IsTradeAllowed()&&(Bid<PriceProfity-Spread)&&Block_err_130(1,Tip,OPos,SLpos,TPpos,0,0,0))
     {Closepos=ND(OrderClosePrice());err=OrderClose(myTicket,OrderLots(),Closepos,SleepPage,White);
      if(!err)Print(OrderError()); 
      else{if(DeleteObjectSL_TP_cross){if(ObjectDelete(NameObject_TP))Alert(Symb," ëèíèÿ TP ",NameObject_TP," óäàëåíà! ",
      " : ñðàáîòàëî ïåðåñå÷åíèå SELL!"," Ticket:  ",myTicket);}Sleep(1000);break;}}}
   if(PriceSL!=0&&(PriceSL>Ask+StopLevel)&&err==false)
   {sl=ND(PriceSL+Spread+Spare_SL);if(SLpos>PriceSL+Spread+Spare_SL)sl=ND(PriceSL+Spread+Spare_SL); 
    if(SLpos<PriceSL-2*Spread+Spare_SL)sl=ND(PriceSL+Spread+Spare_SL);
    if(IsTradeAllowed()&&(sl!=0)&&(MathAbs(sl-SLpos)>point)&&Block_err_130(3,Tip,OPos,SLpos,TPpos,OPos,sl,TPpos)) 
    {err=OrderModify(myTicket,OPos,sl,TPpos,0);if(!err)Print(OrderError());else{Sleep(1000);break;}}}
   if(PriceProfity!=0&&err==false)
   {new_tp=ND(PriceProfity+Spare_TP+Spread); 
    if(TPpos>PriceProfity+Spread+Spare_TP)new_tp=ND(PriceProfity+Spread+Spare_TP);
    if(TPpos<PriceProfity-2*Spread+Spare_TP)new_tp=ND(PriceProfity+Spread+Spare_TP);
    if(IsTradeAllowed()&&(new_tp!=0)&&(MathAbs(TPpos-new_tp)>point)&&Block_err_130(3,Tip,OPos,SLpos,TPpos,OPos,SLpos,new_tp))
    {err=OrderModify(myTicket,OPos,SLpos,new_tp,0);if(!err)Print(OrderError());else{Sleep(1000);break;}}}}break;
 case OP_BUYSTOP:if(OunlyPendOrders==true&&err==false)
 {Delta=OPos-(PriceM+Spread+Spare_TREND);new_Pos=ND(OPos-Delta); 
  if(TPpos>0)tp=ND(TPpos-Delta);else tp=0;if(SLpos>0)sl=ND(SLpos-Delta);else sl=0;
  if(IsTradeAllowed()&&(MathAbs(Delta)>=point)&&Block_err_130(3,Tip,OPos,SLpos,TPpos,new_Pos,sl,tp))
  {err=OrderModify(myTicket,new_Pos,sl,tp,0);if(!err)Print(OrderError());else{Sleep(1000);break;}}}break;
 case OP_SELLSTOP:if(OunlyPendOrders==true&&err==false)
 {Delta=(PriceM-Spare_TREND)-OPos;new_Pos=ND(OPos+Delta);
  if(TPpos>0)tp=ND(TPpos+Delta);else tp=0;if(SLpos>0)sl=ND(SLpos+Delta);else sl=0;
  if(IsTradeAllowed()&&(MathAbs(Delta)>=point)&&Block_err_130(3,Tip,OPos,SLpos,TPpos,new_Pos,sl,tp))
  {err=OrderModify(myTicket,new_Pos,sl,tp,0);if(!err)Print(OrderError());else{Sleep(1000);break;}}}break;  
 case OP_BUYLIMIT:if(OunlyPendOrders==true&&err==false)
 {Delta=(PriceM+Spread+Spare_TREND)-OPos;new_Pos=ND(OPos+Delta);
  if(TPpos>0)tp=ND(TPpos+Delta);else tp=0;if(SLpos>0)sl=ND(SLpos+Delta);else sl=0;
  if(IsTradeAllowed()&&(MathAbs(Delta)>=point)&&Block_err_130(3,Tip,OPos,SLpos,TPpos,new_Pos,sl,tp))
  {err=OrderModify(myTicket,new_Pos,sl,tp,0);if(!err)Print(OrderError());else{Sleep(1000);break;}}}break; 
 case OP_SELLLIMIT :
 if(OunlyPendOrders==true&&err==false){Delta=OPos-(PriceM-Spare_TREND);new_Pos=ND(OPos-Delta); 
  if(TPpos>0)tp=ND(TPpos-Delta);else tp=0;if(SLpos>0)sl=ND(SLpos-Delta);else sl=0;
  if(IsTradeAllowed()&&(MathAbs(Delta)>=point)&&Block_err_130(3,Tip,OPos,SLpos,TPpos,new_Pos,sl,tp))
  {err=OrderModify(myTicket,new_Pos,sl,tp,0);if(!err)Print(OrderError());else{Sleep(1000);break;}}}break;}}} 
//+------------------------------------------------------------------+

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