//+----------------------------------------------------------------------------+
//|                                 ZigZaHod v1.0 fix8-Performance-edition.mq4 |
//|                                                   Copyright © 2015, Atomar |
//|                                       https://www.mql5.com/ru/users/atomar |
//|                                             Copyright © 2015, ForTorg ZEVs |
//|                                      https://www.mql5.com/ru/users/fortorg |
//+----------------------------------------------------------------------------+
#property copyright "Copyright © 2015, Atomar https://www.mql5.com/ru/users/atomar"
#property link      "https://www.mql5.com/ru/users/atomar"
#property copyright "Copyright © 2015, ForTorg ZEVs https://www.mql5.com/ru/users/fortorg"
#property link      "https://www.mql5.com/ru/users/fortorg"
#property copyright "Copyright © 2015, Atomar www.mql5.com/ru/users/atomar"
#property link      "https://www.mql5.com/ru/users/atomar"
int     BarsFr        = 5;
int     PervFr        = 3;
int     PropCandlFr   = 0;
extern  bool    SigFractal    = true;   //Ðàçðåøåíèå ñèãíàëüíîé ôóíêöèè âûäàâàòü
                                        //ñèãíàë íà îòêðûòèå íîâûõ îðäåðîâ???
extern  int     ABminRazmer   = 100;    //Ìèíèìàëüíûé ðàçìåð AB â ïóíêòàõ
extern  int     ABmaxSize     = 1000;   //Ìàêñèèìàëüíûé ðàçìåð AB â ïóíêòàõ
extern  int     Otstup        = 15;     //Îòñòóï îòëîæåííûõ (ñïðåä) â ïóíêòàõ
extern  double  OtstupProc    = 0.1;    //Îòñòóï îòëîæåííûõ îò íèæíåé è âåðõíåé
                                        //ãðàíèö AB (0.1 == 10 %)
extern  int     MaxOrder      = 10;     //max êîë-âî îðäåðîâ (íå áîëüøå 30,
                                        //îãðàíè÷åíèíî ðàçìåðîì ìàññèâà)
int     MaxOrdersetka = 1;      //Êîëè÷åñòâî îðäåðîâ ñåòêè
int     delta         = 25;     //Ðàññòîÿíèå îò òåêóùåé öåíû
extern  double  KoefProfit    = 1.5;    //Êîåôèöèåíò ïðîôèòà
extern  double  DelKorStopOrder = 0.6;  //Ãëóáèíà êîððåêöèè, ïðè êîòîðîé óáèðàòü
                                        //îòëîæåííûå
extern  bool    OtmerennyiHod = true;   //Îòìåðåííûé õîä
extern  bool    OdnaStor      = true;   //Òîðãîâëÿ â îäíó ñòîðîíó
bool    ObeStor       = false;
extern  bool    SignalDelOldOtl = false;//Óäàëÿåò ïðåäûäóùóþ îòëîæêó ñâîåãî
                                        //íàïðàâëåíèÿ ïðè ñèãíàëå
extern  bool    SignalDelOldOtlAll=false;//Óäàëÿåò ÂÑÅ ñòàðûå îòëîæêè ïðè
                                         //ñèãíàëå?????????
bool    DelBS         = false;
bool    DelSS         = false;
extern  bool    StopLos=false;  //Âûñòàâëÿåò SL çà Â
//------------------------------------------------------------------------------
int     OpBar         = 0;
int     OtkatBar      = 0;
double  Hod           = 0;
double  OtkatCena     = 0;
double  MA,MB,MRazmer,MTime;
//----
int     TfFr,hi,lo;
double  h1,h2,h3,h4,l1,l2,l3,l4;
int     hk1,hk2,hk3,hk4,lk1,lk2,lk3,lk4,kstart;
double  hf,lf;
bool    NewOrder=true;
double  A,B,C,D,Eh,El,AB,E,F,Up,Dn;
int     k=1,i=0,Ak,Bk=0,Ck,Dk,Ek,Fk,Upk,Dnk;
int     SigTfFr=0;
//------------------------------------------------------------------------------
extern  string  Trailing_Stop = "Trailing Stop";
extern  bool    bTrlinloss    = false;  //Ñëåäóåò ëè òðàëèòü íà ó÷àñòêå ëîññîâ
                                        //(ìåæäó êóðñîì ñòîïëîññà è îòêðûòèÿ)
extern  bool    SLSignal      = false;  //Âûñòàâëÿåò SL íà óðîâíå íîâîãî ñèãíàëà
                                        //ïðîòèâîïîëîæíîãî íàïðàâëåíèÿ (åñëè
//"îäíà ñòîðîíà" òî íå ðàáîòàåò)
extern  int     iTmfrm        = 240;    //Ïåðèîä ãðàôèêà, íà êîòîðîì
                                        //îïðåäåëÿþòñÿ ôðàêòàëû èëè òåíè (1, 5,
//15, 30, 60, 240, 1440, 10080, 43200)
extern  int     iIndent       = 50;     //Îòñòóï â ïóíêòàõ îò òåíè áàðà, íà
                                        //êîòîðîì ðàçìåùàåòñÿ ñòîïëîññ
extern  int     Frktl_bars    = 5;      //Êîëè÷åñòâî áàðîâ âî ôðàêòàëå
extern  int     Frktl_kol     = 0;      //Êîëè÷åñòâî ôðàêòàëîâ ïî êîòîðûì
                                        //òðàëèòü
extern  int     Bars_kol      = 19;     //Êîëè÷åñòâî áàðîâ, ïî òåíÿì êîòîðûõ
                                        //ñëåäóåò òðàëèòü
//------------------------------------------------------------------------------
extern  bool    isCloseAllByTargetProfit=FALSE;
extern  double  TargetLoss    = 999999; //Öåëåâîé óáûòîê
extern  double  TargetProfit  = 999999; //Öåëåâàÿ ïðèáûëü
extern  bool    isCloseAllByTargetPoints= FALSE;
extern  int     AllOrdrsSumLossInPoints = 2000;
extern  int     AllOrdrsSumPrftInPoints = 2000;
extern  bool    isProcessingUserOrdrs=FALSE;
extern  int     MagicNumber=515000;
//------------------------------------------------------------------------------
//bool    UseSound      = False;          //Èñïîëüçîâàòü çâóêîâîé ñèãíàë
//string  SoundSuccess  = "ok.wav";       //Çâóê óñïåõà
//string  SoundError    = "timeout.wav";  //Çâóê îøèáêè
//------------------------------------------------------------------------------
//Äâå ðàçäåëÿåìûå ìåæäó äâóìÿ ôóíêöèÿìè òðàëà
int     hTralFr;
int     lTralFr;
//------------------------------------------------------------------------------
int     iTicket;
double  Razmer;
//Äâå ðàçäåëÿåìûå ìåæäó ôóíêöèåé òðàëà TrailingByZ è ñèãíàëüíîé
double  SelSL;
double  BuySL;
//
string  ExpertComment = "test";
int     NumberOfTries = 5;
double  BStp=0,SStp=0,BSsl=0,SSsl=0,BSotl=0,SSotl=0;
double  Mas_Ord_Tek[31][8];     //Îáüÿâëÿåì ìàññèâ òåêóùèõ îðäåðîâ
                                //1-é èíäåêñ - ïîðÿäêîâûé íîìåð îðäåðà
