MA_TrendLine_01

Author: Inkov Evgeni ew123@mail.ru
Price Data Components
Series array that contains open time of each barSeries array that contains close prices for each barSeries array that contains open prices of each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains open prices of each barSeries array that contains close prices for each bar
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
Indicators Used
Moving average indicator
0 Views
0 Downloads
0 Favorites
MA_TrendLine_01
//+------------------------------------------------------------------+
//|                                              MA_TrendLine_01.mq4 |
//|                                                     Inkov Evgeni |
//|                                                    ew123@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Inkov Evgeni ew123@mail.ru"
#property link      "8-918-600-11-33"
//=======================================================================
//                         ÒÎÐÃÎÂËß (ïî òðåíäîâîé ëèíèè) ÎÒËÎÆÅÍÍÛÌÈ ÎÐÄÅÐÀÌÈ
//                               òîðãîâëÿ íà ïðîáîé ÒË
//=======================================================================
#define           Razm_Mas_Fract         500
//=======================================================================
extern double     Lot_Osn              = 0;     // 0 - äëÿ ðàñ÷åòà ëîòà èñï. Risk
 
extern double     Risk                 = 10;    //ïðîöåíòû îò áàëàíñà äëÿ ðàñ÷åòà íà÷. ëîòà
extern bool       Risk_from_Balance    = false; //true - ñ÷èòàåì ðèñê îò áàëàíñà, false - îò ñâîá.ñðåäñòâ
                                                // ìîæíî â ðó÷íóþ çàäàâàòü íàïðàâëåíèå îòêðûòèÿ îðäåðîâ:
extern bool       Trend_UP             = true;  // áóäóò îòêðûâàòüñÿ òîëüêî Buy 
extern bool       Trend_DW             = true;  // áóäóò îòêðûâàòüñÿ òîëüêî Sell
 
extern int        TP_prob              = 100;   // Òåéê-ïðîôèò
extern int        Otstup_pr_prob       = 7;     // äëÿ ôîðìèðîâàíèÿ îòëîæåííîãî îðäåðà îòñòóï îò High ïåðâîãî áàðà
extern int        Otstup_SL_prob       = 10;    // îòñòóï îò 1 áàðà äëÿ SL
 
extern bool       On_Begin_Torg        = true;  // èñïîëüçîâàòü âðåìÿ äëÿ íà÷àëî òîðãîâëè
extern int        Begin_Torg           = 480;   // âðåìÿ íà÷àëà òîðãîâëè (îòñòóï îò 00:00 â ìèíóòàõ)
extern bool       On_End_Torg          = false; // èñïîëüçîâàòü âðåìÿ äëÿ îêîí÷àíèÿ òîðãîâëè
extern int        End_Torg             = 30;    // âðåìÿ çàêðûòèå âñåõ îðäåðîâ (îòñòóï îò êîíöà äíÿ â ìèíóòàõ)
 
extern bool       comm                 = true;  // âûâîäèòü êîììåíòàðèè
extern bool       sound                = true;  // îçâó÷èâàòü îòêðûòèå îðäåðîâ
extern int        TF_Torg              = 15;    // òàéì-ôðåéì òîðãîâëè
extern int        MagicNumber          = 335580;
extern int        Slippage             = 5;
//....................................................
extern int        Fractal_Bars         = 3;     // ïåðåìåííàÿ äëÿ ôîðìèðîâàíèÿ ôðàêòàëîâ, ÷åì áîëüøå òåì ðåæå ôðàêòàëû
extern int        Na4_Bar_Fract        = 1;     // íîìåð áàðà, ñ êîòîðîãî íà÷èíàåòñÿ ïîèñê ôðàêòàëà
extern bool       Out_Grafic           = true;  // âûâîäèòü çèã-çàã íà ýêðàí
extern int        IndNumb              = 10;    // ïðåôèêñ äëÿ ëèíèé çèã-çàãà
extern int        kol_voln             = 20;    // êîë. âîëí âûâîäèìûõ íà ýêðàí
//+------------------------------------------------------------------+
extern bool       Open_Del_Otl         = true;  // óäàëÿòü âñòðå÷íûé îòëîæåííûé ïðè îòêðûòèè ðûíî÷íîãî îðäåðà
extern bool       On_Vstr_Otl          = false; // îòêðûâàòü âñòðå÷íûå îòëîæåííûå îðäåðà
extern bool       Trail_Stop           = true;  // èñïîëüçîâàòü òðåéëèíã-ñòîï ïî âîëíàì çèã-çàãà
extern int        Volna_Trail_Stop     = 1;     // ïî êàêîé âîëíå äâèãàòü òðåéëèíã-ñòîï
//+------------------------------------------------------------------+
extern bool       Out_MA               = true;  // âûâîäèòü MA
extern int        Kol_Bar_MA           = 100;   // ñêîëüêî áàðîâ ÌÀ ïîêàçûâàòü
extern bool       Out_Trend_Line       = true;  // âûâîäèòü Òðåíäîâóþ Ëèíèþ
extern string     Name_Trend_Line      = "TL_1";// èìÿ òðåíäîâîé ëèíèè
 
