VisualTrading_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 strategyChecks for the total of closed orders
Miscellaneous
It opens Message Boxes to the userIt issuies visual alerts to the screenIt plays sound alerts
0 Views
0 Downloads
0 Favorites
VisualTrading_Block
//+------------------------------------------------------------------+
//|                                          VisualTrading_Block.mq4 |
//|                                                             Roll |
//+------------------------------------------------------------------+
#property copyright "Roll"
#include <Block_err_130.mqh>
//ñòðàòåãèÿ,íà÷àëüíàÿ âåðñèÿ Dmitry Yakovlev (22.04.2009 05:32)http://codebase.mql4.com/ru/5533
extern bool Trade=false;//ðàçðåøåíèå òîðãîâëè/èíäèêàöèÿ
extern bool lShowTargets=true; 
extern color OpenColor=Aqua;//Color Op
extern color TakeProfitColor=Lime;//Color TakeProfit
extern color StopLossColor=Gold;//Color StopLoss
extern bool AL=true;//ðàçðåøåíèå alert
extern bool UseSound=true;//ðàçðåøåíèå çâóê

string var_188="expert.wav";
int i,j,t,Tip,awh[],cnt=0;
string Symb,n,Text;
//----
int init(){rezet();Symb=Symbol();return(0);} 
int deinit()
{i=0;j=0;             
 for(i=0;i<OrdersTotal();i++)
 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&(OrderSymbol()==Symb))
 {n=OrderSymbol()+"_"+DoubleToStr(OrderTicket(),0)+"_"+DoubleToStr(Period(),0);
  if(ObjectFind(n+"open")!=-1)ObjectDelete(n+"open");     
  if(ObjectFind(n+"stop")!=-1)ObjectDelete(n+"stop");
  if(ObjectFind(n+"take")!=-1)ObjectDelete(n+"take");}
 DeleteHistory();
 for(i=0;i<30;i++)
 {ObjectDelete(Symbol()+DoubleToStr(Period(),0)+"topen"+i); 
  ObjectDelete(Symbol()+DoubleToStr(Period(),0)+"ttake"+i); 
  ObjectDelete(Symbol()+DoubleToStr(Period(),0)+"tstop"+i);}
 DeleteLabels();return(0);}