//â ýòîì ìàññèâå
//[0][0]  Êîë-âî îòêðûòûõ îðäåðîâ
//[ ][1]  êóðñ îòêð. îðäåðà   (àáñîëþòíîå çíà÷. êóðñà)
//[ ][2]  StopLoss îðäåðà     (àáñîëþòíîå çíà÷. êóðñà)
//[ ][3]  TakeProfit îðäåðà   (àáñîëþòíîå çíà÷. êóðñà)
//[ ][4]  íîìåð îðäåðà         ticket
//[ ][5]  êîëè÷. ëîòîâ îðäåðà (àáñîëþòíîå çíà÷. êóðñà)
//[ ][6]  òèï îðäåðà 0=B,1=S,2=BL,3=SL,4=BS,5=SS
//[ ][7]  Ìàãè÷åñêîå ÷èñëî îðäåðà  MagicNumber
double  Massiv[31][10];         //Îñíîâíîé ìàññèâ
                                //1-é èíäåêñ - "òèêåò" îðäåðà â ýòîì
//ìàññèâå
//[0][1]  MagicNumber         !!! ñàìûé Íîâûé ìàãèê  !!!
//[0][2]  MinMagicNumber  îòêð. îðäåðîâ(èç áëîêà ñðàâíåíèÿ îðäåðîâ)
//[0][3]  áëèæàéøàÿ ñâîáîäíàÿ ñòðîêà
//[0][5]  ñ÷åò÷èê ñîõðàíåíèé
//Massiv[][1];  //Öåíà A
//Massiv[][2];  //Öåíà B
//Massiv[][3];  //Ðàçìåð ÀB
//Massiv[][5];  //Âðåìÿ  ÀB
//Massiv[][6];  //òàéìôðåéì TfFr
//------------------------------------------------------------------------------
//extern  bool    Commentariy   = true;
//extern  bool    DelHistoryMassiv = true;
bool    DelHistoryMassiv=true;
extern  bool    SaveMassiv=false;
//------------------------------------------------------------------------------
extern  int     sleepMilliSecToDelOrdrs=5000;
int     NumberOfTry=5;      //Êîëè÷åñòâî ïîïûòîê
double  LotB;
double  LotS;
extern  double  Lot=0.01;
int     Kol_B_S;                //Êîëè÷åñòâî îðäåðîâ
extern  bool    LotProiz=false;//;-)
double  Lots;
extern  int     Slippage      = 10;
bool    BuyCondition  = false;
bool    SellCondition = false;
int     Magic;
int     MN;
bool    PauseNews=false;
string  Spread;
//------------------------------------------------------------------------------
color   clCloseBuy    = Blue;   //Öâåò çíà÷êà çàêðûòèÿ ïîêóïêè
color   clCloseSell   = Red;    //Öâåò çíà÷êà çàêðûòèÿ ïðîäàæè
color   clDelete      = Yellow; //Öâåò çíà÷êà óäàëåíèÿ îðäåðà
static  bool    isNeedToDeinit=FALSE;
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
int     init()
  {
   isNeedToDeinit=FALSE;
   if(isCloseAllByTargetProfit && isProcessingUserOrdrs)
     {
      Print("The isProcessingUserOrdrs should be TRUE when isCloseAllByTargetProfit is TRUE.");
      isNeedToDeinit=TRUE;
     }
   if(!isProcessingUserOrdrs && (0>=MagicNumber))
     {
      Print("The MagicNumber should be greater then zero when isProcessingUserOrdrs is FALSE.");
      isNeedToDeinit=TRUE;
     }
   if(isCloseAllByTargetPoints && (0>AllOrdrsSumLossInPoints))
     {
      Print("The AllOrdrsSumLossInPoints should be not less then zero.");
      isNeedToDeinit=TRUE;
     }
   if(isCloseAllByTargetPoints && (0>AllOrdrsSumPrftInPoints))
     {
      Print("The AllOrdrsSumPrftInPoints should be not less then zero.");
      isNeedToDeinit=TRUE;
     }
   if(isNeedToDeinit)
     {
      Print("Expert is not working cause to abnormal settings, printed above!");
      deinit();
      return (0);
     }
   if(SaveMassiv)
      FilesOpen();
   return (0);
  }
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
int     deinit()
  {
   if(SaveMassiv)
      FilesWrite();
   return (0);
  }
