Orders Execution
2
Views
0
Downloads
0
Favorites
Training_v02
//+------------------------------------------------------------------+
//| Training_v02.mq4 |
//+------------------------------------------------------------------+
#property copyright "Inkov Evgeni ew123@mail.ru"
#property link "+7-988-140-68-11"
//+------------------------------------------------------------------+
// çàäàíèå ëîòà - ñìåùåíèåì ñîîòâåòñòâóþùèõ öèôð (ðåçóëüòèðóþùèé ëîò - ýòî ñóììà ñìåù¸ííûõ öèôð)
// óñòàíîâêà íîâîãî ëîòà - ñìåùåíèåì "ñòðîêè ëîòà"
// îòêðûòèå îðäåðà Buy - óñòàíîâêîé "ñòðåëêè ââåðõ" èëè "ïàëåö ââåðõ", Sell - "ñòðåëêè âíèç" èëè "ïàëåö âíèç"
// çàêðûòèå îðäåðîâ è óäàëåíèå SL, TP è îòëîæåííûõ - ïåðåêðûòèåì ñîîòâåòñòâóþùèõ ëèíèé ïðÿìîóãîëüíèêîì
// óñòàíîâêà SL è TP ñ ïîìîùüþ òðåíäîâîé ëèíèè
// òðåéëèíã-ñòîï è øàã òðåéëèíã-ñòîïà - ñ ïîìîùüþ öèôð (ïî ìåòîäó óñòàíîâêè ëîòà)
// óäàëåíèå òðåéëèíã-ñòîïà - óñòàíîâêîé åãî â 0 èëè óäàëåíèåì
// óñòàíîâêà îòëîæåííûõ îðäåðîâ ñ ïîìîùüþ ãîðèçîíòàëüíûõ ëèíèé è ñîîòâ. ñëîâ: Buy èëè Sell
// ñäâèã îòëîæåííîãî îðäåðà - óñòàíîâêîé è ñìåùåíèåì öåíîâîé ìåòêè
//+------------------------------------------------------------------+
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
extern double Lot = 0.1;
extern int Trail_Stop = 5;
extern int Step_TS = 2;
extern int Mult_TS = 1;
extern string s1________ = "--------------------------------------";
extern int Font = 10;
extern int Y_0 = 0;
extern int Step_Y = 15;
extern int Shift_Y = 10;
extern string s2________ = "--------------------------------------";
extern int Magic = 1423;
extern int Slippage = 5;
extern string pref = "TR_";
extern string s3________ = "--------------------------------------";
extern color col_Buy_Sell= clrRed;
extern color col_Lot = clrMagenta;
extern color col_TS = clrBlue;
extern color col_StepTS = clrBlue;
extern color col_10 = clrRed;
extern color col_1 = clrGreen;
extern color col_01 = clrOrangeRed;
extern color col_001 = clrBlue;
extern color col_Fon = clrSkyBlue;
//+------------------------------------------------------------------+
int kol_ord, kol_otl,
kol_ord_Buy, kol_ord_Sell,
kol_ord_BuyLimit, kol_ord_SellLimit,
kol_ord_BuyStop, kol_ord_SellStop;
int bar1_TL, bar2_TL, bar_met;
//+------------------------------------------------------------------+
int OnInit()
{
Trail_Stop*=Mult_TS;
Step_TS*=Mult_TS;
RectLabelCreate(0,pref+"Fon",0,5,3,-110,-(Y_0+Step_Y*13+Shift_Y),col_Fon);
out_str_Sell(20, Y_0+Step_Y*12+Shift_Y, col_Buy_Sell);
out_str_Buy (70, Y_0+Step_Y*12+Shift_Y, col_Buy_Sell);
out_Lot(Lot, 10, Y_0+Step_Y*11+Shift_Y, col_Lot);
out_TS (Trail_Stop, 10, Y_0+Step_Y*10+Shift_Y, col_TS);
out_StepTS (Step_TS, 10, Y_0+Step_Y*9+Shift_Y, col_StepTS);
out_tabl_Cifr(col_10, col_1, col_01, col_001);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
remove_objects(pref);
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
void OnTick()
{
Orders_Total(); // îïðåäåëèòü êîëè÷åñòâî îðäåðîâ ïî òèïàì
if (kol_ord==0)Del_TL();
if (kol_otl==0)Del_Met();
//.....................................
out_inf(col_Lot); // âûâåñòè ñòðîêó ñîñòîÿíèÿ ñ÷åòà
//.....................................
double pr1,pr2;
if (Find_Rect(pr1,pr2))
{
bool c1=close_ord(pr1,pr2); // çàêðûòü ðûíî÷íûé îðäåð
bool d1=del_otl (pr1,pr2); // óäàëèòü îòëîæåííûé
bool d2=del_SL_TP(pr1,pr2); // óäàëèòü ÒÐ è SL
if (c1 || d1 || d2) Del_Rect();
}
//.....................................
// óñòàíîâèòü TP è SL
if (Find_TL(pr1,pr2))
ust_SL_TP (pr1,pr2);
else
{
bar1_TL=-1;
bar2_TL=-1;
}
//.....................................
if (Find_Met(pr1))
izm_pr_otl(pr1); // ñäâèíóòü îòëîæåííûé îðäåð
else
bar_met=-1;
//.....................................
Opred_Lot(10,Y_0+Step_Y*11+Shift_Y); // îïðåäåëèòü ëîò
Opred_TS (10,Y_0+Step_Y*10+Shift_Y); // îïðåäåëèòü òðåéëèíã-ñòîï
Opred_StepTS (10,Y_0+Step_Y*9+Shift_Y); // îïðåäåëèòü øàã òðåéëèíã-ñòîïà
//.....................................
// îòêðûòü ðûíî÷íûé îðäåð
int up_dw=Find_Arrow();
if (up_dw>0)Open_Buy (Lot);
if (up_dw<0)Open_Sell(Lot);
//.....................................
// îòêðûòü îòëîæåííûé îðäåð
double pr=Find_Horiz_Line();
if (pr>0)
{
if (!opred_Buy_otl(70,Y_0+Step_Y*12+Shift_Y,pr,Lot))
opred_Sell_otl(20,Y_0+Step_Y*12+Shift_Y,pr,Lot);
}
else
{
out_str_Sell(20, Y_0+Step_Y*12+Shift_Y, col_Buy_Sell);
out_str_Buy (70, Y_0+Step_Y*12+Shift_Y, col_Buy_Sell);
}
//.....................................
if (Trail_Stop>0)Trail_Stop_Ord(); // òðåéëèíã-ñòîï
//.....................................
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
void izm_pr_otl(double pr)
{
double pr1_TL,pr2_TL;
Find_TL(pr1_TL,pr2_TL);
double min_d_pr=-1, d_pr, pr_ord=0;
double sl,tp;
int ticket=0;
// íàéòè áëèæàéøèé îòëîæåííûé îðäåð ê ìåòêå pr
double Stop_Level=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
for (int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber()!=Magic)continue;
if (OrderType()<=1)continue;
d_pr=MathAbs(ND(OrderOpenPrice())-ND(pr));
if(ND(d_pr) <= ND(min_d_pr) || min_d_pr==-1)
{
min_d_pr=d_pr;
ticket=OrderTicket();
pr_ord=OrderOpenPrice();
}
}
ust_pr_met(pr_ord); // óñòàíîâèòü ÒÎ×ÍÎ ìåòêó íà öåíó îðäåðà
if (!Find_Met(pr))return;
if (ticket>0)
if (OrderSelect(ticket,SELECT_BY_TICKET))
{
RefreshRates();
if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT)
{
if (ND(Ask+Stop_Level)<ND(pr))
if (ND(pr)!=ND(OrderOpenPrice()))
{
if (ND(pr1_TL)==ND(OrderOpenPrice()))Del_TL();
sl=0;
if (OrderStopLoss()>0)sl=OrderStopLoss()+(pr - OrderOpenPrice());
tp=0;
if (OrderTakeProfit()>0)tp=OrderTakeProfit()+(pr - OrderOpenPrice());
OrderModify(ticket,ND(pr),ND(sl),ND(tp),0);
}
}
if (OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLSTOP)
{
if (ND(Bid-Stop_Level)>ND(pr))
if (ND(pr)!=ND(OrderOpenPrice()))
{
if (ND(pr1_TL)==ND(OrderOpenPrice()))Del_TL();
sl=0;
if (OrderStopLoss()>0)sl=OrderStopLoss()+(pr - OrderOpenPrice());
tp=0;
if (OrderTakeProfit()>0)tp=OrderTakeProfit()+(pr - OrderOpenPrice());
OrderModify(ticket,ND(pr),ND(sl),ND(tp),0);
}
}
}
}
//---------------------------------
bool opred_Buy_otl(int X, int Y, double pr, double lot)
{
bool out=false;
if (sdvig_str("Buy",X,Y))
{
out=true;
out_str_Buy(X,Y,col_Buy_Sell);
if (vozvrat_str("Buy",X,Y))
{
out_str_Buy(X,Y,col_Buy_Sell);
if (ust_Buy_otl(pr,Lot))Del_Horiz_Line();
}
}
return(out);
}
//-------------------------------------
bool opred_Sell_otl(int X, int Y, double pr, double lot)
{
bool out=false;
if (sdvig_str("Sell",X,Y))
{
out=true;
out_str_Sell(X,Y, col_Buy_Sell);
if (vozvrat_str("Sell",X,Y))
{
out_str_Sell(X,Y, col_Buy_Sell);
if (ust_Sell_otl(pr,lot))Del_Horiz_Line();
}
}
return(out);
}
//-------------------------------------
void ust_SL_TP(double pr1,double pr2)
{
double Stop_Level=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
int ticket=0;
double min_d_pr=-1, d_pr, pr_ord=0;
// íàéòè áëèæàéøóþ öåíó ê íà÷àëó òðåíäîâîé ëèíèè
for (int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber()!=Magic)continue;
d_pr=MathAbs(ND(OrderOpenPrice())-ND(pr1));
if(ND(d_pr) <= ND(min_d_pr) || min_d_pr==-1)
{
min_d_pr=d_pr;
ticket=OrderTicket();
pr_ord=OrderOpenPrice();
}
}
ust_pr_TL(pr_ord, pr2); // óñòàíîâèòü ÒÎ×ÍÎ êîîðä. òðåíäîâîé ëèíèè
if (ticket>0)
if (OrderSelect(ticket,SELECT_BY_TICKET))
{
RefreshRates();
if (OrderType()==OP_BUY)
{
if (ND(Bid-Stop_Level)>ND(pr2))
if (ND(pr2)!=ND(OrderStopLoss()))
OrderModify(ticket,OrderOpenPrice(),ND(pr2),OrderTakeProfit(),0);
if (ND(Bid+Stop_Level)<ND(pr2))
if (ND(pr2)!=ND(OrderTakeProfit()))
OrderModify(ticket,OrderOpenPrice(),OrderStopLoss(),ND(pr2),0);
}
if (OrderType()==OP_SELL)
{
if (ND(Ask+Stop_Level)<ND(pr2))
if (ND(pr2)!=ND(OrderStopLoss()))
OrderModify(ticket,OrderOpenPrice(),ND(pr2),OrderTakeProfit(),0);
if (ND(Ask-Stop_Level)>ND(pr2))
if (ND(pr2)!=ND(OrderTakeProfit()))
OrderModify(ticket,OrderOpenPrice(),OrderStopLoss(),ND(pr2),0);
}
if (OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT)
{
if (ND(pr2)<ND(OrderOpenPrice()))
if (ND(pr2)!=ND(OrderStopLoss()))
OrderModify(ticket,OrderOpenPrice(),ND(pr2),OrderTakeProfit(),0);
if (ND(pr2)>ND(OrderOpenPrice()))
if (ND(pr2)!=ND(OrderTakeProfit()))
OrderModify(ticket,OrderOpenPrice(),OrderStopLoss(),ND(pr2),0);
}
if (OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT)
{
if (ND(pr2)>ND(OrderOpenPrice()))
if (ND(pr2)!=ND(OrderStopLoss()))
OrderModify(ticket,OrderOpenPrice(),ND(pr2),OrderTakeProfit(),0);
if (ND(pr2)<ND(OrderOpenPrice()))
if (ND(pr2)!=ND(OrderTakeProfit()))
OrderModify(ticket,OrderOpenPrice(),OrderStopLoss(),ND(pr2),0);
}
}
}
//--------------------------------------------
bool del_SL_TP(double pr1,double pr2)
{
double pr1_TL,pr2_TL;
Find_TL(pr1_TL,pr2_TL);
bool out=false;
bool izm;
double tp,sl;
for(int i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS)==true)continue;
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber()!=Magic)continue;
tp=OrderTakeProfit();
sl=OrderStopLoss();
izm=false;
if (OrderStopLoss()>0)
if (Peresech_pr(OrderStopLoss(), pr1, pr2))
{
if (Peresech_pr(pr2_TL, pr1, pr2))Del_TL();
sl=0;
izm=true;
}
if (OrderTakeProfit()>0)
if (Peresech_pr(OrderTakeProfit(), pr1, pr2))
{
if (Peresech_pr(pr2_TL, pr1, pr2))Del_TL();
tp=0;
izm=true;
}
if (izm)
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0);
out=true;
}
}
return(out);
}
//--------------------------------------------
bool del_otl(double pr1,double pr2)
{
double pr1_TL,pr2_TL;
Find_TL(pr1_TL,pr2_TL);
bool out=false;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS)==true)continue;
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber()!=Magic)continue;
if (OrderType()>1) // îòëîæåííûé
{
if (Peresech_pr(pr2_TL, pr1, pr2))Del_TL();
if (Peresech_pr(OrderOpenPrice(), pr1, pr2))OrderDelete(OrderTicket());
out=true;
}
}
return(out);
}
//--------------------------------------------
void out_inf(color col)
{
string str1="Áàëàíñ: "+DoubleToStr(AccountInfoDouble(ACCOUNT_BALANCE),2)+" "+AccountInfoString(ACCOUNT_CURRENCY)+
" Ñðåäñòâà: "+DoubleToStr(AccountInfoDouble(ACCOUNT_EQUITY),2)+
" Çàëîã: "+DoubleToStr(AccountInfoDouble(ACCOUNT_MARGIN),2);
string str2="Ñâîáîäíî: "+DoubleToStr(AccountInfoDouble(ACCOUNT_FREEMARGIN),2)+
" Óðîâåíü: "+DoubleToStr(AccountInfoDouble(ACCOUNT_MARGIN_LEVEL),2);
put_txt(pref+"inf1", str1, 10, 25, col, Font,2);
put_txt(pref+"inf2", str2, 10, 10, col, Font,2);
}
//-------------------------------------------
void out_str_Buy(int X, int Y, color col)
{
put_txt(pref+"Buy", "Buy", X, Y, col, Font,3);
}
//-------------------------------------------
void out_str_Sell(int X, int Y, color col)
{
put_txt(pref+"Sell", "Sell", X, Y, col, Font,3);
}
//-------------------------------------------
void Opred_Lot(int X, int Y)
{
double L=sdvig_tabl_Cifr();
if (L>=0 && sdvig_str("L",X,Y))
{
out_Lot(Lot,X,Y,col_Lot);
if (vozvrat_str("L",X,Y))
{
if (L>0)Lot=L;
out_Lot(Lot,X,Y,col_Lot);
out_tabl_Cifr(col_10, col_1, col_01, col_001);
}
}
}
//---------------------------------
void out_Lot(double L, int X, int Y, color col)
{
put_txt(pref+"L", "Lot= "+DoubleToStr(L,2), X, Y, col, Font,3);
}
//-------------------------------------------
bool vozvrat_str(string NN, int X, int Y)
{
string name=pref+NN;
if (ObjectGet(name, OBJPROP_XDISTANCE)==X && ObjectGet(name, OBJPROP_YDISTANCE)==Y)return(1);
return(0);
}
//-------------------------------------------
bool sdvig_str(string NN, int X, int Y)
{
string name=pref+NN;
if (ObjectGet(name, OBJPROP_XDISTANCE)!=X)return(1);
if (ObjectGet(name, OBJPROP_YDISTANCE)!=Y)return(1);
return(0);
}
//-------------------------------------------
void Opred_TS(int X, int Y)
{
int ts=(int)MathFloor(sdvig_tabl_Cifr()*Mult_TS);
if (ts>=0 && sdvig_str("TS",X,Y))
{
out_TS(Trail_Stop,X,Y,col_TS);
if (vozvrat_str("TS",X,Y))
{
Trail_Stop=ts;
out_TS(Trail_Stop,X,Y,col_TS);
out_tabl_Cifr(col_10, col_1, col_01, col_001);
}
}
}
//---------------------------------
void out_TS(int ts, int X, int Y, color col)
{
string s="TS= "+IntegerToString(ts);
if (ts==0)s="TS îòêëþ÷åí !";
put_txt(pref+"TS", s, X, Y, col, Font,3);
}
//-------------------------------------------
void Opred_StepTS(int X, int Y)
{
int ts=(int)MathFloor(sdvig_tabl_Cifr()*Mult_TS);
if (ts>=0 && sdvig_str_StepTS(X,Y))
{
out_StepTS(Step_TS,X,Y,col_StepTS);
if (vozvrat_str("Step",X,Y))
{
if (ts>0)Step_TS=ts;
out_StepTS(Step_TS,X,Y,col_StepTS);
out_tabl_Cifr(col_10, col_1, col_01, col_001);
}
}
}
//---------------------------------
void out_StepTS(int ts, int X, int Y, color col)
{
put_txt(pref+"Step", "Step TS= "+IntegerToString(ts), X, Y, col, Font,3);
}
//-------------------------------------------
bool sdvig_str_StepTS(int X, int Y)
{
string name=pref+"Step";
if (ObjectGet(name, OBJPROP_XDISTANCE)!=X)return(1);
if (ObjectGet(name, OBJPROP_YDISTANCE)!=Y)return(1);
return(0);
}
//-------------------------------------------
void out_tabl_Cifr(color col1, color col2, color col3, color col4)
{
for (int i=1;i<=9;i++)
{
put_txt(pref+IntegerToString(i*10), IntegerToString(i*10), 95, Y_0+Step_Y*(9-i),col1, Font,3);
put_txt(pref+IntegerToString(i), IntegerToString(i), 75, Y_0+Step_Y*(9-i),col2, Font,3);
put_txt(pref+DoubleToStr(i/10.0,1), DoubleToStr(i/10.0,1), 45, Y_0+Step_Y*(9-i),col3, Font,3);
put_txt(pref+DoubleToStr(i/100.0,2), DoubleToStr(i/100.0,2), 5, Y_0+Step_Y*(9-i),col4, Font,3);
}
}
//-------------------------------------------
double sdvig_tabl_Cifr()
{
double L=0;
for (int i=1;i<=9;i++)
{
if (sdvig_txt(pref+IntegerToString(i*10), 95, Y_0+Step_Y*(9-i)))L+=i*10;
if (sdvig_txt(pref+IntegerToString(i), 75, Y_0+Step_Y*(9-i)))L+=i;
if (sdvig_txt(pref+DoubleToStr(i/10.0,1), 45, Y_0+Step_Y*(9-i)))L+=i/10.0;
if (sdvig_txt(pref+DoubleToStr(i/100.0,2), 5, Y_0+Step_Y*(9-i)))L+=i/100.0;
}
return(L);
}
//-------------------------------------------
bool sdvig_txt(string name,int X,int Y)
{
if (ObjectGet(name, OBJPROP_XDISTANCE)!=X)return(1);
if (ObjectGet(name, OBJPROP_YDISTANCE)!=Y)return(1);
return(0);
}
//-------------------------------------------
void put_txt(string name, string vol, int X,int Y,color col1, int shr, int corn)
{
if (ObjectFind(name)<0)ObjectCreate(name, OBJ_LABEL, 0,0,0);
ObjectSet(name, OBJPROP_CORNER, corn);
ObjectSet(name, OBJPROP_XDISTANCE, X);
ObjectSet(name, OBJPROP_YDISTANCE, Y);
ObjectSetText(name, vol, shr, "Arial Black", col1);
}
//----------------------------------------------
int Find_Arrow()
{ // Âûõîä: "1" - Buy, "-1" - Sell, "0" - íåò äåéñòâèé
int obj_total=ObjectsTotal();
string Obj_Name;
int cod;
for(int i=0;i<obj_total;i++)
{
Obj_Name = ObjectName(i);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_ARROW)
{
cod=(int)ObjectGet(Obj_Name,OBJPROP_ARROWCODE);
if (cod==241 || cod==67) // ñòðåëêà ââåðõ èëè ïàëåö ââåðõ
{
ObjectDelete(Obj_Name);
return(1);
}
if (cod==242 || cod==68) // ñòðåëêà âíèç èëè ïàëåö âíèç
{
ObjectDelete(Obj_Name);
return(-1);
}
}
}
return(0);
}
//-----------------------------------------
void Del_Met()
{
string Obj_Name;
for(int i=0;i<ObjectsTotal();i++)
{
Obj_Name = ObjectName(i);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_ARROW)
{
int cod=(int)ObjectGet(Obj_Name,OBJPROP_ARROWCODE);
if (cod==5 || cod==6)ObjectDelete(Obj_Name);
}
}
}
//-----------------------------------------
bool Del_Rect()
{
string Obj_Name;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name=ObjectName(k);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_RECTANGLE)ObjectDelete(Obj_Name);
}
return(0);
}
//-----------------------------------------
bool Del_Horiz_Line()
{
string Obj_Name;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name=ObjectName(k);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_HLINE)ObjectDelete(Obj_Name);
}
return(0);
}
//-----------------------------------------
bool Find_Rect(double& pr1, double& pr2)
{
string Obj_Name;
pr1=0.0;
pr2=0.0;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name=ObjectName(k);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_RECTANGLE)
{
pr1=ObjectGet(Obj_Name, OBJPROP_PRICE1);
pr2=ObjectGet(Obj_Name, OBJPROP_PRICE2);
return(1);
}
}
return(0);
}
//-----------------------------------------
bool Find_TL(double& pr1, double& pr2)
{
string Obj_Name, name_TL="";
pr1=0.0;
pr2=0.0;
bool Yes_TL=false;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name=ObjectName(k);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_TREND)
if (!Yes_TL)
{
name_TL=Obj_Name;
Yes_TL=true;
}
else
{
ObjectDelete(Obj_Name);
bar1_TL=-1;
bar2_TL=-1;
}
}
if (name_TL!="")
{
pr1=ObjectGet(name_TL, OBJPROP_PRICE1);
pr2=ObjectGet(name_TL, OBJPROP_PRICE2);
if (bar1_TL<0 && bar2_TL<0)
{
bar1_TL=iBarShift(Symbol(),0,(datetime)ObjectGet(name_TL, OBJPROP_TIME1));
bar2_TL=iBarShift(Symbol(),0,(datetime)ObjectGet(name_TL, OBJPROP_TIME2));
}
}
return(Yes_TL);
}
//-----------------------------------------
bool Find_Met(double& pr)
{
string Obj_Name, name_met="";
bool Yes_met=false;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name = ObjectName(k);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_ARROW)
{
int cod=(int)ObjectGet(Obj_Name,OBJPROP_ARROWCODE);
if (cod==5 || cod==6) // öåíîâàÿ ìåòêà ëåâàÿ èëè ïðàâàÿ
{
if (!Yes_met)
{
name_met=Obj_Name;
Yes_met=true;
}
else
{
ObjectDelete(Obj_Name);
bar_met=-1;
}
}
}
}
if (name_met!="")
{
pr=ObjectGet(name_met, OBJPROP_PRICE1);
if (bar_met<0)bar_met=iBarShift(Symbol(),0,(datetime)ObjectGet(name_met, OBJPROP_TIME1));
}
return(Yes_met);
}
//-----------------------------------------
double Find_Horiz_Line()
{
string Obj_Name;
double pr=0;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name=ObjectName(k);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_HLINE)
{
pr=ObjectGet(Obj_Name, OBJPROP_PRICE1);
return(pr);
}
}
return(0);
}
//-----------------------------------------
void ust_pr_TL(double pr1,double pr2)
{
string Obj_Name;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name=ObjectName(k);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_TREND)
{
ObjectSet(Obj_Name, OBJPROP_PRICE1, ND(pr1));
ObjectSet(Obj_Name, OBJPROP_PRICE2, ND(pr2));
ObjectSet(Obj_Name, OBJPROP_TIME1, iTime(Symbol(),0,bar1_TL));
ObjectSet(Obj_Name, OBJPROP_TIME2, iTime(Symbol(),0,bar2_TL));
return;
}
}
}
//-----------------------------------------
void ust_pr_met(double pr)
{
string Obj_Name;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name=ObjectName(k);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_ARROW)
{
int cod=(int)ObjectGet(Obj_Name,OBJPROP_ARROWCODE);
if (cod==5 || cod==6) // öåíîâàÿ ìåòêà ëåâàÿ èëè ïðàâàÿ
{
ObjectSet(Obj_Name, OBJPROP_PRICE1, ND(pr));
ObjectSet(Obj_Name, OBJPROP_TIME1, iTime(Symbol(),0,bar_met));
return;
}
}
}
}
//-----------------------------------------
bool Del_TL()
{
string Obj_Name;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name=ObjectName(k);
if (StringSubstr(Obj_Name,0,1)=="#")continue;
if (ObjectType(Obj_Name)==OBJ_TREND)
{
ObjectDelete(Obj_Name);
bar1_TL=-1;
bar2_TL=-1;
}
}
return(0);
}
//-----------------------------------------
bool Peresech_pr(double pr_ish, double pr1, double pr2)
{
if ((ND(pr1)-ND(pr_ish))*(ND(pr2)-ND(pr_ish))<=0)return(1);
return(0);
}
//----------------------------------------------
void Open_Buy(double L1)
{
RefreshRates();
int ticketbuy = OrderSend(Symbol(),OP_BUY,L1,Ask,Slippage,0,0,"",Magic,0,Blue);
Orders_Total();
}
//-------------------------------------------
void Open_Sell(double L1)
{
RefreshRates();
int ticketsell = OrderSend(Symbol(),OP_SELL,L1,Bid,Slippage,0,0,"",Magic,0,Red);
Orders_Total();
}
//-------------------------------------------
bool ust_Buy_otl(double pr,double L1)
{
int ticketbuy=0;
double Stop_Level=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
RefreshRates();
if (ND(pr)>Ask+Stop_Level)
ticketbuy = OrderSend(Symbol(),OP_BUYSTOP,L1,ND(pr),0,0,0,"",Magic,0,Blue);
else
if (ND(pr)<Bid-Stop_Level)
ticketbuy = OrderSend(Symbol(),OP_BUYLIMIT,L1,ND(pr),0,0,0,"",Magic,0,Blue);
if (ticketbuy>0)Orders_Total();
return(ticketbuy>0);
}
//-------------------------------------------
bool ust_Sell_otl(double pr,double L1)
{
int ticketsell=0;
double Stop_Level=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
RefreshRates();
if (ND(pr)>Ask+Stop_Level)
ticketsell = OrderSend(Symbol(),OP_SELLLIMIT,L1,ND(pr),0,0,0,"",Magic,0,Blue);
else
if (ND(pr)<Bid-Stop_Level)
ticketsell = OrderSend(Symbol(),OP_SELLSTOP,L1,ND(pr),0,0,0,"",Magic,0,Blue);
if (ticketsell>0)Orders_Total();
return(ticketsell>0);
}
//-------------------------------------------
void Orders_Total()
{
kol_ord=0;
kol_otl=0;
kol_ord_Buy =0;
kol_ord_Sell=0;;
kol_ord_BuyLimit=0;
kol_ord_SellLimit=0;
kol_ord_BuyStop=0;
kol_ord_SellStop=0;
for (int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber()!=Magic)continue;
kol_ord++;
switch(OrderType())
{
case OP_BUY: kol_ord_Buy++; break;
case OP_SELL: kol_ord_Sell++; break;
case OP_BUYLIMIT: kol_ord_BuyLimit++; kol_otl++;break;
case OP_SELLLIMIT: kol_ord_SellLimit++;kol_otl++;break;
case OP_BUYSTOP: kol_ord_BuyStop++; kol_otl++;break;
case OP_SELLSTOP: kol_ord_SellStop++; kol_otl++;break;
}
}
}
//---------------------------------------------------------------
bool close_ord(double pr1, double pr2)
{
double pr1_TL,pr2_TL;
Find_TL(pr1_TL,pr2_TL);
bool usl=true;
bool cls=false;
while (usl)
{
usl=false;
for(int i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS)==true)continue;
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber()!=Magic)continue;
if (Peresech_pr(OrderOpenPrice(), pr1, pr2))
{
if(OrderType()==OP_BUY)
{
if (ND(pr1_TL)==ND(OrderOpenPrice()))Del_TL();
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage);
usl=true;
cls=true;
}
if (OrderType()==OP_SELL)
{
if (ND(pr1_TL)==ND(OrderOpenPrice()))Del_TL();
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage);
usl=true;
cls=true;
}
}
}
}
if (cls)Orders_Total();
return(cls);
}
//---------------------------------------------
void Trail_Stop_Ord()
{
double sl,sl_ord;
RefreshRates();
double tek_bid=Bid;
double tek_ask=Ask;
double pr1_TL,pr2_TL;
Find_TL(pr1_TL,pr2_TL);
for(int i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS)==true)continue;
if (OrderSymbol()!=Symbol())continue;
if (OrderMagicNumber()!=Magic)continue;
if (OrderType() == OP_BUY)
{
sl_ord=OrderStopLoss();
sl=tek_bid-Trail_Stop*Point;
if (ND(tek_bid) > ND(OrderOpenPrice()))
if (ND(sl) >= ND(OrderOpenPrice()) && (ND(sl_ord)==0 || ND(sl_ord) < ND(OrderOpenPrice())))
{
if (ND(pr1_TL)==ND(OrderOpenPrice()) && ND(pr2_TL)==ND(sl_ord))Del_TL();
OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
}
else
if (ND(sl) > ND(sl_ord) && ND(sl_ord) >= ND(OrderOpenPrice()) &&
ND(sl_ord) <= ND(tek_bid-(Trail_Stop+Step_TS)*Point))
{
if (ND(pr1_TL)==ND(OrderOpenPrice()) && ND(pr2_TL)==ND(sl_ord))Del_TL();
OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
}
}
if (OrderType() == OP_SELL)
{
sl_ord=OrderStopLoss();
sl=tek_ask+Trail_Stop*Point;
if (ND(tek_ask) < ND(OrderOpenPrice()))
if (ND(sl) <= ND(OrderOpenPrice()) && (ND(sl_ord)==0 || ND(sl_ord) > ND(OrderOpenPrice())))
{
if (ND(pr1_TL)==ND(OrderOpenPrice()) && ND(pr2_TL)==ND(sl_ord))Del_TL();
OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
}
else
if (ND(sl) < ND(sl_ord) && ND(sl_ord) <= ND(OrderOpenPrice()) &&
ND(sl_ord) >= ND(tek_ask+(Trail_Stop+Step_TS)*Point))
{
if (ND(pr1_TL)==ND(OrderOpenPrice()) && ND(pr2_TL)==ND(sl_ord))Del_TL();
OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
}
}
}
}
//----------------------------------
double ND(double n)
{
return(NormalizeDouble(n,Digits));
}
//---------------------------------------------------------------
void remove_objects(string PreName)
{
string Obj_Name,Head;
for(int k=ObjectsTotal()-1; k>=0; k--)
{
Obj_Name=ObjectName(k);
Head=StringSubstr(Obj_Name,0,StringLen(PreName));
if (Head==PreName)ObjectDelete(Obj_Name);
}
}
//----------------------------------------------
bool RectLabelCreate(const long chart_ID=0, // ID ãðàôèêà
const string name="RectLabel", // èìÿ ìåòêè
const int sub_window=0, // íîìåð ïîäîêíà
const int x=10, // êîîðäèíàòà ïî îñè X
const int y=20, // êîîðäèíàòà ïî îñè Y
const int width=150, // øèðèíà
const int height=118, // âûñîòà
const color back_clr=clrSkyBlue, // öâåò ôîíà
const ENUM_BORDER_TYPE border=BORDER_SUNKEN, // òèï ãðàíèöû
const ENUM_BASE_CORNER corner=CORNER_RIGHT_LOWER, // óãîë ãðàôèêà äëÿ ïðèâÿçêè
const color clr=clrDarkBlue, // öâåò ïëîñêîé ãðàíèöû (Flat)
const ENUM_LINE_STYLE style=STYLE_SOLID, // ñòèëü ïëîñêîé ãðàíèöû
const int line_width=3, // òîëùèíà ïëîñêîé ãðàíèöû
const bool back=false, // íà çàäíåì ïëàíå
const bool selection=false, // âûäåëèòü äëÿ ïåðåìåùåíèé
const bool hidden=false, // ñêðûò â ñïèñêå îáúåêòîâ
const long z_order=0) // ïðèîðèòåò íà íàæàòèå ìûøüþ
{
//--- ñáðîñèì çíà÷åíèå îøèáêè
ResetLastError();
//--- ñîçäàäèì ïðÿìîóãîëüíóþ ìåòêó
if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
{
Comment(__FUNCTION__,
": íå óäàëîñü ñîçäàòü ïðÿìîóãîëüíóþ ìåòêó! Êîä îøèáêè = ",GetLastError());
return(false);
}
//--- óñòàíîâèì êîîðäèíàòû ìåòêè
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- óñòàíîâèì ðàçìåðû ìåòêè
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- óñòàíîâèì öâåò ôîíà
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- óñòàíîâèì òèï ãðàíèöû
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,border);
//--- óñòàíîâèì óãîë ãðàôèêà, îòíîñèòåëüíî êîòîðîãî áóäóò îïðåäåëÿòüñÿ êîîðäèíàòû òî÷êè
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- óñòàíîâèì öâåò ïëîñêîé ðàìêè (â ðåæèìå Flat)
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- óñòàíîâèì ñòèëü ëèíèè ïëîñêîé ðàìêè
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- óñòàíîâèì òîëùèíó ïëîñêîé ãðàíèöû
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- îòîáðàçèì íà ïåðåäíåì (false) èëè çàäíåì (true) ïëàíå
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- âêëþ÷èì (true) èëè îòêëþ÷èì (false) ðåæèì ïåðåìåùåíèÿ ìåòêè ìûøüþ
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ñêðîåì (true) èëè îòîáðàçèì (false) èìÿ ãðàôè÷åñêîãî îáúåêòà â ñïèñêå îáúåêòîâ
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- óñòàíîâèì ïðèîðèòåò íà ïîëó÷åíèå ñîáûòèÿ íàæàòèÿ ìûøè íà ãðàôèêå
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- óñïåøíîå âûïîëíåíèå
return(true);
}
//------------------------------------------
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---