//-------------------------------------------------------------------------------------------
int start()
{i=0;j=0;double popen,ptake,pstop,Closepos;
 DeleteHistory();
 if(cnt!=OrdersTotal())rezet();
 DeleteLabels();
 for(i=0;i<OrdersTotal();i++)  
 {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&(OrderSymbol()==Symb))
 {Tip=-1;int myTicket=0;double OPos=0,SLpos=0,TPpos=0;
  Tip=OrderType();
  myTicket=OrderTicket();    
  OPos=OrderOpenPrice();
  SLpos=ND(OrderStopLoss());
  TPpos=ND(OrderTakeProfit());
   n=OrderSymbol()+"_"+DoubleToStr(OrderTicket(),0)+"_"+DoubleToStr(Period(),0);
if(ObjectFind(n+"open")==-1)
{if(Trade)
 {int ret=MessageBox("Çàêðûòü îðäåð "+OrderTicket()+"?","Çàêðûòü?",4);
 if(ret==6)
  {Closepos=ND(OrderClosePrice()); 
  if(Block_err_130(1,Tip,OPos,SLpos,TPpos,0,0,0))
  {if(OrderType()<2)
   {if(!OrderClose(myTicket,OrderLots(),Closepos,3,CLR_NONE))
    {if(AL)Alert("Îøèáêà çàêðûòèÿ  ¹ ",GetLastError());
     Print("Îøèáêà çàêðûòèÿ îðäåðà ¹",
     OrderTicket(),". Îøèáêà: ",GetLastError());Sleep(1000);
    }else {PlaySound("expert.wav");
         ObjectDelete(n+"take");
         ObjectDelete(n+"stop");}}
  if(OrderType()>1)
  {if(!OrderDelete(myTicket,White)) 
    {if(AL)Alert("Îøèáêà óäàëåíèÿ  ¹ ",GetLastError());
     Print("Îøèáêà óäàëåíèÿ îòëîæåííîãî îðäåðà ¹",
     OrderTicket(),". Îøèáêà: ",GetLastError());Sleep(1000);
    }else{PlaySound("expert.wav");
         ObjectDelete(n+"take");
         ObjectDelete(n+"stop");}}}}}}
 if((ObjectFind(n+"open")==-1&&!Trade)||ret==7)
  {ObjectCreate(n+"open",OBJ_HLINE,awh[j],Time[0],OPos);
   ObjectSet(n+"open",OBJPROP_COLOR,OpenColor);
   ObjectSet(n+"open",OBJPROP_WIDTH,2);}
  if((ObjectFind(n+"stop")==-1)&&(SLpos!=0))
  {ObjectCreate(n+"stop",OBJ_HLINE,awh[j],Time[0],SLpos);
   ObjectSet(n+"stop",OBJPROP_COLOR,StopLossColor);
   ObjectSet(n+"stop",OBJPROP_WIDTH,2);}
  if((ObjectFind(n+"take")==-1)&&(TPpos!=0))
  {ObjectCreate(n+"take",OBJ_HLINE,awh[j],Time[0],TPpos);
   ObjectSet(n+"take",OBJPROP_COLOR,TakeProfitColor);
   ObjectSet(n+"take",OBJPROP_WIDTH,2);}
  popen=ND(ObjectGet(n+"open",OBJPROP_PRICE1));
  ptake=ND(ObjectGet(n+"take",OBJPROP_PRICE1));
  pstop=ND(ObjectGet(n+"stop",OBJPROP_PRICE1));
if((popen!=OPos)||(pstop!=SLpos)||(ptake!=TPpos))
 {if(Tip<2&&ND(popen)!=OPos)   
   ObjectSet(n+"open",OBJPROP_PRICE1,OPos);
  if(!Trade)
   {if(Tip<2)
    {if(ND(popen)!=OPos)  
      ObjectSet(n+"open",OBJPROP_PRICE1,OPos);
     if(ND(pstop)!=SLpos)ObjectSet(n+"stop",OBJPROP_PRICE1,SLpos);
     if(ND(ptake)!=TPpos)ObjectSet(n+"take",OBJPROP_PRICE1,TPpos);}
     if(Tip>1)
      {if(ND(popen)!=OPos)ObjectSet(n+"open",OBJPROP_PRICE1,OPos); 
       if(ND(ptake)!=TPpos)ObjectSet(n+"take",OBJPROP_PRICE1,TPpos); 
        if(ND(pstop)!=SLpos) ObjectSet(n+"stop",OBJPROP_PRICE1,SLpos);}}
   if(Tip==OP_BUY)Text=" Buy "; 
  else if(Tip==OP_SELL)Text=" SELL ";  
  else if(Tip>1)Text=" îòëîæåííûé ";
  bool err=0;
 while(Trade)  
 {if(IsTradeAllowed()&&(ND(popen)!=ND(OPos))&&Tip>1&&ND(popen)!=0&&
   Block_err_130(3,Tip,OPos,SLpos,TPpos,popen,SLpos,TPpos))//ìîäèôèêàöèÿ öåíû îòëîæ
  {if(AL)Alert("Ìîäèôèêàöèÿ öåíû",Text,myTicket,". Æä¸ì îòâåò..",", ",ND(popen),", ",OPos);
   if(ND(popen)==OPos)break;
   err=OrderModify(myTicket,popen,SLpos,TPpos,0,CLR_NONE);
   Sleep(1000);
   if(err==0)Print(OrderError());
   else if(err==true)
   {if(UseSound)PlaySound(var_188);
    if(AL)Alert("Îðäåð ",Text,myTicket," ìîäèôèöèðîâàí:)");break;}}
  if(IsTradeAllowed()&&(ND(ptake)!=TPpos)&&(TPpos!=0)&&(ptake!=0)
      &&Block_err_130(3,Tip,OPos,SLpos,TPpos,OPos,SLpos,ptake))
    {if(AL)Alert("Ìîäèôèêàöèÿ  ïðîôèòà",Text,myTicket,". Æä¸ì îòâåò..");
     if(ptake==TPpos)break;
     err=OrderModify(myTicket,OPos,SLpos,ptake,0,CLR_NONE);Sleep(1000);
     if(!err)Print(OrderError());
     else if(err==true)
      {if(UseSound)PlaySound(var_188);
       if(AL)Alert("Îðäåð ",Text,myTicket," ìîäèôèöèðîâàí:)");break;}}
  if(IsTradeAllowed()&&(ND(pstop)!=SLpos)&&(SLpos!=0)&&(pstop!=0)
   &&Block_err_130(3,Tip,OPos,SLpos,TPpos,OPos,pstop,TPpos))
    {if(AL)Alert("Ìîäèôèêàöèÿ ëîññà ",Text,myTicket,". Æä¸ì îòâåò..");
     if(pstop==SLpos)break;
     err=OrderModify(myTicket,OPos,pstop,TPpos,0,CLR_NONE);Sleep(1000);
     if(!err)Print(OrderError());
     else if(err==true)
     {if(UseSound)PlaySound(var_188);
      if(AL)Alert("Îðäåð ",Text,myTicket," ìîäèôèöèðîâàí:)");break;}}
   if(err==0)break;}//while(Trade) 
 }}}ShowLabels();if(lShowTargets)fShowTargets();return(0);}