//------------------------------------------------------------------------------
//ÑÈÃÍÀËÜÍÀß ÔÓÍÊÖÈß
//------------------------------------------------------------------------------
int     Crossed()
  {
   int     Min_Dist;
   int     Min_Freez;
   Min_Dist=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Min_Freez=MarketInfo(Symbol(),MODE_FREEZELEVEL);
//--------------------------------------------------------------------------
//Íå òîðãîâàòü íà íîâîñòÿõ!!!
//--------------------------------------------------------------------------
   if(PauseNews== true &&(Min_Dist>100|| Min_Freez>100))
      NewOrder = false;
//--------------------------------------------------------------------------
   hi = 0;
   lo = 0;
   A = 0.0;
   B = 0;
   C = 0;
   D = 0;
   E = 0;
   F = 0;
   Up = 0;
   Dn = 0;
   Ak = 0;
   Bk = 0;
   Ck = 0;
   Dk = 0;
   Ek = 0;
   Fk = 0;
   Upk = 0;
   Dnk = 0;
   TfFr=0;
   kstart=PropCandlFr;
//Íàéòè ïî 4-ðå íèæíèõ è âåðõíèõ ôðàêòàëà (çíà÷åíèÿ è ñäâèãè)
   hlFractal();
//Åñëè íà îäíîé è òîé æå ñâå÷å äâà ôðàêòàëà - íåò ñèãíàëà
   if(hk1==lk1 && hk1==PervFr)
      return (0);
//
   if(SigFractal)
     {
      //Åñëè ôðàêòàë òîëüêî-òîëüêî ïîÿâèëñÿ è äî ñèõ ïîð íå áûë ïðîáèò...
      //...òî çàïîìíèòü ñòðóêòóðó ABCD èç 4-õ ïîñëåäíèõ ôðàêòàëîâ
      if((hk1<lk1) && (hk1==PervFr) && (High[1]<High[3] && High[2]<High[3]))
        {
         A = iHigh (Symbol (), TfFr, PervFr);
         B = l1;
         C = h2;
         D = l2;
         Ak = hk1;
         Bk = lk1;
         Ck = hk2;
         Dk = lk2;
        }
      if((lk1<hk1) && (lk1==PervFr) && (Low[1]>Low[3] && Low[2]>Low[3]))
        {
         A = iLow (Symbol (), TfFr, PervFr);
         B = h1;
         C = l2;
         D = h2;
         Ak = lk1;
         Bk = hk1;
         Ck = lk2;
         Dk = hk2;
        }
     }
//Âûÿñíèòü âûñîòó íîâåéøåãî êîëåíà AB â ñòðóêòóðå ABCD
   AB=(A-B)/Point;
   Razmer=AB;
   if(0.0>Razmer)
      Razmer=-Razmer;
//Åñëè ðàçìåð íåäîñòàòî÷íûé, òî íåò ñèãíàëà
   if(Razmer<ABminRazmer)
      return (0);
   if(Razmer>ABmaxSize)
      return (0);
   SelSL = 0.0;
   BuySL = 0.0;
//Åñëè ïîñëåäíèé ôðàêòàë ñâåðõó è...
   if(A>B)
     {
      //...åñëè óñòàíîâëåíà ïðîâåðêà íà ãëóáèíó êîððåêöèè, ïîñëå ôðàêòàëà, òî...
      //...ïðîâåðèòü íå îòêîððåêòèðîâàëàñü ëè öåíà ñëèøêîì ãëóáîêî. Åñëè "äà" - íåò ñèãíàëà
      if((DelKorStopOrder>0) && 
         ((B+Razmer*DelKorStopOrder*Point)>iLow(Symbol(),0,1)))
         return (0);
      NewOrder=true;
      SelSL = A;
      BuySL = 0.0;
      if(ObeStor)
         return (5);
      //BUY
      return (1);
     }
   if(A<B)
     {
      if((DelKorStopOrder>0) && 
         ((B-Razmer*DelKorStopOrder*Point)<iHigh(Symbol(),0,1)))
         return (0);
      NewOrder=true;
      BuySL = A;
      SelSL = 0.0;
      if(ObeStor)
         return (5);
      //SELL
      return (2);
     }
   return (0);
  }
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
int     start()
  {
   if(isNeedToDeinit) return (0);
   int     temp;
   int     cnt;
   int     ticket;
   int     total;
   static  int     BBars=0;
   static  bool    New_Bar=true;
//--------------------------------------------------------------------------
//Ïðîâåðèòü ïîÿâëåíèå íîâîé ñâå÷è
//--------------------------------------------------------------------------
   if(BBars==iBars(Symbol(),SigTfFr))
      New_Bar=false;
   else//if (BBars != iBars (Symbol (), SigTfFr))
     {
      BBars=iBars(Symbol(),SigTfFr);
      New_Bar=true;
     }
//--------------------------------------------------------------------------
//Íà êàæäîé çàâåðøèâøåéñÿ ñâå÷å ïðîâåðèòü íàëè÷èå è òèï ñèãíàëà. Ñèãíàë
//ìîæåò âîçíèêàòü ÒÎËÜÊÎ íà òîëüêî ÷òî çàâåðøèâøåéñÿ ñâå÷å
//--------------------------------------------------------------------------
   BuyCondition=false;
   SellCondition=false;
   if(New_Bar)
     {
      //Íå îòêîððåêòèðîâàëàñü ëè öåíà ïî îòíîøåíèþ ê ïîñëåäíåìó èçâåñòíîìó
      //êîëåíó ïîñëåäíåé èçâåñòíîé ñòðóêòóðû ABCD ñëèøêîì ãëóáîêî? Åñëè íå
      //ñëèøêîì, òî åñòü ñèãíàë (èëè äàæå ñðàçó â îáå ñòîðîíû). Òåïåðü ìîæíî
      //ïðèñòóïèòü â ò. ÷. ê âû÷èñëåíèþ ñòîïà è òåéê-ïðîôèòà
      temp = Crossed ();
      if(1 == temp)
         BuyCondition=true;
      if(2==temp)
         SellCondition=true;
      if(5==temp)
        {
         SellCondition= true;
         BuyCondition = true;
        }
     }
//==========================================================================
//Íàéòè âñå îòêðûòûå îðäåðà è ðàáîòàòü ñ íèìè... Óäàëèòü îòëîæêè è òðàëèòü
//==========================================================================
   Kol_B_S=0;
   DelBS = false;
   DelSS = false;
   LotB = 0;
   LotS = 0;
   total= OrdersTotal();
   for(cnt=0; cnt<total; cnt++)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         ticket=OrderTicket();
         iTicket=ticket;
         //buy
         if((OdnaStor) && (OrderType()==1))
            DelBS=true;
         //sell
         if((OdnaStor) && (OrderType()==0))
            DelSS=true;
         //ÏÎÄÑ×¨Ò ÊÎËÈ×ÅÑÒÂÀ ÎÒÊÐÛÒÛÕ ÏÎÇÈÖÈÉ
         if((OrderType()==1) || (OrderType()==0))
            Kol_B_S++;
         if((OdnaStor) && (BuyCondition) && (OrderType()==1))
            BuyCondition=false;
         if((OdnaStor) && (SellCondition) && (OrderType()==0))
            SellCondition=false;
         if(OrderType()==OP_BUY)
            LotB=LotB+OrderLots();
         if(OrderType()==OP_SELL)
            LotS=LotS+OrderLots();
        }
     }