extern int        Proc_obraz_zwezd     = 10;    // ïðîöåíò ìåæäó (Open-Close)/(High-Low) äëÿ ïðèíÿòèÿ áàðà â êà÷åñòâå "çâåçäû"
//+------------------------------------------------------------------+
extern double     Min_Tangens_TL_prob  = 0.27; // òàíãåíñ óãëà íàêëîíà ÒË, åñëè îí ìåíüøå ýòîãî çíà÷åíèÿ, òî íå òîðãóåì
extern double     Min_Tangens_TL_clos  = 0.13; 
//+------------------------------------------------------------------+
extern int        BackSteps            = 4;  // íîìåð áàðà âòîðîé êîîðä. äëÿ ôîðì. ÒË, ïåðâàÿ êîîðä. - ýòî ïåðâûé áàð ÌÀ
extern int        MA_Period            = 40; // ïàðàìåòðû ÌÀ: ïåðèîä
extern int        MA_Shift             = -8; // ñäâèã
extern int        MA_Method            = 0;
extern int        MA_Applied_Price     = 0;
//-------------------------------
//MA_Method:        MODE_SMA       0    Ïðîñòîå ñêîëüçÿùåå ñðåäíåå
//                  MODE_EMA       1    Ýêñïîíåíöèàëüíîå ñêîëüçÿùåå ñðåäíåå
//                  MODE_SMMA       2    Ñãëàæåííîå ñêîëüçÿùåå ñðåäíåå
//                  MODE_LWMA       3    Ëèíåéíî-âçâåøåííîå ñêîëüçÿùåå ñðåäíåå
//-------------------------------
//MA_Applied_Price: PRICE_CLOSE        0    Öåíà çàêðûòèÿ
//                  PRICE_OPEN        1    Öåíà îòêðûòèÿ
//                  PRICE_HIGH        2    Ìàêñèìàëüíàÿ öåíà
//                  PRICE_LOW           3    Ìèíèìàëüíàÿ öåíà
//                  PRICE_MEDIAN     4    Ñðåäíÿÿ öåíà, (high+low)/2
//                  PRICE_TYPICAL     5    Òèïè÷íàÿ öåíà, (high+low+close)/3
//                  PRICE_WEIGHTED     6    Âçâåøåííàÿ öåíà çàêðûòèÿ, (high+low+close+close)/4
//=======================================================================
string      otstup = "                                                                   ";
int         mas_ord[6];
int         kol_ord;
double      Lot;
int         dig_lot;
int         stop_level;
string      com,com1;
double      min_l, max_l;
double      Tick_Value;
datetime    na4_open_ord, end_open_ord, Time00,Tek_Time;
double      urov_st_UP,urov_st_DW;
double      koef,koef1;
int         Nom_Bar_Torg = 1;     // íîìåð áàðà äëÿ àíàëèçà íà÷àëà òîðãîâîè
//..........................................
double      mas_extrem  [Razm_Mas_Fract][2];   // 0 - öåíà ýêñòðåìóìà, 1 - íîìåð áàðà ýêñòðåìóìà
int         kol_mas_extr;                      // êîëè÷. èñïîëüçóåìûõ ÿ÷ååê â mas_extrem
 
datetime    tek_Bar_TF;
color       Color_voln=Magenta;
string      com_voln;
double      pr_Trail_Stop;
 