//----------------------------------------------------
void rezet()
{i=0;j=0;DeleteHistory();
 for(i=0;i<OrdersTotal();i++) 
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&(OrderSymbol()==Symbol()))
  {n=OrderSymbol()+"_"+DoubleToStr(OrderTicket(),0)+"_"+DoubleToStr(Period(),0);
   if(ObjectFind(n+"open")==-1)                        
    {ObjectCreate(n+"open",OBJ_HLINE,awh[j],Time[0],OrderOpenPrice());
     ObjectSet(n+"open",OBJPROP_COLOR,OpenColor);
     ObjectSet(n+"open",OBJPROP_WIDTH,2);}
   if(OrderStopLoss()!=0 && ObjectFind(n+"stop")==-1)
    {ObjectCreate(n+"stop",OBJ_HLINE,awh[j],Time[0],OrderStopLoss());
     ObjectSet(n+"stop",OBJPROP_COLOR,StopLossColor);
     ObjectSet(n+"stop",OBJPROP_WIDTH,2);}
   if(OrderTakeProfit()!=0&&ObjectFind(n+"take")==-1)
    {ObjectCreate(n+"take",OBJ_HLINE,awh[j],Time[0],OrderTakeProfit());
     ObjectSet(n+"take",OBJPROP_COLOR,TakeProfitColor);
     ObjectSet(n+"take",OBJPROP_WIDTH,2);}
  }DeleteLabels();
   ShowLabels(); 
   cnt=OrdersTotal();}
//------
void DeleteHistory(){i=0;j=0;
 for(i=0;i<OrdersHistoryTotal();i++)
 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)&&(OrderSymbol()==Symbol()))
 {n=OrderSymbol()+"_"+DoubleToStr(OrderTicket(),0)+"_"+DoubleToStr(Period(),0);
  if(ObjectFind(n+"open")!=-1)ObjectDelete(n+"open");
  if(ObjectFind(n+"stop")!=-1)ObjectDelete(n+"stop");
  if(ObjectFind(n+"take")!=-1)ObjectDelete(n+"take");}}