//==========================================================================
//Íàéòè âñå îòêðûòûå îðäåðà è êàæäûé îáðàáîòàòü. Óäàëÿòü îòëîæêè, òðàëèòü TP
//==========================================================================
//MasTekOrder ();
   total=OrdersTotal();
   for(cnt=0; cnt<total; cnt++)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         ticket=OrderTicket();
         iTicket=ticket;
         for(int h=1; h<=30; h++)
           {
            if((Massiv[h][4]==ticket)) break;
           }
         MA = Massiv[h][1];     //Öåíà A
         MB = Massiv[h][2];     //Öåíà B
         MRazmer = Massiv[h][3];//Ðàçìåð ÀB
         MTime = Massiv[h][5];  //Âðåìÿ ÀB
                                //******************************************************************
         //ÓÄÀËÅÍÈÅ ÎÒËÎÆÅÍÍÛÕ
         //******************************************************************
         //Ïðîâåðèòü ïðèîðèòåòû ìåæäó '==' è '&&'!!!
         //			if (OP_SELLSTOP == OrderType () && OrderSymbol () == Symbol ())
         if(OrderType()==OP_SELLSTOP && OrderSymbol()==Symbol())
           {
            temp=0;
            if(DelSS)
               temp=1;
            if(SignalDelOldOtl && SellCondition)
               temp=1;
            if(SignalDelOldOtlAll && (BuyCondition || SellCondition))
               temp=1;
            if((0<DelKorStopOrder) && !OtmerennyiHod && 
               ((MB-MRazmer*DelKorStopOrder*Point)<iHigh(Symbol(),0,1)))
               temp=1;
            //if ((DelBStopOrder) && MB<iHigh(Symbol(),0,1))
            //	temp = 1;
            if(1==temp)
               CloseOrder(OrderType());
            if(OtmerennyiHod && (1!=temp))
               MasOtmerHod(ticket);
           }
         //Ïðîâåðèòü ïðèîðèòåòû ìåæäó '==' è '&&'!!!
         //			if (OP_BUYSTOP == OrderType () && OrderSymbol () == Symbol ())
         if(OrderType()==OP_BUYSTOP && OrderSymbol()==Symbol())
            //if (OP_BUYSTOP == OrderType () && OrderSymbol () == Symbol() &&
            //	Magic == StrToInteger (StringSubstr (DoubleToStr (OrderMagicNumber (), 0), 0, 3)))
           {
            temp=0;
            if(DelBS)
               temp=1;
            if(SignalDelOldOtl && BuyCondition)
               temp=1;
            if(SignalDelOldOtlAll && (BuyCondition || SellCondition))
               temp=1;
            if((0<DelKorStopOrder) && !OtmerennyiHod && 
               ((MB+MRazmer*DelKorStopOrder*Point)>iLow(Symbol(),0,1)))
               temp=1;
            //if (DelBStopOrder && MB>iLow(Symbol(),0,1))
            //	tmp1 = 1;
            if(1==temp)
               CloseOrder(OrderType());
            if(OtmerennyiHod && (1!=temp))
               MasOtmerHod(ticket);
           }
         //******************************************************************
         //ÒÐÀË
         //******************************************************************
         //Ïðîâåðèòü ïðèîðèòåòû ìåæäó '==' è '&&'!!!
         //			if (OP_SELL == OrderType () && OrderSymbol () == Symbol ())
         if(OrderType()==OP_SELL && OrderSymbol()==Symbol())
           {
            if(OtmerennyiHod)
               MasOtmerHod(ticket);
            TrailingByZ(iTicket,iTmfrm,Bars_kol,iIndent,bTrlinloss);
           }
         //Ïðîâåðèòü ïðèîðèòåòû ìåæäó '==' è '&&'!!!
         //			if (OP_BUY == OrderType () && OrderSymbol () == Symbol ())
         if(OrderType()==OP_BUY && OrderSymbol()==Symbol())
           {
            if(OtmerennyiHod)
               MasOtmerHod(ticket);
            TrailingByZ(iTicket,iTmfrm,Bars_kol,iIndent,bTrlinloss);
           }
        }
     }
//==========================================================================
//Âûñòàâèòü îòëîæêè
//==========================================================================
   total=OrdersTotal();
   SLTP();//Ðàñ÷åò sl è tp îòêðûâàåìûõ îðäåðîâ
   Lots=Lot;
   if(LotProiz)
     {
      Lots=(Lot *(Kol_B_S+1) *2);//ïèïåö... ÿ ñàì â øîêå  ;-)
      if(0== Lots) Lots = Lot;
     }
   if(total<MaxOrder)
     {
      if(BuyCondition)
         ticket=OpenOrder(OP_BUYSTOP);
      if(SellCondition)
         ticket=OpenOrder(OP_SELLSTOP);
     }
   BuyCondition=false;
   SellCondition=false;
//Óäàëèòü ïî äåíüãàì
   if(isCloseAllByTargetProfit)
      //Ïðèáûëü-óáûòêè îïðåäåëÿþòñÿ ïî âñåì îðäåðàì, à íå òîëüêî ïî îðäåðàì
      //ýêñïåðòà, ÷òî åñòü... ÊÎÑßÊ!!!
      if((AccountProfit()<-TargetLoss) || 
         (AccountProfit()>TargetProfit))
        {
         if(isProcessingUserOrdrs)
           {
            ClosePosFirstProfit();
            DeleteOrders();
           }
         else
           {
            ClosePosFirstProfit("0",-1,MagicNumber);
            DeleteOrders("0",-1,MagicNumber);
           }
        }
//Óäàëèòü ïî ïóíêòàì
//ÇÀÃÎÒÎÂÊÀ
   int     sum;
   if(isCloseAllByTargetPoints)
     {
      sum=0;
      //
      //Êðàéíå íåýôôåêòèâíûé àëãîðèòì îïðåäåëåíèÿ ñóììàðíîãî êîëè÷åñòâà
      //íàêîïëåííûõ ïóíêòîâ óáûòêà èëè ïðèáûëè
      //
      for(cnt=0; cnt<total; cnt++)
        {
         if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol()==Symbol())
              {
               if(!isProcessingUserOrdrs && 
                  (OrderMagicNumber()==MagicNumber))
                 {
                  if(OP_SELL==OrderType())
                     sum=(OrderOpenPrice()-Ask)/Point;
                  if(OP_BUY==OrderType())
                     sum=(Bid-OrderOpenPrice())/Point;
                 }
               else if(isProcessingUserOrdrs)
                 {
                  if(OP_SELL==OrderType())
                     sum=(OrderOpenPrice()-Ask)/Point;
                  if(OP_BUY==OrderType())
                     sum=(Bid-OrderOpenPrice())/Point;
                 }
              }
           }
        }
      if((-AllOrdrsSumLossInPoints>=sum) || 
         (AllOrdrsSumPrftInPoints<=sum))
        {
         if(isProcessingUserOrdrs)
           {
            ClosePosFirstProfit();
            DeleteOrders();
           }
         else
           {
            ClosePosFirstProfit("0",-1,MagicNumber);
            DeleteOrders("0",-1,MagicNumber);
           }
        }
     }
   return (0);
  }
//+----------------------------------------------------------------------------+
// Ðàñ÷åò SL, TP è Open Price
//+----------------------------------------------------------------------------+
void    SLTP()
  {
   double  temp;
   SStp = 0;
   SSsl = 0;
   BStp = 0;
   BSsl = 0;
   BSotl = 0;
   SSotl = 0;
   if(0<KoefProfit)
     {
      SStp=A-Razmer*KoefProfit*Point;
     }
   SSotl=A-Otstup*0.5*Point-Razmer*OtstupProc*Point;
   if(StopLos)
      SSsl=B+Otstup*Point;
   if(ObeStor)
     {
      temp=B;
      B = A;
      A = temp;
     }
   if(0<KoefProfit)
     {
      BStp=A+Razmer*KoefProfit*Point;
     }
   BSotl=A+Otstup*Point+Razmer*OtstupProc*Point;
   if(StopLos)
      //Äåëèòü íóæíî íà '/ 2.0' èëè '* 0.5'
      BSsl=B-Otstup/2*Point;
   if(ObeStor)
     {
      temp=B;
      B = A;
      A = temp;
     }
  }