double      pr1_TL,pr2_TL;
int         n1_TL,n2_TL;
//+------------------------------------------------------------------+
int init()
{
   Tick_Value = MarketInfo(Symbol(),MODE_TICKVALUE);
   
   min_l=MarketInfo(Symbol(),MODE_MINLOT);
   max_l=MarketInfo(Symbol(),MODE_MAXLOT);
   //.............................................
   double n_lot=MarketInfo(Symbol(),MODE_LOTSTEP);
   dig_lot=0;
   while (n_lot<1)
   {
      dig_lot++;
      n_lot *=10;
   }
   del_obj(IndNumb);
   tek_Bar_TF=0;
   //.............................................
   if (IsTesting() && !IsVisualMode())
   {
      comm = false;
      sound = false;
      Out_Grafic = false;
      Out_MA = false;
      Out_Trend_Line = false;
   }
   if (IsTesting() || IsExpertEnabled()) start();  // åñëè ðåæèì Tåñòåðà èëè íàæàòà êíîïêà "Ñîâåòíèêè", òî Start
 
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   ObjectsDeleteAll();
   Comment("");
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   //--------------------
         // ïåðåñ÷èòûâàåì âîëíû òîëüêî ïðè ñìåíå áàðà íà TF_Torg
   if (tek_Bar_TF==0 || tek_Bar_TF != iTime(Symbol(),TF_Torg,0))
   {
      Put_mas_fract_and_extr(TF_Torg, Color_voln,Color_voln,IndNumb,mas_extrem,kol_mas_extr);
      Form_TL(BackSteps);               // ñôîðìèðîâàòü TL
      if (Out_MA)ind_MA(Kol_Bar_MA);    // âûâåñòè MA íà ýêðàí
      tek_Bar_TF = iTime(Symbol(),TF_Torg,0);
   }
   //--------------------
   Tek_Time  = TimeCurrent();                            // òåêóùåå âðåìÿ
   Time00    = StrToTime(TimeToStr(Tek_Time,TIME_DATE)); // âðåìÿ íà÷àëà ñåãîäíÿøíåãî äíÿ
   na4_open_ord  = Time00 + Begin_Torg*60;               // âðåìÿ íà÷àëà îòêðûòèÿ îðäåðîâ
   end_open_ord = Time00 + (1440 - End_Torg)*60;         // âðåìÿ êîíöà òîðãîâëè
   //--------------------
   stop_level=MarketInfo(Symbol(),MODE_STOPLEVEL);
   //--------------------
                     // îïðåäåëèòüñÿ ñ íà÷àëüíûì ëîòîì
   if (Lot_Osn > 0)
      Lot=Lot_Osn;
   else
      Lot=GetLot();
   //--------------------
                        // îïðåäåëèòü, ñêîëüêî è êàêèå îðäåðà óñòàíîâëåíû
   kol_ord = put_mas_ord();
   //......................................
   if (comm)Out_Comm();                   // ñôîðìèðîâàòü êîììåíòàðèé
   if (comm)Comment(com+com1+com_voln);   // âûâåñòè êîììåíòàðèé íà ýêðàí
   //*************************************************************
                     // òðåéëèíã-ñòîï ïî âîëíàì
   if (Trail_Stop && mas_ord[OP_BUY] > 0)
   {
      pr_Trail_Stop=pr_TS_Buy(Volna_Trail_Stop);
      if (pr_Trail_Stop>0) ust_TS_Buy(pr_Trail_Stop);
   }
       
   if (Trail_Stop && mas_ord[OP_SELL] > 0)
   {
      pr_Trail_Stop=pr_TS_Sell(Volna_Trail_Stop);
      if (pr_Trail_Stop>0) ust_TS_Sell(pr_Trail_Stop);
   }
   //------------------------------------------------------------------
            // åñëè îòêðûëñÿ ðûíî÷íûé, óäàëèòü îòëîæåííûé
   if (Open_Del_Otl && mas_ord[OP_BUY]  > 0 && mas_ord[OP_SELLSTOP] > 0)Del_otlog(OP_SELLSTOP);
   if (Open_Del_Otl && mas_ord[OP_SELL] > 0 && mas_ord[OP_BUYSTOP]  > 0)Del_otlog(OP_BUYSTOP);
   //-----------------------------
            // åñëè ïîÿâèëîñü óñëîâèå çàêðûòèÿ îðäåðà, çàêðûòü
   if (mas_ord[OP_SELL] > 0)
      if (Proboi_TL_H_Close(Nom_Bar_Torg)) close_ord(OP_SELL);
   if (mas_ord[OP_BUY] > 0)
      if (Proboi_TL_L_Close(Nom_Bar_Torg)) close_ord(OP_BUY);
   //*************************************************************
            // íà÷àëî òîðãîâëè: óñòàíîâèòü îòëîæåííûé îðäåð
   kol_ord = put_mas_ord();
   if ((!On_Begin_Torg || Tek_Time >= na4_open_ord) && (!On_End_Torg || Tek_Time < end_open_ord))
      if (mas_ord[OP_BUY]==0 && mas_ord[OP_SELL] == 0)
      {
         if (Trend_UP && mas_ord[OP_BUYSTOP] == 0)
            if (Proboi_TL_H_Open(Nom_Bar_Torg,urov_st_UP,urov_st_DW))
            {
               Otkr_BuyStop (urov_st_UP,urov_st_DW,Otstup_pr_prob, TP_prob, Otstup_SL_prob);
               if (On_Vstr_Otl)
               {
                  if (mas_ord[OP_SELLSTOP]>0)Del_otlog(OP_SELLSTOP);
                  Otkr_SellStop(urov_st_UP,urov_st_DW,Otstup_pr_prob, TP_prob, Otstup_SL_prob);
               }
               kol_ord=put_mas_ord (); 
            }
         //---------------------------------------------
         if (Trend_DW && mas_ord[OP_SELLSTOP] == 0)
            if (Proboi_TL_L_Open(Nom_Bar_Torg,urov_st_UP,urov_st_DW))
            {
               Otkr_SellStop(urov_st_UP,urov_st_DW,Otstup_pr_prob, TP_prob, Otstup_SL_prob);
               if (On_Vstr_Otl)
               {
                  if (mas_ord[OP_BUYSTOP]>0)Del_otlog(OP_BUYSTOP);
                  Otkr_BuyStop (urov_st_UP,urov_st_DW,Otstup_pr_prob, TP_prob, Otstup_SL_prob);
               }
               kol_ord=put_mas_ord (); 
            }
      }
   //*************************************************************
   return(0);
}
//======================================================================
bool Proboi_TL_H_Open(int n_bar, double& urov_UP,double& urov_DW)
{           // èùåì áû÷èé áàð, ðàñïîëîæåííûé âûøå òðåíäîâîé ëèíèè "Í"
   int n1,n2;
   double pr1,pr2;
   
   urov_UP=0;
   urov_DW=0;
               // åñëè áàð ìåäâåæèé è áîëüøå "çâåçäû", òî âûõîä 0
   double d1=iHigh(Symbol(),TF_Torg,n_bar)-iLow(Symbol(),TF_Torg,n_bar);
   double d2=iOpen(Symbol(),TF_Torg,n_bar)-iClose(Symbol(),TF_Torg,n_bar);
   if (d2>d1*Proc_obraz_zwezd/100.0)return(0);
 
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
 
         // îïðåäåëèòü íàêëîí ÒË
   koef=(pr1-pr2)/(n1-n2);
   if (koef<=Min_Tangens_TL_prob*Point)return(0);
 
   double pr_bar  = pr2-koef*(n2-n_bar);      // òî÷êà ïåðåñå÷åíèÿ ÒË è ëèíèåé áàðà
   double pr_bar1 = pr2-koef*(n2-(n_bar+1));  // òî÷êà ïåðåñå÷åíèÿ ÒË è ëèíèåé ïðåä.áàðà
   
   if (iLow (Symbol(),TF_Torg,n_bar)   >= pr_bar && // áàð âûøå ÒË ?
       iLow (Symbol(),TF_Torg,n_bar+1) <= pr_bar1)  // ïðåä. áàð ïðîõîäèò ÷åðåç ÒË
   {
      urov_UP=iHigh(Symbol(),TF_Torg,n_bar);
      urov_DW=iLow (Symbol(),TF_Torg,n_bar);
      return(1);
   }
   return(0);
}
//----------------------------
bool Proboi_TL_L_Open(int n_bar, double& urov_UP,double& urov_DW)
{        // èùåì áàð, ðàñïîëîæåííûé íèæå òðåíäîâîé ëèíèè "L", òàê ÷òîáû
         // ïðåäûäóùèé êàñàëñÿ ÒË
   int n1,n2;
   double pr1,pr2;
   
   urov_UP=0;
   urov_DW=0;
 
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
 
         // îïðåäåëèòü íàêëîí ÒË
   koef=(pr2-pr1)/(n1-n2);
   if (koef<=Min_Tangens_TL_prob*Point)return(0);
 
   double pr_bar  = pr2+koef*(n2-n_bar);      // òî÷êà ïåðåñå÷åíèÿ ÒË è ëèíèåé áàðà
   double pr_bar1 = pr2+koef*(n2-(n_bar+1));  // òî÷êà ïåðåñå÷åíèÿ ÒË è ëèíèåé ïðåä.áàðà
   
   if (iHigh(Symbol(),TF_Torg,n_bar)   <= pr_bar && // òåêóùèé áàð íèæå ÒË 
       iHigh(Symbol(),TF_Torg,n_bar+1) >= pr_bar1)  //  ïðåä. áàð ïðîõîäèò ÷åðåç ÒË
   {
      urov_UP=iHigh(Symbol(),TF_Torg,n_bar);
      urov_DW=iLow (Symbol(),TF_Torg,n_bar);
      return(1);
   }
   return(0);
}
//----------------------------
bool Proboi_TL_H_Close(int n_bar)
{      
          // åñëè áàð ïîëíîñòüþ âûøå ëèíèè òðåíäà, âûäàòü "true" 
   int n1,n2;
   double pr1,pr2;
 
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
 
         // îïðåäåëèòü íàêëîí ÒË
   koef=(pr1-pr2)/(n1-n2);
   if (koef<=Min_Tangens_TL_clos*Point)return(0);
 
   double pr_bar=pr2-koef*(n2-n_bar);  // pr_bar - òî÷êà ïåðåñå÷åíèÿ ÒË è ëèíèåé áàðà
 
   if (iLow(Symbol(),TF_Torg,n_bar)>pr_bar)return(1);
   
   return(0);
}
//------------------------------------------------
bool Proboi_TL_L_Close(int n_bar)
{
            // Åñëè áàð ïîëíîñòüþ íèæå ëèíèè òðåíäà, âûäàòü "true"   
   int n1,n2;
   double pr1,pr2;
 
         // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
   if (!opred_koord_TL(n1,n2,pr1,pr2))return(0);
 
   koef=(pr2-pr1)/(n1-n2);      //koef - íàêëîí ÒË
   if (koef<=Min_Tangens_TL_clos*Point)return(0);
 
   double pr_bar=pr2+koef*(n2-n_bar);  // pr_bar - òî÷êà ïåðåñå÷åíèÿ ÒË è ëèíèåé áàðà
 
   if (iHigh(Symbol(),TF_Torg,n_bar)<pr_bar)return(1);
   return(0);
}
//-----------------------------------------------
bool opred_koord_TL(int& n1, int& n2, double& pr1,double& pr2)
{      // îïðåäåëèòü êîîðäèíàòû òðåíäîâîé ëèíèè (ÒË)
 
   pr1 =pr1_TL;
   pr2 =pr2_TL;
   n1=n1_TL;
   n2=n2_TL;
   
  return(1);
}
//----------------------------
double pr_TS_Buy(int n)
{
  if (mas_extrem[n][0]<mas_extrem[n-1][0])return(mas_extrem[n][0]);
 
  return(0);
}
//-----------------------------------------------
double pr_TS_Sell(int n)
{
  if (mas_extrem[n][0]>mas_extrem[n-1][0])return(mas_extrem[n][0]);
 
  return(0);
}
//-----------------------------------------------
bool ust_TS_Buy (double pr)
{
   pr=NormalizeDouble(pr,Digits);
 
   for(int i=0; i<OrdersTotal(); i++)
      if (OrderSelect(i,SELECT_BY_POS)==true)
      {
         if (OrderSymbol()!=Symbol()) continue;
         if (OrderMagicNumber() != MagicNumber) continue;
         if (OrderType()==OP_BUY)
         {
            RefreshRates();
            if (OrderStopLoss() < pr && pr<Bid && pr>=OrderOpenPrice())
               OrderModify(OrderTicket(),OrderOpenPrice(),pr,OrderTakeProfit(),0);
         }
      }
   return(0);
}
//-----------------------------------------------
bool ust_TS_Sell (double pr)
{
   pr=NormalizeDouble(pr,Digits);
   
   for(int i=0; i<OrdersTotal(); i++)
      if (OrderSelect(i,SELECT_BY_POS)==true)
      {
         if (OrderSymbol()!=Symbol()) continue;
         if (OrderMagicNumber() != MagicNumber) continue;
         if (OrderType()==OP_SELL)
         {
            RefreshRates();
            if ((OrderStopLoss()==0 || OrderStopLoss() > pr) && pr>Ask && pr<=OrderOpenPrice())
               OrderModify(OrderTicket(),OrderOpenPrice(),pr,OrderTakeProfit(),0);
         }
      }
   return(0);
}
//+------------------------------------------------------------------+
int put_mas_ord()
{        // ïîñ÷èòàòü êîë. îðäåðîâ
   int n;
   
   ArrayInitialize(mas_ord,0);
   
   for(int i=0; i<OrdersTotal(); i++)
      if (OrderSelect(i,SELECT_BY_POS)==true)
      {
         if (OrderSymbol() != Symbol()) continue;
         if (OrderMagicNumber() != MagicNumber) continue;
         mas_ord[OrderType()]++;
         n++;
      }
   return(n);
}
//---------------------------------------------
double GetLot()
{
   double free_magrin;
   
   if (Risk_from_Balance)
      free_magrin = AccountBalance();
   else
      free_magrin = AccountFreeMargin();
 
   double lot = NormalizeDouble(free_magrin * Risk/100000.0,dig_lot);
   
   return (lot);
}
//+------------------------------------------------------------------+
double Ogran_lot(double lot)
{
   if (lot < min_l)lot = min_l;
   if (lot > max_l)lot = max_l;
   return(lot);
}
//+------------------------------------------------------------------+
bool Otkr_BuyStop(double urov_UP,double urov_DW,int Otstup_pr, int TP, int Otstup_SL)
{
   double tek_pr,tek_sl,tek_tp;
   int err;
   
   tek_pr = urov_UP + Otstup_pr*Point;
   RefreshRates();
   if (Bid>=tek_pr-stop_level*Point)return(0);
   
   tek_tp = tek_pr + TP*Point;
   tek_sl = urov_DW - Otstup_SL*Point;
 
   err=ust_ord(OP_BUYSTOP, Lot, tek_pr, tek_sl, tek_tp, "~R1~");
   if (err<0)com=com+" OP_BUYSTOP="+GetLastError()+" pr="+DoubleToStr(tek_pr,Digits)+" sl="+DoubleToStr(tek_sl,Digits)+" tp="+DoubleToStr(tek_tp,Digits)+"\n";
 
   return(err>0);
}
//------------------------------------------------------------------------
bool Otkr_SellStop(double urov_UP,double urov_DW,int Otstup_pr, int TP, int Otstup_SL)
{
   double tek_pr,tek_sl,tek_tp;
   int err;
   
   tek_pr = urov_DW - Otstup_pr*Point;
   RefreshRates();
   if (Ask<=tek_pr+stop_level*Point)return(0);
   
   tek_tp = tek_pr - TP*Point;
   tek_sl = urov_UP + Otstup_SL*Point;
 
   err=ust_ord(OP_SELLSTOP, Lot, tek_pr, tek_sl, tek_tp, "~R1~");
   if (err<0)com=com+" OP_SELLSTOP="+GetLastError()+" pr="+DoubleToStr(tek_pr,Digits)+" sl="+DoubleToStr(tek_sl,Digits)+" tp="+DoubleToStr(tek_tp,Digits)+"\n";
 
   return(err>0);
}
//------------------------------------------------------------------------
int ust_ord (int tip, double lot, double pr, double sl, double tp, string com11)
{
   int err;
   double tek_lot;
   double ust_lot=lot;
      
   while (ust_lot>0)
   {
      tek_lot=Ogran_lot(ust_lot);
 
      err=OrderSend(Symbol(), tip, tek_lot, pr, Slippage, sl, tp, com11, MagicNumber, 0);
      if (err<0)break;
      ust_lot-=tek_lot;
   }
   return (err);
}
//------------------------------------------------------------------------
bool  Del_otlog(int tip)
{                  // Óäàëåíèå âñåõ îòëîæåííûõ îðäåðîâ (tip=-1) èëè çàäàííîãî òèïà
   bool usl=true;
   while (usl)
   {
      usl=false;
      for(int i = 0; i < OrdersTotal(); i++) //ïåðåáèðàåì âñå îðäåðà
      {
         if (!OrderSelect(i, SELECT_BY_POS))continue;
         if (OrderSymbol() != Symbol())continue;
         if (OrderMagicNumber() != MagicNumber)continue;
         if (OrderType()>1 && (tip==OrderType() || tip==-1))
         {
             OrderDelete(OrderTicket());
             usl=true;
         }
      }
   }
   return(0); 
}
//------------------------------------------------------------------------
bool close_ord(int tip)
{   
   bool usl=true;
   while (usl)
   {
      usl=false;
      for(int i=0; i<OrdersTotal(); i++)
         if (OrderSelect(i,SELECT_BY_POS)==true)
         {
            if (OrderSymbol()!=Symbol()) continue;
            if (OrderMagicNumber() != MagicNumber)continue;
            
            if(OrderType()==OP_BUY && (tip==OP_BUY || tip==-1))
            {
               RefreshRates();
               OrderClose(OrderTicket(),OrderLots(),Bid,Slippage);
               usl=true;
            }
            if (OrderType()==OP_SELL && (tip==OP_SELL || tip==-1))
            {
               RefreshRates();
               OrderClose(OrderTicket(),OrderLots(),Ask,Slippage);
               usl=true;
            }
         }
   }
   return(0);
}
//---------------------------------------------
void Out_Comm()
{
   com1 = otstup+"Òåêóùåå âðåìÿ: " + TimeToStr(Tek_Time,TIME_SECONDS)+"   ";
   if (kol_ord==0)
      if (On_Begin_Torg && Tek_Time < na4_open_ord)
         com1 = com1+"Íà÷àëî òîðãîâëè ñåãîäíÿ";
      else
         com1 = com1 + "Æäåì óñëîâèÿ äëÿ îòêðûòèÿ îðäåðà";
   else
      com1 = com1+"Èäåò òîðãîâëÿ";
   if (On_Begin_Torg)com1 = com1 + " ñ "  + StringSubstr(TimeToStr(na4_open_ord,TIME_SECONDS),0,5);
   if (On_End_Torg)com1 = com1 + " äî " + StringSubstr(TimeToStr(end_open_ord,TIME_SECONDS),0,5); 
   com1 = com1  + "\n";
   //............................  
   com1=com1+otstup+"Íà÷àëüíûé ëîò = "+DoubleToStr(Lot,dig_lot)+"  Ðèñê = "+ DoubleToStr(Risk,2)+" %";
   if (Risk_from_Balance)
      com1=com1+" îò áàëàíñà\n";
   else
      com1=com1+" îò ñâîá.ñðåäñòâ\n";
   //............................  
   com1=com1+otstup+"Stop_Level = "+stop_level+"  Òàíãåíñ ÒË = "+koef1+"\n";
}
//==========================================================================
bool Put_mas_fract_and_extr(int TF,color col_UP,color col_DW,int nom_ind, double& mas_extremum[][], int& kol_mas_extr1)
{
   int i;
 
   double long1 [Razm_Mas_Fract];
   double short1[Razm_Mas_Fract];
   int na4_bar,kol_bar;
 
   ArrayInitialize(long1,0);
   ArrayInitialize(short1,0);
//----
   
   if (Fractal_Bars<=0)Fractal_Bars=1;
   
   int HighBar = -1;
   int LowBar  = -1;
   
   //Èùåì ôðàêòàëû  
   int kol_bars=MathMin(Razm_Mas_Fract,iBars(Symbol(),TF)-1);
   
   int tek_kol_voln;
   for(i=Na4_Bar_Fract;i<=kol_bars;i++) // ïðîñìàòðèâàåì ñ òåê.âðåìåíè íàçàä
   {
      //Èùåì íèæíèé ôðàêòàë: èíäåêñ ìèí.çíà÷. îò i-Fractal_Bars íàçàä êîë.=Fractal_Bars*2+1, ò.å. i +- Fractal_Bars
      na4_bar=i-Fractal_Bars;
      if (na4_bar<0)
      {
         kol_bar=Fractal_Bars*2+1+na4_bar;
         na4_bar=0;
      }
      else
         kol_bar=Fractal_Bars*2+1;
      if (i==iLowest(Symbol(),TF,MODE_LOW,kol_bar,na4_bar))  
      {
         switch(HighLow(LowBar,HighBar))
         {
            case -1:
            {
               if (NormalizeDouble(iLow(Symbol(),TF,i),Digits)<NormalizeDouble(iLow(Symbol(),TF,LowBar),Digits))
               {
                  long1[i]=iLow(Symbol(),TF,i);
                  long1[LowBar]=0;
                  LowBar=i;
//                  tek_kol_voln++;
               }
               break;
            }
            case 1:  // íîâûé íèç
            {
               if (NormalizeDouble(iLow(Symbol(),TF,i),Digits)<NormalizeDouble(iHigh(Symbol(),TF,HighBar),Digits))
               {
                  long1[i]=iLow(Symbol(),TF,i);
                  LowBar=i;
                  tek_kol_voln++;
               }
               break;
            }
            case 0:    // ïåðâûé ìèí.
            {
               long1[i]=iLow(Symbol(),TF,i);
               LowBar=i;
               tek_kol_voln++;
               break;
            }
         }
      }
      //Èùåì âåðõíèé ôðàêòàë
      na4_bar=i-Fractal_Bars;
      if (na4_bar<0)
      {
         kol_bar=Fractal_Bars*2+1+na4_bar;
         na4_bar=0;
      }
      else
         kol_bar=Fractal_Bars*2+1;
      if (i==iHighest(Symbol(),TF,MODE_HIGH,kol_bar,na4_bar) && long1[i]==0)  
      {
         switch(HighLow(LowBar,HighBar))
         {
            case 1:  // íîâûé âåðõ 
            {
               if (NormalizeDouble(iHigh(Symbol(),TF,i),Digits)>NormalizeDouble(iHigh(Symbol(),TF,HighBar),Digits))
               {
                  short1[i]=iHigh(Symbol(),TF,i);
                  short1[HighBar]=0;
                  HighBar=i;
//                  tek_kol_voln++;
               }
               break;
            }
            case -1:
            {
               if (NormalizeDouble(iHigh(Symbol(),TF,i),Digits)>NormalizeDouble(iLow(Symbol(),TF,LowBar),Digits))
               {
                  short1[i]=iHigh(Symbol(),TF,i);
                  HighBar=i;
                  tek_kol_voln++;
               }
               break;
            }
            case 0:  // ïåðâûé ìàêñ.
            {
               short1[i]=iHigh(Symbol(),TF,i);
               HighBar=i;
               tek_kol_voln++;
               break;
            }
         }
      }
      if (tek_kol_voln>kol_voln)break;
   }
 
   kol_bars=i;
   if (Out_Grafic)                                          //Ðèñóåì ëîìàíóþ
      if (Period()<=TF)
      {
         del_obj(nom_ind);
         int LastExtremumBar     = -1;
         for(i=kol_bars;i>=Na4_Bar_Fract;i--)
         {
            if (long1[i]!=0 || short1[i]!=0)
            {
               if (LastExtremumBar!=-1)
               {
                  if (long1[i]!=0)
                  {
                     int Nom_Bar1= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar));
                     int Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar-1));
                     if (LastExtremumBar==0)Nom_Bar12=0;
                     int j1=Nom_Bar1;
                     if (Nom_Bar1<=MathMin(kol_bars,Bars-1))
                     {
                        for (j1=Nom_Bar1;j1>=Nom_Bar12;j1--)if (short1[LastExtremumBar]==High[j1])break;
                        if (j1<Nom_Bar12)j1=Nom_Bar1;
                     }
                  
                     int Nom_Bar2= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i));
                     Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i-1));
                     if (i==0)Nom_Bar12=0;
                     int j2=Nom_Bar2;
                     if (Nom_Bar2<=MathMin(kol_bars,Bars-1))
                     {
                        for (j2=Nom_Bar2;j2>=Nom_Bar12;j2--)if (long1[i]==Low[j2])break;
                        if (j2<Nom_Bar12)j2=Nom_Bar2;
                     }
                  
                     ObjectCreate(StringConcatenate("Trend_",nom_ind,"_",i),OBJ_TREND,0,
                        Time[j1],short1[LastExtremumBar],Time[j2],long1[i]);
                     ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_COLOR,col_DW);
                  }
                  if (short1[i]!=0)
                  {
                     Nom_Bar1= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar));
                     Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,LastExtremumBar-1));
                     if (LastExtremumBar==0)Nom_Bar12=0;
                     j1=Nom_Bar1;
                     if (Nom_Bar1<=MathMin(kol_bars,Bars-1))
                     {
                        for (j1=Nom_Bar1;j1>=Nom_Bar12;j1--)if (long1[LastExtremumBar]==Low[j1])break;
                        if (j1<Nom_Bar12)j1=Nom_Bar1;
                     }
                     
                     Nom_Bar2= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i));
                     Nom_Bar12= iBarShift(Symbol(),Period(),iTime(Symbol(),TF,i-1));
                     if (i==0)Nom_Bar12=0;
                     j2=Nom_Bar2;
                     if (Nom_Bar2<=MathMin(kol_bars,Bars-1))
                     {
                        for (j2=Nom_Bar2;j2>=Nom_Bar12;j2--)if (short1[i]==High[j2])break;
                        if (j2<Nom_Bar12)j2=Nom_Bar2;
                     }
 
                     ObjectCreate(StringConcatenate("Trend_",nom_ind,"_",i),OBJ_TREND,0,
                        Time[j1],long1[LastExtremumBar],Time[j2],short1[i]);
                     ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_COLOR,col_UP);
                  }
                  ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_RAY,0);
                  ObjectSet(StringConcatenate("Trend_",nom_ind,"_",i),OBJPROP_WIDTH,2);
               }
               LastExtremumBar=i;
            }
         }
      }
   
   for(i=0;i<=Razm_Mas_Fract;i++) if (short1[i]!=0) long1[i]=short1[i];
   
   ArrayInitialize(mas_extremum,0);
   kol_mas_extr1=0;
   for(i=0;i<=Razm_Mas_Fract;i++)
      if (long1[i]!=0)
      {
         mas_extremum[kol_mas_extr1][0]=NormalizeDouble(long1[i],Digits);
         mas_extremum[kol_mas_extr1][1]=NormalizeDouble(i,0);
         kol_mas_extr1++;
      }
      
   return(0);
}
//+------------------------------------------------------------------+
int HighLow(int L, int H)
{
         // íà÷àëî ãðàôèêà
   if (L == -1 && H >=  0) return(1);  // íèçà  åù¸ íå áûëî, à âåðõ óæå áûë, ýòî íîâûé âåðõ
   if (L >=  0 && H == -1) return(-1); // âåðõà åù¸ íå áûëî, à íèç  óæå áûë, ýòî íîâûé íèç
         // ïðîäîëæåíèå ãðàôèêà
   if (L >=  0 && H >=  0)
   {
      if (L < H) return(1);   // íàéäåí âåðõ èëè íèç
      if (L > H) return(-1);  // íàéäåí âåðõ èëè íèç
   }
   return(0);  // (L==-1 è H==-1) ïåðâûé ìàõ. èëè ìèí. - íà÷àëî ãðàôèêà
}
//------------------------------------------------------------------------
void del_obj(int nom)
{
   for(int i=Razm_Mas_Fract;i>=0;i--)
      if (ObjectFind(StringConcatenate("Trend_",nom,"_",i))!=-1)
         ObjectDelete(StringConcatenate("Trend_",nom,"_",i));
}
//------------------------------------------------------------------------
string Form_TL(int Step)
  {   
   n1_TL=-MA_Shift;
   n2_TL=Step-MA_Shift;
   pr1_TL=iMA(Symbol(),TF_Torg,MA_Period,MA_Shift,MA_Method,MA_Applied_Price,n1_TL);
   pr2_TL=iMA(Symbol(),TF_Torg,MA_Period,MA_Shift,MA_Method,MA_Applied_Price,n2_TL);
 
   koef1=(pr1_TL-pr2_TL)/(n2_TL-n1_TL)/Point;
   if (Period()>TF_Torg)
   {
      ObjectDelete(Name_Trend_Line);
      return(0);
   }
   if (Out_Trend_Line)
   {
      if (ObjectFind(Name_Trend_Line)<0)ObjectCreate(Name_Trend_Line,OBJ_TREND,0,0,0,0,0);
   
      ObjectSet(Name_Trend_Line,OBJPROP_TIME1,iTime(Symbol(),TF_Torg,n2_TL));
      ObjectSet(Name_Trend_Line,OBJPROP_TIME2,iTime(Symbol(),TF_Torg,n1_TL));
      ObjectSet(Name_Trend_Line,OBJPROP_PRICE1,pr2_TL);
      ObjectSet(Name_Trend_Line,OBJPROP_PRICE2,pr1_TL);
      ObjectSet(Name_Trend_Line,OBJPROP_COLOR,Blue);
      ObjectSet(Name_Trend_Line,OBJPROP_WIDTH,1);
   }
   return(0);
  }