//-----------
void fShowTargets()      
{i=0;Tip=-1;
 int period=Period(),prof_pts=0,ticket=0,FS=14;
 double dist_stop_pts,dist_stop,dist_take_pts,dist_take,SL,TP,Price;
 double point=MarketInfo(Symbol(),MODE_POINT);
 double pr=(Ask+Bid)/2,prof=0;             
 datetime CT=Time[0]+Period()*60*(WindowBarsPerChart()/20+2);
 double CP=5*point;
 color  prof_clr=Blue;
 string txt="";
 for(i=0;i<10;i++)
 {ObjectDelete(Symb+DoubleToStr(period,0)+"topen"+i);
  ObjectDelete(Symb+DoubleToStr(period,0)+"ttake"+i);
  ObjectDelete(Symb+DoubleToStr(period,0)+"tstop"+i);}
 for(i=0;i<OrdersTotal();i++)
 {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  {Tip=OrderType();
   Price=OrderOpenPrice();
   TP=OrderTakeProfit();
   SL=OrderStopLoss();
   prof=OrderProfit();
  if(Tip==0){pr=Bid;prof_pts=ND((pr-Price)/point);}//"ïðîôèò â ïóíêòàõ"
  if(Tip==2){pr=Ask;prof_pts=ND((pr-Price)/point);}
  if(Tip==4){pr=Ask;prof_pts=ND((pr-Price)/point);}
  if(Tip==1){pr=Ask;prof_pts=ND((Price-pr)/point);}
  if(Tip==3){pr=Bid;prof_pts=ND((Price-pr)/point);}
  if(Tip==5){pr=Bid;prof_pts=ND((Price-pr)/point);}
  prof_clr=Blue;                   //öâåò ïðîôèòà ãîëóáîé
  if(prof_pts<0)prof_clr=OrangeRed;//åñëè ïðîôèò â óáûòêå öâåò ïðîôèòà êðàñíûé
  if(prof_pts>0)prof_clr=Lime;     //åñëè ïðîôèò â ïðèáûëè öâåò ïðîôèòà çåëåíûé
  ObjectCreate(Symb+DoubleToStr(period,0)+"topen"+i,OBJ_TEXT,0,CT,Price+CP);//îáðàçîâàòü òåêñòîâûé îáúåêò.ãäå i - íîìåð îðäåðà
  txt=""; 
  if(Tip==0||Tip==1) 
   txt="("+DoubleToStr(MathAbs(prof),2)+"$)";
  ObjectSetText(Symb+DoubleToStr(period,0)+"topen"+i,DoubleToStr(MathAbs(prof_pts),0)+txt,FS,"Arial Black",prof_clr);
  dist_take_pts=0;dist_take=0;
  if(Tip==0)pr=Bid;
  if(Tip==2)pr=Bid;
  if(Tip==4)pr=Bid;
  if(Tip==1)pr=Ask;
  if(Tip==3)pr=Ask;
  if(Tip==5)pr=Ask;
  if(TP!=0) 
  {dist_take_pts=MathAbs(ND((pr-TP)/point));
   txt=DoubleToStr(dist_take_pts,0); 
   dist_take_pts=MathAbs(ND((Price-TP)/point));
   txt=txt+"("+DoubleToStr(dist_take_pts,0)+"/"+DoubleToStr(dist_take_pts*OrderLots()*10,0)+"$ )";
   ObjectCreate(Symb+DoubleToStr(period,0)+"ttake"+i,OBJ_TEXT,0,CT,TP+CP);
   ObjectSetText(Symb+DoubleToStr(period,0)+"ttake"+i,txt,FS,"Arial Black",Lime);}
  dist_stop_pts=0;dist_stop=0;
  if(SL!=0)
  {dist_stop_pts=MathAbs(ND((pr-SL)/point));
   txt=DoubleToStr(dist_stop_pts,0);
   dist_stop_pts=MathAbs(ND((Price-SL)/point));
   txt=txt+"("+DoubleToStr(dist_stop_pts,0)+"/"+DoubleToStr(dist_stop_pts*OrderLots()*10,0)+"$)";
   ObjectCreate(Symb+DoubleToStr(period,0)+"tstop"+i,OBJ_TEXT,0,CT,SL+CP);
   ObjectSetText(Symb+DoubleToStr(period,0)+"tstop"+i,txt,FS,"Arial Black",OrangeRed);}}}}
//----------------------------------------------------------------------------
void DeleteLabels()
{i=0;n="";t=Time[WindowFirstVisibleBar()];
for(i=0;i<OrdersHistoryTotal();i++)
 {if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)&&OrderSymbol()==Symbol())
  {n=OrderSymbol()+Period()+DoubleToStr(OrderTicket(),0);
   ObjectDelete(n+"stoplbl");
   ObjectDelete(n+"takelbl");}}
for(i=0;i<OrdersTotal();i++)
 {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&OrderSymbol()==Symbol())
  {n=OrderSymbol()+Period()+DoubleToStr(OrderTicket(),0);
   ObjectDelete(n+"stoplbl");
   ObjectDelete(n+"takelbl");}}}
//----------------------------------------------------------------------------
void ShowLabels()  
{i=0;n="";int t=Time[WindowFirstVisibleBar()-(WindowBarsPerChart()/20)];
for(i=0;i<OrdersTotal();i++)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&OrderSymbol()==Symbol())
 {n=OrderSymbol()+Period()+DoubleToStr(OrderTicket(),0);
  ObjectDelete(n+"stoplbl");
  ObjectCreate(n+"stoplbl",OBJ_TEXT,0,t,OrderStopLoss()); 
  ObjectSetText(n+"stoplbl","#"+DoubleToStr(OrderTicket(),0)+"  stop",12,"Arial Black",StopLossColor);
  ObjectDelete(n+"takelbl");
  ObjectCreate(n+"takelbl",OBJ_TEXT,0,t,OrderTakeProfit()); 
  ObjectSetText(n+"takelbl","#"+DoubleToStr(OrderTicket(),0)+"  take",12,"Arial Black",TakeProfitColor);}}}
//----------------------------------------------------------------------------




Comments