//+----------------------------------------------------------------------------+
//To open orders with fixin into array
//+----------------------------------------------------------------------------+
int     OpenOrder(
                  int     type
                  )
  {
//Èùåì è çàíîñèì â Ìàññèâ Mas_Ord_Tek âñå òåêóùèå îðäåðà
   MasTekOrder();
   SravMas();
   int     err=0;
   int     ticket=0;
   int     c=0;
   double  stplvl;
   double  frzlvl;
   stplvl = MarketInfo (Symbol (), MODE_STOPLEVEL) * Point;
   frzlvl = MarketInfo (Symbol (), MODE_FREEZELEVEL) * Point;
   if(type== OP_BUYSTOP)
     {
      BSotl = NormalizeDouble (BSotl - delta * Point, Digits);
      for(i = 1; i <= MaxOrdersetka; i++)
        {
         BSotl = NormalizeDouble (BSotl + delta * Point, Digits);
         for(c = 0; c < NumberOfTries; c++)
           {
            if(((Ask+stplvl)<=BSotl) && ((Ask+frzlvl)<=BSotl))
              {
               ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,
                                BSotl,//price
                                Slippage,
                                BSsl,//stop
                                BStp,//profit
                                ExpertComment,MagicNumber,0,Green);
               err=GetLastError();
               if(0==err)
                 {
                  ZapOrdMas(ticket);
                  break;
                 }
               else
                 {
                  //Busy errors
                  if(err==4 || err==137 || err==146 || err==136)
                    {
                     Sleep(60);
                     continue;
                    }
                  else//normal error
                      //ZapOrdMas (ticket);
                     break;
                 }
              }
           }//The end of 'for Number Of Tries'
        }//The end of 'for Max Orders in the Net / Setka'
     }
   if(type==OP_SELLSTOP)
     {
      SSotl = NormalizeDouble (SSotl + delta * Point, Digits);
      for(i = 1; i <= MaxOrdersetka; i++)
        {
         SSotl = NormalizeDouble (SSotl - delta * Point, Digits);
         for(c = 0; c < NumberOfTries; c++)
           {
            if(((Bid-stplvl)>=SSotl) && ((Bid-frzlvl)>=SSotl))
              {
               ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,
                                SSotl,//price
                                Slippage,
                                SSsl,//stop
                                SStp,//profit
                                ExpertComment,MagicNumber,0,Red);
               err=GetLastError();
               if(0==err)
                 {
                  //Write this order and it's chars to aray
                  ZapOrdMas(ticket);
                  break;
                 }
               else
                 {
                  //Busy errors
                  if(err==4 || err==137 || err==146 || err==136)
                    {
                     Sleep(60);
                     continue;
                    }
                  else//normal error
                  break;
                 }
              }
           }//The end of 'for Number Of Tries'
        }//The end of 'for Max Orders in the Net / Setka'
     }
   return (ticket);
  }
//+------------------------------------------------------------------+
//To close pending orders
//+------------------------------------------------------------------+
bool    CloseOrder(
                   int     type
                   )
  {
   if(type==OP_BUYSTOP)
      return (OrderDelete (OrderTicket ()));
   if(type==OP_SELLSTOP)
      return (OrderDelete (OrderTicket ()));
   return (0);
  }
//+----------------------------------------------------------------------------+
//Çàïèñàòü èç Massiv â Ôàéë (ðåçåðâíîå êîïèðîâàíèå)
//+----------------------------------------------------------------------------+
void    FilesWrite()
  {
   Massiv[0][5]=Massiv[0][5]+1;
   int     h=FileOpen("Massiv.bin",FILE_BIN|FILE_WRITE);
   FileWriteInteger(h,ArraySize(Massiv),LONG_VALUE);
   FileWriteArray(h,Massiv,0,ArraySize(Massiv));
   FileClose(h);
  }
//+----------------------------------------------------------------------------+
//Ïðî÷èòàòü èç ôàéëà â Massiv (ðåçåðâíîå êîïèðîâàíèå)
//+----------------------------------------------------------------------------+
void    FilesOpen()
  {
   int     h=FileOpen("Massiv.bin",FILE_BIN|FILE_READ);
   if(h<1)
      Print("Ôàéë Massiv.bin íå îáíàðóæåí, ïîñëåäíÿÿ îøèáêà ",GetLastError());
   int s=FileReadInteger(h,LONG_VALUE);
   ArrayResize(Massiv,s);
   FileReadArray(h,Massiv,0,s);
   FileClose(h);
  }
//+----------------------------------------------------------------------------+
//Íàéòè è çàíåñòè â Ìàññèâ "Mas_Ord_Tek" âñå îðäåðà
//+----------------------------------------------------------------------------+
void    MasTekOrder()
  {
   int     Kol = 0;                    //Îáíóëåíèå ñ÷¸ò÷èêà îðäåðîâ
   ArrayInitialize (Mas_Ord_Tek, 0);   //Îáíóëåíèå ìàññèâà
   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS) && (OrderSymbol()==Symbol()))
        {
         Kol++;//Ñ÷èòàåì îáùåå êîëè÷åñòâî îðäåðîâ
         //--- Ôîðìèðîâàíèå íîâîãî ìàññèâà îðäåðîâ --
         Mas_Ord_Tek[Kol][1] = NormalizeDouble (OrderOpenPrice (), Digits);  //Êóðñ îòêðûòèÿ îðäåðîâ
         Mas_Ord_Tek[Kol][2] = NormalizeDouble (OrderStopLoss (), Digits);   //Êóðñ SL 
         Mas_Ord_Tek[Kol][3] = NormalizeDouble (OrderTakeProfit (), Digits); //Êóðñ ÒÐ 
         Mas_Ord_Tek[Kol][4] = OrderTicket ();     //Íîìåð îðäåðà
         Mas_Ord_Tek[Kol][5] = OrderLots ();       //Êîëè÷åñòâî ëîòîâ
         Mas_Ord_Tek[Kol][6] = OrderType ();       //Òèï îðäåðà
         Mas_Ord_Tek[Kol][7] = OrderMagicNumber ();//Ìàãè÷åñêîå ÷èñëî 
        }
     }
   Mas_Ord_Tek[0][0]=Kol;//Ñîõðàíÿåì â íóëåâóþ ÿ÷åå÷êó êîë-âî îðäåðîâ
  }
