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