Training_v02

Author: Inkov Evgeni ew123@mail.ru
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reachedIt Closes Orders by itself
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 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 ---