//==============================================================================
//Íàéòè "ïðîïàâøèå" îðäåðà
//==============================================================================
void    SravMas()
  {
   int     oo;
   int     f;
   int     g;
   for(oo=1; oo<=30; oo++)//Âîçüì¸ì íîìåð îðäåðà èç ñòàðîãî ìàññèâà
     {
      int     Sovpadenie=0;//Äëÿ íà÷àëà îáíóëèì ôàêò ïðèçíàêà ñîâïàäåíèÿ
      for(i=1; i<=Mas_Ord_Tek[0][0]; i++)//Ïîèùåì ýòîò îðäåðîê â òåêóùåì ìàññèâå
        {
         if(Mas_Ord_Tek[i][4]==Massiv[oo][4])//Åñëè ñîâïàë ticket îðäåðà, òî çàïîìíèì, ò. å. ïîêà æèâ
            //è âûõîäèì èç âíóòðåííåãî öèêëà
           {
            Sovpadenie=1;
            if(Massiv[oo][6]!=Mas_Ord_Tek[i][6])
               Massiv[oo][6]=Mas_Ord_Tek[i][6];//èçìåíÿåì ñòàòóñ îðäåðà
            break;
           }
        }
      if(Sovpadenie==1) continue;//Ïåðåõîäèì ê ñëåäóþùåìó ñòàðîìó
      if(Massiv[oo][6]<9)
         Massiv[oo][6]=Massiv[oo][6]+10;//Çàêðûò îðäåð
     }
   Massiv[0][3]=0;//Ñáðîñ ïóñòîé ÿ÷åéêè äëÿ çàïèñè îðäåðîâ
   for(f=1; f<=30; f++)//Ïåðåáèðàåì âåñü ìàññèâ â ïîèñêàõ ñòàðûõ îðäåðîâ è èõ óäàëåíèÿ
     {
      if((Massiv[0][3]==0) && (Massiv[f][4]==0))
         Massiv[0][3]=f;//åñëè íåò ticket çíà÷èò ñòðîêà ïóñòà
      if(DelHistoryMassiv && (Massiv[f][6]>9))//Åñëè îðäåðà óæå íåò
        {
         for(g=0; g<=7; g++)//Îáíóëÿåì âñþ ñòðîêó
           {
            Massiv[f][g]=0;//çàïîëíÿåì 0-ìè
            if(Massiv[0][3]== 0)
               Massiv[0][3]=f;//Çàïîìèíàåì ïóñòóþ ñòðîêó äëÿ çàïèñè íîâûõ îðäåðîâ
           }
        }
     }
  }
//==============================================================================
//Çàïîìíèòü îðäåðà â ìàññèâ
//==============================================================================
void    ZapOrdMas(
                  int     ticket
                  )
  {
   double  temp;
   int     pusto;
   int     f;
   MasTekOrder();//Èùåì è çàíîñèì â Ìàññèâ Mas_Ord_Tek âñå îðäåðà
   SravMas();
   pusto= Massiv[0][3];
   if(0 == pusto)
     {
      //Ïåðåáèðàåì âåñü ìàññèâ â ïîèñêàõ ïóñòûõ ñòðîê
      for(f=1; f<=30; f++)
        {
         //åñëè íåò ticket çíà÷èò ñòðîêà ïóñòà
         if((0==pusto) && (0==Massiv[f][4]))
           {
            pusto=f;
            break;
           }
        }
     }
   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS) && 
         (OrderSymbol()==Symbol()) && 
         (ticket==OrderTicket()))
        {
         if(ObeStor && (Ak>Bk) && (OrderType()==OP_BUYSTOP))
           {
            temp=B;
            B = A;
            A = temp;
           }
         if(ObeStor && (Ak<Bk) && (OrderType()==OP_SELLSTOP))
           {
            temp=B;
            B=A; A=temp;
           }
         Massiv[pusto][1] = A;
         Massiv[pusto][2] = B;
         Massiv[pusto][3] = Razmer;
         Massiv[pusto][4] = OrderTicket ();
         Massiv[pusto][5] = Time[0];
         Massiv[pusto][6] = OrderType ();
         Massiv[pusto][7] = OrderMagicNumber ();
         Massiv[0][3] =0;
         Massiv[0][1] = MagicNumber;
         if(ObeStor && (Ak>Bk) && (OrderType()==OP_BUYSTOP))
           {
            temp=B;
            B = A;
            A = temp;
           }
         //SELLSTOP
         if(ObeStor && (Ak<Bk) && (OrderType()==OP_SELLSTOP))
           {
            temp=B;
            B = A;
            A = temp;
           }
         if(SaveMassiv)
           {
            FilesWrite();
           }
        }
     }
  }
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
void    MasOtmerHod(
                    int     ticket
                    )
  {
   int     m;
   int     isDel;
   double  Target;
   double  stplvl;
   double  frzlvl;
   bool    x;
   stplvl = MarketInfo (Symbol (), MODE_STOPLEVEL) * Point;
   frzlvl = MarketInfo (Symbol (), MODE_FREEZELEVEL) * Point;
   for(m=1; m<=30; m++)
     {
      if((Massiv[m][4]==ticket))
         break;
     }
   for(i=0; i<OrdersTotal(); i++)//Àíàëèç ïî âñåì îðäåðàì òåðìèíàëà
     {
      if(OrderSelect(i,SELECT_BY_POS) && 
         (OrderSymbol () == Symbol ()) &&
         (OrderTicket () == ticket))
        {
         isDel=0;
         //
         //BUY
         //
         if(
            OtmerennyiHod && 
            ((Massiv[m][6]==0) || (Massiv[m][6]==4)))
           {
            if((0<DelKorStopOrder) && 
               (Massiv[m][6]==4) && 
               ((Massiv[m][2]+Massiv[m][3] *DelKorStopOrder*Point)
               >iLow(Symbol(),0,1)))
               if(CloseOrder(OrderType()))
                  isDel=1;
            OpBar=iBarShift(Symbol(),0,MTime)+1;
            OtkatBar=iLowest(Symbol(),0,MODE_LOW,OpBar,1);
            OtkatCena=iLow(Symbol(),0,OtkatBar);
            Hod=MRazmer;
            Target=NormalizeDouble(OtkatCena+Hod*KoefProfit*Point,Digits);
            if(0==isDel)
               if(Target!=OrderTakeProfit())
                  if(((Bid+stplvl)<=Target) && ((Bid+frzlvl)<=Target))
                     x = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Target,0,Yellow);
           }
         isDel=0;
         //
         //SELL
         //
         if(
            OtmerennyiHod && 
            ((Massiv[m][6]==1) || (Massiv[m][6]==5)))
           {
            if((0<DelKorStopOrder) && 
               (Massiv[m][6]==5) && 
               ((Massiv[m][2]-Massiv[m][3] *DelKorStopOrder*Point)
               <iHigh(Symbol(),0,1)))
               if(CloseOrder(OrderType()))
                  isDel=1;
            OpBar=iBarShift(Symbol(),0,MTime)+1;
            OtkatBar=iHighest(Symbol(),0,MODE_HIGH,OpBar,1);
            OtkatCena=iHigh(Symbol(),0,OtkatBar);
            Hod=MRazmer;
            Target=NormalizeDouble(OtkatCena-Hod*KoefProfit*Point,Digits);
            if(0==isDel)
               if(Target!=OrderTakeProfit())
                  if(((Ask-stplvl)>=Target) && ((Ask-frzlvl)>=Target))
                     x = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Target,0,Yellow);
           }
        }
     }
  }
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
void    hlFractal()
  {
//HIGH FRACTALS
   hk1 = 0;
   hk2 = 0;
   k=kstart;
   while(1>hk1)
     {
      hf=iCustom(Symbol(),TfFr,"Fr",BarsFr,0,k);
      if(0<hf)
        {
         hk1= k;
         h1 = hf;
        }
      k++;
      //Anti endless cycle trigger
      if(1023<k) break;
     }
   k=k+1;
   while(1>hk2)
     {
      hf=iCustom(Symbol(),TfFr,"Fr",BarsFr,0,k);
      if(0<hf)
        {
         hk2= k;
         h2 = hf;
        }
      k++;
      //Anti endless cycle trigger
      if(1023<k) break;
     }
//LOW FRACTALS
   lk1 = 0;
   lk2 = 0;
   k=kstart;
   while(1>lk1)
     {
      lf=iCustom(Symbol(),TfFr,"Fr",BarsFr,1,k);
      if(0<lf)
        {
         lk1= k;
         l1 = lf;
        }
      k++;
      //Anti endless cycle trigger
      if(1023<k) break;
     }
   k=k+1;
   while(1>lk2)
     {
      lf=iCustom(Symbol(),TfFr,"Fr",BarsFr,1,k);
      if(lf>0)
        {
         lk2= k;
         l2 = lf;
        }
      k++;
      //Anti endless cycle trigger
      if(1023<k) break;
     }
  }