//+------------------------------------------------------------------+
void ind_MA(int end_bar)
{
   string Name, Prefix_MA="MA_";
   
   for (int indexBar = 0; indexBar < Bars; indexBar++)
   {
      Name = Prefix_MA + DoubleToStr(indexBar, 0);
      ObjectDelete(Name);
   }
   if (Period()>TF_Torg)return;
   
   int n;
   double pr1,pr2;
   color ColorMA=Green;
   
   pr1=iMA(Symbol(),TF_Torg,MA_Period,MA_Shift,MA_Method,MA_Applied_Price,-MA_Shift);
   for (indexBar = 1; indexBar < MathMin(end_bar,Bars); indexBar++)
   {
      n=indexBar-MA_Shift;
      pr2=iMA(Symbol(),TF_Torg,MA_Period,MA_Shift,MA_Method,MA_Applied_Price,n);
      
      Name = Prefix_MA + DoubleToStr(indexBar, 0);
      if (ObjectFind(Name) == -1)
      {
         ObjectCreate(Name, OBJ_TREND, 0, 0, 0, 0, 0);
         ObjectSet(Name, OBJPROP_STYLE, STYLE_SOLID);
         ObjectSet(Name, OBJPROP_WIDTH, 2);
         ObjectSet(Name, OBJPROP_RAY, false);         
      }
      ObjectSet(Name, OBJPROP_TIME1, iTime(Symbol(),TF_Torg,indexBar-MA_Shift));
      ObjectSet(Name, OBJPROP_PRICE1, pr2);
      ObjectSet(Name, OBJPROP_TIME2, iTime(Symbol(),TF_Torg,indexBar-MA_Shift - 1));
      ObjectSet(Name, OBJPROP_PRICE2, pr1);
      ObjectSet(Name, OBJPROP_COLOR, ColorMA);
      pr1=pr2;       
   }
}
//=============================================================

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