//******************************************************************************
//Ñïèñîê âûçûâàåìûõ ôóíêöèé:
//-   èñïîëüçóåò ÂÍÅØÍÈÉ èíäèêàòîð Fr
//Ñïèñîê âûçûâàþùèõ ôóíêöèé:
//-   TrailingByZ
//Ýòè ðàçäåëÿåìûå ìåæäó äâóìÿ ôóíêöèÿìè òðàëà
//- hTralFr
//- lTralFr
//******************************************************************************
void    TralFractal()
  {
   int     a;
   int     Tmfrm;
   k=0;
   hTralFr=0;
   hf=0;
   Tmfrm = iTmfrm;
   for(a = 0; a < Frktl_kol; a++)
     {
      hTralFr=0;
      while(1>hTralFr)
        {
         hf=iCustom(Symbol(),Tmfrm,"Fr",Frktl_bars,0,k);
         if(0<hf)
            hTralFr=k;
         k++;
        }
     }
   k=0;
   lTralFr=0;
   lf=0;
   for(a=0; a<Frktl_kol; a++)
     {
      lTralFr=0;
      while(1>lTralFr)
        {
         lf=iCustom(Symbol(),Tmfrm,"Fr",Frktl_bars,1,k);
         if(0<lf)
            lTralFr=k;
         k++;
        }
     }
  }
//******************************************************************************
//Ñïèñîê ãëîáàëüíûõ ïåðåìåííûõ, ê êîòîðûì îáðàùàåòñÿ ôóíêöèÿ:
//-   ÍÀÄÎ ÇÀÏÎËÍÈÒÜ ÑÏÈÑÎÊ!!!
//Ñïèñîê âûçûâàåìûõ ôóíêöèé:
//-   TralFractal, êîòîðàÿ:
//        èñïîëüçóåò ÂÍÅØÍÈÉ èíäèêàòîð Fr!
//Ýòè - ðàçäåëÿåìûå ìåæäó äâóìÿ ôóíêöèÿìè òðàëà
//- hTralFr,
//- lTralFr
//Ýòè - ðàçäåëÿåìûå ìåæäó òåêóùåé ôóíêöèåé òðàëà è ñèãíàëüíîé
//- SelSL,
//- BuySL
//******************************************************************************
int     TrailingByZ(
                    int     ticket,
                    int     tmfrm,
                    int     bars_n,
                    int     indent,
                    bool    trlinloss
                    )
  {
   TralFractal();
//int     i;
   double  new_extremum;
//ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if(0==ticket)
      return (0);
   if(!OrderSelect(ticket,SELECT_BY_TICKET))
      return (0);
   if(0>indent)
      return (0);
   if(
      (tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && 
      (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) &&
      (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)
      )
      return (0);
   int     IndMin;
   int     IndMax;
   double  stplvl;
   double  tmp0sl;
   double  tmp0;
   bool    x;
   stplvl = MarketInfo (Symbol (), MODE_STOPLEVEL) * Point;
   tmp0sl = OrderStopLoss ();
//Åñëè äëèííàÿ ïîçèöèÿ (OP_BUY) - íàéòè ìèíèìóì ñðåäè bars_n ñâå÷åé
   if(OP_BUY==OrderType())
     {
      if(0<Frktl_kol)
        {
         IndMin=ArrayMinimum(Low,lTralFr,1);
         //******************************************************************************
         //Îòñþäà è äàëåå ÒÐÈÆÄÛ îäíà è òà æå ôîðìóëà ïðè ÇÀÏÓÒÀÍÍÛÕ îáñòîÿòåëüñòâàõ
         //
         new_extremum=iLow(Symbol(),tmfrm,IndMin);
        }
      if(0<Bars_kol)
         for(i=1; i<=bars_n; i++)
           {
            if(1==i)
               new_extremum=iLow(Symbol(),tmfrm,i);
            else if(new_extremum>iLow(Symbol(),tmfrm,i))
               new_extremum=iLow(Symbol(),tmfrm,i);
            //
            //******************************************************************************
           }
      if((0.0<BuySL) && SLSignal)
         new_extremum=BuySL;
      tmp0=NormalizeDouble(new_extremum-indent*Point,Digits);
      if(trlinloss || 
         (!trlinloss && (tmp0>OrderOpenPrice())))
         if(((tmp0>tmp0sl) || (0.0==tmp0sl)) && 
            (tmp0<Bid-stplvl))
            x = OrderModify(ticket,OrderOpenPrice(),tmp0,OrderTakeProfit(),OrderExpiration());
     }
//Åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL) - íàéòè ìèíèìóì ñðåäè bars_n ñâå÷åé
   if(OP_SELL==OrderType())
     {
      if(0<Frktl_kol)
        {
         IndMax=ArrayMaximum(High,hTralFr,1);//èíäåêñ áàðà
                                             //******************************************************************************
         //Îòñþäà è äàëåå ÒÐÈÆÄÛ îäíà è òà æå ôîðìóëà ïðè ÇÀÏÓÒÀÍÍÛÕ îáñòîÿòåëüñòâàõ
         //
         new_extremum=iHigh(Symbol(),tmfrm,IndMax);
        }
      if(0<Bars_kol)
         for(i=1; i<=bars_n; i++)
           {
            if(1==i)
               new_extremum=iHigh(Symbol(),tmfrm,i);
            else if(new_extremum<iHigh(Symbol(),tmfrm,i))
               new_extremum=iHigh(Symbol(),tmfrm,i);
            //
            //******************************************************************************
           }
      if((0.0<SelSL) && SLSignal)
         new_extremum=SelSL;
      tmp0 = MarketInfo (Symbol (), MODE_SPREAD);
      tmp0 = indent + tmp0;
      tmp0 = NormalizeDouble (new_extremum + tmp0 * Point, Digits);
      if(trlinloss || 
         (!trlinloss && (tmp0<OrderOpenPrice())))
         if(((tmp0<tmp0sl) || (0.0==tmp0sl)) && 
            (tmp0>Ask+stplvl))
            x = OrderModify(ticket,OrderOpenPrice(),tmp0,OrderTakeProfit(),OrderExpiration());
     }
   return (0);
  }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ  : 19.02.2008                                                      |
//|  Îïèñàíèå: Çàêðûòèå îäíîé ïðåäâàðèòåëüíî âûáðàííîé ïîçèöèè                 |
//+----------------------------------------------------------------------------+
void    ClosePosBySelect()
  {
   bool    fc;
   color   clClose;
   double  ll;
   double  pa;
   double  pb;
   double  pp;
   int     err;
   int     it;
   if((OrderType()==OP_BUY) || (OrderType()==OP_SELL))
     {
      for(it=1; it<=NumberOfTry; it++)
        {
         if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
            break;
         while(!IsTradeAllowed())
            Sleep(sleepMilliSecToDelOrdrs);
         RefreshRates();
         pa = MarketInfo (OrderSymbol (), MODE_ASK);
         pb = MarketInfo (OrderSymbol (), MODE_BID);
         if(OrderType()==OP_BUY)
           {
            pp=pb;
            clClose=clCloseBuy;
           }
         else
           {
            pp=pa;
            clClose=clCloseSell;
           }
         ll = OrderLots ();
         fc = OrderClose (OrderTicket (), ll, pp, Slippage, clClose);
         if(fc)
           {
            //				if (UseSound) PlaySound (SoundSuccess);
            break;
           }
         else
           {
            err=GetLastError();
            if(err==146)
               while(IsTradeContextBusy())
                  Sleep(sleepMilliSecToDelOrdrs+sleepMilliSecToDelOrdrs);
            Sleep(sleepMilliSecToDelOrdrs);
           }
        }
     }
  }
//|  Îïèñàíèå : Âîçâðàùàåò íàèìåíîâàíèå òîðãîâîé îïåðàöèè                      |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    op - èäåíòèôèêàòîð òîðãîâîé îïåðàöèè                                    |
//+----------------------------------------------------------------------------+
/*string GetNameOP(int op) 
  {
   switch(op) 
     {
      case OP_BUY      : return("Buy");
      case OP_SELL     : return("Sell");
      case OP_BUYLIMIT : return("BuyLimit");
      case OP_SELLLIMIT: return("SellLimit");
      case OP_BUYSTOP  : return("BuyStop");
      case OP_SELLSTOP : return("SellStop");
      default          : return("Unknown Operation");
     }
  }
*/
//+----------------------------------------------------------------------------+
//|  Çàêðûòü ïî ðûíî÷íîé öåíå ñíà÷àëà ïðèáûëüíûå, çàòåì îñòàëüíûå              |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
void    ClosePosFirstProfit(
                            string  sy = "0",
                            int     op = -1,
                            int     mn = -1
                            )
  {
   k=OrdersTotal();
   if(sy == "0")
      sy = Symbol ();
//Ñíà÷àëà çàêðûâàåì ïðèáûëüíûå ïîçèöèè
   for(i=k-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(((OrderSymbol()==sy) || (sy=="")) && 
            ((op<0) || (OrderType()==op)))
           {
            if((OrderType()==OP_BUY) || (OrderType()==OP_SELL))
              {
               if((mn<0) || (OrderMagicNumber()==mn))
                 {
                  if((OrderProfit()+OrderSwap())>0.0)
                     ClosePosBySelect();
                 }
              }
           }
        }
     }
//Ïîòîì âñå îñòàëüíûå
   k=OrdersTotal();
   for(i=k-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(((OrderSymbol()==sy) || sy=="") && 
            ((op<0) || (OrderType()==op)))
           {
            if((OrderType()==OP_BUY) || (OrderType()==OP_SELL))
              {
               if((mn<0) || (OrderMagicNumber()==mn))
                  ClosePosBySelect();
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Óäàëèòü îðäåðà                                                            |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáîé îðäåð)                    |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
void    DeleteOrders(
                     string  sy = "0",
                     int     op = -1,
                     int     mn = -1
                     )
  {
   bool    fd;
   int     it;
   int     ot;
   k=OrdersTotal();
   if(sy == "0")
      sy = Symbol ();
   for(i = k - 1; i >= 0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ot=OrderType();
         if((OP_SELL!=ot) && (OP_BUY!=ot))
           {
            if(((OrderSymbol () == sy) || (sy == "")) &&
               ((op < 0) || (ot == op)))
              {
               if((mn<0) || (OrderMagicNumber()==mn))
                 {
                  for(it=1; it<=NumberOfTry; it++)
                    {
                     if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
                        break;
                     //							while (!IsTradeAllowed ())
                     Sleep(sleepMilliSecToDelOrdrs);
                     fd=OrderDelete(OrderTicket(),clDelete);
                     if(fd)
                        //							{
                        //								if (UseSound) PlaySound (SoundSuccess); break;
                        break;
                     //							} else {
                     //								err=GetLastError();
                     //								if (UseSound) PlaySound (SoundError);
                     //								Print ("Error (", err, ") delete order ",
                     //									GetNameOP (ot), ": ", ErrorDescription (err),
                     //									", try ", it);
                     //								Sleep (1000 * 5);
                     //							}
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
             
            
            
Comments